53 Commits

Author SHA1 Message Date
SmileQWQ
1f94c7761c perf: trim lite dashboard and statistics hot paths
- drop lite tag-budget contracts, budget routes, renewal-mode distribution, and empty dashboard chart payloads while keeping only data-backed statistics views

- version worker-lite auth credentials, migrate legacy scrypt logins, and cap auto-renew batches to reduce login and cron worker overhead

- extend the before-after perf harness for login, overview, and auto-renew with dirty-current support and .tmp report output
2026-05-16 18:52:35 +08:00
SmileQWQ
23291ecf9d perf: rewrite lite import preview flow
- switch SubTracker backup and Wallos import from token-backed preview persistence to stateless inspect plus direct commit payloads

- align shared schemas, api routes, and import modals while keeping the SubTracker backup zip format unchanged

- move Wallos zip logo upload work out of inspect, add direct-payload coverage tests, and extend lite perf harnesses with import before-after baselines
2026-05-14 12:39:22 +08:00
SmileQWQ
be70f8d2d9 feat: align lite brand and settings surfaces
- sync the main-branch brand logo, login header, and sidebar update entry while keeping lite labels
- wire the frontend version update query and commit-based update modal on the lite surface
- move forgot-password controls back into credentials, restore About or Credits, and keep worker-specific hints intact
- refresh README navigation and add frontend regression coverage for branding, settings, and version entry points
2026-05-12 22:11:03 +08:00
SmileQWQ
d1cb3668f3 feat: sync lite subscription detail and safe delete
- add subscription value calculation for current cycle, remaining days, ratio, and base-currency display
- block direct deletion of active subscriptions and improve batch delete skip feedback
- align subscription list tag overflow and detail reminder rendering with the main branch behavior
- cover route, value service, tag helper, reminder helper, and detail drawer changes with tests
2026-05-12 22:09:35 +08:00
SmileQWQ
35a7a39bc4 feat: sync lite auth and update backend
- add worker-compatible forgot-password request or reset routes with shared schemas and settings support
- introduce commit-based lite version update API contracts and runtime bindings
- align direct notification presentation, webhook delivery persistence, and worker-lite delegate fallbacks
- cover auth, settings, version, forgot-password, and notification regressions with tests
2026-05-12 22:08:42 +08:00
SmileQWQ
b8877e4370 feat: add reminder rule preview to lite
- add the reminder rule preview component to settings and subscription forms

- support validation, sorting, de-duplication, active toggle state and transition animation

- reuse default reminder rules when subscription-level rules are empty

- cover reminder rule formatting, preview fallback and de-duplication with unit tests
2026-05-05 20:43:47 +08:00
SmileQWQ
7c096f6726 feat: add dashboard summary statistics ui
- add statistics page AI summary card with auto-generate and markdown rendering
- introduce dashboard summary query/composable and markdown sanitization utility
- add marked and dompurify dependencies for summary rendering
- raise dashboard summary generate request timeout to 65000ms and cover it with tests
2026-05-04 04:14:21 +08:00
SmileQWQ
2e5603bb8b feat: add dashboard summary settings capability
- extend shared AI config with dashboard summary fields and DTOs
- update settings validation and AI config helpers for summary-specific toggles
- align settings page copy and form state with AI capability wording
- cover schema, settings route, and form cloning changes with tests
2026-05-04 04:05:40 +08:00
SmileQWQ
94f0836e7e fix: preserve backup zip responses in lite worker
- send Uint8Array and ArrayBuffer payloads as raw binary in legacy-fastify instead of JSON serializing them
- add a Worker response regression test that round-trips a backup zip through fflate
- keep lite restore backup aligned with the existing Wallos frontend unzip flow
2026-05-03 00:43:09 +08:00
SmileQWQ
e493b72db7 fix: stabilize lite desktop layout and dark background
- keep the lite desktop sidebar fixed while preserving the original page scroll feel
- ensure dark mode background stays consistent on large screens and zoom changes
- add regression coverage for sidebar layout and root background behavior
2026-05-02 21:08:59 +08:00
SmileQWQ
85f5927aa5 feat: sync zip backup flow into lite
- add Worker Lite backup export and restore routes, service, and shared schemas
- move lite ZIP restore parsing to the frontend so Worker only receives prepared manifest and logo assets
- add backup modal and settings page backup or migration entry on lite
2026-05-02 21:08:59 +08:00
SmileQWQ
21d659ed8f feat: add currency converter swap action
Improve the settings-page currency converter for worker-lite deployments.

- add a dedicated swap control between source and target currencies
- extract the swap behavior into a focused utility for testing
- keep the mobile layout responsive around the new action

Tests:
- npm test -- currency-converter
- npm run lint
2026-05-02 00:44:19 +08:00
SmileQWQ
b45ca8cfe6 feat: sync lite subscription batch and tag management
Bring the missing main-side subscription management UX into lite.

- support batch status updates for active, paused and cancelled
- add select-current-page behavior for batch mode
- make paused subscriptions resumable from list actions
- simplify tag management by removing icon selection and preview
- keep tag filtering aligned with all-selected-tag matching

Tests:
- apps/api/tests/integration/subscriptions-routes.test.ts
- npm test -- currency-converter subscription-batch tag-management
- npm run lint
2026-05-02 00:44:19 +08:00
SmileQWQ
814464bc58 perf: optimize lite caching and worker endpoints
- add tiered D1 caching and cache version invalidation for worker-heavy reads

- reduce CPU cost in statistics, calendar, settings, exchange-rate, and import paths

- align worker-facing settings and shared types with the no-KV lite runtime
2026-04-26 20:42:08 +08:00
SmileQWQ
49c65e4894 fix: tighten timezone defaults in worker ui 2026-04-25 22:08:28 +08:00
SmileQWQ
4ab8dbd73e fix: select today when jumping to current month 2026-04-25 21:53:00 +08:00
SmileQWQ
ac9f136204 fix: sync main timezone and exchange-rate metadata to worker 2026-04-25 21:39:06 +08:00
SmileQWQ
9bb82e0b3b feat: align worker timezone handling with app settings
- add a Wallos source timezone option so browser-side import preview can evaluate business dates with the same semantics as the source instance instead of assuming UTC day boundaries

- gate reconcile-expired and refresh-rates scheduled tasks by local app timezone while switching their cron triggers to hourly, so Worker deployments still execute them once per local business day

- refactor calendar month navigation helpers to use business-date month keys instead of local dayjs month math, reducing browser local-time leakage into timezone-aware views

- extend timezone utilities and unit tests to cover source-timezone business-date calculations and the new worker cron gate
2026-04-25 17:37:31 +08:00
SmileQWQ
829099faad perf: reduce worker wallos import D1 load 2026-04-25 16:50:55 +08:00
SmileQWQ
b9535f76d8 fix: sync subscription validation updates to worker 2026-04-25 16:35:51 +08:00
SmileQWQ
2e1b1ad85e feat: add configurable application timezone
- add timezone to shared settings schema and worker settings loading with Asia/Shanghai default

- introduce frontend and backend timezone helpers for business-date parsing, display formatting, and day boundary calculations

- apply configured timezone to notification scanning, auto renew, expired reconciliation, statistics, calendar queries, and subscription create/update flows

- update settings UI and form/date handling so users can switch timezone from basic settings

- refresh tests to cover timezone validation, formatting, notification behavior, and subscription route/service flows
2026-04-25 04:48:23 +08:00
SmileQWQ
ac991ba65e feat: move wallos db zip parsing to browser 2026-04-25 03:50:27 +08:00
SmileQWQ
05e67c4bdd feat: add wallos db and zip import for worker 2026-04-25 03:07:13 +08:00
SmileQWQ
3645f20eda fix: port wallos import alignment to worker 2026-04-25 02:07:30 +08:00
SmileQWQ
abd591a1cd fix: align worker sync with worker runtime
- restore worker-specific storage capabilities after syncing main settings changes
- keep email provider defaults and tests compatible with the worker runtime
- extend worker notification delivery tracking for serverchan and gotify
2026-04-24 13:39:55 +08:00
SmileQWQ
622287a2cb feat: add notification providers and theme support
- add SMTP/Resend provider switching plus Server 酱 and Gotify settings, validation, and test endpoints
- keep email config backward compatible while reworking the notification settings grid into a compact 3-column layout
- add local-only light/dark theme preference with a floating sidebar toggle and dark theme styling across cards, pages, charts, logo pickers, and drawers
- tighten notification target URL validation, update exchange rate provider naming, and refresh API/web tests for the new settings and theme behavior
2026-04-24 11:44:02 +08:00
SmileQWQ
dba4be9986 refactor: remove worker KV state and D1 transaction-heavy paths
Move worker state from KV to D1 or memory.
Clear affected page queries after Wallos import and avoid D1 transaction-heavy Prisma paths.
2026-04-23 21:33:34 +08:00
SmileQWQ
ace3ca992a perf: streamline worker page data loading
Sync the settings-form deep-clone fix and AI loading copy improvements from main, then continue reducing page-entry latency on the worker branch.

Included fixes:
- restore editability for nested notification and AI settings fields by cloning settings query data before binding forms
- refine AI recognition loading copy layout to avoid awkward line wraps
- align calendar summary wording with the updated main-branch labels

Data-loading optimizations:
- add shared Vue Query composables for exchange-rate snapshot, tags, notification webhook, statistics overview, budget statistics, and calendar events
- move SettingsPage snapshot and webhook loading onto shared query caches instead of always issuing separate onMounted requests
- move Dashboard, Statistics, and Budget pages onto shared overview and budget query composables
- query-ize the subscriptions main list so list refreshes reuse cache/invalidation instead of repeated page-local fetches
- reuse cached exchange-rate snapshot and tag data on the subscriptions page
- remove over-aggressive query behavior that could cause stale or inconsistent UI states by:
  - updating settings query cache immediately after save operations
  - avoiding duplicate subscriptions refetches when filters already change the query key
  - keeping calendar month switches query-driven without showing mismatched stale month labels

Validation:
- npm run test -w apps/web passed
- npm run lint -w apps/web passed
- npm run build -w packages/shared passed
- npm run build -w apps/web passed
2026-04-23 09:56:16 +08:00
SmileQWQ
ab924fed91 perf: consolidate worker lite optimizations
- combine the worker-lite performance and reliability work into one coherent commit for the cf-worker branch
- reduce duplicate submissions and repeated settings fetches on the frontend, add clearer saving/recognition states, and keep Worker-limit error messaging focused on real failures
- refactor worker hot paths around D1/KV usage with short-lived caching, lighter settings/auth access, lazy Prisma creation, slimmer statistics/calendar queries, and safer exchange-rate reads
- simplify logo search and remote-logo handling for Lite constraints, keep cron and notification flows aligned with Worker Free limits, and preserve current Lite-specific UX decisions
- remove unsupported Prisma interactive transactions for D1, batch Wallos import writes, chunk D1 tag joins, and fix Cloudflare-specific issues such as KV minimum TTL handling and remote reset execution on Windows
- include the latest Lite-side cleanup: route-level tags caching, skipping unnecessary tag reads in statistics when tag budgets are disabled, removing calendar adjacent-month prefetching, and executing remote reset SQL through a temp file
2026-04-22 23:47:44 +08:00
SmileQWQ
64515f4662 fix: use direct remote logo references without r2 2026-04-22 17:24:31 +08:00
SmileQWQ
db8ffdc73b refactor: switch worker email provider to resend 2026-04-22 16:28:47 +08:00
SmileQWQ
15c53f468d refactor: remove runtime-specific settings branching
- make storage capability defaults Worker-only for the lite branch

- simplify settings serialization and frontend defaults to always use worker-lite/json-only semantics

- remove unnecessary runtime-based UI branching from the settings page
2026-04-22 02:11:50 +08:00
SmileQWQ
6b45518593 feat: add Cloudflare Worker lite branch implementation
- migrate the lite branch runtime to Cloudflare Worker with D1, KV and optional R2 support

- add worker runtime context, request routing, D1 init guards, bootstrap/reset scripts and wrangler config

- keep the product aligned with the lite plan: MailChannels email, JSON-only Wallos import, no local OCR, remote logo fallback without local disk storage

- restore logo search behavior toward main parity while adapting storage and cache to Worker bindings

- update branding and UI copy for SubTracker Lite, including runtime naming and lite-specific settings/help text

- replace Docker-oriented docs/workflow assets with cf-worker specific CI/deploy workflows and deployment docs

- add regression tests for worker runtime paths, database init, logo search, worker capability helpers and bootstrap script behavior
2026-04-22 01:49:17 +08:00
SmileQWQ
eeaf5dab55 feat: add flexible reminder rule configuration
- replace fixed reminder day controls with configurable reminder rule strings for advance and overdue notifications
- add shared parsing and normalization helpers, subscription-level override fields, and default seeded rules
- switch reminder scanning to minute-level rule matching while preserving merged notification behavior
- update settings, subscription forms, detail views, and types to use tooltip-guided rule inputs and normalized save flow
- refresh API and tests to cover the new reminder rule settings, storage, and notification matching behavior
2026-04-20 18:47:08 +08:00
SmileQWQ
e05c5172e2 style: adjust settings layout 2026-04-20 11:18:36 +08:00
SmileQWQ
364c758add feat: add merged reminder notifications
- add a basic settings toggle for merged reminder delivery

- default merged notifications to enabled and send one scan summary per run
2026-04-20 11:10:34 +08:00
SmileQWQ
2c537aca2c feat: add admin hardening and subscription management improvements
- enforce default admin password change with a blocking post-login flow
- add Telegram bot notification settings and test endpoint
- move Wallos import into Settings and add subscription CSV/JSON export
- enable batch subscription actions for renew, pause, cancel, and guarded delete
- expand frontend and API typing/tests for the new auth, settings, and subscription flows
2026-04-20 10:07:37 +08:00
SmileQWQ
d6913fef1a feat: add configurable reminder settings and app version display
- add notifyOnDueDay and overdueReminderDays to shared settings schema and defaults

- wire reminder settings through API settings service, notification scan logic, seed data, and tests

- update settings page with 默认提前提醒天数 label, 到期当天提醒 switch, and 过期提醒 multi-select

- show current app version under SubTracker branding and inject VITE_APP_VERSION during web builds

- add GPLv3 LICENSE and update README with license and acknowledgements
2026-04-19 22:55:36 +08:00
SmileQWQ
34b59ebe4b feat: refine statistics, subscriptions, and deployment docs
- add monthly subscription spend TOP10 to statistics overview and UI

- improve subscriptions pagination with per-page persistence and note-row handling

- make login validation messages friendlier on both client and server

- clarify API-only upgrade flow for static web assets

- move web unit tests into apps/web/tests/unit
2026-04-19 21:52:20 +08:00
SmileQWQ
3fdd6f89d2 fix: harden production deployment flow 2026-04-19 18:53:10 +08:00
SmileQWQ
5d9cd12cc3 fix: validate required settings for notifications and AI 2026-04-19 16:34:36 +08:00
SmileQWQ
b374992156 feat: upgrade AI multimodal compatibility
- add provider presets for Aliyun Bailian, Tencent Hunyuan, and Volcengine Ark
- switch to explicit vision and structured-output capability flags
- add separate connection and vision test flows
2026-04-19 16:27:18 +08:00
SmileQWQ
6f95114558 refactor: simplify webhook persistence model 2026-04-17 16:06:16 +08:00
SmileQWQ
33b3185511 feat: refine renewal notifications and webhook settings 2026-04-17 15:52:12 +08:00
SmileQWQ
2a7bac6aaf feat: unify built-in AI prompt handling
- share the built-in subscription prompt between frontend and backend

- show the built-in prompt directly inside the editable custom prompt field

- keep empty or unchanged prompt values falling back to the built-in default
2026-04-17 12:00:09 +08:00
SmileQWQ
586790e2f3 feat: improve AI recognition result UX
- replace raw JSON output with a user-friendly field table in the AI recognition modal

- keep raw extracted text in a separate helper section

- add a reset action to the subscription form for both create and edit modes
2026-04-17 11:44:15 +08:00
SmileQWQ
e19d855944 feat: add dedicated budget analytics workspace
- add /statistics/budgets endpoint with total and tag budget summaries

- introduce dedicated 预算统计 page and hide its sidebar entry when tag budgets are disabled

- move tag monthly budget editing into a dedicated modal on the budget page

- add dashboard tag budget overview cards when tag budgets are enabled

- remove duplicate upcoming renewals table from 费用统计 and keep that info on the dashboard

- invalidate menu and statistics queries after settings changes so budget navigation updates immediately
2026-04-17 11:05:24 +08:00
SmileQWQ
3832cebeec feat: add remember-me login controls
- default login sessions to non-persistent browser storage unless remember-me is enabled
- add remember-me checkbox to login page and load configurable remember duration from the server
- add rememberSessionDays to settings and persist it through the shared settings schema
- expose login options endpoint for unauthenticated clients
- move sidebar collapse trigger higher for long single-page layouts
2026-04-17 10:16:21 +08:00
SmileQWQ
00293b0762 fix: improve login flow and sidebar collapse
- clear default admin credentials from login form and update login guidance copy
- support pressing Enter to submit the login form
- fix collapsed sidebar branding overflow by syncing logo and menu collapsed state
2026-04-17 09:58:15 +08:00
SmileQWQ
cc1c90c167 feat: align calendar renewals with projected statistics
- unify calendar events with projected renewal generation across a date range
- add shared projected renewal service and unit coverage for monthly, weekly, expired, and filtered states
- update statistics trend and upcoming-by-day aggregation to reuse projected events
- keep calendar summary, list view, and day detail on the same predicted event source
- refresh shared/web statistics types for projected trend metadata and distribution charts
2026-04-15 15:43:20 +08:00