@opentabs-dev/opentabs-plugin-ynab 0.0.84 → 0.0.86

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 (68) hide show
  1. package/dist/adapter.iife.js +870 -523
  2. package/dist/adapter.iife.js.map +4 -4
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +11 -16
  6. package/dist/index.js.map +1 -1
  7. package/dist/tools/create-transaction.d.ts +2 -2
  8. package/dist/tools/create-transaction.d.ts.map +1 -1
  9. package/dist/tools/create-transaction.js +63 -22
  10. package/dist/tools/create-transaction.js.map +1 -1
  11. package/dist/tools/delete-transaction.d.ts.map +1 -1
  12. package/dist/tools/delete-transaction.js +22 -7
  13. package/dist/tools/delete-transaction.js.map +1 -1
  14. package/dist/tools/get-account.d.ts.map +1 -1
  15. package/dist/tools/get-account.js +3 -3
  16. package/dist/tools/get-account.js.map +1 -1
  17. package/dist/tools/get-month.d.ts +2 -1
  18. package/dist/tools/get-month.d.ts.map +1 -1
  19. package/dist/tools/get-month.js +10 -33
  20. package/dist/tools/get-month.js.map +1 -1
  21. package/dist/tools/get-plan.d.ts.map +1 -1
  22. package/dist/tools/get-plan.js +12 -5
  23. package/dist/tools/get-plan.js.map +1 -1
  24. package/dist/tools/get-transaction.d.ts +2 -2
  25. package/dist/tools/get-transaction.d.ts.map +1 -1
  26. package/dist/tools/get-transaction.js +5 -4
  27. package/dist/tools/get-transaction.js.map +1 -1
  28. package/dist/tools/list-accounts.d.ts.map +1 -1
  29. package/dist/tools/list-accounts.js +4 -4
  30. package/dist/tools/list-accounts.js.map +1 -1
  31. package/dist/tools/list-categories.d.ts.map +1 -1
  32. package/dist/tools/list-categories.js +9 -29
  33. package/dist/tools/list-categories.js.map +1 -1
  34. package/dist/tools/list-months.d.ts +1 -1
  35. package/dist/tools/list-months.d.ts.map +1 -1
  36. package/dist/tools/list-months.js +5 -14
  37. package/dist/tools/list-months.js.map +1 -1
  38. package/dist/tools/list-payees.d.ts.map +1 -1
  39. package/dist/tools/list-payees.js +3 -3
  40. package/dist/tools/list-payees.js.map +1 -1
  41. package/dist/tools/list-scheduled-transactions.d.ts.map +1 -1
  42. package/dist/tools/list-scheduled-transactions.js +7 -5
  43. package/dist/tools/list-scheduled-transactions.js.map +1 -1
  44. package/dist/tools/list-transactions.d.ts +4 -2
  45. package/dist/tools/list-transactions.d.ts.map +1 -1
  46. package/dist/tools/list-transactions.js +40 -8
  47. package/dist/tools/list-transactions.js.map +1 -1
  48. package/dist/tools/move-category-budget.d.ts +24 -0
  49. package/dist/tools/move-category-budget.d.ts.map +1 -0
  50. package/dist/tools/move-category-budget.js +105 -0
  51. package/dist/tools/move-category-budget.js.map +1 -0
  52. package/dist/tools/schemas.d.ts +105 -27
  53. package/dist/tools/schemas.d.ts.map +1 -1
  54. package/dist/tools/schemas.js +176 -27
  55. package/dist/tools/schemas.js.map +1 -1
  56. package/dist/tools/update-category-budget.d.ts.map +1 -1
  57. package/dist/tools/update-category-budget.js +55 -27
  58. package/dist/tools/update-category-budget.js.map +1 -1
  59. package/dist/tools/update-transaction.d.ts +3 -2
  60. package/dist/tools/update-transaction.d.ts.map +1 -1
  61. package/dist/tools/update-transaction.js +84 -31
  62. package/dist/tools/update-transaction.js.map +1 -1
  63. package/dist/tools.json +192 -43
  64. package/dist/ynab-api.d.ts +4 -1
  65. package/dist/ynab-api.d.ts.map +1 -1
  66. package/dist/ynab-api.js +47 -26
  67. package/dist/ynab-api.js.map +1 -1
  68. package/package.json +3 -3
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
1
  import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
2
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
3
3
  declare class YnabPlugin extends OpenTabsPlugin {
4
4
  readonly name = "ynab";
5
5
  readonly description = "OpenTabs plugin for YNAB (You Need A Budget)";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgC/D,cAAM,UAAW,SAAQ,cAAc;IACrC,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,SAAkB,WAAW,UAAU;IACvC,QAAQ,CAAC,WAAW,WAA0B;IAC9C,SAAkB,QAAQ,0BAA0B;IACpD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAuB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAgC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmB1D,cAAM,UAAW,SAAQ,cAAc;IACrC,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,SAAkB,WAAW,UAAU;IACvC,QAAQ,CAAC,WAAW,WAA0B;IAC9C,SAAkB,QAAQ,0BAA0B;IACpD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAwB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAgC"}
package/dist/index.js CHANGED
@@ -1,27 +1,21 @@
1
1
  import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
- import { isAuthenticated, waitForAuth } from './ynab-api.js';
3
- // Account
2
+ import { createTransaction } from './tools/create-transaction.js';
3
+ import { deleteTransaction } from './tools/delete-transaction.js';
4
+ import { getAccount } from './tools/get-account.js';
4
5
  import { getCurrentUser } from './tools/get-current-user.js';
5
- // Plans
6
+ import { getMonth } from './tools/get-month.js';
6
7
  import { getPlan } from './tools/get-plan.js';
7
- // Accounts
8
+ import { getTransaction } from './tools/get-transaction.js';
8
9
  import { listAccounts } from './tools/list-accounts.js';
9
- import { getAccount } from './tools/get-account.js';
10
- // Categories
11
10
  import { listCategories } from './tools/list-categories.js';
12
- import { updateCategoryBudget } from './tools/update-category-budget.js';
13
- // Payees
11
+ import { listMonths } from './tools/list-months.js';
14
12
  import { listPayees } from './tools/list-payees.js';
15
- // Transactions
13
+ import { listScheduledTransactions } from './tools/list-scheduled-transactions.js';
16
14
  import { listTransactions } from './tools/list-transactions.js';
17
- import { getTransaction } from './tools/get-transaction.js';
18
- import { createTransaction } from './tools/create-transaction.js';
15
+ import { moveCategoryBudget } from './tools/move-category-budget.js';
16
+ import { updateCategoryBudget } from './tools/update-category-budget.js';
19
17
  import { updateTransaction } from './tools/update-transaction.js';
20
- import { deleteTransaction } from './tools/delete-transaction.js';
21
- import { listScheduledTransactions } from './tools/list-scheduled-transactions.js';
22
- // Months
23
- import { listMonths } from './tools/list-months.js';
24
- import { getMonth } from './tools/get-month.js';
18
+ import { isAuthenticated, waitForAuth } from './ynab-api.js';
25
19
  class YnabPlugin extends OpenTabsPlugin {
26
20
  name = 'ynab';
27
21
  description = 'OpenTabs plugin for YNAB (You Need A Budget)';
@@ -39,6 +33,7 @@ class YnabPlugin extends OpenTabsPlugin {
39
33
  // Categories
40
34
  listCategories,
41
35
  updateCategoryBudget,
36
+ moveCategoryBudget,
42
37
  // Payees
43
38
  listPayees,
44
39
  // Transactions
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7D,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,QAAQ;AACR,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AAEnF,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,UAAW,SAAQ,cAAc;IAC5B,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,8CAA8C,CAAC;IACpD,WAAW,GAAG,MAAM,CAAC;IAC9B,WAAW,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC5B,QAAQ,GAAG,sBAAsB,CAAC;IAC3C,KAAK,GAAqB;QACjC,UAAU;QACV,cAAc;QACd,QAAQ;QACR,OAAO;QACP,WAAW;QACX,YAAY;QACZ,UAAU;QACV,aAAa;QACb,cAAc;QACd,oBAAoB;QACpB,SAAS;QACT,UAAU;QACV,eAAe;QACf,gBAAgB;QAChB,cAAc;QACd,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,yBAAyB;QACzB,SAAS;QACT,UAAU;QACV,QAAQ;KACT,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,UAAW,SAAQ,cAAc;IAC5B,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,8CAA8C,CAAC;IACpD,WAAW,GAAG,MAAM,CAAC;IAC9B,WAAW,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC5B,QAAQ,GAAG,sBAAsB,CAAC;IAC3C,KAAK,GAAqB;QACjC,UAAU;QACV,cAAc;QACd,QAAQ;QACR,OAAO;QACP,WAAW;QACX,YAAY;QACZ,UAAU;QACV,aAAa;QACb,cAAc;QACd,oBAAoB;QACpB,kBAAkB;QAClB,SAAS;QACT,UAAU;QACV,eAAe;QACf,gBAAgB;QAChB,cAAc;QACd,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,yBAAyB;QACzB,SAAS;QACT,UAAU;QACV,QAAQ;KACT,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,UAAU,EAAE,CAAC"}
@@ -31,7 +31,6 @@ export declare const createTransaction: import("@opentabs-dev/plugin-sdk").ToolD
31
31
  cleared: z.ZodString;
32
32
  approved: z.ZodBoolean;
33
33
  flag_color: z.ZodString;
34
- flag_name: z.ZodString;
35
34
  account_id: z.ZodString;
36
35
  account_name: z.ZodString;
37
36
  payee_id: z.ZodString;
@@ -39,7 +38,8 @@ export declare const createTransaction: import("@opentabs-dev/plugin-sdk").ToolD
39
38
  category_id: z.ZodString;
40
39
  category_name: z.ZodString;
41
40
  transfer_account_id: z.ZodString;
42
- import_id: z.ZodString;
41
+ imported_payee: z.ZodString;
42
+ original_imported_payee: z.ZodString;
43
43
  deleted: z.ZodBoolean;
44
44
  }, z.core.$strip>;
45
45
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"create-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/create-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0D5B,CAAC"}
1
+ {"version":3,"file":"create-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/create-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoG5B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { getPlanId, syncWrite } from '../ynab-api.js';
4
- import { mapTransaction, transactionSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget, syncWrite } from '../ynab-api.js';
4
+ import { buildLookups, CLEARED_MAP, FLAG_MAP, mapTransaction, resolvePayee, toMilliunits, transactionSchema, } from './schemas.js';
5
5
  export const createTransaction = defineTool({
6
6
  name: 'create_transaction',
7
7
  displayName: 'Create Transaction',
@@ -28,30 +28,71 @@ export const createTransaction = defineTool({
28
28
  }),
29
29
  handle: async (params) => {
30
30
  const planId = getPlanId();
31
- const milliunits = Math.round(params.amount * 1000);
31
+ const milliunits = toMilliunits(params.amount);
32
32
  const txId = crypto.randomUUID();
33
- const transaction = {
34
- id: txId,
35
- entities_account_id: params.account_id,
36
- date: params.date,
37
- amount: milliunits,
38
- cleared: params.cleared ?? 'uncleared',
39
- approved: params.approved ?? true,
40
- memo: params.memo ?? null,
41
- flag_color: params.flag_color ?? null,
42
- entities_payee_id: params.payee_id ?? null,
43
- payee_name: params.payee_name ?? null,
44
- entities_subcategory_id: params.category_id ?? null,
45
- is_tombstone: false,
46
- };
47
- const result = await syncWrite(planId, {
48
- be_transactions: [transaction],
49
- });
50
- const saved = result.changed_entities?.be_transactions?.[0];
33
+ const budget = await syncBudget(planId);
34
+ const serverKnowledge = budget.current_server_knowledge ?? 0;
35
+ const lookups = buildLookups(budget.changed_entities ?? {});
36
+ const changedEntities = {};
37
+ let payeeId = params.payee_id ?? null;
38
+ if (!payeeId && params.payee_name) {
39
+ const resolved = resolvePayee(budget.changed_entities?.be_payees ?? [], params.payee_name);
40
+ payeeId = resolved.payeeId;
41
+ if (resolved.newPayee) {
42
+ changedEntities.be_payees = [resolved.newPayee];
43
+ lookups.payees.set(resolved.payeeId, params.payee_name);
44
+ }
45
+ }
46
+ changedEntities.be_transaction_groups = [
47
+ {
48
+ id: txId,
49
+ be_transaction: {
50
+ id: txId,
51
+ is_tombstone: false,
52
+ entities_account_id: params.account_id,
53
+ entities_payee_id: payeeId,
54
+ entities_subcategory_id: params.category_id ?? null,
55
+ entities_scheduled_transaction_id: null,
56
+ date: params.date,
57
+ date_entered_from_schedule: null,
58
+ amount: milliunits,
59
+ // cash_amount and credit_amount are server-computed splits the account
60
+ // type determines. Captured from a credit card account create where
61
+ // YNAB's UI sent zeros and the server populated them on response —
62
+ // not yet verified for cash/checking accounts but likely the same
63
+ // pattern.
64
+ cash_amount: 0,
65
+ credit_amount: 0,
66
+ credit_amount_adjusted: 0,
67
+ subcategory_credit_amount_preceding: 0,
68
+ memo: params.memo ?? null,
69
+ cleared: CLEARED_MAP[params.cleared ?? 'uncleared'],
70
+ // YNAB's wire format calls this "accepted"; the public tool surface uses "approved".
71
+ accepted: params.approved ?? true,
72
+ check_number: null,
73
+ flag: params.flag_color ? FLAG_MAP[params.flag_color] : null,
74
+ transfer_account_id: null,
75
+ transfer_transaction_id: null,
76
+ transfer_subtransaction_id: null,
77
+ matched_transaction_id: null,
78
+ ynab_id: null,
79
+ // Import-related fields are only populated by bank-feed imports, not manual entry.
80
+ imported_payee: null,
81
+ imported_date: null,
82
+ original_imported_payee: null,
83
+ provider_cleansed_payee: null,
84
+ source: null,
85
+ debt_transaction_type: null,
86
+ },
87
+ be_subtransactions: null,
88
+ },
89
+ ];
90
+ const result = await syncWrite(planId, changedEntities, serverKnowledge);
91
+ const saved = result.changed_entities?.be_transactions?.find(t => t.id === txId);
51
92
  if (!saved) {
52
93
  throw ToolError.internal('Transaction was created but no data was returned');
53
94
  }
54
- return { transaction: mapTransaction(saved) };
95
+ return { transaction: mapTransaction(saved, lookups) };
55
96
  },
56
97
  });
57
98
  //# sourceMappingURL=create-transaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-transaction.js","sourceRoot":"","sources":["../../src/tools/create-transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-transaction.js","sourceRoot":"","sources":["../../src/tools/create-transaction.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/delete-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;kBA6B5B,CAAC"}
1
+ {"version":3,"file":"delete-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/delete-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;kBAqD5B,CAAC"}
@@ -1,10 +1,10 @@
1
- import { defineTool } from '@opentabs-dev/plugin-sdk';
1
+ import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { getPlanId, syncWrite } from '../ynab-api.js';
3
+ import { getPlanId, syncBudget, syncWrite } from '../ynab-api.js';
4
4
  export const deleteTransaction = defineTool({
5
5
  name: 'delete_transaction',
6
6
  displayName: 'Delete Transaction',
7
- description: 'Delete a transaction from the active YNAB plan. This marks the transaction as deleted (soft delete).',
7
+ description: 'Delete a transaction from the active YNAB plan. This marks the transaction as deleted (soft delete). Transfer transactions cannot be deleted through this tool — delete them directly in YNAB.',
8
8
  summary: 'Delete a transaction',
9
9
  icon: 'trash-2',
10
10
  group: 'Transactions',
@@ -17,15 +17,30 @@ export const deleteTransaction = defineTool({
17
17
  }),
18
18
  handle: async (params) => {
19
19
  const planId = getPlanId();
20
+ const budget = await syncBudget(planId);
21
+ const serverKnowledge = budget.current_server_knowledge ?? 0;
22
+ const existing = budget.changed_entities?.be_transactions?.find(t => t.id === params.transaction_id && !t.is_tombstone);
23
+ if (!existing) {
24
+ throw ToolError.notFound(`Transaction not found: ${params.transaction_id}`);
25
+ }
26
+ if (existing.transfer_account_id) {
27
+ throw ToolError.validation('Cannot delete transfer transactions — delete them in YNAB directly.');
28
+ }
29
+ // YNAB rejects minimal payloads here with 400 — the full transaction shape
30
+ // is required even for tombstoning. Verified by capturing the YNAB UI's
31
+ // own delete request and reproducing the failure with a partial payload.
20
32
  await syncWrite(planId, {
21
- be_transactions: [
33
+ be_transaction_groups: [
22
34
  {
23
35
  id: params.transaction_id,
24
- entities_account_id: params.account_id,
25
- is_tombstone: true,
36
+ be_transaction: {
37
+ ...existing,
38
+ is_tombstone: true,
39
+ },
40
+ be_subtransactions: null,
26
41
  },
27
42
  ],
28
- });
43
+ }, serverKnowledge);
29
44
  return { success: true };
30
45
  },
31
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"delete-transaction.js","sourceRoot":"","sources":["../../src/tools/delete-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,sGAAsG;IACnH,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAChF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,SAAS,CAAC,MAAM,EAAE;YACtB,eAAe,EAAE;gBACf;oBACE,EAAE,EAAE,MAAM,CAAC,cAAc;oBACzB,mBAAmB,EAAE,MAAM,CAAC,UAAU;oBACtC,YAAY,EAAE,IAAI;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"delete-transaction.js","sourceRoot":"","sources":["../../src/tools/delete-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGlE,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oBAAoB;IACjC,WAAW,EACT,gMAAgM;IAClM,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAChF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,eAAe,EAAE,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CACvD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,QAAQ,CAAC,0BAA0B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,UAAU,CAAC,qEAAqE,CAAC,CAAC;QACpG,CAAC;QAED,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,MAAM,SAAS,CACb,MAAM,EACN;YACE,qBAAqB,EAAE;gBACrB;oBACE,EAAE,EAAE,MAAM,CAAC,cAAc;oBACzB,cAAc,EAAE;wBACd,GAAG,QAAQ;wBACX,YAAY,EAAE,IAAI;qBACnB;oBACD,kBAAkB,EAAE,IAAI;iBACzB;aACF;SACF,EACD,eAAe,CAChB,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-account.d.ts","sourceRoot":"","sources":["../../src/tools/get-account.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;kBA6BrB,CAAC"}
1
+ {"version":3,"file":"get-account.d.ts","sourceRoot":"","sources":["../../src/tools/get-account.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;kBA6BrB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { syncBudget, getPlanId } from '../ynab-api.js';
4
- import { accountSchema, mapAccount } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { accountSchema, buildAccountCalcMap, mapAccount } from './schemas.js';
5
5
  export const getAccount = defineTool({
6
6
  name: 'get_account',
7
7
  displayName: 'Get Account',
@@ -20,7 +20,7 @@ export const getAccount = defineTool({
20
20
  const result = await syncBudget(planId);
21
21
  const entities = result.changed_entities;
22
22
  const raw = entities?.be_accounts ?? [];
23
- const calcMap = new Map((entities?.be_account_calculations ?? []).map(c => [c.entities_account_id, c]));
23
+ const calcMap = buildAccountCalcMap(entities ?? {});
24
24
  const account = raw.find(a => a.id === params.account_id && !a.is_tombstone);
25
25
  if (!account) {
26
26
  throw ToolError.notFound(`Account not found: ${params.account_id}`);
@@ -1 +1 @@
1
- {"version":3,"file":"get-account.js","sourceRoot":"","sources":["../../src/tools/get-account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAOzD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,2HAA2H;IAC7H,OAAO,EAAE,2BAA2B;IACpC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa;KACvB,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,MAAM,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAExG,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,CAAC,QAAQ,CAAC,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"get-account.js","sourceRoot":"","sources":["../../src/tools/get-account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9E,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,2HAA2H;IAC7H,OAAO,EAAE,2BAA2B;IACpC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa;KACvB,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,CAAC,QAAQ,CAAC,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;CACF,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export declare const getMonth: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
3
  month: z.ZodString;
4
+ include_hidden: z.ZodOptional<z.ZodBoolean>;
4
5
  }, z.core.$strip>, z.ZodObject<{
5
6
  month: z.ZodObject<{
6
7
  month: z.ZodString;
@@ -12,7 +13,7 @@ export declare const getMonth: import("@opentabs-dev/plugin-sdk").ToolDefinition
12
13
  budgeted_milliunits: z.ZodNumber;
13
14
  activity_milliunits: z.ZodNumber;
14
15
  to_be_budgeted_milliunits: z.ZodNumber;
15
- age_of_money: z.ZodNumber;
16
+ age_of_money: z.ZodNullable<z.ZodNumber>;
16
17
  }, z.core.$strip>;
17
18
  categories: z.ZodArray<z.ZodObject<{
18
19
  id: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"get-month.d.ts","sourceRoot":"","sources":["../../src/tools/get-month.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoEnB,CAAC"}
1
+ {"version":3,"file":"get-month.d.ts","sourceRoot":"","sources":["../../src/tools/get-month.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4CnB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { syncBudget, getPlanId } from '../ynab-api.js';
4
- import { categorySchema, mapCategory, mapMonth, monthSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildMonthlyBudgetCalcMap, buildSubcategoryBudgetMap, buildSubcategoryCalcMap, categorySchema, mapCategoryForMonth, mapMonth, monthSchema, notTombstone, toMonthKey, } from './schemas.js';
5
5
  export const getMonth = defineTool({
6
6
  name: 'get_month',
7
7
  displayName: 'Get Month',
@@ -11,6 +11,7 @@ export const getMonth = defineTool({
11
11
  group: 'Months',
12
12
  input: z.object({
13
13
  month: z.string().min(1).describe('Month in YYYY-MM-DD format (first of month, e.g. 2026-03-01)'),
14
+ include_hidden: z.boolean().optional().describe('Include hidden categories (default false)'),
14
15
  }),
15
16
  output: z.object({
16
17
  month: monthSchema,
@@ -25,37 +26,13 @@ export const getMonth = defineTool({
25
26
  if (!monthData) {
26
27
  throw ToolError.notFound(`Month not found: ${params.month}`);
27
28
  }
28
- // Find the matching monthly budget calculation for aggregates
29
- const monthlyCalcs = entities?.be_monthly_budget_calculations ?? [];
30
- const monthCalc = monthlyCalcs.find(c => {
31
- const budgetId = c.entities_monthly_budget_id;
32
- return budgetId && budgetId.replace('mb/', '') === params.month;
33
- });
34
- const rawCategories = (entities?.be_subcategories ?? []).filter(c => !c.is_tombstone && c.is_hidden !== true);
35
- // Map subcategory budget calculations by category ID
36
- // entity_id format: mcbc/YYYY-MM/category-id
37
- const subcatCalcs = entities?.be_monthly_subcategory_budget_calculations ?? [];
38
- const calcMap = new Map();
39
- for (const calc of subcatCalcs) {
40
- const entityId = calc.entities_monthly_subcategory_budget_id;
41
- if (entityId) {
42
- const parts = entityId.split('/');
43
- const categoryId = parts.length >= 3 ? parts.slice(2).join('/') : entityId;
44
- calcMap.set(categoryId, calc);
45
- }
46
- }
47
- const categories = rawCategories.map(c => {
48
- const calc = calcMap.get(c.id ?? '');
49
- return mapCategory({
50
- ...c,
51
- budgeted: calc?.budgeted ?? c.budgeted,
52
- activity: calc?.activity ?? c.activity,
53
- balance: calc?.balance ?? c.balance,
54
- goal_type: calc?.goal_type ?? c.goal_type,
55
- goal_target: calc?.goal_target ?? c.goal_target,
56
- goal_percentage_complete: calc?.goal_percentage_complete ?? c.goal_percentage_complete,
57
- });
58
- });
29
+ const monthKey = toMonthKey(params.month);
30
+ const monthCalcMap = buildMonthlyBudgetCalcMap(entities?.be_monthly_budget_calculations ?? []);
31
+ const monthCalc = monthCalcMap.get(monthKey);
32
+ const rawCategories = (entities?.be_subcategories ?? []).filter(c => notTombstone(c) && (params.include_hidden || c.is_hidden !== true));
33
+ const budgetMap = buildSubcategoryBudgetMap(entities?.be_monthly_subcategory_budgets ?? []);
34
+ const calcMap = buildSubcategoryCalcMap(entities?.be_monthly_subcategory_budget_calculations ?? []);
35
+ const categories = rawCategories.map(c => mapCategoryForMonth(c, budgetMap, calcMap, monthKey));
59
36
  return {
60
37
  month: mapMonth(monthData, monthCalc),
61
38
  categories,
@@ -1 +1 @@
1
- {"version":3,"file":"get-month.js","sourceRoot":"","sources":["../../src/tools/get-month.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-month.js","sourceRoot":"","sources":["../../src/tools/get-month.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,WAAW;IACxB,WAAW,EACT,iPAAiP;IACnP,OAAO,EAAE,gCAAgC;IACzC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACjG,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;KAC7F,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,WAAW;QAClB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAChF,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,SAAS,GAAG,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAEnF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,SAAS,CAAC,QAAQ,CAAC,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,yBAAyB,CAAC,QAAQ,EAAE,8BAA8B,IAAI,EAAE,CAAC,CAAC;QAC/F,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7C,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAC7D,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CACxE,CAAC;QACF,MAAM,SAAS,GAAG,yBAAyB,CAAC,QAAQ,EAAE,8BAA8B,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,EAAE,0CAA0C,IAAI,EAAE,CAAC,CAAC;QACpG,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEhG,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;YACrC,UAAU;SACX,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-plan.d.ts","sourceRoot":"","sources":["../../src/tools/get-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,OAAO;;;;;;;;;kBAiBlB,CAAC"}
1
+ {"version":3,"file":"get-plan.d.ts","sourceRoot":"","sources":["../../src/tools/get-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,OAAO;;;;;;;;;kBAwBlB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { defineTool } from '@opentabs-dev/plugin-sdk';
1
+ import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { catalog, getPlanId } from '../ynab-api.js';
3
+ import { assertAuthenticated, catalog, getDeviceId } from '../ynab-api.js';
4
4
  import { mapPlan, planSchema } from './schemas.js';
5
5
  export const getPlan = defineTool({
6
6
  name: 'get_plan',
@@ -12,11 +12,18 @@ export const getPlan = defineTool({
12
12
  input: z.object({}),
13
13
  output: z.object({ plan: planSchema }),
14
14
  handle: async () => {
15
- const planId = getPlanId();
15
+ assertAuthenticated();
16
+ // getInitialUserData returns budget_version at the response root (not under
17
+ // changed_entities), so we read it via the CatalogResponse index signature
18
+ // and narrow it ourselves rather than retyping the whole response.
16
19
  const result = await catalog('getInitialUserData', {
17
- device_info: { id: planId, device_os: 'web' },
20
+ device_info: { id: getDeviceId(), device_os: 'web' },
18
21
  });
19
- return { plan: mapPlan(result.budget_version) };
22
+ const budgetVersion = result.budget_version;
23
+ if (!budgetVersion) {
24
+ throw ToolError.notFound('No active plan found');
25
+ }
26
+ return { plan: mapPlan(budgetVersion) };
20
27
  },
21
28
  });
22
29
  //# sourceMappingURL=get-plan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-plan.js","sourceRoot":"","sources":["../../src/tools/get-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,UAAU;IACvB,WAAW,EACT,sJAAsJ;IACxJ,OAAO,EAAE,6BAA6B;IACtC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAkB,oBAAoB,EAAE;YAClE,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9C,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,cAAyB,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"get-plan.js","sourceRoot":"","sources":["../../src/tools/get-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,UAAU;IACvB,WAAW,EACT,sJAAsJ;IACxJ,OAAO,EAAE,6BAA6B;IACtC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,mBAAmB,EAAE,CAAC;QACtB,4EAA4E;QAC5E,2EAA2E;QAC3E,mEAAmE;QACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE;YACjD,WAAW,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SACrD,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,cAAqC,CAAC;QACnE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;IAC1C,CAAC;CACF,CAAC,CAAC"}
@@ -11,7 +11,6 @@ export declare const getTransaction: import("@opentabs-dev/plugin-sdk").ToolDefi
11
11
  cleared: z.ZodString;
12
12
  approved: z.ZodBoolean;
13
13
  flag_color: z.ZodString;
14
- flag_name: z.ZodString;
15
14
  account_id: z.ZodString;
16
15
  account_name: z.ZodString;
17
16
  payee_id: z.ZodString;
@@ -19,7 +18,8 @@ export declare const getTransaction: import("@opentabs-dev/plugin-sdk").ToolDefi
19
18
  category_id: z.ZodString;
20
19
  category_name: z.ZodString;
21
20
  transfer_account_id: z.ZodString;
22
- import_id: z.ZodString;
21
+ imported_payee: z.ZodString;
22
+ original_imported_payee: z.ZodString;
23
23
  deleted: z.ZodBoolean;
24
24
  }, z.core.$strip>;
25
25
  subtransactions: z.ZodArray<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"get-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/get-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqCzB,CAAC"}
1
+ {"version":3,"file":"get-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/get-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsCzB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { syncBudget, getPlanId } from '../ynab-api.js';
4
- import { mapSubtransaction, mapTransaction, subtransactionSchema, transactionSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildLookups, mapSubtransaction, mapTransaction, subtransactionSchema, transactionSchema } from './schemas.js';
5
5
  export const getTransaction = defineTool({
6
6
  name: 'get_transaction',
7
7
  displayName: 'Get Transaction',
@@ -25,12 +25,13 @@ export const getTransaction = defineTool({
25
25
  if (!tx) {
26
26
  throw ToolError.notFound(`Transaction not found: ${params.transaction_id}`);
27
27
  }
28
+ const lookups = buildLookups(entities ?? {});
28
29
  const allSubs = entities?.be_subtransactions ?? [];
29
30
  const subtransactions = allSubs
30
31
  .filter(s => s.entities_transaction_id === params.transaction_id && !s.is_tombstone)
31
- .map(mapSubtransaction);
32
+ .map(s => mapSubtransaction(s, lookups));
32
33
  return {
33
- transaction: mapTransaction(tx),
34
+ transaction: mapTransaction(tx, lookups),
34
35
  subtransactions,
35
36
  };
36
37
  },
@@ -1 +1 @@
1
- {"version":3,"file":"get-transaction.js","sourceRoot":"","sources":["../../src/tools/get-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAO1G,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EACT,sHAAsH;IACxH,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACzE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACxG,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,MAAM,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAE5E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,SAAS,CAAC,QAAQ,CAAC,0BAA0B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACnD,MAAM,eAAe,GAAG,OAAO;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;aACnF,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE1B,OAAO;YACL,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/B,eAAe;SAChB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"get-transaction.js","sourceRoot":"","sources":["../../src/tools/get-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAExH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EACT,sHAAsH;IACxH,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACzE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACxG,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAE5E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,SAAS,CAAC,QAAQ,CAAC,0BAA0B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACnD,MAAM,eAAe,GAAG,OAAO;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;aACnF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAE3C,OAAO;YACL,WAAW,EAAE,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC;YACxC,eAAe;SAChB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-accounts.d.ts","sourceRoot":"","sources":["../../src/tools/list-accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;kBA8BvB,CAAC"}
1
+ {"version":3,"file":"list-accounts.d.ts","sourceRoot":"","sources":["../../src/tools/list-accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;kBA8BvB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { defineTool } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { syncBudget, getPlanId } from '../ynab-api.js';
4
- import { accountSchema, mapAccount } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { accountSchema, buildAccountCalcMap, mapAccount, notTombstone } from './schemas.js';
5
5
  export const listAccounts = defineTool({
6
6
  name: 'list_accounts',
7
7
  displayName: 'List Accounts',
@@ -20,8 +20,8 @@ export const listAccounts = defineTool({
20
20
  const result = await syncBudget(planId);
21
21
  const entities = result.changed_entities;
22
22
  const raw = entities?.be_accounts ?? [];
23
- const calcMap = new Map((entities?.be_account_calculations ?? []).map(c => [c.entities_account_id, c]));
24
- let accounts = raw.filter(a => !a.is_tombstone).map(a => mapAccount(a, calcMap.get(a.id)));
23
+ const calcMap = buildAccountCalcMap(entities ?? {});
24
+ let accounts = raw.filter(notTombstone).map(a => mapAccount(a, calcMap.get(a.id)));
25
25
  if (!params.include_closed) {
26
26
  accounts = accounts.filter(a => !a.closed);
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list-accounts.js","sourceRoot":"","sources":["../../src/tools/list-accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAOzD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EACT,yKAAyK;IAC3K,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC3F,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC9D,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,MAAM,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAExG,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"list-accounts.js","sourceRoot":"","sources":["../../src/tools/list-accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EACT,yKAAyK;IAC3K,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC3F,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC9D,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAEpD,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-categories.d.ts","sourceRoot":"","sources":["../../src/tools/list-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;kBA0DzB,CAAC"}
1
+ {"version":3,"file":"list-categories.d.ts","sourceRoot":"","sources":["../../src/tools/list-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;kBAoCzB,CAAC"}