@raytio/mcp-server 6.0.0 → 9.1.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 (129) hide show
  1. package/README.md +48 -0
  2. package/dist/authorization.d.ts.map +1 -1
  3. package/dist/authorization.js +2 -0
  4. package/dist/authorization.js.map +1 -1
  5. package/dist/fgl/filters.d.ts +74 -0
  6. package/dist/fgl/filters.d.ts.map +1 -0
  7. package/dist/fgl/filters.js +105 -0
  8. package/dist/fgl/filters.js.map +1 -0
  9. package/dist/fgl/projection.d.ts +21 -0
  10. package/dist/fgl/projection.d.ts.map +1 -0
  11. package/dist/fgl/projection.js +66 -0
  12. package/dist/fgl/projection.js.map +1 -0
  13. package/dist/fgl/types.d.ts +129 -0
  14. package/dist/fgl/types.d.ts.map +1 -0
  15. package/dist/fgl/types.js +2 -0
  16. package/dist/fgl/types.js.map +1 -0
  17. package/dist/tools/domains.d.ts.map +1 -1
  18. package/dist/tools/domains.js +10 -1
  19. package/dist/tools/domains.js.map +1 -1
  20. package/dist/tools/fgl/combination-get.d.ts +3 -0
  21. package/dist/tools/fgl/combination-get.d.ts.map +1 -0
  22. package/dist/tools/fgl/combination-get.js +24 -0
  23. package/dist/tools/fgl/combination-get.js.map +1 -0
  24. package/dist/tools/fgl/combination-list.d.ts +3 -0
  25. package/dist/tools/fgl/combination-list.d.ts.map +1 -0
  26. package/dist/tools/fgl/combination-list.js +49 -0
  27. package/dist/tools/fgl/combination-list.js.map +1 -0
  28. package/dist/tools/fgl/combination-validate.d.ts +3 -0
  29. package/dist/tools/fgl/combination-validate.d.ts.map +1 -0
  30. package/dist/tools/fgl/combination-validate.js +40 -0
  31. package/dist/tools/fgl/combination-validate.js.map +1 -0
  32. package/dist/tools/fgl/daily-rate-get.d.ts +3 -0
  33. package/dist/tools/fgl/daily-rate-get.d.ts.map +1 -0
  34. package/dist/tools/fgl/daily-rate-get.js +36 -0
  35. package/dist/tools/fgl/daily-rate-get.js.map +1 -0
  36. package/dist/tools/fgl/index.d.ts +4 -0
  37. package/dist/tools/fgl/index.d.ts.map +1 -0
  38. package/dist/tools/fgl/index.js +45 -0
  39. package/dist/tools/fgl/index.js.map +1 -0
  40. package/dist/tools/fgl/journal-batch-create.d.ts +3 -0
  41. package/dist/tools/fgl/journal-batch-create.d.ts.map +1 -0
  42. package/dist/tools/fgl/journal-batch-create.js +198 -0
  43. package/dist/tools/fgl/journal-batch-create.js.map +1 -0
  44. package/dist/tools/fgl/journal-batch-get.d.ts +3 -0
  45. package/dist/tools/fgl/journal-batch-get.d.ts.map +1 -0
  46. package/dist/tools/fgl/journal-batch-get.js +28 -0
  47. package/dist/tools/fgl/journal-batch-get.js.map +1 -0
  48. package/dist/tools/fgl/journal-batch-list.d.ts +3 -0
  49. package/dist/tools/fgl/journal-batch-list.d.ts.map +1 -0
  50. package/dist/tools/fgl/journal-batch-list.js +35 -0
  51. package/dist/tools/fgl/journal-batch-list.js.map +1 -0
  52. package/dist/tools/fgl/journal-batch-post.d.ts +3 -0
  53. package/dist/tools/fgl/journal-batch-post.d.ts.map +1 -0
  54. package/dist/tools/fgl/journal-batch-post.js +38 -0
  55. package/dist/tools/fgl/journal-batch-post.js.map +1 -0
  56. package/dist/tools/fgl/journal-header-list.d.ts +3 -0
  57. package/dist/tools/fgl/journal-header-list.d.ts.map +1 -0
  58. package/dist/tools/fgl/journal-header-list.js +39 -0
  59. package/dist/tools/fgl/journal-header-list.js.map +1 -0
  60. package/dist/tools/fgl/journal-header-reverse.d.ts +3 -0
  61. package/dist/tools/fgl/journal-header-reverse.d.ts.map +1 -0
  62. package/dist/tools/fgl/journal-header-reverse.js +44 -0
  63. package/dist/tools/fgl/journal-header-reverse.js.map +1 -0
  64. package/dist/tools/fgl/ledger-get.d.ts +3 -0
  65. package/dist/tools/fgl/ledger-get.d.ts.map +1 -0
  66. package/dist/tools/fgl/ledger-get.js +24 -0
  67. package/dist/tools/fgl/ledger-get.js.map +1 -0
  68. package/dist/tools/fgl/ledger-list.d.ts +3 -0
  69. package/dist/tools/fgl/ledger-list.d.ts.map +1 -0
  70. package/dist/tools/fgl/ledger-list.js +34 -0
  71. package/dist/tools/fgl/ledger-list.js.map +1 -0
  72. package/dist/tools/fgl/period-close-status.d.ts +3 -0
  73. package/dist/tools/fgl/period-close-status.d.ts.map +1 -0
  74. package/dist/tools/fgl/period-close-status.js +22 -0
  75. package/dist/tools/fgl/period-close-status.js.map +1 -0
  76. package/dist/tools/fgl/period-close.d.ts +3 -0
  77. package/dist/tools/fgl/period-close.d.ts.map +1 -0
  78. package/dist/tools/fgl/period-close.js +40 -0
  79. package/dist/tools/fgl/period-close.js.map +1 -0
  80. package/dist/tools/fgl/period-list.d.ts +3 -0
  81. package/dist/tools/fgl/period-list.d.ts.map +1 -0
  82. package/dist/tools/fgl/period-list.js +40 -0
  83. package/dist/tools/fgl/period-list.js.map +1 -0
  84. package/dist/tools/fgl/period-open.d.ts +3 -0
  85. package/dist/tools/fgl/period-open.d.ts.map +1 -0
  86. package/dist/tools/fgl/period-open.js +41 -0
  87. package/dist/tools/fgl/period-open.js.map +1 -0
  88. package/dist/tools/fgl/tax-rate-list.d.ts +3 -0
  89. package/dist/tools/fgl/tax-rate-list.d.ts.map +1 -0
  90. package/dist/tools/fgl/tax-rate-list.js +36 -0
  91. package/dist/tools/fgl/tax-rate-list.js.map +1 -0
  92. package/dist/tools/fgl/trial-balance-get.d.ts +3 -0
  93. package/dist/tools/fgl/trial-balance-get.d.ts.map +1 -0
  94. package/dist/tools/fgl/trial-balance-get.js +56 -0
  95. package/dist/tools/fgl/trial-balance-get.js.map +1 -0
  96. package/dist/tools/fgl/trial-balance-template-list.d.ts +3 -0
  97. package/dist/tools/fgl/trial-balance-template-list.d.ts.map +1 -0
  98. package/dist/tools/fgl/trial-balance-template-list.js +43 -0
  99. package/dist/tools/fgl/trial-balance-template-list.js.map +1 -0
  100. package/dist/tools/fnd/index.d.ts +0 -8
  101. package/dist/tools/fnd/index.d.ts.map +1 -1
  102. package/dist/tools/fnd/index.js +2 -9
  103. package/dist/tools/fnd/index.js.map +1 -1
  104. package/dist/tools/imports/index.d.ts +179 -0
  105. package/dist/tools/imports/index.d.ts.map +1 -0
  106. package/dist/tools/imports/index.js +100 -0
  107. package/dist/tools/imports/index.js.map +1 -0
  108. package/dist/tools/role-mapping.d.ts.map +1 -1
  109. package/dist/tools/role-mapping.js +5 -0
  110. package/dist/tools/role-mapping.js.map +1 -1
  111. package/dist/tools/sfa/lead-import.d.ts +0 -10
  112. package/dist/tools/sfa/lead-import.d.ts.map +1 -1
  113. package/dist/tools/sfa/lead-import.js +11 -49
  114. package/dist/tools/sfa/lead-import.js.map +1 -1
  115. package/dist/tools/types.d.ts +2 -0
  116. package/dist/tools/types.d.ts.map +1 -1
  117. package/dist/tools/types.js +2 -0
  118. package/dist/tools/types.js.map +1 -1
  119. package/dist/tools/wrm/wrm-agent-run-cost-summary.js +2 -2
  120. package/dist/tools/wrm/wrm-agent-run-cost-summary.js.map +1 -1
  121. package/dist/tools/wrm/wrm-agent-run-create.js +2 -2
  122. package/dist/tools/wrm/wrm-agent-run-create.js.map +1 -1
  123. package/dist/tools/wrm/wrm-agent-run-list.js +3 -3
  124. package/dist/tools/wrm/wrm-agent-run-list.js.map +1 -1
  125. package/dist/wrm/projection.js +1 -1
  126. package/dist/wrm/projection.js.map +1 -1
  127. package/dist/wrm/types.d.ts +1 -1
  128. package/dist/wrm/types.d.ts.map +1 -1
  129. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const combinationListTool: Tool;
3
+ //# sourceMappingURL=combination-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combination-list.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/combination-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,mBAAmB,EAAE,IA+CjC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, FGL_NOT_FOUND, API_ERROR } from '../types.js';
3
+ import { FGL_CODE_COMBINATION_SELECT } from '../../fgl/projection.js';
4
+ import { buildCombinationQuery } from '../../fgl/filters.js';
5
+ export const combinationListTool = {
6
+ name: 'fgl_combination_list',
7
+ description: 'List/filter GL code combinations (accounts) for a chart-of-accounts structure. Pass ledger_id ' +
8
+ 'to use that ledger\'s structure, or structure_id directly. Use the returned id as ' +
9
+ 'code_combination_id on fgl_journal_batch_create lines.',
10
+ inputSchema: z.object({
11
+ ledger_id: z.string().optional().describe('Ledger UUID; lists combinations of its chart-of-accounts structure'),
12
+ structure_id: z.string().optional().describe('Chart-of-accounts structure UUID (takes precedence over ledger_id)'),
13
+ search: z.string().optional()
14
+ .describe('Search across concatenated_segments and description (case-insensitive)'),
15
+ account_type: z.string().optional().describe('Filter by account type (e.g. ASSET, LIABILITY, REVENUE, EXPENSE)'),
16
+ enabled: z.boolean().optional().describe('Filter by enabled flag'),
17
+ allow_posting: z.boolean().optional().describe('Filter by allow_posting flag'),
18
+ active: z.boolean().optional().describe('Filter by active flag (default true)'),
19
+ limit: z.number().optional().describe('Max results (default 50, max 200)'),
20
+ offset: z.number().optional().describe('Offset for pagination'),
21
+ order_by: z.string().optional().describe('PostgREST order clause (default: concatenated_segments.asc)'),
22
+ }),
23
+ handler: async (args, ctx) => {
24
+ const input = args;
25
+ const db = ctx.apiClient.dbBasePath;
26
+ try {
27
+ let structureId = input.structure_id;
28
+ if (!structureId && input.ledger_id) {
29
+ const ledgers = await ctx.apiClient.get(`${db}/fgl_ledgers?id=eq.${input.ledger_id}&select=coa_structure_id`);
30
+ if (!ledgers || ledgers.length === 0) {
31
+ return errorResponse(FGL_NOT_FOUND, `Ledger ${input.ledger_id} not found`);
32
+ }
33
+ structureId = ledgers[0].coa_structure_id;
34
+ }
35
+ const { query, limit } = buildCombinationQuery({ ...input, structure_id: structureId });
36
+ const items = await ctx.apiClient.get(`${db}/fgl_code_combinations?select=${FGL_CODE_COMBINATION_SELECT}&${query}`);
37
+ const offset = input.offset ?? 0;
38
+ return successResponse({
39
+ items,
40
+ count: items.length,
41
+ next_offset: items.length === limit ? offset + limit : null,
42
+ });
43
+ }
44
+ catch (error) {
45
+ return errorResponse(API_ERROR, `Failed to list GL code combinations: ${error.message}`);
46
+ }
47
+ },
48
+ };
49
+ //# sourceMappingURL=combination-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combination-list.js","sourceRoot":"","sources":["../../../src/tools/fgl/combination-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,gGAAgG;QAChG,oFAAoF;QACpF,wDAAwD;IAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;QAC/G,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;QAClH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,wEAAwE,CAAC;QACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAChH,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAClE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;KACxG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC;YACH,IAAI,WAAW,GAAuB,KAAK,CAAC,YAAY,CAAC;YACzD,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACrC,GAAG,EAAE,sBAAsB,KAAK,CAAC,SAAS,0BAA0B,CACrE,CAAC;gBACF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,aAAa,CAAC,aAAa,EAAE,UAAU,KAAK,CAAC,SAAS,YAAY,CAAC,CAAC;gBAC7E,CAAC;gBACD,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAC5C,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,EAAE,iCAAiC,2BAA2B,IAAI,KAAK,EAAE,CAC7E,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACjC,OAAO,eAAe,CAAC;gBACrB,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,WAAW,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI;aAC5D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const combinationValidateTool: Tool;
3
+ //# sourceMappingURL=combination-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combination-validate.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/combination-validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAWtC,eAAO,MAAM,uBAAuB,EAAE,IAgCrC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR, FGL_VALIDATION } from '../types.js';
3
+ import { confirmFlagSchema } from '../_shared/side-effect.js';
4
+ const inputSchema = z.object({
5
+ structure_id: z.string().uuid().describe('UUID of the chart-of-accounts structure'),
6
+ segments: z.array(z.string().min(1).max(128)).min(1).max(10)
7
+ .describe('Segment values in structure segment-number order; all defined segments are required'),
8
+ confirm: confirmFlagSchema,
9
+ });
10
+ export const combinationValidateTool = {
11
+ name: 'fgl_combination_validate',
12
+ description: 'Validate and resolve a GL code combination via fgl_validate_combination. May create ' +
13
+ 'segment values and a combination when the structure allows dynamic insertion. Requires ' +
14
+ 'confirm=true; excluded from fgl-readonly. Persist enforces tenant access and requires ' +
15
+ 'FGL JOURNAL_LINES INSERT ALL_RECORDS or CODE_COMBINATIONS INSERT ALL_RECORDS when ' +
16
+ 'dynamically inserting a missing combination. Repeated calls resolve the same natural key.',
17
+ sideEffect: 'state_change',
18
+ confirmation: 'caller_confirms',
19
+ idempotency: 'natural_key',
20
+ // Persist checks alternative permissions conditionally on dynamic insertion.
21
+ // Tool.capabilities is an unconditional AND; the RPC remains authoritative
22
+ // rather than incorrectly requiring both grants for every call.
23
+ inputSchema,
24
+ handler: async (args, ctx) => {
25
+ const parsed = inputSchema.safeParse(args);
26
+ if (!parsed.success) {
27
+ return errorResponse(FGL_VALIDATION, 'A structure UUID, ordered segments and confirm=true are required');
28
+ }
29
+ try {
30
+ const result = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/rpc/fgl_validate_combination`, { p_structure_id: parsed.data.structure_id, p_segments: parsed.data.segments });
31
+ const combinationId = z.string().uuid().parse(result);
32
+ return successResponse({ combination_id: combinationId });
33
+ }
34
+ catch (error) {
35
+ const message = error instanceof Error ? error.message : 'Unknown backend error';
36
+ return errorResponse(API_ERROR, `Failed to validate GL combination: ${message}`);
37
+ }
38
+ },
39
+ };
40
+ //# sourceMappingURL=combination-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combination-validate.js","sourceRoot":"","sources":["../../../src/tools/fgl/combination-validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACnF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;SACzD,QAAQ,CAAC,qFAAqF,CAAC;IAClG,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,0BAA0B;IAChC,WAAW,EACT,sFAAsF;QACtF,yFAAyF;QACzF,wFAAwF;QACxF,oFAAoF;QACpF,2FAA2F;IAC7F,UAAU,EAAE,cAAc;IAC1B,YAAY,EAAE,iBAAiB;IAC/B,WAAW,EAAE,aAAa;IAC1B,6EAA6E;IAC7E,2EAA2E;IAC3E,gEAAgE;IAChE,WAAW;IACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,cAAc,EAAE,kEAAkE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAC9C,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,+BAA+B,EAC1D,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAC/E,CAAC;YACF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,eAAe,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;YACjF,OAAO,aAAa,CAAC,SAAS,EAAE,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dailyRateGetTool: Tool;
3
+ //# sourceMappingURL=daily-rate-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-rate-get.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/daily-rate-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,gBAAgB,EAAE,IAmC9B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, FGL_NOT_FOUND, API_ERROR } from '../types.js';
3
+ import { FGL_DAILY_RATE_SELECT } from '../../fgl/projection.js';
4
+ export const dailyRateGetTool = {
5
+ name: 'fgl_daily_rate_get',
6
+ description: 'Get a daily exchange rate for a currency pair and date. Returns the rate row matching ' +
7
+ 'the given from/to currencies and rate date.',
8
+ inputSchema: z.object({
9
+ from_currency: z.string().describe('ISO currency code to convert from'),
10
+ to_currency: z.string().describe('ISO currency code to convert to'),
11
+ rate_date: z.string().describe('Rate date (ISO 8601 date, e.g. 2026-01-15)'),
12
+ rate_type: z.string().optional().describe('Rate type filter (e.g. SPOT, CORPORATE)'),
13
+ }),
14
+ handler: async (args, ctx) => {
15
+ const input = args;
16
+ try {
17
+ let url = `${ctx.apiClient.dbBasePath}/fnd_daily_rates?select=${FGL_DAILY_RATE_SELECT}` +
18
+ `&from_currency_code=eq.${input.from_currency}` +
19
+ `&to_currency_code=eq.${input.to_currency}` +
20
+ `&conversion_date=eq.${input.rate_date}`;
21
+ if (input.rate_type) {
22
+ url += `&conversion_rate_type_code=eq.${input.rate_type}`;
23
+ }
24
+ url += '&limit=1';
25
+ const items = await ctx.apiClient.get(url);
26
+ if (!items || items.length === 0) {
27
+ return errorResponse(FGL_NOT_FOUND, `Daily rate not found for ${input.from_currency}→${input.to_currency} on ${input.rate_date}`);
28
+ }
29
+ return successResponse(items[0]);
30
+ }
31
+ catch (error) {
32
+ return errorResponse(API_ERROR, `Failed to get daily rate: ${error.message}`);
33
+ }
34
+ },
35
+ };
36
+ //# sourceMappingURL=daily-rate-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-rate-get.js","sourceRoot":"","sources":["../../../src/tools/fgl/daily-rate-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,wFAAwF;QACxF,6CAA6C;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KACrF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,IAAI,GAAG,GACL,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,2BAA2B,qBAAqB,EAAE;gBAC7E,0BAA0B,KAAK,CAAC,aAAa,EAAE;gBAC/C,wBAAwB,KAAK,CAAC,WAAW,EAAE;gBAC3C,uBAAuB,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,GAAG,IAAI,iCAAiC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5D,CAAC;YACD,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAiB,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,aAAa,CAClB,aAAa,EACb,4BAA4B,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,OAAO,KAAK,CAAC,SAAS,EAAE,CAC7F,CAAC;YACJ,CAAC;YACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const fglTools: Tool[];
3
+ export declare const fglReadOnlyTools: Tool[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA8CtC,eAAO,MAAM,QAAQ,EAAE,IAAI,EAAwC,CAAC;AAEpE,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAAiB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { ledgerListTool } from './ledger-list.js';
2
+ import { ledgerGetTool } from './ledger-get.js';
3
+ import { periodListTool } from './period-list.js';
4
+ import { periodOpenTool } from './period-open.js';
5
+ import { periodCloseTool } from './period-close.js';
6
+ import { combinationValidateTool } from './combination-validate.js';
7
+ import { combinationGetTool } from './combination-get.js';
8
+ import { journalBatchCreateTool } from './journal-batch-create.js';
9
+ import { journalBatchGetTool } from './journal-batch-get.js';
10
+ import { journalBatchListTool } from './journal-batch-list.js';
11
+ import { journalBatchPostTool } from './journal-batch-post.js';
12
+ import { journalHeaderReverseTool } from './journal-header-reverse.js';
13
+ import { trialBalanceGetTool } from './trial-balance-get.js';
14
+ import { taxRateListTool } from './tax-rate-list.js';
15
+ import { dailyRateGetTool } from './daily-rate-get.js';
16
+ import { combinationListTool } from './combination-list.js';
17
+ import { journalHeaderListTool } from './journal-header-list.js';
18
+ import { periodCloseStatusTool } from './period-close-status.js';
19
+ import { trialBalanceTemplateListTool } from './trial-balance-template-list.js';
20
+ const fglReadTools = [
21
+ ledgerListTool,
22
+ ledgerGetTool,
23
+ periodListTool,
24
+ periodCloseStatusTool,
25
+ combinationListTool,
26
+ combinationGetTool,
27
+ journalBatchGetTool,
28
+ journalBatchListTool,
29
+ journalHeaderListTool,
30
+ trialBalanceTemplateListTool,
31
+ trialBalanceGetTool,
32
+ taxRateListTool,
33
+ dailyRateGetTool,
34
+ ];
35
+ const fglWriteTools = [
36
+ combinationValidateTool,
37
+ periodOpenTool,
38
+ periodCloseTool,
39
+ journalBatchCreateTool,
40
+ journalBatchPostTool,
41
+ journalHeaderReverseTool,
42
+ ];
43
+ export const fglTools = [...fglReadTools, ...fglWriteTools];
44
+ export const fglReadOnlyTools = fglReadTools;
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/fgl/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAEhF,MAAM,YAAY,GAAW;IAC3B,cAAc;IACd,aAAa;IACb,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,4BAA4B;IAC5B,mBAAmB;IACnB,eAAe;IACf,gBAAgB;CACjB,CAAC;AAEF,MAAM,aAAa,GAAW;IAC5B,uBAAuB;IACvB,cAAc;IACd,eAAe;IACf,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAW,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,gBAAgB,GAAW,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const journalBatchCreateTool: Tool;
3
+ //# sourceMappingURL=journal-batch-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-create.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA6CtC,eAAO,MAAM,sBAAsB,EAAE,IA6LpC,CAAC"}
@@ -0,0 +1,198 @@
1
+ import { createHash } from 'crypto';
2
+ import { z } from 'zod';
3
+ import { canonicalJson } from '../../contracts/persist-resource-contract.js';
4
+ import { successResponse, errorResponse, API_ERROR, FGL_NOT_FOUND, FGL_VALIDATION } from '../types.js';
5
+ import { confirmFlagSchema, idempotencyKeySchema, writeHeadersWithIdempotency } from '../_shared/side-effect.js';
6
+ const amount = z.number().min(0);
7
+ const journalLineSchema = z.object({
8
+ line_number: z.number().int().positive().describe('Line sequence number within the header'),
9
+ code_combination_id: z.string().describe('UUID of the GL code combination (see fgl_combination_list)'),
10
+ entered_debit: amount.optional().describe('Debit amount in the header currency'),
11
+ entered_credit: amount.optional().describe('Credit amount in the header currency'),
12
+ accounted_debit: amount.optional()
13
+ .describe('Debit in the ledger functional currency (default: entered, or entered x conversion_rate)'),
14
+ accounted_credit: amount.optional()
15
+ .describe('Credit in the ledger functional currency (default: entered, or entered x conversion_rate)'),
16
+ conversion_rate: z.number().positive().optional()
17
+ .describe('Rate from header currency to functional currency; required for foreign-currency lines without accounted amounts'),
18
+ description: z.string().optional().describe('Line description'),
19
+ });
20
+ const journalHeaderSchema = z.object({
21
+ journal_name: z.string().describe('Display name of the journal entry'),
22
+ period_id: z.string().describe('UUID of the GL period the journal posts to'),
23
+ journal_date: z.string().optional().describe('Journal date (ISO 8601, defaults to batch_date or today)'),
24
+ currency_code: z.string().optional().describe('ISO currency code for entered amounts (default: ledger functional currency)'),
25
+ description: z.string().optional().describe('Journal description'),
26
+ lines: z.array(journalLineSchema).min(1).describe('Journal lines. Entered debits must equal entered credits.'),
27
+ });
28
+ const cents = (n) => Math.round((n ?? 0) * 100);
29
+ const fromCents = (c) => c / 100;
30
+ /** Hash of the caller's input, excluding fields that do not change what is created. */
31
+ function inputFingerprint(input) {
32
+ const { confirm: _confirm, idempotency_key: _key, ...rest } = input;
33
+ return createHash('sha256').update(canonicalJson(rest), 'utf8').digest('hex');
34
+ }
35
+ export const journalBatchCreateTool = {
36
+ name: 'fgl_journal_batch_create',
37
+ description: 'Create a GL journal batch with headers and lines using sequential PostgREST inserts ' +
38
+ '(fgl_journal_batches, then fgl_journal_headers, then fgl_journal_lines), all with status ' +
39
+ 'UNPOSTED. The operation is not atomic: if an insert fails, the error details list the batch, ' +
40
+ 'header and line records already created. Every line needs exactly one positive debit or credit ' +
41
+ 'and every header must balance on entered amounts (checked before any insert). With an ' +
42
+ 'idempotency_key, a retry with identical input returns the original batch (replayed=true) ' +
43
+ 'instead of creating a duplicate; reusing a key with different input is rejected. Nothing is ' +
44
+ 'posted; call fgl_journal_batch_post to validate and post. Requires confirm=true.',
45
+ sideEffect: 'state_change',
46
+ confirmation: 'caller_confirms',
47
+ idempotency: 'explicit_key',
48
+ inputSchema: z.object({
49
+ ledger_id: z.string().describe('UUID of the ledger'),
50
+ batch_name: z.string().describe('Display name of the batch'),
51
+ batch_date: z.string().optional().describe('Default journal date for headers (ISO 8601, defaults to today)'),
52
+ description: z.string().optional().describe('Batch description'),
53
+ headers: z.array(journalHeaderSchema).min(1)
54
+ .describe('Journal headers, each with their own lines'),
55
+ confirm: confirmFlagSchema,
56
+ idempotency_key: idempotencyKeySchema,
57
+ }),
58
+ handler: async (args, ctx) => {
59
+ const input = args;
60
+ const db = ctx.apiClient.dbBasePath;
61
+ const created = { header_ids: [], line_count: 0 };
62
+ try {
63
+ for (const [i, header] of input.headers.entries()) {
64
+ let dr = 0;
65
+ let cr = 0;
66
+ for (const line of header.lines) {
67
+ const isDebit = cents(line.entered_debit) > 0;
68
+ if (isDebit === cents(line.entered_credit) > 0) {
69
+ return errorResponse(FGL_VALIDATION, `Header ${i + 1} line ${line.line_number}: set exactly one of entered_debit or entered_credit to a positive amount`);
70
+ }
71
+ if (cents(isDebit ? line.accounted_credit : line.accounted_debit) > 0) {
72
+ return errorResponse(FGL_VALIDATION, `Header ${i + 1} line ${line.line_number}: accounted amount must be on the same side as the entered amount`);
73
+ }
74
+ dr += cents(line.entered_debit);
75
+ cr += cents(line.entered_credit);
76
+ }
77
+ if (dr !== cr) {
78
+ return errorResponse(FGL_VALIDATION, `Header ${i + 1} (${header.journal_name}) does not balance: debits ${fromCents(dr)} vs credits ${fromCents(cr)}`);
79
+ }
80
+ }
81
+ // PostgREST does not honour Idempotency-Key, so the key and an input fingerprint are
82
+ // recorded on the batch metadata and checked here before anything is inserted.
83
+ const key = input.idempotency_key;
84
+ const fingerprint = inputFingerprint(input);
85
+ if (key) {
86
+ const existing = await ctx.apiClient.get(`${db}/fgl_journal_batches?metadata->>idempotency_key=eq.${encodeURIComponent(key)}` +
87
+ '&select=id,status,metadata&order=created_date.asc&limit=1');
88
+ if (existing && existing.length > 0) {
89
+ const batch = existing[0];
90
+ if (batch.metadata?.idempotency_fingerprint !== fingerprint) {
91
+ return errorResponse(FGL_VALIDATION, `idempotency_key ${key} was already used for batch ${batch.id} with different input; use a new key`);
92
+ }
93
+ const prior = await ctx.apiClient.get(`${db}/fgl_journal_headers?batch_id=eq.${batch.id}&select=id,lines:fgl_journal_lines(id)&order=created_date.asc`);
94
+ const replay = {
95
+ batch_id: batch.id,
96
+ header_ids: prior.map((h) => h.id),
97
+ line_count: prior.reduce((n, h) => n + h.lines.length, 0),
98
+ };
99
+ const expectedLines = input.headers.reduce((n, h) => n + h.lines.length, 0);
100
+ if (replay.header_ids.length !== input.headers.length || replay.line_count !== expectedLines) {
101
+ return errorResponse(API_ERROR, `An earlier attempt with idempotency_key ${key} only partially created batch ${batch.id}; ` +
102
+ 'inspect it with fgl_journal_batch_get, then retry with a new key', { created: replay });
103
+ }
104
+ return successResponse({ ...replay, status: batch.status, replayed: true });
105
+ }
106
+ }
107
+ const ledgers = await ctx.apiClient.get(`${db}/fgl_ledgers?id=eq.${input.ledger_id}&select=functional_currency_code`);
108
+ if (!ledgers || ledgers.length === 0) {
109
+ return errorResponse(FGL_NOT_FOUND, `Ledger ${input.ledger_id} not found`);
110
+ }
111
+ const functional = ledgers[0].functional_currency_code;
112
+ const today = new Date().toISOString().slice(0, 10);
113
+ const defaultDate = input.batch_date ?? today;
114
+ const headers = writeHeadersWithIdempotency(input.idempotency_key);
115
+ const lineRows = [];
116
+ for (const [i, header] of input.headers.entries()) {
117
+ const currency = header.currency_code ?? functional;
118
+ const rows = [];
119
+ for (const line of header.lines) {
120
+ // Persist requires exactly one side of each pair to be positive and the other NULL.
121
+ const isDebit = cents(line.entered_debit) > 0;
122
+ const entered = isDebit ? line.entered_debit : line.entered_credit;
123
+ let accounted = isDebit ? line.accounted_debit : line.accounted_credit;
124
+ if (accounted === undefined) {
125
+ if (currency === functional) {
126
+ accounted = entered;
127
+ }
128
+ else if (line.conversion_rate !== undefined) {
129
+ accounted = fromCents(Math.round(entered * line.conversion_rate * 100));
130
+ }
131
+ else {
132
+ return errorResponse(FGL_VALIDATION, `Header ${i + 1} line ${line.line_number}: ${currency} differs from functional currency ${functional}; ` +
133
+ 'supply accounted_debit/accounted_credit or conversion_rate');
134
+ }
135
+ }
136
+ if (cents(accounted) <= 0) {
137
+ return errorResponse(FGL_VALIDATION, `Header ${i + 1} line ${line.line_number}: accounted amount must be positive (got ${accounted})`);
138
+ }
139
+ const row = {
140
+ line_number: line.line_number,
141
+ code_combination_id: line.code_combination_id,
142
+ currency_code: currency,
143
+ entered_dr: isDebit ? entered : null,
144
+ entered_cr: isDebit ? null : entered,
145
+ accounted_dr: isDebit ? accounted : null,
146
+ accounted_cr: isDebit ? null : accounted,
147
+ };
148
+ if (line.conversion_rate !== undefined)
149
+ row.conversion_rate = line.conversion_rate;
150
+ if (line.description !== undefined)
151
+ row.description = line.description;
152
+ rows.push(row);
153
+ }
154
+ lineRows.push(rows);
155
+ }
156
+ const batchBody = {
157
+ ledger_id: input.ledger_id,
158
+ batch_name: input.batch_name,
159
+ status: 'UNPOSTED',
160
+ };
161
+ if (input.description !== undefined)
162
+ batchBody.description = input.description;
163
+ if (key)
164
+ batchBody.metadata = { idempotency_key: key, idempotency_fingerprint: fingerprint };
165
+ const batchRes = await ctx.apiClient.post(`${db}/fgl_journal_batches`, batchBody, { headers });
166
+ created.batch_id = batchRes[0].id;
167
+ for (const [i, header] of input.headers.entries()) {
168
+ const headerBody = {
169
+ batch_id: created.batch_id,
170
+ ledger_id: input.ledger_id,
171
+ period_id: header.period_id,
172
+ journal_name: header.journal_name,
173
+ journal_date: header.journal_date ?? defaultDate,
174
+ currency_code: header.currency_code ?? functional,
175
+ status: 'UNPOSTED',
176
+ };
177
+ if (header.description !== undefined)
178
+ headerBody.description = header.description;
179
+ const headerRes = await ctx.apiClient.post(`${db}/fgl_journal_headers`, headerBody, { headers });
180
+ const headerId = headerRes[0].id;
181
+ created.header_ids.push(headerId);
182
+ await ctx.apiClient.post(`${db}/fgl_journal_lines`, lineRows[i].map((r) => ({ ...r, header_id: headerId })), { headers });
183
+ created.line_count += lineRows[i].length;
184
+ }
185
+ return successResponse({
186
+ batch_id: created.batch_id,
187
+ header_ids: created.header_ids,
188
+ line_count: created.line_count,
189
+ status: 'UNPOSTED',
190
+ });
191
+ }
192
+ catch (error) {
193
+ const partial = created.batch_id !== undefined;
194
+ return errorResponse(API_ERROR, `Failed to create GL journal batch${partial ? ' (partially created; see details)' : ''}: ${error.message}`, partial ? { created } : undefined);
195
+ }
196
+ },
197
+ };
198
+ //# sourceMappingURL=journal-batch-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-create.js","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const journalBatchGetTool: Tool;
3
+ //# sourceMappingURL=journal-batch-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-get.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,mBAAmB,EAAE,IA2BjC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, FGL_NOT_FOUND, API_ERROR } from '../types.js';
3
+ import { FGL_JOURNAL_BATCH_SELECT, FGL_JOURNAL_HEADER_WITH_LINES_SELECT } from '../../fgl/projection.js';
4
+ export const journalBatchGetTool = {
5
+ name: 'fgl_journal_batch_get',
6
+ description: 'Get a single GL journal batch by ID (UUID), with its journal headers and their lines. ' +
7
+ 'Header ids are what fgl_journal_header_reverse takes.',
8
+ inputSchema: z.object({
9
+ id: z.string().describe('UUID of the journal batch'),
10
+ }),
11
+ handler: async (args, ctx) => {
12
+ const { id } = args;
13
+ const db = ctx.apiClient.dbBasePath;
14
+ try {
15
+ const items = await ctx.apiClient.get(`${db}/fgl_journal_batches?id=eq.${id}&select=${FGL_JOURNAL_BATCH_SELECT}`);
16
+ if (!items || items.length === 0) {
17
+ return errorResponse(FGL_NOT_FOUND, `Journal batch ${id} not found`);
18
+ }
19
+ const headers = await ctx.apiClient.get(`${db}/fgl_journal_headers?batch_id=eq.${id}&select=${FGL_JOURNAL_HEADER_WITH_LINES_SELECT}` +
20
+ '&order=journal_date.asc,journal_name.asc&lines.order=line_number.asc');
21
+ return successResponse({ ...items[0], headers });
22
+ }
23
+ catch (error) {
24
+ return errorResponse(API_ERROR, `Failed to get GL journal batch: ${error.message}`);
25
+ }
26
+ },
27
+ };
28
+ //# sourceMappingURL=journal-batch-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-get.js","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAGzG,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,wFAAwF;QACxF,uDAAuD;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACrD,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAsB,CAAC;QACtC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,EAAE,8BAA8B,EAAE,WAAW,wBAAwB,EAAE,CAC3E,CAAC;YACF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,aAAa,CAAC,aAAa,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACrC,GAAG,EAAE,oCAAoC,EAAE,WAAW,oCAAoC,EAAE;gBAC1F,sEAAsE,CACzE,CAAC;YACF,OAAO,eAAe,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const journalBatchListTool: Tool;
3
+ //# sourceMappingURL=journal-batch-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-list.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,oBAAoB,EAAE,IA+BlC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { FGL_JOURNAL_BATCH_SELECT } from '../../fgl/projection.js';
4
+ import { buildJournalBatchQuery } from '../../fgl/filters.js';
5
+ export const journalBatchListTool = {
6
+ name: 'fgl_journal_batch_list',
7
+ description: 'List/filter GL journal batches',
8
+ inputSchema: z.object({
9
+ ledger_id: z.string().optional().describe('Filter by ledger UUID'),
10
+ status: z.union([z.string(), z.array(z.string())]).optional()
11
+ .describe('Filter by batch status (single or array, e.g. UNPOSTED, POSTED, ERROR)'),
12
+ search: z.string().optional().describe('Search across batch_name (case-insensitive)'),
13
+ active: z.boolean().optional().describe('Filter by active flag (default true)'),
14
+ limit: z.number().optional().describe('Max results (default 50, max 200)'),
15
+ offset: z.number().optional().describe('Offset for pagination'),
16
+ order_by: z.string().optional().describe('PostgREST order clause (default: created_date.desc)'),
17
+ }),
18
+ handler: async (args, ctx) => {
19
+ const input = args;
20
+ try {
21
+ const { query, limit } = buildJournalBatchQuery(input);
22
+ const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/fgl_journal_batches?select=${FGL_JOURNAL_BATCH_SELECT}&${query}`, { headers: { Prefer: 'count=exact' } });
23
+ const offset = input.offset ?? 0;
24
+ return successResponse({
25
+ items,
26
+ count: items.length,
27
+ next_offset: items.length === limit ? offset + limit : null,
28
+ });
29
+ }
30
+ catch (error) {
31
+ return errorResponse(API_ERROR, `Failed to list GL journal batches: ${error.message}`);
32
+ }
33
+ },
34
+ };
35
+ //# sourceMappingURL=journal-batch-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-list.js","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,gCAAgC;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC1D,QAAQ,CAAC,wEAAwE,CAAC;QACrF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACrF,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KAChG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,+BAA+B,wBAAwB,IAAI,KAAK,EAAE,EAC7F,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CACvC,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACjC,OAAO,eAAe,CAAC;gBACrB,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,WAAW,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI;aAC5D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const journalBatchPostTool: Tool;
3
+ //# sourceMappingURL=journal-batch-post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-post.d.ts","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-post.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,oBAAoB,EAAE,IAwClC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { confirmFlagSchema } from '../_shared/side-effect.js';
4
+ import { FGL_JOURNAL_BATCH_SELECT, FGL_JOURNAL_HEADER_SELECT } from '../../fgl/projection.js';
5
+ export const journalBatchPostTool = {
6
+ name: 'fgl_journal_batch_post',
7
+ description: 'Post a GL journal batch. Calls the fgl_post_batch RPC, which validates every UNPOSTED ' +
8
+ 'header (period open, code combinations enabled, balanced) and updates balances. Headers that ' +
9
+ 'fail validation are marked ERROR rather than raising, so the result reports the resulting ' +
10
+ 'batch status and any header errors. Posting is irreversible — posted headers can be reversed ' +
11
+ 'but the batch cannot be un-posted. Requires confirm=true.',
12
+ sideEffect: 'command',
13
+ confirmation: 'caller_confirms',
14
+ idempotency: 'natural_key',
15
+ inputSchema: z.object({
16
+ batch_id: z.string().describe('UUID of the journal batch to post'),
17
+ confirm: confirmFlagSchema,
18
+ }),
19
+ handler: async (args, ctx) => {
20
+ const input = args;
21
+ const db = ctx.apiClient.dbBasePath;
22
+ try {
23
+ await ctx.apiClient.post(`${db}/rpc/fgl_post_batch`, { p_batch_id: input.batch_id });
24
+ const batches = await ctx.apiClient.get(`${db}/fgl_journal_batches?id=eq.${input.batch_id}&select=${FGL_JOURNAL_BATCH_SELECT}`);
25
+ const headers = await ctx.apiClient.get(`${db}/fgl_journal_headers?batch_id=eq.${input.batch_id}&select=${FGL_JOURNAL_HEADER_SELECT}`);
26
+ const batch = batches?.[0] ?? null;
27
+ const failed = (headers ?? []).filter((h) => h.status === 'ERROR');
28
+ if (batch?.status === 'ERROR' || failed.length > 0) {
29
+ return errorResponse(API_ERROR, `GL journal batch ${input.batch_id} was not fully posted`, { batch, header_errors: failed.map((h) => ({ id: h.id, journal_name: h.journal_name, error_text: h.error_text })) });
30
+ }
31
+ return successResponse({ batch, headers });
32
+ }
33
+ catch (error) {
34
+ return errorResponse(API_ERROR, `Failed to post GL journal batch: ${error.message}`);
35
+ }
36
+ },
37
+ };
38
+ //# sourceMappingURL=journal-batch-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-batch-post.js","sourceRoot":"","sources":["../../../src/tools/fgl/journal-batch-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAG9F,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,wFAAwF;QACxF,+FAA+F;QAC/F,4FAA4F;QAC5F,+FAA+F;QAC/F,2DAA2D;IAC7D,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,iBAAiB;IAC/B,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClE,OAAO,EAAE,iBAAiB;KAC3B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2C,CAAC;QAC1D,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACrC,GAAG,EAAE,8BAA8B,KAAK,CAAC,QAAQ,WAAW,wBAAwB,EAAE,CACvF,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACrC,GAAG,EAAE,oCAAoC,KAAK,CAAC,QAAQ,WAAW,yBAAyB,EAAE,CAC9F,CAAC;YACF,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;YACnE,IAAI,KAAK,EAAE,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,aAAa,CAClB,SAAS,EACT,oBAAoB,KAAK,CAAC,QAAQ,uBAAuB,EACzD,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CACpH,CAAC;YACJ,CAAC;YACD,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const journalHeaderListTool: Tool;
3
+ //# sourceMappingURL=journal-header-list.d.ts.map