@opentabs-dev/opentabs-plugin-ynab 0.0.85 → 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.
- package/dist/adapter.iife.js +870 -523
- package/dist/adapter.iife.js.map +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -16
- package/dist/index.js.map +1 -1
- package/dist/tools/create-transaction.d.ts +2 -2
- package/dist/tools/create-transaction.d.ts.map +1 -1
- package/dist/tools/create-transaction.js +63 -22
- package/dist/tools/create-transaction.js.map +1 -1
- package/dist/tools/delete-transaction.d.ts.map +1 -1
- package/dist/tools/delete-transaction.js +22 -7
- package/dist/tools/delete-transaction.js.map +1 -1
- package/dist/tools/get-account.d.ts.map +1 -1
- package/dist/tools/get-account.js +3 -3
- package/dist/tools/get-account.js.map +1 -1
- package/dist/tools/get-month.d.ts +2 -1
- package/dist/tools/get-month.d.ts.map +1 -1
- package/dist/tools/get-month.js +10 -33
- package/dist/tools/get-month.js.map +1 -1
- package/dist/tools/get-plan.d.ts.map +1 -1
- package/dist/tools/get-plan.js +12 -5
- package/dist/tools/get-plan.js.map +1 -1
- package/dist/tools/get-transaction.d.ts +2 -2
- package/dist/tools/get-transaction.d.ts.map +1 -1
- package/dist/tools/get-transaction.js +5 -4
- package/dist/tools/get-transaction.js.map +1 -1
- package/dist/tools/list-accounts.d.ts.map +1 -1
- package/dist/tools/list-accounts.js +4 -4
- package/dist/tools/list-accounts.js.map +1 -1
- package/dist/tools/list-categories.d.ts.map +1 -1
- package/dist/tools/list-categories.js +9 -29
- package/dist/tools/list-categories.js.map +1 -1
- package/dist/tools/list-months.d.ts +1 -1
- package/dist/tools/list-months.d.ts.map +1 -1
- package/dist/tools/list-months.js +5 -14
- package/dist/tools/list-months.js.map +1 -1
- package/dist/tools/list-payees.d.ts.map +1 -1
- package/dist/tools/list-payees.js +3 -3
- package/dist/tools/list-payees.js.map +1 -1
- package/dist/tools/list-scheduled-transactions.d.ts.map +1 -1
- package/dist/tools/list-scheduled-transactions.js +7 -5
- package/dist/tools/list-scheduled-transactions.js.map +1 -1
- package/dist/tools/list-transactions.d.ts +4 -2
- package/dist/tools/list-transactions.d.ts.map +1 -1
- package/dist/tools/list-transactions.js +40 -8
- package/dist/tools/list-transactions.js.map +1 -1
- package/dist/tools/move-category-budget.d.ts +24 -0
- package/dist/tools/move-category-budget.d.ts.map +1 -0
- package/dist/tools/move-category-budget.js +105 -0
- package/dist/tools/move-category-budget.js.map +1 -0
- package/dist/tools/schemas.d.ts +105 -27
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +176 -27
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/update-category-budget.d.ts.map +1 -1
- package/dist/tools/update-category-budget.js +55 -27
- package/dist/tools/update-category-budget.js.map +1 -1
- package/dist/tools/update-transaction.d.ts +3 -2
- package/dist/tools/update-transaction.d.ts.map +1 -1
- package/dist/tools/update-transaction.js +84 -31
- package/dist/tools/update-transaction.js.map +1 -1
- package/dist/tools.json +192 -43
- package/dist/ynab-api.d.ts +4 -1
- package/dist/ynab-api.d.ts.map +1 -1
- package/dist/ynab-api.js +47 -26
- package/dist/ynab-api.js.map +1 -1
- 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)";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
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 {
|
|
3
|
-
|
|
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
|
-
|
|
6
|
+
import { getMonth } from './tools/get-month.js';
|
|
6
7
|
import { getPlan } from './tools/get-plan.js';
|
|
7
|
-
|
|
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 {
|
|
13
|
-
// Payees
|
|
11
|
+
import { listMonths } from './tools/list-months.js';
|
|
14
12
|
import { listPayees } from './tools/list-payees.js';
|
|
15
|
-
|
|
13
|
+
import { listScheduledTransactions } from './tools/list-scheduled-transactions.js';
|
|
16
14
|
import { listTransactions } from './tools/list-transactions.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
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 {
|
|
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":"
|
|
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
|
-
|
|
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;
|
|
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 =
|
|
31
|
+
const milliunits = toMilliunits(params.amount);
|
|
32
32
|
const txId = crypto.randomUUID();
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-transaction.js","sourceRoot":"","sources":["../../src/tools/create-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;AAElE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oBAAoB;IACjC,WAAW,EACT,2NAA2N;IAC7N,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACjF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACzE,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CACP,0GAA0G,CAC3G;QACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACzF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAChG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACxD,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACjH,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAC/F,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;KAC7G,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,iBAAiB;KAC/B,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GAA4B,EAAE,CAAC;QAEpD,IAAI,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3F,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,eAAe,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,eAAe,CAAC,qBAAqB,GAAG;YACtC;gBACE,EAAE,EAAE,IAAI;gBACR,cAAc,EAAE;oBACd,EAAE,EAAE,IAAI;oBACR,YAAY,EAAE,KAAK;oBACnB,mBAAmB,EAAE,MAAM,CAAC,UAAU;oBACtC,iBAAiB,EAAE,OAAO;oBAC1B,uBAAuB,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;oBACnD,iCAAiC,EAAE,IAAI;oBACvC,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,0BAA0B,EAAE,IAAI;oBAChC,MAAM,EAAE,UAAU;oBAClB,uEAAuE;oBACvE,oEAAoE;oBACpE,mEAAmE;oBACnE,kEAAkE;oBAClE,WAAW;oBACX,WAAW,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;oBAChB,sBAAsB,EAAE,CAAC;oBACzB,mCAAmC,EAAE,CAAC;oBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;oBACzB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,CAAC;oBACnD,qFAAqF;oBACrF,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;oBACjC,YAAY,EAAE,IAAI;oBAClB,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;oBAC5D,mBAAmB,EAAE,IAAI;oBACzB,uBAAuB,EAAE,IAAI;oBAC7B,0BAA0B,EAAE,IAAI;oBAChC,sBAAsB,EAAE,IAAI;oBAC5B,OAAO,EAAE,IAAI;oBACb,mFAAmF;oBACnF,cAAc,EAAE,IAAI;oBACpB,aAAa,EAAE,IAAI;oBACnB,uBAAuB,EAAE,IAAI;oBAC7B,uBAAuB,EAAE,IAAI;oBAC7B,MAAM,EAAE,IAAI;oBACZ,qBAAqB,EAAE,IAAI;iBAC5B;gBACD,kBAAkB,EAAE,IAAI;aACzB;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAiB,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QAEzF,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,SAAS,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
33
|
+
be_transaction_groups: [
|
|
22
34
|
{
|
|
23
35
|
id: params.transaction_id,
|
|
24
|
-
|
|
25
|
-
|
|
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;
|
|
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;
|
|
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 {
|
|
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 =
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/tools/get-month.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import {
|
|
4
|
-
import { categorySchema,
|
|
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
|
-
|
|
29
|
-
const
|
|
30
|
-
const monthCalc =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
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;
|
|
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"}
|
package/dist/tools/get-plan.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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:
|
|
20
|
+
device_info: { id: getDeviceId(), device_os: 'web' },
|
|
18
21
|
});
|
|
19
|
-
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
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,
|
|
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;
|
|
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 {
|
|
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 =
|
|
24
|
-
let accounts = raw.filter(
|
|
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,
|
|
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;
|
|
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"}
|