@dizzlkheinz/ynab-mcpb 0.18.4 → 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.
Files changed (343) hide show
  1. package/CLAUDE.md +87 -8
  2. package/bin/ynab-mcp-server.cjs +2 -2
  3. package/bin/ynab-mcp-server.js +3 -3
  4. package/biome.json +39 -0
  5. package/dist/bundle/index.cjs +67 -67
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.js +27 -27
  8. package/dist/server/YNABMCPServer.d.ts +3 -4
  9. package/dist/server/YNABMCPServer.js +111 -116
  10. package/dist/server/budgetResolver.d.ts +6 -5
  11. package/dist/server/budgetResolver.js +46 -36
  12. package/dist/server/cacheKeys.js +6 -6
  13. package/dist/server/cacheManager.js +14 -11
  14. package/dist/server/completions.d.ts +2 -2
  15. package/dist/server/completions.js +20 -15
  16. package/dist/server/config.d.ts +10 -5
  17. package/dist/server/config.js +24 -7
  18. package/dist/server/deltaCache.d.ts +2 -2
  19. package/dist/server/deltaCache.js +22 -16
  20. package/dist/server/deltaCache.merge.d.ts +2 -2
  21. package/dist/server/diagnostics.d.ts +4 -4
  22. package/dist/server/diagnostics.js +38 -32
  23. package/dist/server/errorHandler.d.ts +5 -12
  24. package/dist/server/errorHandler.js +219 -217
  25. package/dist/server/prompts.d.ts +2 -2
  26. package/dist/server/prompts.js +45 -45
  27. package/dist/server/rateLimiter.js +4 -4
  28. package/dist/server/requestLogger.d.ts +1 -1
  29. package/dist/server/requestLogger.js +40 -35
  30. package/dist/server/resources.d.ts +3 -3
  31. package/dist/server/resources.js +55 -52
  32. package/dist/server/responseFormatter.js +6 -6
  33. package/dist/server/securityMiddleware.d.ts +2 -2
  34. package/dist/server/securityMiddleware.js +22 -20
  35. package/dist/server/serverKnowledgeStore.js +1 -1
  36. package/dist/server/toolRegistry.d.ts +3 -3
  37. package/dist/server/toolRegistry.js +47 -40
  38. package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
  39. package/dist/tools/__tests__/deltaTestUtils.js +2 -2
  40. package/dist/tools/accountTools.d.ts +9 -8
  41. package/dist/tools/accountTools.js +47 -47
  42. package/dist/tools/adapters.d.ts +13 -8
  43. package/dist/tools/adapters.js +21 -11
  44. package/dist/tools/budgetTools.d.ts +8 -7
  45. package/dist/tools/budgetTools.js +22 -22
  46. package/dist/tools/categoryTools.d.ts +9 -8
  47. package/dist/tools/categoryTools.js +68 -59
  48. package/dist/tools/compareTransactions/formatter.d.ts +3 -3
  49. package/dist/tools/compareTransactions/formatter.js +9 -9
  50. package/dist/tools/compareTransactions/index.d.ts +6 -6
  51. package/dist/tools/compareTransactions/index.js +58 -43
  52. package/dist/tools/compareTransactions/matcher.d.ts +1 -1
  53. package/dist/tools/compareTransactions/matcher.js +28 -15
  54. package/dist/tools/compareTransactions/parser.d.ts +2 -2
  55. package/dist/tools/compareTransactions/parser.js +144 -138
  56. package/dist/tools/compareTransactions/types.d.ts +4 -4
  57. package/dist/tools/compareTransactions.d.ts +1 -1
  58. package/dist/tools/compareTransactions.js +1 -1
  59. package/dist/tools/deltaFetcher.d.ts +2 -2
  60. package/dist/tools/deltaFetcher.js +16 -15
  61. package/dist/tools/deltaSupport.d.ts +4 -4
  62. package/dist/tools/deltaSupport.js +35 -41
  63. package/dist/tools/exportTransactions.d.ts +5 -4
  64. package/dist/tools/exportTransactions.js +61 -59
  65. package/dist/tools/monthTools.d.ts +7 -6
  66. package/dist/tools/monthTools.js +31 -29
  67. package/dist/tools/payeeTools.d.ts +7 -6
  68. package/dist/tools/payeeTools.js +28 -28
  69. package/dist/tools/reconcileAdapter.d.ts +2 -2
  70. package/dist/tools/reconcileAdapter.js +19 -12
  71. package/dist/tools/reconciliation/analyzer.d.ts +4 -4
  72. package/dist/tools/reconciliation/analyzer.js +73 -59
  73. package/dist/tools/reconciliation/csvParser.d.ts +3 -3
  74. package/dist/tools/reconciliation/csvParser.js +128 -104
  75. package/dist/tools/reconciliation/executor.d.ts +4 -4
  76. package/dist/tools/reconciliation/executor.js +148 -109
  77. package/dist/tools/reconciliation/index.d.ts +10 -10
  78. package/dist/tools/reconciliation/index.js +96 -83
  79. package/dist/tools/reconciliation/matcher.d.ts +3 -3
  80. package/dist/tools/reconciliation/matcher.js +17 -16
  81. package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
  82. package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
  83. package/dist/tools/reconciliation/recommendationEngine.js +40 -40
  84. package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
  85. package/dist/tools/reconciliation/reportFormatter.js +59 -58
  86. package/dist/tools/reconciliation/signDetector.d.ts +1 -1
  87. package/dist/tools/reconciliation/types.d.ts +16 -16
  88. package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
  89. package/dist/tools/schemas/common.d.ts +1 -1
  90. package/dist/tools/schemas/common.js +1 -1
  91. package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
  92. package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
  93. package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
  94. package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
  95. package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
  96. package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
  97. package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
  98. package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
  99. package/dist/tools/schemas/outputs/index.d.ts +14 -14
  100. package/dist/tools/schemas/outputs/index.js +14 -14
  101. package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
  102. package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
  103. package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
  104. package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
  105. package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
  106. package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
  107. package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
  108. package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
  109. package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
  110. package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
  111. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
  112. package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
  113. package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
  114. package/dist/tools/schemas/shared/commonOutputs.js +15 -9
  115. package/dist/tools/transactionReadTools.d.ts +11 -0
  116. package/dist/tools/transactionReadTools.js +202 -0
  117. package/dist/tools/transactionSchemas.d.ts +7 -7
  118. package/dist/tools/transactionSchemas.js +77 -57
  119. package/dist/tools/transactionTools.d.ts +6 -24
  120. package/dist/tools/transactionTools.js +7 -1499
  121. package/dist/tools/transactionUtils.d.ts +6 -6
  122. package/dist/tools/transactionUtils.js +78 -63
  123. package/dist/tools/transactionWriteTools.d.ts +20 -0
  124. package/dist/tools/transactionWriteTools.js +1342 -0
  125. package/dist/tools/utilityTools.d.ts +5 -4
  126. package/dist/tools/utilityTools.js +11 -11
  127. package/dist/types/index.d.ts +7 -7
  128. package/dist/types/index.js +6 -6
  129. package/dist/types/reconciliation.d.ts +1 -1
  130. package/dist/types/toolRegistration.d.ts +14 -12
  131. package/dist/utils/amountUtils.js +1 -1
  132. package/dist/utils/dateUtils.js +4 -4
  133. package/dist/utils/errors.d.ts +3 -3
  134. package/dist/utils/errors.js +4 -4
  135. package/dist/utils/money.d.ts +2 -2
  136. package/dist/utils/money.js +8 -8
  137. package/dist/utils/validationError.d.ts +1 -1
  138. package/dist/utils/validationError.js +1 -1
  139. package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
  140. package/docs/assets/schemas/reconciliation-v2.json +360 -336
  141. package/esbuild.config.mjs +53 -50
  142. package/meta.json +12548 -12548
  143. package/package.json +98 -111
  144. package/scripts/analyze-bundle.mjs +33 -30
  145. package/scripts/create-pr-description.js +169 -120
  146. package/scripts/run-all-tests.js +178 -169
  147. package/scripts/run-domain-integration-tests.js +28 -18
  148. package/scripts/run-generate-mcpb.js +19 -17
  149. package/scripts/run-throttled-integration-tests.js +92 -83
  150. package/scripts/test-delta-params.mjs +149 -120
  151. package/scripts/test-recommendations.ts +36 -32
  152. package/scripts/tmpTransaction.ts +80 -43
  153. package/scripts/validate-env.js +98 -91
  154. package/scripts/verify-build.js +78 -76
  155. package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
  156. package/src/__tests__/performance.test.ts +723 -671
  157. package/src/__tests__/setup.ts +442 -395
  158. package/src/__tests__/smoke.e2e.test.ts +41 -39
  159. package/src/__tests__/testRunner.ts +314 -295
  160. package/src/__tests__/testUtils.ts +456 -364
  161. package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
  162. package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
  163. package/src/index.ts +68 -59
  164. package/src/server/CLAUDE.md +480 -0
  165. package/src/server/YNABMCPServer.ts +821 -794
  166. package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
  167. package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
  168. package/src/server/__tests__/budgetResolver.test.ts +466 -423
  169. package/src/server/__tests__/cacheManager.test.ts +891 -874
  170. package/src/server/__tests__/completions.integration.test.ts +115 -106
  171. package/src/server/__tests__/completions.test.ts +334 -313
  172. package/src/server/__tests__/config.test.ts +98 -86
  173. package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
  174. package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
  175. package/src/server/__tests__/deltaCache.test.ts +946 -759
  176. package/src/server/__tests__/diagnostics.test.ts +825 -792
  177. package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
  178. package/src/server/__tests__/errorHandler.test.ts +402 -397
  179. package/src/server/__tests__/prompts.test.ts +424 -347
  180. package/src/server/__tests__/rateLimiter.test.ts +313 -309
  181. package/src/server/__tests__/requestLogger.test.ts +443 -403
  182. package/src/server/__tests__/resources.template.test.ts +196 -185
  183. package/src/server/__tests__/resources.test.ts +294 -288
  184. package/src/server/__tests__/security.integration.test.ts +487 -421
  185. package/src/server/__tests__/securityMiddleware.test.ts +519 -444
  186. package/src/server/__tests__/server-startup.integration.test.ts +509 -490
  187. package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
  188. package/src/server/__tests__/toolRegistration.test.ts +239 -210
  189. package/src/server/__tests__/toolRegistry.test.ts +907 -845
  190. package/src/server/budgetResolver.ts +221 -181
  191. package/src/server/cacheKeys.ts +6 -6
  192. package/src/server/cacheManager.ts +498 -484
  193. package/src/server/completions.ts +267 -243
  194. package/src/server/config.ts +35 -14
  195. package/src/server/deltaCache.merge.ts +146 -128
  196. package/src/server/deltaCache.ts +352 -309
  197. package/src/server/diagnostics.ts +257 -242
  198. package/src/server/errorHandler.ts +747 -744
  199. package/src/server/prompts.ts +181 -176
  200. package/src/server/rateLimiter.ts +131 -129
  201. package/src/server/requestLogger.ts +350 -322
  202. package/src/server/resources.ts +442 -374
  203. package/src/server/responseFormatter.ts +41 -37
  204. package/src/server/securityMiddleware.ts +223 -205
  205. package/src/server/serverKnowledgeStore.ts +67 -67
  206. package/src/server/toolRegistry.ts +508 -474
  207. package/src/tools/CLAUDE.md +604 -0
  208. package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
  209. package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
  210. package/src/tools/__tests__/accountTools.test.ts +685 -638
  211. package/src/tools/__tests__/adapters.test.ts +142 -108
  212. package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
  213. package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
  214. package/src/tools/__tests__/budgetTools.test.ts +442 -413
  215. package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
  216. package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
  217. package/src/tools/__tests__/categoryTools.test.ts +656 -625
  218. package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
  219. package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
  220. package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
  221. package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
  222. package/src/tools/__tests__/compareTransactions.test.ts +352 -332
  223. package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
  224. package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
  225. package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
  226. package/src/tools/__tests__/deltaSupport.test.ts +211 -184
  227. package/src/tools/__tests__/deltaTestUtils.ts +37 -33
  228. package/src/tools/__tests__/exportTransactions.test.ts +205 -200
  229. package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
  230. package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
  231. package/src/tools/__tests__/monthTools.test.ts +561 -512
  232. package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
  233. package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
  234. package/src/tools/__tests__/payeeTools.test.ts +486 -434
  235. package/src/tools/__tests__/transactionSchemas.test.ts +1202 -1186
  236. package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
  237. package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
  238. package/src/tools/__tests__/transactionUtils.test.ts +1004 -977
  239. package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
  240. package/src/tools/__tests__/utilityTools.test.ts +68 -58
  241. package/src/tools/accountTools.ts +293 -271
  242. package/src/tools/adapters.ts +120 -63
  243. package/src/tools/budgetTools.ts +121 -116
  244. package/src/tools/categoryTools.ts +379 -339
  245. package/src/tools/compareTransactions/formatter.ts +131 -119
  246. package/src/tools/compareTransactions/index.ts +249 -214
  247. package/src/tools/compareTransactions/matcher.ts +259 -209
  248. package/src/tools/compareTransactions/parser.ts +517 -487
  249. package/src/tools/compareTransactions/types.ts +38 -38
  250. package/src/tools/compareTransactions.ts +1 -1
  251. package/src/tools/deltaFetcher.ts +281 -260
  252. package/src/tools/deltaSupport.ts +264 -259
  253. package/src/tools/exportTransactions.ts +230 -218
  254. package/src/tools/monthTools.ts +180 -165
  255. package/src/tools/payeeTools.ts +152 -140
  256. package/src/tools/reconcileAdapter.ts +297 -252
  257. package/src/tools/reconciliation/CLAUDE.md +506 -0
  258. package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +133 -124
  259. package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -230
  260. package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -400
  261. package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
  262. package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
  263. package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
  264. package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
  265. package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
  266. package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
  267. package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
  268. package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -989
  269. package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
  270. package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -533
  271. package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -74
  272. package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -62
  273. package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
  274. package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +56 -55
  275. package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
  276. package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
  277. package/src/tools/reconciliation/analyzer.ts +564 -504
  278. package/src/tools/reconciliation/csvParser.ts +656 -609
  279. package/src/tools/reconciliation/executor.ts +1290 -1128
  280. package/src/tools/reconciliation/index.ts +580 -528
  281. package/src/tools/reconciliation/matcher.ts +256 -240
  282. package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
  283. package/src/tools/reconciliation/recommendationEngine.ts +357 -345
  284. package/src/tools/reconciliation/reportFormatter.ts +343 -307
  285. package/src/tools/reconciliation/signDetector.ts +89 -83
  286. package/src/tools/reconciliation/types.ts +164 -159
  287. package/src/tools/reconciliation/ynabAdapter.ts +17 -15
  288. package/src/tools/schemas/CLAUDE.md +546 -0
  289. package/src/tools/schemas/common.ts +1 -1
  290. package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
  291. package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
  292. package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
  293. package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
  294. package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
  295. package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
  296. package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
  297. package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
  298. package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
  299. package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
  300. package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
  301. package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
  302. package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
  303. package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
  304. package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
  305. package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
  306. package/src/tools/schemas/outputs/index.ts +163 -163
  307. package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
  308. package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
  309. package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
  310. package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
  311. package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
  312. package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
  313. package/src/tools/schemas/shared/commonOutputs.ts +27 -19
  314. package/src/tools/toolCategories.ts +114 -114
  315. package/src/tools/transactionReadTools.ts +327 -0
  316. package/src/tools/transactionSchemas.ts +322 -291
  317. package/src/tools/transactionTools.ts +84 -2246
  318. package/src/tools/transactionUtils.ts +507 -422
  319. package/src/tools/transactionWriteTools.ts +2110 -0
  320. package/src/tools/utilityTools.ts +46 -41
  321. package/src/types/CLAUDE.md +477 -0
  322. package/src/types/__tests__/index.test.ts +51 -51
  323. package/src/types/index.ts +43 -39
  324. package/src/types/integration-tests.d.ts +26 -26
  325. package/src/types/reconciliation.ts +29 -29
  326. package/src/types/toolAnnotations.ts +30 -30
  327. package/src/types/toolRegistration.ts +43 -32
  328. package/src/utils/CLAUDE.md +508 -0
  329. package/src/utils/__tests__/dateUtils.test.ts +174 -168
  330. package/src/utils/__tests__/money.test.ts +193 -187
  331. package/src/utils/amountUtils.ts +5 -5
  332. package/src/utils/baseError.ts +5 -5
  333. package/src/utils/dateUtils.ts +29 -26
  334. package/src/utils/errors.ts +14 -14
  335. package/src/utils/money.ts +66 -52
  336. package/src/utils/validationError.ts +1 -1
  337. package/tsconfig.json +29 -29
  338. package/tsconfig.prod.json +16 -16
  339. package/vitest-reporters/split-json-reporter.ts +247 -204
  340. package/vitest.config.ts +99 -95
  341. package/.prettierignore +0 -10
  342. package/.prettierrc.json +0 -10
  343. package/eslint.config.js +0 -49
@@ -37,10 +37,10 @@
37
37
  * }
38
38
  */
39
39
 
40
- import { z } from 'zod';
41
- import { TransactionSchema } from './transactionOutputs.js';
42
- import { AccountSchema } from './accountOutputs.js';
43
- import { CategorySchema } from './categoryOutputs.js';
40
+ import { z } from "zod";
41
+ import { AccountSchema } from "./accountOutputs.js";
42
+ import { CategorySchema } from "./categoryOutputs.js";
43
+ import { TransactionSchema } from "./transactionOutputs.js";
44
44
 
45
45
  // ============================================================================
46
46
  // NESTED SCHEMAS FOR COMPOSITION
@@ -54,17 +54,17 @@ import { CategorySchema } from './categoryOutputs.js';
54
54
  * @see src/tools/transactionTools.ts:1160-1335 - create_receipt_split_transaction handler
55
55
  */
56
56
  export const SubtransactionSchema = z.object({
57
- id: z.string(),
58
- transaction_id: z.string(),
59
- amount: z.number(),
60
- memo: z.string().optional(),
61
- payee_id: z.string().optional(),
62
- payee_name: z.string().optional(),
63
- category_id: z.string().optional(),
64
- category_name: z.string().optional(),
65
- transfer_account_id: z.string().optional(),
66
- transfer_transaction_id: z.string().optional(),
67
- deleted: z.boolean(),
57
+ id: z.string(),
58
+ transaction_id: z.string(),
59
+ amount: z.number(),
60
+ memo: z.string().optional(),
61
+ payee_id: z.string().optional(),
62
+ payee_name: z.string().optional(),
63
+ category_id: z.string().optional(),
64
+ category_name: z.string().optional(),
65
+ transfer_account_id: z.string().optional(),
66
+ transfer_transaction_id: z.string().optional(),
67
+ deleted: z.boolean(),
68
68
  });
69
69
 
70
70
  export type Subtransaction = z.infer<typeof SubtransactionSchema>;
@@ -82,12 +82,14 @@ export type Subtransaction = z.infer<typeof SubtransactionSchema>;
82
82
  * @see src/tools/transactionTools.ts:1336-1530 - update_transaction handler
83
83
  */
84
84
  export const TransactionWithBalanceSchema = TransactionSchema.extend({
85
- account_balance: z.number().optional(), // Raw YNAB milliunits
86
- account_cleared_balance: z.number().optional(), // Raw YNAB milliunits
87
- subtransactions: z.array(SubtransactionSchema).optional(),
85
+ account_balance: z.number().optional(), // Raw YNAB milliunits
86
+ account_cleared_balance: z.number().optional(), // Raw YNAB milliunits
87
+ subtransactions: z.array(SubtransactionSchema).optional(),
88
88
  });
89
89
 
90
- export type TransactionWithBalance = z.infer<typeof TransactionWithBalanceSchema>;
90
+ export type TransactionWithBalance = z.infer<
91
+ typeof TransactionWithBalanceSchema
92
+ >;
91
93
 
92
94
  /**
93
95
  * Individual receipt line item.
@@ -96,10 +98,10 @@ export type TransactionWithBalance = z.infer<typeof TransactionWithBalanceSchema
96
98
  * @see src/tools/transactionTools.ts:1160-1335 - create_receipt_split_transaction handler
97
99
  */
98
100
  export const ReceiptItemSchema = z.object({
99
- name: z.string(),
100
- quantity: z.number().optional(),
101
- amount: z.number(),
102
- memo: z.string().optional(),
101
+ name: z.string(),
102
+ quantity: z.number().optional(),
103
+ amount: z.number(),
104
+ memo: z.string().optional(),
103
105
  });
104
106
 
105
107
  export type ReceiptItem = z.infer<typeof ReceiptItemSchema>;
@@ -111,15 +113,17 @@ export type ReceiptItem = z.infer<typeof ReceiptItemSchema>;
111
113
  * @see src/tools/transactionTools.ts:1160-1335 - create_receipt_split_transaction handler
112
114
  */
113
115
  export const ReceiptCategoryBreakdownSchema = z.object({
114
- category_id: z.string(),
115
- category_name: z.string().optional(),
116
- items: z.array(ReceiptItemSchema),
117
- subtotal: z.number(),
118
- tax: z.number(),
119
- total: z.number(),
116
+ category_id: z.string(),
117
+ category_name: z.string().optional(),
118
+ items: z.array(ReceiptItemSchema),
119
+ subtotal: z.number(),
120
+ tax: z.number(),
121
+ total: z.number(),
120
122
  });
121
123
 
122
- export type ReceiptCategoryBreakdown = z.infer<typeof ReceiptCategoryBreakdownSchema>;
124
+ export type ReceiptCategoryBreakdown = z.infer<
125
+ typeof ReceiptCategoryBreakdownSchema
126
+ >;
123
127
 
124
128
  /**
125
129
  * Complete receipt breakdown summary.
@@ -128,10 +132,10 @@ export type ReceiptCategoryBreakdown = z.infer<typeof ReceiptCategoryBreakdownSc
128
132
  * @see src/tools/transactionTools.ts:1160-1335 - create_receipt_split_transaction handler
129
133
  */
130
134
  export const ReceiptSummarySchema = z.object({
131
- subtotal: z.number(),
132
- tax: z.number(),
133
- total: z.number(),
134
- categories: z.array(ReceiptCategoryBreakdownSchema),
135
+ subtotal: z.number(),
136
+ tax: z.number(),
137
+ total: z.number(),
138
+ categories: z.array(ReceiptCategoryBreakdownSchema),
135
139
  });
136
140
 
137
141
  export type ReceiptSummary = z.infer<typeof ReceiptSummarySchema>;
@@ -144,11 +148,11 @@ export type ReceiptSummary = z.infer<typeof ReceiptSummarySchema>;
144
148
  * @see src/tools/transactionTools.ts:2057-2462 - update_transactions handler
145
149
  */
146
150
  export const BulkOperationSummarySchema = z.object({
147
- total_requested: z.number(),
148
- created: z.number().optional(),
149
- updated: z.number().optional(),
150
- duplicates: z.number().optional(),
151
- failed: z.number(),
151
+ total_requested: z.number(),
152
+ created: z.number().optional(),
153
+ updated: z.number().optional(),
154
+ duplicates: z.number().optional(),
155
+ failed: z.number(),
152
156
  });
153
157
 
154
158
  export type BulkOperationSummary = z.infer<typeof BulkOperationSummarySchema>;
@@ -174,15 +178,15 @@ export type BulkOperationSummary = z.infer<typeof BulkOperationSummarySchema>;
174
178
  * @see src/tools/transactionTools.ts:2057-2462 - update_transactions handler
175
179
  */
176
180
  export const BulkResultSchema = z
177
- .object({
178
- request_index: z.number(),
179
- status: z.enum(['created', 'duplicate', 'updated', 'failed']),
180
- transaction_id: z.string().optional(),
181
- correlation_key: z.string(),
182
- error_code: z.string().optional(),
183
- error: z.string().optional(),
184
- })
185
- .passthrough(); // Allow additional correlation metadata fields
181
+ .object({
182
+ request_index: z.number(),
183
+ status: z.enum(["created", "duplicate", "updated", "failed"]),
184
+ transaction_id: z.string().optional(),
185
+ correlation_key: z.string(),
186
+ error_code: z.string().optional(),
187
+ error: z.string().optional(),
188
+ })
189
+ .passthrough(); // Allow additional correlation metadata fields
186
190
 
187
191
  export type BulkResult = z.infer<typeof BulkResultSchema>;
188
192
 
@@ -193,18 +197,21 @@ export type BulkResult = z.infer<typeof BulkResultSchema>;
193
197
  * @see src/tools/transactionTools.ts:2139-2192 - update_transactions dry-run diff building
194
198
  */
195
199
  export const TransactionDiffFieldsSchema = z.object({
196
- amount: z.number().optional(),
197
- date: z
198
- .string()
199
- .regex(/^\d{4}-\d{2}-\d{2}$/)
200
- .optional(),
201
- memo: z.string().optional(),
202
- payee_id: z.string().nullable().optional(),
203
- payee_name: z.string().nullable().optional(),
204
- category_id: z.string().nullable().optional(),
205
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
206
- approved: z.boolean().optional(),
207
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).nullable().optional(),
200
+ amount: z.number().optional(),
201
+ date: z
202
+ .string()
203
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
204
+ .optional(),
205
+ memo: z.string().optional(),
206
+ payee_id: z.string().nullable().optional(),
207
+ payee_name: z.string().nullable().optional(),
208
+ category_id: z.string().nullable().optional(),
209
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
210
+ approved: z.boolean().optional(),
211
+ flag_color: z
212
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
213
+ .nullable()
214
+ .optional(),
208
215
  });
209
216
 
210
217
  export type TransactionDiffFields = z.infer<typeof TransactionDiffFieldsSchema>;
@@ -216,9 +223,9 @@ export type TransactionDiffFields = z.infer<typeof TransactionDiffFieldsSchema>;
216
223
  * @see src/tools/transactionTools.ts:2057-2462 - update_transactions handler
217
224
  */
218
225
  export const DryRunPreviewItemSchema = z.object({
219
- transaction_id: z.string(),
220
- before: z.union([z.literal('unavailable'), TransactionDiffFieldsSchema]),
221
- after: TransactionDiffFieldsSchema,
226
+ transaction_id: z.string(),
227
+ before: z.union([z.literal("unavailable"), TransactionDiffFieldsSchema]),
228
+ after: TransactionDiffFieldsSchema,
222
229
  });
223
230
 
224
231
  export type DryRunPreviewItem = z.infer<typeof DryRunPreviewItemSchema>;
@@ -230,10 +237,10 @@ export type DryRunPreviewItem = z.infer<typeof DryRunPreviewItemSchema>;
230
237
  * @see src/tools/transactionTools.ts:2057-2462 - update_transactions handler
231
238
  */
232
239
  export const DryRunWarningSchema = z.object({
233
- code: z.string(),
234
- count: z.number(),
235
- message: z.string(),
236
- sample_ids: z.array(z.string()).optional(),
240
+ code: z.string(),
241
+ count: z.number(),
242
+ message: z.string(),
243
+ sample_ids: z.array(z.string()).optional(),
237
244
  });
238
245
 
239
246
  export type DryRunWarning = z.infer<typeof DryRunWarningSchema>;
@@ -269,17 +276,19 @@ export type DryRunWarning = z.infer<typeof DryRunWarningSchema>;
269
276
  * }
270
277
  */
271
278
  export const CreateTransactionOutputSchema = z.union([
272
- z.object({
273
- dry_run: z.literal(true),
274
- action: z.literal('create_transaction'),
275
- request: z.record(z.string(), z.unknown()),
276
- }),
277
- z.object({
278
- transaction: TransactionWithBalanceSchema,
279
- }),
279
+ z.object({
280
+ dry_run: z.literal(true),
281
+ action: z.literal("create_transaction"),
282
+ request: z.record(z.string(), z.unknown()),
283
+ }),
284
+ z.object({
285
+ transaction: TransactionWithBalanceSchema,
286
+ }),
280
287
  ]);
281
288
 
282
- export type CreateTransactionOutput = z.infer<typeof CreateTransactionOutputSchema>;
289
+ export type CreateTransactionOutput = z.infer<
290
+ typeof CreateTransactionOutputSchema
291
+ >;
283
292
 
284
293
  /**
285
294
  * Transaction preview item for bulk create dry-run.
@@ -288,18 +297,20 @@ export type CreateTransactionOutput = z.infer<typeof CreateTransactionOutputSche
288
297
  * @see src/tools/transactionTools.ts:1742-1752 - create_transactions dry-run preview
289
298
  */
290
299
  export const CreateTransactionPreviewSchema = z.object({
291
- request_index: z.number(),
292
- account_id: z.string(),
293
- date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
294
- amount: z.number(),
295
- memo: z.string().optional(),
296
- payee_id: z.string().optional(),
297
- payee_name: z.string().optional(),
298
- category_id: z.string().optional(),
299
- import_id: z.string().optional(),
300
+ request_index: z.number(),
301
+ account_id: z.string(),
302
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
303
+ amount: z.number(),
304
+ memo: z.string().optional(),
305
+ payee_id: z.string().optional(),
306
+ payee_name: z.string().optional(),
307
+ category_id: z.string().optional(),
308
+ import_id: z.string().optional(),
300
309
  });
301
310
 
302
- export type CreateTransactionPreview = z.infer<typeof CreateTransactionPreviewSchema>;
311
+ export type CreateTransactionPreview = z.infer<
312
+ typeof CreateTransactionPreviewSchema
313
+ >;
303
314
 
304
315
  /**
305
316
  * Bulk transaction creation output.
@@ -340,44 +351,46 @@ export type CreateTransactionPreview = z.infer<typeof CreateTransactionPreviewSc
340
351
  * }
341
352
  */
342
353
  export const CreateTransactionsOutputSchema = z.union([
343
- // Dry-run mode: Strict schema for preview validation
344
- z
345
- .object({
346
- dry_run: z.literal(true),
347
- action: z.literal('create_transactions'),
348
- validation: z.literal('passed'),
349
- summary: z.object({
350
- total_transactions: z.number(),
351
- total_amount: z.number(),
352
- accounts_affected: z.array(z.string()),
353
- date_range: z
354
- .object({
355
- earliest: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
356
- latest: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
357
- })
358
- .optional(),
359
- categories_affected: z.array(z.string()),
360
- }),
361
- transactions_preview: z.array(CreateTransactionPreviewSchema),
362
- note: z.string(),
363
- })
364
- .strict(), // Strict for dry-run to prevent malformed previews
365
- // Execution mode: Allow passthrough for correlation metadata extension
366
- z
367
- .object({
368
- success: z.boolean(),
369
- server_knowledge: z.number().optional(),
370
- summary: BulkOperationSummarySchema,
371
- results: z.array(BulkResultSchema),
372
- transactions: z.array(TransactionSchema).optional(),
373
- duplicate_import_ids: z.array(z.string()).optional(),
374
- message: z.string().optional(),
375
- mode: z.enum(['full', 'summary', 'ids_only']).optional(),
376
- })
377
- .passthrough(), // Allow top-level metadata like batch_id, execution_id
354
+ // Dry-run mode: Strict schema for preview validation
355
+ z
356
+ .object({
357
+ dry_run: z.literal(true),
358
+ action: z.literal("create_transactions"),
359
+ validation: z.literal("passed"),
360
+ summary: z.object({
361
+ total_transactions: z.number(),
362
+ total_amount: z.number(),
363
+ accounts_affected: z.array(z.string()),
364
+ date_range: z
365
+ .object({
366
+ earliest: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
367
+ latest: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
368
+ })
369
+ .optional(),
370
+ categories_affected: z.array(z.string()),
371
+ }),
372
+ transactions_preview: z.array(CreateTransactionPreviewSchema),
373
+ note: z.string(),
374
+ })
375
+ .strict(), // Strict for dry-run to prevent malformed previews
376
+ // Execution mode: Allow passthrough for correlation metadata extension
377
+ z
378
+ .object({
379
+ success: z.boolean(),
380
+ server_knowledge: z.number().optional(),
381
+ summary: BulkOperationSummarySchema,
382
+ results: z.array(BulkResultSchema),
383
+ transactions: z.array(TransactionSchema).optional(),
384
+ duplicate_import_ids: z.array(z.string()).optional(),
385
+ message: z.string().optional(),
386
+ mode: z.enum(["full", "summary", "ids_only"]).optional(),
387
+ })
388
+ .passthrough(), // Allow top-level metadata like batch_id, execution_id
378
389
  ]);
379
390
 
380
- export type CreateTransactionsOutput = z.infer<typeof CreateTransactionsOutputSchema>;
391
+ export type CreateTransactionsOutput = z.infer<
392
+ typeof CreateTransactionsOutputSchema
393
+ >;
381
394
 
382
395
  /**
383
396
  * Single transaction update output.
@@ -402,19 +415,21 @@ export type CreateTransactionsOutput = z.infer<typeof CreateTransactionsOutputSc
402
415
  * }
403
416
  */
404
417
  export const UpdateTransactionOutputSchema = z.union([
405
- z.object({
406
- dry_run: z.literal(true),
407
- action: z.literal('update_transaction'),
408
- request: z.record(z.string(), z.unknown()),
409
- }),
410
- z.object({
411
- transaction: TransactionWithBalanceSchema,
412
- updated_balance: z.number(), // Raw YNAB milliunits
413
- updated_cleared_balance: z.number(), // Raw YNAB milliunits
414
- }),
418
+ z.object({
419
+ dry_run: z.literal(true),
420
+ action: z.literal("update_transaction"),
421
+ request: z.record(z.string(), z.unknown()),
422
+ }),
423
+ z.object({
424
+ transaction: TransactionWithBalanceSchema,
425
+ updated_balance: z.number(), // Raw YNAB milliunits
426
+ updated_cleared_balance: z.number(), // Raw YNAB milliunits
427
+ }),
415
428
  ]);
416
429
 
417
- export type UpdateTransactionOutput = z.infer<typeof UpdateTransactionOutputSchema>;
430
+ export type UpdateTransactionOutput = z.infer<
431
+ typeof UpdateTransactionOutputSchema
432
+ >;
418
433
 
419
434
  /**
420
435
  * Bulk transaction update output.
@@ -459,37 +474,39 @@ export type UpdateTransactionOutput = z.infer<typeof UpdateTransactionOutputSche
459
474
  * }
460
475
  */
461
476
  export const UpdateTransactionsOutputSchema = z.union([
462
- // Dry-run mode: Strict schema for preview validation
463
- z
464
- .object({
465
- dry_run: z.literal(true),
466
- action: z.literal('update_transactions'),
467
- validation: z.literal('passed'),
468
- summary: z.object({
469
- total_transactions: z.number(),
470
- accounts_affected: z.number(),
471
- fields_to_update: z.array(z.string()),
472
- }),
473
- transactions_preview: z.array(DryRunPreviewItemSchema),
474
- warnings: z.array(DryRunWarningSchema).optional(),
475
- note: z.string(),
476
- })
477
- .strict(), // Strict for dry-run to prevent malformed previews
478
- // Execution mode: Allow passthrough for correlation metadata extension
479
- z
480
- .object({
481
- success: z.boolean(),
482
- server_knowledge: z.number().optional(),
483
- summary: BulkOperationSummarySchema,
484
- results: z.array(BulkResultSchema),
485
- transactions: z.array(TransactionSchema).optional(),
486
- message: z.string().optional(),
487
- mode: z.enum(['full', 'summary', 'ids_only']).optional(),
488
- })
489
- .passthrough(), // Allow top-level metadata like batch_id, execution_id
477
+ // Dry-run mode: Strict schema for preview validation
478
+ z
479
+ .object({
480
+ dry_run: z.literal(true),
481
+ action: z.literal("update_transactions"),
482
+ validation: z.literal("passed"),
483
+ summary: z.object({
484
+ total_transactions: z.number(),
485
+ accounts_affected: z.number(),
486
+ fields_to_update: z.array(z.string()),
487
+ }),
488
+ transactions_preview: z.array(DryRunPreviewItemSchema),
489
+ warnings: z.array(DryRunWarningSchema).optional(),
490
+ note: z.string(),
491
+ })
492
+ .strict(), // Strict for dry-run to prevent malformed previews
493
+ // Execution mode: Allow passthrough for correlation metadata extension
494
+ z
495
+ .object({
496
+ success: z.boolean(),
497
+ server_knowledge: z.number().optional(),
498
+ summary: BulkOperationSummarySchema,
499
+ results: z.array(BulkResultSchema),
500
+ transactions: z.array(TransactionSchema).optional(),
501
+ message: z.string().optional(),
502
+ mode: z.enum(["full", "summary", "ids_only"]).optional(),
503
+ })
504
+ .passthrough(), // Allow top-level metadata like batch_id, execution_id
490
505
  ]);
491
506
 
492
- export type UpdateTransactionsOutput = z.infer<typeof UpdateTransactionsOutputSchema>;
507
+ export type UpdateTransactionsOutput = z.infer<
508
+ typeof UpdateTransactionsOutputSchema
509
+ >;
493
510
 
494
511
  /**
495
512
  * Transaction deletion output.
@@ -515,23 +532,25 @@ export type UpdateTransactionsOutput = z.infer<typeof UpdateTransactionsOutputSc
515
532
  * }
516
533
  */
517
534
  export const DeleteTransactionOutputSchema = z.union([
518
- z.object({
519
- dry_run: z.literal(true),
520
- action: z.literal('delete_transaction'),
521
- request: z.record(z.string(), z.unknown()),
522
- }),
523
- z.object({
524
- message: z.string(),
525
- transaction: z.object({
526
- id: z.string(),
527
- deleted: z.boolean(),
528
- }),
529
- updated_balance: z.number(), // Raw YNAB milliunits
530
- updated_cleared_balance: z.number(), // Raw YNAB milliunits
531
- }),
535
+ z.object({
536
+ dry_run: z.literal(true),
537
+ action: z.literal("delete_transaction"),
538
+ request: z.record(z.string(), z.unknown()),
539
+ }),
540
+ z.object({
541
+ message: z.string(),
542
+ transaction: z.object({
543
+ id: z.string(),
544
+ deleted: z.boolean(),
545
+ }),
546
+ updated_balance: z.number(), // Raw YNAB milliunits
547
+ updated_cleared_balance: z.number(), // Raw YNAB milliunits
548
+ }),
532
549
  ]);
533
550
 
534
- export type DeleteTransactionOutput = z.infer<typeof DeleteTransactionOutputSchema>;
551
+ export type DeleteTransactionOutput = z.infer<
552
+ typeof DeleteTransactionOutputSchema
553
+ >;
535
554
 
536
555
  /**
537
556
  * Transaction preview schema for dry-run responses.
@@ -549,20 +568,25 @@ export type DeleteTransactionOutput = z.infer<typeof DeleteTransactionOutputSche
549
568
  * @see CreateReceiptSplitTransactionOutputSchema - Used in dry-run branch for transaction preview
550
569
  */
551
570
  export const TransactionDryRunPreviewSchema = z.object({
552
- account_id: z.string(),
553
- date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
554
- amount: z.number(),
555
- memo: z.string().optional().nullable(),
556
- cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional(),
557
- approved: z.boolean().optional(),
558
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional().nullable(),
559
- payee_id: z.string().optional().nullable(),
560
- payee_name: z.string().optional().nullable(),
561
- category_id: z.string().optional().nullable(),
562
- import_id: z.string().optional().nullable(),
571
+ account_id: z.string(),
572
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
573
+ amount: z.number(),
574
+ memo: z.string().optional().nullable(),
575
+ cleared: z.enum(["cleared", "uncleared", "reconciled"]).optional(),
576
+ approved: z.boolean().optional(),
577
+ flag_color: z
578
+ .enum(["red", "orange", "yellow", "green", "blue", "purple"])
579
+ .optional()
580
+ .nullable(),
581
+ payee_id: z.string().optional().nullable(),
582
+ payee_name: z.string().optional().nullable(),
583
+ category_id: z.string().optional().nullable(),
584
+ import_id: z.string().optional().nullable(),
563
585
  });
564
586
 
565
- export type TransactionDryRunPreview = z.infer<typeof TransactionDryRunPreviewSchema>;
587
+ export type TransactionDryRunPreview = z.infer<
588
+ typeof TransactionDryRunPreviewSchema
589
+ >;
566
590
 
567
591
  /**
568
592
  * Subtransaction preview schema for dry-run responses.
@@ -577,9 +601,9 @@ export type TransactionDryRunPreview = z.infer<typeof TransactionDryRunPreviewSc
577
601
  * @see CreateReceiptSplitTransactionOutputSchema - Used in dry-run branch for subtransactions preview
578
602
  */
579
603
  export const SubtransactionPreviewSchema = SubtransactionSchema.omit({
580
- id: true,
581
- transaction_id: true,
582
- deleted: true,
604
+ id: true,
605
+ transaction_id: true,
606
+ deleted: true,
583
607
  });
584
608
 
585
609
  export type SubtransactionPreview = z.infer<typeof SubtransactionPreviewSchema>;
@@ -630,21 +654,21 @@ export type SubtransactionPreview = z.infer<typeof SubtransactionPreviewSchema>;
630
654
  * }
631
655
  */
632
656
  export const CreateReceiptSplitTransactionOutputSchema = z.union([
633
- z.object({
634
- dry_run: z.literal(true),
635
- action: z.literal('create_receipt_split_transaction'),
636
- transaction_preview: TransactionDryRunPreviewSchema,
637
- receipt_summary: ReceiptSummarySchema,
638
- subtransactions: z.array(SubtransactionPreviewSchema),
639
- }),
640
- z.object({
641
- transaction: TransactionWithBalanceSchema,
642
- receipt_summary: ReceiptSummarySchema,
643
- }),
657
+ z.object({
658
+ dry_run: z.literal(true),
659
+ action: z.literal("create_receipt_split_transaction"),
660
+ transaction_preview: TransactionDryRunPreviewSchema,
661
+ receipt_summary: ReceiptSummarySchema,
662
+ subtransactions: z.array(SubtransactionPreviewSchema),
663
+ }),
664
+ z.object({
665
+ transaction: TransactionWithBalanceSchema,
666
+ receipt_summary: ReceiptSummarySchema,
667
+ }),
644
668
  ]);
645
669
 
646
670
  export type CreateReceiptSplitTransactionOutput = z.infer<
647
- typeof CreateReceiptSplitTransactionOutputSchema
671
+ typeof CreateReceiptSplitTransactionOutputSchema
648
672
  >;
649
673
 
650
674
  /**
@@ -654,13 +678,15 @@ export type CreateReceiptSplitTransactionOutput = z.infer<
654
678
  * @see src/tools/accountTools.ts:218-233 - create_account dry-run response construction
655
679
  */
656
680
  export const CreateAccountDryRunRequestSchema = z.object({
657
- budget_id: z.string(),
658
- name: z.string(),
659
- type: z.string(),
660
- balance: z.number(),
681
+ budget_id: z.string(),
682
+ name: z.string(),
683
+ type: z.string(),
684
+ balance: z.number(),
661
685
  });
662
686
 
663
- export type CreateAccountDryRunRequest = z.infer<typeof CreateAccountDryRunRequestSchema>;
687
+ export type CreateAccountDryRunRequest = z.infer<
688
+ typeof CreateAccountDryRunRequestSchema
689
+ >;
664
690
 
665
691
  /**
666
692
  * Account creation output.
@@ -689,14 +715,14 @@ export type CreateAccountDryRunRequest = z.infer<typeof CreateAccountDryRunReque
689
715
  * }
690
716
  */
691
717
  export const CreateAccountOutputSchema = z.union([
692
- z.object({
693
- dry_run: z.literal(true),
694
- action: z.literal('create_account'),
695
- request: CreateAccountDryRunRequestSchema,
696
- }),
697
- z.object({
698
- account: AccountSchema,
699
- }),
718
+ z.object({
719
+ dry_run: z.literal(true),
720
+ action: z.literal("create_account"),
721
+ request: CreateAccountDryRunRequestSchema,
722
+ }),
723
+ z.object({
724
+ account: AccountSchema,
725
+ }),
700
726
  ]);
701
727
 
702
728
  export type CreateAccountOutput = z.infer<typeof CreateAccountOutputSchema>;
@@ -708,13 +734,15 @@ export type CreateAccountOutput = z.infer<typeof CreateAccountOutputSchema>;
708
734
  * @see src/tools/categoryTools.ts:237-256 - update_category dry-run response construction
709
735
  */
710
736
  export const UpdateCategoryDryRunRequestSchema = z.object({
711
- budget_id: z.string(),
712
- category_id: z.string(),
713
- budgeted: z.number(),
714
- month: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
737
+ budget_id: z.string(),
738
+ category_id: z.string(),
739
+ budgeted: z.number(),
740
+ month: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
715
741
  });
716
742
 
717
- export type UpdateCategoryDryRunRequest = z.infer<typeof UpdateCategoryDryRunRequestSchema>;
743
+ export type UpdateCategoryDryRunRequest = z.infer<
744
+ typeof UpdateCategoryDryRunRequestSchema
745
+ >;
718
746
 
719
747
  /**
720
748
  * Category budget update output.
@@ -744,15 +772,15 @@ export type UpdateCategoryDryRunRequest = z.infer<typeof UpdateCategoryDryRunReq
744
772
  * }
745
773
  */
746
774
  export const UpdateCategoryOutputSchema = z.union([
747
- z.object({
748
- dry_run: z.literal(true),
749
- action: z.literal('update_category'),
750
- request: UpdateCategoryDryRunRequestSchema,
751
- }),
752
- z.object({
753
- category: CategorySchema,
754
- updated_month: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
755
- }),
775
+ z.object({
776
+ dry_run: z.literal(true),
777
+ action: z.literal("update_category"),
778
+ request: UpdateCategoryDryRunRequestSchema,
779
+ }),
780
+ z.object({
781
+ category: CategorySchema,
782
+ updated_month: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
783
+ }),
756
784
  ]);
757
785
 
758
786
  export type UpdateCategoryOutput = z.infer<typeof UpdateCategoryOutputSchema>;