@rustledger/mcp-server 0.2.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -3
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +585 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/docs/bql-functions.md +41 -0
- package/dist/docs/bql-tables.md +26 -0
- package/dist/docs/bql.md +62 -0
- package/dist/docs/directives.md +67 -0
- package/dist/docs/validation-errors.md +40 -0
- package/dist/handlers.d.ts +6 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +558 -0
- package/dist/handlers.js.map +1 -0
- package/dist/helpers.d.ts +31 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +109 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.js +24 -421
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +24 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +122 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +19 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +94 -0
- package/dist/resources.js.map +1 -0
- package/dist/tools.d.ts +36 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +475 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +140 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +7 -4
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
// Tool handlers for the MCP server
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import * as rustledger from "@rustledger/wasm";
|
|
5
|
+
import { validateArgs, errorResponse, textResponse, jsonResponse, formatErrors, formatQueryResult, } from "./helpers.js";
|
|
6
|
+
import { getBqlTablesDocs } from "./resources.js";
|
|
7
|
+
/**
|
|
8
|
+
* Handle a tool call and return the response.
|
|
9
|
+
*/
|
|
10
|
+
export function handleToolCall(name, args) {
|
|
11
|
+
switch (name) {
|
|
12
|
+
// === Original Tools ===
|
|
13
|
+
case "validate":
|
|
14
|
+
return handleValidate(args);
|
|
15
|
+
case "query":
|
|
16
|
+
return handleQuery(args);
|
|
17
|
+
case "balances":
|
|
18
|
+
return handleBalances(args);
|
|
19
|
+
case "format":
|
|
20
|
+
return handleFormat(args);
|
|
21
|
+
case "parse":
|
|
22
|
+
return handleParse(args);
|
|
23
|
+
case "completions":
|
|
24
|
+
return handleCompletions(args);
|
|
25
|
+
case "list_plugins":
|
|
26
|
+
return handleListPlugins();
|
|
27
|
+
case "run_plugin":
|
|
28
|
+
return handleRunPlugin(args);
|
|
29
|
+
// === Editor Tools ===
|
|
30
|
+
case "editor_completions":
|
|
31
|
+
return handleEditorCompletions(args);
|
|
32
|
+
case "editor_hover":
|
|
33
|
+
return handleEditorHover(args);
|
|
34
|
+
case "editor_definition":
|
|
35
|
+
return handleEditorDefinition(args);
|
|
36
|
+
case "editor_document_symbols":
|
|
37
|
+
return handleEditorDocumentSymbols(args);
|
|
38
|
+
case "editor_references":
|
|
39
|
+
return handleEditorReferences(args);
|
|
40
|
+
// === Analysis Tools ===
|
|
41
|
+
case "ledger_stats":
|
|
42
|
+
return handleLedgerStats(args);
|
|
43
|
+
case "list_accounts":
|
|
44
|
+
return handleListAccounts(args);
|
|
45
|
+
case "list_commodities":
|
|
46
|
+
return handleListCommodities(args);
|
|
47
|
+
case "account_activity":
|
|
48
|
+
return handleAccountActivity(args);
|
|
49
|
+
// === Utility Tools ===
|
|
50
|
+
case "format_check":
|
|
51
|
+
return handleFormatCheck(args);
|
|
52
|
+
case "bql_tables":
|
|
53
|
+
return handleBqlTables();
|
|
54
|
+
case "directive_at_line":
|
|
55
|
+
return handleDirectiveAtLine(args);
|
|
56
|
+
case "find_transactions":
|
|
57
|
+
return handleFindTransactions(args);
|
|
58
|
+
// === Report Tool ===
|
|
59
|
+
case "report":
|
|
60
|
+
return handleReport(args);
|
|
61
|
+
// === File Operation Tools ===
|
|
62
|
+
case "validate_file":
|
|
63
|
+
return handleValidateFile(args);
|
|
64
|
+
case "query_file":
|
|
65
|
+
return handleQueryFile(args);
|
|
66
|
+
case "format_file":
|
|
67
|
+
return handleFormatFile(args);
|
|
68
|
+
default:
|
|
69
|
+
return errorResponse(`Unknown tool: ${name}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// === Original Tools ===
|
|
73
|
+
function handleValidate(args) {
|
|
74
|
+
const validation = validateArgs(args, ["source"]);
|
|
75
|
+
if (validation)
|
|
76
|
+
return validation;
|
|
77
|
+
const source = args.source;
|
|
78
|
+
const result = rustledger.validateSource(source);
|
|
79
|
+
return textResponse(result.valid
|
|
80
|
+
? "Ledger is valid."
|
|
81
|
+
: `Found ${result.errors.length} error(s):\n${formatErrors(result.errors)}`);
|
|
82
|
+
}
|
|
83
|
+
function handleQuery(args) {
|
|
84
|
+
const validation = validateArgs(args, ["source", "query"]);
|
|
85
|
+
if (validation)
|
|
86
|
+
return validation;
|
|
87
|
+
const result = rustledger.query(args.source, args.query);
|
|
88
|
+
if (result.errors?.length > 0) {
|
|
89
|
+
return errorResponse(formatErrors(result.errors));
|
|
90
|
+
}
|
|
91
|
+
return textResponse(formatQueryResult(result));
|
|
92
|
+
}
|
|
93
|
+
function handleBalances(args) {
|
|
94
|
+
const validation = validateArgs(args, ["source"]);
|
|
95
|
+
if (validation)
|
|
96
|
+
return validation;
|
|
97
|
+
const result = rustledger.balances(args.source);
|
|
98
|
+
if (result.errors?.length > 0) {
|
|
99
|
+
return errorResponse(formatErrors(result.errors));
|
|
100
|
+
}
|
|
101
|
+
return textResponse(formatQueryResult(result));
|
|
102
|
+
}
|
|
103
|
+
function handleFormat(args) {
|
|
104
|
+
const validation = validateArgs(args, ["source"]);
|
|
105
|
+
if (validation)
|
|
106
|
+
return validation;
|
|
107
|
+
const result = rustledger.format(args.source);
|
|
108
|
+
if (result.errors?.length > 0) {
|
|
109
|
+
return errorResponse(formatErrors(result.errors));
|
|
110
|
+
}
|
|
111
|
+
return textResponse(result.formatted || "");
|
|
112
|
+
}
|
|
113
|
+
function handleParse(args) {
|
|
114
|
+
const validation = validateArgs(args, ["source"]);
|
|
115
|
+
if (validation)
|
|
116
|
+
return validation;
|
|
117
|
+
const result = rustledger.parse(args.source);
|
|
118
|
+
if (result.errors?.length > 0) {
|
|
119
|
+
return errorResponse(formatErrors(result.errors));
|
|
120
|
+
}
|
|
121
|
+
return jsonResponse(result.ledger);
|
|
122
|
+
}
|
|
123
|
+
function handleCompletions(args) {
|
|
124
|
+
const validation = validateArgs(args, ["partial_query", "cursor_pos"]);
|
|
125
|
+
if (validation)
|
|
126
|
+
return validation;
|
|
127
|
+
const result = rustledger.bqlCompletions(args.partial_query, args.cursor_pos);
|
|
128
|
+
return jsonResponse(result);
|
|
129
|
+
}
|
|
130
|
+
function handleListPlugins() {
|
|
131
|
+
const plugins = rustledger.listPlugins();
|
|
132
|
+
return jsonResponse(plugins);
|
|
133
|
+
}
|
|
134
|
+
function handleRunPlugin(args) {
|
|
135
|
+
const validation = validateArgs(args, ["source", "plugin_name"]);
|
|
136
|
+
if (validation)
|
|
137
|
+
return validation;
|
|
138
|
+
const result = rustledger.runPlugin(args.source, args.plugin_name);
|
|
139
|
+
if (result.errors?.length > 0) {
|
|
140
|
+
return errorResponse(formatErrors(result.errors));
|
|
141
|
+
}
|
|
142
|
+
return textResponse(`Plugin processed ${result.directives.length} directives.`);
|
|
143
|
+
}
|
|
144
|
+
// === Editor Tools ===
|
|
145
|
+
function handleEditorCompletions(args) {
|
|
146
|
+
const validation = validateArgs(args, ["source", "line", "character"]);
|
|
147
|
+
if (validation)
|
|
148
|
+
return validation;
|
|
149
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
150
|
+
const result = ledger.getCompletions(args.line, args.character);
|
|
151
|
+
ledger.free();
|
|
152
|
+
return jsonResponse(result);
|
|
153
|
+
}
|
|
154
|
+
function handleEditorHover(args) {
|
|
155
|
+
const validation = validateArgs(args, ["source", "line", "character"]);
|
|
156
|
+
if (validation)
|
|
157
|
+
return validation;
|
|
158
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
159
|
+
const result = ledger.getHoverInfo(args.line, args.character);
|
|
160
|
+
ledger.free();
|
|
161
|
+
if (!result) {
|
|
162
|
+
return textResponse("No hover information available at this position.");
|
|
163
|
+
}
|
|
164
|
+
return jsonResponse(result);
|
|
165
|
+
}
|
|
166
|
+
function handleEditorDefinition(args) {
|
|
167
|
+
const validation = validateArgs(args, ["source", "line", "character"]);
|
|
168
|
+
if (validation)
|
|
169
|
+
return validation;
|
|
170
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
171
|
+
const result = ledger.getDefinition(args.line, args.character);
|
|
172
|
+
ledger.free();
|
|
173
|
+
if (!result) {
|
|
174
|
+
return textResponse("No definition found at this position.");
|
|
175
|
+
}
|
|
176
|
+
return jsonResponse(result);
|
|
177
|
+
}
|
|
178
|
+
function handleEditorDocumentSymbols(args) {
|
|
179
|
+
const validation = validateArgs(args, ["source"]);
|
|
180
|
+
if (validation)
|
|
181
|
+
return validation;
|
|
182
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
183
|
+
const result = ledger.getDocumentSymbols();
|
|
184
|
+
ledger.free();
|
|
185
|
+
return jsonResponse(result);
|
|
186
|
+
}
|
|
187
|
+
function handleEditorReferences(args) {
|
|
188
|
+
const validation = validateArgs(args, ["source", "line", "character"]);
|
|
189
|
+
if (validation)
|
|
190
|
+
return validation;
|
|
191
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
192
|
+
const result = ledger.getReferences(args.line, args.character);
|
|
193
|
+
ledger.free();
|
|
194
|
+
if (!result) {
|
|
195
|
+
return textResponse("No references found at this position.");
|
|
196
|
+
}
|
|
197
|
+
return jsonResponse(result);
|
|
198
|
+
}
|
|
199
|
+
// === Analysis Tools ===
|
|
200
|
+
function handleLedgerStats(args) {
|
|
201
|
+
const validation = validateArgs(args, ["source"]);
|
|
202
|
+
if (validation)
|
|
203
|
+
return validation;
|
|
204
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
205
|
+
const directives = ledger.getDirectives();
|
|
206
|
+
const stats = {
|
|
207
|
+
total_directives: directives.length,
|
|
208
|
+
transactions: 0,
|
|
209
|
+
open_accounts: 0,
|
|
210
|
+
close_accounts: 0,
|
|
211
|
+
balance_assertions: 0,
|
|
212
|
+
commodities: 0,
|
|
213
|
+
prices: 0,
|
|
214
|
+
events: 0,
|
|
215
|
+
notes: 0,
|
|
216
|
+
documents: 0,
|
|
217
|
+
pads: 0,
|
|
218
|
+
queries: 0,
|
|
219
|
+
custom: 0,
|
|
220
|
+
unique_accounts: new Set(),
|
|
221
|
+
unique_currencies: new Set(),
|
|
222
|
+
date_range: { first: "", last: "" },
|
|
223
|
+
is_valid: ledger.isValid(),
|
|
224
|
+
error_count: ledger.getErrors().length,
|
|
225
|
+
};
|
|
226
|
+
for (const d of directives) {
|
|
227
|
+
if (!stats.date_range.first || d.date < stats.date_range.first) {
|
|
228
|
+
stats.date_range.first = d.date;
|
|
229
|
+
}
|
|
230
|
+
if (!stats.date_range.last || d.date > stats.date_range.last) {
|
|
231
|
+
stats.date_range.last = d.date;
|
|
232
|
+
}
|
|
233
|
+
switch (d.type) {
|
|
234
|
+
case "transaction":
|
|
235
|
+
stats.transactions++;
|
|
236
|
+
for (const p of d.postings) {
|
|
237
|
+
stats.unique_accounts.add(p.account);
|
|
238
|
+
if (p.units?.currency) {
|
|
239
|
+
stats.unique_currencies.add(p.units.currency);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
case "open":
|
|
244
|
+
stats.open_accounts++;
|
|
245
|
+
stats.unique_accounts.add(d.account);
|
|
246
|
+
break;
|
|
247
|
+
case "close":
|
|
248
|
+
stats.close_accounts++;
|
|
249
|
+
break;
|
|
250
|
+
case "balance":
|
|
251
|
+
stats.balance_assertions++;
|
|
252
|
+
break;
|
|
253
|
+
case "commodity":
|
|
254
|
+
stats.commodities++;
|
|
255
|
+
stats.unique_currencies.add(d.currency);
|
|
256
|
+
break;
|
|
257
|
+
case "price":
|
|
258
|
+
stats.prices++;
|
|
259
|
+
break;
|
|
260
|
+
case "event":
|
|
261
|
+
stats.events++;
|
|
262
|
+
break;
|
|
263
|
+
case "note":
|
|
264
|
+
stats.notes++;
|
|
265
|
+
break;
|
|
266
|
+
case "document":
|
|
267
|
+
stats.documents++;
|
|
268
|
+
break;
|
|
269
|
+
case "pad":
|
|
270
|
+
stats.pads++;
|
|
271
|
+
break;
|
|
272
|
+
case "query":
|
|
273
|
+
stats.queries++;
|
|
274
|
+
break;
|
|
275
|
+
case "custom":
|
|
276
|
+
stats.custom++;
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
ledger.free();
|
|
281
|
+
// Destructure to exclude Set fields, then build clean output
|
|
282
|
+
const { unique_accounts, unique_currencies, ...baseStats } = stats;
|
|
283
|
+
const output = {
|
|
284
|
+
...baseStats,
|
|
285
|
+
account_count: unique_accounts.size,
|
|
286
|
+
currency_count: unique_currencies.size,
|
|
287
|
+
currencies: Array.from(unique_currencies),
|
|
288
|
+
};
|
|
289
|
+
return jsonResponse(output);
|
|
290
|
+
}
|
|
291
|
+
function handleListAccounts(args) {
|
|
292
|
+
const validation = validateArgs(args, ["source"]);
|
|
293
|
+
if (validation)
|
|
294
|
+
return validation;
|
|
295
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
296
|
+
const directives = ledger.getDirectives();
|
|
297
|
+
const accounts = {};
|
|
298
|
+
for (const d of directives) {
|
|
299
|
+
if (d.type === "open") {
|
|
300
|
+
accounts[d.account] = {
|
|
301
|
+
open_date: d.date,
|
|
302
|
+
currencies: d.currencies || [],
|
|
303
|
+
booking: d.booking,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
else if (d.type === "close") {
|
|
307
|
+
if (accounts[d.account]) {
|
|
308
|
+
accounts[d.account].close_date = d.date;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
accounts[d.account] = { close_date: d.date, currencies: [] };
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
ledger.free();
|
|
316
|
+
return jsonResponse(accounts);
|
|
317
|
+
}
|
|
318
|
+
function handleListCommodities(args) {
|
|
319
|
+
const validation = validateArgs(args, ["source"]);
|
|
320
|
+
if (validation)
|
|
321
|
+
return validation;
|
|
322
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
323
|
+
const directives = ledger.getDirectives();
|
|
324
|
+
const commodities = new Set();
|
|
325
|
+
for (const d of directives) {
|
|
326
|
+
if (d.type === "commodity") {
|
|
327
|
+
commodities.add(d.currency);
|
|
328
|
+
}
|
|
329
|
+
else if (d.type === "price") {
|
|
330
|
+
commodities.add(d.currency);
|
|
331
|
+
commodities.add(d.amount.currency);
|
|
332
|
+
}
|
|
333
|
+
else if (d.type === "transaction") {
|
|
334
|
+
for (const p of d.postings) {
|
|
335
|
+
if (p.units?.currency) {
|
|
336
|
+
commodities.add(p.units.currency);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
ledger.free();
|
|
342
|
+
return jsonResponse(Array.from(commodities).sort());
|
|
343
|
+
}
|
|
344
|
+
function handleAccountActivity(args) {
|
|
345
|
+
const validation = validateArgs(args, ["source", "account"]);
|
|
346
|
+
if (validation)
|
|
347
|
+
return validation;
|
|
348
|
+
const account = args.account;
|
|
349
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
350
|
+
const directives = ledger.getDirectives();
|
|
351
|
+
const activity = {
|
|
352
|
+
account,
|
|
353
|
+
open_date: null,
|
|
354
|
+
close_date: null,
|
|
355
|
+
first_transaction: null,
|
|
356
|
+
last_transaction: null,
|
|
357
|
+
transaction_count: 0,
|
|
358
|
+
currencies_used: new Set(),
|
|
359
|
+
};
|
|
360
|
+
for (const d of directives) {
|
|
361
|
+
if (d.type === "open" && d.account === account) {
|
|
362
|
+
activity.open_date = d.date;
|
|
363
|
+
}
|
|
364
|
+
else if (d.type === "close" && d.account === account) {
|
|
365
|
+
activity.close_date = d.date;
|
|
366
|
+
}
|
|
367
|
+
else if (d.type === "transaction") {
|
|
368
|
+
for (const p of d.postings) {
|
|
369
|
+
if (p.account === account || p.account.startsWith(account + ":")) {
|
|
370
|
+
activity.transaction_count++;
|
|
371
|
+
if (!activity.first_transaction || d.date < activity.first_transaction) {
|
|
372
|
+
activity.first_transaction = d.date;
|
|
373
|
+
}
|
|
374
|
+
if (!activity.last_transaction || d.date > activity.last_transaction) {
|
|
375
|
+
activity.last_transaction = d.date;
|
|
376
|
+
}
|
|
377
|
+
if (p.units?.currency) {
|
|
378
|
+
activity.currencies_used.add(p.units.currency);
|
|
379
|
+
}
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
ledger.free();
|
|
386
|
+
return jsonResponse({
|
|
387
|
+
...activity,
|
|
388
|
+
currencies_used: Array.from(activity.currencies_used),
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
// === Utility Tools ===
|
|
392
|
+
function handleFormatCheck(args) {
|
|
393
|
+
const validation = validateArgs(args, ["source"]);
|
|
394
|
+
if (validation)
|
|
395
|
+
return validation;
|
|
396
|
+
const source = args.source;
|
|
397
|
+
const result = rustledger.format(source);
|
|
398
|
+
if (result.errors?.length > 0) {
|
|
399
|
+
return errorResponse(formatErrors(result.errors));
|
|
400
|
+
}
|
|
401
|
+
const formatted = result.formatted || "";
|
|
402
|
+
const isFormatted = source === formatted;
|
|
403
|
+
const lineDifference = Math.abs(formatted.split("\n").length - source.split("\n").length);
|
|
404
|
+
return textResponse(isFormatted
|
|
405
|
+
? "File is properly formatted."
|
|
406
|
+
: `File needs formatting. ${lineDifference} line(s) would change.`);
|
|
407
|
+
}
|
|
408
|
+
function handleBqlTables() {
|
|
409
|
+
return textResponse(getBqlTablesDocs());
|
|
410
|
+
}
|
|
411
|
+
function handleDirectiveAtLine(args) {
|
|
412
|
+
const validation = validateArgs(args, ["source", "line"]);
|
|
413
|
+
if (validation)
|
|
414
|
+
return validation;
|
|
415
|
+
const line = args.line;
|
|
416
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
417
|
+
const symbols = ledger.getDocumentSymbols();
|
|
418
|
+
ledger.free();
|
|
419
|
+
// Find the symbol that contains this line
|
|
420
|
+
for (const symbol of symbols) {
|
|
421
|
+
if (symbol.range.start_line <= line - 1 && symbol.range.end_line >= line - 1) {
|
|
422
|
+
return jsonResponse(symbol);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return textResponse("No directive found at this line.");
|
|
426
|
+
}
|
|
427
|
+
function handleFindTransactions(args) {
|
|
428
|
+
const validation = validateArgs(args, ["source"]);
|
|
429
|
+
if (validation)
|
|
430
|
+
return validation;
|
|
431
|
+
const payee = args?.payee;
|
|
432
|
+
const narration = args?.narration;
|
|
433
|
+
const tag = args?.tag;
|
|
434
|
+
const fromDate = args?.from_date;
|
|
435
|
+
const toDate = args?.to_date;
|
|
436
|
+
const limit = args?.limit || 50;
|
|
437
|
+
const ledger = new rustledger.ParsedLedger(args.source);
|
|
438
|
+
const directives = ledger.getDirectives();
|
|
439
|
+
ledger.free();
|
|
440
|
+
const results = [];
|
|
441
|
+
for (const d of directives) {
|
|
442
|
+
if (results.length >= limit)
|
|
443
|
+
break;
|
|
444
|
+
if (d.type !== "transaction")
|
|
445
|
+
continue;
|
|
446
|
+
if (fromDate && d.date < fromDate)
|
|
447
|
+
continue;
|
|
448
|
+
if (toDate && d.date > toDate)
|
|
449
|
+
continue;
|
|
450
|
+
if (payee && (!d.payee || !d.payee.toLowerCase().includes(payee.toLowerCase())))
|
|
451
|
+
continue;
|
|
452
|
+
if (narration &&
|
|
453
|
+
(!d.narration || !d.narration.toLowerCase().includes(narration.toLowerCase())))
|
|
454
|
+
continue;
|
|
455
|
+
if (tag && (!d.tags || !d.tags.includes(tag)))
|
|
456
|
+
continue;
|
|
457
|
+
results.push(d);
|
|
458
|
+
}
|
|
459
|
+
return jsonResponse(results);
|
|
460
|
+
}
|
|
461
|
+
// === Report Tool ===
|
|
462
|
+
function handleReport(args) {
|
|
463
|
+
const validation = validateArgs(args, ["source", "report_type"]);
|
|
464
|
+
if (validation)
|
|
465
|
+
return validation;
|
|
466
|
+
const reportType = args.report_type;
|
|
467
|
+
let query;
|
|
468
|
+
switch (reportType) {
|
|
469
|
+
case "balsheet":
|
|
470
|
+
query = `SELECT account, sum(position)
|
|
471
|
+
WHERE account ~ "^(Assets|Liabilities)"
|
|
472
|
+
GROUP BY account
|
|
473
|
+
ORDER BY account`;
|
|
474
|
+
break;
|
|
475
|
+
case "income":
|
|
476
|
+
query = `SELECT account, sum(position)
|
|
477
|
+
WHERE account ~ "^(Income|Expenses)"
|
|
478
|
+
GROUP BY account
|
|
479
|
+
ORDER BY account`;
|
|
480
|
+
break;
|
|
481
|
+
case "balances":
|
|
482
|
+
query = "BALANCES";
|
|
483
|
+
break;
|
|
484
|
+
case "holdings":
|
|
485
|
+
query = `SELECT account, sum(position)
|
|
486
|
+
WHERE account ~ "^Assets"
|
|
487
|
+
GROUP BY account
|
|
488
|
+
ORDER BY account`;
|
|
489
|
+
break;
|
|
490
|
+
case "networth":
|
|
491
|
+
query = `SELECT sum(position)
|
|
492
|
+
WHERE account ~ "^(Assets|Liabilities)"`;
|
|
493
|
+
break;
|
|
494
|
+
default:
|
|
495
|
+
return errorResponse(`Unknown report type: ${reportType}`);
|
|
496
|
+
}
|
|
497
|
+
const result = rustledger.query(args.source, query);
|
|
498
|
+
if (result.errors?.length > 0) {
|
|
499
|
+
return errorResponse(formatErrors(result.errors));
|
|
500
|
+
}
|
|
501
|
+
return textResponse(`# ${reportType.toUpperCase()} Report\n\n${formatQueryResult(result)}`);
|
|
502
|
+
}
|
|
503
|
+
// === File Operation Tools ===
|
|
504
|
+
function handleValidateFile(args) {
|
|
505
|
+
const validation = validateArgs(args, ["file_path"]);
|
|
506
|
+
if (validation)
|
|
507
|
+
return validation;
|
|
508
|
+
try {
|
|
509
|
+
const absolutePath = path.resolve(args.file_path);
|
|
510
|
+
const source = fs.readFileSync(absolutePath, "utf-8");
|
|
511
|
+
const result = rustledger.validateSource(source);
|
|
512
|
+
return textResponse(result.valid
|
|
513
|
+
? `${absolutePath}: Ledger is valid.`
|
|
514
|
+
: `${absolutePath}: Found ${result.errors.length} error(s):\n${formatErrors(result.errors)}`);
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
return errorResponse(`Error reading file: ${error instanceof Error ? error.message : String(error)}`);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
function handleQueryFile(args) {
|
|
521
|
+
const validation = validateArgs(args, ["file_path", "query"]);
|
|
522
|
+
if (validation)
|
|
523
|
+
return validation;
|
|
524
|
+
try {
|
|
525
|
+
const absolutePath = path.resolve(args.file_path);
|
|
526
|
+
const source = fs.readFileSync(absolutePath, "utf-8");
|
|
527
|
+
const result = rustledger.query(source, args.query);
|
|
528
|
+
if (result.errors?.length > 0) {
|
|
529
|
+
return errorResponse(formatErrors(result.errors));
|
|
530
|
+
}
|
|
531
|
+
return textResponse(formatQueryResult(result));
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
return errorResponse(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
function handleFormatFile(args) {
|
|
538
|
+
const validation = validateArgs(args, ["file_path"]);
|
|
539
|
+
if (validation)
|
|
540
|
+
return validation;
|
|
541
|
+
try {
|
|
542
|
+
const absolutePath = path.resolve(args.file_path);
|
|
543
|
+
const source = fs.readFileSync(absolutePath, "utf-8");
|
|
544
|
+
const result = rustledger.format(source);
|
|
545
|
+
if (result.errors?.length > 0) {
|
|
546
|
+
return errorResponse(formatErrors(result.errors));
|
|
547
|
+
}
|
|
548
|
+
if (args?.write && result.formatted) {
|
|
549
|
+
fs.writeFileSync(absolutePath, result.formatted);
|
|
550
|
+
return textResponse(`Formatted and saved: ${absolutePath}`);
|
|
551
|
+
}
|
|
552
|
+
return textResponse(result.formatted || "");
|
|
553
|
+
}
|
|
554
|
+
catch (error) {
|
|
555
|
+
return errorResponse(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { BeancountError, QueryResult, ToolResponse, ToolArguments } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validate that required arguments are present.
|
|
4
|
+
* Returns a ToolResponse with error if validation fails, null otherwise.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateArgs(args: ToolArguments | undefined, required: (keyof ToolArguments)[]): ToolResponse | null;
|
|
7
|
+
/**
|
|
8
|
+
* Create an error response.
|
|
9
|
+
*/
|
|
10
|
+
export declare function errorResponse(message: string): ToolResponse;
|
|
11
|
+
/**
|
|
12
|
+
* Create a success response with text content.
|
|
13
|
+
*/
|
|
14
|
+
export declare function textResponse(text: string): ToolResponse;
|
|
15
|
+
/**
|
|
16
|
+
* Create a success response with JSON content.
|
|
17
|
+
*/
|
|
18
|
+
export declare function jsonResponse(data: unknown): ToolResponse;
|
|
19
|
+
/**
|
|
20
|
+
* Format validation/parse errors for display.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatErrors(errors: BeancountError[]): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a query result as a table.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatQueryResult(result: QueryResult): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a single cell value for display.
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatCell(value: unknown): string;
|
|
31
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,QAAQ,EAAE,CAAC,MAAM,aAAa,CAAC,EAAE,GAChC,YAAY,GAAG,IAAI,CAyBrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAK3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAIvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAIxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAO7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAyB7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsBjD"}
|