kagent-ts 0.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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -0
  3. package/dist/compression/interface.d.ts +26 -0
  4. package/dist/compression/interface.d.ts.map +1 -0
  5. package/dist/compression/interface.js +3 -0
  6. package/dist/compression/interface.js.map +1 -0
  7. package/dist/compression/sliding-window.d.ts +21 -0
  8. package/dist/compression/sliding-window.d.ts.map +1 -0
  9. package/dist/compression/sliding-window.js +55 -0
  10. package/dist/compression/sliding-window.js.map +1 -0
  11. package/dist/compression/types.d.ts +12 -0
  12. package/dist/compression/types.d.ts.map +1 -0
  13. package/dist/compression/types.js +3 -0
  14. package/dist/compression/types.js.map +1 -0
  15. package/dist/context/context-manager.d.ts +76 -0
  16. package/dist/context/context-manager.d.ts.map +1 -0
  17. package/dist/context/context-manager.js +132 -0
  18. package/dist/context/context-manager.js.map +1 -0
  19. package/dist/context/types.d.ts +35 -0
  20. package/dist/context/types.d.ts.map +1 -0
  21. package/dist/context/types.js +3 -0
  22. package/dist/context/types.js.map +1 -0
  23. package/dist/core/agent.d.ts +288 -0
  24. package/dist/core/agent.d.ts.map +1 -0
  25. package/dist/core/agent.js +398 -0
  26. package/dist/core/agent.js.map +1 -0
  27. package/dist/core/hooks.d.ts +34 -0
  28. package/dist/core/hooks.d.ts.map +1 -0
  29. package/dist/core/hooks.js +3 -0
  30. package/dist/core/hooks.js.map +1 -0
  31. package/dist/core/plan-solve-agent.d.ts +114 -0
  32. package/dist/core/plan-solve-agent.d.ts.map +1 -0
  33. package/dist/core/plan-solve-agent.js +450 -0
  34. package/dist/core/plan-solve-agent.js.map +1 -0
  35. package/dist/core/react-agent.d.ts +52 -0
  36. package/dist/core/react-agent.d.ts.map +1 -0
  37. package/dist/core/react-agent.js +266 -0
  38. package/dist/core/react-agent.js.map +1 -0
  39. package/dist/core/response-schema.d.ts +91 -0
  40. package/dist/core/response-schema.d.ts.map +1 -0
  41. package/dist/core/response-schema.js +292 -0
  42. package/dist/core/response-schema.js.map +1 -0
  43. package/dist/core/types.d.ts +6 -0
  44. package/dist/core/types.d.ts.map +1 -0
  45. package/dist/core/types.js +3 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/index.d.ts +39 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +67 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/interface.d.ts +87 -0
  52. package/dist/llm/interface.d.ts.map +1 -0
  53. package/dist/llm/interface.js +3 -0
  54. package/dist/llm/interface.js.map +1 -0
  55. package/dist/llm/openai-provider.d.ts +92 -0
  56. package/dist/llm/openai-provider.d.ts.map +1 -0
  57. package/dist/llm/openai-provider.js +262 -0
  58. package/dist/llm/openai-provider.js.map +1 -0
  59. package/dist/messages/message.d.ts +50 -0
  60. package/dist/messages/message.d.ts.map +1 -0
  61. package/dist/messages/message.js +87 -0
  62. package/dist/messages/message.js.map +1 -0
  63. package/dist/messages/types.d.ts +31 -0
  64. package/dist/messages/types.d.ts.map +1 -0
  65. package/dist/messages/types.js +14 -0
  66. package/dist/messages/types.js.map +1 -0
  67. package/dist/preferences/preference-manager.d.ts +88 -0
  68. package/dist/preferences/preference-manager.d.ts.map +1 -0
  69. package/dist/preferences/preference-manager.js +196 -0
  70. package/dist/preferences/preference-manager.js.map +1 -0
  71. package/dist/preferences/types.d.ts +27 -0
  72. package/dist/preferences/types.d.ts.map +1 -0
  73. package/dist/preferences/types.js +3 -0
  74. package/dist/preferences/types.js.map +1 -0
  75. package/dist/session/session-manager.d.ts +56 -0
  76. package/dist/session/session-manager.d.ts.map +1 -0
  77. package/dist/session/session-manager.js +156 -0
  78. package/dist/session/session-manager.js.map +1 -0
  79. package/dist/session/session-types.d.ts +51 -0
  80. package/dist/session/session-types.d.ts.map +1 -0
  81. package/dist/session/session-types.js +3 -0
  82. package/dist/session/session-types.js.map +1 -0
  83. package/dist/skills/file-skill-loader.d.ts +88 -0
  84. package/dist/skills/file-skill-loader.d.ts.map +1 -0
  85. package/dist/skills/file-skill-loader.js +365 -0
  86. package/dist/skills/file-skill-loader.js.map +1 -0
  87. package/dist/skills/index.d.ts +4 -0
  88. package/dist/skills/index.d.ts.map +1 -0
  89. package/dist/skills/index.js +10 -0
  90. package/dist/skills/index.js.map +1 -0
  91. package/dist/skills/skill-manager.d.ts +133 -0
  92. package/dist/skills/skill-manager.d.ts.map +1 -0
  93. package/dist/skills/skill-manager.js +310 -0
  94. package/dist/skills/skill-manager.js.map +1 -0
  95. package/dist/skills/types.d.ts +42 -0
  96. package/dist/skills/types.d.ts.map +1 -0
  97. package/dist/skills/types.js +3 -0
  98. package/dist/skills/types.js.map +1 -0
  99. package/dist/tools/builtin/edit-file.d.ts +12 -0
  100. package/dist/tools/builtin/edit-file.d.ts.map +1 -0
  101. package/dist/tools/builtin/edit-file.js +123 -0
  102. package/dist/tools/builtin/edit-file.js.map +1 -0
  103. package/dist/tools/builtin/glob-search.d.ts +11 -0
  104. package/dist/tools/builtin/glob-search.d.ts.map +1 -0
  105. package/dist/tools/builtin/glob-search.js +264 -0
  106. package/dist/tools/builtin/glob-search.js.map +1 -0
  107. package/dist/tools/builtin/grep-search.d.ts +14 -0
  108. package/dist/tools/builtin/grep-search.d.ts.map +1 -0
  109. package/dist/tools/builtin/grep-search.js +264 -0
  110. package/dist/tools/builtin/grep-search.js.map +1 -0
  111. package/dist/tools/builtin/index.d.ts +21 -0
  112. package/dist/tools/builtin/index.d.ts.map +1 -0
  113. package/dist/tools/builtin/index.js +53 -0
  114. package/dist/tools/builtin/index.js.map +1 -0
  115. package/dist/tools/builtin/read-file.d.ts +11 -0
  116. package/dist/tools/builtin/read-file.d.ts.map +1 -0
  117. package/dist/tools/builtin/read-file.js +122 -0
  118. package/dist/tools/builtin/read-file.js.map +1 -0
  119. package/dist/tools/builtin/write-file.d.ts +10 -0
  120. package/dist/tools/builtin/write-file.d.ts.map +1 -0
  121. package/dist/tools/builtin/write-file.js +89 -0
  122. package/dist/tools/builtin/write-file.js.map +1 -0
  123. package/dist/tools/circuit-breaker.d.ts +77 -0
  124. package/dist/tools/circuit-breaker.d.ts.map +1 -0
  125. package/dist/tools/circuit-breaker.js +102 -0
  126. package/dist/tools/circuit-breaker.js.map +1 -0
  127. package/dist/tools/error-tracker.d.ts +116 -0
  128. package/dist/tools/error-tracker.d.ts.map +1 -0
  129. package/dist/tools/error-tracker.js +484 -0
  130. package/dist/tools/error-tracker.js.map +1 -0
  131. package/dist/tools/tool-registry.d.ts +87 -0
  132. package/dist/tools/tool-registry.d.ts.map +1 -0
  133. package/dist/tools/tool-registry.js +188 -0
  134. package/dist/tools/tool-registry.js.map +1 -0
  135. package/dist/tools/types.d.ts +95 -0
  136. package/dist/tools/types.d.ts.map +1 -0
  137. package/dist/tools/types.js +14 -0
  138. package/dist/tools/types.js.map +1 -0
  139. package/dist/utils/token-counter.d.ts +31 -0
  140. package/dist/utils/token-counter.d.ts.map +1 -0
  141. package/dist/utils/token-counter.js +105 -0
  142. package/dist/utils/token-counter.js.map +1 -0
  143. package/package.json +56 -0
@@ -0,0 +1,484 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ToolErrorTracker = void 0;
37
+ exports.categorizeError = categorizeError;
38
+ /**
39
+ * ToolErrorTracker — records the complete lifecycle of tool failures
40
+ * and persists them as structured documents for developer review.
41
+ *
42
+ * Each "trace" captures one error chain: first failure → retries →
43
+ * LLM analysis → resolution or circuit-open. Traces are stored as
44
+ * individual JSON files in a designated directory (.error-traces/)
45
+ * so developers can inspect, aggregate, and learn from them.
46
+ */
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ /**
50
+ * Generates a short unique trace ID.
51
+ */
52
+ function generateTraceId() {
53
+ const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
54
+ let id = "trace_";
55
+ for (let i = 0; i < 12; i++) {
56
+ id += chars[Math.floor(Math.random() * chars.length)];
57
+ }
58
+ return id;
59
+ }
60
+ /**
61
+ * Generates a timestamp string in ISO-8601 format.
62
+ */
63
+ function nowISO() {
64
+ return new Date().toISOString();
65
+ }
66
+ /**
67
+ * Sanitize arguments for storage — removes sensitive values
68
+ * (e.g., API keys, passwords) while preserving structure.
69
+ */
70
+ function sanitizeArgs(args) {
71
+ const sensitiveKeys = [
72
+ "apiKey", "api_key", "apikey",
73
+ "password", "passwd", "secret", "token",
74
+ "authorization", "auth",
75
+ ];
76
+ const sanitized = {};
77
+ for (const [key, value] of Object.entries(args)) {
78
+ if (sensitiveKeys.some((k) => key.toLowerCase().includes(k))) {
79
+ sanitized[key] = "***REDACTED***";
80
+ }
81
+ else {
82
+ sanitized[key] = value;
83
+ }
84
+ }
85
+ return sanitized;
86
+ }
87
+ /**
88
+ * Limit error message length to avoid huge trace files.
89
+ */
90
+ function truncateError(error, maxLen = 500) {
91
+ if (error.length <= maxLen)
92
+ return error;
93
+ return error.slice(0, maxLen) + "... (truncated)";
94
+ }
95
+ /**
96
+ * Categorize a tool error based on its message content.
97
+ * Helps developers quickly identify common failure patterns.
98
+ */
99
+ function categorizeError(error) {
100
+ const lower = error.toLowerCase();
101
+ if (lower.includes("enoent") || lower.includes("not found") || lower.includes("no such file")) {
102
+ return "file_not_found";
103
+ }
104
+ if (lower.includes("eaccess") || lower.includes("permission denied") || lower.includes("eperm")) {
105
+ return "permission_denied";
106
+ }
107
+ if (lower.includes("eisdir")) {
108
+ return "is_directory";
109
+ }
110
+ if (lower.includes("eexist")) {
111
+ return "file_exists";
112
+ }
113
+ if (lower.includes("syntax") || lower.includes("parse error") || lower.includes("parse")) {
114
+ return "parse_error";
115
+ }
116
+ if (lower.includes("timeout") || lower.includes("timed out") || lower.includes("econnrefused") || lower.includes("econnreset")) {
117
+ return "network_error";
118
+ }
119
+ if (lower.includes("invalid") || lower.includes("bad argument") || lower.includes("wrong type")) {
120
+ return "invalid_arguments";
121
+ }
122
+ if (lower.includes("not empty") || lower.includes("directory not empty") || lower.includes("enotempty")) {
123
+ return "directory_not_empty";
124
+ }
125
+ return "unknown";
126
+ }
127
+ /**
128
+ * ToolErrorTracker records the complete lifecycle of tool failures.
129
+ *
130
+ * Usage:
131
+ * ```ts
132
+ * const tracker = new ToolErrorTracker({ storageDir: ".error-traces" });
133
+ * const registry = new ToolRegistry({ errorTracker: tracker });
134
+ * ```
135
+ *
136
+ * Lifecycle of a trace:
137
+ * 1. First failure → `recordFailure()` creates a new trace
138
+ * 2. LLM analysis → `recordAnalysis()` attaches the LLM's reasoning
139
+ * 3. Retry failure → `recordFailure()` appends to the existing trace
140
+ * 4. Recovery → `recordRecovery()` marks the trace as resolved
141
+ * 5. Circuit open → `recordFailure()` marks the trace as unresolved
142
+ *
143
+ * All traces are persisted as individual JSON files in the storage
144
+ * directory, plus an index file for quick browsing.
145
+ */
146
+ class ToolErrorTracker {
147
+ traces = new Map();
148
+ activeTraceByTool = new Map();
149
+ storageDir;
150
+ persistImmediately;
151
+ sessionId;
152
+ constructor(config) {
153
+ this.storageDir = config?.storageDir ?? ".error-traces";
154
+ this.persistImmediately = config?.persistImmediately ?? true;
155
+ }
156
+ /**
157
+ * Set a session identifier that will be attached to all traces.
158
+ */
159
+ setSessionId(id) {
160
+ this.sessionId = id;
161
+ }
162
+ // ─── Event Recording ────────────────────────────────────────────────────
163
+ /**
164
+ * Record a tool execution failure.
165
+ *
166
+ * - If this is the first failure for the tool in the current chain,
167
+ * a new trace is created.
168
+ * - If a trace for this tool already exists and is still open,
169
+ * the failure is appended as a retry event.
170
+ *
171
+ * @returns The trace ID for the chain this failure belongs to.
172
+ */
173
+ recordFailure(toolName, args, error, retriesRemaining) {
174
+ const existingTraceId = this.activeTraceByTool.get(toolName);
175
+ let trace;
176
+ if (existingTraceId) {
177
+ // Append to existing trace
178
+ const existing = this.traces.get(existingTraceId);
179
+ if (existing && !existing.resolved) {
180
+ trace = existing;
181
+ }
182
+ else {
183
+ // Existing trace is resolved/closed — start a new one
184
+ trace = this.createTrace(toolName, args);
185
+ }
186
+ }
187
+ else {
188
+ trace = this.createTrace(toolName, args);
189
+ }
190
+ const attemptNumber = trace.events.filter((e) => e.type === "failure" || e.type === "retry").length + 1;
191
+ const event = {
192
+ type: retriesRemaining > 0 ? "failure" : "circuit_open",
193
+ timestamp: nowISO(),
194
+ error: truncateError(error),
195
+ attemptNumber,
196
+ retriesRemaining,
197
+ arguments: sanitizeArgs(args),
198
+ };
199
+ trace.events.push(event);
200
+ trace.updatedAt = nowISO();
201
+ if (retriesRemaining === 0) {
202
+ // Circuit just opened — trace is done, unresolved
203
+ trace.resolved = false;
204
+ this.activeTraceByTool.delete(toolName);
205
+ }
206
+ this.traces.set(trace.traceId, trace);
207
+ this.persistTrace(trace.traceId);
208
+ return trace.traceId;
209
+ }
210
+ /**
211
+ * Record a tool recovery (successful execution after previous failures).
212
+ *
213
+ * @param toolName The tool that recovered.
214
+ * @param traceId The trace ID for this failure chain.
215
+ * @param resolution Optional description of how it was resolved.
216
+ */
217
+ recordRecovery(toolName, traceId, resolution) {
218
+ const trace = this.traces.get(traceId);
219
+ if (!trace)
220
+ return;
221
+ const event = {
222
+ type: "recovery",
223
+ timestamp: nowISO(),
224
+ resolution: resolution ??
225
+ `Tool "${toolName}" succeeded on retry.`,
226
+ };
227
+ trace.events.push(event);
228
+ trace.resolved = true;
229
+ trace.resolution = event.resolution;
230
+ trace.updatedAt = nowISO();
231
+ this.traces.set(traceId, trace);
232
+ this.activeTraceByTool.delete(toolName);
233
+ this.persistTrace(traceId);
234
+ }
235
+ /**
236
+ * Attach LLM analysis to the latest failure/retry event in a trace.
237
+ *
238
+ * Called by the agent after the LLM has reasoned about a tool error.
239
+ */
240
+ recordAnalysis(traceId, analysis) {
241
+ const trace = this.traces.get(traceId);
242
+ if (!trace)
243
+ return;
244
+ // Attach to the most recent failure/retry event
245
+ for (let i = trace.events.length - 1; i >= 0; i--) {
246
+ const event = trace.events[i];
247
+ if (event.type === "failure" || event.type === "retry") {
248
+ event.analysis = analysis;
249
+ break;
250
+ }
251
+ }
252
+ // Also add as a standalone analysis event for clarity
253
+ const analysisEvent = {
254
+ type: "analysis",
255
+ timestamp: nowISO(),
256
+ analysis,
257
+ };
258
+ trace.events.push(analysisEvent);
259
+ trace.updatedAt = nowISO();
260
+ this.traces.set(traceId, trace);
261
+ this.persistTrace(traceId);
262
+ }
263
+ // ─── Query ───────────────────────────────────────────────────────────────
264
+ /**
265
+ * Get a full trace by ID.
266
+ */
267
+ getTrace(traceId) {
268
+ return this.traces.get(traceId);
269
+ }
270
+ /**
271
+ * Get all trace summaries — lightweight list for browsing.
272
+ */
273
+ getAllSummaries() {
274
+ const summaries = [];
275
+ for (const trace of this.traces.values()) {
276
+ const failureEvents = trace.events.filter((e) => e.type === "failure" || e.type === "retry");
277
+ summaries.push({
278
+ traceId: trace.traceId,
279
+ toolName: trace.toolName,
280
+ createdAt: trace.createdAt,
281
+ resolved: trace.resolved,
282
+ errorCount: failureEvents.length,
283
+ firstError: failureEvents.length > 0
284
+ ? failureEvents[0].error?.slice(0, 120) ?? ""
285
+ : "",
286
+ resolution: trace.resolution,
287
+ });
288
+ }
289
+ return summaries.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
290
+ }
291
+ /**
292
+ * Get the active (open, unresolved) trace ID for a tool, if any.
293
+ */
294
+ getActiveTraceId(toolName) {
295
+ return this.activeTraceByTool.get(toolName);
296
+ }
297
+ /**
298
+ * Get the total number of traces recorded.
299
+ */
300
+ get traceCount() {
301
+ return this.traces.size;
302
+ }
303
+ // ─── Persistence ─────────────────────────────────────────────────────────
304
+ /**
305
+ * Persist all traces to disk immediately.
306
+ */
307
+ persistAll() {
308
+ this.ensureStorageDir();
309
+ for (const traceId of this.traces.keys()) {
310
+ this.writeTraceFile(traceId);
311
+ }
312
+ this.writeIndexFile();
313
+ }
314
+ /**
315
+ * Load traces from disk (e.g., on startup to resume monitoring).
316
+ */
317
+ loadFromDisk() {
318
+ this.ensureStorageDir();
319
+ const dir = this.storageDir;
320
+ if (!fs.existsSync(dir))
321
+ return;
322
+ const files = fs.readdirSync(dir);
323
+ for (const file of files) {
324
+ if (!file.startsWith("trace_") || !file.endsWith(".json"))
325
+ continue;
326
+ if (file === "traces.json")
327
+ continue; // skip index
328
+ try {
329
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
330
+ const trace = JSON.parse(content);
331
+ this.traces.set(trace.traceId, trace);
332
+ if (!trace.resolved) {
333
+ this.activeTraceByTool.set(trace.toolName, trace.traceId);
334
+ }
335
+ }
336
+ catch {
337
+ // Skip corrupted files
338
+ }
339
+ }
340
+ }
341
+ /**
342
+ * Generate a human-readable markdown report of all traces.
343
+ */
344
+ generateMarkdownReport() {
345
+ const summaries = this.getAllSummaries();
346
+ if (summaries.length === 0) {
347
+ return "# Tool Error Trace Report\n\n*No errors recorded.*\n";
348
+ }
349
+ const resolved = summaries.filter((s) => s.resolved).length;
350
+ const open = summaries.length - resolved;
351
+ let report = `# Tool Error Trace Report\n\n`;
352
+ report += `- **Total traces:** ${summaries.length}\n`;
353
+ report += `- **Resolved:** ${resolved}\n`;
354
+ report += `- **Open:** ${open}\n`;
355
+ report += `- **Generated:** ${nowISO()}\n\n`;
356
+ report += `---\n\n`;
357
+ for (const summary of summaries) {
358
+ const trace = this.traces.get(summary.traceId);
359
+ if (!trace)
360
+ continue;
361
+ report += `## Trace: ${summary.traceId}\n\n`;
362
+ report += `- **Tool:** \`${summary.toolName}\`\n`;
363
+ report += `- **Created:** ${summary.createdAt}\n`;
364
+ report += `- **Status:** ${summary.resolved ? "✅ Resolved" : "❌ Unresolved"}\n`;
365
+ report += `- **Attempts:** ${summary.errorCount}\n\n`;
366
+ // Events table
367
+ report += `| # | Type | Timestamp | Error / Analysis |\n`;
368
+ report += `|---|------|-----------|------------------|\n`;
369
+ let eventNum = 0;
370
+ for (const event of trace.events) {
371
+ eventNum++;
372
+ const type = this.formatEventType(event.type);
373
+ const ts = new Date(event.timestamp).toLocaleTimeString();
374
+ let detail = "";
375
+ if (event.type === "failure" || event.type === "retry") {
376
+ detail = `\`${event.error?.slice(0, 200) ?? ""}\``;
377
+ if (event.analysis) {
378
+ detail += `<br/>*Analysis:* ${event.analysis.slice(0, 300)}`;
379
+ }
380
+ }
381
+ else if (event.type === "recovery") {
382
+ detail = event.resolution ?? "Recovered";
383
+ }
384
+ else if (event.type === "circuit_open") {
385
+ detail = `Circuit opened after ${event.attemptNumber} attempts`;
386
+ }
387
+ else if (event.type === "analysis") {
388
+ detail = `*${event.analysis?.slice(0, 300) ?? ""}*`;
389
+ }
390
+ report += `| ${eventNum} | ${type} | ${ts} | ${detail} |\n`;
391
+ }
392
+ report += `\n---\n\n`;
393
+ }
394
+ return report;
395
+ }
396
+ /**
397
+ * Delete all stored traces.
398
+ */
399
+ clearAll() {
400
+ this.traces.clear();
401
+ this.activeTraceByTool.clear();
402
+ const dir = this.storageDir;
403
+ if (fs.existsSync(dir)) {
404
+ const files = fs.readdirSync(dir);
405
+ for (const file of files) {
406
+ if (file.endsWith(".json")) {
407
+ try {
408
+ fs.unlinkSync(path.join(dir, file));
409
+ }
410
+ catch {
411
+ // ignore
412
+ }
413
+ }
414
+ }
415
+ }
416
+ }
417
+ // ─── Private Helpers ─────────────────────────────────────────────────────
418
+ createTrace(toolName, args) {
419
+ const traceId = generateTraceId();
420
+ const now = nowISO();
421
+ const trace = {
422
+ traceId,
423
+ toolName,
424
+ sessionId: this.sessionId,
425
+ createdAt: now,
426
+ updatedAt: now,
427
+ resolved: false,
428
+ originalArguments: sanitizeArgs(args),
429
+ events: [],
430
+ };
431
+ this.traces.set(traceId, trace);
432
+ this.activeTraceByTool.set(toolName, traceId);
433
+ return trace;
434
+ }
435
+ persistTrace(traceId) {
436
+ if (!this.persistImmediately)
437
+ return;
438
+ this.ensureStorageDir();
439
+ this.writeTraceFile(traceId);
440
+ this.writeIndexFile();
441
+ }
442
+ ensureStorageDir() {
443
+ if (!fs.existsSync(this.storageDir)) {
444
+ fs.mkdirSync(this.storageDir, { recursive: true });
445
+ }
446
+ }
447
+ writeTraceFile(traceId) {
448
+ const trace = this.traces.get(traceId);
449
+ if (!trace)
450
+ return;
451
+ const filePath = path.join(this.storageDir, `${traceId}.json`);
452
+ fs.writeFileSync(filePath, JSON.stringify(trace, null, 2), "utf-8");
453
+ }
454
+ writeIndexFile() {
455
+ const summaries = this.getAllSummaries();
456
+ const filePath = path.join(this.storageDir, "traces.json");
457
+ fs.writeFileSync(filePath, JSON.stringify({
458
+ totalTraces: summaries.length,
459
+ resolvedCount: summaries.filter((s) => s.resolved).length,
460
+ openCount: summaries.filter((s) => !s.resolved).length,
461
+ updatedAt: nowISO(),
462
+ sessionId: this.sessionId,
463
+ traces: summaries,
464
+ }, null, 2), "utf-8");
465
+ }
466
+ formatEventType(type) {
467
+ switch (type) {
468
+ case "failure":
469
+ return "🔴 Failure";
470
+ case "retry":
471
+ return "🟡 Retry";
472
+ case "recovery":
473
+ return "🟢 Recovery";
474
+ case "circuit_open":
475
+ return "⛔ Circuit Open";
476
+ case "analysis":
477
+ return "💡 Analysis";
478
+ default:
479
+ return type;
480
+ }
481
+ }
482
+ }
483
+ exports.ToolErrorTracker = ToolErrorTracker;
484
+ //# sourceMappingURL=error-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-tracker.js","sourceRoot":"","sources":["../../src/tools/error-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { Tool, BreakerStatus } from "./types";
2
+ import { ToolErrorTracker } from "./error-tracker";
3
+ /**
4
+ * Registry that manages tool definitions together with circuit breakers.
5
+ *
6
+ * Provides:
7
+ * - Tool registration and lookup
8
+ * - Safe execution with circuit breaker protection
9
+ * - Per-tool failure tracking with retry guidance
10
+ */
11
+ export declare class ToolRegistry {
12
+ private tools;
13
+ private breakers;
14
+ private retryCount;
15
+ private errorTracker?;
16
+ /**
17
+ * @param retryCount Number of retries allowed after the first failure
18
+ * (default: 2 → 3 total attempts before circuit opens).
19
+ * @param errorTracker Optional ToolErrorTracker for recording failure chains.
20
+ */
21
+ constructor(retryCount?: number, errorTracker?: ToolErrorTracker);
22
+ /**
23
+ * Register a tool. Creates a circuit breaker for it automatically.
24
+ */
25
+ register(tool: Tool): void;
26
+ /**
27
+ * Register multiple tools at once.
28
+ */
29
+ registerMany(tools: Tool[]): void;
30
+ /**
31
+ * Get a tool by name. Returns undefined if not found.
32
+ */
33
+ getTool(name: string): Tool | undefined;
34
+ /**
35
+ * Get all registered tools (for passing to the LLM).
36
+ */
37
+ getTools(): Tool[];
38
+ /**
39
+ * Remove a tool and its circuit breaker.
40
+ */
41
+ remove(name: string): boolean;
42
+ /**
43
+ * Check if a tool is registered.
44
+ */
45
+ has(name: string): boolean;
46
+ /**
47
+ * Get the number of registered tools.
48
+ */
49
+ get count(): number;
50
+ /**
51
+ * Get all registered tool names.
52
+ */
53
+ get toolNames(): string[];
54
+ /**
55
+ * Execute a tool with circuit-breaker protection and retry guidance.
56
+ *
57
+ * - If the circuit is OPEN, returns an error message with a recommendation
58
+ * to try a different approach.
59
+ * - If execution fails and retries remain, returns a message telling the LLM
60
+ * to analyze the error and retry with corrected parameters.
61
+ * - If execution succeeds, records a success (resets failure count).
62
+ *
63
+ * @returns The tool's result string, or an error message with retry guidance.
64
+ */
65
+ execute(name: string, args: Record<string, unknown>): Promise<string>;
66
+ /**
67
+ * Get the error tracker instance, if one is configured.
68
+ */
69
+ getErrorTracker(): ToolErrorTracker | undefined;
70
+ /**
71
+ * Get the circuit breaker status for a tool.
72
+ */
73
+ getBreakerStatus(name: string): BreakerStatus | undefined;
74
+ /**
75
+ * Get status for all tools.
76
+ */
77
+ getAllBreakerStatuses(): BreakerStatus[];
78
+ /**
79
+ * Manually reset the circuit breaker for a specific tool.
80
+ */
81
+ resetBreaker(name: string): void;
82
+ /**
83
+ * Reset all circuit breakers.
84
+ */
85
+ resetAllBreakers(): void;
86
+ }
87
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/tools/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC;;;;OAIG;gBACS,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,gBAAgB;IAKhE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAc1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAMjC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAIlB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK7B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAID;;;;;;;;;;OAUG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA6E3E;;OAEG;IACH,eAAe,IAAI,gBAAgB,GAAG,SAAS;IAI/C;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIzD;;OAEG;IACH,qBAAqB,IAAI,aAAa,EAAE;IAIxC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,gBAAgB,IAAI,IAAI;CAKzB"}