@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
|
@@ -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 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: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\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 = (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 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 // 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.write(JSON.stringify(response, null, 2) + '\\n');\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.write(JSON.stringify(errResponse, null, 2) + '\\n');\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 any).response?.usage?.inputTokens || 0;\n return sum + tokens;\n }, 0);\n\n const outputTokens = llmEndEvents.reduce((sum, e) => {\n const tokens = (e.raw as any).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 any).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 any).tool?.name || (tool.data.toolName as string | undefined) || 'unknown';\n toolCounts[toolName] = (toolCounts[toolName] || 0) + 1;\n\n const success = (tool.raw as any).output?.success ?? tool.data.success ?? 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 { 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.write(JSON.stringify(err, null, 2) + '\\n');\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.write(JSON.stringify(response, null, 2) + '\\n');\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.write(JSON.stringify(errResponse, null, 2) + '\\n');\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rest/run-manager.ts","../../../src/rest/handlers/run-handler.ts","../../../src/rest/handlers/execute-session-plan-handler.ts"],"names":["run","useCache","fs","defineHandler","SessionManager"],"mappings":"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","file":"execute-session-plan-handler.js","sourcesContent":["/**\n * Run Manager - tracks active agent runs for REST/WS API\n *\n * Uses platform cache for persistence and in-memory Map for active agents.\n * Cache stores serializable run state, Map stores live agent references.\n * Uses platform eventBus for cross-process event broadcasting.\n */\n\nimport type { IAgentRunner } from '@kb-labs/agent-sdk';\nimport type { SessionManager } from '@kb-labs/agent-core';\nimport type { AgentEvent, AgentEventCallback } from '@kb-labs/agent-contracts';\nimport { useCache, usePlatform } from '@kb-labs/sdk';\n\nconst CACHE_PREFIX = 'agent:run:';\nconst EVENT_TOPIC_PREFIX = 'agent:events:';\nconst CACHE_TTL = 3600000; // 1 hour\n\n/**\n * Run status\n */\nexport type RunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Serializable run state (stored in cache)\n */\nexport interface RunState {\n runId: string;\n task: string;\n status: RunStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n summary?: string;\n error?: string;\n}\n\n/**\n * Active run with live agent (in-memory only)\n */\nexport interface ActiveRun extends RunState {\n agent?: IAgentRunner;\n sessionManager: SessionManager;\n listeners: Set<AgentEventCallback>;\n /** Monotonic sequence counter for event ordering */\n lastSeq: number;\n /** Replay buffer: all events emitted since run start (for late WS connections) */\n eventBuffer: AgentEvent[];\n}\n\n/**\n * Run Manager implementation\n */\nclass RunManagerImpl {\n /** Live agents and listeners (not cacheable) */\n private activeRuns: Map<string, ActiveRun> = new Map();\n\n /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */\n private sessionListeners: Map<string, Set<AgentEventCallback>> = new Map();\n\n /** sessionId per runId — set when run is registered */\n private runSessionMap: Map<string, string> = new Map();\n\n /**\n * Generate unique run ID\n */\n generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n\n /**\n * Register a new run\n */\n async register(\n runId: string,\n task: string,\n agent: IAgentRunner | undefined,\n sessionManager: SessionManager,\n sessionId?: string\n ): Promise<ActiveRun> {\n const now = new Date().toISOString();\n\n const run: ActiveRun = {\n runId,\n task,\n status: 'pending',\n agent,\n sessionManager,\n startedAt: now,\n listeners: new Set(),\n lastSeq: 0,\n eventBuffer: [],\n };\n\n // Store in memory (for live agent)\n this.activeRuns.set(runId, run);\n\n // Track sessionId → runId mapping for session-level listeners\n if (sessionId) {\n this.runSessionMap.set(runId, sessionId);\n }\n\n // Store serializable state in cache\n await this.saveToCache(run);\n\n return run;\n }\n\n /**\n * Get run by ID (from memory first, then cache for state)\n */\n get(runId: string): ActiveRun | undefined {\n return this.activeRuns.get(runId);\n }\n\n /**\n * Check if run exists (in memory or cache)\n */\n async exists(runId: string): Promise<boolean> {\n // Check memory first\n if (this.activeRuns.has(runId)) {\n return true;\n }\n // Fallback to cache\n const state = await this.getState(runId);\n return state !== null;\n }\n\n /**\n * Get run state from cache (for completed runs or cross-process access)\n */\n async getState(runId: string): Promise<RunState | null> {\n const cache = useCache();\n if (!cache) {return null;}\n\n return cache.get<RunState>(`${CACHE_PREFIX}${runId}`);\n }\n\n /**\n * Update run status\n */\n async updateStatus(runId: string, status: RunStatus, extra?: Partial<RunState>): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (run) {\n run.status = status;\n if (extra) {\n Object.assign(run, extra);\n }\n await this.saveToCache(run);\n }\n }\n\n /**\n * Save run state to cache\n */\n private async saveToCache(run: ActiveRun): Promise<void> {\n const cache = useCache();\n if (!cache) {return;}\n\n const state: RunState = {\n runId: run.runId,\n task: run.task,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n durationMs: run.durationMs,\n summary: run.summary,\n error: run.error,\n };\n\n await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);\n }\n\n /** Track subscriptions for cleanup */\n private subscriptions: Map<string, Map<AgentEventCallback, () => void>> = new Map();\n\n /**\n * Add event listener to run (uses eventBus for cross-process)\n */\n addListener(runId: string, callback: AgentEventCallback): boolean {\n const platform = usePlatform();\n if (!platform?.eventBus) {\n // Fallback to in-memory only\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n return true;\n }\n return false;\n }\n\n // Subscribe to eventBus topic for this run\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n const unsubscribe = platform.eventBus.subscribe<AgentEvent>(topic, async (event) => {\n try {\n callback(event);\n } catch {\n // Ignore callback errors\n }\n });\n\n // Track subscription for cleanup\n if (!this.subscriptions.has(runId)) {\n this.subscriptions.set(runId, new Map());\n }\n this.subscriptions.get(runId)!.set(callback, unsubscribe);\n\n // Also add to in-memory if run exists locally\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n }\n\n return true;\n }\n\n /**\n * Remove event listener from run\n */\n removeListener(runId: string, callback: AgentEventCallback): void {\n // Unsubscribe from eventBus\n const runSubs = this.subscriptions.get(runId);\n if (runSubs) {\n const unsubscribe = runSubs.get(callback);\n if (unsubscribe) {\n unsubscribe();\n runSubs.delete(callback);\n }\n if (runSubs.size === 0) {\n this.subscriptions.delete(runId);\n }\n }\n\n // Also remove from in-memory\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.delete(callback);\n }\n }\n\n /**\n * Broadcast event to all listeners of a run (uses eventBus for cross-process)\n * Assigns monotonic sequence number for reliable ordering\n * @returns The event with seq assigned (for persistence)\n */\n broadcast(runId: string, event: AgentEvent): AgentEvent {\n const platform = usePlatform();\n const run = this.activeRuns.get(runId);\n\n // Assign sequence number for ordering\n let seqEvent = event;\n if (run) {\n run.lastSeq++;\n seqEvent = { ...event, seq: run.lastSeq, runId };\n\n // Store in replay buffer (for late WS connections)\n run.eventBuffer.push(seqEvent);\n }\n\n // Publish to eventBus for cross-process delivery\n if (platform?.eventBus) {\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n platform.eventBus.publish(topic, seqEvent).catch(() => {\n // Ignore publish errors\n });\n }\n\n // Also notify local in-memory listeners (for same-process)\n if (run) {\n for (const listener of run.listeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n // Notify session-level listeners (persistent connections)\n const sessionId = this.runSessionMap.get(runId);\n if (sessionId) {\n const sListeners = this.sessionListeners.get(sessionId);\n if (sListeners) {\n for (const listener of sListeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n return seqEvent;\n }\n\n /**\n * Add a session-level listener — receives events from ALL runs in this session.\n */\n addSessionListener(sessionId: string, callback: AgentEventCallback): void {\n if (!this.sessionListeners.has(sessionId)) {\n this.sessionListeners.set(sessionId, new Set());\n }\n this.sessionListeners.get(sessionId)!.add(callback);\n }\n\n /**\n * Remove a session-level listener.\n */\n removeSessionListener(sessionId: string, callback: AgentEventCallback): void {\n const listeners = this.sessionListeners.get(sessionId);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.sessionListeners.delete(sessionId);\n }\n }\n }\n\n /**\n * Get replay buffer for a run (all events emitted since start).\n * Used by WS handler to send missed events on late connection.\n * Optionally filter by afterSeq to only get events the client hasn't seen.\n */\n getEventBuffer(runId: string, afterSeq?: number): AgentEvent[] {\n const run = this.activeRuns.get(runId);\n if (!run) {return [];}\n\n if (afterSeq != null) {\n return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);\n }\n return [...run.eventBuffer];\n }\n\n /**\n * List all active runs\n */\n listActive(): Array<{ runId: string; task: string; status: RunStatus; startedAt: string }> {\n return Array.from(this.activeRuns.values()).map(r => ({\n runId: r.runId,\n task: r.task,\n status: r.status,\n startedAt: r.startedAt,\n }));\n }\n\n /**\n * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).\n * Agent finishes its current tool call then exits at the next iteration boundary.\n */\n requestStop(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n if (!run || run.status !== 'running' || !run.agent) {\n return false;\n }\n run.agent.requestStop();\n return true;\n }\n\n /**\n * Clean up completed runs from memory (cache handles its own TTL)\n */\n cleanup(): void {\n for (const [runId, run] of this.activeRuns) {\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'stopped') {\n // Remove from memory but keep in cache\n this.activeRuns.delete(runId);\n }\n }\n }\n}\n\n/**\n * Singleton instance — stored on globalThis so all bundled modules share one instance.\n * When tsup compiles multiple entry points, each gets its own module scope,\n * so a plain `export const RunManager = new RunManagerImpl()` creates separate instances.\n * Using globalThis ensures run-handler.js and session-stream-handler.js share one RunManager.\n */\nconst GLOBAL_KEY = '__kb_agent_run_manager__';\nif (!(globalThis as Record<string, unknown>)[GLOBAL_KEY]) {\n (globalThis as Record<string, unknown>)[GLOBAL_KEY] = new RunManagerImpl();\n}\nexport const RunManager = (globalThis as Record<string, unknown>)[GLOBAL_KEY] as RunManagerImpl;\n","/**\n * POST /run handler\n *\n * Starts a new agent run via Orchestrator\n */\n\nimport { defineHandler, useAnalytics, useCache, useConfig, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager, createCoreToolPack, bootstrapAgentSDK, createSessionMemoryBridge } from '@kb-labs/agent-core';\nimport { createDefaultResponseRequirementsSelector } from '@kb-labs/agent-runtime';\nimport { IncrementalTraceWriter } from '@kb-labs/agent-tracing';\n\n// Register SDKAgentRunner as the RunnerFactory (idempotent — runs once per process)\nbootstrapAgentSDK();\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { createToolRegistry } from '@kb-labs/agent-tools';\nimport type { RunRequest, RunResponse, AgentsPluginConfig, KernelState } from '@kb-labs/agent-contracts';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport {\n AGENTS_WS_BASE_PATH,\n AGENTS_WS_CHANNELS,\n AGENT_ANALYTICS_EVENTS,\n} from '@kb-labs/agent-contracts';\nimport { RunManager } from '../run-manager.js';\n\nconst FOLLOW_UP_SCOPE_RE = /\\b(глубже|подробнее|детал|слишком поверхност|deeper|more depth|details?)\\b/i;\n\nfunction isLikelyFollowUpScopeTask(task: string): boolean {\n return FOLLOW_UP_SCOPE_RE.test(task);\n}\n\nfunction pathExists(dir: string): boolean {\n try {\n return fs.existsSync(dir);\n } catch {\n return false;\n }\n}\n\nfunction scoreRepoFromToolPath(rawPath: string, scores: Map<string, number>): void {\n const p = rawPath.replace(/\\\\/g, '/');\n\n // Explicit repo prefix: kb-labs-xxx/...\n const explicit = p.match(/(^|\\/)(kb-labs-[^/]+)\\//);\n if (explicit?.[2]) {\n scores.set(explicit[2], (scores.get(explicit[2]) ?? 0) + 5);\n }\n\n // Heuristic by package naming patterns\n if (p.startsWith('packages/')) {\n if (/packages\\/agent[-/]/.test(p) || /agent-core|agent-tools|agent-cli|agent-task-runner/.test(p)) {\n scores.set('kb-labs-agents', (scores.get('kb-labs-agents') ?? 0) + 4);\n }\n if (/packages\\/mind[-/]/.test(p) || /mind-engine|mind-core/.test(p)) {\n scores.set('kb-labs-mind', (scores.get('kb-labs-mind') ?? 0) + 4);\n }\n }\n}\n\nasync function inferFollowUpWorkingDir(\n sessionManager: SessionManager,\n sessionId: string,\n baseWorkingDir: string,\n): Promise<string | null> {\n const events = await sessionManager.getSessionEvents(sessionId);\n if (!events.length) {\n return null;\n }\n\n // Find the latest completed run in this session\n const completedRuns = new Set<string>();\n for (const event of events) {\n if (event.type === 'agent:end' && event.runId) {\n completedRuns.add(event.runId);\n }\n }\n const lastRunId = Array.from(completedRuns).at(-1);\n if (!lastRunId) {\n return null;\n }\n\n const repoScores = new Map<string, number>();\n for (const event of events) {\n if (event.runId !== lastRunId) {\n continue;\n }\n\n if (event.type === 'tool:start') {\n const input = (event.data?.input as Record<string, unknown> | undefined) ?? {};\n const p1 = input.path;\n const p2 = input.directory;\n if (typeof p1 === 'string') {scoreRepoFromToolPath(p1, repoScores);}\n if (typeof p2 === 'string') {scoreRepoFromToolPath(p2, repoScores);}\n }\n\n if (event.type === 'tool:end') {\n const metadata = (event.data?.metadata as Record<string, unknown> | undefined) ?? {};\n const p = metadata.path;\n if (typeof p === 'string') {scoreRepoFromToolPath(p, repoScores);}\n }\n }\n\n const ranked = Array.from(repoScores.entries()).sort((a, b) => b[1] - a[1]);\n const top = ranked[0];\n if (!top || top[1] < 4) {\n return null;\n }\n\n const inferredDir = path.join(baseWorkingDir, top[0]);\n return pathExists(inferredDir) ? inferredDir : null;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<RunRequest>\n ): Promise<RunResponse> {\n const body = input.body as RunRequest | undefined;\n\n if (!body?.task) {\n throw new Error('Task is required');\n }\n\n const analytics = useAnalytics();\n const runId = RunManager.generateRunId();\n const startTime = Date.now();\n\n // Get or create session\n let sessionId = body.sessionId;\n let workingDir = body.workingDir || ctx.cwd;\n let sessionManager = new SessionManager(workingDir);\n if (!sessionId) {\n // Create new session\n const session = await sessionManager.createSession({\n mode: 'execute',\n task: body.task,\n agentId: body.agentId ?? 'orchestrator',\n });\n sessionId = session.id;\n ctx.platform.logger.info(`[run-handler] Created new session ${sessionId}`);\n } else {\n // Verify session exists (from current manager first)\n const existingSession = await sessionManager.loadSession(sessionId);\n let resolvedSession = existingSession;\n\n // Fallback: session may belong to a different root than current ctx.cwd\n if (!resolvedSession && pathExists(ctx.cwd)) {\n const fallbackManager = new SessionManager(ctx.cwd);\n const fallbackSession = await fallbackManager.loadSession(sessionId);\n if (fallbackSession) {\n sessionManager = fallbackManager;\n resolvedSession = fallbackSession;\n }\n }\n\n if (!resolvedSession) {\n throw new Error(`Session not found: ${sessionId} (cwd=${ctx.cwd})`);\n }\n\n // Session workingDir is primary source of truth for follow-up runs\n workingDir = body.workingDir || resolvedSession.workingDir || workingDir;\n\n // Smart follow-up anchoring: keep depth requests in the same repo/module as previous run\n if (!body.workingDir && isLikelyFollowUpScopeTask(body.task)) {\n const inferred = await inferFollowUpWorkingDir(sessionManager, sessionId, resolvedSession.workingDir || ctx.cwd);\n if (inferred && inferred !== workingDir) {\n ctx.platform.logger.info(`[run-handler] Follow-up scope inferred: ${workingDir} -> ${inferred}`);\n workingDir = inferred;\n }\n }\n\n // Rebind session manager to effective working directory\n sessionManager = new SessionManager(workingDir);\n ctx.platform.logger.info(`[run-handler] Continuing session ${sessionId} (workingDir=${workingDir})`);\n }\n\n ctx.platform.logger.info(`[run-handler] Starting run ${runId} for task: ${body.task}`);\n\n // Create user turn with task/question\n await sessionManager.createUserTurn(sessionId, body.task, runId);\n\n // Track run started\n await analytics?.track(AGENT_ANALYTICS_EVENTS.RUN_STARTED, {\n runId,\n sessionId,\n taskLength: body.task.length,\n tier: body.tier ?? 'medium',\n enableEscalation: body.enableEscalation ?? true,\n responseMode: body.responseMode ?? 'auto',\n verbose: body.verbose ?? false,\n });\n\n // Create tool registry with standard tools\n const sessionMemory = createSessionMemoryBridge(workingDir, sessionId);\n const responseRequirementsSelector = createDefaultResponseRequirementsSelector();\n const toolRegistry = createToolRegistry({\n workingDir,\n currentTask: body.task,\n sessionId,\n verbose: body.verbose,\n cache: useCache(),\n sessionMemory,\n responseRequirementsResolver: async ({ task, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: task ?? body.task,\n }),\n });\n const agentsConfig = await useConfig<AgentsPluginConfig>();\n\n const finalSessionId = sessionId; // Capture for closure\n const traceDir = path.join(workingDir, '.kb', 'traces', 'incremental');\n const traceWriter = new IncrementalTraceWriter(runId, {}, traceDir);\n\n // Create agent with event broadcasting and session persistence\n const agent = new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner({\n sessionId: finalSessionId,\n workingDir,\n maxIterations: 50,\n temperature: 0.1,\n tier: body.tier ?? 'medium',\n tokenBudget: agentsConfig?.tokenBudget,\n onEvent: (event) => {\n // Broadcast to all WebSocket listeners (assigns seq)\n const seqEvent = RunManager.broadcast(runId, event);\n\n // Persist event with seq + runId + sessionId in metadata to session storage\n void sessionManager.addEvent(finalSessionId, {\n ...seqEvent,\n sessionId: finalSessionId,\n runId,\n metadata: {\n ...seqEvent.metadata,\n sessionId: finalSessionId,\n runId,\n workingDir,\n },\n });\n },\n });\n\n // Register run (pass sessionManager and sessionId so session-level WS listeners receive events)\n const run = await RunManager.register(runId, body.task, agent, sessionManager, finalSessionId);\n await RunManager.updateStatus(runId, 'running');\n\n // Start execution in background (don't await)\n void (async () => {\n try {\n const result = await agent.execute(body.task);\n const durationMs = Date.now() - startTime;\n const detailedTrace = traceWriter.getEntries() as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(finalSessionId, runId, detailedTrace);\n }\n\n // Attach file change summaries to the turn so the UI can show rollback/approve panel\n // Populated by ChangeTrackingMiddleware via run.meta → TaskResult.fileChanges\n if (result.fileChanges && result.fileChanges.length > 0) {\n await sessionManager.attachFileChangesToTurn(finalSessionId, runId, result.fileChanges);\n }\n\n await RunManager.updateStatus(runId, result.success ? 'completed' : 'failed', {\n completedAt: new Date().toISOString(),\n durationMs,\n summary: result.summary,\n error: result.error,\n });\n\n // Track completion\n await analytics?.track(\n result.success ? AGENT_ANALYTICS_EVENTS.RUN_COMPLETED : AGENT_ANALYTICS_EVENTS.RUN_FAILED,\n {\n runId,\n durationMs,\n success: result.success,\n summary: result.summary?.slice(0, 200),\n }\n );\n\n ctx.platform.logger.info(`[run-handler] Run ${runId} completed: ${result.success}`);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n const durationMs = Date.now() - startTime;\n const detailedTrace = traceWriter.getEntries() as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(finalSessionId, runId, detailedTrace);\n }\n\n await RunManager.updateStatus(runId, 'failed', {\n completedAt: new Date().toISOString(),\n durationMs,\n error: errorMsg,\n });\n\n // Track failure\n await analytics?.track(AGENT_ANALYTICS_EVENTS.RUN_FAILED, {\n runId,\n durationMs,\n error: errorMsg.slice(0, 200),\n });\n\n ctx.platform.logger.error(`[run-handler] Run ${runId} failed: ${errorMsg}`);\n }\n })();\n\n // Return relative WS path — clients construct the full URL from their own base URL.\n const wsPath = AGENTS_WS_CHANNELS.SESSION_STREAM.replace(':sessionId', finalSessionId);\n const eventsPath = `${AGENTS_WS_BASE_PATH}${wsPath}`;\n\n return {\n runId,\n sessionId: finalSessionId,\n eventsPath,\n status: 'started',\n startedAt: run.startedAt,\n };\n },\n});\n","/**\n * POST /sessions/:sessionId/plan/execute\n * Execute approved session plan via standard run-handler pipeline.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { PlanDocumentService, SessionManager } from '@kb-labs/agent-core';\nimport type {\n ExecuteSessionPlanRequest,\n ExecuteSessionPlanResponse,\n RunRequest,\n RunResponse,\n TaskPlan,\n TaskSpec,\n} from '@kb-labs/agent-contracts';\nimport { promises as fs } from 'node:fs';\nimport runHandler from './run-handler.js';\n\ninterface ExecutePlanRouteParams {\n sessionId?: string;\n}\n\nasync function loadPlan(planPath: string): Promise<TaskPlan> {\n const content = await fs.readFile(planPath, 'utf-8');\n return JSON.parse(content) as TaskPlan;\n}\n\nfunction buildExecutionTask(plan: TaskPlan): string {\n const phaseLines = plan.phases.map((phase, idx) => {\n const steps = phase.steps\n .map((step, stepIdx) => {\n const tool = step.tool || 'n/a';\n return ` ${stepIdx + 1}. ${step.action} [tool: ${tool}]`;\n })\n .join('\\n');\n return `${idx + 1}. ${phase.name}\\n${steps || ' (no steps)'}`;\n }).join('\\n');\n\n return [\n `Execute the approved implementation plan for task: ${plan.task}`,\n '',\n 'Follow phase order and dependencies. Update progress with concrete results.',\n '',\n `Plan ID: ${plan.id}`,\n `Complexity: ${plan.complexity}`,\n `Estimated Duration: ${plan.estimatedDuration || 'Unknown'}`,\n '',\n 'Phases:',\n phaseLines,\n '',\n 'Requirements:',\n '- Execute plan steps pragmatically; adapt only when blocked.',\n '- Keep outputs concrete: changed files, commands run, verification results.',\n ].join('\\n');\n}\n\nfunction buildExecutionTaskWithSpec(plan: TaskPlan, spec: TaskSpec): string {\n return [\n `Execute the approved implementation plan for task: ${plan.task}`,\n '',\n `Plan ID: ${plan.id}`,\n `Complexity: ${plan.complexity}`,\n '',\n '## DETAILED SPECIFICATION (exact changes)',\n '',\n 'A detailed spec was generated and verified. Apply these exact changes:',\n '',\n spec.markdown || '(no spec markdown available)',\n '',\n 'Requirements:',\n '- Apply the before/after diffs from the spec as precisely as possible.',\n '- Verify each change after applying it.',\n '- If the spec code doesn\\'t match the current file (file was modified since spec), adapt minimally.',\n '- Keep outputs concrete: changed files, commands run, verification results.',\n ].join('\\n');\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<ExecuteSessionPlanRequest, unknown, ExecutePlanRouteParams>\n ): Promise<ExecuteSessionPlanResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n const body = (input.body ?? {}) as ExecuteSessionPlanRequest;\n\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n\n const baseManager = new SessionManager(ctx.cwd);\n const session = await baseManager.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const workingDir = session.workingDir || ctx.cwd;\n const sessionManager = new SessionManager(workingDir);\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n\n let plan: TaskPlan;\n try {\n plan = await loadPlan(planPath);\n } catch {\n throw new Error(`Plan not found for session ${sessionId}`);\n }\n\n if (plan.status !== 'approved' && plan.status !== 'spec_ready') {\n throw new Error(`Plan must be approved before execution (current status: ${plan.status})`);\n }\n\n // Load spec if available — provides exact diffs for the execution agent\n let spec: TaskSpec | null = null;\n try {\n const specPath = sessionManager.getSessionSpecPath(sessionId);\n const specContent = await fs.readFile(specPath, 'utf-8');\n spec = JSON.parse(specContent) as TaskSpec;\n } catch {\n // No spec — execute from plan only\n }\n\n const executionTask = spec?.markdown\n ? buildExecutionTaskWithSpec(plan, spec)\n : buildExecutionTask(plan);\n const runInput: RestInput<unknown, RunRequest> = {\n body: {\n task: executionTask,\n sessionId,\n workingDir,\n tier: body.tier,\n responseMode: body.responseMode,\n verbose: body.verbose,\n enableEscalation: body.enableEscalation,\n },\n };\n\n const runResponse = await (runHandler as unknown as {\n execute: (ctx: PluginContextV3, input: RestInput<unknown, RunRequest>) => Promise<RunResponse>;\n }).execute(ctx, runInput);\n\n const inProgressPlan: TaskPlan = {\n ...plan,\n status: 'in_progress',\n updatedAt: new Date().toISOString(),\n };\n await fs.writeFile(planPath, JSON.stringify(inProgressPlan, null, 2), 'utf-8');\n\n const documentService = new PlanDocumentService(workingDir);\n const markdownPath = documentService.getPlanPath(plan);\n await documentService.appendExecutionLog(\n markdownPath,\n `- ${new Date().toISOString()}: Execution started (runId: ${runResponse.runId}).`\n );\n\n return {\n sessionId,\n planId: plan.id,\n runId: runResponse.runId,\n eventsPath: runResponse.eventsPath,\n status: runResponse.status,\n startedAt: runResponse.startedAt,\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/run-manager.ts","../../../src/rest/handlers/run-handler.ts","../../../src/rest/handlers/execute-session-plan-handler.ts"],"names":["run","useCache","fs","defineHandler","SessionManager"],"mappings":"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","file":"execute-session-plan-handler.js","sourcesContent":["/**\n * Run Manager - tracks active agent runs for REST/WS API\n *\n * Uses platform cache for persistence and in-memory Map for active agents.\n * Cache stores serializable run state, Map stores live agent references.\n * Uses platform eventBus for cross-process event broadcasting.\n */\n\nimport type { IAgentRunner } from '@kb-labs/agent-sdk';\nimport type { SessionManager } from '@kb-labs/agent-core';\nimport type { AgentEvent, AgentEventCallback } from '@kb-labs/agent-contracts';\nimport { useCache, usePlatform } from '@kb-labs/sdk';\n\nconst CACHE_PREFIX = 'agent:run:';\nconst EVENT_TOPIC_PREFIX = 'agent:events:';\nconst CACHE_TTL = 3600000; // 1 hour\n\n/**\n * Run status\n */\nexport type RunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Serializable run state (stored in cache)\n */\nexport interface RunState {\n runId: string;\n task: string;\n status: RunStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n summary?: string;\n error?: string;\n}\n\n/**\n * Active run with live agent (in-memory only)\n */\nexport interface ActiveRun extends RunState {\n agent?: IAgentRunner;\n sessionManager: SessionManager;\n listeners: Set<AgentEventCallback>;\n /** Monotonic sequence counter for event ordering */\n lastSeq: number;\n /** Replay buffer: all events emitted since run start (for late WS connections) */\n eventBuffer: AgentEvent[];\n}\n\n/**\n * Run Manager implementation\n */\nclass RunManagerImpl {\n /** Live agents and listeners (not cacheable) */\n private activeRuns: Map<string, ActiveRun> = new Map();\n\n /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */\n private sessionListeners: Map<string, Set<AgentEventCallback>> = new Map();\n\n /** sessionId per runId — set when run is registered */\n private runSessionMap: Map<string, string> = new Map();\n\n /**\n * Generate unique run ID\n */\n generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n\n /**\n * Register a new run\n */\n async register(\n runId: string,\n task: string,\n agent: IAgentRunner | undefined,\n sessionManager: SessionManager,\n sessionId?: string\n ): Promise<ActiveRun> {\n const now = new Date().toISOString();\n\n const run: ActiveRun = {\n runId,\n task,\n status: 'pending',\n agent,\n sessionManager,\n startedAt: now,\n listeners: new Set(),\n lastSeq: 0,\n eventBuffer: [],\n };\n\n // Store in memory (for live agent)\n this.activeRuns.set(runId, run);\n\n // Track sessionId → runId mapping for session-level listeners\n if (sessionId) {\n this.runSessionMap.set(runId, sessionId);\n }\n\n // Store serializable state in cache\n await this.saveToCache(run);\n\n return run;\n }\n\n /**\n * Get run by ID (from memory first, then cache for state)\n */\n get(runId: string): ActiveRun | undefined {\n return this.activeRuns.get(runId);\n }\n\n /**\n * Check if run exists (in memory or cache)\n */\n async exists(runId: string): Promise<boolean> {\n // Check memory first\n if (this.activeRuns.has(runId)) {\n return true;\n }\n // Fallback to cache\n const state = await this.getState(runId);\n return state !== null;\n }\n\n /**\n * Get run state from cache (for completed runs or cross-process access)\n */\n async getState(runId: string): Promise<RunState | null> {\n const cache = useCache();\n if (!cache) {return null;}\n\n return cache.get<RunState>(`${CACHE_PREFIX}${runId}`);\n }\n\n /**\n * Update run status\n */\n async updateStatus(runId: string, status: RunStatus, extra?: Partial<RunState>): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (run) {\n run.status = status;\n if (extra) {\n Object.assign(run, extra);\n }\n await this.saveToCache(run);\n }\n }\n\n /**\n * Save run state to cache\n */\n private async saveToCache(run: ActiveRun): Promise<void> {\n const cache = useCache();\n if (!cache) {return;}\n\n const state: RunState = {\n runId: run.runId,\n task: run.task,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n durationMs: run.durationMs,\n summary: run.summary,\n error: run.error,\n };\n\n await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);\n }\n\n /** Track subscriptions for cleanup */\n private subscriptions: Map<string, Map<AgentEventCallback, () => void>> = new Map();\n\n /**\n * Add event listener to run (uses eventBus for cross-process)\n */\n addListener(runId: string, callback: AgentEventCallback): boolean {\n const platform = usePlatform();\n if (!platform?.eventBus) {\n // Fallback to in-memory only\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n return true;\n }\n return false;\n }\n\n // Subscribe to eventBus topic for this run\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n const unsubscribe = platform.eventBus.subscribe<AgentEvent>(topic, async (event) => {\n try {\n callback(event);\n } catch {\n // Ignore callback errors\n }\n });\n\n // Track subscription for cleanup\n if (!this.subscriptions.has(runId)) {\n this.subscriptions.set(runId, new Map());\n }\n this.subscriptions.get(runId)!.set(callback, unsubscribe);\n\n // Also add to in-memory if run exists locally\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n }\n\n return true;\n }\n\n /**\n * Remove event listener from run\n */\n removeListener(runId: string, callback: AgentEventCallback): void {\n // Unsubscribe from eventBus\n const runSubs = this.subscriptions.get(runId);\n if (runSubs) {\n const unsubscribe = runSubs.get(callback);\n if (unsubscribe) {\n unsubscribe();\n runSubs.delete(callback);\n }\n if (runSubs.size === 0) {\n this.subscriptions.delete(runId);\n }\n }\n\n // Also remove from in-memory\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.delete(callback);\n }\n }\n\n /**\n * Broadcast event to all listeners of a run (uses eventBus for cross-process)\n * Assigns monotonic sequence number for reliable ordering\n * @returns The event with seq assigned (for persistence)\n */\n broadcast(runId: string, event: AgentEvent): AgentEvent {\n const platform = usePlatform();\n const run = this.activeRuns.get(runId);\n\n // Assign sequence number for ordering\n let seqEvent = event;\n if (run) {\n run.lastSeq++;\n seqEvent = { ...event, seq: run.lastSeq, runId };\n\n // Store in replay buffer (for late WS connections)\n run.eventBuffer.push(seqEvent);\n }\n\n // Publish to eventBus for cross-process delivery\n if (platform?.eventBus) {\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n platform.eventBus.publish(topic, seqEvent).catch(() => {\n // Ignore publish errors\n });\n }\n\n // Also notify local in-memory listeners (for same-process)\n if (run) {\n for (const listener of run.listeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n // Notify session-level listeners (persistent connections)\n const sessionId = this.runSessionMap.get(runId);\n if (sessionId) {\n const sListeners = this.sessionListeners.get(sessionId);\n if (sListeners) {\n for (const listener of sListeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n return seqEvent;\n }\n\n /**\n * Add a session-level listener — receives events from ALL runs in this session.\n */\n addSessionListener(sessionId: string, callback: AgentEventCallback): void {\n if (!this.sessionListeners.has(sessionId)) {\n this.sessionListeners.set(sessionId, new Set());\n }\n this.sessionListeners.get(sessionId)!.add(callback);\n }\n\n /**\n * Remove a session-level listener.\n */\n removeSessionListener(sessionId: string, callback: AgentEventCallback): void {\n const listeners = this.sessionListeners.get(sessionId);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.sessionListeners.delete(sessionId);\n }\n }\n }\n\n /**\n * Get replay buffer for a run (all events emitted since start).\n * Used by WS handler to send missed events on late connection.\n * Optionally filter by afterSeq to only get events the client hasn't seen.\n */\n getEventBuffer(runId: string, afterSeq?: number): AgentEvent[] {\n const run = this.activeRuns.get(runId);\n if (!run) {return [];}\n\n if (afterSeq != null) {\n return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);\n }\n return [...run.eventBuffer];\n }\n\n /**\n * List all active runs\n */\n listActive(): Array<{ runId: string; task: string; status: RunStatus; startedAt: string }> {\n return Array.from(this.activeRuns.values()).map(r => ({\n runId: r.runId,\n task: r.task,\n status: r.status,\n startedAt: r.startedAt,\n }));\n }\n\n /**\n * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).\n * Agent finishes its current tool call then exits at the next iteration boundary.\n */\n requestStop(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n if (!run || run.status !== 'running' || !run.agent) {\n return false;\n }\n run.agent.requestStop();\n return true;\n }\n\n /**\n * Clean up completed runs from memory (cache handles its own TTL)\n */\n cleanup(): void {\n for (const [runId, run] of this.activeRuns) {\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'stopped') {\n // Remove from memory but keep in cache\n this.activeRuns.delete(runId);\n }\n }\n }\n}\n\n/**\n * Singleton instance — stored on globalThis so all bundled modules share one instance.\n * When tsup compiles multiple entry points, each gets its own module scope,\n * so a plain `export const RunManager = new RunManagerImpl()` creates separate instances.\n * Using globalThis ensures run-handler.js and session-stream-handler.js share one RunManager.\n */\nconst GLOBAL_KEY = '__kb_agent_run_manager__';\nif (!(globalThis as Record<string, unknown>)[GLOBAL_KEY]) {\n (globalThis as Record<string, unknown>)[GLOBAL_KEY] = new RunManagerImpl();\n}\nexport const RunManager = (globalThis as Record<string, unknown>)[GLOBAL_KEY] as RunManagerImpl;\n","/**\n * POST /run handler\n *\n * Starts a new agent run via Orchestrator\n */\n\nimport { defineHandler, useAnalytics, useCache, useConfig, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager, createCoreToolPack, bootstrapAgentSDK, createSessionMemoryBridge } from '@kb-labs/agent-core';\nimport { createDefaultResponseRequirementsSelector } from '@kb-labs/agent-runtime';\nimport { IncrementalTraceWriter } from '@kb-labs/agent-tracing';\n\n// Register SDKAgentRunner as the RunnerFactory (idempotent — runs once per process)\nbootstrapAgentSDK();\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { createToolRegistry } from '@kb-labs/agent-tools';\nimport type { RunRequest, RunResponse, AgentsPluginConfig, KernelState } from '@kb-labs/agent-contracts';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport {\n AGENTS_WS_BASE_PATH,\n AGENTS_WS_CHANNELS,\n AGENT_ANALYTICS_EVENTS,\n} from '@kb-labs/agent-contracts';\nimport { RunManager } from '../run-manager.js';\n\nconst FOLLOW_UP_SCOPE_RE = /\\b(глубже|подробнее|детал|слишком поверхност|deeper|more depth|details?)\\b/i;\n\nfunction isLikelyFollowUpScopeTask(task: string): boolean {\n return FOLLOW_UP_SCOPE_RE.test(task);\n}\n\nfunction pathExists(dir: string): boolean {\n try {\n return fs.existsSync(dir);\n } catch {\n return false;\n }\n}\n\nfunction scoreRepoFromToolPath(rawPath: string, scores: Map<string, number>): void {\n const p = rawPath.replace(/\\\\/g, '/');\n\n // Explicit repo prefix: kb-labs-xxx/...\n const explicit = p.match(/(^|\\/)(kb-labs-[^/]+)\\//);\n if (explicit?.[2]) {\n scores.set(explicit[2], (scores.get(explicit[2]) ?? 0) + 5);\n }\n\n // Heuristic by package naming patterns\n if (p.startsWith('packages/')) {\n if (/packages\\/agent[-/]/.test(p) || /agent-core|agent-tools|agent-cli|agent-task-runner/.test(p)) {\n scores.set('kb-labs-agents', (scores.get('kb-labs-agents') ?? 0) + 4);\n }\n if (/packages\\/mind[-/]/.test(p) || /mind-engine|mind-core/.test(p)) {\n scores.set('kb-labs-mind', (scores.get('kb-labs-mind') ?? 0) + 4);\n }\n }\n}\n\nasync function inferFollowUpWorkingDir(\n sessionManager: SessionManager,\n sessionId: string,\n baseWorkingDir: string,\n): Promise<string | null> {\n const events = await sessionManager.getSessionEvents(sessionId);\n if (!events.length) {\n return null;\n }\n\n // Find the latest completed run in this session\n const completedRuns = new Set<string>();\n for (const event of events) {\n if (event.type === 'agent:end' && event.runId) {\n completedRuns.add(event.runId);\n }\n }\n const lastRunId = Array.from(completedRuns).at(-1);\n if (!lastRunId) {\n return null;\n }\n\n const repoScores = new Map<string, number>();\n for (const event of events) {\n if (event.runId !== lastRunId) {\n continue;\n }\n\n if (event.type === 'tool:start') {\n const input = (event.data?.input as Record<string, unknown> | undefined) ?? {};\n const p1 = input.path;\n const p2 = input.directory;\n if (typeof p1 === 'string') {scoreRepoFromToolPath(p1, repoScores);}\n if (typeof p2 === 'string') {scoreRepoFromToolPath(p2, repoScores);}\n }\n\n if (event.type === 'tool:end') {\n const metadata = (event.data?.metadata as Record<string, unknown> | undefined) ?? {};\n const p = metadata.path;\n if (typeof p === 'string') {scoreRepoFromToolPath(p, repoScores);}\n }\n }\n\n const ranked = Array.from(repoScores.entries()).sort((a, b) => b[1] - a[1]);\n const top = ranked[0];\n if (!top || top[1] < 4) {\n return null;\n }\n\n const inferredDir = path.join(baseWorkingDir, top[0]);\n return pathExists(inferredDir) ? inferredDir : null;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<RunRequest>\n ): Promise<RunResponse> {\n const body = input.body as RunRequest | undefined;\n\n if (!body?.task) {\n throw new Error('Task is required');\n }\n\n const analytics = useAnalytics();\n const runId = RunManager.generateRunId();\n const startTime = Date.now();\n\n // Get or create session\n let sessionId = body.sessionId;\n let workingDir = body.workingDir || ctx.cwd;\n let sessionManager = new SessionManager(workingDir);\n if (!sessionId) {\n // Create new session\n const session = await sessionManager.createSession({\n mode: 'execute',\n task: body.task,\n agentId: body.agentId ?? 'orchestrator',\n });\n sessionId = session.id;\n ctx.platform.logger.info(`[run-handler] Created new session ${sessionId}`);\n } else {\n // Verify session exists (from current manager first)\n const existingSession = await sessionManager.loadSession(sessionId);\n let resolvedSession = existingSession;\n\n // Fallback: session may belong to a different root than current ctx.cwd\n if (!resolvedSession && pathExists(ctx.cwd)) {\n const fallbackManager = new SessionManager(ctx.cwd);\n const fallbackSession = await fallbackManager.loadSession(sessionId);\n if (fallbackSession) {\n sessionManager = fallbackManager;\n resolvedSession = fallbackSession;\n }\n }\n\n if (!resolvedSession) {\n throw new Error(`Session not found: ${sessionId} (cwd=${ctx.cwd})`);\n }\n\n // Session workingDir is primary source of truth for follow-up runs\n workingDir = body.workingDir || resolvedSession.workingDir || workingDir;\n\n // Smart follow-up anchoring: keep depth requests in the same repo/module as previous run\n if (!body.workingDir && isLikelyFollowUpScopeTask(body.task)) {\n const inferred = await inferFollowUpWorkingDir(sessionManager, sessionId, resolvedSession.workingDir || ctx.cwd);\n if (inferred && inferred !== workingDir) {\n ctx.platform.logger.info(`[run-handler] Follow-up scope inferred: ${workingDir} -> ${inferred}`);\n workingDir = inferred;\n }\n }\n\n // Rebind session manager to effective working directory\n sessionManager = new SessionManager(workingDir);\n ctx.platform.logger.info(`[run-handler] Continuing session ${sessionId} (workingDir=${workingDir})`);\n }\n\n ctx.platform.logger.info(`[run-handler] Starting run ${runId} for task: ${body.task}`);\n\n // Create user turn with task/question\n await sessionManager.createUserTurn(sessionId, body.task, runId);\n\n // Track run started\n await analytics?.track(AGENT_ANALYTICS_EVENTS.RUN_STARTED, {\n runId,\n sessionId,\n taskLength: body.task.length,\n tier: body.tier ?? 'medium',\n enableEscalation: body.enableEscalation ?? true,\n responseMode: body.responseMode ?? 'auto',\n verbose: body.verbose ?? false,\n });\n\n // Create tool registry with standard tools\n const sessionMemory = createSessionMemoryBridge(workingDir, sessionId);\n const responseRequirementsSelector = createDefaultResponseRequirementsSelector();\n const toolRegistry = createToolRegistry({\n workingDir,\n currentTask: body.task,\n sessionId,\n verbose: body.verbose,\n cache: useCache(),\n sessionMemory,\n responseRequirementsResolver: async ({ task, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: task ?? body.task,\n }),\n });\n const agentsConfig = await useConfig<AgentsPluginConfig>();\n\n const finalSessionId = sessionId; // Capture for closure\n const traceDir = path.join(workingDir, '.kb', 'traces', 'incremental');\n const traceWriter = new IncrementalTraceWriter(runId, {}, traceDir);\n\n // Create agent with event broadcasting and session persistence\n const agent = new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner({\n sessionId: finalSessionId,\n workingDir,\n maxIterations: 50,\n temperature: 0.1,\n tier: body.tier ?? 'medium',\n tokenBudget: agentsConfig?.tokenBudget,\n onEvent: (event) => {\n // Broadcast to all WebSocket listeners (assigns seq)\n const seqEvent = RunManager.broadcast(runId, event);\n\n // Persist event with seq + runId + sessionId in metadata to session storage\n void sessionManager.addEvent(finalSessionId, {\n ...seqEvent,\n sessionId: finalSessionId,\n runId,\n metadata: {\n ...seqEvent.metadata,\n sessionId: finalSessionId,\n runId,\n workingDir,\n },\n });\n },\n });\n\n // Register run (pass sessionManager and sessionId so session-level WS listeners receive events)\n const run = await RunManager.register(runId, body.task, agent, sessionManager, finalSessionId);\n await RunManager.updateStatus(runId, 'running');\n\n // Start execution in background (don't await)\n void (async () => {\n try {\n const result = await agent.execute(body.task);\n const durationMs = Date.now() - startTime;\n const detailedTrace = traceWriter.getEntries() as unknown as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(finalSessionId, runId, detailedTrace);\n }\n\n // Attach file change summaries to the turn so the UI can show rollback/approve panel\n // Populated by ChangeTrackingMiddleware via run.meta → TaskResult.fileChanges\n if (result.fileChanges && result.fileChanges.length > 0) {\n await sessionManager.attachFileChangesToTurn(finalSessionId, runId, result.fileChanges);\n }\n\n await RunManager.updateStatus(runId, result.success ? 'completed' : 'failed', {\n completedAt: new Date().toISOString(),\n durationMs,\n summary: result.summary,\n error: result.error,\n });\n\n // Track completion\n await analytics?.track(\n result.success ? AGENT_ANALYTICS_EVENTS.RUN_COMPLETED : AGENT_ANALYTICS_EVENTS.RUN_FAILED,\n {\n runId,\n durationMs,\n success: result.success,\n summary: result.summary?.slice(0, 200),\n }\n );\n\n ctx.platform.logger.info(`[run-handler] Run ${runId} completed: ${result.success}`);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n const durationMs = Date.now() - startTime;\n const detailedTrace = traceWriter.getEntries() as unknown as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(finalSessionId, runId, detailedTrace);\n }\n\n await RunManager.updateStatus(runId, 'failed', {\n completedAt: new Date().toISOString(),\n durationMs,\n error: errorMsg,\n });\n\n // Track failure\n await analytics?.track(AGENT_ANALYTICS_EVENTS.RUN_FAILED, {\n runId,\n durationMs,\n error: errorMsg.slice(0, 200),\n });\n\n ctx.platform.logger.error(`[run-handler] Run ${runId} failed: ${errorMsg}`);\n }\n })();\n\n // Return relative WS path — clients construct the full URL from their own base URL.\n const wsPath = AGENTS_WS_CHANNELS.SESSION_STREAM.replace(':sessionId', finalSessionId);\n const eventsPath = `${AGENTS_WS_BASE_PATH}${wsPath}`;\n\n return {\n runId,\n sessionId: finalSessionId,\n eventsPath,\n status: 'started',\n startedAt: run.startedAt,\n };\n },\n});\n","/**\n * POST /sessions/:sessionId/plan/execute\n * Execute approved session plan via standard run-handler pipeline.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { PlanDocumentService, SessionManager } from '@kb-labs/agent-core';\nimport type {\n ExecuteSessionPlanRequest,\n ExecuteSessionPlanResponse,\n RunRequest,\n RunResponse,\n TaskPlan,\n TaskSpec,\n} from '@kb-labs/agent-contracts';\nimport { promises as fs } from 'node:fs';\nimport runHandler from './run-handler.js';\n\ninterface ExecutePlanRouteParams {\n sessionId?: string;\n}\n\nasync function loadPlan(planPath: string): Promise<TaskPlan> {\n const content = await fs.readFile(planPath, 'utf-8');\n return JSON.parse(content) as TaskPlan;\n}\n\nfunction buildExecutionTask(plan: TaskPlan): string {\n const phaseLines = plan.phases.map((phase, idx) => {\n const steps = phase.steps\n .map((step, stepIdx) => {\n const tool = step.tool || 'n/a';\n return ` ${stepIdx + 1}. ${step.action} [tool: ${tool}]`;\n })\n .join('\\n');\n return `${idx + 1}. ${phase.name}\\n${steps || ' (no steps)'}`;\n }).join('\\n');\n\n return [\n `Execute the approved implementation plan for task: ${plan.task}`,\n '',\n 'Follow phase order and dependencies. Update progress with concrete results.',\n '',\n `Plan ID: ${plan.id}`,\n `Complexity: ${plan.complexity}`,\n `Estimated Duration: ${plan.estimatedDuration || 'Unknown'}`,\n '',\n 'Phases:',\n phaseLines,\n '',\n 'Requirements:',\n '- Execute plan steps pragmatically; adapt only when blocked.',\n '- Keep outputs concrete: changed files, commands run, verification results.',\n ].join('\\n');\n}\n\nfunction buildExecutionTaskWithSpec(plan: TaskPlan, spec: TaskSpec): string {\n return [\n `Execute the approved implementation plan for task: ${plan.task}`,\n '',\n `Plan ID: ${plan.id}`,\n `Complexity: ${plan.complexity}`,\n '',\n '## DETAILED SPECIFICATION (exact changes)',\n '',\n 'A detailed spec was generated and verified. Apply these exact changes:',\n '',\n spec.markdown || '(no spec markdown available)',\n '',\n 'Requirements:',\n '- Apply the before/after diffs from the spec as precisely as possible.',\n '- Verify each change after applying it.',\n '- If the spec code doesn\\'t match the current file (file was modified since spec), adapt minimally.',\n '- Keep outputs concrete: changed files, commands run, verification results.',\n ].join('\\n');\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<ExecuteSessionPlanRequest, unknown, ExecutePlanRouteParams>\n ): Promise<ExecuteSessionPlanResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n const body = (input.body ?? {}) as ExecuteSessionPlanRequest;\n\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n\n const baseManager = new SessionManager(ctx.cwd);\n const session = await baseManager.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const workingDir = session.workingDir || ctx.cwd;\n const sessionManager = new SessionManager(workingDir);\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n\n let plan: TaskPlan;\n try {\n plan = await loadPlan(planPath);\n } catch {\n throw new Error(`Plan not found for session ${sessionId}`);\n }\n\n if (plan.status !== 'approved' && plan.status !== 'spec_ready') {\n throw new Error(`Plan must be approved before execution (current status: ${plan.status})`);\n }\n\n // Load spec if available — provides exact diffs for the execution agent\n let spec: TaskSpec | null = null;\n try {\n const specPath = sessionManager.getSessionSpecPath(sessionId);\n const specContent = await fs.readFile(specPath, 'utf-8');\n spec = JSON.parse(specContent) as TaskSpec;\n } catch {\n // No spec — execute from plan only\n }\n\n const executionTask = spec?.markdown\n ? buildExecutionTaskWithSpec(plan, spec)\n : buildExecutionTask(plan);\n const runInput: RestInput<unknown, RunRequest> = {\n body: {\n task: executionTask,\n sessionId,\n workingDir,\n tier: body.tier,\n responseMode: body.responseMode,\n verbose: body.verbose,\n enableEscalation: body.enableEscalation,\n },\n };\n\n const runResponse = await (runHandler as unknown as {\n execute: (ctx: PluginContextV3, input: RestInput<unknown, RunRequest>) => Promise<RunResponse>;\n }).execute(ctx, runInput);\n\n const inProgressPlan: TaskPlan = {\n ...plan,\n status: 'in_progress',\n updatedAt: new Date().toISOString(),\n };\n await fs.writeFile(planPath, JSON.stringify(inProgressPlan, null, 2), 'utf-8');\n\n const documentService = new PlanDocumentService(workingDir);\n const markdownPath = documentService.getPlanPath(plan);\n await documentService.appendExecutionLog(\n markdownPath,\n `- ${new Date().toISOString()}: Execution started (runId: ${runResponse.runId}).`\n );\n\n return {\n sessionId,\n planId: plan.id,\n runId: runResponse.runId,\n eventsPath: runResponse.eventsPath,\n status: runResponse.status,\n startedAt: runResponse.startedAt,\n };\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rest/run-manager.ts","../../../src/rest/handlers/generate-spec-handler.ts"],"names":["run","fs"],"mappings":"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","file":"generate-spec-handler.js","sourcesContent":["/**\n * Run Manager - tracks active agent runs for REST/WS API\n *\n * Uses platform cache for persistence and in-memory Map for active agents.\n * Cache stores serializable run state, Map stores live agent references.\n * Uses platform eventBus for cross-process event broadcasting.\n */\n\nimport type { IAgentRunner } from '@kb-labs/agent-sdk';\nimport type { SessionManager } from '@kb-labs/agent-core';\nimport type { AgentEvent, AgentEventCallback } from '@kb-labs/agent-contracts';\nimport { useCache, usePlatform } from '@kb-labs/sdk';\n\nconst CACHE_PREFIX = 'agent:run:';\nconst EVENT_TOPIC_PREFIX = 'agent:events:';\nconst CACHE_TTL = 3600000; // 1 hour\n\n/**\n * Run status\n */\nexport type RunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Serializable run state (stored in cache)\n */\nexport interface RunState {\n runId: string;\n task: string;\n status: RunStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n summary?: string;\n error?: string;\n}\n\n/**\n * Active run with live agent (in-memory only)\n */\nexport interface ActiveRun extends RunState {\n agent?: IAgentRunner;\n sessionManager: SessionManager;\n listeners: Set<AgentEventCallback>;\n /** Monotonic sequence counter for event ordering */\n lastSeq: number;\n /** Replay buffer: all events emitted since run start (for late WS connections) */\n eventBuffer: AgentEvent[];\n}\n\n/**\n * Run Manager implementation\n */\nclass RunManagerImpl {\n /** Live agents and listeners (not cacheable) */\n private activeRuns: Map<string, ActiveRun> = new Map();\n\n /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */\n private sessionListeners: Map<string, Set<AgentEventCallback>> = new Map();\n\n /** sessionId per runId — set when run is registered */\n private runSessionMap: Map<string, string> = new Map();\n\n /**\n * Generate unique run ID\n */\n generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n\n /**\n * Register a new run\n */\n async register(\n runId: string,\n task: string,\n agent: IAgentRunner | undefined,\n sessionManager: SessionManager,\n sessionId?: string\n ): Promise<ActiveRun> {\n const now = new Date().toISOString();\n\n const run: ActiveRun = {\n runId,\n task,\n status: 'pending',\n agent,\n sessionManager,\n startedAt: now,\n listeners: new Set(),\n lastSeq: 0,\n eventBuffer: [],\n };\n\n // Store in memory (for live agent)\n this.activeRuns.set(runId, run);\n\n // Track sessionId → runId mapping for session-level listeners\n if (sessionId) {\n this.runSessionMap.set(runId, sessionId);\n }\n\n // Store serializable state in cache\n await this.saveToCache(run);\n\n return run;\n }\n\n /**\n * Get run by ID (from memory first, then cache for state)\n */\n get(runId: string): ActiveRun | undefined {\n return this.activeRuns.get(runId);\n }\n\n /**\n * Check if run exists (in memory or cache)\n */\n async exists(runId: string): Promise<boolean> {\n // Check memory first\n if (this.activeRuns.has(runId)) {\n return true;\n }\n // Fallback to cache\n const state = await this.getState(runId);\n return state !== null;\n }\n\n /**\n * Get run state from cache (for completed runs or cross-process access)\n */\n async getState(runId: string): Promise<RunState | null> {\n const cache = useCache();\n if (!cache) {return null;}\n\n return cache.get<RunState>(`${CACHE_PREFIX}${runId}`);\n }\n\n /**\n * Update run status\n */\n async updateStatus(runId: string, status: RunStatus, extra?: Partial<RunState>): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (run) {\n run.status = status;\n if (extra) {\n Object.assign(run, extra);\n }\n await this.saveToCache(run);\n }\n }\n\n /**\n * Save run state to cache\n */\n private async saveToCache(run: ActiveRun): Promise<void> {\n const cache = useCache();\n if (!cache) {return;}\n\n const state: RunState = {\n runId: run.runId,\n task: run.task,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n durationMs: run.durationMs,\n summary: run.summary,\n error: run.error,\n };\n\n await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);\n }\n\n /** Track subscriptions for cleanup */\n private subscriptions: Map<string, Map<AgentEventCallback, () => void>> = new Map();\n\n /**\n * Add event listener to run (uses eventBus for cross-process)\n */\n addListener(runId: string, callback: AgentEventCallback): boolean {\n const platform = usePlatform();\n if (!platform?.eventBus) {\n // Fallback to in-memory only\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n return true;\n }\n return false;\n }\n\n // Subscribe to eventBus topic for this run\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n const unsubscribe = platform.eventBus.subscribe<AgentEvent>(topic, async (event) => {\n try {\n callback(event);\n } catch {\n // Ignore callback errors\n }\n });\n\n // Track subscription for cleanup\n if (!this.subscriptions.has(runId)) {\n this.subscriptions.set(runId, new Map());\n }\n this.subscriptions.get(runId)!.set(callback, unsubscribe);\n\n // Also add to in-memory if run exists locally\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n }\n\n return true;\n }\n\n /**\n * Remove event listener from run\n */\n removeListener(runId: string, callback: AgentEventCallback): void {\n // Unsubscribe from eventBus\n const runSubs = this.subscriptions.get(runId);\n if (runSubs) {\n const unsubscribe = runSubs.get(callback);\n if (unsubscribe) {\n unsubscribe();\n runSubs.delete(callback);\n }\n if (runSubs.size === 0) {\n this.subscriptions.delete(runId);\n }\n }\n\n // Also remove from in-memory\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.delete(callback);\n }\n }\n\n /**\n * Broadcast event to all listeners of a run (uses eventBus for cross-process)\n * Assigns monotonic sequence number for reliable ordering\n * @returns The event with seq assigned (for persistence)\n */\n broadcast(runId: string, event: AgentEvent): AgentEvent {\n const platform = usePlatform();\n const run = this.activeRuns.get(runId);\n\n // Assign sequence number for ordering\n let seqEvent = event;\n if (run) {\n run.lastSeq++;\n seqEvent = { ...event, seq: run.lastSeq, runId };\n\n // Store in replay buffer (for late WS connections)\n run.eventBuffer.push(seqEvent);\n }\n\n // Publish to eventBus for cross-process delivery\n if (platform?.eventBus) {\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n platform.eventBus.publish(topic, seqEvent).catch(() => {\n // Ignore publish errors\n });\n }\n\n // Also notify local in-memory listeners (for same-process)\n if (run) {\n for (const listener of run.listeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n // Notify session-level listeners (persistent connections)\n const sessionId = this.runSessionMap.get(runId);\n if (sessionId) {\n const sListeners = this.sessionListeners.get(sessionId);\n if (sListeners) {\n for (const listener of sListeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n return seqEvent;\n }\n\n /**\n * Add a session-level listener — receives events from ALL runs in this session.\n */\n addSessionListener(sessionId: string, callback: AgentEventCallback): void {\n if (!this.sessionListeners.has(sessionId)) {\n this.sessionListeners.set(sessionId, new Set());\n }\n this.sessionListeners.get(sessionId)!.add(callback);\n }\n\n /**\n * Remove a session-level listener.\n */\n removeSessionListener(sessionId: string, callback: AgentEventCallback): void {\n const listeners = this.sessionListeners.get(sessionId);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.sessionListeners.delete(sessionId);\n }\n }\n }\n\n /**\n * Get replay buffer for a run (all events emitted since start).\n * Used by WS handler to send missed events on late connection.\n * Optionally filter by afterSeq to only get events the client hasn't seen.\n */\n getEventBuffer(runId: string, afterSeq?: number): AgentEvent[] {\n const run = this.activeRuns.get(runId);\n if (!run) {return [];}\n\n if (afterSeq != null) {\n return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);\n }\n return [...run.eventBuffer];\n }\n\n /**\n * List all active runs\n */\n listActive(): Array<{ runId: string; task: string; status: RunStatus; startedAt: string }> {\n return Array.from(this.activeRuns.values()).map(r => ({\n runId: r.runId,\n task: r.task,\n status: r.status,\n startedAt: r.startedAt,\n }));\n }\n\n /**\n * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).\n * Agent finishes its current tool call then exits at the next iteration boundary.\n */\n requestStop(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n if (!run || run.status !== 'running' || !run.agent) {\n return false;\n }\n run.agent.requestStop();\n return true;\n }\n\n /**\n * Clean up completed runs from memory (cache handles its own TTL)\n */\n cleanup(): void {\n for (const [runId, run] of this.activeRuns) {\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'stopped') {\n // Remove from memory but keep in cache\n this.activeRuns.delete(runId);\n }\n }\n }\n}\n\n/**\n * Singleton instance — stored on globalThis so all bundled modules share one instance.\n * When tsup compiles multiple entry points, each gets its own module scope,\n * so a plain `export const RunManager = new RunManagerImpl()` creates separate instances.\n * Using globalThis ensures run-handler.js and session-stream-handler.js share one RunManager.\n */\nconst GLOBAL_KEY = '__kb_agent_run_manager__';\nif (!(globalThis as Record<string, unknown>)[GLOBAL_KEY]) {\n (globalThis as Record<string, unknown>)[GLOBAL_KEY] = new RunManagerImpl();\n}\nexport const RunManager = (globalThis as Record<string, unknown>)[GLOBAL_KEY] as RunManagerImpl;\n","/**\n * POST /sessions/:sessionId/plan/spec\n * Generate a detailed specification from an approved session plan.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager, SpecModeHandler, createSessionMemoryBridge } from '@kb-labs/agent-core';\nimport { createDefaultResponseRequirementsSelector } from '@kb-labs/agent-runtime';\nimport { IncrementalTraceWriter } from '@kb-labs/agent-tracing';\nimport { createToolRegistry } from '@kb-labs/agent-tools';\nimport type {\n AgentEvent,\n GenerateSpecRequest,\n GenerateSpecResponse,\n KernelState,\n TaskPlan,\n} from '@kb-labs/agent-contracts';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { RunManager } from '../run-manager.js';\n\ninterface SpecRouteParams {\n sessionId?: string;\n}\n\nasync function loadPlan(planPath: string): Promise<TaskPlan> {\n const content = await fs.readFile(planPath, 'utf-8');\n return JSON.parse(content) as TaskPlan;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<GenerateSpecRequest, unknown, SpecRouteParams>\n ): Promise<GenerateSpecResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n const body = (input.body ?? {}) as GenerateSpecRequest;\n\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n\n const baseManager = new SessionManager(ctx.cwd);\n const session = await baseManager.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const workingDir = session.workingDir || ctx.cwd;\n const sessionManager = new SessionManager(workingDir);\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n\n let plan: TaskPlan;\n try {\n plan = await loadPlan(planPath);\n } catch {\n throw new Error(`Plan not found for session ${sessionId}`);\n }\n\n if (plan.status !== 'approved') {\n throw new Error(`Plan must be approved before spec generation (current status: ${plan.status})`);\n }\n\n // Run spec generation asynchronously via RunManager\n const runId = `run-spec-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startedAt = new Date().toISOString();\n const traceDir = path.join(workingDir, '.kb', 'traces', 'incremental');\n const traceWriter = new IncrementalTraceWriter(runId, {}, traceDir);\n await RunManager.register(\n runId,\n `Generate spec for plan ${plan.id}`,\n undefined,\n sessionManager,\n sessionId,\n );\n await RunManager.updateStatus(runId, 'running');\n\n // Start spec generation in background\n const specHandler = new SpecModeHandler();\n const sessionMemory = createSessionMemoryBridge(workingDir, sessionId);\n const responseRequirementsSelector = createDefaultResponseRequirementsSelector();\n const toolRegistry = createToolRegistry({\n workingDir,\n currentTask: `Generate spec for plan ${plan.id}`,\n sessionId,\n sessionMemory,\n responseRequirementsResolver: async ({ task, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: task ?? `Generate spec for plan ${plan.id}`,\n }),\n });\n\n const specPromise = (async () => {\n const configOnEvent = (event: AgentEvent) => {\n traceWriter.trace(event);\n const seqEvent = RunManager.broadcast(runId, event);\n void sessionManager.addEvent(sessionId, {\n ...seqEvent,\n sessionId,\n runId,\n } as unknown as AgentEvent);\n };\n\n try {\n const result = await specHandler.execute(plan, {\n workingDir,\n sessionId,\n agentId: `spec-${sessionId}`,\n maxIterations: plan.phases.length * 8,\n tier: body.tier || 'medium',\n temperature: 0.1,\n onEvent: configOnEvent,\n }, toolRegistry);\n await RunManager.updateStatus(runId, result.success ? 'completed' : 'failed', {\n completedAt: new Date().toISOString(),\n summary: result.summary,\n error: result.success ? undefined : result.summary,\n });\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await RunManager.updateStatus(runId, 'failed', {\n completedAt: new Date().toISOString(),\n summary: message,\n error: message,\n });\n throw error;\n } finally {\n const detailedTrace = traceWriter.getEntries() as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(sessionId, runId, detailedTrace);\n }\n }\n })();\n\n void specPromise;\n\n return {\n sessionId,\n planId: plan.id,\n specId: `spec-${runId}`,\n runId,\n eventsPath: `/ws/plugins/agents/session/${sessionId}`,\n status: 'generating',\n startedAt,\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/run-manager.ts","../../../src/rest/handlers/generate-spec-handler.ts"],"names":["run","fs"],"mappings":"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","file":"generate-spec-handler.js","sourcesContent":["/**\n * Run Manager - tracks active agent runs for REST/WS API\n *\n * Uses platform cache for persistence and in-memory Map for active agents.\n * Cache stores serializable run state, Map stores live agent references.\n * Uses platform eventBus for cross-process event broadcasting.\n */\n\nimport type { IAgentRunner } from '@kb-labs/agent-sdk';\nimport type { SessionManager } from '@kb-labs/agent-core';\nimport type { AgentEvent, AgentEventCallback } from '@kb-labs/agent-contracts';\nimport { useCache, usePlatform } from '@kb-labs/sdk';\n\nconst CACHE_PREFIX = 'agent:run:';\nconst EVENT_TOPIC_PREFIX = 'agent:events:';\nconst CACHE_TTL = 3600000; // 1 hour\n\n/**\n * Run status\n */\nexport type RunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Serializable run state (stored in cache)\n */\nexport interface RunState {\n runId: string;\n task: string;\n status: RunStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n summary?: string;\n error?: string;\n}\n\n/**\n * Active run with live agent (in-memory only)\n */\nexport interface ActiveRun extends RunState {\n agent?: IAgentRunner;\n sessionManager: SessionManager;\n listeners: Set<AgentEventCallback>;\n /** Monotonic sequence counter for event ordering */\n lastSeq: number;\n /** Replay buffer: all events emitted since run start (for late WS connections) */\n eventBuffer: AgentEvent[];\n}\n\n/**\n * Run Manager implementation\n */\nclass RunManagerImpl {\n /** Live agents and listeners (not cacheable) */\n private activeRuns: Map<string, ActiveRun> = new Map();\n\n /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */\n private sessionListeners: Map<string, Set<AgentEventCallback>> = new Map();\n\n /** sessionId per runId — set when run is registered */\n private runSessionMap: Map<string, string> = new Map();\n\n /**\n * Generate unique run ID\n */\n generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n\n /**\n * Register a new run\n */\n async register(\n runId: string,\n task: string,\n agent: IAgentRunner | undefined,\n sessionManager: SessionManager,\n sessionId?: string\n ): Promise<ActiveRun> {\n const now = new Date().toISOString();\n\n const run: ActiveRun = {\n runId,\n task,\n status: 'pending',\n agent,\n sessionManager,\n startedAt: now,\n listeners: new Set(),\n lastSeq: 0,\n eventBuffer: [],\n };\n\n // Store in memory (for live agent)\n this.activeRuns.set(runId, run);\n\n // Track sessionId → runId mapping for session-level listeners\n if (sessionId) {\n this.runSessionMap.set(runId, sessionId);\n }\n\n // Store serializable state in cache\n await this.saveToCache(run);\n\n return run;\n }\n\n /**\n * Get run by ID (from memory first, then cache for state)\n */\n get(runId: string): ActiveRun | undefined {\n return this.activeRuns.get(runId);\n }\n\n /**\n * Check if run exists (in memory or cache)\n */\n async exists(runId: string): Promise<boolean> {\n // Check memory first\n if (this.activeRuns.has(runId)) {\n return true;\n }\n // Fallback to cache\n const state = await this.getState(runId);\n return state !== null;\n }\n\n /**\n * Get run state from cache (for completed runs or cross-process access)\n */\n async getState(runId: string): Promise<RunState | null> {\n const cache = useCache();\n if (!cache) {return null;}\n\n return cache.get<RunState>(`${CACHE_PREFIX}${runId}`);\n }\n\n /**\n * Update run status\n */\n async updateStatus(runId: string, status: RunStatus, extra?: Partial<RunState>): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (run) {\n run.status = status;\n if (extra) {\n Object.assign(run, extra);\n }\n await this.saveToCache(run);\n }\n }\n\n /**\n * Save run state to cache\n */\n private async saveToCache(run: ActiveRun): Promise<void> {\n const cache = useCache();\n if (!cache) {return;}\n\n const state: RunState = {\n runId: run.runId,\n task: run.task,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n durationMs: run.durationMs,\n summary: run.summary,\n error: run.error,\n };\n\n await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);\n }\n\n /** Track subscriptions for cleanup */\n private subscriptions: Map<string, Map<AgentEventCallback, () => void>> = new Map();\n\n /**\n * Add event listener to run (uses eventBus for cross-process)\n */\n addListener(runId: string, callback: AgentEventCallback): boolean {\n const platform = usePlatform();\n if (!platform?.eventBus) {\n // Fallback to in-memory only\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n return true;\n }\n return false;\n }\n\n // Subscribe to eventBus topic for this run\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n const unsubscribe = platform.eventBus.subscribe<AgentEvent>(topic, async (event) => {\n try {\n callback(event);\n } catch {\n // Ignore callback errors\n }\n });\n\n // Track subscription for cleanup\n if (!this.subscriptions.has(runId)) {\n this.subscriptions.set(runId, new Map());\n }\n this.subscriptions.get(runId)!.set(callback, unsubscribe);\n\n // Also add to in-memory if run exists locally\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n }\n\n return true;\n }\n\n /**\n * Remove event listener from run\n */\n removeListener(runId: string, callback: AgentEventCallback): void {\n // Unsubscribe from eventBus\n const runSubs = this.subscriptions.get(runId);\n if (runSubs) {\n const unsubscribe = runSubs.get(callback);\n if (unsubscribe) {\n unsubscribe();\n runSubs.delete(callback);\n }\n if (runSubs.size === 0) {\n this.subscriptions.delete(runId);\n }\n }\n\n // Also remove from in-memory\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.delete(callback);\n }\n }\n\n /**\n * Broadcast event to all listeners of a run (uses eventBus for cross-process)\n * Assigns monotonic sequence number for reliable ordering\n * @returns The event with seq assigned (for persistence)\n */\n broadcast(runId: string, event: AgentEvent): AgentEvent {\n const platform = usePlatform();\n const run = this.activeRuns.get(runId);\n\n // Assign sequence number for ordering\n let seqEvent = event;\n if (run) {\n run.lastSeq++;\n seqEvent = { ...event, seq: run.lastSeq, runId };\n\n // Store in replay buffer (for late WS connections)\n run.eventBuffer.push(seqEvent);\n }\n\n // Publish to eventBus for cross-process delivery\n if (platform?.eventBus) {\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n platform.eventBus.publish(topic, seqEvent).catch(() => {\n // Ignore publish errors\n });\n }\n\n // Also notify local in-memory listeners (for same-process)\n if (run) {\n for (const listener of run.listeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n // Notify session-level listeners (persistent connections)\n const sessionId = this.runSessionMap.get(runId);\n if (sessionId) {\n const sListeners = this.sessionListeners.get(sessionId);\n if (sListeners) {\n for (const listener of sListeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n return seqEvent;\n }\n\n /**\n * Add a session-level listener — receives events from ALL runs in this session.\n */\n addSessionListener(sessionId: string, callback: AgentEventCallback): void {\n if (!this.sessionListeners.has(sessionId)) {\n this.sessionListeners.set(sessionId, new Set());\n }\n this.sessionListeners.get(sessionId)!.add(callback);\n }\n\n /**\n * Remove a session-level listener.\n */\n removeSessionListener(sessionId: string, callback: AgentEventCallback): void {\n const listeners = this.sessionListeners.get(sessionId);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.sessionListeners.delete(sessionId);\n }\n }\n }\n\n /**\n * Get replay buffer for a run (all events emitted since start).\n * Used by WS handler to send missed events on late connection.\n * Optionally filter by afterSeq to only get events the client hasn't seen.\n */\n getEventBuffer(runId: string, afterSeq?: number): AgentEvent[] {\n const run = this.activeRuns.get(runId);\n if (!run) {return [];}\n\n if (afterSeq != null) {\n return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);\n }\n return [...run.eventBuffer];\n }\n\n /**\n * List all active runs\n */\n listActive(): Array<{ runId: string; task: string; status: RunStatus; startedAt: string }> {\n return Array.from(this.activeRuns.values()).map(r => ({\n runId: r.runId,\n task: r.task,\n status: r.status,\n startedAt: r.startedAt,\n }));\n }\n\n /**\n * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).\n * Agent finishes its current tool call then exits at the next iteration boundary.\n */\n requestStop(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n if (!run || run.status !== 'running' || !run.agent) {\n return false;\n }\n run.agent.requestStop();\n return true;\n }\n\n /**\n * Clean up completed runs from memory (cache handles its own TTL)\n */\n cleanup(): void {\n for (const [runId, run] of this.activeRuns) {\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'stopped') {\n // Remove from memory but keep in cache\n this.activeRuns.delete(runId);\n }\n }\n }\n}\n\n/**\n * Singleton instance — stored on globalThis so all bundled modules share one instance.\n * When tsup compiles multiple entry points, each gets its own module scope,\n * so a plain `export const RunManager = new RunManagerImpl()` creates separate instances.\n * Using globalThis ensures run-handler.js and session-stream-handler.js share one RunManager.\n */\nconst GLOBAL_KEY = '__kb_agent_run_manager__';\nif (!(globalThis as Record<string, unknown>)[GLOBAL_KEY]) {\n (globalThis as Record<string, unknown>)[GLOBAL_KEY] = new RunManagerImpl();\n}\nexport const RunManager = (globalThis as Record<string, unknown>)[GLOBAL_KEY] as RunManagerImpl;\n","/**\n * POST /sessions/:sessionId/plan/spec\n * Generate a detailed specification from an approved session plan.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager, SpecModeHandler, createSessionMemoryBridge } from '@kb-labs/agent-core';\nimport { createDefaultResponseRequirementsSelector } from '@kb-labs/agent-runtime';\nimport { IncrementalTraceWriter } from '@kb-labs/agent-tracing';\nimport { createToolRegistry } from '@kb-labs/agent-tools';\nimport type {\n AgentEvent,\n DetailedTraceEntry,\n GenerateSpecRequest,\n GenerateSpecResponse,\n KernelState,\n TaskPlan,\n} from '@kb-labs/agent-contracts';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { RunManager } from '../run-manager.js';\n\ninterface SpecRouteParams {\n sessionId?: string;\n}\n\nasync function loadPlan(planPath: string): Promise<TaskPlan> {\n const content = await fs.readFile(planPath, 'utf-8');\n return JSON.parse(content) as TaskPlan;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<GenerateSpecRequest, unknown, SpecRouteParams>\n ): Promise<GenerateSpecResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n const body = (input.body ?? {}) as GenerateSpecRequest;\n\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n\n const baseManager = new SessionManager(ctx.cwd);\n const session = await baseManager.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const workingDir = session.workingDir || ctx.cwd;\n const sessionManager = new SessionManager(workingDir);\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n\n let plan: TaskPlan;\n try {\n plan = await loadPlan(planPath);\n } catch {\n throw new Error(`Plan not found for session ${sessionId}`);\n }\n\n if (plan.status !== 'approved') {\n throw new Error(`Plan must be approved before spec generation (current status: ${plan.status})`);\n }\n\n // Run spec generation asynchronously via RunManager\n const runId = `run-spec-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startedAt = new Date().toISOString();\n const traceDir = path.join(workingDir, '.kb', 'traces', 'incremental');\n const traceWriter = new IncrementalTraceWriter(runId, {}, traceDir);\n await RunManager.register(\n runId,\n `Generate spec for plan ${plan.id}`,\n undefined,\n sessionManager,\n sessionId,\n );\n await RunManager.updateStatus(runId, 'running');\n\n // Start spec generation in background\n const specHandler = new SpecModeHandler();\n const sessionMemory = createSessionMemoryBridge(workingDir, sessionId);\n const responseRequirementsSelector = createDefaultResponseRequirementsSelector();\n const toolRegistry = createToolRegistry({\n workingDir,\n currentTask: `Generate spec for plan ${plan.id}`,\n sessionId,\n sessionMemory,\n responseRequirementsResolver: async ({ task, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: task ?? `Generate spec for plan ${plan.id}`,\n }),\n });\n\n const specPromise = (async () => {\n const configOnEvent = (event: AgentEvent) => {\n traceWriter.trace(event as unknown as DetailedTraceEntry);\n const seqEvent = RunManager.broadcast(runId, event);\n void sessionManager.addEvent(sessionId, {\n ...seqEvent,\n sessionId,\n runId,\n } as unknown as AgentEvent);\n };\n\n try {\n const result = await specHandler.execute(plan, {\n workingDir,\n sessionId,\n agentId: `spec-${sessionId}`,\n maxIterations: plan.phases.length * 8,\n tier: body.tier || 'medium',\n temperature: 0.1,\n onEvent: configOnEvent,\n }, toolRegistry);\n await RunManager.updateStatus(runId, result.success ? 'completed' : 'failed', {\n completedAt: new Date().toISOString(),\n summary: result.summary,\n error: result.success ? undefined : result.summary,\n });\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await RunManager.updateStatus(runId, 'failed', {\n completedAt: new Date().toISOString(),\n summary: message,\n error: message,\n });\n throw error;\n } finally {\n const detailedTrace = traceWriter.getEntries() as unknown as Array<Record<string, unknown>>;\n await traceWriter.finalize?.();\n if (detailedTrace.length > 0) {\n await sessionManager.storeTraceArtifacts(sessionId, runId, detailedTrace);\n }\n }\n })();\n\n void specPromise;\n\n return {\n sessionId,\n planId: plan.id,\n specId: `spec-${runId}`,\n runId,\n eventsPath: `/ws/plugins/agents/session/${sessionId}`,\n status: 'generating',\n startedAt,\n };\n },\n});\n"]}
|