whisper-money/app
Víctor Falcón 35f12096c2 fix(wise): bound the walk to the job's budget, once per connection
A safety net behind the cursor fix rather than the fix itself: with pagination
working a normal wallet finishes in a couple of requests. But a genuinely long
history, or a provider answering slowly, would still get the job killed at 120s —
and because `last_synced_at` is only written on success, that leaves every cycle
restarting the same first sync, which is the state this connection was in.

The deadline is the caller's, passed in, for two reasons. Wise creates one account
per currency per profile, so a budget per wallet would multiply straight past the
job's timeout — a three-wallet connection reproduced the original bug verbatim.
And a caller under no time pressure (`banking:sync --sync` runs in-process, where
the worker timeout does not apply) can pass null and walk as far as it likes.

`WiseClient` now sets its own 15s/5s timeouts instead of inheriting the
framework's 30s, so "the budget plus one in-flight request" is a bound this code
actually owns. Matches EnableBankingProvider and InteractiveBrokersClient, which
were the only two setting theirs.

Stopping short is now a warning, not an info line: pages left behind are history
the user silently does not get. `importPage` is extracted to keep `sync` under the
complexity threshold, which the deadline had pushed it over.
2026-08-12 13:19:06 +02:00
..
Actions feat(subscriptions): end the trial experiment and make the trial length per plan (#762) 2026-08-12 10:59:55 +02:00
Ai/Agents feat(stats): post the Discord stats reports in Spanish, opened by an AI summary (#752) 2026-08-10 10:13:40 +02:00
Console/Commands feat(budgets): count shared accounts at the owner's percentage (#786) 2026-08-12 12:47:43 +02:00
Contracts feat(connections): manage which accounts a bank connection syncs (#558) 2026-06-18 16:22:49 +02:00
Enums feat(transactions): add a monthly trend view to the analysis drawer (#736) 2026-07-26 17:03:52 +02:00
Events Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
Exceptions/Banking fix(banking): stop unclassified bank responses from silently killing a connection (#742) 2026-08-09 17:26:34 +02:00
Features feat(subscriptions): end the trial experiment and make the trial length per plan (#762) 2026-08-12 10:59:55 +02:00
Http fix(budgets): re-derive budget membership when labels are attached without a model event (#787) 2026-08-12 12:48:47 +02:00
Jobs fix(budgets): re-derive budget membership when labels are attached without a model event (#787) 2026-08-12 12:48:47 +02:00
Listeners feat: reuse the upgrade modal at more upsell points and attribute revenue (#699) 2026-07-18 12:53:20 +00:00
Mail feat(budgets): count shared accounts at the owner's percentage (#786) 2026-08-12 12:47:43 +02:00
Mcp fix(budgets): re-derive budget membership when labels are attached without a model event (#787) 2026-08-12 12:48:47 +02:00
Models feat(budgets): count shared accounts at the owner's percentage (#786) 2026-08-12 12:47:43 +02:00
Notifications refactor: remove HIDE_AUTH_BUTTONS launch gate and waitlist apparatus (#717) 2026-07-22 08:51:48 +02:00
Policies refactor(policies): extract HandlesUserOwnership trait (#478) 2026-06-03 17:43:30 +02:00
Providers fix(auth): make build deterministic when REGISTRATION_ENABLED=false (#720) 2026-07-22 07:04:20 +00:00
Rules feat: parent/child category tree (#474) 2026-06-03 19:30:12 +02:00
Services fix(wise): bound the walk to the job's budget, once per connection 2026-08-12 13:19:06 +02:00
Support ci: add duplication and complexity quality checks (#765) 2026-08-11 13:29:37 +02:00