@kb-labs/agent-entry 2.89.0 → 2.93.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.
- package/dist/cli/commands/diff.js +2 -2
- package/dist/cli/commands/diff.js.map +1 -1
- package/dist/cli/commands/history.js +1 -1
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/quality-report.js +16 -6
- package/dist/cli/commands/quality-report.js.map +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/trace-context.d.ts +5 -2
- package/dist/cli/commands/trace-context.js +7 -8
- package/dist/cli/commands/trace-context.js.map +1 -1
- package/dist/cli/commands/trace-diagnose.js +37 -25
- package/dist/cli/commands/trace-diagnose.js.map +1 -1
- package/dist/cli/commands/trace-event-normalizer.js.map +1 -1
- package/dist/cli/commands/trace-filter.js +2 -2
- package/dist/cli/commands/trace-filter.js.map +1 -1
- package/dist/cli/commands/trace-iteration.js +2 -2
- package/dist/cli/commands/trace-iteration.js.map +1 -1
- package/dist/cli/commands/trace-stats.js +1 -1
- package/dist/cli/commands/trace-stats.js.map +1 -1
- package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -1
- package/dist/rest/handlers/generate-spec-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/widgets/mf-manifest.json +5 -5
- package/dist/widgets/mf-stats.json +5 -5
- package/dist/widgets/remoteEntry.js +2 -2
- package/package.json +14 -14
|
@@ -45,7 +45,7 @@ var trace_diagnose_default = defineCommand({
|
|
|
45
45
|
description: 'Quick diagnostic analysis \u2014 answers "what went wrong?" in one command',
|
|
46
46
|
handler: {
|
|
47
47
|
async execute(ctx, input) {
|
|
48
|
-
const flags = input.flags
|
|
48
|
+
const flags = typeof input === "object" && input !== null && "flags" in input ? input.flags : input;
|
|
49
49
|
const taskId = flags["task-id"] ?? flags.taskId;
|
|
50
50
|
try {
|
|
51
51
|
const loaded = await loadTrace(taskId);
|
|
@@ -71,21 +71,23 @@ var trace_diagnose_default = defineCommand({
|
|
|
71
71
|
function analyzeDiagnostics(taskId, events) {
|
|
72
72
|
const normalized = normalizeTraceEvents(events);
|
|
73
73
|
const issues = [];
|
|
74
|
-
const taskStart =
|
|
75
|
-
const agentEnd = [...
|
|
74
|
+
const taskStart = normalized[0];
|
|
75
|
+
const agentEnd = [...normalized].reverse().find((e) => e.type === "agent:end");
|
|
76
76
|
const iterationStarts = normalized.filter((e) => e.type === "iteration:start");
|
|
77
77
|
const iterations = iterationStarts.length || Math.max(0, ...normalized.map((e) => e.iteration));
|
|
78
78
|
const llmEndTokens = normalized.filter((e) => e.type === "llm:end").reduce((sum, e) => sum + (Number(e.data.tokensUsed) || 0), 0);
|
|
79
79
|
const totalTokens = Number(agentEnd?.data?.tokensUsed) || llmEndTokens;
|
|
80
|
-
const
|
|
80
|
+
const lastNormalized = normalized[normalized.length - 1];
|
|
81
|
+
const durationMs = Number(agentEnd?.data?.durationMs) || (taskStart && lastNormalized ? new Date(lastNormalized.raw.timestamp).getTime() - new Date(taskStart.raw.timestamp).getTime() : 0);
|
|
81
82
|
const success = Boolean(agentEnd?.data?.success ?? true);
|
|
82
83
|
let confidence = 0;
|
|
83
84
|
const toolResults = normalized.filter(
|
|
84
85
|
(e) => e.type === "tool:end" || e.type === "tool_result" || e.type === "tool:execution"
|
|
85
86
|
);
|
|
86
87
|
for (const tr of toolResults) {
|
|
87
|
-
const
|
|
88
|
-
const
|
|
88
|
+
const rawTool = tr.raw;
|
|
89
|
+
const data = tr.data || rawTool.output || tr.raw;
|
|
90
|
+
const output = typeof data?.output === "string" ? data.output : JSON.stringify(data?.output || "");
|
|
89
91
|
if (output.includes('"confidence"')) {
|
|
90
92
|
try {
|
|
91
93
|
const match = output.match(/"confidence"\s*:\s*([\d.]+)/);
|
|
@@ -96,24 +98,24 @@ function analyzeDiagnostics(taskId, events) {
|
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
|
-
const contextSnapshots =
|
|
100
|
-
const contextDiffs =
|
|
101
|
-
const contextTrims =
|
|
101
|
+
const contextSnapshots = normalized.filter((e) => e.type === "context:snapshot");
|
|
102
|
+
const contextDiffs = normalized.filter((e) => e.type === "context:diff");
|
|
103
|
+
const contextTrims = normalized.filter((e) => e.type === "context:trim");
|
|
102
104
|
let maxContextChars = 0;
|
|
103
105
|
let totalDroppedMessages = 0;
|
|
104
106
|
let truncatedToolOutputs = 0;
|
|
105
107
|
const contextGrowthHistory = [];
|
|
106
108
|
for (const snap of contextSnapshots) {
|
|
107
|
-
const
|
|
108
|
-
const
|
|
109
|
-
const dropped =
|
|
109
|
+
const chars = Number(snap.data.totalChars) || 0;
|
|
110
|
+
const slidingWindow = snap.data.slidingWindow;
|
|
111
|
+
const dropped = slidingWindow?.droppedMessages || 0;
|
|
110
112
|
if (chars > maxContextChars) {
|
|
111
113
|
maxContextChars = chars;
|
|
112
114
|
}
|
|
113
115
|
totalDroppedMessages += dropped;
|
|
114
116
|
contextGrowthHistory.push({
|
|
115
|
-
iteration:
|
|
116
|
-
messageCount: data.messageCount || 0,
|
|
117
|
+
iteration: snap.iteration,
|
|
118
|
+
messageCount: Number(snap.data.messageCount) || 0,
|
|
117
119
|
totalChars: chars,
|
|
118
120
|
droppedMessages: dropped
|
|
119
121
|
});
|
|
@@ -127,16 +129,17 @@ function analyzeDiagnostics(taskId, events) {
|
|
|
127
129
|
}
|
|
128
130
|
const systemPromptChanges = [];
|
|
129
131
|
for (const cd of contextDiffs) {
|
|
130
|
-
const diff =
|
|
132
|
+
const diff = cd.data.diff;
|
|
131
133
|
if (diff?.systemPromptChanged) {
|
|
134
|
+
const delta = diff.systemPromptCharsDelta || 0;
|
|
132
135
|
systemPromptChanges.push({
|
|
133
|
-
iteration:
|
|
134
|
-
charsDelta:
|
|
136
|
+
iteration: cd.iteration,
|
|
137
|
+
charsDelta: delta
|
|
135
138
|
});
|
|
136
139
|
issues.push({
|
|
137
140
|
severity: "warning",
|
|
138
141
|
category: "context",
|
|
139
|
-
message: `System prompt changed at iteration ${
|
|
142
|
+
message: `System prompt changed at iteration ${cd.iteration} (${delta > 0 ? "+" : ""}${delta} chars)`
|
|
140
143
|
});
|
|
141
144
|
}
|
|
142
145
|
}
|
|
@@ -145,7 +148,13 @@ function analyzeDiagnostics(taskId, events) {
|
|
|
145
148
|
severity: "warning",
|
|
146
149
|
category: "context",
|
|
147
150
|
message: `${totalDroppedMessages} messages dropped by sliding window \u2014 agent lost earlier context`,
|
|
148
|
-
details: contextDiffs.filter((d) =>
|
|
151
|
+
details: contextDiffs.filter((d) => {
|
|
152
|
+
const df = d.data.diff;
|
|
153
|
+
return (df?.droppedMessages ?? 0) > 0;
|
|
154
|
+
}).map((d) => {
|
|
155
|
+
const df = d.data.diff;
|
|
156
|
+
return `Iteration ${d.iteration}: ${df?.droppedMessages ?? 0} dropped`;
|
|
157
|
+
}).join(", ")
|
|
149
158
|
});
|
|
150
159
|
}
|
|
151
160
|
if (truncatedToolOutputs > 0) {
|
|
@@ -197,7 +206,8 @@ function analyzeDiagnostics(taskId, events) {
|
|
|
197
206
|
for (const err of toolErrors) {
|
|
198
207
|
const data = err.data || err.raw;
|
|
199
208
|
const name = data.toolName || data.tool?.name || "unknown";
|
|
200
|
-
const
|
|
209
|
+
const rawErr = data.error;
|
|
210
|
+
const errMsg = typeof rawErr === "string" ? rawErr : rawErr?.message || data.output?.error?.message || "";
|
|
201
211
|
issues.push({
|
|
202
212
|
severity: "warning",
|
|
203
213
|
category: "tool",
|
|
@@ -229,18 +239,20 @@ function analyzeDiagnostics(taskId, events) {
|
|
|
229
239
|
});
|
|
230
240
|
}
|
|
231
241
|
}
|
|
232
|
-
const stoppingAnalyses =
|
|
233
|
-
const stoppingReasons = stoppingAnalyses.map((e) => (e.data
|
|
242
|
+
const stoppingAnalyses = normalized.filter((e) => e.type === "stopping:analysis");
|
|
243
|
+
const stoppingReasons = stoppingAnalyses.map((e) => String(e.data.reasoning ?? "")).filter(Boolean);
|
|
234
244
|
const errors = normalized.filter((e) => e.type === "error:captured" || e.type === "agent:error");
|
|
235
245
|
for (const err of errors) {
|
|
236
246
|
const data = err.data || err.raw;
|
|
237
|
-
const
|
|
247
|
+
const rawErr = data.error;
|
|
248
|
+
const msg = typeof rawErr === "string" ? rawErr : rawErr?.message || "";
|
|
249
|
+
const errStack = typeof rawErr === "object" && rawErr !== null ? rawErr.stack : void 0;
|
|
238
250
|
issues.push({
|
|
239
251
|
severity: "critical",
|
|
240
252
|
category: "error",
|
|
241
|
-
message:
|
|
253
|
+
message: msg.slice(0, 300),
|
|
242
254
|
iteration: Number(data.iteration) || err.iteration,
|
|
243
|
-
details:
|
|
255
|
+
details: errStack || data.agentStack ? JSON.stringify(data.agentStack ?? {}).slice(0, 200) : void 0
|
|
244
256
|
});
|
|
245
257
|
}
|
|
246
258
|
let loopDetected = false;
|
|
@@ -1 +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"]}
|
|
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.type ?? '');\n const data = getEventData(raw);\n\n const explicitIteration = asNumber(raw.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 unknown as Record<string, unknown>).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, DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\n/** Shape of raw data in llm:end / llm:call events (legacy + new formats) */\ninterface LLMRawEvent {\n response?: { usage?: { inputTokens?: number; outputTokens?: number } };\n cost?: { totalCost?: number };\n content?: string;\n hasToolCalls?: boolean;\n tokensUsed?: number;\n durationMs?: number;\n iteration?: number;\n}\n\n/** Shape of raw data in tool:end / tool:execution events */\ninterface ToolRawEvent {\n tool?: { name?: string };\n output?: { success?: boolean; error?: { message?: string } };\n toolName?: string;\n durationMs?: number;\n timing?: { durationMs?: number };\n success?: boolean;\n input?: unknown;\n error?: string | { message?: string; stack?: string };\n iteration?: number;\n}\n\n/** Shape of raw data in error:captured / agent:error events */\ninterface ErrorRawEvent {\n error?: string | { message?: string; stack?: string };\n agentStack?: unknown;\n iteration?: number;\n}\n\n/** Raw data accessed on arbitrary events via data or raw fallback */\ninterface GenericRawData {\n toolName?: string;\n tool?: { name?: string };\n durationMs?: number;\n timing?: { durationMs?: number };\n success?: boolean;\n output?: { success?: boolean; error?: { message?: string } };\n input?: unknown;\n error?: string | { message?: string; stack?: string };\n iteration?: number;\n content?: string;\n hasToolCalls?: boolean;\n}\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: TraceDiagnoseInput =\n (typeof input === 'object' && input !== null && 'flags' in input)\n ? (input as { flags: TraceDiagnoseInput }).flags\n : 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: DetailedTraceEntry[]): DiagnosticReport {\n const normalized = normalizeTraceEvents(events);\n const issues: DiagnosticIssue[] = [];\n\n // === Summary ===\n // Use normalized events (type: string, data: Record<string,unknown>) to avoid\n // union type narrowing on the raw DetailedTraceEntry discriminated union.\n const taskStart = normalized[0];\n const agentEnd = [...normalized].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 lastNormalized = normalized[normalized.length - 1];\n const durationMs = Number(agentEnd?.data?.durationMs)\n || (taskStart && lastNormalized\n ? new Date(lastNormalized.raw.timestamp).getTime() - new Date(taskStart.raw.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 rawTool = tr.raw as ToolRawEvent;\n const data = tr.data || rawTool.output || tr.raw;\n const output = typeof (data as GenericRawData)?.output === 'string'\n ? (data as GenericRawData).output as string\n : JSON.stringify((data as GenericRawData)?.output || '');\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 // Access all events through normalized (type: string, data: Record<string,unknown>)\n // to avoid TypeScript narrowing on the DetailedTraceEntry discriminated union.\n const contextSnapshots = normalized.filter(e => e.type === 'context:snapshot');\n const contextDiffs = normalized.filter(e => e.type === 'context:diff');\n const contextTrims = normalized.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 chars = Number(snap.data.totalChars) || 0;\n const slidingWindow = snap.data.slidingWindow as { droppedMessages?: number } | undefined;\n const dropped = slidingWindow?.droppedMessages || 0;\n if (chars > maxContextChars) {maxContextChars = chars;}\n totalDroppedMessages += dropped;\n contextGrowthHistory.push({\n iteration: snap.iteration,\n messageCount: Number(snap.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.diff as { systemPromptChanged?: boolean; systemPromptCharsDelta?: number; droppedMessages?: number } | undefined;\n if (diff?.systemPromptChanged) {\n const delta = diff.systemPromptCharsDelta || 0;\n systemPromptChanges.push({\n iteration: cd.iteration,\n charsDelta: delta,\n });\n issues.push({\n severity: 'warning',\n category: 'context',\n message: `System prompt changed at iteration ${cd.iteration} (${delta > 0 ? '+' : ''}${delta} 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 => {\n const df = d.data.diff as { droppedMessages?: number } | undefined;\n return (df?.droppedMessages ?? 0) > 0;\n })\n .map(d => {\n const df = d.data.diff as { droppedMessages?: number } | undefined;\n return `Iteration ${d.iteration}: ${df?.droppedMessages ?? 0} dropped`;\n })\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 ToolRawEvent).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 GenericRawData;\n const name = data.toolName || data.tool?.name || 'unknown';\n const dur = Number(data.durationMs) || Number(data.timing?.durationMs) || 0;\n const success = data.success ?? data.output?.success ?? 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 GenericRawData;\n const name = data.toolName || data.tool?.name || 'unknown';\n const rawErr = data.error;\n const errMsg = typeof rawErr === 'string' ? rawErr : rawErr?.message || 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 LLMRawEvent;\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 = normalized.filter(e => e.type === 'stopping:analysis');\n const stoppingReasons = stoppingAnalyses\n .map(e => String(e.data.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 ErrorRawEvent;\n const rawErr = data.error;\n const msg = typeof rawErr === 'string' ? rawErr : rawErr?.message || '';\n const errStack = typeof rawErr === 'object' && rawErr !== null ? rawErr.stack : undefined;\n issues.push({\n severity: 'critical',\n category: 'error',\n message: msg.slice(0, 300),\n iteration: Number(data.iteration) || err.iteration,\n details: errStack || 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 GenericRawData;\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"]}
|
|
@@ -1 +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,
|
|
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,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAE7B,IAAA,MAAM,oBAAoB,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,IAAK,QAAA,CAAS,KAAK,SAAS,CAAA;AAC5E,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,CAA6C,IAAA;AAC3D,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.type ?? '');\n const data = getEventData(raw);\n\n const explicitIteration = asNumber(raw.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 unknown as Record<string, unknown>).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"]}
|
|
@@ -31,7 +31,7 @@ var trace_filter_default = defineCommand({
|
|
|
31
31
|
handler: {
|
|
32
32
|
async execute(ctx, input) {
|
|
33
33
|
const logger = useLogger();
|
|
34
|
-
const flags = input.flags
|
|
34
|
+
const flags = typeof input === "object" && input !== null && "flags" in input ? input.flags : input;
|
|
35
35
|
const taskId = flags["task-id"] ?? flags.taskId;
|
|
36
36
|
const eventType = flags.type;
|
|
37
37
|
if (!eventType) {
|
|
@@ -108,7 +108,7 @@ function printHumanReadable(ctx, eventType, events) {
|
|
|
108
108
|
if (!event) {
|
|
109
109
|
continue;
|
|
110
110
|
}
|
|
111
|
-
ctx.ui.write(`[${event.seq}] ${event.timestamp} (iteration ${event.iteration
|
|
111
|
+
ctx.ui.write(`[${event.seq}] ${event.timestamp} (iteration ${"iteration" in event ? event.iteration : "N/A"})
|
|
112
112
|
`);
|
|
113
113
|
if (event.type === "llm:call") {
|
|
114
114
|
const e = event;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/trace-filter.ts"],"names":[],"mappings":"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","file":"trace-filter.js","sourcesContent":["/**\n * agent:trace:filter - Filter trace events by type (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:filter <taskId> --type=llm:call\n * pnpm kb agent:trace:filter <taskId> --type=tool:execution --json\n * pnpm kb agent:trace:filter <taskId> --type=error:captured\n */\n\nimport { defineCommand, useLogger, type PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n FilterResponse,\n TraceErrorCode,\n} from '@kb-labs/agent-contracts';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\n\n// Valid event types (includes both new colon-separated and legacy snake_case formats)\nconst VALID_EVENT_TYPES: string[] = [\n // New format (detailed trace)\n 'iteration:detail',\n 'llm:call',\n 'tool:execution',\n 'memory:snapshot',\n 'decision:point',\n 'synthesis:forced',\n 'error:captured',\n 'prompt:diff',\n 'tool:filter',\n 'context:trim',\n 'stopping:analysis',\n 'llm:validation',\n // Legacy format (simple trace)\n 'llm_call',\n 'llm_response',\n 'tool_call',\n 'tool_result',\n 'tool_cache_hit',\n 'task_start',\n 'task_end',\n];\n\ntype TraceFilterInput = {\n taskId?: string;\n 'task-id'?: string;\n type?: string;\n json?: boolean;\n};\n\ntype TraceFilterResult = { exitCode: number; response?: TraceCommandResponse };\n\nexport default defineCommand({\n id: 'trace:filter',\n description: 'Filter trace events by type for debugging',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceFilterInput): Promise<TraceFilterResult> {\n const logger = useLogger();\n const flags = (input as any).flags ?? input;\n const taskId = (flags['task-id'] ?? flags.taskId) as string | undefined;\n const eventType = flags.type as string | undefined;\n\n if (!eventType) {\n const err = error('INVALID_EVENT_TYPE', 'Missing required --type flag');\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n if (!VALID_EVENT_TYPES.includes(eventType)) {\n const err = error(\n 'INVALID_EVENT_TYPE',\n `Invalid event type: ${eventType}. Valid types: ${VALID_EVENT_TYPES.join(', ')}`\n );\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n try {\n const loaded = await loadTrace(taskId);\n if (!loaded.ok) {\n const code: TraceErrorCode =\n loaded.error.kind === 'invalid_task_id' ? 'INVALID_TASK_ID' :\n loaded.error.kind === 'not_found' ? 'TRACE_NOT_FOUND' :\n loaded.error.kind === 'too_large' ? 'FILE_TOO_LARGE' :\n 'CORRUPTED_TRACE';\n const err = error(code, formatTraceLoadError(loaded.error));\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n const { events } = loaded;\n\n // Filter by type\n const filtered = events.filter((e) => e.type === eventType);\n\n // Build response\n const response: TraceCommandResponse<FilterResponse> = {\n success: true,\n command: 'trace:filter',\n taskId: taskId ?? '',\n data: {\n taskId: taskId ?? '',\n eventType: eventType,\n events: filtered,\n count: filtered.length,\n },\n summary: {\n message: `Found ${filtered.length} ${eventType} events`,\n severity: 'info',\n actionable: false,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui.write(JSON.stringify(response, null, 2) + '\\n');\n } else {\n printHumanReadable(ctx, eventType, filtered);\n }\n\n return { exitCode: 0, response };\n } catch (err) {\n logger.error('trace:filter error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui.write(JSON.stringify(errResponse, null, 2) + '\\n');\n return { exitCode: 1, response: errResponse };\n }\n },\n },\n});\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(ctx: PluginContextV3, eventType: string, events: DetailedTraceEntry[]): void {\n ctx.ui.write('\\n');\n ctx.ui.write(`🔍 Filtered Events: ${eventType}\\n`);\n ctx.ui.write(`Found ${events.length} events\\n`);\n ctx.ui.write('\\n');\n\n if (events.length === 0) {\n ctx.ui.write('No events found.\\n');\n return;\n }\n\n // Show first 10 events\n const showCount = Math.min(10, events.length);\n ctx.ui.write(`Showing first ${showCount}/${events.length}:\\n`);\n ctx.ui.write('\\n');\n\n for (let i = 0; i < showCount; i++) {\n const event = events[i];\n if (!event) {continue;}\n\n ctx.ui.write(`[${event.seq}] ${event.timestamp} (iteration ${(event as any).iteration || 'N/A'})\\n`);\n\n // Show event-specific summary\n if (event.type === 'llm:call') {\n const e = event as any;\n ctx.ui.write(` Model: ${e.request.model}, Tokens: ${e.response.usage.totalTokens}, Cost: $${e.cost.totalCost.toFixed(6)}\\n`);\n } else if (event.type === 'tool:execution') {\n const e = event as any;\n ctx.ui.write(` Tool: ${e.tool.name}, Success: ${e.output.success}, Duration: ${e.timing.durationMs}ms\\n`);\n } else if (event.type === 'error:captured') {\n const e = event as any;\n ctx.ui.write(` Error: ${e.error.message.substring(0, 100)}\\n`);\n }\n\n ctx.ui.write('\\n');\n }\n\n if (events.length > showCount) {\n ctx.ui.write(`... and ${events.length - showCount} more events\\n`);\n ctx.ui.write('Use --json flag to see all events\\n');\n }\n}\n\n/**\n * Create error response\n */\nfunction error(code: TraceErrorCode, message: string): TraceCommandResponse {\n return {\n success: false,\n command: 'trace:filter',\n taskId: '',\n error: {\n code,\n message,\n },\n summary: {\n message,\n severity: 'error',\n actionable: true,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/trace-filter.ts"],"names":[],"mappings":"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","file":"trace-filter.js","sourcesContent":["/**\n * agent:trace:filter - Filter trace events by type (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:filter <taskId> --type=llm:call\n * pnpm kb agent:trace:filter <taskId> --type=tool:execution --json\n * pnpm kb agent:trace:filter <taskId> --type=error:captured\n */\n\nimport { defineCommand, useLogger, type PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n FilterResponse,\n TraceErrorCode,\n DetailedTraceEntry,\n LLMCallEvent,\n ToolExecutionEvent,\n ErrorCapturedEvent,\n} from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\n\n// Valid event types (includes both new colon-separated and legacy snake_case formats)\nconst VALID_EVENT_TYPES: string[] = [\n // New format (detailed trace)\n 'iteration:detail',\n 'llm:call',\n 'tool:execution',\n 'memory:snapshot',\n 'decision:point',\n 'synthesis:forced',\n 'error:captured',\n 'prompt:diff',\n 'tool:filter',\n 'context:trim',\n 'stopping:analysis',\n 'llm:validation',\n // Legacy format (simple trace)\n 'llm_call',\n 'llm_response',\n 'tool_call',\n 'tool_result',\n 'tool_cache_hit',\n 'task_start',\n 'task_end',\n];\n\ntype TraceFilterInput = {\n taskId?: string;\n 'task-id'?: string;\n type?: string;\n json?: boolean;\n};\n\ntype TraceFilterResult = { exitCode: number; response?: TraceCommandResponse };\n\nexport default defineCommand({\n id: 'trace:filter',\n description: 'Filter trace events by type for debugging',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceFilterInput): Promise<TraceFilterResult> {\n const logger = useLogger();\n const flags: TraceFilterInput =\n (typeof input === 'object' && input !== null && 'flags' in input)\n ? (input as { flags: TraceFilterInput }).flags\n : input;\n const taskId = (flags['task-id'] ?? flags.taskId) as string | undefined;\n const eventType = flags.type as string | undefined;\n\n if (!eventType) {\n const err = error('INVALID_EVENT_TYPE', 'Missing required --type flag');\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n if (!VALID_EVENT_TYPES.includes(eventType)) {\n const err = error(\n 'INVALID_EVENT_TYPE',\n `Invalid event type: ${eventType}. Valid types: ${VALID_EVENT_TYPES.join(', ')}`\n );\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n try {\n const loaded = await loadTrace(taskId);\n if (!loaded.ok) {\n const code: TraceErrorCode =\n loaded.error.kind === 'invalid_task_id' ? 'INVALID_TASK_ID' :\n loaded.error.kind === 'not_found' ? 'TRACE_NOT_FOUND' :\n loaded.error.kind === 'too_large' ? 'FILE_TOO_LARGE' :\n 'CORRUPTED_TRACE';\n const err = error(code, formatTraceLoadError(loaded.error));\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n const { events } = loaded;\n\n // Filter by type\n const filtered = events.filter((e) => e.type === eventType);\n\n // Build response\n const response: TraceCommandResponse<FilterResponse> = {\n success: true,\n command: 'trace:filter',\n taskId: taskId ?? '',\n data: {\n taskId: taskId ?? '',\n eventType: eventType,\n events: filtered,\n count: filtered.length,\n },\n summary: {\n message: `Found ${filtered.length} ${eventType} events`,\n severity: 'info',\n actionable: false,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui.write(JSON.stringify(response, null, 2) + '\\n');\n } else {\n printHumanReadable(ctx, eventType, filtered);\n }\n\n return { exitCode: 0, response };\n } catch (err) {\n logger.error('trace:filter error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui.write(JSON.stringify(errResponse, null, 2) + '\\n');\n return { exitCode: 1, response: errResponse };\n }\n },\n },\n});\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(ctx: PluginContextV3, eventType: string, events: DetailedTraceEntry[]): void {\n ctx.ui.write('\\n');\n ctx.ui.write(`🔍 Filtered Events: ${eventType}\\n`);\n ctx.ui.write(`Found ${events.length} events\\n`);\n ctx.ui.write('\\n');\n\n if (events.length === 0) {\n ctx.ui.write('No events found.\\n');\n return;\n }\n\n // Show first 10 events\n const showCount = Math.min(10, events.length);\n ctx.ui.write(`Showing first ${showCount}/${events.length}:\\n`);\n ctx.ui.write('\\n');\n\n for (let i = 0; i < showCount; i++) {\n const event = events[i];\n if (!event) {continue;}\n\n ctx.ui.write(`[${event.seq}] ${event.timestamp} (iteration ${'iteration' in event ? event.iteration : 'N/A'})\\n`);\n\n // Show event-specific summary\n if (event.type === 'llm:call') {\n const e = event as LLMCallEvent;\n ctx.ui.write(` Model: ${e.request.model}, Tokens: ${e.response.usage.totalTokens}, Cost: $${e.cost.totalCost.toFixed(6)}\\n`);\n } else if (event.type === 'tool:execution') {\n const e = event as ToolExecutionEvent;\n ctx.ui.write(` Tool: ${e.tool.name}, Success: ${e.output.success}, Duration: ${e.timing.durationMs}ms\\n`);\n } else if (event.type === 'error:captured') {\n const e = event as ErrorCapturedEvent;\n ctx.ui.write(` Error: ${e.error.message.substring(0, 100)}\\n`);\n }\n\n ctx.ui.write('\\n');\n }\n\n if (events.length > showCount) {\n ctx.ui.write(`... and ${events.length - showCount} more events\\n`);\n ctx.ui.write('Use --json flag to see all events\\n');\n }\n}\n\n/**\n * Create error response\n */\nfunction error(code: TraceErrorCode, message: string): TraceCommandResponse {\n return {\n success: false,\n command: 'trace:filter',\n taskId: '',\n error: {\n code,\n message,\n },\n summary: {\n message,\n severity: 'error',\n actionable: true,\n },\n };\n}\n"]}
|
|
@@ -46,7 +46,7 @@ var trace_iteration_default = defineCommand({
|
|
|
46
46
|
handler: {
|
|
47
47
|
async execute(ctx, input) {
|
|
48
48
|
const logger = useLogger();
|
|
49
|
-
const flags = input.flags
|
|
49
|
+
const flags = "flags" in input ? input.flags : input;
|
|
50
50
|
const taskId = flags["task-id"] ?? flags.taskId;
|
|
51
51
|
const iteration = typeof flags.iteration === "string" ? parseInt(flags.iteration, 10) : flags.iteration;
|
|
52
52
|
if (iteration === void 0 || iteration < 1) {
|
|
@@ -163,7 +163,7 @@ function printHumanReadable(ctx, iteration, events, summary) {
|
|
|
163
163
|
`);
|
|
164
164
|
} else if (type === "error:captured" && typeEvents.length > 0) {
|
|
165
165
|
const errorEvent = typeEvents[0];
|
|
166
|
-
ctx.ui.write(` \u26A0\uFE0F ${errorEvent.error
|
|
166
|
+
ctx.ui.write(` \u26A0\uFE0F ${errorEvent.error?.message?.substring(0, 100) ?? ""}
|
|
167
167
|
`);
|
|
168
168
|
}
|
|
169
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/trace-event-normalizer.ts","../../../src/cli/commands/trace-iteration.ts"],"names":[],"mappings":"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","file":"trace-iteration.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:iteration - View specific iteration details (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:iteration <taskId> --iteration=3\n * pnpm kb agent:trace:iteration <taskId> --iteration=5 --json\n */\n\nimport { defineCommand, useLogger, type PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n IterationResponse,\n TraceErrorCode,\n} from '@kb-labs/agent-contracts';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\ntype TraceIterationInput = {\n taskId?: string;\n 'task-id'?: string;\n iteration?: number;\n json?: boolean;\n};\n\ntype TraceIterationResult = { exitCode: number; response?: TraceCommandResponse };\n\nexport default defineCommand({\n id: 'trace:iteration',\n description: 'View all events for a specific iteration',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceIterationInput): Promise<TraceIterationResult> {\n const logger = useLogger();\n const flags = (input as any).flags ?? input;\n const taskId = (flags['task-id'] ?? flags.taskId) as string | undefined;\n const iteration = typeof flags.iteration === 'string' ? parseInt(flags.iteration, 10) : (flags.iteration as number | undefined);\n\n if (iteration === undefined || iteration < 1) {\n const err = error('INVALID_ITERATION', 'Missing or invalid --iteration flag (must be >= 1)');\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n try {\n const loaded = await loadTrace(taskId);\n if (!loaded.ok) {\n const code: TraceErrorCode =\n loaded.error.kind === 'invalid_task_id' ? 'INVALID_TASK_ID' :\n loaded.error.kind === 'not_found' ? 'TRACE_NOT_FOUND' :\n loaded.error.kind === 'too_large' ? 'FILE_TOO_LARGE' :\n 'CORRUPTED_TRACE';\n const err = error(code, formatTraceLoadError(loaded.error));\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n const normalized = normalizeTraceEvents(loaded.events);\n const filtered = normalized.filter((e) => e.iteration === iteration).map((e) => e.raw);\n\n if (filtered.length === 0) {\n const err = error('INVALID_ITERATION', `No events found for iteration ${iteration}`);\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n // Calculate summary\n const summary = calculateIterationSummary(filtered);\n\n // Build response\n const response: TraceCommandResponse<IterationResponse> = {\n success: true,\n command: 'trace:iteration',\n taskId: taskId ?? '',\n data: {\n taskId: taskId ?? '',\n iteration,\n events: filtered,\n summary,\n },\n summary: {\n message: `Iteration ${iteration}: ${summary.eventCount} events, ${summary.llmCalls} LLM calls, ${summary.toolCalls} tool calls`,\n severity: summary.errors > 0 ? 'warning' : 'info',\n actionable: summary.errors > 0,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui.write(JSON.stringify(response, null, 2) + '\\n');\n } else {\n printHumanReadable(ctx, iteration, filtered, summary);\n }\n\n return { exitCode: 0, response };\n } catch (err) {\n logger.error('trace:iteration error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui.write(JSON.stringify(errResponse, null, 2) + '\\n');\n return { exitCode: 1, response: errResponse };\n }\n },\n },\n});\n\n/**\n * Calculate iteration summary\n */\nfunction calculateIterationSummary(events: DetailedTraceEntry[]): IterationResponse['summary'] {\n const llmEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'llm:start' || type === 'llm:call' || type === 'llm_call';\n });\n const toolEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'tool:start' || type === 'tool:execution' || type === 'tool_call';\n });\n const errorEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'error:captured' || type === 'agent:error' || type === 'tool:error';\n });\n\n // Calculate duration (from first to last event timestamp)\n const timestamps = events.map((e) => new Date(e.timestamp).getTime());\n const durationMs = timestamps.length > 0 ? Math.max(...timestamps) - Math.min(...timestamps) : 0;\n\n return {\n eventCount: events.length,\n llmCalls: llmEvents.length,\n toolCalls: toolEvents.length,\n errors: errorEvents.length,\n durationMs,\n };\n}\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(\n ctx: PluginContextV3,\n iteration: number,\n events: DetailedTraceEntry[],\n summary: IterationResponse['summary']\n): void {\n ctx.ui.write('\\n');\n ctx.ui.write(`🔄 Iteration ${iteration}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('📊 Summary:\\n');\n ctx.ui.write(` Total events: ${summary.eventCount}\\n`);\n ctx.ui.write(` LLM calls: ${summary.llmCalls}\\n`);\n ctx.ui.write(` Tool calls: ${summary.toolCalls}\\n`);\n ctx.ui.write(` Errors: ${summary.errors}\\n`);\n ctx.ui.write(` Duration: ${summary.durationMs}ms\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('📝 Events Timeline:\\n');\n ctx.ui.write('\\n');\n\n // Group events by type for better readability\n const grouped = new Map<string, DetailedTraceEntry[]>();\n for (const event of events) {\n const existing = grouped.get(event.type) || [];\n existing.push(event);\n grouped.set(event.type, existing);\n }\n\n // Show event counts\n for (const [type, typeEvents] of grouped) {\n ctx.ui.write(` ${type}: ${typeEvents.length}\\n`);\n\n // Show details for important events\n if ((type === 'llm:end' || type === 'llm:call') && typeEvents.length > 0) {\n const llmEvent = typeEvents[0] as any;\n const tokens = llmEvent?.data?.tokensUsed ?? llmEvent?.response?.usage?.totalTokens ?? 0;\n ctx.ui.write(` Tokens: ${tokens}\\n`);\n } else if (type === 'tool:end' || type === 'tool:start' || type === 'tool:execution') {\n const toolNames = (typeEvents as any[]).map((e) => e?.data?.toolName || e?.tool?.name || 'unknown');\n ctx.ui.write(` Tools: ${[...new Set(toolNames)].join(', ')}\\n`);\n } else if (type === 'error:captured' && typeEvents.length > 0) {\n const errorEvent = typeEvents[0] as any;\n ctx.ui.write(` ⚠️ ${errorEvent.error.message.substring(0, 100)}\\n`);\n }\n }\n\n ctx.ui.write('\\n');\n ctx.ui.write('Use --json flag to see full event details\\n');\n}\n\n/**\n * Create error response\n */\nfunction error(code: TraceErrorCode, message: string): TraceCommandResponse {\n return {\n success: false,\n command: 'trace:iteration',\n taskId: '',\n error: {\n code,\n message,\n },\n summary: {\n message,\n severity: 'error',\n actionable: true,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/trace-event-normalizer.ts","../../../src/cli/commands/trace-iteration.ts"],"names":[],"mappings":"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","file":"trace-iteration.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.type ?? '');\n const data = getEventData(raw);\n\n const explicitIteration = asNumber(raw.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 unknown as Record<string, unknown>).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:iteration - View specific iteration details (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:iteration <taskId> --iteration=3\n * pnpm kb agent:trace:iteration <taskId> --iteration=5 --json\n */\n\nimport { defineCommand, useLogger, type PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n IterationResponse,\n TraceErrorCode,\n} from '@kb-labs/agent-contracts';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\ntype TraceIterationInput = {\n taskId?: string;\n 'task-id'?: string;\n iteration?: number;\n json?: boolean;\n};\n\ntype TraceIterationResult = { exitCode: number; response?: TraceCommandResponse };\n\nexport default defineCommand({\n id: 'trace:iteration',\n description: 'View all events for a specific iteration',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceIterationInput): Promise<TraceIterationResult> {\n const logger = useLogger();\n const flags = ('flags' in input ? (input as { flags: TraceIterationInput }).flags : input) as TraceIterationInput;\n const taskId = (flags['task-id'] ?? flags.taskId) as string | undefined;\n const iteration = typeof flags.iteration === 'string' ? parseInt(flags.iteration, 10) : (flags.iteration as number | undefined);\n\n if (iteration === undefined || iteration < 1) {\n const err = error('INVALID_ITERATION', 'Missing or invalid --iteration flag (must be >= 1)');\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n try {\n const loaded = await loadTrace(taskId);\n if (!loaded.ok) {\n const code: TraceErrorCode =\n loaded.error.kind === 'invalid_task_id' ? 'INVALID_TASK_ID' :\n loaded.error.kind === 'not_found' ? 'TRACE_NOT_FOUND' :\n loaded.error.kind === 'too_large' ? 'FILE_TOO_LARGE' :\n 'CORRUPTED_TRACE';\n const err = error(code, formatTraceLoadError(loaded.error));\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n const normalized = normalizeTraceEvents(loaded.events);\n const filtered = normalized.filter((e) => e.iteration === iteration).map((e) => e.raw);\n\n if (filtered.length === 0) {\n const err = error('INVALID_ITERATION', `No events found for iteration ${iteration}`);\n ctx.ui.write(JSON.stringify(err, null, 2) + '\\n');\n return { exitCode: 1, response: err };\n }\n\n // Calculate summary\n const summary = calculateIterationSummary(filtered);\n\n // Build response\n const response: TraceCommandResponse<IterationResponse> = {\n success: true,\n command: 'trace:iteration',\n taskId: taskId ?? '',\n data: {\n taskId: taskId ?? '',\n iteration,\n events: filtered,\n summary,\n },\n summary: {\n message: `Iteration ${iteration}: ${summary.eventCount} events, ${summary.llmCalls} LLM calls, ${summary.toolCalls} tool calls`,\n severity: summary.errors > 0 ? 'warning' : 'info',\n actionable: summary.errors > 0,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui.write(JSON.stringify(response, null, 2) + '\\n');\n } else {\n printHumanReadable(ctx, iteration, filtered, summary);\n }\n\n return { exitCode: 0, response };\n } catch (err) {\n logger.error('trace:iteration error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui.write(JSON.stringify(errResponse, null, 2) + '\\n');\n return { exitCode: 1, response: errResponse };\n }\n },\n },\n});\n\n/**\n * Calculate iteration summary\n */\nfunction calculateIterationSummary(events: DetailedTraceEntry[]): IterationResponse['summary'] {\n const llmEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'llm:start' || type === 'llm:call' || type === 'llm_call';\n });\n const toolEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'tool:start' || type === 'tool:execution' || type === 'tool_call';\n });\n const errorEvents = events.filter((e) => {\n const type = String((e as { type?: unknown }).type ?? '');\n return type === 'error:captured' || type === 'agent:error' || type === 'tool:error';\n });\n\n // Calculate duration (from first to last event timestamp)\n const timestamps = events.map((e) => new Date(e.timestamp).getTime());\n const durationMs = timestamps.length > 0 ? Math.max(...timestamps) - Math.min(...timestamps) : 0;\n\n return {\n eventCount: events.length,\n llmCalls: llmEvents.length,\n toolCalls: toolEvents.length,\n errors: errorEvents.length,\n durationMs,\n };\n}\n\ninterface LLMIterationEvent {\n data?: { tokensUsed?: number };\n response?: { usage?: { totalTokens?: number } };\n}\n\ninterface ToolIterationEvent {\n data?: { toolName?: string };\n tool?: { name?: string };\n}\n\ninterface ErrorIterationEvent {\n error?: { message?: string };\n}\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(\n ctx: PluginContextV3,\n iteration: number,\n events: DetailedTraceEntry[],\n summary: IterationResponse['summary']\n): void {\n ctx.ui.write('\\n');\n ctx.ui.write(`🔄 Iteration ${iteration}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('📊 Summary:\\n');\n ctx.ui.write(` Total events: ${summary.eventCount}\\n`);\n ctx.ui.write(` LLM calls: ${summary.llmCalls}\\n`);\n ctx.ui.write(` Tool calls: ${summary.toolCalls}\\n`);\n ctx.ui.write(` Errors: ${summary.errors}\\n`);\n ctx.ui.write(` Duration: ${summary.durationMs}ms\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('📝 Events Timeline:\\n');\n ctx.ui.write('\\n');\n\n // Group events by type for better readability\n const grouped = new Map<string, DetailedTraceEntry[]>();\n for (const event of events) {\n const existing = grouped.get(event.type) || [];\n existing.push(event);\n grouped.set(event.type, existing);\n }\n\n // Show event counts\n for (const [type, typeEvents] of grouped) {\n ctx.ui.write(` ${type}: ${typeEvents.length}\\n`);\n\n // Show details for important events\n if ((type === 'llm:end' || type === 'llm:call') && typeEvents.length > 0) {\n const llmEvent = typeEvents[0] as unknown as LLMIterationEvent;\n const tokens = llmEvent?.data?.tokensUsed ?? llmEvent?.response?.usage?.totalTokens ?? 0;\n ctx.ui.write(` Tokens: ${tokens}\\n`);\n } else if (type === 'tool:end' || type === 'tool:start' || type === 'tool:execution') {\n const toolNames = (typeEvents as unknown as ToolIterationEvent[]).map((e) => e?.data?.toolName || e?.tool?.name || 'unknown');\n ctx.ui.write(` Tools: ${[...new Set(toolNames)].join(', ')}\\n`);\n } else if (type === 'error:captured' && typeEvents.length > 0) {\n const errorEvent = typeEvents[0] as unknown as ErrorIterationEvent;\n ctx.ui.write(` ⚠️ ${errorEvent.error?.message?.substring(0, 100) ?? ''}\\n`);\n }\n }\n\n ctx.ui.write('\\n');\n ctx.ui.write('Use --json flag to see full event details\\n');\n}\n\n/**\n * Create error response\n */\nfunction error(code: TraceErrorCode, message: string): TraceCommandResponse {\n return {\n success: false,\n command: 'trace:iteration',\n taskId: '',\n error: {\n code,\n message,\n },\n summary: {\n message,\n severity: 'error',\n actionable: true,\n },\n };\n}\n"]}
|
|
@@ -46,7 +46,7 @@ var trace_stats_default = defineCommand({
|
|
|
46
46
|
handler: {
|
|
47
47
|
async execute(ctx, input) {
|
|
48
48
|
const logger = useLogger();
|
|
49
|
-
const flags = input.flags
|
|
49
|
+
const flags = typeof input === "object" && input !== null && "flags" in input ? input.flags : input;
|
|
50
50
|
const taskId = flags["task-id"] ?? flags.taskId;
|
|
51
51
|
try {
|
|
52
52
|
const loaded = await loadTrace(taskId);
|