@dizzlkheinz/ynab-mcpb 0.18.3 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +87 -8
- package/bin/ynab-mcp-server.cjs +2 -2
- package/bin/ynab-mcp-server.js +3 -3
- package/biome.json +39 -0
- package/dist/bundle/index.cjs +67 -67
- package/dist/index.d.ts +1 -1
- package/dist/index.js +27 -27
- package/dist/server/YNABMCPServer.d.ts +3 -4
- package/dist/server/YNABMCPServer.js +111 -116
- package/dist/server/budgetResolver.d.ts +6 -5
- package/dist/server/budgetResolver.js +46 -36
- package/dist/server/cacheKeys.js +6 -6
- package/dist/server/cacheManager.js +14 -11
- package/dist/server/completions.d.ts +2 -2
- package/dist/server/completions.js +20 -15
- package/dist/server/config.d.ts +10 -5
- package/dist/server/config.js +24 -7
- package/dist/server/deltaCache.d.ts +2 -2
- package/dist/server/deltaCache.js +22 -16
- package/dist/server/deltaCache.merge.d.ts +2 -2
- package/dist/server/diagnostics.d.ts +4 -4
- package/dist/server/diagnostics.js +38 -32
- package/dist/server/errorHandler.d.ts +5 -12
- package/dist/server/errorHandler.js +219 -217
- package/dist/server/prompts.d.ts +2 -2
- package/dist/server/prompts.js +45 -45
- package/dist/server/rateLimiter.js +4 -4
- package/dist/server/requestLogger.d.ts +1 -1
- package/dist/server/requestLogger.js +40 -35
- package/dist/server/resources.d.ts +3 -3
- package/dist/server/resources.js +55 -52
- package/dist/server/responseFormatter.js +6 -6
- package/dist/server/securityMiddleware.d.ts +2 -2
- package/dist/server/securityMiddleware.js +22 -20
- package/dist/server/serverKnowledgeStore.js +1 -1
- package/dist/server/toolRegistry.d.ts +3 -3
- package/dist/server/toolRegistry.js +47 -40
- package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
- package/dist/tools/__tests__/deltaTestUtils.js +2 -2
- package/dist/tools/accountTools.d.ts +9 -8
- package/dist/tools/accountTools.js +47 -47
- package/dist/tools/adapters.d.ts +13 -8
- package/dist/tools/adapters.js +21 -11
- package/dist/tools/budgetTools.d.ts +8 -7
- package/dist/tools/budgetTools.js +22 -22
- package/dist/tools/categoryTools.d.ts +9 -8
- package/dist/tools/categoryTools.js +68 -59
- package/dist/tools/compareTransactions/formatter.d.ts +3 -3
- package/dist/tools/compareTransactions/formatter.js +9 -9
- package/dist/tools/compareTransactions/index.d.ts +6 -6
- package/dist/tools/compareTransactions/index.js +58 -43
- package/dist/tools/compareTransactions/matcher.d.ts +1 -1
- package/dist/tools/compareTransactions/matcher.js +28 -15
- package/dist/tools/compareTransactions/parser.d.ts +2 -2
- package/dist/tools/compareTransactions/parser.js +144 -138
- package/dist/tools/compareTransactions/types.d.ts +4 -4
- package/dist/tools/compareTransactions.d.ts +1 -1
- package/dist/tools/compareTransactions.js +1 -1
- package/dist/tools/deltaFetcher.d.ts +2 -2
- package/dist/tools/deltaFetcher.js +16 -15
- package/dist/tools/deltaSupport.d.ts +4 -4
- package/dist/tools/deltaSupport.js +35 -41
- package/dist/tools/exportTransactions.d.ts +5 -4
- package/dist/tools/exportTransactions.js +61 -59
- package/dist/tools/monthTools.d.ts +7 -6
- package/dist/tools/monthTools.js +31 -29
- package/dist/tools/payeeTools.d.ts +7 -6
- package/dist/tools/payeeTools.js +28 -28
- package/dist/tools/reconcileAdapter.d.ts +2 -2
- package/dist/tools/reconcileAdapter.js +21 -11
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +136 -57
- package/dist/tools/reconciliation/csvParser.d.ts +3 -3
- package/dist/tools/reconciliation/csvParser.js +128 -104
- package/dist/tools/reconciliation/executor.d.ts +4 -4
- package/dist/tools/reconciliation/executor.js +148 -109
- package/dist/tools/reconciliation/index.d.ts +10 -10
- package/dist/tools/reconciliation/index.js +96 -83
- package/dist/tools/reconciliation/matcher.d.ts +3 -3
- package/dist/tools/reconciliation/matcher.js +17 -16
- package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
- package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
- package/dist/tools/reconciliation/recommendationEngine.js +40 -40
- package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
- package/dist/tools/reconciliation/reportFormatter.js +79 -54
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +19 -16
- package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
- package/dist/tools/schemas/common.d.ts +1 -1
- package/dist/tools/schemas/common.js +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
- package/dist/tools/schemas/outputs/index.d.ts +14 -14
- package/dist/tools/schemas/outputs/index.js +14 -14
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
- package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
- package/dist/tools/schemas/shared/commonOutputs.js +15 -9
- package/dist/tools/transactionReadTools.d.ts +11 -0
- package/dist/tools/transactionReadTools.js +202 -0
- package/dist/tools/transactionSchemas.d.ts +309 -0
- package/dist/tools/transactionSchemas.js +235 -0
- package/dist/tools/transactionTools.d.ts +6 -302
- package/dist/tools/transactionTools.js +7 -2054
- package/dist/tools/transactionUtils.d.ts +31 -0
- package/dist/tools/transactionUtils.js +364 -0
- package/dist/tools/transactionWriteTools.d.ts +20 -0
- package/dist/tools/transactionWriteTools.js +1342 -0
- package/dist/tools/utilityTools.d.ts +5 -4
- package/dist/tools/utilityTools.js +11 -11
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +6 -6
- package/dist/types/reconciliation.d.ts +1 -1
- package/dist/types/toolRegistration.d.ts +14 -12
- package/dist/utils/amountUtils.js +1 -1
- package/dist/utils/dateUtils.js +4 -4
- package/dist/utils/errors.d.ts +3 -3
- package/dist/utils/errors.js +4 -4
- package/dist/utils/money.d.ts +2 -2
- package/dist/utils/money.js +8 -8
- package/dist/utils/validationError.d.ts +1 -1
- package/dist/utils/validationError.js +1 -1
- package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
- package/docs/assets/schemas/reconciliation-v2.json +360 -336
- package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
- package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
- package/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -109
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +205 -0
- package/scripts/run-domain-integration-tests.js +28 -18
- package/scripts/run-generate-mcpb.js +19 -17
- package/scripts/run-throttled-integration-tests.js +92 -83
- package/scripts/test-delta-params.mjs +149 -120
- package/scripts/test-recommendations.ts +36 -32
- package/scripts/tmpTransaction.ts +80 -43
- package/scripts/validate-env.js +98 -91
- package/scripts/verify-build.js +78 -76
- package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
- package/src/__tests__/performance.test.ts +723 -671
- package/src/__tests__/setup.ts +442 -395
- package/src/__tests__/smoke.e2e.test.ts +41 -39
- package/src/__tests__/testRunner.ts +314 -295
- package/src/__tests__/testUtils.ts +456 -364
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
- package/src/index.ts +68 -59
- package/src/server/CLAUDE.md +480 -0
- package/src/server/YNABMCPServer.ts +821 -794
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
- package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
- package/src/server/__tests__/budgetResolver.test.ts +466 -423
- package/src/server/__tests__/cacheManager.test.ts +891 -874
- package/src/server/__tests__/completions.integration.test.ts +115 -106
- package/src/server/__tests__/completions.test.ts +334 -313
- package/src/server/__tests__/config.test.ts +98 -86
- package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
- package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
- package/src/server/__tests__/deltaCache.test.ts +946 -759
- package/src/server/__tests__/diagnostics.test.ts +825 -792
- package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
- package/src/server/__tests__/errorHandler.test.ts +402 -397
- package/src/server/__tests__/prompts.test.ts +424 -347
- package/src/server/__tests__/rateLimiter.test.ts +313 -309
- package/src/server/__tests__/requestLogger.test.ts +443 -403
- package/src/server/__tests__/resources.template.test.ts +196 -185
- package/src/server/__tests__/resources.test.ts +294 -288
- package/src/server/__tests__/security.integration.test.ts +487 -421
- package/src/server/__tests__/securityMiddleware.test.ts +519 -444
- package/src/server/__tests__/server-startup.integration.test.ts +509 -490
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
- package/src/server/__tests__/toolRegistration.test.ts +239 -210
- package/src/server/__tests__/toolRegistry.test.ts +907 -845
- package/src/server/budgetResolver.ts +221 -181
- package/src/server/cacheKeys.ts +6 -6
- package/src/server/cacheManager.ts +498 -484
- package/src/server/completions.ts +267 -243
- package/src/server/config.ts +35 -14
- package/src/server/deltaCache.merge.ts +146 -128
- package/src/server/deltaCache.ts +352 -309
- package/src/server/diagnostics.ts +257 -242
- package/src/server/errorHandler.ts +747 -744
- package/src/server/prompts.ts +181 -176
- package/src/server/rateLimiter.ts +131 -129
- package/src/server/requestLogger.ts +350 -322
- package/src/server/resources.ts +442 -374
- package/src/server/responseFormatter.ts +41 -37
- package/src/server/securityMiddleware.ts +223 -205
- package/src/server/serverKnowledgeStore.ts +67 -67
- package/src/server/toolRegistry.ts +508 -474
- package/src/tools/CLAUDE.md +604 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
- package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
- package/src/tools/__tests__/accountTools.test.ts +685 -638
- package/src/tools/__tests__/adapters.test.ts +142 -108
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
- package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
- package/src/tools/__tests__/budgetTools.test.ts +442 -413
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
- package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
- package/src/tools/__tests__/categoryTools.test.ts +656 -625
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
- package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
- package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
- package/src/tools/__tests__/compareTransactions.test.ts +352 -332
- package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
- package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
- package/src/tools/__tests__/deltaSupport.test.ts +211 -184
- package/src/tools/__tests__/deltaTestUtils.ts +37 -33
- package/src/tools/__tests__/exportTransactions.test.ts +205 -200
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
- package/src/tools/__tests__/monthTools.test.ts +561 -512
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
- package/src/tools/__tests__/payeeTools.test.ts +486 -434
- package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
- package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
- package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
- package/src/tools/__tests__/utilityTools.test.ts +68 -58
- package/src/tools/accountTools.ts +293 -271
- package/src/tools/adapters.ts +120 -63
- package/src/tools/budgetTools.ts +121 -116
- package/src/tools/categoryTools.ts +379 -339
- package/src/tools/compareTransactions/formatter.ts +131 -119
- package/src/tools/compareTransactions/index.ts +249 -214
- package/src/tools/compareTransactions/matcher.ts +259 -209
- package/src/tools/compareTransactions/parser.ts +517 -487
- package/src/tools/compareTransactions/types.ts +38 -38
- package/src/tools/compareTransactions.ts +1 -1
- package/src/tools/deltaFetcher.ts +281 -260
- package/src/tools/deltaSupport.ts +264 -259
- package/src/tools/exportTransactions.ts +230 -218
- package/src/tools/monthTools.ts +180 -165
- package/src/tools/payeeTools.ts +152 -140
- package/src/tools/reconcileAdapter.ts +297 -246
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
- package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
- package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
- package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
- package/src/tools/reconciliation/analyzer.ts +582 -406
- package/src/tools/reconciliation/csvParser.ts +656 -609
- package/src/tools/reconciliation/executor.ts +1290 -1128
- package/src/tools/reconciliation/index.ts +580 -528
- package/src/tools/reconciliation/matcher.ts +256 -240
- package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
- package/src/tools/reconciliation/recommendationEngine.ts +357 -345
- package/src/tools/reconciliation/reportFormatter.ts +349 -276
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -153
- package/src/tools/reconciliation/ynabAdapter.ts +17 -15
- package/src/tools/schemas/CLAUDE.md +546 -0
- package/src/tools/schemas/common.ts +1 -1
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
- package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
- package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
- package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
- package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
- package/src/tools/schemas/outputs/index.ts +163 -163
- package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
- package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
- package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
- package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
- package/src/tools/schemas/shared/commonOutputs.ts +27 -19
- package/src/tools/toolCategories.ts +114 -114
- package/src/tools/transactionReadTools.ts +327 -0
- package/src/tools/transactionSchemas.ts +484 -0
- package/src/tools/transactionTools.ts +107 -2990
- package/src/tools/transactionUtils.ts +621 -0
- package/src/tools/transactionWriteTools.ts +2110 -0
- package/src/tools/utilityTools.ts +46 -41
- package/src/types/CLAUDE.md +477 -0
- package/src/types/__tests__/index.test.ts +51 -51
- package/src/types/index.ts +43 -39
- package/src/types/integration-tests.d.ts +26 -26
- package/src/types/reconciliation.ts +29 -29
- package/src/types/toolAnnotations.ts +30 -30
- package/src/types/toolRegistration.ts +43 -32
- package/src/utils/CLAUDE.md +508 -0
- package/src/utils/__tests__/dateUtils.test.ts +174 -168
- package/src/utils/__tests__/money.test.ts +193 -187
- package/src/utils/amountUtils.ts +5 -5
- package/src/utils/baseError.ts +5 -5
- package/src/utils/dateUtils.ts +29 -26
- package/src/utils/errors.ts +14 -14
- package/src/utils/money.ts +66 -52
- package/src/utils/validationError.ts +1 -1
- package/tsconfig.json +29 -29
- package/tsconfig.prod.json +16 -16
- package/vitest-reporters/split-json-reporter.ts +247 -204
- package/vitest.config.ts +99 -95
- package/.prettierignore +0 -10
- package/.prettierrc.json +0 -10
- package/eslint.config.js +0 -49
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
export const MoneyValueSchema = z.object({
|
|
3
3
|
amount: z.number().finite(),
|
|
4
4
|
currency: z.string(),
|
|
@@ -7,20 +7,20 @@ export const MoneyValueSchema = z.object({
|
|
|
7
7
|
});
|
|
8
8
|
export const IsoDateWithCalendarValidationSchema = z
|
|
9
9
|
.string()
|
|
10
|
-
.regex(/^\d{4}-\d{2}-\d{2}$/,
|
|
10
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
|
|
11
11
|
.refine((dateStr) => {
|
|
12
12
|
const parsed = Date.parse(dateStr);
|
|
13
|
-
if (isNaN(parsed)) {
|
|
13
|
+
if (Number.isNaN(parsed)) {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
16
|
const date = new Date(parsed);
|
|
17
17
|
const year = date.getUTCFullYear();
|
|
18
|
-
const month = String(date.getUTCMonth() + 1).padStart(2,
|
|
19
|
-
const day = String(date.getUTCDate()).padStart(2,
|
|
18
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
19
|
+
const day = String(date.getUTCDate()).padStart(2, "0");
|
|
20
20
|
const reconstructed = `${year}-${month}-${day}`;
|
|
21
21
|
return reconstructed === dateStr;
|
|
22
22
|
}, {
|
|
23
|
-
message:
|
|
23
|
+
message: "Invalid calendar date (e.g., month must be 01-12, day must be valid for the month)",
|
|
24
24
|
});
|
|
25
25
|
export const BankTransactionSchema = z.object({
|
|
26
26
|
id: z.string().uuid(),
|
|
@@ -37,7 +37,7 @@ export const YNABTransactionSimpleSchema = z.object({
|
|
|
37
37
|
amount: z.number(),
|
|
38
38
|
payee_name: z.string().nullable(),
|
|
39
39
|
category_name: z.string().nullable(),
|
|
40
|
-
cleared: z.enum([
|
|
40
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]),
|
|
41
41
|
approved: z.boolean(),
|
|
42
42
|
memo: z.string().nullable().optional(),
|
|
43
43
|
amount_money: MoneyValueSchema,
|
|
@@ -50,19 +50,19 @@ export const MatchCandidateSchema = z.object({
|
|
|
50
50
|
});
|
|
51
51
|
export function deriveConfidenceFromScore(score) {
|
|
52
52
|
if (score >= 90)
|
|
53
|
-
return
|
|
53
|
+
return "high";
|
|
54
54
|
if (score >= 60)
|
|
55
|
-
return
|
|
55
|
+
return "medium";
|
|
56
56
|
if (score >= 1)
|
|
57
|
-
return
|
|
58
|
-
return
|
|
57
|
+
return "low";
|
|
58
|
+
return "none";
|
|
59
59
|
}
|
|
60
60
|
export const TransactionMatchSchema = z
|
|
61
61
|
.object({
|
|
62
62
|
bank_transaction: BankTransactionSchema,
|
|
63
63
|
ynab_transaction: YNABTransactionSimpleSchema.optional(),
|
|
64
64
|
candidates: z.array(MatchCandidateSchema).optional(),
|
|
65
|
-
confidence: z.enum([
|
|
65
|
+
confidence: z.enum(["high", "medium", "low", "none"]),
|
|
66
66
|
confidence_score: z.number().min(0).max(100),
|
|
67
67
|
match_reason: z.string(),
|
|
68
68
|
top_confidence: z.number().optional(),
|
|
@@ -73,8 +73,8 @@ export const TransactionMatchSchema = z
|
|
|
73
73
|
const expectedConfidence = deriveConfidenceFromScore(data.confidence_score);
|
|
74
74
|
return data.confidence === expectedConfidence;
|
|
75
75
|
}, {
|
|
76
|
-
message:
|
|
77
|
-
path: [
|
|
76
|
+
message: "Confidence mismatch: confidence enum does not match confidence_score",
|
|
77
|
+
path: ["confidence"],
|
|
78
78
|
});
|
|
79
79
|
export const BalanceInfoSchema = z.object({
|
|
80
80
|
current_cleared: MoneyValueSchema,
|
|
@@ -99,17 +99,17 @@ export const ReconciliationSummarySchema = z.object({
|
|
|
99
99
|
});
|
|
100
100
|
export const ReconciliationInsightSchema = z.object({
|
|
101
101
|
id: z.string(),
|
|
102
|
-
type: z.enum([
|
|
103
|
-
severity: z.enum([
|
|
102
|
+
type: z.enum(["repeat_amount", "near_match", "anomaly"]),
|
|
103
|
+
severity: z.enum(["info", "warning", "critical"]),
|
|
104
104
|
title: z.string(),
|
|
105
105
|
description: z.string(),
|
|
106
106
|
evidence: z.record(z.string(), z.unknown()).optional(),
|
|
107
107
|
});
|
|
108
|
-
export const ActionableRecommendationSchema = z.discriminatedUnion(
|
|
108
|
+
export const ActionableRecommendationSchema = z.discriminatedUnion("action_type", [
|
|
109
109
|
z.object({
|
|
110
110
|
id: z.string(),
|
|
111
|
-
action_type: z.literal(
|
|
112
|
-
priority: z.enum([
|
|
111
|
+
action_type: z.literal("create_transaction"),
|
|
112
|
+
priority: z.enum(["high", "medium", "low"]),
|
|
113
113
|
confidence: z.number().min(0).max(1),
|
|
114
114
|
message: z.string(),
|
|
115
115
|
reason: z.string(),
|
|
@@ -123,15 +123,15 @@ export const ActionableRecommendationSchema = z.discriminatedUnion('action_type'
|
|
|
123
123
|
amount: z.number(),
|
|
124
124
|
payee_name: z.string(),
|
|
125
125
|
memo: z.string().optional(),
|
|
126
|
-
cleared: z.enum([
|
|
126
|
+
cleared: z.enum(["cleared", "uncleared"]),
|
|
127
127
|
approved: z.boolean(),
|
|
128
128
|
category_id: z.string().optional(),
|
|
129
129
|
}),
|
|
130
130
|
}),
|
|
131
131
|
z.object({
|
|
132
132
|
id: z.string(),
|
|
133
|
-
action_type: z.literal(
|
|
134
|
-
priority: z.enum([
|
|
133
|
+
action_type: z.literal("update_cleared"),
|
|
134
|
+
priority: z.enum(["high", "medium", "low"]),
|
|
135
135
|
confidence: z.number().min(0).max(1),
|
|
136
136
|
message: z.string(),
|
|
137
137
|
reason: z.string(),
|
|
@@ -141,13 +141,13 @@ export const ActionableRecommendationSchema = z.discriminatedUnion('action_type'
|
|
|
141
141
|
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
142
142
|
parameters: z.object({
|
|
143
143
|
transaction_id: z.string(),
|
|
144
|
-
cleared: z.enum([
|
|
144
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]),
|
|
145
145
|
}),
|
|
146
146
|
}),
|
|
147
147
|
z.object({
|
|
148
148
|
id: z.string(),
|
|
149
|
-
action_type: z.literal(
|
|
150
|
-
priority: z.enum([
|
|
149
|
+
action_type: z.literal("review_duplicate"),
|
|
150
|
+
priority: z.enum(["high", "medium", "low"]),
|
|
151
151
|
confidence: z.number().min(0).max(1),
|
|
152
152
|
message: z.string(),
|
|
153
153
|
reason: z.string(),
|
|
@@ -163,8 +163,8 @@ export const ActionableRecommendationSchema = z.discriminatedUnion('action_type'
|
|
|
163
163
|
}),
|
|
164
164
|
z.object({
|
|
165
165
|
id: z.string(),
|
|
166
|
-
action_type: z.literal(
|
|
167
|
-
priority: z.enum([
|
|
166
|
+
action_type: z.literal("manual_review"),
|
|
167
|
+
priority: z.enum(["high", "medium", "low"]),
|
|
168
168
|
confidence: z.number().min(0).max(1),
|
|
169
169
|
message: z.string(),
|
|
170
170
|
reason: z.string(),
|
|
@@ -189,7 +189,7 @@ export const CreatedTransactionSchema = z
|
|
|
189
189
|
date: z.string(),
|
|
190
190
|
amount: z.number(),
|
|
191
191
|
memo: z.string().nullable().optional(),
|
|
192
|
-
cleared: z.enum([
|
|
192
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
|
|
193
193
|
approved: z.boolean().optional(),
|
|
194
194
|
payee_name: z.string().nullable().optional(),
|
|
195
195
|
category_name: z.string().nullable().optional(),
|
|
@@ -202,36 +202,36 @@ export const TransactionCreationPayloadSchema = z.object({
|
|
|
202
202
|
amount: z.number(),
|
|
203
203
|
payee_name: z.string().optional(),
|
|
204
204
|
memo: z.string().optional(),
|
|
205
|
-
cleared: z.enum([
|
|
205
|
+
cleared: z.enum(["cleared", "uncleared"]).optional(),
|
|
206
206
|
approved: z.boolean().optional(),
|
|
207
207
|
import_id: z.string().optional(),
|
|
208
208
|
});
|
|
209
209
|
export const TransactionUpdatePayloadSchema = z.object({
|
|
210
210
|
transaction_id: z.string(),
|
|
211
211
|
new_date: z.string().optional(),
|
|
212
|
-
cleared: z.enum([
|
|
212
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
|
|
213
213
|
});
|
|
214
214
|
export const DuplicateDetectionPayloadSchema = z.object({
|
|
215
215
|
transaction_id: z.string().nullable(),
|
|
216
216
|
import_id: z.string().optional(),
|
|
217
217
|
});
|
|
218
|
-
export const ExecutionActionRecordSchema = z.discriminatedUnion(
|
|
218
|
+
export const ExecutionActionRecordSchema = z.discriminatedUnion("type", [
|
|
219
219
|
z.object({
|
|
220
|
-
type: z.literal(
|
|
220
|
+
type: z.literal("create_transaction"),
|
|
221
221
|
transaction: CreatedTransactionSchema.nullable(),
|
|
222
222
|
reason: z.string(),
|
|
223
223
|
bulk_chunk_index: z.number().optional(),
|
|
224
224
|
correlation_key: z.string().optional(),
|
|
225
225
|
}),
|
|
226
226
|
z.object({
|
|
227
|
-
type: z.literal(
|
|
227
|
+
type: z.literal("create_transaction_failed"),
|
|
228
228
|
transaction: TransactionCreationPayloadSchema,
|
|
229
229
|
reason: z.string(),
|
|
230
230
|
bulk_chunk_index: z.number().optional(),
|
|
231
231
|
correlation_key: z.string().optional(),
|
|
232
232
|
}),
|
|
233
233
|
z.object({
|
|
234
|
-
type: z.literal(
|
|
234
|
+
type: z.literal("create_transaction_duplicate"),
|
|
235
235
|
transaction: DuplicateDetectionPayloadSchema,
|
|
236
236
|
reason: z.string(),
|
|
237
237
|
bulk_chunk_index: z.number(),
|
|
@@ -239,7 +239,7 @@ export const ExecutionActionRecordSchema = z.discriminatedUnion('type', [
|
|
|
239
239
|
duplicate: z.literal(true),
|
|
240
240
|
}),
|
|
241
241
|
z.object({
|
|
242
|
-
type: z.literal(
|
|
242
|
+
type: z.literal("update_transaction"),
|
|
243
243
|
transaction: z.union([
|
|
244
244
|
CreatedTransactionSchema.nullable(),
|
|
245
245
|
TransactionUpdatePayloadSchema,
|
|
@@ -247,12 +247,12 @@ export const ExecutionActionRecordSchema = z.discriminatedUnion('type', [
|
|
|
247
247
|
reason: z.string(),
|
|
248
248
|
}),
|
|
249
249
|
z.object({
|
|
250
|
-
type: z.literal(
|
|
250
|
+
type: z.literal("balance_checkpoint"),
|
|
251
251
|
transaction: z.null(),
|
|
252
252
|
reason: z.string(),
|
|
253
253
|
}),
|
|
254
254
|
z.object({
|
|
255
|
-
type: z.literal(
|
|
255
|
+
type: z.literal("bulk_create_fallback"),
|
|
256
256
|
transaction: z.null(),
|
|
257
257
|
reason: z.string(),
|
|
258
258
|
bulk_chunk_index: z.number(),
|
|
@@ -281,7 +281,7 @@ export const BulkOperationDetailsSchema = z
|
|
|
281
281
|
sequential_attempts: z.number().optional(),
|
|
282
282
|
})
|
|
283
283
|
.refine((data) => data.failed_transactions === data.transaction_failures, {
|
|
284
|
-
message:
|
|
284
|
+
message: "failed_transactions must equal transaction_failures",
|
|
285
285
|
});
|
|
286
286
|
export const ExecutionResultSchema = z.object({
|
|
287
287
|
summary: ExecutionSummarySchema,
|
|
@@ -329,7 +329,7 @@ const StructuredReconciliationDataBaseSchema = z.object({
|
|
|
329
329
|
}),
|
|
330
330
|
summary: ReconciliationSummarySchema,
|
|
331
331
|
balance: BalanceInfoSchema.extend({
|
|
332
|
-
discrepancy_direction: z.enum([
|
|
332
|
+
discrepancy_direction: z.enum(["balanced", "ynab_higher", "bank_higher"]),
|
|
333
333
|
}),
|
|
334
334
|
insights: z.array(ReconciliationInsightSchema),
|
|
335
335
|
next_steps: z.array(z.string()),
|
|
@@ -357,21 +357,21 @@ export const ReconcileAccountOutputSchema = z
|
|
|
357
357
|
}),
|
|
358
358
|
])
|
|
359
359
|
.refine((data) => {
|
|
360
|
-
if (
|
|
360
|
+
if ("structured" in data && data.structured) {
|
|
361
361
|
const discrepancyAmount = data.structured.balance.discrepancy.amount;
|
|
362
362
|
const direction = data.structured.balance.discrepancy_direction;
|
|
363
363
|
if (Math.abs(discrepancyAmount) < 0.01) {
|
|
364
|
-
return direction ===
|
|
364
|
+
return direction === "balanced";
|
|
365
365
|
}
|
|
366
366
|
if (discrepancyAmount > 0) {
|
|
367
|
-
return direction ===
|
|
367
|
+
return direction === "ynab_higher";
|
|
368
368
|
}
|
|
369
369
|
if (discrepancyAmount < 0) {
|
|
370
|
-
return direction ===
|
|
370
|
+
return direction === "bank_higher";
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
373
|
return true;
|
|
374
374
|
}, {
|
|
375
|
-
message:
|
|
376
|
-
path: [
|
|
375
|
+
message: "Discrepancy direction mismatch: direction must match the numeric discrepancy amount",
|
|
376
|
+
path: ["balance", "discrepancy_direction"],
|
|
377
377
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AccountSchema } from "./accountOutputs.js";
|
|
3
|
+
import { CategorySchema } from "./categoryOutputs.js";
|
|
4
|
+
import { TransactionSchema } from "./transactionOutputs.js";
|
|
5
5
|
export const SubtransactionSchema = z.object({
|
|
6
6
|
id: z.string(),
|
|
7
7
|
transaction_id: z.string(),
|
|
@@ -50,7 +50,7 @@ export const BulkOperationSummarySchema = z.object({
|
|
|
50
50
|
export const BulkResultSchema = z
|
|
51
51
|
.object({
|
|
52
52
|
request_index: z.number(),
|
|
53
|
-
status: z.enum([
|
|
53
|
+
status: z.enum(["created", "duplicate", "updated", "failed"]),
|
|
54
54
|
transaction_id: z.string().optional(),
|
|
55
55
|
correlation_key: z.string(),
|
|
56
56
|
error_code: z.string().optional(),
|
|
@@ -67,13 +67,16 @@ export const TransactionDiffFieldsSchema = z.object({
|
|
|
67
67
|
payee_id: z.string().nullable().optional(),
|
|
68
68
|
payee_name: z.string().nullable().optional(),
|
|
69
69
|
category_id: z.string().nullable().optional(),
|
|
70
|
-
cleared: z.enum([
|
|
70
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
|
|
71
71
|
approved: z.boolean().optional(),
|
|
72
|
-
flag_color: z
|
|
72
|
+
flag_color: z
|
|
73
|
+
.enum(["red", "orange", "yellow", "green", "blue", "purple"])
|
|
74
|
+
.nullable()
|
|
75
|
+
.optional(),
|
|
73
76
|
});
|
|
74
77
|
export const DryRunPreviewItemSchema = z.object({
|
|
75
78
|
transaction_id: z.string(),
|
|
76
|
-
before: z.union([z.literal(
|
|
79
|
+
before: z.union([z.literal("unavailable"), TransactionDiffFieldsSchema]),
|
|
77
80
|
after: TransactionDiffFieldsSchema,
|
|
78
81
|
});
|
|
79
82
|
export const DryRunWarningSchema = z.object({
|
|
@@ -85,7 +88,7 @@ export const DryRunWarningSchema = z.object({
|
|
|
85
88
|
export const CreateTransactionOutputSchema = z.union([
|
|
86
89
|
z.object({
|
|
87
90
|
dry_run: z.literal(true),
|
|
88
|
-
action: z.literal(
|
|
91
|
+
action: z.literal("create_transaction"),
|
|
89
92
|
request: z.record(z.string(), z.unknown()),
|
|
90
93
|
}),
|
|
91
94
|
z.object({
|
|
@@ -107,8 +110,8 @@ export const CreateTransactionsOutputSchema = z.union([
|
|
|
107
110
|
z
|
|
108
111
|
.object({
|
|
109
112
|
dry_run: z.literal(true),
|
|
110
|
-
action: z.literal(
|
|
111
|
-
validation: z.literal(
|
|
113
|
+
action: z.literal("create_transactions"),
|
|
114
|
+
validation: z.literal("passed"),
|
|
112
115
|
summary: z.object({
|
|
113
116
|
total_transactions: z.number(),
|
|
114
117
|
total_amount: z.number(),
|
|
@@ -134,14 +137,14 @@ export const CreateTransactionsOutputSchema = z.union([
|
|
|
134
137
|
transactions: z.array(TransactionSchema).optional(),
|
|
135
138
|
duplicate_import_ids: z.array(z.string()).optional(),
|
|
136
139
|
message: z.string().optional(),
|
|
137
|
-
mode: z.enum([
|
|
140
|
+
mode: z.enum(["full", "summary", "ids_only"]).optional(),
|
|
138
141
|
})
|
|
139
142
|
.passthrough(),
|
|
140
143
|
]);
|
|
141
144
|
export const UpdateTransactionOutputSchema = z.union([
|
|
142
145
|
z.object({
|
|
143
146
|
dry_run: z.literal(true),
|
|
144
|
-
action: z.literal(
|
|
147
|
+
action: z.literal("update_transaction"),
|
|
145
148
|
request: z.record(z.string(), z.unknown()),
|
|
146
149
|
}),
|
|
147
150
|
z.object({
|
|
@@ -154,8 +157,8 @@ export const UpdateTransactionsOutputSchema = z.union([
|
|
|
154
157
|
z
|
|
155
158
|
.object({
|
|
156
159
|
dry_run: z.literal(true),
|
|
157
|
-
action: z.literal(
|
|
158
|
-
validation: z.literal(
|
|
160
|
+
action: z.literal("update_transactions"),
|
|
161
|
+
validation: z.literal("passed"),
|
|
159
162
|
summary: z.object({
|
|
160
163
|
total_transactions: z.number(),
|
|
161
164
|
accounts_affected: z.number(),
|
|
@@ -174,14 +177,14 @@ export const UpdateTransactionsOutputSchema = z.union([
|
|
|
174
177
|
results: z.array(BulkResultSchema),
|
|
175
178
|
transactions: z.array(TransactionSchema).optional(),
|
|
176
179
|
message: z.string().optional(),
|
|
177
|
-
mode: z.enum([
|
|
180
|
+
mode: z.enum(["full", "summary", "ids_only"]).optional(),
|
|
178
181
|
})
|
|
179
182
|
.passthrough(),
|
|
180
183
|
]);
|
|
181
184
|
export const DeleteTransactionOutputSchema = z.union([
|
|
182
185
|
z.object({
|
|
183
186
|
dry_run: z.literal(true),
|
|
184
|
-
action: z.literal(
|
|
187
|
+
action: z.literal("delete_transaction"),
|
|
185
188
|
request: z.record(z.string(), z.unknown()),
|
|
186
189
|
}),
|
|
187
190
|
z.object({
|
|
@@ -199,9 +202,12 @@ export const TransactionDryRunPreviewSchema = z.object({
|
|
|
199
202
|
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
|
|
200
203
|
amount: z.number(),
|
|
201
204
|
memo: z.string().optional().nullable(),
|
|
202
|
-
cleared: z.enum([
|
|
205
|
+
cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
|
|
203
206
|
approved: z.boolean().optional(),
|
|
204
|
-
flag_color: z
|
|
207
|
+
flag_color: z
|
|
208
|
+
.enum(["red", "orange", "yellow", "green", "blue", "purple"])
|
|
209
|
+
.optional()
|
|
210
|
+
.nullable(),
|
|
205
211
|
payee_id: z.string().optional().nullable(),
|
|
206
212
|
payee_name: z.string().optional().nullable(),
|
|
207
213
|
category_id: z.string().optional().nullable(),
|
|
@@ -215,7 +221,7 @@ export const SubtransactionPreviewSchema = SubtransactionSchema.omit({
|
|
|
215
221
|
export const CreateReceiptSplitTransactionOutputSchema = z.union([
|
|
216
222
|
z.object({
|
|
217
223
|
dry_run: z.literal(true),
|
|
218
|
-
action: z.literal(
|
|
224
|
+
action: z.literal("create_receipt_split_transaction"),
|
|
219
225
|
transaction_preview: TransactionDryRunPreviewSchema,
|
|
220
226
|
receipt_summary: ReceiptSummarySchema,
|
|
221
227
|
subtransactions: z.array(SubtransactionPreviewSchema),
|
|
@@ -234,7 +240,7 @@ export const CreateAccountDryRunRequestSchema = z.object({
|
|
|
234
240
|
export const CreateAccountOutputSchema = z.union([
|
|
235
241
|
z.object({
|
|
236
242
|
dry_run: z.literal(true),
|
|
237
|
-
action: z.literal(
|
|
243
|
+
action: z.literal("create_account"),
|
|
238
244
|
request: CreateAccountDryRunRequestSchema,
|
|
239
245
|
}),
|
|
240
246
|
z.object({
|
|
@@ -250,7 +256,7 @@ export const UpdateCategoryDryRunRequestSchema = z.object({
|
|
|
250
256
|
export const UpdateCategoryOutputSchema = z.union([
|
|
251
257
|
z.object({
|
|
252
258
|
dry_run: z.literal(true),
|
|
253
|
-
action: z.literal(
|
|
259
|
+
action: z.literal("update_category"),
|
|
254
260
|
request: UpdateCategoryDryRunRequestSchema,
|
|
255
261
|
}),
|
|
256
262
|
z.object({
|
|
@@ -1,49 +1,57 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { CacheMetadataSchema } from
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { CacheMetadataSchema } from "../shared/commonOutputs.js";
|
|
3
3
|
export const TransactionSchema = z.object({
|
|
4
|
-
id: z.string().describe(
|
|
5
|
-
date: z.string().describe(
|
|
6
|
-
amount: z.number().describe(
|
|
7
|
-
memo: z.string().optional().describe(
|
|
8
|
-
cleared: z.string().describe(
|
|
9
|
-
approved: z.boolean().describe(
|
|
10
|
-
flag_color: z.string().optional().describe(
|
|
11
|
-
account_id: z.string().describe(
|
|
12
|
-
payee_id: z.string().nullish().describe(
|
|
13
|
-
category_id: z.string().nullish().describe(
|
|
14
|
-
transfer_account_id: z.string().nullish().describe(
|
|
15
|
-
transfer_transaction_id: z
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
4
|
+
id: z.string().describe("Transaction ID"),
|
|
5
|
+
date: z.string().describe("Transaction date"),
|
|
6
|
+
amount: z.number().describe("Transaction amount in dollars"),
|
|
7
|
+
memo: z.string().optional().describe("Transaction memo"),
|
|
8
|
+
cleared: z.string().describe("Cleared status"),
|
|
9
|
+
approved: z.boolean().describe("Approved flag"),
|
|
10
|
+
flag_color: z.string().optional().describe("Flag color"),
|
|
11
|
+
account_id: z.string().describe("Account ID"),
|
|
12
|
+
payee_id: z.string().nullish().describe("Payee ID"),
|
|
13
|
+
category_id: z.string().nullish().describe("Category ID"),
|
|
14
|
+
transfer_account_id: z.string().nullish().describe("Transfer account ID"),
|
|
15
|
+
transfer_transaction_id: z
|
|
16
|
+
.string()
|
|
17
|
+
.nullish()
|
|
18
|
+
.describe("Transfer transaction ID"),
|
|
19
|
+
matched_transaction_id: z
|
|
20
|
+
.string()
|
|
21
|
+
.nullish()
|
|
22
|
+
.describe("Matched transaction ID"),
|
|
23
|
+
import_id: z.string().optional().describe("Import ID"),
|
|
24
|
+
deleted: z.boolean().describe("Deleted flag"),
|
|
25
|
+
account_name: z.string().optional().describe("Account name"),
|
|
26
|
+
payee_name: z.string().optional().describe("Payee name"),
|
|
27
|
+
category_name: z.string().optional().describe("Category name"),
|
|
22
28
|
});
|
|
23
29
|
export const TransactionPreviewSchema = z.object({
|
|
24
|
-
id: z.string().describe(
|
|
25
|
-
date: z.string().describe(
|
|
26
|
-
amount: z.number().describe(
|
|
27
|
-
memo: z.string().optional().describe(
|
|
28
|
-
payee_name: z.string().optional().describe(
|
|
29
|
-
category_name: z.string().optional().describe(
|
|
30
|
+
id: z.string().describe("Transaction ID"),
|
|
31
|
+
date: z.string().describe("Transaction date"),
|
|
32
|
+
amount: z.number().describe("Transaction amount in dollars"),
|
|
33
|
+
memo: z.string().optional().describe("Transaction memo"),
|
|
34
|
+
payee_name: z.string().optional().describe("Payee name"),
|
|
35
|
+
category_name: z.string().optional().describe("Category name"),
|
|
30
36
|
});
|
|
31
37
|
const ListTransactionsNormalSchema = CacheMetadataSchema.extend({
|
|
32
|
-
total_count: z.number().int().describe(
|
|
33
|
-
transactions: z.array(TransactionSchema).describe(
|
|
38
|
+
total_count: z.number().int().describe("Total transaction count"),
|
|
39
|
+
transactions: z.array(TransactionSchema).describe("List of transactions"),
|
|
34
40
|
});
|
|
35
41
|
const ListTransactionsPreviewSchema = z.object({
|
|
36
|
-
message: z.string().describe(
|
|
37
|
-
suggestion: z.string().describe(
|
|
38
|
-
showing: z.string().describe(
|
|
39
|
-
total_count: z.number().int().describe(
|
|
40
|
-
estimated_size_kb: z.number().describe(
|
|
41
|
-
preview_transactions: z
|
|
42
|
+
message: z.string().describe("Large result set message"),
|
|
43
|
+
suggestion: z.string().describe("Suggestion to narrow results"),
|
|
44
|
+
showing: z.string().describe("Human-readable summary of transactions shown"),
|
|
45
|
+
total_count: z.number().int().describe("Total transaction count"),
|
|
46
|
+
estimated_size_kb: z.number().describe("Estimated response size in KB"),
|
|
47
|
+
preview_transactions: z
|
|
48
|
+
.array(TransactionPreviewSchema)
|
|
49
|
+
.describe("Preview transactions"),
|
|
42
50
|
});
|
|
43
51
|
export const ListTransactionsOutputSchema = z.union([
|
|
44
52
|
ListTransactionsNormalSchema,
|
|
45
53
|
ListTransactionsPreviewSchema,
|
|
46
54
|
]);
|
|
47
55
|
export const GetTransactionOutputSchema = CacheMetadataSchema.extend({
|
|
48
|
-
transaction: TransactionSchema.describe(
|
|
56
|
+
transaction: TransactionSchema.describe("Transaction details"),
|
|
49
57
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SuccessResponseSchema } from
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { SuccessResponseSchema } from "../shared/commonOutputs.js";
|
|
3
3
|
export const UserSchema = z.object({
|
|
4
4
|
id: z.string(),
|
|
5
5
|
});
|
|
@@ -15,7 +15,9 @@ export const SetDefaultBudgetOutputSchema = SuccessResponseSchema.extend({
|
|
|
15
15
|
default_budget_id: z.string(),
|
|
16
16
|
cache_warm_started: z.boolean(),
|
|
17
17
|
});
|
|
18
|
-
export const ClearCacheOutputSchema = SuccessResponseSchema.pick({
|
|
18
|
+
export const ClearCacheOutputSchema = SuccessResponseSchema.pick({
|
|
19
|
+
success: true,
|
|
20
|
+
});
|
|
19
21
|
export const SetOutputFormatOutputSchema = SuccessResponseSchema.extend({
|
|
20
22
|
options: z.object({
|
|
21
23
|
defaultMinify: z.boolean().optional(),
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
2
|
export const CacheMetadataSchema = z.object({
|
|
3
|
-
cached: z
|
|
3
|
+
cached: z
|
|
4
|
+
.boolean()
|
|
5
|
+
.optional()
|
|
6
|
+
.describe("Indicates if data was served from cache"),
|
|
4
7
|
cache_info: z
|
|
5
8
|
.string()
|
|
6
9
|
.optional()
|
|
@@ -8,20 +11,23 @@ export const CacheMetadataSchema = z.object({
|
|
|
8
11
|
usedDelta: z
|
|
9
12
|
.boolean()
|
|
10
13
|
.optional()
|
|
11
|
-
.describe(
|
|
14
|
+
.describe("Indicates if delta merge optimization was applied for budgets"),
|
|
12
15
|
});
|
|
13
16
|
export const SuccessResponseSchema = z.object({
|
|
14
|
-
success: z.boolean().describe(
|
|
15
|
-
message: z.string().describe(
|
|
17
|
+
success: z.boolean().describe("Indicates operation success"),
|
|
18
|
+
message: z.string().describe("Human-readable success message"),
|
|
16
19
|
});
|
|
17
20
|
export const ConfirmationResponseSchema = SuccessResponseSchema.extend({
|
|
18
21
|
details: z
|
|
19
22
|
.record(z.string(), z.unknown())
|
|
20
23
|
.optional()
|
|
21
|
-
.describe(
|
|
24
|
+
.describe("Additional confirmation details as key-value pairs"),
|
|
22
25
|
});
|
|
23
26
|
export const ErrorDetailsSchema = z.object({
|
|
24
|
-
error: z.string().describe(
|
|
25
|
-
code: z.string().optional().describe(
|
|
26
|
-
details: z
|
|
27
|
+
error: z.string().describe("Error message"),
|
|
28
|
+
code: z.string().optional().describe("Error code for categorization"),
|
|
29
|
+
details: z
|
|
30
|
+
.string()
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Additional error context or details"),
|
|
27
33
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type * as ynab from "ynab";
|
|
3
|
+
import type { ErrorHandler } from "../server/errorHandler.js";
|
|
4
|
+
import type { ToolRegistry } from "../server/toolRegistry.js";
|
|
5
|
+
import type { ToolContext } from "../types/toolRegistration.js";
|
|
6
|
+
import type { DeltaFetcher } from "./deltaFetcher.js";
|
|
7
|
+
import type { GetTransactionParams, ListTransactionsParams } from "./transactionSchemas.js";
|
|
8
|
+
export declare function handleListTransactions(ynabAPI: ynab.API, deltaFetcher: DeltaFetcher, params: ListTransactionsParams): Promise<CallToolResult>;
|
|
9
|
+
export declare function handleListTransactions(ynabAPI: ynab.API, params: ListTransactionsParams): Promise<CallToolResult>;
|
|
10
|
+
export declare function handleGetTransaction(ynabAPI: ynab.API, params: GetTransactionParams, _errorHandler?: ErrorHandler): Promise<CallToolResult>;
|
|
11
|
+
export declare function registerTransactionReadTools(registry: ToolRegistry, context: ToolContext): void;
|