@opentabs-dev/opentabs-plugin-ynab 0.0.85 → 0.0.87

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 (92) hide show
  1. package/dist/adapter.iife.js +1315 -545
  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 +23 -16
  6. package/dist/index.js.map +1 -1
  7. package/dist/tools/create-category-group.d.ts +11 -0
  8. package/dist/tools/create-category-group.d.ts.map +1 -0
  9. package/dist/tools/create-category-group.js +37 -0
  10. package/dist/tools/create-category-group.js.map +1 -0
  11. package/dist/tools/create-category.d.ts +59 -0
  12. package/dist/tools/create-category.d.ts.map +1 -0
  13. package/dist/tools/create-category.js +63 -0
  14. package/dist/tools/create-category.js.map +1 -0
  15. package/dist/tools/create-transaction.d.ts +2 -2
  16. package/dist/tools/create-transaction.d.ts.map +1 -1
  17. package/dist/tools/create-transaction.js +63 -22
  18. package/dist/tools/create-transaction.js.map +1 -1
  19. package/dist/tools/delete-category-group.d.ts +8 -0
  20. package/dist/tools/delete-category-group.d.ts.map +1 -0
  21. package/dist/tools/delete-category-group.js +33 -0
  22. package/dist/tools/delete-category-group.js.map +1 -0
  23. package/dist/tools/delete-category.d.ts +7 -0
  24. package/dist/tools/delete-category.d.ts.map +1 -0
  25. package/dist/tools/delete-category.js +28 -0
  26. package/dist/tools/delete-category.js.map +1 -0
  27. package/dist/tools/delete-transaction.d.ts.map +1 -1
  28. package/dist/tools/delete-transaction.js +22 -7
  29. package/dist/tools/delete-transaction.js.map +1 -1
  30. package/dist/tools/get-account.d.ts.map +1 -1
  31. package/dist/tools/get-account.js +3 -3
  32. package/dist/tools/get-account.js.map +1 -1
  33. package/dist/tools/get-month.d.ts +2 -1
  34. package/dist/tools/get-month.d.ts.map +1 -1
  35. package/dist/tools/get-month.js +10 -33
  36. package/dist/tools/get-month.js.map +1 -1
  37. package/dist/tools/get-plan.d.ts.map +1 -1
  38. package/dist/tools/get-plan.js +12 -5
  39. package/dist/tools/get-plan.js.map +1 -1
  40. package/dist/tools/get-transaction.d.ts +2 -2
  41. package/dist/tools/get-transaction.d.ts.map +1 -1
  42. package/dist/tools/get-transaction.js +5 -4
  43. package/dist/tools/get-transaction.js.map +1 -1
  44. package/dist/tools/list-accounts.d.ts.map +1 -1
  45. package/dist/tools/list-accounts.js +4 -4
  46. package/dist/tools/list-accounts.js.map +1 -1
  47. package/dist/tools/list-categories.d.ts.map +1 -1
  48. package/dist/tools/list-categories.js +9 -29
  49. package/dist/tools/list-categories.js.map +1 -1
  50. package/dist/tools/list-months.d.ts +1 -1
  51. package/dist/tools/list-months.d.ts.map +1 -1
  52. package/dist/tools/list-months.js +5 -14
  53. package/dist/tools/list-months.js.map +1 -1
  54. package/dist/tools/list-payees.d.ts.map +1 -1
  55. package/dist/tools/list-payees.js +3 -3
  56. package/dist/tools/list-payees.js.map +1 -1
  57. package/dist/tools/list-scheduled-transactions.d.ts.map +1 -1
  58. package/dist/tools/list-scheduled-transactions.js +7 -5
  59. package/dist/tools/list-scheduled-transactions.js.map +1 -1
  60. package/dist/tools/list-transactions.d.ts +4 -2
  61. package/dist/tools/list-transactions.d.ts.map +1 -1
  62. package/dist/tools/list-transactions.js +40 -8
  63. package/dist/tools/list-transactions.js.map +1 -1
  64. package/dist/tools/move-category-budget.d.ts +24 -0
  65. package/dist/tools/move-category-budget.d.ts.map +1 -0
  66. package/dist/tools/move-category-budget.js +100 -0
  67. package/dist/tools/move-category-budget.js.map +1 -0
  68. package/dist/tools/schemas.d.ts +185 -28
  69. package/dist/tools/schemas.d.ts.map +1 -1
  70. package/dist/tools/schemas.js +411 -28
  71. package/dist/tools/schemas.js.map +1 -1
  72. package/dist/tools/snooze-category-goal.d.ts +10 -0
  73. package/dist/tools/snooze-category-goal.d.ts.map +1 -0
  74. package/dist/tools/snooze-category-goal.js +53 -0
  75. package/dist/tools/snooze-category-goal.js.map +1 -0
  76. package/dist/tools/update-category-budget.d.ts.map +1 -1
  77. package/dist/tools/update-category-budget.js +51 -26
  78. package/dist/tools/update-category-budget.js.map +1 -1
  79. package/dist/tools/update-category.d.ts +61 -0
  80. package/dist/tools/update-category.d.ts.map +1 -0
  81. package/dist/tools/update-category.js +46 -0
  82. package/dist/tools/update-category.js.map +1 -0
  83. package/dist/tools/update-transaction.d.ts +3 -2
  84. package/dist/tools/update-transaction.d.ts.map +1 -1
  85. package/dist/tools/update-transaction.js +84 -31
  86. package/dist/tools/update-transaction.js.map +1 -1
  87. package/dist/tools.json +965 -43
  88. package/dist/ynab-api.d.ts +4 -1
  89. package/dist/ynab-api.d.ts.map +1 -1
  90. package/dist/ynab-api.js +47 -26
  91. package/dist/ynab-api.js.map +1 -1
  92. package/package.json +3 -3
@@ -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"}
@@ -1,11 +1,11 @@
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 { categoryGroupSchema, categorySchema, mapCategory, mapCategoryGroup } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildSubcategoryBudgetMap, buildSubcategoryCalcMap, categoryGroupSchema, categorySchema, currentMonthKey, mapCategoryForMonth, mapCategoryGroup, notTombstone, } from './schemas.js';
5
5
  export const listCategories = defineTool({
6
6
  name: 'list_categories',
7
7
  displayName: 'List Categories',
8
- description: 'List all category groups and categories in the active YNAB plan. Returns budgeted amounts, activity, and available balances for the current month. Excludes hidden and deleted categories by default.',
8
+ description: 'List category groups and categories in the active YNAB plan. Returns budgeted amounts, activity, and available balances for the current month. Hidden and deleted categories are excluded by default — pass include_hidden=true to also see hidden categories (useful for editing budgets on hidden categories).',
9
9
  summary: 'List budget categories with balances',
10
10
  icon: 'tags',
11
11
  group: 'Categories',
@@ -20,33 +20,13 @@ export const listCategories = defineTool({
20
20
  const planId = getPlanId();
21
21
  const result = await syncBudget(planId);
22
22
  const entities = result.changed_entities;
23
- const rawGroups = (entities?.be_master_categories ?? []).filter(g => !g.is_tombstone);
24
- const rawCategories = (entities?.be_subcategories ?? []).filter(c => !c.is_tombstone);
25
- // Merge monthly subcategory budget calculations into categories
26
- // entity_id format: mcbc/YYYY-MM/category-id extract category-id suffix
27
- const calcs = entities?.be_monthly_subcategory_budget_calculations ?? [];
28
- const calcMap = new Map();
29
- for (const calc of calcs) {
30
- const entityId = calc.entities_monthly_subcategory_budget_id;
31
- if (entityId) {
32
- const parts = entityId.split('/');
33
- const categoryId = parts.length >= 3 ? parts.slice(2).join('/') : entityId;
34
- calcMap.set(categoryId, calc);
35
- }
36
- }
23
+ const rawGroups = (entities?.be_master_categories ?? []).filter(notTombstone);
24
+ const rawCategories = (entities?.be_subcategories ?? []).filter(notTombstone);
25
+ const budgetMap = buildSubcategoryBudgetMap(entities?.be_monthly_subcategory_budgets ?? []);
26
+ const calcMap = buildSubcategoryCalcMap(entities?.be_monthly_subcategory_budget_calculations ?? []);
27
+ const currentMonth = currentMonthKey();
37
28
  let groups = rawGroups.map(mapCategoryGroup);
38
- let categories = rawCategories.map(c => {
39
- const calc = calcMap.get(c.id ?? '');
40
- return mapCategory({
41
- ...c,
42
- budgeted: calc?.budgeted ?? c.budgeted,
43
- activity: calc?.activity ?? c.activity,
44
- balance: calc?.balance ?? c.balance,
45
- goal_type: calc?.goal_type ?? c.goal_type,
46
- goal_target: calc?.goal_target ?? c.goal_target,
47
- goal_percentage_complete: calc?.goal_percentage_complete ?? c.goal_percentage_complete,
48
- });
49
- });
29
+ let categories = rawCategories.map(c => mapCategoryForMonth(c, budgetMap, calcMap, currentMonth));
50
30
  if (!params.include_hidden) {
51
31
  groups = groups.filter(g => !g.hidden);
52
32
  categories = categories.filter(c => !c.hidden);
@@ -1 +1 @@
1
- {"version":3,"file":"list-categories.js","sourceRoot":"","sources":["../../src/tools/list-categories.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list-categories.js","sourceRoot":"","sources":["../../src/tools/list-categories.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,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EACT,kTAAkT;IACpT,OAAO,EAAE,sCAAsC;IAC/C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;KAC7F,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC5E,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,CAAC,QAAQ,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9E,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9E,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,YAAY,GAAG,eAAe,EAAE,CAAC;QAEvC,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7C,IAAI,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QAElG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACvC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
@@ -10,7 +10,7 @@ export declare const listMonths: import("@opentabs-dev/plugin-sdk").ToolDefiniti
10
10
  budgeted_milliunits: z.ZodNumber;
11
11
  activity_milliunits: z.ZodNumber;
12
12
  to_be_budgeted_milliunits: z.ZodNumber;
13
- age_of_money: z.ZodNumber;
13
+ age_of_money: z.ZodNullable<z.ZodNumber>;
14
14
  }, z.core.$strip>>;
15
15
  }, z.core.$strip>>;
16
16
  //# sourceMappingURL=list-months.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-months.d.ts","sourceRoot":"","sources":["../../src/tools/list-months.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;kBAqCrB,CAAC"}
1
+ {"version":3,"file":"list-months.d.ts","sourceRoot":"","sources":["../../src/tools/list-months.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;kBA2BrB,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 { mapMonth, monthSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildMonthlyBudgetCalcMap, mapMonth, monthSchema, notTombstone } from './schemas.js';
5
5
  export const listMonths = defineTool({
6
6
  name: 'list_months',
7
7
  displayName: 'List Months',
@@ -18,19 +18,10 @@ export const listMonths = defineTool({
18
18
  const result = await syncBudget(planId);
19
19
  const entities = result.changed_entities;
20
20
  const rawMonths = entities?.be_monthly_budgets ?? [];
21
- const rawCalcs = entities?.be_monthly_budget_calculations ?? [];
22
- // Map calculation data by month (entities_monthly_budget_id format: mb/YYYY-MM-DD)
23
- const calcMap = new Map();
24
- for (const calc of rawCalcs) {
25
- const budgetId = calc.entities_monthly_budget_id;
26
- if (budgetId) {
27
- const month = budgetId.replace('mb/', '');
28
- calcMap.set(month, calc);
29
- }
30
- }
21
+ const calcMap = buildMonthlyBudgetCalcMap(entities?.be_monthly_budget_calculations ?? []);
31
22
  const months = rawMonths
32
- .filter(m => !m.is_tombstone)
33
- .map(m => mapMonth(m, calcMap.get(m.month ?? '')))
23
+ .filter(notTombstone)
24
+ .map(m => mapMonth(m, calcMap.get((m.month ?? '').substring(0, 7))))
34
25
  .sort((a, b) => b.month.localeCompare(a.month));
35
26
  return { months };
36
27
  },
@@ -1 +1 @@
1
- {"version":3,"file":"list-months.js","sourceRoot":"","sources":["../../src/tools/list-months.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,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAOrD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,oKAAoK;IACtK,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC/D,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,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,SAAS,GAAG,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,QAAQ,EAAE,8BAA8B,IAAI,EAAE,CAAC;QAEhE,mFAAmF;QACnF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,0BAA0B,CAAC;YACjD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAElD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"list-months.js","sourceRoot":"","sources":["../../src/tools/list-months.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,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9F,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,oKAAoK;IACtK,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC/D,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,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,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,8BAA8B,IAAI,EAAE,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,SAAS;aACrB,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAElD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-payees.d.ts","sourceRoot":"","sources":["../../src/tools/list-payees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,UAAU;;;;;;kBAqBrB,CAAC"}
1
+ {"version":3,"file":"list-payees.d.ts","sourceRoot":"","sources":["../../src/tools/list-payees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,UAAU;;;;;;kBAqBrB,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 { mapPayee, payeeSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { mapPayee, notTombstone, payeeSchema } from './schemas.js';
5
5
  export const listPayees = defineTool({
6
6
  name: 'list_payees',
7
7
  displayName: 'List Payees',
@@ -17,7 +17,7 @@ export const listPayees = defineTool({
17
17
  const planId = getPlanId();
18
18
  const result = await syncBudget(planId);
19
19
  const raw = result.changed_entities?.be_payees ?? [];
20
- const payees = raw.filter(p => !p.is_tombstone).map(mapPayee);
20
+ const payees = raw.filter(notTombstone).map(mapPayee);
21
21
  return { payees };
22
22
  },
23
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"list-payees.js","sourceRoot":"","sources":["../../src/tools/list-payees.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,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMrD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,+HAA+H;IACjI,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KACxD,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9D,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"list-payees.js","sourceRoot":"","sources":["../../src/tools/list-payees.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,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,WAAW,EACT,+HAA+H;IACjI,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KACxD,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QAExD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-scheduled-transactions.d.ts","sourceRoot":"","sources":["../../src/tools/list-scheduled-transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;kBAyBpC,CAAC"}
1
+ {"version":3,"file":"list-scheduled-transactions.d.ts","sourceRoot":"","sources":["../../src/tools/list-scheduled-transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;kBA2BpC,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 { mapScheduledTransaction, scheduledTransactionSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildLookups, mapScheduledTransaction, notTombstone, scheduledTransactionSchema } from './schemas.js';
5
5
  export const listScheduledTransactions = defineTool({
6
6
  name: 'list_scheduled_transactions',
7
7
  displayName: 'List Scheduled Transactions',
@@ -16,10 +16,12 @@ export const listScheduledTransactions = defineTool({
16
16
  handle: async () => {
17
17
  const planId = getPlanId();
18
18
  const result = await syncBudget(planId);
19
- const raw = result.changed_entities?.be_scheduled_transactions ?? [];
19
+ const entities = result.changed_entities;
20
+ const raw = entities?.be_scheduled_transactions ?? [];
21
+ const lookups = buildLookups(entities ?? {});
20
22
  const scheduledTransactions = raw
21
- .filter(s => !s.is_tombstone)
22
- .map(mapScheduledTransaction)
23
+ .filter(notTombstone)
24
+ .map(s => mapScheduledTransaction(s, lookups))
23
25
  .sort((a, b) => a.date_next.localeCompare(b.date_next));
24
26
  return { scheduled_transactions: scheduledTransactions };
25
27
  },
@@ -1 +1 @@
1
- {"version":3,"file":"list-scheduled-transactions.js","sourceRoot":"","sources":["../../src/tools/list-scheduled-transactions.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,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAMnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;IAClD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EACT,qJAAqJ;IACvJ,OAAO,EAAE,uCAAuC;IAChD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACvG,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,yBAAyB,IAAI,EAAE,CAAC;QAErE,MAAM,qBAAqB,GAAG,GAAG;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;aAC5B,GAAG,CAAC,uBAAuB,CAAC;aAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAE1D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAC3D,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"list-scheduled-transactions.js","sourceRoot":"","sources":["../../src/tools/list-scheduled-transactions.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,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE/G,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;IAClD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EACT,qJAAqJ;IACvJ,OAAO,EAAE,uCAAuC;IAChD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACvG,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,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,yBAAyB,IAAI,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAE7C,MAAM,qBAAqB,GAAG,GAAG;aAC9B,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAE1D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAC3D,CAAC;CACF,CAAC,CAAC"}
@@ -2,6 +2,8 @@ import { z } from 'zod';
2
2
  export declare const listTransactions: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
3
  account_id: z.ZodOptional<z.ZodString>;
4
4
  since_date: z.ZodOptional<z.ZodString>;
5
+ until_date: z.ZodOptional<z.ZodString>;
6
+ payee_search: z.ZodOptional<z.ZodString>;
5
7
  }, z.core.$strip>, z.ZodObject<{
6
8
  transactions: z.ZodArray<z.ZodObject<{
7
9
  id: z.ZodString;
@@ -12,7 +14,6 @@ export declare const listTransactions: import("@opentabs-dev/plugin-sdk").ToolDe
12
14
  cleared: z.ZodString;
13
15
  approved: z.ZodBoolean;
14
16
  flag_color: z.ZodString;
15
- flag_name: z.ZodString;
16
17
  account_id: z.ZodString;
17
18
  account_name: z.ZodString;
18
19
  payee_id: z.ZodString;
@@ -20,7 +21,8 @@ export declare const listTransactions: import("@opentabs-dev/plugin-sdk").ToolDe
20
21
  category_id: z.ZodString;
21
22
  category_name: z.ZodString;
22
23
  transfer_account_id: z.ZodString;
23
- import_id: z.ZodString;
24
+ imported_payee: z.ZodString;
25
+ original_imported_payee: z.ZodString;
24
26
  deleted: z.ZodBoolean;
25
27
  }, z.core.$strip>>;
26
28
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"list-transactions.d.ts","sourceRoot":"","sources":["../../src/tools/list-transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;kBAwC3B,CAAC"}
1
+ {"version":3,"file":"list-transactions.d.ts","sourceRoot":"","sources":["../../src/tools/list-transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0E3B,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 { mapTransaction, transactionSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget } from '../ynab-api.js';
4
+ import { buildLookups, mapTransaction, notTombstone, transactionSchema } from './schemas.js';
5
5
  export const listTransactions = defineTool({
6
6
  name: 'list_transactions',
7
7
  displayName: 'List Transactions',
@@ -15,6 +15,14 @@ export const listTransactions = defineTool({
15
15
  .string()
16
16
  .optional()
17
17
  .describe('Only return transactions on or after this date (YYYY-MM-DD). Omit for all transactions.'),
18
+ until_date: z
19
+ .string()
20
+ .optional()
21
+ .describe('Only return transactions on or before this date (YYYY-MM-DD). Combine with since_date for a date range.'),
22
+ payee_search: z
23
+ .string()
24
+ .optional()
25
+ .describe('Case-insensitive substring match against payee_name, imported_payee, and original_imported_payee. Useful for finding all transactions for a merchant without knowing the exact payee ID.'),
18
26
  }),
19
27
  output: z.object({
20
28
  transactions: z.array(transactionSchema).describe('List of transactions'),
@@ -22,17 +30,41 @@ export const listTransactions = defineTool({
22
30
  handle: async (params) => {
23
31
  const planId = getPlanId();
24
32
  const result = await syncBudget(planId);
25
- const raw = result.changed_entities?.be_transactions ?? [];
26
- let transactions = raw.filter(t => !t.is_tombstone).map(mapTransaction);
33
+ const entities = result.changed_entities;
34
+ const raw = entities?.be_transactions ?? [];
35
+ const lookups = buildLookups(entities ?? {});
36
+ let filtered = raw.filter(notTombstone);
27
37
  if (params.account_id) {
28
- transactions = transactions.filter(t => t.account_id === params.account_id);
38
+ filtered = filtered.filter(t => t.entities_account_id === params.account_id);
29
39
  }
30
40
  if (params.since_date) {
31
41
  const sinceDate = params.since_date;
32
- transactions = transactions.filter(t => t.date >= sinceDate);
42
+ filtered = filtered.filter(t => (t.date ?? '') >= sinceDate);
43
+ }
44
+ if (params.until_date) {
45
+ const untilDate = params.until_date;
46
+ filtered = filtered.filter(t => (t.date ?? '') <= untilDate);
47
+ }
48
+ if (params.payee_search) {
49
+ const needle = params.payee_search.toLowerCase();
50
+ // Resolve which payee IDs match the search up front so we only do the
51
+ // string compare once per payee instead of once per transaction.
52
+ const matchingPayeeIds = new Set();
53
+ for (const [id, name] of lookups.payees) {
54
+ if (name.toLowerCase().includes(needle))
55
+ matchingPayeeIds.add(id);
56
+ }
57
+ filtered = filtered.filter(t => {
58
+ if (t.entities_payee_id && matchingPayeeIds.has(t.entities_payee_id))
59
+ return true;
60
+ if (t.imported_payee?.toLowerCase().includes(needle))
61
+ return true;
62
+ if (t.original_imported_payee?.toLowerCase().includes(needle))
63
+ return true;
64
+ return false;
65
+ });
33
66
  }
34
- // Sort by date descending
35
- transactions.sort((a, b) => b.date.localeCompare(a.date));
67
+ const transactions = filtered.map(t => mapTransaction(t, lookups)).sort((a, b) => b.date.localeCompare(a.date));
36
68
  return { transactions };
37
69
  },
38
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"list-transactions.js","sourceRoot":"","sources":["../../src/tools/list-transactions.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,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mBAAmB;IAChC,WAAW,EACT,wMAAwM;IAC1M,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAClG,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yFAAyF,CAAC;KACvG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC1E,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,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,eAAe,IAAI,EAAE,CAAC;QAE3D,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAExE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;YACpC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;QAC/D,CAAC;QAED,0BAA0B;QAC1B,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1D,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"list-transactions.js","sourceRoot":"","sources":["../../src/tools/list-transactions.ts"],"names":[],"mappings":"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"}