@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
|
@@ -1,7 +1,7 @@
|
|
|
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';
|
|
4
|
-
import { categorySchema,
|
|
3
|
+
import { getPlanId, getUserId, syncBudget, syncWrite } from '../ynab-api.js';
|
|
4
|
+
import { buildSubcategoryBudgetMap, buildSubcategoryCalcMap, categorySchema, formatMonthlyBudgetId, formatSubcategoryBudgetId, MONEY_MOVEMENT_SOURCE, mapCategoryForMonth, notTombstone, toMilliunits, toMonthKey, } from './schemas.js';
|
|
5
5
|
export const updateCategoryBudget = defineTool({
|
|
6
6
|
name: 'update_category_budget',
|
|
7
7
|
displayName: 'Update Category Budget',
|
|
@@ -11,7 +11,10 @@ export const updateCategoryBudget = defineTool({
|
|
|
11
11
|
group: 'Categories',
|
|
12
12
|
input: z.object({
|
|
13
13
|
category_id: z.string().min(1).describe('Category ID to budget'),
|
|
14
|
-
month: z
|
|
14
|
+
month: z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^\d{4}-\d{2}(-\d{2})?$/, 'Month must be YYYY-MM or YYYY-MM-DD')
|
|
17
|
+
.describe('Month in YYYY-MM format (e.g. 2026-03)'),
|
|
15
18
|
budgeted: z.number().describe('Amount to budget in currency units (e.g. 500 for $500)'),
|
|
16
19
|
}),
|
|
17
20
|
output: z.object({
|
|
@@ -19,32 +22,57 @@ export const updateCategoryBudget = defineTool({
|
|
|
19
22
|
}),
|
|
20
23
|
handle: async (params) => {
|
|
21
24
|
const planId = getPlanId();
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
const monthKey = params.month
|
|
25
|
-
const budgetId =
|
|
26
|
-
const monthlyBudgetId =
|
|
27
|
-
const
|
|
28
|
-
|
|
25
|
+
const userId = getUserId();
|
|
26
|
+
const milliunits = toMilliunits(params.budgeted);
|
|
27
|
+
const monthKey = toMonthKey(params.month);
|
|
28
|
+
const budgetId = formatSubcategoryBudgetId(monthKey, params.category_id);
|
|
29
|
+
const monthlyBudgetId = formatMonthlyBudgetId(monthKey, planId);
|
|
30
|
+
const budget = await syncBudget(planId);
|
|
31
|
+
const serverKnowledge = budget.current_server_knowledge ?? 0;
|
|
32
|
+
const category = (budget.changed_entities?.be_subcategories ?? []).find(c => c.id === params.category_id && notTombstone(c));
|
|
33
|
+
if (!category) {
|
|
34
|
+
throw ToolError.notFound(`Category not found: ${params.category_id}`);
|
|
35
|
+
}
|
|
36
|
+
const existingBudget = (budget.changed_entities?.be_monthly_subcategory_budgets ?? []).find(b => b.id === budgetId && notTombstone(b));
|
|
37
|
+
const delta = milliunits - (existingBudget?.budgeted ?? 0);
|
|
38
|
+
const budgetEntry = {
|
|
39
|
+
id: budgetId,
|
|
40
|
+
is_tombstone: false,
|
|
41
|
+
entities_monthly_budget_id: monthlyBudgetId,
|
|
42
|
+
entities_subcategory_id: params.category_id,
|
|
43
|
+
budgeted: milliunits,
|
|
44
|
+
};
|
|
45
|
+
const changedEntities = { be_monthly_subcategory_budgets: [budgetEntry] };
|
|
46
|
+
// YNAB tracks budget changes as money movements; without this the write
|
|
47
|
+
// is silently rejected (the budget value reverts on the next sync).
|
|
48
|
+
// Direction is encoded via from/to (always positive amount).
|
|
49
|
+
if (delta !== 0) {
|
|
50
|
+
changedEntities.be_money_movements = [
|
|
29
51
|
{
|
|
30
|
-
id:
|
|
31
|
-
entities_monthly_budget_id: monthlyBudgetId,
|
|
32
|
-
entities_subcategory_id: params.category_id,
|
|
33
|
-
budgeted: milliunits,
|
|
34
|
-
overspending_handling: 'AffectsBuffer',
|
|
52
|
+
id: crypto.randomUUID(),
|
|
35
53
|
is_tombstone: false,
|
|
54
|
+
to_entities_monthly_subcategory_budget_id: delta > 0 ? budgetId : null,
|
|
55
|
+
from_entities_monthly_subcategory_budget_id: delta < 0 ? budgetId : null,
|
|
56
|
+
entities_money_movement_group_id: null,
|
|
57
|
+
amount: Math.abs(delta),
|
|
58
|
+
performed_by_user_id: userId,
|
|
59
|
+
note: null,
|
|
60
|
+
source: MONEY_MOVEMENT_SOURCE.ASSIGN,
|
|
61
|
+
move_started_at: new Date().toISOString(),
|
|
62
|
+
move_accepted_at: null,
|
|
36
63
|
},
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
const result = await syncWrite(planId, changedEntities, serverKnowledge);
|
|
67
|
+
const calcMap = buildSubcategoryCalcMap(result.changed_entities?.be_monthly_subcategory_budget_calculations ?? []);
|
|
68
|
+
// Prefer the server's echoed values — if a concurrent update from another
|
|
69
|
+
// client merged in, that change shows up here. Fall back to our local entry
|
|
70
|
+
// if the server didn't echo (shouldn't happen in practice).
|
|
71
|
+
const budgetMap = buildSubcategoryBudgetMap(result.changed_entities?.be_monthly_subcategory_budgets ?? []);
|
|
72
|
+
const key = `${monthKey}/${params.category_id}`;
|
|
73
|
+
if (!budgetMap.has(key))
|
|
74
|
+
budgetMap.set(key, budgetEntry);
|
|
75
|
+
return { category: mapCategoryForMonth(category, budgetMap, calcMap, monthKey) };
|
|
48
76
|
},
|
|
49
77
|
});
|
|
50
78
|
//# sourceMappingURL=update-category-budget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-category-budget.js","sourceRoot":"","sources":["../../src/tools/update-category-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"update-category-budget.js","sourceRoot":"","sources":["../../src/tools/update-category-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
|
|
|
21
21
|
green: "green";
|
|
22
22
|
blue: "blue";
|
|
23
23
|
purple: "purple";
|
|
24
|
+
none: "none";
|
|
24
25
|
}>>;
|
|
25
26
|
}, z.core.$strip>, z.ZodObject<{
|
|
26
27
|
transaction: z.ZodObject<{
|
|
@@ -32,7 +33,6 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
|
|
|
32
33
|
cleared: z.ZodString;
|
|
33
34
|
approved: z.ZodBoolean;
|
|
34
35
|
flag_color: z.ZodString;
|
|
35
|
-
flag_name: z.ZodString;
|
|
36
36
|
account_id: z.ZodString;
|
|
37
37
|
account_name: z.ZodString;
|
|
38
38
|
payee_id: z.ZodString;
|
|
@@ -40,7 +40,8 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
|
|
|
40
40
|
category_id: z.ZodString;
|
|
41
41
|
category_name: z.ZodString;
|
|
42
42
|
transfer_account_id: z.ZodString;
|
|
43
|
-
|
|
43
|
+
imported_payee: z.ZodString;
|
|
44
|
+
original_imported_payee: z.ZodString;
|
|
44
45
|
deleted: z.ZodBoolean;
|
|
45
46
|
}, z.core.$strip>;
|
|
46
47
|
}, z.core.$strip>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"update-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+G5B,CAAC"}
|
|
@@ -1,11 +1,23 @@
|
|
|
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
|
+
const resolveFlag = (requested, existing) => {
|
|
6
|
+
if (requested === 'none')
|
|
7
|
+
return null;
|
|
8
|
+
if (requested)
|
|
9
|
+
return FLAG_MAP[requested];
|
|
10
|
+
return existing ?? null;
|
|
11
|
+
};
|
|
12
|
+
const resolveCleared = (requested, existing) => {
|
|
13
|
+
if (requested)
|
|
14
|
+
return CLEARED_MAP[requested];
|
|
15
|
+
return existing ?? 'Uncleared';
|
|
16
|
+
};
|
|
5
17
|
export const updateTransaction = defineTool({
|
|
6
18
|
name: 'update_transaction',
|
|
7
19
|
displayName: 'Update Transaction',
|
|
8
|
-
description: 'Update an existing transaction in the active YNAB plan. Only specified fields are changed; omitted fields remain unchanged. Amount is in currency units (negative for expenses, positive for income).',
|
|
20
|
+
description: 'Update an existing transaction in the active YNAB plan. Only specified fields are changed; omitted fields remain unchanged. Amount is in currency units (negative for expenses, positive for income). Transfers and split transactions cannot be updated through this tool — edit them directly in YNAB.',
|
|
9
21
|
summary: 'Update a transaction',
|
|
10
22
|
icon: 'pencil',
|
|
11
23
|
group: 'Transactions',
|
|
@@ -20,43 +32,84 @@ export const updateTransaction = defineTool({
|
|
|
20
32
|
memo: z.string().optional().describe('New transaction memo'),
|
|
21
33
|
cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('New cleared status'),
|
|
22
34
|
approved: z.boolean().optional().describe('New approval status'),
|
|
23
|
-
flag_color: z
|
|
35
|
+
flag_color: z
|
|
36
|
+
.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'none'])
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('New flag color (pass "none" to clear)'),
|
|
24
39
|
}),
|
|
25
40
|
output: z.object({
|
|
26
41
|
transaction: transactionSchema,
|
|
27
42
|
}),
|
|
28
43
|
handle: async (params) => {
|
|
29
44
|
const planId = getPlanId();
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (params.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
45
|
+
const budget = await syncBudget(planId);
|
|
46
|
+
const serverKnowledge = budget.current_server_knowledge ?? 0;
|
|
47
|
+
const lookups = buildLookups(budget.changed_entities ?? {});
|
|
48
|
+
const existing = budget.changed_entities?.be_transactions?.find(t => t.id === params.transaction_id && !t.is_tombstone);
|
|
49
|
+
if (!existing) {
|
|
50
|
+
throw ToolError.notFound(`Transaction not found: ${params.transaction_id}`);
|
|
51
|
+
}
|
|
52
|
+
if (existing.transfer_account_id) {
|
|
53
|
+
throw ToolError.validation('Cannot update transfer transactions — edit them in YNAB directly.');
|
|
54
|
+
}
|
|
55
|
+
const hasSubtransactions = (budget.changed_entities?.be_subtransactions ?? []).some(s => s.entities_transaction_id === params.transaction_id && !s.is_tombstone);
|
|
56
|
+
if (hasSubtransactions) {
|
|
57
|
+
throw ToolError.validation('Cannot update split transactions — edit them in YNAB directly.');
|
|
58
|
+
}
|
|
59
|
+
const changedEntities = {};
|
|
60
|
+
let payeeId = params.payee_id ?? existing.entities_payee_id ?? null;
|
|
61
|
+
if (params.payee_name && !params.payee_id) {
|
|
62
|
+
const resolved = resolvePayee(budget.changed_entities?.be_payees ?? [], params.payee_name);
|
|
63
|
+
payeeId = resolved.payeeId;
|
|
64
|
+
if (resolved.newPayee) {
|
|
65
|
+
changedEntities.be_payees = [resolved.newPayee];
|
|
66
|
+
lookups.payees.set(resolved.payeeId, params.payee_name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
changedEntities.be_transaction_groups = [
|
|
70
|
+
{
|
|
71
|
+
id: params.transaction_id,
|
|
72
|
+
be_transaction: {
|
|
73
|
+
id: params.transaction_id,
|
|
74
|
+
is_tombstone: false,
|
|
75
|
+
entities_account_id: params.account_id,
|
|
76
|
+
entities_payee_id: payeeId,
|
|
77
|
+
entities_subcategory_id: params.category_id ?? existing.entities_subcategory_id ?? null,
|
|
78
|
+
entities_scheduled_transaction_id: existing.entities_scheduled_transaction_id ?? null,
|
|
79
|
+
date: params.date ?? existing.date ?? '',
|
|
80
|
+
date_entered_from_schedule: null,
|
|
81
|
+
amount: params.amount !== undefined ? toMilliunits(params.amount) : (existing.amount ?? 0),
|
|
82
|
+
cash_amount: 0,
|
|
83
|
+
credit_amount: 0,
|
|
84
|
+
credit_amount_adjusted: 0,
|
|
85
|
+
subcategory_credit_amount_preceding: 0,
|
|
86
|
+
memo: params.memo ?? existing.memo ?? null,
|
|
87
|
+
cleared: resolveCleared(params.cleared, existing.cleared),
|
|
88
|
+
// YNAB's wire format calls this "accepted"; the public tool surface uses "approved".
|
|
89
|
+
accepted: params.approved ?? existing.accepted ?? false,
|
|
90
|
+
check_number: null,
|
|
91
|
+
flag: resolveFlag(params.flag_color, existing.flag),
|
|
92
|
+
transfer_account_id: existing.transfer_account_id ?? null,
|
|
93
|
+
transfer_transaction_id: null,
|
|
94
|
+
transfer_subtransaction_id: null,
|
|
95
|
+
matched_transaction_id: null,
|
|
96
|
+
ynab_id: existing.ynab_id ?? null,
|
|
97
|
+
imported_payee: existing.imported_payee ?? null,
|
|
98
|
+
imported_date: null,
|
|
99
|
+
original_imported_payee: existing.original_imported_payee ?? null,
|
|
100
|
+
provider_cleansed_payee: null,
|
|
101
|
+
source: existing.source ?? null,
|
|
102
|
+
debt_transaction_type: null,
|
|
103
|
+
},
|
|
104
|
+
be_subtransactions: null,
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
const result = await syncWrite(planId, changedEntities, serverKnowledge);
|
|
108
|
+
const saved = result.changed_entities?.be_transactions?.find(t => t.id === params.transaction_id);
|
|
56
109
|
if (!saved) {
|
|
57
110
|
throw ToolError.internal('Transaction was updated but no data was returned');
|
|
58
111
|
}
|
|
59
|
-
return { transaction: mapTransaction(saved) };
|
|
112
|
+
return { transaction: mapTransaction(saved, lookups) };
|
|
60
113
|
},
|
|
61
114
|
});
|
|
62
115
|
//# sourceMappingURL=update-transaction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-transaction.js","sourceRoot":"","sources":["../../src/tools/update-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":"update-transaction.js","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"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"}
|