cata-centavo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/bin/cata-centavo.js +226 -0
  4. package/dist/bin/cata-centavo.js.map +1 -0
  5. package/dist/cli/dispatch.js +67 -0
  6. package/dist/cli/dispatch.js.map +1 -0
  7. package/dist/cli/doctor.js +178 -0
  8. package/dist/cli/doctor.js.map +1 -0
  9. package/dist/cli/init.js +125 -0
  10. package/dist/cli/init.js.map +1 -0
  11. package/dist/cli/progress.js +85 -0
  12. package/dist/cli/progress.js.map +1 -0
  13. package/dist/cli/sync.js +26 -0
  14. package/dist/cli/sync.js.map +1 -0
  15. package/dist/config.js +119 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/core/account.js +12 -0
  18. package/dist/core/account.js.map +1 -0
  19. package/dist/core/accounts.js +91 -0
  20. package/dist/core/accounts.js.map +1 -0
  21. package/dist/core/aggregate.js +83 -0
  22. package/dist/core/aggregate.js.map +1 -0
  23. package/dist/core/balance.js +68 -0
  24. package/dist/core/balance.js.map +1 -0
  25. package/dist/core/bill-rows.js +132 -0
  26. package/dist/core/bill-rows.js.map +1 -0
  27. package/dist/core/bill.js +103 -0
  28. package/dist/core/bill.js.map +1 -0
  29. package/dist/core/category-source.js +26 -0
  30. package/dist/core/category-source.js.map +1 -0
  31. package/dist/core/category.js +72 -0
  32. package/dist/core/category.js.map +1 -0
  33. package/dist/core/consent.js +19 -0
  34. package/dist/core/consent.js.map +1 -0
  35. package/dist/core/contracts.js +9 -0
  36. package/dist/core/contracts.js.map +1 -0
  37. package/dist/core/counterparty.js +69 -0
  38. package/dist/core/counterparty.js.map +1 -0
  39. package/dist/core/date.js +25 -0
  40. package/dist/core/date.js.map +1 -0
  41. package/dist/core/description.js +58 -0
  42. package/dist/core/description.js.map +1 -0
  43. package/dist/core/diagnose.js +32 -0
  44. package/dist/core/diagnose.js.map +1 -0
  45. package/dist/core/mcc.js +124 -0
  46. package/dist/core/mcc.js.map +1 -0
  47. package/dist/core/refresh.js +142 -0
  48. package/dist/core/refresh.js.map +1 -0
  49. package/dist/core/self-transfer.js +22 -0
  50. package/dist/core/self-transfer.js.map +1 -0
  51. package/dist/core/taxonomy-tree.js +148 -0
  52. package/dist/core/taxonomy-tree.js.map +1 -0
  53. package/dist/core/taxonomy.js +70 -0
  54. package/dist/core/taxonomy.js.map +1 -0
  55. package/dist/core/transaction.js +2 -0
  56. package/dist/core/transaction.js.map +1 -0
  57. package/dist/core/transactions.js +46 -0
  58. package/dist/core/transactions.js.map +1 -0
  59. package/dist/logging.js +93 -0
  60. package/dist/logging.js.map +1 -0
  61. package/dist/mcp/cursor.js +64 -0
  62. package/dist/mcp/cursor.js.map +1 -0
  63. package/dist/mcp/format.js +38 -0
  64. package/dist/mcp/format.js.map +1 -0
  65. package/dist/mcp/server.js +50 -0
  66. package/dist/mcp/server.js.map +1 -0
  67. package/dist/mcp/source.js +2 -0
  68. package/dist/mcp/source.js.map +1 -0
  69. package/dist/mcp/tools/accounts.js +144 -0
  70. package/dist/mcp/tools/accounts.js.map +1 -0
  71. package/dist/mcp/tools/balance.js +96 -0
  72. package/dist/mcp/tools/balance.js.map +1 -0
  73. package/dist/mcp/tools/bill-summary-format.js +161 -0
  74. package/dist/mcp/tools/bill-summary-format.js.map +1 -0
  75. package/dist/mcp/tools/bill-summary.js +105 -0
  76. package/dist/mcp/tools/bill-summary.js.map +1 -0
  77. package/dist/mcp/tools/bills.js +144 -0
  78. package/dist/mcp/tools/bills.js.map +1 -0
  79. package/dist/mcp/tools/closing-days.js +90 -0
  80. package/dist/mcp/tools/closing-days.js.map +1 -0
  81. package/dist/mcp/tools/list-transactions.js +122 -0
  82. package/dist/mcp/tools/list-transactions.js.map +1 -0
  83. package/dist/mcp/tools/result.js +12 -0
  84. package/dist/mcp/tools/result.js.map +1 -0
  85. package/dist/mcp/tools/set-category.js +74 -0
  86. package/dist/mcp/tools/set-category.js.map +1 -0
  87. package/dist/mcp/tools/sources.js +73 -0
  88. package/dist/mcp/tools/sources.js.map +1 -0
  89. package/dist/mcp/tools/transaction-details.js +146 -0
  90. package/dist/mcp/tools/transaction-details.js.map +1 -0
  91. package/dist/mcp/tools/transaction-input.js +51 -0
  92. package/dist/mcp/tools/transaction-input.js.map +1 -0
  93. package/dist/mcp/tools/transactions.js +186 -0
  94. package/dist/mcp/tools/transactions.js.map +1 -0
  95. package/dist/pluggy/client.js +123 -0
  96. package/dist/pluggy/client.js.map +1 -0
  97. package/dist/pluggy/errors.js +152 -0
  98. package/dist/pluggy/errors.js.map +1 -0
  99. package/dist/pluggy/mapper.js +155 -0
  100. package/dist/pluggy/mapper.js.map +1 -0
  101. package/dist/pluggy/money.js +53 -0
  102. package/dist/pluggy/money.js.map +1 -0
  103. package/dist/pluggy/transaction-mapper.js +124 -0
  104. package/dist/pluggy/transaction-mapper.js.map +1 -0
  105. package/dist/pluggy/transport.js +170 -0
  106. package/dist/pluggy/transport.js.map +1 -0
  107. package/dist/pluggy/wire.js +207 -0
  108. package/dist/pluggy/wire.js.map +1 -0
  109. package/dist/storage/categories.js +101 -0
  110. package/dist/storage/categories.js.map +1 -0
  111. package/dist/storage/category-sql.js +37 -0
  112. package/dist/storage/category-sql.js.map +1 -0
  113. package/dist/storage/closing-days.js +27 -0
  114. package/dist/storage/closing-days.js.map +1 -0
  115. package/dist/storage/db.js +162 -0
  116. package/dist/storage/db.js.map +1 -0
  117. package/dist/storage/diagnostics.js +57 -0
  118. package/dist/storage/diagnostics.js.map +1 -0
  119. package/dist/storage/harvest.js +87 -0
  120. package/dist/storage/harvest.js.map +1 -0
  121. package/dist/storage/migrations.js +125 -0
  122. package/dist/storage/migrations.js.map +1 -0
  123. package/dist/storage/transaction-row.js +74 -0
  124. package/dist/storage/transaction-row.js.map +1 -0
  125. package/dist/storage/transactions.js +213 -0
  126. package/dist/storage/transactions.js.map +1 -0
  127. package/package.json +70 -0
@@ -0,0 +1,32 @@
1
+ import { consentState } from "./consent.js";
2
+ /**
3
+ * The connection status and the consent behind it, for every configured id.
4
+ *
5
+ * The two requests per connection fire together and settle independently: a
6
+ * consent lookup that fails must not take the item status with it, and the
7
+ * reverse holds too. One bad id does not abort the rest, and output order
8
+ * follows `connectionIds` so the report lines up with what the user
9
+ * configured.
10
+ */
11
+ export async function diagnose(bank, connectionIds, toFailure, clock) {
12
+ return Promise.all(connectionIds.map((id) => diagnoseOne(bank, id, toFailure, clock)));
13
+ }
14
+ async function diagnoseOne(bank, id, toFailure, clock) {
15
+ const [connectionResult, consentResult] = await Promise.allSettled([bank.getConnection(id), bank.getConsent(id)]);
16
+ const { connection, failure } = readConnection(connectionResult, toFailure);
17
+ const consent = readConsent(consentResult);
18
+ return { id, connection, failure, consent, state: consentState(consent, clock.now()) };
19
+ }
20
+ function readConnection(result, toFailure) {
21
+ if (result.status === "fulfilled") {
22
+ return { connection: result.value, failure: null };
23
+ }
24
+ return { connection: null, failure: toFailure(result.reason) };
25
+ }
26
+ function readConsent(result) {
27
+ if (result.status === "fulfilled") {
28
+ return result.value;
29
+ }
30
+ return null;
31
+ }
32
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/core/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAW/D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,aAAgC,EAChC,SAA0C,EAC1C,KAAY;IAEZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAU,EACV,EAAU,EACV,SAA0C,EAC1C,KAAY;IAEZ,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CACrB,MAAwC,EACxC,SAA0C;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,MAA4C;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { CATEGORIES } from "./category.js";
2
+ /**
3
+ * ISO 18245 merchant category code → category, for the codes that show up in
4
+ * real statements. ADR §12.4 step 3 asks for exactly this and says so: cover
5
+ * "the codes that actually show up in real statements. All 1000 are not needed
6
+ * up front." This table is the reason the mapping waited for data.
7
+ *
8
+ * The signal matters because the free tier is expected to stop returning
9
+ * `category` on transactions. When it does, `creditCardMetadata.payeeMCC` is
10
+ * the only categorization left on a card transaction (ADR §12.1's asymmetry).
11
+ *
12
+ * **Provenance, stated honestly.** Derived on 2026-07-26 from one wallet, three
13
+ * institutions, 1123 card transactions carrying both an MCC and a category.
14
+ * Each observed category was rolled up to its top-level ancestor and the most
15
+ * frequent ancestor won. That is 87 of the roughly 1000 ISO 18245 codes: it
16
+ * covers what one person spends on, not the code space.
17
+ *
18
+ * **The winner is a plurality, not always a majority.** 78 of the 87 rows are
19
+ * unanimous; the weakest is MCC 5968 at 12 of 25. Those rows are mapped by the
20
+ * same rule as the rest, deliberately — but `samples` and `agreeing` are there
21
+ * so nobody mistakes one for a 192-sample unanimous mapping.
22
+ *
23
+ * Seeded into `cache.db.mcc_categories` rather than consulted from JavaScript,
24
+ * because `getTransactions`' `categories` filter runs in SQL (ADR §12.2).
25
+ */
26
+ export const MCC_CATEGORIES = [
27
+ { mcc: 780, category: CATEGORIES.transfers.id, samples: 2, agreeing: 2 },
28
+ { mcc: 1740, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
29
+ { mcc: 2741, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
30
+ { mcc: 3247, category: CATEGORIES.travel.id, samples: 1, agreeing: 1 },
31
+ { mcc: 3300, category: CATEGORIES.travel.id, samples: 2, agreeing: 2 },
32
+ { mcc: 4111, category: CATEGORIES.transportation.id, samples: 1, agreeing: 1 },
33
+ { mcc: 4121, category: CATEGORIES.transportation.id, samples: 192, agreeing: 192 },
34
+ { mcc: 4131, category: CATEGORIES.transportation.id, samples: 17, agreeing: 17 },
35
+ { mcc: 4722, category: CATEGORIES.travel.id, samples: 36, agreeing: 32 },
36
+ { mcc: 4812, category: CATEGORIES.services.id, samples: 4, agreeing: 4 },
37
+ { mcc: 4814, category: CATEGORIES.services.id, samples: 11, agreeing: 11 },
38
+ { mcc: 4816, category: CATEGORIES.digitalServices.id, samples: 4, agreeing: 4 },
39
+ { mcc: 4899, category: CATEGORIES.digitalServices.id, samples: 12, agreeing: 12 },
40
+ { mcc: 5131, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
41
+ { mcc: 5139, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
42
+ { mcc: 5199, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
43
+ { mcc: 5211, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
44
+ { mcc: 5300, category: CATEGORIES.groceries.id, samples: 11, agreeing: 11 },
45
+ { mcc: 5309, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
46
+ { mcc: 5310, category: CATEGORIES.shopping.id, samples: 10, agreeing: 10 },
47
+ { mcc: 5311, category: CATEGORIES.shopping.id, samples: 9, agreeing: 7 },
48
+ { mcc: 5331, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
49
+ { mcc: 5411, category: CATEGORIES.groceries.id, samples: 46, agreeing: 46 },
50
+ { mcc: 5422, category: CATEGORIES.groceries.id, samples: 44, agreeing: 44 },
51
+ { mcc: 5441, category: CATEGORIES.groceries.id, samples: 4, agreeing: 4 },
52
+ { mcc: 5451, category: CATEGORIES.groceries.id, samples: 1, agreeing: 1 },
53
+ { mcc: 5462, category: CATEGORIES.groceries.id, samples: 75, agreeing: 75 },
54
+ { mcc: 5499, category: CATEGORIES.foodAndDrinks.id, samples: 27, agreeing: 16 },
55
+ { mcc: 5541, category: CATEGORIES.transportation.id, samples: 1, agreeing: 1 },
56
+ { mcc: 5611, category: CATEGORIES.shopping.id, samples: 5, agreeing: 5 },
57
+ { mcc: 5651, category: CATEGORIES.shopping.id, samples: 16, agreeing: 16 },
58
+ { mcc: 5655, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
59
+ { mcc: 5661, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
60
+ { mcc: 5691, category: CATEGORIES.shopping.id, samples: 4, agreeing: 4 },
61
+ { mcc: 5697, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
62
+ { mcc: 5698, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
63
+ { mcc: 5699, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
64
+ { mcc: 5714, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
65
+ { mcc: 5722, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
66
+ { mcc: 5732, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
67
+ { mcc: 5734, category: CATEGORIES.shopping.id, samples: 35, agreeing: 28 },
68
+ { mcc: 5812, category: CATEGORIES.foodAndDrinks.id, samples: 105, agreeing: 94 },
69
+ { mcc: 5813, category: CATEGORIES.foodAndDrinks.id, samples: 20, agreeing: 20 },
70
+ { mcc: 5814, category: CATEGORIES.foodAndDrinks.id, samples: 90, agreeing: 84 },
71
+ { mcc: 5815, category: CATEGORIES.digitalServices.id, samples: 43, agreeing: 43 },
72
+ { mcc: 5818, category: CATEGORIES.digitalServices.id, samples: 1, agreeing: 1 },
73
+ { mcc: 5912, category: CATEGORIES.healthcare.id, samples: 55, agreeing: 55 },
74
+ { mcc: 5921, category: CATEGORIES.groceries.id, samples: 5, agreeing: 5 },
75
+ { mcc: 5942, category: CATEGORIES.shopping.id, samples: 24, agreeing: 24 },
76
+ { mcc: 5943, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
77
+ { mcc: 5944, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
78
+ { mcc: 5947, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
79
+ { mcc: 5962, category: CATEGORIES.travel.id, samples: 7, agreeing: 7 },
80
+ { mcc: 5963, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
81
+ { mcc: 5968, category: CATEGORIES.shopping.id, samples: 25, agreeing: 12 },
82
+ { mcc: 5977, category: CATEGORIES.shopping.id, samples: 4, agreeing: 3 },
83
+ { mcc: 5992, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
84
+ { mcc: 5999, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
85
+ { mcc: 6010, category: CATEGORIES.transfers.id, samples: 6, agreeing: 6 },
86
+ { mcc: 7011, category: CATEGORIES.travel.id, samples: 5, agreeing: 5 },
87
+ { mcc: 7216, category: CATEGORIES.services.id, samples: 36, agreeing: 36 },
88
+ { mcc: 7221, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
89
+ { mcc: 7230, category: CATEGORIES.services.id, samples: 2, agreeing: 2 },
90
+ { mcc: 7299, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
91
+ { mcc: 7338, category: CATEGORIES.services.id, samples: 2, agreeing: 2 },
92
+ { mcc: 7349, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
93
+ { mcc: 7372, category: CATEGORIES.digitalServices.id, samples: 3, agreeing: 3 },
94
+ { mcc: 7379, category: CATEGORIES.services.id, samples: 9, agreeing: 9 },
95
+ { mcc: 7392, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
96
+ { mcc: 7395, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
97
+ { mcc: 7399, category: CATEGORIES.services.id, samples: 3, agreeing: 3 },
98
+ { mcc: 7622, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
99
+ { mcc: 7996, category: CATEGORIES.leisure.id, samples: 1, agreeing: 1 },
100
+ { mcc: 7997, category: CATEGORIES.services.id, samples: 6, agreeing: 6 },
101
+ { mcc: 7999, category: CATEGORIES.leisure.id, samples: 1, agreeing: 1 },
102
+ { mcc: 8011, category: CATEGORIES.healthcare.id, samples: 5, agreeing: 5 },
103
+ { mcc: 8021, category: CATEGORIES.healthcare.id, samples: 7, agreeing: 7 },
104
+ { mcc: 8043, category: CATEGORIES.healthcare.id, samples: 3, agreeing: 3 },
105
+ { mcc: 8220, category: CATEGORIES.services.id, samples: 14, agreeing: 14 },
106
+ { mcc: 8299, category: CATEGORIES.services.id, samples: 13, agreeing: 13 },
107
+ { mcc: 8398, category: CATEGORIES.donations.id, samples: 1, agreeing: 1 },
108
+ { mcc: 8661, category: CATEGORIES.donations.id, samples: 2, agreeing: 2 },
109
+ { mcc: 8699, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
110
+ { mcc: 8931, category: CATEGORIES.services.id, samples: 3, agreeing: 3 },
111
+ { mcc: 8999, category: CATEGORIES.services.id, samples: 6, agreeing: 4 },
112
+ { mcc: 9399, category: CATEGORIES.services.id, samples: 4, agreeing: 4 },
113
+ { mcc: 9994, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
114
+ ];
115
+ const BY_MCC = new Map(MCC_CATEGORIES.map((entry) => [entry.mcc, entry]));
116
+ /**
117
+ * The category an MCC defaults to, or `undefined` when we have never seen the
118
+ * code. There is no fallback category on purpose: an unknown MCC has no answer,
119
+ * and ADR §12.3's `COALESCE` chain is built to fall through to no category.
120
+ */
121
+ export function categoryForMcc(mcc) {
122
+ return BY_MCC.get(mcc)?.category;
123
+ }
124
+ //# sourceMappingURL=mcc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcc.js","sourceRoot":"","sources":["../../src/core/mcc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * 2s doubling to a 30s ceiling over 40 attempts is a little over eighteen
3
+ * minutes of patience, chosen against the documented five-minute worst case for
4
+ * the login step alone.
5
+ */
6
+ export const POLL = { firstDelayMs: 2_000, maxDelayMs: 30_000, attempts: 40 };
7
+ export const PHASES = {
8
+ updating: "updating",
9
+ refreshed: "refreshed",
10
+ needsUser: "needs-user",
11
+ loginError: "login-error",
12
+ failed: "failed",
13
+ };
14
+ export async function refresh(deps, id) {
15
+ try {
16
+ const start = await deps.bank.refreshConnection(id);
17
+ if (start.kind === "too-soon") {
18
+ return { kind: "already-fresh", everyHours: start.everyHours, lastUpdatedAt: start.lastUpdatedAt };
19
+ }
20
+ if (start.kind === "not-refreshable") {
21
+ return { kind: "not-refreshable" };
22
+ }
23
+ return await poll(deps, id, start.connection);
24
+ }
25
+ catch (error) {
26
+ return { kind: "failed", reason: error instanceof Error ? error.message : String(error) };
27
+ }
28
+ finally {
29
+ deps.report({ kind: "settled", id });
30
+ }
31
+ }
32
+ async function poll(deps, id, first) {
33
+ let connection = first;
34
+ let stage = null;
35
+ /** Silent while the stage repeats, so a long sync reports a handful of times. */
36
+ const announce = (current) => {
37
+ if (phaseOf(current) !== PHASES.updating) {
38
+ return;
39
+ }
40
+ const label = stageLabel(current.executionStatus);
41
+ if (label !== stage) {
42
+ stage = label;
43
+ deps.report({ kind: "stage", id, label });
44
+ }
45
+ };
46
+ announce(connection);
47
+ let delay = POLL.firstDelayMs;
48
+ for (let attempt = 0; attempt < POLL.attempts; attempt += 1) {
49
+ const phase = phaseOf(connection);
50
+ if (phase !== PHASES.updating) {
51
+ return settled(phase, connection);
52
+ }
53
+ await deps.sleep(delay);
54
+ delay = Math.min(delay * 2, POLL.maxDelayMs);
55
+ connection = await deps.bank.getConnection(id);
56
+ announce(connection);
57
+ }
58
+ const phase = phaseOf(connection);
59
+ // Running out of patience is not a failure. The sync continues at Pluggy, and
60
+ // the next `init` will find it finished.
61
+ return phase === PHASES.updating ? { kind: "still-updating", connection } : settled(phase, connection);
62
+ }
63
+ function settled(phase, connection) {
64
+ switch (phase) {
65
+ case PHASES.refreshed:
66
+ return { kind: "refreshed", connection };
67
+ case PHASES.needsUser:
68
+ return { kind: "needs-user", connection };
69
+ case PHASES.loginError:
70
+ return { kind: "login-error", connection };
71
+ default:
72
+ return {
73
+ kind: "failed",
74
+ reason: `Pluggy ended the sync as ${connection.status} / ${connection.executionStatus ?? "no execution status"}`,
75
+ };
76
+ }
77
+ }
78
+ const SUCCEEDED = new Set(["SUCCESS", "PARTIAL_SUCCESS"]);
79
+ /**
80
+ * Every status whose phase `status` alone decides. `UPDATED` is the one that
81
+ * needs a second look and so is missing here.
82
+ */
83
+ const PHASE_BY_STATUS = {
84
+ UPDATING: PHASES.updating,
85
+ MERGING: PHASES.updating,
86
+ // Undocumented as a `status`, yet Pluggy's own rate-limit page shows an item
87
+ // carrying it. Treated as the success it describes.
88
+ PARTIAL_SUCCESS: PHASES.refreshed,
89
+ WAITING_USER_INPUT: PHASES.needsUser,
90
+ WAITING_USER_ACTION: PHASES.needsUser,
91
+ LOGIN_ERROR: PHASES.loginError,
92
+ };
93
+ export function phaseOf(connection) {
94
+ if (connection.status === "UPDATED") {
95
+ return updatedPhase(connection.executionStatus);
96
+ }
97
+ return PHASE_BY_STATUS[connection.status] ?? PHASES.failed;
98
+ }
99
+ /**
100
+ * `status` is authoritative here: a missing `executionStatus` on an item Pluggy
101
+ * calls UPDATED is not a reason to call the sync broken.
102
+ */
103
+ function updatedPhase(executionStatus) {
104
+ return executionStatus === null || SUCCEEDED.has(executionStatus) ? PHASES.refreshed : PHASES.failed;
105
+ }
106
+ // Stryker disable StringLiteral: spinner text, not behaviour — asserting each label would pin wording no caller reads
107
+ const STAGES = {
108
+ CREATED: "starting",
109
+ CREATING: "starting",
110
+ LOGIN_IN_PROGRESS: "logging in",
111
+ LOGIN_MFA_IN_PROGRESS: "sending the second factor",
112
+ WAITING_USER_INPUT: "waiting for your token",
113
+ WAITING_USER_ACTION: "waiting for you at the bank",
114
+ USER_AUTHORIZATION_PENDING: "waiting for the bank to authorize us",
115
+ ACCOUNTS_IN_PROGRESS: "reading accounts",
116
+ CREDITCARDS_IN_PROGRESS: "reading credit cards",
117
+ TRANSACTIONS_IN_PROGRESS: "reading transactions",
118
+ INVESTMENTS_IN_PROGRESS: "reading investments",
119
+ INVESTMENT_TRANSACTIONS_IN_PROGRESS: "reading investment transactions",
120
+ INVESTMENTS_TRANSACTIONS_IN_PROGRESS: "reading investment transactions",
121
+ LOANS_IN_PROGRESS: "reading loans",
122
+ IDENTITY_IN_PROGRESS: "reading identity",
123
+ PAYMENT_DATA_IN_PROGRESS: "reading payment data",
124
+ ACCOUNT_STATEMENTS_IN_PROGRESS: "reading statements",
125
+ BROKERAGE_NOTE_IN_PROGRESS: "reading brokerage notes",
126
+ MERGING: "merging what changed",
127
+ SUCCESS: "done",
128
+ PARTIAL_SUCCESS: "done, with warnings",
129
+ };
130
+ // Stryker restore StringLiteral
131
+ /**
132
+ * What to put next to the spinner. An unrecognised stage is shown in the
133
+ * roughest possible English rather than dropped, because the two enums Pluggy
134
+ * publishes do not agree with each other and neither is closed.
135
+ */
136
+ export function stageLabel(executionStatus) {
137
+ if (executionStatus === null) {
138
+ return "starting";
139
+ }
140
+ return STAGES[executionStatus] ?? executionStatus.toLowerCase().replaceAll("_", " ");
141
+ }
142
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Moving money between your own accounts is not spending, and paying a card
3
+ * bill is not spending twice.
4
+ *
5
+ * These are leaves rather than groups because the distinction lives below the
6
+ * 22: `05100000` (credit card payment) is excluded while its parent `05000000`
7
+ * (Transfers) is ordinary spending. They are matched against the *durable*
8
+ * leaf — `DerivedTransaction.categoryId`, which falls back to the snapshot —
9
+ * so the exclusion outlives the enrichment.
10
+ */
11
+ const SELF_TRANSFER_LEAVES = new Set([
12
+ "04000000", "04010000", "04020000", "04030000", "05100000",
13
+ ]);
14
+ /** A manual correction to Same person transfer excludes the row too. */
15
+ const SELF_TRANSFER_GROUP = "04000000";
16
+ export function isSelfTransfer(row) {
17
+ if (row.category === SELF_TRANSFER_GROUP) {
18
+ return true;
19
+ }
20
+ return row.categoryId !== null && SELF_TRANSFER_LEAVES.has(row.categoryId);
21
+ }
22
+ //# sourceMappingURL=self-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-transfer.js","sourceRoot":"","sources":["../../src/core/self-transfer.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CAC3D,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,IAAI,GAAG,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Pluggy's category tree, as returned by `GET /categories` on 2026-07-26 and
3
+ * recorded in `docs/research/2026-07-26-phase-0-5-recon.md`.
4
+ *
5
+ * It ships as code rather than as a `cache.db` seed because `GET /categories`
6
+ * is exposed to the same plan change as the transaction enrichment, and a
7
+ * roll-up that stops working is an aggregate that stops working (design D3).
8
+ *
9
+ * Only `id` and `parentId` are here. The labels the user reads belong to the 22
10
+ * top-level categories and already live in `category.ts`.
11
+ *
12
+ * `02030001`, `02030002` and `02030003` carry `parentId: "02000000"` while
13
+ * their ids and their `parentDescription` both point at `02030000`. Pluggy
14
+ * contradicts itself there; `parentId` is what we build from.
15
+ */
16
+ export const TAXONOMY = [
17
+ { id: "01000000", parentId: null },
18
+ { id: "01010000", parentId: "01000000" },
19
+ { id: "01020000", parentId: "01000000" },
20
+ { id: "01030000", parentId: "01000000" },
21
+ { id: "01040000", parentId: "01000000" },
22
+ { id: "01050000", parentId: "01000000" },
23
+ { id: "02000000", parentId: null },
24
+ { id: "02010000", parentId: "02000000" },
25
+ { id: "02020000", parentId: "02000000" },
26
+ { id: "02030000", parentId: "02000000" },
27
+ { id: "02030001", parentId: "02000000" },
28
+ { id: "02030002", parentId: "02000000" },
29
+ { id: "02030003", parentId: "02000000" },
30
+ { id: "02040000", parentId: "02000000" },
31
+ { id: "03000000", parentId: null },
32
+ { id: "03010000", parentId: "03000000" },
33
+ { id: "03020000", parentId: "03000000" },
34
+ { id: "03030000", parentId: "03000000" },
35
+ { id: "03040000", parentId: "03000000" },
36
+ { id: "03050000", parentId: "03000000" },
37
+ { id: "03060000", parentId: "03000000" },
38
+ { id: "03070000", parentId: "03000000" },
39
+ { id: "04000000", parentId: null },
40
+ { id: "04010000", parentId: "04000000" },
41
+ { id: "04020000", parentId: "04000000" },
42
+ { id: "04030000", parentId: "04000000" },
43
+ { id: "05000000", parentId: null },
44
+ { id: "05010000", parentId: "05000000" },
45
+ { id: "05020000", parentId: "05000000" },
46
+ { id: "05030000", parentId: "05000000" },
47
+ { id: "05040000", parentId: "05000000" },
48
+ { id: "05050000", parentId: "05000000" },
49
+ { id: "05060000", parentId: "05000000" },
50
+ { id: "05070000", parentId: "05000000" },
51
+ { id: "05080000", parentId: "05000000" },
52
+ { id: "05090000", parentId: "05000000" },
53
+ { id: "05090001", parentId: "05090000" },
54
+ { id: "05090002", parentId: "05090000" },
55
+ { id: "05090003", parentId: "05090000" },
56
+ { id: "05090004", parentId: "05090000" },
57
+ { id: "05090005", parentId: "05090000" },
58
+ { id: "05100000", parentId: "05000000" },
59
+ { id: "06000000", parentId: null },
60
+ { id: "06010000", parentId: "06000000" },
61
+ { id: "06020000", parentId: "06000000" },
62
+ { id: "07000000", parentId: null },
63
+ { id: "07010000", parentId: "07000000" },
64
+ { id: "07010001", parentId: "07010000" },
65
+ { id: "07010002", parentId: "07010000" },
66
+ { id: "07010003", parentId: "07010000" },
67
+ { id: "07020000", parentId: "07000000" },
68
+ { id: "07020001", parentId: "07020000" },
69
+ { id: "07020002", parentId: "07020000" },
70
+ { id: "07020003", parentId: "07020000" },
71
+ { id: "07020004", parentId: "07020000" },
72
+ { id: "07030000", parentId: "07000000" },
73
+ { id: "07030001", parentId: "07030000" },
74
+ { id: "07030002", parentId: "07030000" },
75
+ { id: "07030003", parentId: "07030000" },
76
+ { id: "07040000", parentId: "07000000" },
77
+ { id: "07040001", parentId: "07040000" },
78
+ { id: "07040002", parentId: "07040000" },
79
+ { id: "07040003", parentId: "07040000" },
80
+ { id: "08000000", parentId: null },
81
+ { id: "08010000", parentId: "08000000" },
82
+ { id: "08020000", parentId: "08000000" },
83
+ { id: "08030000", parentId: "08000000" },
84
+ { id: "08040000", parentId: "08000000" },
85
+ { id: "08050000", parentId: "08000000" },
86
+ { id: "08060000", parentId: "08000000" },
87
+ { id: "08070000", parentId: "08000000" },
88
+ { id: "08080000", parentId: "08000000" },
89
+ { id: "08090000", parentId: "08000000" },
90
+ { id: "09000000", parentId: null },
91
+ { id: "09010000", parentId: "09000000" },
92
+ { id: "09020000", parentId: "09000000" },
93
+ { id: "09030000", parentId: "09000000" },
94
+ { id: "10000000", parentId: null },
95
+ { id: "11000000", parentId: null },
96
+ { id: "11010000", parentId: "11000000" },
97
+ { id: "11020000", parentId: "11000000" },
98
+ { id: "12000000", parentId: null },
99
+ { id: "12010000", parentId: "12000000" },
100
+ { id: "12020000", parentId: "12000000" },
101
+ { id: "12030000", parentId: "12000000" },
102
+ { id: "12040000", parentId: "12000000" },
103
+ { id: "13000000", parentId: null },
104
+ { id: "14000000", parentId: null },
105
+ { id: "14010000", parentId: "14000000" },
106
+ { id: "14020000", parentId: "14000000" },
107
+ { id: "15000000", parentId: null },
108
+ { id: "15010000", parentId: "15000000" },
109
+ { id: "15020000", parentId: "15000000" },
110
+ { id: "15030000", parentId: "15000000" },
111
+ { id: "16000000", parentId: null },
112
+ { id: "16010000", parentId: "16000000" },
113
+ { id: "16020000", parentId: "16000000" },
114
+ { id: "16030000", parentId: "16000000" },
115
+ { id: "17000000", parentId: null },
116
+ { id: "17010000", parentId: "17000000" },
117
+ { id: "17020000", parentId: "17000000" },
118
+ { id: "17020001", parentId: "17020000" },
119
+ { id: "17020002", parentId: "17020000" },
120
+ { id: "17020003", parentId: "17020000" },
121
+ { id: "17030000", parentId: "17000000" },
122
+ { id: "17040000", parentId: "17000000" },
123
+ { id: "18000000", parentId: null },
124
+ { id: "18010000", parentId: "18000000" },
125
+ { id: "18020000", parentId: "18000000" },
126
+ { id: "18030000", parentId: "18000000" },
127
+ { id: "18040000", parentId: "18000000" },
128
+ { id: "19000000", parentId: null },
129
+ { id: "19010000", parentId: "19000000" },
130
+ { id: "19020000", parentId: "19000000" },
131
+ { id: "19030000", parentId: "19000000" },
132
+ { id: "19040000", parentId: "19000000" },
133
+ { id: "19050000", parentId: "19000000" },
134
+ { id: "19050001", parentId: "19050000" },
135
+ { id: "19050002", parentId: "19050000" },
136
+ { id: "19050003", parentId: "19050000" },
137
+ { id: "19050004", parentId: "19050000" },
138
+ { id: "19050005", parentId: "19050000" },
139
+ { id: "19050006", parentId: "19050000" },
140
+ { id: "20000000", parentId: null },
141
+ { id: "200100000", parentId: "20000000" },
142
+ { id: "200200000", parentId: "20000000" },
143
+ { id: "200300000", parentId: "20000000" },
144
+ { id: "200400000", parentId: "20000000" },
145
+ { id: "21000000", parentId: null },
146
+ { id: "99999999", parentId: null },
147
+ ];
148
+ //# sourceMappingURL=taxonomy-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy-tree.js","sourceRoot":"","sources":["../../src/core/taxonomy-tree.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA6B;IAEhD,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;CACnC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { isCategoryId } from "./category.js";
2
+ import { TAXONOMY } from "./taxonomy-tree.js";
3
+ function parentOf(id, parents) {
4
+ if (!parents.has(id)) {
5
+ throw new Error(`Category points to missing parent ${id}`);
6
+ }
7
+ const parentId = parents.get(id);
8
+ if (parentId === undefined) {
9
+ throw new Error(`Category points to missing parent ${id}`);
10
+ }
11
+ return parentId;
12
+ }
13
+ function rootOf(id, parents) {
14
+ const seen = new Set();
15
+ let current = id;
16
+ while (true) {
17
+ if (seen.has(current)) {
18
+ throw new Error(`Category tree contains a cycle at ${current}`);
19
+ }
20
+ seen.add(current);
21
+ const parentId = parentOf(current, parents);
22
+ if (parentId === undefined) {
23
+ throw new Error(`Category ${id} points to missing parent ${current}`);
24
+ }
25
+ if (parentId === null) {
26
+ if (!isCategoryId(current)) {
27
+ throw new Error(`Category tree root ${current} is not a top-level category`);
28
+ }
29
+ return current;
30
+ }
31
+ current = parentId;
32
+ }
33
+ }
34
+ /** Maps every category id to its top-level ancestor, transitively. */
35
+ export function buildRollup(entries) {
36
+ const parents = new Map();
37
+ for (const entry of entries) {
38
+ if (parents.has(entry.id)) {
39
+ throw new Error(`Category tree contains duplicate id ${entry.id}`);
40
+ }
41
+ parents.set(entry.id, entry.parentId);
42
+ }
43
+ const rollup = new Map();
44
+ for (const entry of entries) {
45
+ rollup.set(entry.id, rootOf(entry.id, parents));
46
+ }
47
+ return rollup;
48
+ }
49
+ /**
50
+ * Built once at module load. `buildRollup` throws on a duplicate id, a missing
51
+ * parent, a cycle or a root that is not top-level — so a defect in the shipped
52
+ * constant fails the suite rather than a user's walk.
53
+ */
54
+ const ROLLUP = buildRollup(TAXONOMY);
55
+ /**
56
+ * The top-level ancestor of a Pluggy category id, or `null` when we do not know
57
+ * the id.
58
+ *
59
+ * Returning `null` rather than throwing is the whole point: the tree ships as
60
+ * code, so a category Pluggy adds tomorrow is absent by construction. An
61
+ * unknown leaf must cost that one row its group, not take a whole account's
62
+ * walk down with it (design D3).
63
+ */
64
+ export function topCategoryOf(categoryId) {
65
+ if (categoryId === null) {
66
+ return null;
67
+ }
68
+ return ROLLUP.get(categoryId) ?? null;
69
+ }
70
+ //# sourceMappingURL=taxonomy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../../src/core/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAKlE,SAAS,QAAQ,CAAC,EAAU,EAAE,OAA2C;IACvE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,EAAU,EAAE,OAA2C;IACrE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,8BAA8B,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,OAAiC;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAErC;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":""}