@kb-labs/agent-entry 2.107.0 → 2.110.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.
@@ -54,7 +54,7 @@ var trace_stats_default = defineCommand({
54
54
  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";
55
55
  const err = error(code, formatTraceLoadError(loaded.error));
56
56
  ctx.ui?.json?.(err);
57
- return { exitCode: 1, response: err };
57
+ return { ok: false, error: "Command failed", result: err };
58
58
  }
59
59
  const { events } = loaded;
60
60
  const stats = calculateStats(events, taskId);
@@ -74,12 +74,12 @@ var trace_stats_default = defineCommand({
74
74
  } else {
75
75
  printHumanReadable(ctx, stats);
76
76
  }
77
- return { exitCode: 0, response };
77
+ return { ok: true, result: response };
78
78
  } catch (err) {
79
79
  logger.error("trace:stats error:", err instanceof Error ? err : void 0);
80
80
  const errResponse = error("IO_ERROR", err instanceof Error ? err.message : String(err));
81
81
  ctx.ui?.json?.(errResponse);
82
- return { exitCode: 1, response: errResponse };
82
+ return { ok: false, error: "Command failed", result: errResponse };
83
83
  }
84
84
  }
85
85
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/trace-event-normalizer.ts","../../../src/cli/commands/trace-stats.ts"],"names":[],"mappings":"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","file":"trace-stats.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:stats - Show trace statistics (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:stats <taskId>\n * pnpm kb agent:trace:stats <taskId> --json\n */\n\nimport { defineCommand, useLogger } from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n StatsResponse,\n TraceErrorCode,\n DetailedTraceEntry,\n} from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\n/** Raw shape of llm:call / llm:end events */\ninterface LLMCallRaw {\n response?: { usage?: { inputTokens?: number; outputTokens?: number } };\n cost?: { totalCost?: number };\n}\n\n/** Raw shape of tool:end / tool:execution events */\ninterface ToolEndRaw {\n tool?: { name?: string };\n output?: { success?: boolean };\n}\n\ntype TraceStatsInput = {\n taskId?: string;\n 'task-id'?: string;\n json?: boolean;\n};\n\ntype TraceStatsResult = { exitCode: number; response?: TraceCommandResponse };\n\nexport default defineCommand({\n id: 'trace:stats',\n description: 'Show trace statistics with cost and performance metrics',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceStatsInput): Promise<TraceStatsResult> {\n const logger = useLogger();\n const flags: TraceStatsInput =\n (typeof input === 'object' && input !== null && 'flags' in input)\n ? (input as { flags: TraceStatsInput }).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 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?.json?.(err);\n return { exitCode: 1, response: err };\n }\n\n const { events } = loaded;\n\n // Calculate stats\n const stats = calculateStats(events, taskId);\n\n // Build response\n const response: TraceCommandResponse<StatsResponse> = {\n success: true,\n command: 'trace:stats',\n taskId: taskId ?? '',\n data: stats,\n summary: {\n message: `${stats.iterations.total} iterations, ${stats.llm.calls} LLM calls, $${stats.cost.total.toFixed(4)} cost`,\n severity: stats.errors > 0 ? 'warning' : 'info',\n actionable: stats.errors > 5,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui?.json?.(response);\n } else {\n printHumanReadable(ctx, stats);\n }\n\n return { exitCode: 0, response };\n } catch (err) {\n logger.error('trace:stats error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui?.json?.(errResponse);\n return { exitCode: 1, response: errResponse };\n }\n },\n },\n});\n\n/**\n * Calculate statistics from trace events\n */\nfunction calculateStats(events: DetailedTraceEntry[], taskId?: string): StatsResponse {\n const normalized = normalizeTraceEvents(events);\n const iterationSet = new Set<number>();\n for (const e of normalized) {\n if (e.iteration > 0) {\n iterationSet.add(e.iteration);\n }\n }\n\n const llmStartEvents = normalized.filter((e) => e.type === 'llm:start' || e.type === 'llm:call' || e.type === 'llm_call');\n const llmEndEvents = normalized.filter((e) => e.type === 'llm:end' || e.type === 'llm:call');\n const toolEndEvents = normalized.filter((e) => e.type === 'tool:end' || e.type === 'tool:execution' || e.type === 'tool_result');\n const errorEvents = normalized.filter((e) => e.type === 'error:captured' || e.type === 'agent:error' || e.type === 'tool:error');\n\n // Calculate LLM stats (handle both new and legacy data structures)\n const inputTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.raw as LLMCallRaw).response?.usage?.inputTokens || 0;\n return sum + tokens;\n }, 0);\n\n const outputTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.raw as LLMCallRaw).response?.usage?.outputTokens || 0;\n return sum + tokens;\n }, 0);\n\n const legacyTotalTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.data.tokensUsed as number | undefined) || 0;\n return sum + tokens;\n }, 0);\n\n const totalCost = llmEndEvents.reduce((sum, e) => {\n const cost = (e.raw as LLMCallRaw).cost?.totalCost || 0;\n return sum + cost;\n }, 0);\n\n // Calculate tool stats (handle both new and legacy formats)\n const toolCounts: Record<string, number> = {};\n let successfulTools = 0;\n let failedTools = 0;\n\n for (const tool of toolEndEvents) {\n const toolName = (tool.raw as ToolEndRaw).tool?.name || (tool.data.toolName as string | undefined) || 'unknown';\n toolCounts[toolName] = (toolCounts[toolName] || 0) + 1;\n\n const success = (tool.raw as ToolEndRaw).output?.success ?? (tool.data.success as boolean | undefined) ?? true;\n if (success) {\n successfulTools++;\n } else {\n failedTools++;\n }\n }\n\n // Calculate timing\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const startedAt = firstEvent?.timestamp || new Date().toISOString();\n const completedAt = lastEvent?.timestamp || new Date().toISOString();\n const totalDurationMs = new Date(completedAt).getTime() - new Date(startedAt).getTime();\n\n return {\n taskId: taskId || 'unknown',\n status: errorEvents.length > 0 ? 'failed' : 'success',\n\n iterations: {\n total: iterationSet.size,\n completed: iterationSet.size,\n },\n\n llm: {\n calls: llmStartEvents.length,\n inputTokens,\n outputTokens,\n // Use explicit tokens if available, otherwise fall back to legacy total\n totalTokens: (inputTokens + outputTokens) || legacyTotalTokens,\n },\n\n tools: {\n totalCalls: toolEndEvents.length,\n byTool: toolCounts,\n successful: successfulTools,\n failed: failedTools,\n },\n\n timing: {\n startedAt,\n completedAt,\n totalDurationMs,\n durationFormatted: formatDuration(totalDurationMs),\n },\n\n cost: {\n total: totalCost,\n currency: 'USD',\n },\n\n errors: errorEvents.length,\n };\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(ctx: PluginContextV3, stats: StatsResponse): void {\n ctx.ui.write('\\n');\n ctx.ui.write('📊 Trace Statistics\\n');\n ctx.ui.write('\\n');\n\n ctx.ui.write(`Status: ${stats.status === 'success' ? '✅ Success' : '❌ Failed'}\\n`);\n ctx.ui.write(`Iterations: ${stats.iterations.total}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('🤖 LLM Usage:\\n');\n ctx.ui.write(` Calls: ${stats.llm.calls}\\n`);\n ctx.ui.write(` Input tokens: ${stats.llm.inputTokens.toLocaleString()}\\n`);\n ctx.ui.write(` Output tokens: ${stats.llm.outputTokens.toLocaleString()}\\n`);\n ctx.ui.write(` Total tokens: ${stats.llm.totalTokens.toLocaleString()}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('🔧 Tool Usage:\\n');\n ctx.ui.write(` Total calls: ${stats.tools.totalCalls}\\n`);\n ctx.ui.write(` Successful: ${stats.tools.successful}\\n`);\n ctx.ui.write(` Failed: ${stats.tools.failed}\\n`);\n ctx.ui.write(' By tool:\\n');\n for (const [tool, count] of Object.entries(stats.tools.byTool)) {\n ctx.ui.write(` ${tool}: ${count}\\n`);\n }\n ctx.ui.write('\\n');\n\n ctx.ui.write('⏱️ Timing:\\n');\n ctx.ui.write(` Started: ${stats.timing.startedAt}\\n`);\n ctx.ui.write(` Completed: ${stats.timing.completedAt}\\n`);\n ctx.ui.write(` Duration: ${stats.timing.durationFormatted}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('💰 Cost:\\n');\n ctx.ui.write(` Total: $${stats.cost.total.toFixed(4)} ${stats.cost.currency}\\n`);\n ctx.ui.write('\\n');\n\n if (stats.errors > 0) {\n ctx.ui.write(`⚠️ Errors: ${stats.errors}\\n`);\n ctx.ui.write('\\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:stats',\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-stats.ts"],"names":[],"mappings":"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","file":"trace-stats.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:stats - Show trace statistics (AI-friendly)\n *\n * Usage:\n * pnpm kb agent:trace:stats <taskId>\n * pnpm kb agent:trace:stats <taskId> --json\n */\n\nimport { defineCommand, useLogger } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport type {\n TraceCommandResponse,\n StatsResponse,\n TraceErrorCode,\n DetailedTraceEntry,\n} from '@kb-labs/agent-contracts';\nimport { loadTrace, formatTraceLoadError } from '@kb-labs/agent-tracing';\nimport { normalizeTraceEvents } from './trace-event-normalizer.js';\n\n/** Raw shape of llm:call / llm:end events */\ninterface LLMCallRaw {\n response?: { usage?: { inputTokens?: number; outputTokens?: number } };\n cost?: { totalCost?: number };\n}\n\n/** Raw shape of tool:end / tool:execution events */\ninterface ToolEndRaw {\n tool?: { name?: string };\n output?: { success?: boolean };\n}\n\ntype TraceStatsInput = {\n taskId?: string;\n 'task-id'?: string;\n json?: boolean;\n};\n\ntype TraceStatsResult = CommandResult<TraceCommandResponse>;\n\nexport default defineCommand({\n id: 'trace:stats',\n description: 'Show trace statistics with cost and performance metrics',\n\n handler: {\n async execute(ctx: PluginContextV3, input: TraceStatsInput): Promise<TraceStatsResult> {\n const logger = useLogger();\n const flags: TraceStatsInput =\n (typeof input === 'object' && input !== null && 'flags' in input)\n ? (input as { flags: TraceStatsInput }).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 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?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n const { events } = loaded;\n\n // Calculate stats\n const stats = calculateStats(events, taskId);\n\n // Build response\n const response: TraceCommandResponse<StatsResponse> = {\n success: true,\n command: 'trace:stats',\n taskId: taskId ?? '',\n data: stats,\n summary: {\n message: `${stats.iterations.total} iterations, ${stats.llm.calls} LLM calls, $${stats.cost.total.toFixed(4)} cost`,\n severity: stats.errors > 0 ? 'warning' : 'info',\n actionable: stats.errors > 5,\n },\n };\n\n // Output\n if (flags.json) {\n ctx.ui?.json?.(response);\n } else {\n printHumanReadable(ctx, stats);\n }\n\n return { ok: true, result: response };\n } catch (err) {\n logger.error('trace:stats error:', err instanceof Error ? err : undefined);\n const errResponse = error('IO_ERROR', err instanceof Error ? err.message : String(err));\n ctx.ui?.json?.(errResponse);\n return { ok: false, error: 'Command failed', result: errResponse };\n }\n },\n },\n});\n\n/**\n * Calculate statistics from trace events\n */\nfunction calculateStats(events: DetailedTraceEntry[], taskId?: string): StatsResponse {\n const normalized = normalizeTraceEvents(events);\n const iterationSet = new Set<number>();\n for (const e of normalized) {\n if (e.iteration > 0) {\n iterationSet.add(e.iteration);\n }\n }\n\n const llmStartEvents = normalized.filter((e) => e.type === 'llm:start' || e.type === 'llm:call' || e.type === 'llm_call');\n const llmEndEvents = normalized.filter((e) => e.type === 'llm:end' || e.type === 'llm:call');\n const toolEndEvents = normalized.filter((e) => e.type === 'tool:end' || e.type === 'tool:execution' || e.type === 'tool_result');\n const errorEvents = normalized.filter((e) => e.type === 'error:captured' || e.type === 'agent:error' || e.type === 'tool:error');\n\n // Calculate LLM stats (handle both new and legacy data structures)\n const inputTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.raw as LLMCallRaw).response?.usage?.inputTokens || 0;\n return sum + tokens;\n }, 0);\n\n const outputTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.raw as LLMCallRaw).response?.usage?.outputTokens || 0;\n return sum + tokens;\n }, 0);\n\n const legacyTotalTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.data.tokensUsed as number | undefined) || 0;\n return sum + tokens;\n }, 0);\n\n const totalCost = llmEndEvents.reduce((sum, e) => {\n const cost = (e.raw as LLMCallRaw).cost?.totalCost || 0;\n return sum + cost;\n }, 0);\n\n // Calculate tool stats (handle both new and legacy formats)\n const toolCounts: Record<string, number> = {};\n let successfulTools = 0;\n let failedTools = 0;\n\n for (const tool of toolEndEvents) {\n const toolName = (tool.raw as ToolEndRaw).tool?.name || (tool.data.toolName as string | undefined) || 'unknown';\n toolCounts[toolName] = (toolCounts[toolName] || 0) + 1;\n\n const success = (tool.raw as ToolEndRaw).output?.success ?? (tool.data.success as boolean | undefined) ?? true;\n if (success) {\n successfulTools++;\n } else {\n failedTools++;\n }\n }\n\n // Calculate timing\n const firstEvent = events[0];\n const lastEvent = events[events.length - 1];\n const startedAt = firstEvent?.timestamp || new Date().toISOString();\n const completedAt = lastEvent?.timestamp || new Date().toISOString();\n const totalDurationMs = new Date(completedAt).getTime() - new Date(startedAt).getTime();\n\n return {\n taskId: taskId || 'unknown',\n status: errorEvents.length > 0 ? 'failed' : 'success',\n\n iterations: {\n total: iterationSet.size,\n completed: iterationSet.size,\n },\n\n llm: {\n calls: llmStartEvents.length,\n inputTokens,\n outputTokens,\n // Use explicit tokens if available, otherwise fall back to legacy total\n totalTokens: (inputTokens + outputTokens) || legacyTotalTokens,\n },\n\n tools: {\n totalCalls: toolEndEvents.length,\n byTool: toolCounts,\n successful: successfulTools,\n failed: failedTools,\n },\n\n timing: {\n startedAt,\n completedAt,\n totalDurationMs,\n durationFormatted: formatDuration(totalDurationMs),\n },\n\n cost: {\n total: totalCost,\n currency: 'USD',\n },\n\n errors: errorEvents.length,\n };\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Print human-readable output\n */\nfunction printHumanReadable(ctx: PluginContextV3, stats: StatsResponse): void {\n ctx.ui.write('\\n');\n ctx.ui.write('📊 Trace Statistics\\n');\n ctx.ui.write('\\n');\n\n ctx.ui.write(`Status: ${stats.status === 'success' ? '✅ Success' : '❌ Failed'}\\n`);\n ctx.ui.write(`Iterations: ${stats.iterations.total}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('🤖 LLM Usage:\\n');\n ctx.ui.write(` Calls: ${stats.llm.calls}\\n`);\n ctx.ui.write(` Input tokens: ${stats.llm.inputTokens.toLocaleString()}\\n`);\n ctx.ui.write(` Output tokens: ${stats.llm.outputTokens.toLocaleString()}\\n`);\n ctx.ui.write(` Total tokens: ${stats.llm.totalTokens.toLocaleString()}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('🔧 Tool Usage:\\n');\n ctx.ui.write(` Total calls: ${stats.tools.totalCalls}\\n`);\n ctx.ui.write(` Successful: ${stats.tools.successful}\\n`);\n ctx.ui.write(` Failed: ${stats.tools.failed}\\n`);\n ctx.ui.write(' By tool:\\n');\n for (const [tool, count] of Object.entries(stats.tools.byTool)) {\n ctx.ui.write(` ${tool}: ${count}\\n`);\n }\n ctx.ui.write('\\n');\n\n ctx.ui.write('⏱️ Timing:\\n');\n ctx.ui.write(` Started: ${stats.timing.startedAt}\\n`);\n ctx.ui.write(` Completed: ${stats.timing.completedAt}\\n`);\n ctx.ui.write(` Duration: ${stats.timing.durationFormatted}\\n`);\n ctx.ui.write('\\n');\n\n ctx.ui.write('💰 Cost:\\n');\n ctx.ui.write(` Total: $${stats.cost.total.toFixed(4)} ${stats.cost.currency}\\n`);\n ctx.ui.write('\\n');\n\n if (stats.errors > 0) {\n ctx.ui.write(`⚠️ Errors: ${stats.errors}\\n`);\n ctx.ui.write('\\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:stats',\n taskId: '',\n error: {\n code,\n message,\n },\n summary: {\n message,\n severity: 'error',\n actionable: true,\n },\n };\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  "name": "agentPlugin",
6
6
  "globalName": "agentPlugin",
7
7
  "buildInfo": {
8
- "buildVersion": "2.107.0",
8
+ "buildVersion": "2.110.0",
9
9
  "buildName": "@kb-labs/agent-entry"
10
10
  },
11
11
  "publicPath": "auto",
@@ -27,7 +27,7 @@
27
27
  {
28
28
  "id": "agentPlugin:@kb-labs/studio-event-bus",
29
29
  "name": "@kb-labs/studio-event-bus",
30
- "version": "2.107.0",
30
+ "version": "2.110.0",
31
31
  "singleton": true,
32
32
  "requiredVersion": "^2.0.0",
33
33
  "assets": {
@@ -47,7 +47,7 @@
47
47
  {
48
48
  "id": "agentPlugin:@kb-labs/studio-ui-core",
49
49
  "name": "@kb-labs/studio-ui-core",
50
- "version": "2.107.0",
50
+ "version": "2.110.0",
51
51
  "singleton": true,
52
52
  "requiredVersion": "^2.0.0",
53
53
  "assets": {
@@ -86,7 +86,7 @@
86
86
  {
87
87
  "id": "agentPlugin:@kb-labs/studio-hooks",
88
88
  "name": "@kb-labs/studio-hooks",
89
- "version": "2.107.0",
89
+ "version": "2.110.0",
90
90
  "singleton": true,
91
91
  "requiredVersion": "^2.0.0",
92
92
  "assets": {
@@ -106,7 +106,7 @@
106
106
  {
107
107
  "id": "agentPlugin:@kb-labs/studio-ui-kit",
108
108
  "name": "@kb-labs/studio-ui-kit",
109
- "version": "2.107.0",
109
+ "version": "2.110.0",
110
110
  "singleton": true,
111
111
  "requiredVersion": "^2.0.0",
112
112
  "assets": {
@@ -5,7 +5,7 @@
5
5
  "name": "agentPlugin",
6
6
  "globalName": "agentPlugin",
7
7
  "buildInfo": {
8
- "buildVersion": "2.107.0",
8
+ "buildVersion": "2.110.0",
9
9
  "buildName": "@kb-labs/agent-entry"
10
10
  },
11
11
  "publicPath": "auto",
@@ -27,7 +27,7 @@
27
27
  {
28
28
  "id": "agentPlugin:@kb-labs/studio-event-bus",
29
29
  "name": "@kb-labs/studio-event-bus",
30
- "version": "2.107.0",
30
+ "version": "2.110.0",
31
31
  "requiredVersion": "^2.0.0",
32
32
  "singleton": true,
33
33
  "assets": {
@@ -49,7 +49,7 @@
49
49
  {
50
50
  "id": "agentPlugin:@kb-labs/studio-ui-core",
51
51
  "name": "@kb-labs/studio-ui-core",
52
- "version": "2.107.0",
52
+ "version": "2.110.0",
53
53
  "requiredVersion": "^2.0.0",
54
54
  "singleton": true,
55
55
  "assets": {
@@ -92,7 +92,7 @@
92
92
  {
93
93
  "id": "agentPlugin:@kb-labs/studio-hooks",
94
94
  "name": "@kb-labs/studio-hooks",
95
- "version": "2.107.0",
95
+ "version": "2.110.0",
96
96
  "requiredVersion": "^2.0.0",
97
97
  "singleton": true,
98
98
  "assets": {
@@ -114,7 +114,7 @@
114
114
  {
115
115
  "id": "agentPlugin:@kb-labs/studio-ui-kit",
116
116
  "name": "@kb-labs/studio-ui-kit",
117
- "version": "2.107.0",
117
+ "version": "2.110.0",
118
118
  "requiredVersion": "^2.0.0",
119
119
  "singleton": true,
120
120
  "assets": {