@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.
- package/README.md +56 -0
- package/dist/cli/commands/diff.d.ts +17 -0
- package/dist/cli/commands/diff.js +182 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/history.d.ts +16 -0
- package/dist/cli/commands/history.js +216 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/quality-report.d.ts +21 -0
- package/dist/cli/commands/quality-report.js +457 -0
- package/dist/cli/commands/quality-report.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +27 -0
- package/dist/cli/commands/rollback.js +109 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +42 -0
- package/dist/cli/commands/run.js +923 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/trace-context.d.ts +22 -0
- package/dist/cli/commands/trace-context.js +131 -0
- package/dist/cli/commands/trace-context.js.map +1 -0
- package/dist/cli/commands/trace-diagnose.d.ts +20 -0
- package/dist/cli/commands/trace-diagnose.js +434 -0
- package/dist/cli/commands/trace-diagnose.js.map +1 -0
- package/dist/cli/commands/trace-event-normalizer.d.ts +13 -0
- package/dist/cli/commands/trace-event-normalizer.js +39 -0
- package/dist/cli/commands/trace-event-normalizer.js.map +1 -0
- package/dist/cli/commands/trace-filter.d.ts +19 -0
- package/dist/cli/commands/trace-filter.js +153 -0
- package/dist/cli/commands/trace-filter.js.map +1 -0
- package/dist/cli/commands/trace-iteration.d.ts +18 -0
- package/dist/cli/commands/trace-iteration.js +192 -0
- package/dist/cli/commands/trace-iteration.js.map +1 -0
- package/dist/cli/commands/trace-stats.d.ts +17 -0
- package/dist/cli/commands/trace-stats.js +247 -0
- package/dist/cli/commands/trace-stats.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +473 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +184 -0
- package/dist/manifest.js +473 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/approve-handler.d.ts +15 -0
- package/dist/rest/handlers/approve-handler.js +60 -0
- package/dist/rest/handlers/approve-handler.js.map +1 -0
- package/dist/rest/handlers/approve-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/approve-session-plan-handler.js +52 -0
- package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/correct-handler.d.ts +7 -0
- package/dist/rest/handlers/correct-handler.js +326 -0
- package/dist/rest/handlers/correct-handler.js.map +1 -0
- package/dist/rest/handlers/create-session-handler.d.ts +7 -0
- package/dist/rest/handlers/create-session-handler.js +25 -0
- package/dist/rest/handlers/create-session-handler.js.map +1 -0
- package/dist/rest/handlers/execute-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/execute-session-plan-handler.js +635 -0
- package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/generate-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/generate-spec-handler.js +389 -0
- package/dist/rest/handlers/generate-spec-handler.js.map +1 -0
- package/dist/rest/handlers/get-file-diff-handler.d.ts +24 -0
- package/dist/rest/handlers/get-file-diff-handler.js +44 -0
- package/dist/rest/handlers/get-file-diff-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-handler.js +23 -0
- package/dist/rest/handlers/get-session-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-plan-handler.js +53 -0
- package/dist/rest/handlers/get-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-turns-handler.d.ts +16 -0
- package/dist/rest/handlers/get-session-turns-handler.js +35 -0
- package/dist/rest/handlers/get-session-turns-handler.js.map +1 -0
- package/dist/rest/handlers/get-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/get-spec-handler.js +39 -0
- package/dist/rest/handlers/get-spec-handler.js.map +1 -0
- package/dist/rest/handlers/list-file-changes-handler.d.ts +13 -0
- package/dist/rest/handlers/list-file-changes-handler.js +34 -0
- package/dist/rest/handlers/list-file-changes-handler.js.map +1 -0
- package/dist/rest/handlers/list-sessions-handler.d.ts +7 -0
- package/dist/rest/handlers/list-sessions-handler.js +23 -0
- package/dist/rest/handlers/list-sessions-handler.js.map +1 -0
- package/dist/rest/handlers/rollback-handler.d.ts +22 -0
- package/dist/rest/handlers/rollback-handler.js +91 -0
- package/dist/rest/handlers/rollback-handler.js.map +1 -0
- package/dist/rest/handlers/run-handler.d.ts +7 -0
- package/dist/rest/handlers/run-handler.js +516 -0
- package/dist/rest/handlers/run-handler.js.map +1 -0
- package/dist/rest/handlers/sessions-handler.d.ts +18 -0
- package/dist/rest/handlers/sessions-handler.js +56 -0
- package/dist/rest/handlers/sessions-handler.js.map +1 -0
- package/dist/rest/handlers/status-handler.d.ts +7 -0
- package/dist/rest/handlers/status-handler.js +313 -0
- package/dist/rest/handlers/status-handler.js.map +1 -0
- package/dist/rest/handlers/stop-handler.d.ts +7 -0
- package/dist/rest/handlers/stop-handler.js +317 -0
- package/dist/rest/handlers/stop-handler.js.map +1 -0
- package/dist/widgets/220.js +446 -0
- package/dist/widgets/220.js.map +1 -0
- package/dist/widgets/331.js +2 -0
- package/dist/widgets/331.js.map +1 -0
- package/dist/widgets/403.js +2 -0
- package/dist/widgets/403.js.map +1 -0
- package/dist/widgets/406.js +35 -0
- package/dist/widgets/406.js.map +1 -0
- package/dist/widgets/455.js +2 -0
- package/dist/widgets/455.js.map +1 -0
- package/dist/widgets/482.js +2 -0
- package/dist/widgets/482.js.map +1 -0
- package/dist/widgets/485.js +2 -0
- package/dist/widgets/485.js.map +1 -0
- package/dist/widgets/527.js +2 -0
- package/dist/widgets/527.js.map +1 -0
- package/dist/widgets/628.js +2 -0
- package/dist/widgets/628.js.map +1 -0
- package/dist/widgets/694.js +2 -0
- package/dist/widgets/694.js.map +1 -0
- package/dist/widgets/712.js +2 -0
- package/dist/widgets/712.js.map +1 -0
- package/dist/widgets/866.js +2 -0
- package/dist/widgets/866.js.map +1 -0
- package/dist/widgets/915.js +39 -0
- package/dist/widgets/915.js.map +1 -0
- package/dist/widgets/957.js +10 -0
- package/dist/widgets/957.js.map +1 -0
- package/dist/widgets/983.js +2 -0
- package/dist/widgets/983.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_AgentsPage.js +2 -0
- package/dist/widgets/__federation_expose_AgentsPage.js.map +1 -0
- package/dist/widgets/mf-manifest.json +260 -0
- package/dist/widgets/mf-stats.json +305 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/dist/ws/session-stream-handler.d.ts +8 -0
- package/dist/ws/session-stream-handler.js +409 -0
- package/dist/ws/session-stream-handler.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { defineCommand, useLogger } from '@kb-labs/sdk';
|
|
2
|
+
import { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/trace-filter.ts
|
|
5
|
+
var VALID_EVENT_TYPES = [
|
|
6
|
+
// New format (detailed trace)
|
|
7
|
+
"iteration:detail",
|
|
8
|
+
"llm:call",
|
|
9
|
+
"tool:execution",
|
|
10
|
+
"memory:snapshot",
|
|
11
|
+
"decision:point",
|
|
12
|
+
"synthesis:forced",
|
|
13
|
+
"error:captured",
|
|
14
|
+
"prompt:diff",
|
|
15
|
+
"tool:filter",
|
|
16
|
+
"context:trim",
|
|
17
|
+
"stopping:analysis",
|
|
18
|
+
"llm:validation",
|
|
19
|
+
// Legacy format (simple trace)
|
|
20
|
+
"llm_call",
|
|
21
|
+
"llm_response",
|
|
22
|
+
"tool_call",
|
|
23
|
+
"tool_result",
|
|
24
|
+
"tool_cache_hit",
|
|
25
|
+
"task_start",
|
|
26
|
+
"task_end"
|
|
27
|
+
];
|
|
28
|
+
var trace_filter_default = defineCommand({
|
|
29
|
+
id: "trace:filter",
|
|
30
|
+
description: "Filter trace events by type for debugging",
|
|
31
|
+
handler: {
|
|
32
|
+
async execute(ctx, input) {
|
|
33
|
+
const logger = useLogger();
|
|
34
|
+
const flags = input.flags ?? input;
|
|
35
|
+
const taskId = flags["task-id"] ?? flags.taskId;
|
|
36
|
+
const eventType = flags.type;
|
|
37
|
+
if (!eventType) {
|
|
38
|
+
const err = error("INVALID_EVENT_TYPE", "Missing required --type flag");
|
|
39
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
40
|
+
return { exitCode: 1, response: err };
|
|
41
|
+
}
|
|
42
|
+
if (!VALID_EVENT_TYPES.includes(eventType)) {
|
|
43
|
+
const err = error(
|
|
44
|
+
"INVALID_EVENT_TYPE",
|
|
45
|
+
`Invalid event type: ${eventType}. Valid types: ${VALID_EVENT_TYPES.join(", ")}`
|
|
46
|
+
);
|
|
47
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
48
|
+
return { exitCode: 1, response: err };
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const loaded = await loadTrace(taskId);
|
|
52
|
+
if (!loaded.ok) {
|
|
53
|
+
const code = loaded.error.kind === "invalid_task_id" ? "INVALID_TASK_ID" : loaded.error.kind === "not_found" ? "TRACE_NOT_FOUND" : loaded.error.kind === "too_large" ? "FILE_TOO_LARGE" : "CORRUPTED_TRACE";
|
|
54
|
+
const err = error(code, formatTraceLoadError(loaded.error));
|
|
55
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
56
|
+
return { exitCode: 1, response: err };
|
|
57
|
+
}
|
|
58
|
+
const { events } = loaded;
|
|
59
|
+
const filtered = events.filter((e) => e.type === eventType);
|
|
60
|
+
const response = {
|
|
61
|
+
success: true,
|
|
62
|
+
command: "trace:filter",
|
|
63
|
+
taskId: taskId ?? "",
|
|
64
|
+
data: {
|
|
65
|
+
taskId: taskId ?? "",
|
|
66
|
+
eventType,
|
|
67
|
+
events: filtered,
|
|
68
|
+
count: filtered.length
|
|
69
|
+
},
|
|
70
|
+
summary: {
|
|
71
|
+
message: `Found ${filtered.length} ${eventType} events`,
|
|
72
|
+
severity: "info",
|
|
73
|
+
actionable: false
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
if (flags.json) {
|
|
77
|
+
ctx.ui.write(JSON.stringify(response, null, 2) + "\n");
|
|
78
|
+
} else {
|
|
79
|
+
printHumanReadable(ctx, eventType, filtered);
|
|
80
|
+
}
|
|
81
|
+
return { exitCode: 0, response };
|
|
82
|
+
} catch (err) {
|
|
83
|
+
logger.error("trace:filter error:", err instanceof Error ? err : void 0);
|
|
84
|
+
const errResponse = error("IO_ERROR", err instanceof Error ? err.message : String(err));
|
|
85
|
+
ctx.ui.write(JSON.stringify(errResponse, null, 2) + "\n");
|
|
86
|
+
return { exitCode: 1, response: errResponse };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
function printHumanReadable(ctx, eventType, events) {
|
|
92
|
+
ctx.ui.write("\n");
|
|
93
|
+
ctx.ui.write(`\u{1F50D} Filtered Events: ${eventType}
|
|
94
|
+
`);
|
|
95
|
+
ctx.ui.write(`Found ${events.length} events
|
|
96
|
+
`);
|
|
97
|
+
ctx.ui.write("\n");
|
|
98
|
+
if (events.length === 0) {
|
|
99
|
+
ctx.ui.write("No events found.\n");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const showCount = Math.min(10, events.length);
|
|
103
|
+
ctx.ui.write(`Showing first ${showCount}/${events.length}:
|
|
104
|
+
`);
|
|
105
|
+
ctx.ui.write("\n");
|
|
106
|
+
for (let i = 0; i < showCount; i++) {
|
|
107
|
+
const event = events[i];
|
|
108
|
+
if (!event) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
ctx.ui.write(`[${event.seq}] ${event.timestamp} (iteration ${event.iteration || "N/A"})
|
|
112
|
+
`);
|
|
113
|
+
if (event.type === "llm:call") {
|
|
114
|
+
const e = event;
|
|
115
|
+
ctx.ui.write(` Model: ${e.request.model}, Tokens: ${e.response.usage.totalTokens}, Cost: $${e.cost.totalCost.toFixed(6)}
|
|
116
|
+
`);
|
|
117
|
+
} else if (event.type === "tool:execution") {
|
|
118
|
+
const e = event;
|
|
119
|
+
ctx.ui.write(` Tool: ${e.tool.name}, Success: ${e.output.success}, Duration: ${e.timing.durationMs}ms
|
|
120
|
+
`);
|
|
121
|
+
} else if (event.type === "error:captured") {
|
|
122
|
+
const e = event;
|
|
123
|
+
ctx.ui.write(` Error: ${e.error.message.substring(0, 100)}
|
|
124
|
+
`);
|
|
125
|
+
}
|
|
126
|
+
ctx.ui.write("\n");
|
|
127
|
+
}
|
|
128
|
+
if (events.length > showCount) {
|
|
129
|
+
ctx.ui.write(`... and ${events.length - showCount} more events
|
|
130
|
+
`);
|
|
131
|
+
ctx.ui.write("Use --json flag to see all events\n");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function error(code, message) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
command: "trace:filter",
|
|
138
|
+
taskId: "",
|
|
139
|
+
error: {
|
|
140
|
+
code,
|
|
141
|
+
message
|
|
142
|
+
},
|
|
143
|
+
summary: {
|
|
144
|
+
message,
|
|
145
|
+
severity: "error",
|
|
146
|
+
actionable: true
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { trace_filter_default as default };
|
|
152
|
+
//# sourceMappingURL=trace-filter.js.map
|
|
153
|
+
//# sourceMappingURL=trace-filter.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* agent:trace:iteration - View specific iteration details (AI-friendly)
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* pnpm kb agent:trace:iteration <taskId> --iteration=3
|
|
8
|
+
* pnpm kb agent:trace:iteration <taskId> --iteration=5 --json
|
|
9
|
+
*/
|
|
10
|
+
type TraceIterationInput = {
|
|
11
|
+
taskId?: string;
|
|
12
|
+
'task-id'?: string;
|
|
13
|
+
iteration?: number;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
};
|
|
16
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, TraceIterationInput, unknown>;
|
|
17
|
+
|
|
18
|
+
export { _default as default };
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { defineCommand, useLogger } from '@kb-labs/sdk';
|
|
2
|
+
import { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/trace-iteration.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-iteration.ts
|
|
43
|
+
var trace_iteration_default = defineCommand({
|
|
44
|
+
id: "trace:iteration",
|
|
45
|
+
description: "View all events for a specific iteration",
|
|
46
|
+
handler: {
|
|
47
|
+
async execute(ctx, input) {
|
|
48
|
+
const logger = useLogger();
|
|
49
|
+
const flags = input.flags ?? input;
|
|
50
|
+
const taskId = flags["task-id"] ?? flags.taskId;
|
|
51
|
+
const iteration = typeof flags.iteration === "string" ? parseInt(flags.iteration, 10) : flags.iteration;
|
|
52
|
+
if (iteration === void 0 || iteration < 1) {
|
|
53
|
+
const err = error("INVALID_ITERATION", "Missing or invalid --iteration flag (must be >= 1)");
|
|
54
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
55
|
+
return { exitCode: 1, response: err };
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const loaded = await loadTrace(taskId);
|
|
59
|
+
if (!loaded.ok) {
|
|
60
|
+
const code = loaded.error.kind === "invalid_task_id" ? "INVALID_TASK_ID" : loaded.error.kind === "not_found" ? "TRACE_NOT_FOUND" : loaded.error.kind === "too_large" ? "FILE_TOO_LARGE" : "CORRUPTED_TRACE";
|
|
61
|
+
const err = error(code, formatTraceLoadError(loaded.error));
|
|
62
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
63
|
+
return { exitCode: 1, response: err };
|
|
64
|
+
}
|
|
65
|
+
const normalized = normalizeTraceEvents(loaded.events);
|
|
66
|
+
const filtered = normalized.filter((e) => e.iteration === iteration).map((e) => e.raw);
|
|
67
|
+
if (filtered.length === 0) {
|
|
68
|
+
const err = error("INVALID_ITERATION", `No events found for iteration ${iteration}`);
|
|
69
|
+
ctx.ui.write(JSON.stringify(err, null, 2) + "\n");
|
|
70
|
+
return { exitCode: 1, response: err };
|
|
71
|
+
}
|
|
72
|
+
const summary = calculateIterationSummary(filtered);
|
|
73
|
+
const response = {
|
|
74
|
+
success: true,
|
|
75
|
+
command: "trace:iteration",
|
|
76
|
+
taskId: taskId ?? "",
|
|
77
|
+
data: {
|
|
78
|
+
taskId: taskId ?? "",
|
|
79
|
+
iteration,
|
|
80
|
+
events: filtered,
|
|
81
|
+
summary
|
|
82
|
+
},
|
|
83
|
+
summary: {
|
|
84
|
+
message: `Iteration ${iteration}: ${summary.eventCount} events, ${summary.llmCalls} LLM calls, ${summary.toolCalls} tool calls`,
|
|
85
|
+
severity: summary.errors > 0 ? "warning" : "info",
|
|
86
|
+
actionable: summary.errors > 0
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
if (flags.json) {
|
|
90
|
+
ctx.ui.write(JSON.stringify(response, null, 2) + "\n");
|
|
91
|
+
} else {
|
|
92
|
+
printHumanReadable(ctx, iteration, filtered, summary);
|
|
93
|
+
}
|
|
94
|
+
return { exitCode: 0, response };
|
|
95
|
+
} catch (err) {
|
|
96
|
+
logger.error("trace:iteration error:", err instanceof Error ? err : void 0);
|
|
97
|
+
const errResponse = error("IO_ERROR", err instanceof Error ? err.message : String(err));
|
|
98
|
+
ctx.ui.write(JSON.stringify(errResponse, null, 2) + "\n");
|
|
99
|
+
return { exitCode: 1, response: errResponse };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
function calculateIterationSummary(events) {
|
|
105
|
+
const llmEvents = events.filter((e) => {
|
|
106
|
+
const type = String(e.type ?? "");
|
|
107
|
+
return type === "llm:start" || type === "llm:call" || type === "llm_call";
|
|
108
|
+
});
|
|
109
|
+
const toolEvents = events.filter((e) => {
|
|
110
|
+
const type = String(e.type ?? "");
|
|
111
|
+
return type === "tool:start" || type === "tool:execution" || type === "tool_call";
|
|
112
|
+
});
|
|
113
|
+
const errorEvents = events.filter((e) => {
|
|
114
|
+
const type = String(e.type ?? "");
|
|
115
|
+
return type === "error:captured" || type === "agent:error" || type === "tool:error";
|
|
116
|
+
});
|
|
117
|
+
const timestamps = events.map((e) => new Date(e.timestamp).getTime());
|
|
118
|
+
const durationMs = timestamps.length > 0 ? Math.max(...timestamps) - Math.min(...timestamps) : 0;
|
|
119
|
+
return {
|
|
120
|
+
eventCount: events.length,
|
|
121
|
+
llmCalls: llmEvents.length,
|
|
122
|
+
toolCalls: toolEvents.length,
|
|
123
|
+
errors: errorEvents.length,
|
|
124
|
+
durationMs
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function printHumanReadable(ctx, iteration, events, summary) {
|
|
128
|
+
ctx.ui.write("\n");
|
|
129
|
+
ctx.ui.write(`\u{1F504} Iteration ${iteration}
|
|
130
|
+
`);
|
|
131
|
+
ctx.ui.write("\n");
|
|
132
|
+
ctx.ui.write("\u{1F4CA} Summary:\n");
|
|
133
|
+
ctx.ui.write(` Total events: ${summary.eventCount}
|
|
134
|
+
`);
|
|
135
|
+
ctx.ui.write(` LLM calls: ${summary.llmCalls}
|
|
136
|
+
`);
|
|
137
|
+
ctx.ui.write(` Tool calls: ${summary.toolCalls}
|
|
138
|
+
`);
|
|
139
|
+
ctx.ui.write(` Errors: ${summary.errors}
|
|
140
|
+
`);
|
|
141
|
+
ctx.ui.write(` Duration: ${summary.durationMs}ms
|
|
142
|
+
`);
|
|
143
|
+
ctx.ui.write("\n");
|
|
144
|
+
ctx.ui.write("\u{1F4DD} Events Timeline:\n");
|
|
145
|
+
ctx.ui.write("\n");
|
|
146
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
147
|
+
for (const event of events) {
|
|
148
|
+
const existing = grouped.get(event.type) || [];
|
|
149
|
+
existing.push(event);
|
|
150
|
+
grouped.set(event.type, existing);
|
|
151
|
+
}
|
|
152
|
+
for (const [type, typeEvents] of grouped) {
|
|
153
|
+
ctx.ui.write(` ${type}: ${typeEvents.length}
|
|
154
|
+
`);
|
|
155
|
+
if ((type === "llm:end" || type === "llm:call") && typeEvents.length > 0) {
|
|
156
|
+
const llmEvent = typeEvents[0];
|
|
157
|
+
const tokens = llmEvent?.data?.tokensUsed ?? llmEvent?.response?.usage?.totalTokens ?? 0;
|
|
158
|
+
ctx.ui.write(` Tokens: ${tokens}
|
|
159
|
+
`);
|
|
160
|
+
} else if (type === "tool:end" || type === "tool:start" || type === "tool:execution") {
|
|
161
|
+
const toolNames = typeEvents.map((e) => e?.data?.toolName || e?.tool?.name || "unknown");
|
|
162
|
+
ctx.ui.write(` Tools: ${[...new Set(toolNames)].join(", ")}
|
|
163
|
+
`);
|
|
164
|
+
} else if (type === "error:captured" && typeEvents.length > 0) {
|
|
165
|
+
const errorEvent = typeEvents[0];
|
|
166
|
+
ctx.ui.write(` \u26A0\uFE0F ${errorEvent.error.message.substring(0, 100)}
|
|
167
|
+
`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
ctx.ui.write("\n");
|
|
171
|
+
ctx.ui.write("Use --json flag to see full event details\n");
|
|
172
|
+
}
|
|
173
|
+
function error(code, message) {
|
|
174
|
+
return {
|
|
175
|
+
success: false,
|
|
176
|
+
command: "trace:iteration",
|
|
177
|
+
taskId: "",
|
|
178
|
+
error: {
|
|
179
|
+
code,
|
|
180
|
+
message
|
|
181
|
+
},
|
|
182
|
+
summary: {
|
|
183
|
+
message,
|
|
184
|
+
severity: "error",
|
|
185
|
+
actionable: true
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { trace_iteration_default as default };
|
|
191
|
+
//# sourceMappingURL=trace-iteration.js.map
|
|
192
|
+
//# sourceMappingURL=trace-iteration.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* agent:trace:stats - Show trace statistics (AI-friendly)
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* pnpm kb agent:trace:stats <taskId>
|
|
8
|
+
* pnpm kb agent:trace:stats <taskId> --json
|
|
9
|
+
*/
|
|
10
|
+
type TraceStatsInput = {
|
|
11
|
+
taskId?: string;
|
|
12
|
+
'task-id'?: string;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
};
|
|
15
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, TraceStatsInput, unknown>;
|
|
16
|
+
|
|
17
|
+
export { _default as default };
|