@kb-labs/agent-cli 0.5.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 (136) hide show
  1. package/README.md +56 -0
  2. package/dist/cli/commands/diff.d.ts +17 -0
  3. package/dist/cli/commands/diff.js +182 -0
  4. package/dist/cli/commands/diff.js.map +1 -0
  5. package/dist/cli/commands/history.d.ts +16 -0
  6. package/dist/cli/commands/history.js +216 -0
  7. package/dist/cli/commands/history.js.map +1 -0
  8. package/dist/cli/commands/quality-report.d.ts +21 -0
  9. package/dist/cli/commands/quality-report.js +457 -0
  10. package/dist/cli/commands/quality-report.js.map +1 -0
  11. package/dist/cli/commands/rollback.d.ts +27 -0
  12. package/dist/cli/commands/rollback.js +109 -0
  13. package/dist/cli/commands/rollback.js.map +1 -0
  14. package/dist/cli/commands/run.d.ts +42 -0
  15. package/dist/cli/commands/run.js +923 -0
  16. package/dist/cli/commands/run.js.map +1 -0
  17. package/dist/cli/commands/trace-context.d.ts +22 -0
  18. package/dist/cli/commands/trace-context.js +131 -0
  19. package/dist/cli/commands/trace-context.js.map +1 -0
  20. package/dist/cli/commands/trace-diagnose.d.ts +20 -0
  21. package/dist/cli/commands/trace-diagnose.js +434 -0
  22. package/dist/cli/commands/trace-diagnose.js.map +1 -0
  23. package/dist/cli/commands/trace-event-normalizer.d.ts +13 -0
  24. package/dist/cli/commands/trace-event-normalizer.js +39 -0
  25. package/dist/cli/commands/trace-event-normalizer.js.map +1 -0
  26. package/dist/cli/commands/trace-filter.d.ts +19 -0
  27. package/dist/cli/commands/trace-filter.js +153 -0
  28. package/dist/cli/commands/trace-filter.js.map +1 -0
  29. package/dist/cli/commands/trace-iteration.d.ts +18 -0
  30. package/dist/cli/commands/trace-iteration.js +192 -0
  31. package/dist/cli/commands/trace-iteration.js.map +1 -0
  32. package/dist/cli/commands/trace-stats.d.ts +17 -0
  33. package/dist/cli/commands/trace-stats.js +247 -0
  34. package/dist/cli/commands/trace-stats.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +473 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/manifest.d.ts +184 -0
  39. package/dist/manifest.js +473 -0
  40. package/dist/manifest.js.map +1 -0
  41. package/dist/rest/handlers/approve-handler.d.ts +15 -0
  42. package/dist/rest/handlers/approve-handler.js +60 -0
  43. package/dist/rest/handlers/approve-handler.js.map +1 -0
  44. package/dist/rest/handlers/approve-session-plan-handler.d.ts +10 -0
  45. package/dist/rest/handlers/approve-session-plan-handler.js +52 -0
  46. package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -0
  47. package/dist/rest/handlers/correct-handler.d.ts +7 -0
  48. package/dist/rest/handlers/correct-handler.js +326 -0
  49. package/dist/rest/handlers/correct-handler.js.map +1 -0
  50. package/dist/rest/handlers/create-session-handler.d.ts +7 -0
  51. package/dist/rest/handlers/create-session-handler.js +25 -0
  52. package/dist/rest/handlers/create-session-handler.js.map +1 -0
  53. package/dist/rest/handlers/execute-session-plan-handler.d.ts +10 -0
  54. package/dist/rest/handlers/execute-session-plan-handler.js +635 -0
  55. package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -0
  56. package/dist/rest/handlers/generate-spec-handler.d.ts +10 -0
  57. package/dist/rest/handlers/generate-spec-handler.js +389 -0
  58. package/dist/rest/handlers/generate-spec-handler.js.map +1 -0
  59. package/dist/rest/handlers/get-file-diff-handler.d.ts +24 -0
  60. package/dist/rest/handlers/get-file-diff-handler.js +44 -0
  61. package/dist/rest/handlers/get-file-diff-handler.js.map +1 -0
  62. package/dist/rest/handlers/get-session-handler.d.ts +10 -0
  63. package/dist/rest/handlers/get-session-handler.js +23 -0
  64. package/dist/rest/handlers/get-session-handler.js.map +1 -0
  65. package/dist/rest/handlers/get-session-plan-handler.d.ts +10 -0
  66. package/dist/rest/handlers/get-session-plan-handler.js +53 -0
  67. package/dist/rest/handlers/get-session-plan-handler.js.map +1 -0
  68. package/dist/rest/handlers/get-session-turns-handler.d.ts +16 -0
  69. package/dist/rest/handlers/get-session-turns-handler.js +35 -0
  70. package/dist/rest/handlers/get-session-turns-handler.js.map +1 -0
  71. package/dist/rest/handlers/get-spec-handler.d.ts +10 -0
  72. package/dist/rest/handlers/get-spec-handler.js +39 -0
  73. package/dist/rest/handlers/get-spec-handler.js.map +1 -0
  74. package/dist/rest/handlers/list-file-changes-handler.d.ts +13 -0
  75. package/dist/rest/handlers/list-file-changes-handler.js +34 -0
  76. package/dist/rest/handlers/list-file-changes-handler.js.map +1 -0
  77. package/dist/rest/handlers/list-sessions-handler.d.ts +7 -0
  78. package/dist/rest/handlers/list-sessions-handler.js +23 -0
  79. package/dist/rest/handlers/list-sessions-handler.js.map +1 -0
  80. package/dist/rest/handlers/rollback-handler.d.ts +22 -0
  81. package/dist/rest/handlers/rollback-handler.js +91 -0
  82. package/dist/rest/handlers/rollback-handler.js.map +1 -0
  83. package/dist/rest/handlers/run-handler.d.ts +7 -0
  84. package/dist/rest/handlers/run-handler.js +516 -0
  85. package/dist/rest/handlers/run-handler.js.map +1 -0
  86. package/dist/rest/handlers/sessions-handler.d.ts +18 -0
  87. package/dist/rest/handlers/sessions-handler.js +56 -0
  88. package/dist/rest/handlers/sessions-handler.js.map +1 -0
  89. package/dist/rest/handlers/status-handler.d.ts +7 -0
  90. package/dist/rest/handlers/status-handler.js +313 -0
  91. package/dist/rest/handlers/status-handler.js.map +1 -0
  92. package/dist/rest/handlers/stop-handler.d.ts +7 -0
  93. package/dist/rest/handlers/stop-handler.js +317 -0
  94. package/dist/rest/handlers/stop-handler.js.map +1 -0
  95. package/dist/widgets/220.js +446 -0
  96. package/dist/widgets/220.js.map +1 -0
  97. package/dist/widgets/331.js +2 -0
  98. package/dist/widgets/331.js.map +1 -0
  99. package/dist/widgets/403.js +2 -0
  100. package/dist/widgets/403.js.map +1 -0
  101. package/dist/widgets/406.js +35 -0
  102. package/dist/widgets/406.js.map +1 -0
  103. package/dist/widgets/455.js +2 -0
  104. package/dist/widgets/455.js.map +1 -0
  105. package/dist/widgets/482.js +2 -0
  106. package/dist/widgets/482.js.map +1 -0
  107. package/dist/widgets/485.js +2 -0
  108. package/dist/widgets/485.js.map +1 -0
  109. package/dist/widgets/527.js +2 -0
  110. package/dist/widgets/527.js.map +1 -0
  111. package/dist/widgets/628.js +2 -0
  112. package/dist/widgets/628.js.map +1 -0
  113. package/dist/widgets/694.js +2 -0
  114. package/dist/widgets/694.js.map +1 -0
  115. package/dist/widgets/712.js +2 -0
  116. package/dist/widgets/712.js.map +1 -0
  117. package/dist/widgets/866.js +2 -0
  118. package/dist/widgets/866.js.map +1 -0
  119. package/dist/widgets/915.js +39 -0
  120. package/dist/widgets/915.js.map +1 -0
  121. package/dist/widgets/957.js +10 -0
  122. package/dist/widgets/957.js.map +1 -0
  123. package/dist/widgets/983.js +2 -0
  124. package/dist/widgets/983.js.map +1 -0
  125. package/dist/widgets/@mf-types.d.ts +3 -0
  126. package/dist/widgets/@mf-types.zip +0 -0
  127. package/dist/widgets/__federation_expose_AgentsPage.js +2 -0
  128. package/dist/widgets/__federation_expose_AgentsPage.js.map +1 -0
  129. package/dist/widgets/mf-manifest.json +260 -0
  130. package/dist/widgets/mf-stats.json +305 -0
  131. package/dist/widgets/remoteEntry.js +7 -0
  132. package/dist/widgets/remoteEntry.js.map +1 -0
  133. package/dist/ws/session-stream-handler.d.ts +8 -0
  134. package/dist/ws/session-stream-handler.js +409 -0
  135. package/dist/ws/session-stream-handler.js.map +1 -0
  136. package/package.json +83 -0
@@ -0,0 +1,434 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+ import { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';
3
+
4
+ // src/cli/commands/trace-diagnose.ts
5
+
6
+ // src/cli/commands/trace-event-normalizer.ts
7
+ function normalizeTraceEvents(events) {
8
+ const out = [];
9
+ let currentIteration = 0;
10
+ for (const raw of events) {
11
+ const type = String(raw.type ?? "");
12
+ const data = getEventData(raw);
13
+ const explicitIteration = asNumber(raw.iteration) ?? asNumber(data.iteration);
14
+ if (type === "iteration:start") {
15
+ currentIteration = explicitIteration ?? Math.max(1, currentIteration + 1);
16
+ }
17
+ const iteration = explicitIteration ?? currentIteration;
18
+ out.push({ raw, type, data, iteration });
19
+ }
20
+ return out;
21
+ }
22
+ function getEventData(event) {
23
+ const data = event.data;
24
+ if (data && typeof data === "object") {
25
+ return data;
26
+ }
27
+ return {};
28
+ }
29
+ function asNumber(value) {
30
+ if (typeof value === "number" && Number.isFinite(value)) {
31
+ return value;
32
+ }
33
+ if (typeof value === "string") {
34
+ const n = Number(value);
35
+ if (Number.isFinite(n)) {
36
+ return n;
37
+ }
38
+ }
39
+ return void 0;
40
+ }
41
+
42
+ // src/cli/commands/trace-diagnose.ts
43
+ var trace_diagnose_default = defineCommand({
44
+ id: "trace:diagnose",
45
+ description: 'Quick diagnostic analysis \u2014 answers "what went wrong?" in one command',
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const flags = input.flags ?? input;
49
+ const taskId = flags["task-id"] ?? flags.taskId;
50
+ try {
51
+ const loaded = await loadTrace(taskId);
52
+ if (!loaded.ok) {
53
+ ctx.ui.write(JSON.stringify(mkError("INVALID_TASK_ID", formatTraceLoadError(loaded.error)), null, 2) + "\n");
54
+ return { exitCode: 1 };
55
+ }
56
+ const events = loaded.events;
57
+ const report = analyzeDiagnostics(taskId ?? "", events);
58
+ if (flags.json) {
59
+ ctx.ui.write(JSON.stringify({ success: true, report }, null, 2) + "\n");
60
+ } else {
61
+ printReport(ctx, report);
62
+ }
63
+ return { exitCode: report.issues.some((i) => i.severity === "critical") ? 1 : 0 };
64
+ } catch {
65
+ ctx.ui.write(JSON.stringify(mkError("TRACE_NOT_FOUND", `Trace not found: ${taskId}`), null, 2) + "\n");
66
+ return { exitCode: 1 };
67
+ }
68
+ }
69
+ }
70
+ });
71
+ function analyzeDiagnostics(taskId, events) {
72
+ const normalized = normalizeTraceEvents(events);
73
+ const issues = [];
74
+ const taskStart = events[0];
75
+ const agentEnd = [...events].reverse().find((e) => e.type === "agent:end");
76
+ const iterationStarts = normalized.filter((e) => e.type === "iteration:start");
77
+ const iterations = iterationStarts.length || Math.max(0, ...normalized.map((e) => e.iteration));
78
+ const llmEndTokens = normalized.filter((e) => e.type === "llm:end").reduce((sum, e) => sum + (Number(e.data.tokensUsed) || 0), 0);
79
+ const totalTokens = Number(agentEnd?.data?.tokensUsed) || llmEndTokens;
80
+ const durationMs = Number(agentEnd?.data?.durationMs) || (taskStart && events[events.length - 1] ? new Date(events[events.length - 1].timestamp).getTime() - new Date(taskStart.timestamp).getTime() : 0);
81
+ const success = Boolean(agentEnd?.data?.success ?? true);
82
+ let confidence = 0;
83
+ const toolResults = normalized.filter(
84
+ (e) => e.type === "tool:end" || e.type === "tool_result" || e.type === "tool:execution"
85
+ );
86
+ for (const tr of toolResults) {
87
+ const data = tr.data || tr.raw.output || tr.raw;
88
+ const output = typeof data?.output === "string" ? data.output : JSON.stringify(data?.result || "");
89
+ if (output.includes('"confidence"')) {
90
+ try {
91
+ const match = output.match(/"confidence"\s*:\s*([\d.]+)/);
92
+ if (match?.[1]) {
93
+ confidence = parseFloat(match[1]);
94
+ }
95
+ } catch {
96
+ }
97
+ }
98
+ }
99
+ const contextSnapshots = events.filter((e) => e.type === "context:snapshot");
100
+ const contextDiffs = events.filter((e) => e.type === "context:diff");
101
+ const contextTrims = events.filter((e) => e.type === "context:trim");
102
+ let maxContextChars = 0;
103
+ let totalDroppedMessages = 0;
104
+ let truncatedToolOutputs = 0;
105
+ const contextGrowthHistory = [];
106
+ for (const snap of contextSnapshots) {
107
+ const data = snap.data || snap;
108
+ const chars = data.totalChars || 0;
109
+ const dropped = data.slidingWindow?.droppedMessages || 0;
110
+ if (chars > maxContextChars) {
111
+ maxContextChars = chars;
112
+ }
113
+ totalDroppedMessages += dropped;
114
+ contextGrowthHistory.push({
115
+ iteration: data.iteration || 0,
116
+ messageCount: data.messageCount || 0,
117
+ totalChars: chars,
118
+ droppedMessages: dropped
119
+ });
120
+ }
121
+ truncatedToolOutputs = contextTrims.length;
122
+ const tokenGrowth = [];
123
+ let cumulative = 0;
124
+ for (const e of normalized.filter((e2) => e2.type === "llm:end")) {
125
+ cumulative += Number(e.data.tokensUsed) || 0;
126
+ tokenGrowth.push({ iteration: e.iteration, cumulativeTokens: cumulative });
127
+ }
128
+ const systemPromptChanges = [];
129
+ for (const cd of contextDiffs) {
130
+ const diff = (cd.data || cd).diff;
131
+ if (diff?.systemPromptChanged) {
132
+ systemPromptChanges.push({
133
+ iteration: (cd.data || cd).iteration || 0,
134
+ charsDelta: diff.systemPromptCharsDelta || 0
135
+ });
136
+ issues.push({
137
+ severity: "warning",
138
+ category: "context",
139
+ message: `System prompt changed at iteration ${(cd.data || cd).iteration} (${diff.systemPromptCharsDelta > 0 ? "+" : ""}${diff.systemPromptCharsDelta} chars)`
140
+ });
141
+ }
142
+ }
143
+ if (totalDroppedMessages > 0) {
144
+ issues.push({
145
+ severity: "warning",
146
+ category: "context",
147
+ message: `${totalDroppedMessages} messages dropped by sliding window \u2014 agent lost earlier context`,
148
+ details: contextDiffs.filter((d) => (d.data || d).diff?.droppedMessages > 0).map((d) => `Iteration ${(d.data || d).iteration}: ${(d.data || d).diff?.droppedMessages} dropped`).join(", ")
149
+ });
150
+ }
151
+ if (truncatedToolOutputs > 0) {
152
+ issues.push({
153
+ severity: "info",
154
+ category: "context",
155
+ message: `${truncatedToolOutputs} tool outputs were truncated (>8KB) before sending to LLM`
156
+ });
157
+ }
158
+ const toolStarts = normalized.filter((e) => e.type === "tool:start" || e.type === "tool_call");
159
+ const toolEnds = normalized.filter((e) => e.type === "tool:end" || e.type === "tool:execution" || e.type === "tool_result");
160
+ const toolErrors = normalized.filter(
161
+ (e) => e.type === "tool:error" || e.type === "tool:end" && e.data?.success === false || e.type === "tool:execution" && e.raw.output?.success === false || e.type === "tool_result" && e.data?.success === false
162
+ );
163
+ const toolBreakdown = {};
164
+ const slowCalls = [];
165
+ const SLOW_THRESHOLD_MS = 5e3;
166
+ for (const te of toolEnds) {
167
+ const data = te.data || te.raw;
168
+ const name = data.toolName || data.tool?.name || "unknown";
169
+ const dur = Number(data.durationMs) || Number(data.timing?.durationMs) || 0;
170
+ const success2 = data.success ?? data.output?.success ?? true;
171
+ if (!toolBreakdown[name]) {
172
+ toolBreakdown[name] = { calls: 0, failures: 0, totalDurationMs: 0 };
173
+ }
174
+ toolBreakdown[name].calls++;
175
+ toolBreakdown[name].totalDurationMs += dur;
176
+ if (!success2) {
177
+ toolBreakdown[name].failures++;
178
+ }
179
+ if (dur > SLOW_THRESHOLD_MS) {
180
+ const args = data.input ? JSON.stringify(data.input).slice(0, 100) : "";
181
+ slowCalls.push({
182
+ tool: name,
183
+ durationMs: dur,
184
+ iteration: te.iteration || Number(data.iteration) || 0,
185
+ args
186
+ });
187
+ }
188
+ }
189
+ const toolBreakdownFinal = {};
190
+ for (const [name, stats] of Object.entries(toolBreakdown)) {
191
+ toolBreakdownFinal[name] = {
192
+ calls: stats.calls,
193
+ failures: stats.failures,
194
+ avgDurationMs: stats.calls > 0 ? Math.round(stats.totalDurationMs / stats.calls) : 0
195
+ };
196
+ }
197
+ for (const err of toolErrors) {
198
+ const data = err.data || err.raw;
199
+ const name = data.toolName || data.tool?.name || "unknown";
200
+ const errMsg = data.error || data.output?.error?.message || "";
201
+ issues.push({
202
+ severity: "warning",
203
+ category: "tool",
204
+ message: `Tool "${name}" failed: ${typeof errMsg === "string" ? errMsg.slice(0, 200) : JSON.stringify(errMsg).slice(0, 200)}`,
205
+ iteration: Number(data.iteration) || err.iteration
206
+ });
207
+ }
208
+ const llmResponses = normalized.filter((e) => e.type === "llm:end" || e.type === "llm_response");
209
+ const llmCalls = normalized.filter((e) => e.type === "llm:start" || e.type === "llm:call" || e.type === "llm_call");
210
+ let emptyResponses = 0;
211
+ const reasoningTexts = [];
212
+ for (const lr of llmResponses) {
213
+ const data = lr.data || lr.raw;
214
+ const content = data.content || "";
215
+ const hasToolCalls = data.hasToolCalls || false;
216
+ if (!content && !hasToolCalls) {
217
+ emptyResponses++;
218
+ issues.push({
219
+ severity: "warning",
220
+ category: "llm",
221
+ message: "LLM returned empty response (no text, no tool calls)",
222
+ iteration: lr.iteration || Number(data.iteration) || 0
223
+ });
224
+ }
225
+ if (content && content.length > 5 && content !== "[Executing tools...]") {
226
+ reasoningTexts.push({
227
+ iteration: lr.iteration || Number(data.iteration) || 0,
228
+ preview: content.slice(0, 300)
229
+ });
230
+ }
231
+ }
232
+ const stoppingAnalyses = events.filter((e) => e.type === "stopping:analysis");
233
+ const stoppingReasons = stoppingAnalyses.map((e) => (e.data || e).reasoning || "").filter(Boolean);
234
+ const errors = normalized.filter((e) => e.type === "error:captured" || e.type === "agent:error");
235
+ for (const err of errors) {
236
+ const data = err.data || err.raw;
237
+ const msg = data.error?.message || data.error || "";
238
+ issues.push({
239
+ severity: "critical",
240
+ category: "error",
241
+ message: typeof msg === "string" ? msg.slice(0, 300) : JSON.stringify(msg).slice(0, 300),
242
+ iteration: Number(data.iteration) || err.iteration,
243
+ details: data.error?.stack || data.agentStack ? JSON.stringify(data.agentStack || {}).slice(0, 200) : void 0
244
+ });
245
+ }
246
+ let loopDetected = false;
247
+ const repeatedPatterns = [];
248
+ const toolCallSequence = toolStarts.map((e) => {
249
+ const data = e.data || e.raw;
250
+ return data.toolName || data.tool?.name || "unknown";
251
+ });
252
+ if (toolCallSequence.length >= 6) {
253
+ for (let windowSize = 2; windowSize <= 3; windowSize++) {
254
+ const lastN = toolCallSequence.slice(-windowSize * 2);
255
+ const first = lastN.slice(0, windowSize).join(",");
256
+ const second = lastN.slice(windowSize).join(",");
257
+ if (first === second) {
258
+ loopDetected = true;
259
+ repeatedPatterns.push(first);
260
+ issues.push({
261
+ severity: "warning",
262
+ category: "loop",
263
+ message: `Repeated tool pattern detected: ${first} (called ${windowSize} times in a row)`
264
+ });
265
+ }
266
+ }
267
+ }
268
+ if (!success) {
269
+ issues.push({
270
+ severity: "critical",
271
+ category: "quality",
272
+ message: "Task failed \u2014 agent did not produce a successful result"
273
+ });
274
+ }
275
+ if (confidence > 0 && confidence < 0.5) {
276
+ issues.push({
277
+ severity: "warning",
278
+ category: "quality",
279
+ message: `Low confidence: ${confidence} \u2014 agent was not confident in its answer`
280
+ });
281
+ }
282
+ if (iterations >= 20) {
283
+ issues.push({
284
+ severity: "warning",
285
+ category: "quality",
286
+ message: `Used ${iterations} iterations \u2014 may indicate difficulty finding answer`
287
+ });
288
+ }
289
+ const severityOrder = { critical: 0, warning: 1, info: 2 };
290
+ issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
291
+ return {
292
+ taskId,
293
+ summary: {
294
+ totalEvents: events.length,
295
+ iterations,
296
+ totalTokens,
297
+ durationMs,
298
+ success,
299
+ confidence
300
+ },
301
+ issues,
302
+ contextHealth: {
303
+ maxContextChars,
304
+ maxContextTokens: Math.round(maxContextChars / 4),
305
+ totalDroppedMessages,
306
+ truncatedToolOutputs,
307
+ contextGrowthHistory,
308
+ tokenGrowth,
309
+ systemPromptChanges
310
+ },
311
+ toolUsage: {
312
+ totalCalls: Object.values(toolBreakdownFinal).reduce((sum, t) => sum + t.calls, 0),
313
+ failures: Object.values(toolBreakdownFinal).reduce((sum, t) => sum + t.failures, 0),
314
+ toolBreakdown: toolBreakdownFinal,
315
+ slowCalls: slowCalls.sort((a, b) => b.durationMs - a.durationMs)
316
+ },
317
+ llmBehavior: {
318
+ totalCalls: llmCalls.length,
319
+ emptyResponses,
320
+ reasoningTexts,
321
+ stoppingReasons
322
+ },
323
+ loopDetection: {
324
+ detected: loopDetected,
325
+ repeatedPatterns
326
+ }
327
+ };
328
+ }
329
+ function printReport(ctx, report) {
330
+ const { summary, issues, contextHealth, toolUsage, llmBehavior, loopDetection } = report;
331
+ ctx.ui.write("\n");
332
+ ctx.ui.write("=".repeat(60) + "\n");
333
+ ctx.ui.write(` DIAGNOSTIC REPORT: ${report.taskId}
334
+ `);
335
+ ctx.ui.write("=".repeat(60) + "\n");
336
+ const status = summary.success ? " OK" : " FAILED";
337
+ ctx.ui.write(`
338
+ ${status}
339
+ `);
340
+ ctx.ui.write(` Iterations: ${summary.iterations} | Tokens: ${summary.totalTokens} | Time: ${(summary.durationMs / 1e3).toFixed(1)}s`);
341
+ if (summary.confidence > 0) {
342
+ ctx.ui.write(` | Confidence: ${summary.confidence}`);
343
+ }
344
+ ctx.ui.write("\n");
345
+ if (issues.length > 0) {
346
+ ctx.ui.write("\n--- Issues (" + issues.length + ") ---\n");
347
+ for (const issue of issues) {
348
+ const icon = issue.severity === "critical" ? "X" : issue.severity === "warning" ? "!" : "i";
349
+ const iter = issue.iteration ? ` [iter ${issue.iteration}]` : "";
350
+ ctx.ui.write(` [${icon}] ${issue.category}: ${issue.message}${iter}
351
+ `);
352
+ if (issue.details) {
353
+ ctx.ui.write(` ${issue.details.slice(0, 150)}
354
+ `);
355
+ }
356
+ }
357
+ } else {
358
+ ctx.ui.write("\n No issues detected.\n");
359
+ }
360
+ ctx.ui.write("\n--- Context Window ---\n");
361
+ ctx.ui.write(` Max context: ~${contextHealth.maxContextTokens} tokens (${contextHealth.maxContextChars} chars)
362
+ `);
363
+ ctx.ui.write(` Dropped messages: ${contextHealth.totalDroppedMessages}
364
+ `);
365
+ ctx.ui.write(` Truncated outputs: ${contextHealth.truncatedToolOutputs}
366
+ `);
367
+ if (contextHealth.contextGrowthHistory.length > 0) {
368
+ ctx.ui.write(" Growth: ");
369
+ ctx.ui.write(contextHealth.contextGrowthHistory.map((g) => `iter${g.iteration}=${g.messageCount}msg/${Math.round(g.totalChars / 1e3)}K` + (g.droppedMessages > 0 ? `(-${g.droppedMessages})` : "")).join(" -> "));
370
+ ctx.ui.write("\n");
371
+ }
372
+ if (contextHealth.tokenGrowth.length > 0) {
373
+ ctx.ui.write(" Tokens: ");
374
+ ctx.ui.write(contextHealth.tokenGrowth.map((t) => `iter${t.iteration}=${t.cumulativeTokens}`).join(" -> "));
375
+ ctx.ui.write("\n");
376
+ }
377
+ if (contextHealth.systemPromptChanges.length > 0) {
378
+ ctx.ui.write(" System prompt changes:\n");
379
+ for (const sp of contextHealth.systemPromptChanges) {
380
+ ctx.ui.write(` iter${sp.iteration}: ${sp.charsDelta > 0 ? "+" : ""}${sp.charsDelta} chars
381
+ `);
382
+ }
383
+ }
384
+ ctx.ui.write("\n--- Tools ---\n");
385
+ ctx.ui.write(` Total calls: ${toolUsage.totalCalls} | Failures: ${toolUsage.failures}
386
+ `);
387
+ const entries = Object.entries(toolUsage.toolBreakdown).sort((a, b) => b[1].calls - a[1].calls);
388
+ for (const [name, stats] of entries) {
389
+ const fail = stats.failures > 0 ? ` (${stats.failures} failed)` : "";
390
+ ctx.ui.write(` ${name}: ${stats.calls}x avg ${stats.avgDurationMs}ms${fail}
391
+ `);
392
+ }
393
+ if (toolUsage.slowCalls.length > 0) {
394
+ ctx.ui.write(" Slow calls (>5s):\n");
395
+ for (const sc of toolUsage.slowCalls) {
396
+ const durStr = sc.durationMs >= 6e4 ? `${(sc.durationMs / 6e4).toFixed(1)}min` : `${(sc.durationMs / 1e3).toFixed(1)}s`;
397
+ ctx.ui.write(` [iter ${sc.iteration}] ${sc.tool} ${durStr}${sc.args ? ` args=${sc.args}` : ""}
398
+ `);
399
+ }
400
+ }
401
+ ctx.ui.write("\n--- LLM ---\n");
402
+ ctx.ui.write(` Calls: ${llmBehavior.totalCalls} | Empty responses: ${llmBehavior.emptyResponses}
403
+ `);
404
+ if (llmBehavior.reasoningTexts.length > 0) {
405
+ ctx.ui.write(" Reasoning:\n");
406
+ for (const rt of llmBehavior.reasoningTexts.slice(0, 5)) {
407
+ const preview = rt.preview.replace(/\n/g, " ").slice(0, 120);
408
+ ctx.ui.write(` [iter ${rt.iteration}] "${preview}"
409
+ `);
410
+ }
411
+ }
412
+ if (llmBehavior.stoppingReasons.length > 0) {
413
+ ctx.ui.write(" Stop reasons: " + [...new Set(llmBehavior.stoppingReasons)].join(", ") + "\n");
414
+ }
415
+ if (loopDetection.detected) {
416
+ ctx.ui.write("\n--- Loop Detection ---\n");
417
+ ctx.ui.write(` LOOP DETECTED: ${loopDetection.repeatedPatterns.join("; ")}
418
+ `);
419
+ }
420
+ ctx.ui.write("\n" + "=".repeat(60) + "\n\n");
421
+ }
422
+ function mkError(code, message) {
423
+ return {
424
+ success: false,
425
+ command: "trace:diagnose",
426
+ taskId: "",
427
+ error: { code, message },
428
+ summary: { message, severity: "error", actionable: true }
429
+ };
430
+ }
431
+
432
+ export { trace_diagnose_default as default };
433
+ //# sourceMappingURL=trace-diagnose.js.map
434
+ //# sourceMappingURL=trace-diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/commands/trace-event-normalizer.ts","../../../src/cli/commands/trace-diagnose.ts"],"names":["e","success"],"mappings":"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","file":"trace-diagnose.js","sourcesContent":["import type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\n\nexport type NormalizedTraceEvent = {\n raw: DetailedTraceEntry;\n type: string;\n data: Record<string, unknown>;\n iteration: number;\n};\n\nexport function normalizeTraceEvents(events: DetailedTraceEntry[]): NormalizedTraceEvent[] {\n const out: NormalizedTraceEvent[] = [];\n let currentIteration = 0;\n\n for (const raw of events) {\n const type = String((raw as any).type ?? '');\n const data = getEventData(raw);\n\n const explicitIteration = asNumber((raw as any).iteration) ?? asNumber(data.iteration);\n if (type === 'iteration:start') {\n currentIteration = explicitIteration ?? Math.max(1, currentIteration + 1);\n }\n\n const iteration = explicitIteration ?? currentIteration;\n out.push({ raw, type, data, iteration });\n }\n\n return out;\n}\n\nexport function getEventData(event: DetailedTraceEntry): Record<string, unknown> {\n const data = (event as any).data;\n if (data && typeof data === 'object') {\n return data as Record<string, unknown>;\n }\n return {};\n}\n\nexport function asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const n = Number(value);\n if (Number.isFinite(n)) {\n return n;\n }\n }\n return undefined;\n}\n","/**\n * agent:trace:diagnose - Quick diagnostic analysis of agent execution\n *\n * One command to answer \"what went wrong?\" — shows errors, context drops,\n * tool failures, loop detection, LLM reasoning, and quality indicators.\n *\n * Usage:\n * pnpm kb agent trace diagnose --task-id=<id>\n * pnpm kb agent trace diagnose --task-id=<id> --json\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { TraceCommandResponse, TraceErrorCode } from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\ntype TraceDiagnoseInput = {\n taskId?: string;\n 'task-id'?: string;\n json?: boolean;\n};\n\ninterface DiagnosticReport {\n taskId: string;\n summary: {\n totalEvents: number;\n iterations: number;\n totalTokens: number;\n durationMs: number;\n success: boolean;\n confidence: number;\n };\n issues: DiagnosticIssue[];\n contextHealth: {\n maxContextChars: number;\n maxContextTokens: number;\n totalDroppedMessages: number;\n truncatedToolOutputs: number;\n contextGrowthHistory: Array<{\n iteration: number;\n messageCount: number;\n totalChars: number;\n droppedMessages: number;\n }>;\n tokenGrowth: Array<{\n iteration: number;\n cumulativeTokens: number;\n }>;\n systemPromptChanges: Array<{\n iteration: number;\n charsDelta: number;\n }>;\n };\n toolUsage: {\n totalCalls: number;\n failures: number;\n toolBreakdown: Record<string, { calls: number; failures: number; avgDurationMs: number }>;\n slowCalls: Array<{ tool: string; durationMs: number; iteration: number; args: string }>;\n };\n llmBehavior: {\n totalCalls: number;\n emptyResponses: number;\n reasoningTexts: Array<{\n iteration: number;\n preview: string;\n }>;\n stoppingReasons: string[];\n };\n loopDetection: {\n detected: boolean;\n repeatedPatterns: string[];\n };\n}\n\ninterface DiagnosticIssue {\n severity: 'critical' | 'warning' | 'info';\n category: 'error' | 'context' | 'tool' | 'llm' | 'loop' | 'quality';\n message: string;\n iteration?: number;\n details?: string;\n}\n\nexport default defineCommand({\n id: 'trace:diagnose',\n description: 'Quick diagnostic analysis — answers \"what went wrong?\" in one command',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceDiagnoseInput): Promise<{ exitCode: number }> {\n const flags = (input as any).flags ?? input;\n const taskId = (flags['task-id'] ?? flags.taskId) as string | undefined;\n\n try {\n const loaded = await loadTrace(taskId);\n if (!loaded.ok) {\n ctx.ui.write(JSON.stringify(mkError('INVALID_TASK_ID', formatTraceLoadError(loaded.error)), null, 2) + '\\n');\n return { exitCode: 1 };\n }\n const events = loaded.events;\n\n const report = analyzeDiagnostics(taskId ?? '', events);\n\n if (flags.json) {\n ctx.ui.write(JSON.stringify({ success: true, report }, null, 2) + '\\n');\n } else {\n printReport(ctx, report);\n }\n\n return { exitCode: report.issues.some(i => i.severity === 'critical') ? 1 : 0 };\n } catch {\n ctx.ui.write(JSON.stringify(mkError('TRACE_NOT_FOUND', `Trace not found: ${taskId}`), null, 2) + '\\n');\n return { exitCode: 1 };\n }\n },\n },\n});\n\nfunction analyzeDiagnostics(taskId: string, events: any[]): DiagnosticReport {\n const normalized = normalizeTraceEvents(events as any[]);\n const issues: DiagnosticIssue[] = [];\n\n // === Summary ===\n const taskStart = events[0];\n const agentEnd = [...events].reverse().find(e => e.type === 'agent:end');\n const iterationStarts = normalized.filter(e => e.type === 'iteration:start');\n const iterations = iterationStarts.length || Math.max(0, ...normalized.map(e => e.iteration));\n const llmEndTokens = normalized\n .filter(e => e.type === 'llm:end')\n .reduce((sum, e) => sum + (Number(e.data.tokensUsed) || 0), 0);\n const totalTokens = Number(agentEnd?.data?.tokensUsed) || llmEndTokens;\n const durationMs = Number(agentEnd?.data?.durationMs)\n || (taskStart && events[events.length - 1]\n ? new Date(events[events.length - 1].timestamp).getTime() - new Date(taskStart.timestamp).getTime()\n : 0);\n const success = Boolean(agentEnd?.data?.success ?? true);\n\n // Confidence from report_to_orchestrator\n let confidence = 0;\n const toolResults = normalized.filter(e =>\n e.type === 'tool:end' || e.type === 'tool_result' || e.type === 'tool:execution'\n );\n for (const tr of toolResults) {\n const data = tr.data || (tr.raw as any).output || tr.raw;\n const output = typeof data?.output === 'string' ? data.output : JSON.stringify(data?.result || '');\n if (output.includes('\"confidence\"')) {\n try {\n const match = output.match(/\"confidence\"\\s*:\\s*([\\d.]+)/);\n if (match?.[1]) {confidence = parseFloat(match[1]);}\n } catch { /* ignore */ }\n }\n }\n\n // === Context Health ===\n const contextSnapshots = events.filter(e => e.type === 'context:snapshot');\n const contextDiffs = events.filter(e => e.type === 'context:diff');\n const contextTrims = events.filter(e => e.type === 'context:trim');\n let maxContextChars = 0;\n let totalDroppedMessages = 0;\n let truncatedToolOutputs = 0;\n\n const contextGrowthHistory: DiagnosticReport['contextHealth']['contextGrowthHistory'] = [];\n\n for (const snap of contextSnapshots) {\n const data = snap.data || snap;\n const chars = data.totalChars || 0;\n const dropped = data.slidingWindow?.droppedMessages || 0;\n if (chars > maxContextChars) {maxContextChars = chars;}\n totalDroppedMessages += dropped;\n contextGrowthHistory.push({\n iteration: data.iteration || 0,\n messageCount: data.messageCount || 0,\n totalChars: chars,\n droppedMessages: dropped,\n });\n }\n\n truncatedToolOutputs = contextTrims.length;\n\n // Token growth per iteration (from iteration:end cumulativeTokens)\n const tokenGrowth: Array<{ iteration: number; cumulativeTokens: number }> = [];\n let cumulative = 0;\n for (const e of normalized.filter(e => e.type === 'llm:end')) {\n cumulative += Number(e.data.tokensUsed) || 0;\n tokenGrowth.push({ iteration: e.iteration, cumulativeTokens: cumulative });\n }\n\n // System prompt changes (from context:diff)\n const systemPromptChanges: Array<{ iteration: number; charsDelta: number }> = [];\n for (const cd of contextDiffs) {\n const diff = (cd.data || cd).diff;\n if (diff?.systemPromptChanged) {\n systemPromptChanges.push({\n iteration: (cd.data || cd).iteration || 0,\n charsDelta: diff.systemPromptCharsDelta || 0,\n });\n issues.push({\n severity: 'warning',\n category: 'context',\n message: `System prompt changed at iteration ${(cd.data || cd).iteration} (${diff.systemPromptCharsDelta > 0 ? '+' : ''}${diff.systemPromptCharsDelta} chars)`,\n });\n }\n }\n\n // Context issues\n if (totalDroppedMessages > 0) {\n issues.push({\n severity: 'warning',\n category: 'context',\n message: `${totalDroppedMessages} messages dropped by sliding window — agent lost earlier context`,\n details: contextDiffs\n .filter(d => (d.data || d).diff?.droppedMessages > 0)\n .map(d => `Iteration ${(d.data || d).iteration}: ${(d.data || d).diff?.droppedMessages} dropped`)\n .join(', '),\n });\n }\n\n if (truncatedToolOutputs > 0) {\n issues.push({\n severity: 'info',\n category: 'context',\n message: `${truncatedToolOutputs} tool outputs were truncated (>8KB) before sending to LLM`,\n });\n }\n\n // === Tool Usage ===\n const toolStarts = normalized.filter(e => e.type === 'tool:start' || e.type === 'tool_call');\n const toolEnds = normalized.filter(e => e.type === 'tool:end' || e.type === 'tool:execution' || e.type === 'tool_result');\n const toolErrors = normalized.filter(e =>\n e.type === 'tool:error'\n || (e.type === 'tool:end' && e.data?.success === false)\n || (e.type === 'tool:execution' && (e.raw as any).output?.success === false)\n || (e.type === 'tool_result' && e.data?.success === false)\n );\n\n const toolBreakdown: Record<string, { calls: number; failures: number; totalDurationMs: number }> = {};\n const slowCalls: Array<{ tool: string; durationMs: number; iteration: number; args: string }> = [];\n const SLOW_THRESHOLD_MS = 5000; // 5s threshold for \"slow\" calls\n\n for (const te of toolEnds) {\n const data = (te.data || (te.raw as any)) as any;\n const name = (data.toolName as string | undefined) || (data.tool?.name as string | undefined) || 'unknown';\n const dur = Number(data.durationMs) || Number(data.timing?.durationMs) || 0;\n const success = (data.success as boolean | undefined) ?? (data.output?.success as boolean | undefined) ?? true;\n\n if (!toolBreakdown[name]) {\n toolBreakdown[name] = { calls: 0, failures: 0, totalDurationMs: 0 };\n }\n toolBreakdown[name].calls++;\n toolBreakdown[name].totalDurationMs += dur;\n if (!success) {toolBreakdown[name].failures++;}\n\n // Track slow calls (>5s)\n if (dur > SLOW_THRESHOLD_MS) {\n const args = data.input ? JSON.stringify(data.input).slice(0, 100) : '';\n slowCalls.push({\n tool: name,\n durationMs: dur,\n iteration: te.iteration || Number(data.iteration) || 0,\n args,\n });\n }\n }\n\n const toolBreakdownFinal: Record<string, { calls: number; failures: number; avgDurationMs: number }> = {};\n for (const [name, stats] of Object.entries(toolBreakdown)) {\n toolBreakdownFinal[name] = {\n calls: stats.calls,\n failures: stats.failures,\n avgDurationMs: stats.calls > 0 ? Math.round(stats.totalDurationMs / stats.calls) : 0,\n };\n }\n\n // Tool failure issues\n for (const err of toolErrors) {\n const data = (err.data || (err.raw as any)) as any;\n const name = data.toolName || data.tool?.name || 'unknown';\n const errMsg = data.error || data.output?.error?.message || '';\n issues.push({\n severity: 'warning',\n category: 'tool',\n message: `Tool \"${name}\" failed: ${typeof errMsg === 'string' ? errMsg.slice(0, 200) : JSON.stringify(errMsg).slice(0, 200)}`,\n iteration: Number(data.iteration) || err.iteration,\n });\n }\n\n // === LLM Behavior ===\n const llmResponses = normalized.filter(e => e.type === 'llm:end' || e.type === 'llm_response');\n const llmCalls = normalized.filter(e => e.type === 'llm:start' || e.type === 'llm:call' || e.type === 'llm_call');\n let emptyResponses = 0;\n const reasoningTexts: DiagnosticReport['llmBehavior']['reasoningTexts'] = [];\n\n for (const lr of llmResponses) {\n const data = (lr.data || (lr.raw as any)) as any;\n const content = data.content || '';\n const hasToolCalls = data.hasToolCalls || false;\n\n if (!content && !hasToolCalls) {\n emptyResponses++;\n issues.push({\n severity: 'warning',\n category: 'llm',\n message: 'LLM returned empty response (no text, no tool calls)',\n iteration: lr.iteration || Number(data.iteration) || 0,\n });\n }\n\n // Capture reasoning text (text before tool calls)\n if (content && content.length > 5 && content !== '[Executing tools...]') {\n reasoningTexts.push({\n iteration: lr.iteration || Number(data.iteration) || 0,\n preview: content.slice(0, 300),\n });\n }\n }\n\n // Stopping analysis\n const stoppingAnalyses = events.filter(e => e.type === 'stopping:analysis');\n const stoppingReasons = stoppingAnalyses\n .map(e => (e.data || e).reasoning || '')\n .filter(Boolean);\n\n // === Error Detection ===\n const errors = normalized.filter(e => e.type === 'error:captured' || e.type === 'agent:error');\n for (const err of errors) {\n const data = (err.data || (err.raw as any)) as any;\n const msg = data.error?.message || data.error || '';\n issues.push({\n severity: 'critical',\n category: 'error',\n message: typeof msg === 'string' ? msg.slice(0, 300) : JSON.stringify(msg).slice(0, 300),\n iteration: Number(data.iteration) || err.iteration,\n details: data.error?.stack || data.agentStack ? JSON.stringify(data.agentStack || {}).slice(0, 200) : undefined,\n });\n }\n\n // === Loop Detection ===\n let loopDetected = false;\n const repeatedPatterns: string[] = [];\n\n // Check for repeated tool call patterns\n const toolCallSequence = toolStarts\n .map(e => {\n const data = (e.data || (e.raw as any)) as any;\n return data.toolName || data.tool?.name || 'unknown';\n });\n\n if (toolCallSequence.length >= 6) {\n // Check last 6 calls for repeating patterns of 3\n for (let windowSize = 2; windowSize <= 3; windowSize++) {\n const lastN = toolCallSequence.slice(-windowSize * 2);\n const first = lastN.slice(0, windowSize).join(',');\n const second = lastN.slice(windowSize).join(',');\n if (first === second) {\n loopDetected = true;\n repeatedPatterns.push(first);\n issues.push({\n severity: 'warning',\n category: 'loop',\n message: `Repeated tool pattern detected: ${first} (called ${windowSize} times in a row)`,\n });\n }\n }\n }\n\n // === Quality Issues ===\n if (!success) {\n issues.push({\n severity: 'critical',\n category: 'quality',\n message: 'Task failed — agent did not produce a successful result',\n });\n }\n\n if (confidence > 0 && confidence < 0.5) {\n issues.push({\n severity: 'warning',\n category: 'quality',\n message: `Low confidence: ${confidence} — agent was not confident in its answer`,\n });\n }\n\n if (iterations >= 20) {\n issues.push({\n severity: 'warning',\n category: 'quality',\n message: `Used ${iterations} iterations — may indicate difficulty finding answer`,\n });\n }\n\n // Sort issues: critical first, then warning, then info\n const severityOrder = { critical: 0, warning: 1, info: 2 };\n issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n\n return {\n taskId,\n summary: {\n totalEvents: events.length,\n iterations,\n totalTokens,\n durationMs,\n success,\n confidence,\n },\n issues,\n contextHealth: {\n maxContextChars,\n maxContextTokens: Math.round(maxContextChars / 4),\n totalDroppedMessages,\n truncatedToolOutputs,\n contextGrowthHistory,\n tokenGrowth,\n systemPromptChanges,\n },\n toolUsage: {\n totalCalls: Object.values(toolBreakdownFinal).reduce((sum, t) => sum + t.calls, 0),\n failures: Object.values(toolBreakdownFinal).reduce((sum, t) => sum + t.failures, 0),\n toolBreakdown: toolBreakdownFinal,\n slowCalls: slowCalls.sort((a, b) => b.durationMs - a.durationMs),\n },\n llmBehavior: {\n totalCalls: llmCalls.length,\n emptyResponses,\n reasoningTexts,\n stoppingReasons,\n },\n loopDetection: {\n detected: loopDetected,\n repeatedPatterns,\n },\n };\n}\n\nfunction printReport(ctx: PluginContextV3, report: DiagnosticReport): void {\n const { summary, issues, contextHealth, toolUsage, llmBehavior, loopDetection } = report;\n\n ctx.ui.write('\\n');\n ctx.ui.write('=' .repeat(60) + '\\n');\n ctx.ui.write(` DIAGNOSTIC REPORT: ${report.taskId}\\n`);\n ctx.ui.write('=' .repeat(60) + '\\n');\n\n // Summary\n const status = summary.success ? ' OK' : ' FAILED';\n ctx.ui.write(`\\n${status}\\n`);\n ctx.ui.write(` Iterations: ${summary.iterations} | Tokens: ${summary.totalTokens} | Time: ${(summary.durationMs / 1000).toFixed(1)}s`);\n if (summary.confidence > 0) {ctx.ui.write(` | Confidence: ${summary.confidence}`);}\n ctx.ui.write('\\n');\n\n // Issues\n if (issues.length > 0) {\n ctx.ui.write('\\n--- Issues (' + issues.length + ') ---\\n');\n for (const issue of issues) {\n const icon = issue.severity === 'critical' ? 'X' : issue.severity === 'warning' ? '!' : 'i';\n const iter = issue.iteration ? ` [iter ${issue.iteration}]` : '';\n ctx.ui.write(` [${icon}] ${issue.category}: ${issue.message}${iter}\\n`);\n if (issue.details) {\n ctx.ui.write(` ${issue.details.slice(0, 150)}\\n`);\n }\n }\n } else {\n ctx.ui.write('\\n No issues detected.\\n');\n }\n\n // Context Health\n ctx.ui.write('\\n--- Context Window ---\\n');\n ctx.ui.write(` Max context: ~${contextHealth.maxContextTokens} tokens (${contextHealth.maxContextChars} chars)\\n`);\n ctx.ui.write(` Dropped messages: ${contextHealth.totalDroppedMessages}\\n`);\n ctx.ui.write(` Truncated outputs: ${contextHealth.truncatedToolOutputs}\\n`);\n\n if (contextHealth.contextGrowthHistory.length > 0) {\n ctx.ui.write(' Growth: ');\n ctx.ui.write(contextHealth.contextGrowthHistory\n .map(g => `iter${g.iteration}=${g.messageCount}msg/${Math.round(g.totalChars/1000)}K` +\n (g.droppedMessages > 0 ? `(-${g.droppedMessages})` : ''))\n .join(' -> '));\n ctx.ui.write('\\n');\n }\n\n if (contextHealth.tokenGrowth.length > 0) {\n ctx.ui.write(' Tokens: ');\n ctx.ui.write(contextHealth.tokenGrowth\n .map(t => `iter${t.iteration}=${t.cumulativeTokens}`)\n .join(' -> '));\n ctx.ui.write('\\n');\n }\n\n if (contextHealth.systemPromptChanges.length > 0) {\n ctx.ui.write(' System prompt changes:\\n');\n for (const sp of contextHealth.systemPromptChanges) {\n ctx.ui.write(` iter${sp.iteration}: ${sp.charsDelta > 0 ? '+' : ''}${sp.charsDelta} chars\\n`);\n }\n }\n\n // Tool Usage\n ctx.ui.write('\\n--- Tools ---\\n');\n ctx.ui.write(` Total calls: ${toolUsage.totalCalls} | Failures: ${toolUsage.failures}\\n`);\n const entries = Object.entries(toolUsage.toolBreakdown)\n .sort((a, b) => b[1].calls - a[1].calls);\n for (const [name, stats] of entries) {\n const fail = stats.failures > 0 ? ` (${stats.failures} failed)` : '';\n ctx.ui.write(` ${name}: ${stats.calls}x avg ${stats.avgDurationMs}ms${fail}\\n`);\n }\n\n // Slow calls\n if (toolUsage.slowCalls.length > 0) {\n ctx.ui.write(' Slow calls (>5s):\\n');\n for (const sc of toolUsage.slowCalls) {\n const durStr = sc.durationMs >= 60000\n ? `${(sc.durationMs / 60000).toFixed(1)}min`\n : `${(sc.durationMs / 1000).toFixed(1)}s`;\n ctx.ui.write(` [iter ${sc.iteration}] ${sc.tool} ${durStr}${sc.args ? ` args=${sc.args}` : ''}\\n`);\n }\n }\n\n // LLM Behavior\n ctx.ui.write('\\n--- LLM ---\\n');\n ctx.ui.write(` Calls: ${llmBehavior.totalCalls} | Empty responses: ${llmBehavior.emptyResponses}\\n`);\n\n if (llmBehavior.reasoningTexts.length > 0) {\n ctx.ui.write(' Reasoning:\\n');\n for (const rt of llmBehavior.reasoningTexts.slice(0, 5)) {\n const preview = rt.preview.replace(/\\n/g, ' ').slice(0, 120);\n ctx.ui.write(` [iter ${rt.iteration}] \"${preview}\"\\n`);\n }\n }\n\n if (llmBehavior.stoppingReasons.length > 0) {\n ctx.ui.write(' Stop reasons: ' + [...new Set(llmBehavior.stoppingReasons)].join(', ') + '\\n');\n }\n\n // Loop Detection\n if (loopDetection.detected) {\n ctx.ui.write('\\n--- Loop Detection ---\\n');\n ctx.ui.write(` LOOP DETECTED: ${loopDetection.repeatedPatterns.join('; ')}\\n`);\n }\n\n ctx.ui.write('\\n' + '=' .repeat(60) + '\\n\\n');\n}\n\nfunction mkError(code: TraceErrorCode, message: string): TraceCommandResponse {\n return {\n success: false,\n command: 'trace:diagnose',\n taskId: '',\n error: { code, message },\n summary: { message, severity: 'error', actionable: true },\n };\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { DetailedTraceEntry } from '@kb-labs/agent-contracts';
2
+
3
+ type NormalizedTraceEvent = {
4
+ raw: DetailedTraceEntry;
5
+ type: string;
6
+ data: Record<string, unknown>;
7
+ iteration: number;
8
+ };
9
+ declare function normalizeTraceEvents(events: DetailedTraceEntry[]): NormalizedTraceEvent[];
10
+ declare function getEventData(event: DetailedTraceEntry): Record<string, unknown>;
11
+ declare function asNumber(value: unknown): number | undefined;
12
+
13
+ export { type NormalizedTraceEvent, asNumber, getEventData, normalizeTraceEvents };
@@ -0,0 +1,39 @@
1
+ // src/cli/commands/trace-event-normalizer.ts
2
+ function normalizeTraceEvents(events) {
3
+ const out = [];
4
+ let currentIteration = 0;
5
+ for (const raw of events) {
6
+ const type = String(raw.type ?? "");
7
+ const data = getEventData(raw);
8
+ const explicitIteration = asNumber(raw.iteration) ?? asNumber(data.iteration);
9
+ if (type === "iteration:start") {
10
+ currentIteration = explicitIteration ?? Math.max(1, currentIteration + 1);
11
+ }
12
+ const iteration = explicitIteration ?? currentIteration;
13
+ out.push({ raw, type, data, iteration });
14
+ }
15
+ return out;
16
+ }
17
+ function getEventData(event) {
18
+ const data = event.data;
19
+ if (data && typeof data === "object") {
20
+ return data;
21
+ }
22
+ return {};
23
+ }
24
+ function asNumber(value) {
25
+ if (typeof value === "number" && Number.isFinite(value)) {
26
+ return value;
27
+ }
28
+ if (typeof value === "string") {
29
+ const n = Number(value);
30
+ if (Number.isFinite(n)) {
31
+ return n;
32
+ }
33
+ }
34
+ return void 0;
35
+ }
36
+
37
+ export { asNumber, getEventData, normalizeTraceEvents };
38
+ //# sourceMappingURL=trace-event-normalizer.js.map
39
+ //# sourceMappingURL=trace-event-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/commands/trace-event-normalizer.ts"],"names":[],"mappings":";AASO,SAAS,qBAAqB,MAAA,EAAsD;AACzF,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAQ,GAAA,CAAY,IAAA,IAAQ,EAAE,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAE7B,IAAA,MAAM,oBAAoB,QAAA,CAAU,GAAA,CAAY,SAAS,CAAA,IAAK,QAAA,CAAS,KAAK,SAAS,CAAA;AACrF,IAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,MAAA,gBAAA,GAAmB,iBAAA,IAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,mBAAmB,CAAC,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,YAAY,iBAAA,IAAqB,gBAAA;AACvC,IAAA,GAAA,CAAI,KAAK,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,WAAW,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,aAAa,KAAA,EAAoD;AAC/E,EAAA,MAAM,OAAQ,KAAA,CAAc,IAAA;AAC5B,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAC;AACV;AAEO,SAAS,SAAS,KAAA,EAAoC;AAC3D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACtB,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT","file":"trace-event-normalizer.js","sourcesContent":["import type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\n\nexport type NormalizedTraceEvent = {\n raw: DetailedTraceEntry;\n type: string;\n data: Record<string, unknown>;\n iteration: number;\n};\n\nexport function normalizeTraceEvents(events: DetailedTraceEntry[]): NormalizedTraceEvent[] {\n const out: NormalizedTraceEvent[] = [];\n let currentIteration = 0;\n\n for (const raw of events) {\n const type = String((raw as any).type ?? '');\n const data = getEventData(raw);\n\n const explicitIteration = asNumber((raw as any).iteration) ?? asNumber(data.iteration);\n if (type === 'iteration:start') {\n currentIteration = explicitIteration ?? Math.max(1, currentIteration + 1);\n }\n\n const iteration = explicitIteration ?? currentIteration;\n out.push({ raw, type, data, iteration });\n }\n\n return out;\n}\n\nexport function getEventData(event: DetailedTraceEntry): Record<string, unknown> {\n const data = (event as any).data;\n if (data && typeof data === 'object') {\n return data as Record<string, unknown>;\n }\n return {};\n}\n\nexport function asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const n = Number(value);\n if (Number.isFinite(n)) {\n return n;\n }\n }\n return undefined;\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ /**
4
+ * agent:trace:filter - Filter trace events by type (AI-friendly)
5
+ *
6
+ * Usage:
7
+ * pnpm kb agent:trace:filter <taskId> --type=llm:call
8
+ * pnpm kb agent:trace:filter <taskId> --type=tool:execution --json
9
+ * pnpm kb agent:trace:filter <taskId> --type=error:captured
10
+ */
11
+ type TraceFilterInput = {
12
+ taskId?: string;
13
+ 'task-id'?: string;
14
+ type?: string;
15
+ json?: boolean;
16
+ };
17
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, TraceFilterInput, unknown>;
18
+
19
+ export { _default as default };