@kb-labs/agent-cli 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/cli/commands/diff.d.ts +17 -0
- package/dist/cli/commands/diff.js +182 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/history.d.ts +16 -0
- package/dist/cli/commands/history.js +216 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/quality-report.d.ts +21 -0
- package/dist/cli/commands/quality-report.js +457 -0
- package/dist/cli/commands/quality-report.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +27 -0
- package/dist/cli/commands/rollback.js +109 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +42 -0
- package/dist/cli/commands/run.js +923 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/trace-context.d.ts +22 -0
- package/dist/cli/commands/trace-context.js +131 -0
- package/dist/cli/commands/trace-context.js.map +1 -0
- package/dist/cli/commands/trace-diagnose.d.ts +20 -0
- package/dist/cli/commands/trace-diagnose.js +434 -0
- package/dist/cli/commands/trace-diagnose.js.map +1 -0
- package/dist/cli/commands/trace-event-normalizer.d.ts +13 -0
- package/dist/cli/commands/trace-event-normalizer.js +39 -0
- package/dist/cli/commands/trace-event-normalizer.js.map +1 -0
- package/dist/cli/commands/trace-filter.d.ts +19 -0
- package/dist/cli/commands/trace-filter.js +153 -0
- package/dist/cli/commands/trace-filter.js.map +1 -0
- package/dist/cli/commands/trace-iteration.d.ts +18 -0
- package/dist/cli/commands/trace-iteration.js +192 -0
- package/dist/cli/commands/trace-iteration.js.map +1 -0
- package/dist/cli/commands/trace-stats.d.ts +17 -0
- package/dist/cli/commands/trace-stats.js +247 -0
- package/dist/cli/commands/trace-stats.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +473 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +184 -0
- package/dist/manifest.js +473 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/approve-handler.d.ts +15 -0
- package/dist/rest/handlers/approve-handler.js +60 -0
- package/dist/rest/handlers/approve-handler.js.map +1 -0
- package/dist/rest/handlers/approve-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/approve-session-plan-handler.js +52 -0
- package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/correct-handler.d.ts +7 -0
- package/dist/rest/handlers/correct-handler.js +326 -0
- package/dist/rest/handlers/correct-handler.js.map +1 -0
- package/dist/rest/handlers/create-session-handler.d.ts +7 -0
- package/dist/rest/handlers/create-session-handler.js +25 -0
- package/dist/rest/handlers/create-session-handler.js.map +1 -0
- package/dist/rest/handlers/execute-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/execute-session-plan-handler.js +635 -0
- package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/generate-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/generate-spec-handler.js +389 -0
- package/dist/rest/handlers/generate-spec-handler.js.map +1 -0
- package/dist/rest/handlers/get-file-diff-handler.d.ts +24 -0
- package/dist/rest/handlers/get-file-diff-handler.js +44 -0
- package/dist/rest/handlers/get-file-diff-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-handler.js +23 -0
- package/dist/rest/handlers/get-session-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-plan-handler.d.ts +10 -0
- package/dist/rest/handlers/get-session-plan-handler.js +53 -0
- package/dist/rest/handlers/get-session-plan-handler.js.map +1 -0
- package/dist/rest/handlers/get-session-turns-handler.d.ts +16 -0
- package/dist/rest/handlers/get-session-turns-handler.js +35 -0
- package/dist/rest/handlers/get-session-turns-handler.js.map +1 -0
- package/dist/rest/handlers/get-spec-handler.d.ts +10 -0
- package/dist/rest/handlers/get-spec-handler.js +39 -0
- package/dist/rest/handlers/get-spec-handler.js.map +1 -0
- package/dist/rest/handlers/list-file-changes-handler.d.ts +13 -0
- package/dist/rest/handlers/list-file-changes-handler.js +34 -0
- package/dist/rest/handlers/list-file-changes-handler.js.map +1 -0
- package/dist/rest/handlers/list-sessions-handler.d.ts +7 -0
- package/dist/rest/handlers/list-sessions-handler.js +23 -0
- package/dist/rest/handlers/list-sessions-handler.js.map +1 -0
- package/dist/rest/handlers/rollback-handler.d.ts +22 -0
- package/dist/rest/handlers/rollback-handler.js +91 -0
- package/dist/rest/handlers/rollback-handler.js.map +1 -0
- package/dist/rest/handlers/run-handler.d.ts +7 -0
- package/dist/rest/handlers/run-handler.js +516 -0
- package/dist/rest/handlers/run-handler.js.map +1 -0
- package/dist/rest/handlers/sessions-handler.d.ts +18 -0
- package/dist/rest/handlers/sessions-handler.js +56 -0
- package/dist/rest/handlers/sessions-handler.js.map +1 -0
- package/dist/rest/handlers/status-handler.d.ts +7 -0
- package/dist/rest/handlers/status-handler.js +313 -0
- package/dist/rest/handlers/status-handler.js.map +1 -0
- package/dist/rest/handlers/stop-handler.d.ts +7 -0
- package/dist/rest/handlers/stop-handler.js +317 -0
- package/dist/rest/handlers/stop-handler.js.map +1 -0
- package/dist/widgets/220.js +446 -0
- package/dist/widgets/220.js.map +1 -0
- package/dist/widgets/331.js +2 -0
- package/dist/widgets/331.js.map +1 -0
- package/dist/widgets/403.js +2 -0
- package/dist/widgets/403.js.map +1 -0
- package/dist/widgets/406.js +35 -0
- package/dist/widgets/406.js.map +1 -0
- package/dist/widgets/455.js +2 -0
- package/dist/widgets/455.js.map +1 -0
- package/dist/widgets/482.js +2 -0
- package/dist/widgets/482.js.map +1 -0
- package/dist/widgets/485.js +2 -0
- package/dist/widgets/485.js.map +1 -0
- package/dist/widgets/527.js +2 -0
- package/dist/widgets/527.js.map +1 -0
- package/dist/widgets/628.js +2 -0
- package/dist/widgets/628.js.map +1 -0
- package/dist/widgets/694.js +2 -0
- package/dist/widgets/694.js.map +1 -0
- package/dist/widgets/712.js +2 -0
- package/dist/widgets/712.js.map +1 -0
- package/dist/widgets/866.js +2 -0
- package/dist/widgets/866.js.map +1 -0
- package/dist/widgets/915.js +39 -0
- package/dist/widgets/915.js.map +1 -0
- package/dist/widgets/957.js +10 -0
- package/dist/widgets/957.js.map +1 -0
- package/dist/widgets/983.js +2 -0
- package/dist/widgets/983.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_AgentsPage.js +2 -0
- package/dist/widgets/__federation_expose_AgentsPage.js.map +1 -0
- package/dist/widgets/mf-manifest.json +260 -0
- package/dist/widgets/mf-stats.json +305 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/dist/ws/session-stream-handler.d.ts +8 -0
- package/dist/ws/session-stream-handler.js +409 -0
- package/dist/ws/session-stream-handler.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["/**\n * KB Labs Agent Plugin - Manifest V3\n */\n\nimport {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n AGENTS_BASE_PATH,\n AGENTS_WS_BASE_PATH,\n AGENTS_ROUTES,\n AGENTS_WS_CHANNELS,\n} from '@kb-labs/agent-contracts';\n\n/**\n * Command flags for agent:run (unified command with modes)\n */\nconst runFlags = {\n task: {\n type: 'string',\n description: 'Task description',\n },\n mode: {\n type: 'string',\n description: 'Agent mode: execute (default), plan, edit, debug',\n default: 'execute',\n },\n 'session-id': {\n type: 'string',\n description: 'Session ID (auto-generated if not provided)',\n },\n complexity: {\n type: 'string',\n description: 'Task complexity (for plan mode): simple, medium, complex',\n },\n approve: {\n type: 'boolean',\n description: 'Auto-approve generated plan (supported with --mode=plan)',\n default: false,\n },\n execute: {\n type: 'boolean',\n description: 'After plan is approved, immediately execute it (use with --mode=plan --approve)',\n default: false,\n },\n files: {\n type: 'array',\n description: 'Target files (for edit mode)',\n },\n trace: {\n type: 'string',\n description: 'Trace file path (for debug mode)',\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Preview changes without applying (for edit mode)',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Verbose output',\n default: false,\n },\n debug: {\n type: 'boolean',\n description: 'Enable debug mode: emit full prompts and responses as llm:debug events',\n default: false,\n },\n timeout: {\n type: 'number',\n description: 'Abort agent execution after this many seconds (exit code 124). No timeout by default.',\n },\n budget: {\n type: 'number',\n description: 'Override token budget (e.g. 300000 for heavy tasks). Overrides config value.',\n },\n json: {\n type: 'boolean',\n description: 'Output structured JSON result instead of human-readable output.',\n },\n} as const;\n\n/**\n * Plugin permissions\n */\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['.agent-memory/**', '**/*'], // Allow filesystem operations in working dir\n })\n .withPlatform({\n llm: true, // Full LLM access for agent execution\n cache: ['agent:'], // Cache namespace prefix\n analytics: true, // Track agent usage\n })\n .withQuotas({\n timeoutMs: 1800000, // 30 min for complex tasks\n memoryMb: 1024,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/agent',\n version: '0.1.0',\n\n display: {\n name: 'Agent System',\n description: 'Autonomous agent system with LLM tool calling, task orchestration, and tier escalation.',\n tags: ['agent', 'autonomous', 'llm', 'orchestration'],\n },\n\n // Configuration lives under kb.config.json -> agents\n configSection: 'agents',\n\n platform: {\n requires: ['llm'],\n optional: ['cache', 'analytics', 'logger'],\n },\n\n cli: {\n commands: [\n {\n id: 'agent:run',\n group: 'agent',\n describe: 'Run agent with specified mode (execute/plan/edit/debug)',\n longDescription:\n 'Unified agent command with multiple modes: ' +\n 'execute (default) - run task immediately, ' +\n 'plan - generate execution plan without running, ' +\n 'edit - modify existing files, ' +\n 'debug - analyze errors with trace context. ' +\n 'Supports filesystem, search, shell, memory, and user interaction tools.',\n\n handler: './cli/commands/run.js#default',\n handlerPath: './cli/commands/run.js',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb agent run --task=\"Create analytics system\"',\n 'kb agent run --mode=plan --task=\"Add auth\" --complexity=complex',\n 'kb agent run --mode=plan --task=\"Add auth\" --approve',\n 'kb agent run --mode=plan --task=\"Add auth\" --approve --execute',\n 'kb agent run --mode=edit --task=\"Fix bug\" --files src/auth.ts',\n 'kb agent run --mode=debug --task=\"Why crash?\" --trace .kb/traces/trace-123.json',\n 'kb agent run --task=\"Refactor auth module\" --timeout=120',\n ],\n },\n // Trace debugging commands (AI-friendly)\n {\n id: 'agent:trace:stats',\n group: 'agent',\n describe: 'Show trace statistics with cost and performance metrics',\n longDescription:\n 'Analyze trace file to show comprehensive statistics: ' +\n 'iterations, LLM calls, token usage, tool usage, timing, and cost. ' +\n 'Supports --json flag for AI agent consumption.',\n\n handler: './cli/commands/trace-stats.js#default',\n handlerPath: './cli/commands/trace-stats.js',\n\n flags: defineCommandFlags({\n 'task-id': { type: 'string', description: 'Task ID or trace filename' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent trace stats --task-id=task-2026-01-29',\n 'kb agent trace stats --task-id=task-123 --json',\n ],\n },\n {\n id: 'agent:trace:filter',\n group: 'agent',\n describe: 'Filter trace events by type for debugging',\n longDescription:\n 'Filter trace events by type (llm:call, tool:execution, error:captured, etc.). ' +\n 'Use this to debug specific aspects of agent execution. ' +\n 'Supports --json flag for programmatic access.',\n\n handler: './cli/commands/trace-filter.js#default',\n handlerPath: './cli/commands/trace-filter.js',\n\n flags: defineCommandFlags({\n 'task-id': { type: 'string', description: 'Task ID or trace filename' },\n type: { type: 'string', description: 'Event type to filter (llm:call, tool:execution, etc.)' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent trace filter --task-id=task-123 --type=llm:call',\n 'kb agent trace filter --task-id=task-123 --type=error:captured --json',\n ],\n },\n {\n id: 'agent:trace:iteration',\n group: 'agent',\n describe: 'View all events for a specific iteration',\n longDescription:\n 'Show all trace events for a specific iteration number. ' +\n 'Useful for debugging what happened in a particular loop iteration. ' +\n 'Includes summary statistics and event timeline.',\n\n handler: './cli/commands/trace-iteration.js#default',\n handlerPath: './cli/commands/trace-iteration.js',\n\n flags: defineCommandFlags({\n 'task-id': { type: 'string', description: 'Task ID or trace filename' },\n iteration: { type: 'number', description: 'Iteration number (1-based)' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent trace iteration --task-id=task-123 --iteration=3',\n 'kb agent trace iteration --task-id=task-123 --iteration=5 --json',\n ],\n },\n {\n id: 'agent:trace:context',\n group: 'agent',\n describe: 'View what the LLM sees at each iteration — context window, truncations, responses',\n longDescription:\n 'Shows the full context timeline for debugging agent behavior. ' +\n 'For each LLM call: what messages are in the sliding window, ' +\n 'what was truncated/dropped, and what the LLM responded with.',\n\n handler: './cli/commands/trace-context.js#default',\n handlerPath: './cli/commands/trace-context.js',\n\n flags: defineCommandFlags({\n 'task-id': { type: 'string', description: 'Task ID or trace filename' },\n iteration: { type: 'number', description: 'Filter to specific iteration' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent trace context --task-id=task-123',\n 'kb agent trace context --task-id=task-123 --iteration=3',\n 'kb agent trace context --task-id=task-123 --json',\n ],\n },\n {\n id: 'agent:trace:diagnose',\n group: 'agent',\n describe: 'Quick diagnostic analysis — answers \"what went wrong?\" in one command',\n longDescription:\n 'Comprehensive diagnostic report for agent execution. ' +\n 'Analyzes errors, context window health (drops, truncations), ' +\n 'tool failures, LLM reasoning text, loop detection, and quality indicators. ' +\n 'One command to understand any agent issue.',\n\n handler: './cli/commands/trace-diagnose.js#default',\n handlerPath: './cli/commands/trace-diagnose.js',\n\n flags: defineCommandFlags({\n 'task-id': { type: 'string', description: 'Task ID or trace filename' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent trace diagnose --task-id=task-123',\n 'kb agent trace diagnose --task-id=task-123 --json',\n ],\n },\n {\n id: 'agent:quality:report',\n group: 'agent',\n describe: 'Show quality control report for recent agent runs',\n longDescription:\n 'Aggregates agent KPI telemetry from analytics buffer and shows ' +\n 'quality, token usage, tool efficiency, drift, and regression alerts. ' +\n 'Useful for continuous quality control and cost/performance monitoring.',\n\n handler: './cli/commands/quality-report.js#default',\n handlerPath: './cli/commands/quality-report.js',\n\n flags: defineCommandFlags({\n days: { type: 'number', description: 'Lookback period in days', default: 1 },\n limit: { type: 'number', description: 'Max KPI runs to analyze', default: 200 },\n 'session-id': { type: 'string', description: 'Filter by session ID' },\n json: { type: 'boolean', description: 'Output JSON for automation', default: false },\n }),\n\n examples: [\n 'kb agent quality report',\n 'kb agent quality report --days=7',\n 'kb agent quality report --session-id=session-123',\n 'kb agent quality report --days=3 --json',\n ],\n },\n // File change history commands\n {\n id: 'agent:history',\n group: 'agent',\n describe: 'Show file change history for agent sessions',\n longDescription:\n 'View file changes made by agents during execution. ' +\n 'Filter by session, file, or agent. Shows timestamps, operations, and change metadata.',\n\n handler: './cli/commands/history.js#default',\n handlerPath: './cli/commands/history.js',\n\n flags: defineCommandFlags({\n 'session-id': { type: 'string', description: 'Session ID to filter by' },\n file: { type: 'string', description: 'File path to filter by' },\n 'agent-id': { type: 'string', description: 'Agent ID to filter by' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent history',\n 'kb agent history --session-id=session-123',\n 'kb agent history --file=src/index.ts',\n 'kb agent history --agent-id=agent-abc --json',\n ],\n },\n {\n id: 'agent:diff',\n group: 'agent',\n describe: 'Show diff for specific file change',\n longDescription:\n 'Display line-by-line diff for a specific file change. ' +\n 'Shows additions, deletions, and modifications with context.',\n\n handler: './cli/commands/diff.js#default',\n handlerPath: './cli/commands/diff.js',\n\n flags: defineCommandFlags({\n 'change-id': { type: 'string', description: 'Change ID to show diff for' },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent diff --change-id=change-abc123',\n 'kb agent diff --change-id=change-abc123 --json',\n ],\n },\n {\n id: 'agent:rollback',\n group: 'agent',\n describe: 'Rollback file changes made by agents',\n longDescription:\n 'Rollback file changes made by agents. ' +\n 'Supports rollback by change ID, file path, agent ID, session, or timestamp. ' +\n 'Use --dry-run to preview changes before applying.',\n\n handler: './cli/commands/rollback.js#default',\n handlerPath: './cli/commands/rollback.js',\n\n flags: defineCommandFlags({\n 'change-id': { type: 'string', description: 'Change ID to rollback' },\n file: { type: 'string', description: 'File path to rollback all changes for' },\n 'agent-id': { type: 'string', description: 'Agent ID to rollback all changes by' },\n 'session-id': { type: 'string', description: 'Session ID to rollback all changes in' },\n after: { type: 'string', description: 'Rollback all changes after timestamp (ISO 8601)' },\n force: { type: 'boolean', description: 'Force rollback even with conflicts', default: false },\n 'dry-run': { type: 'boolean', description: 'Preview rollback without applying', default: false },\n json: { type: 'boolean', description: 'Output JSON for AI agents', default: false },\n }),\n\n examples: [\n 'kb agent rollback --change-id=change-abc123',\n 'kb agent rollback --file=src/index.ts --dry-run',\n 'kb agent rollback --agent-id=agent-abc',\n 'kb agent rollback --session-id=session-123',\n 'kb agent rollback --after=\"2026-02-16T10:00:00Z\" --json',\n ],\n },\n ],\n },\n\n capabilities: [],\n\n permissions: pluginPermissions,\n\n // REST API for Agent UI\n rest: {\n basePath: AGENTS_BASE_PATH,\n defaults: {\n timeoutMs: 1800000, // 30 min for long-running tasks\n },\n routes: [\n {\n method: 'POST',\n path: AGENTS_ROUTES.RUN,\n description: 'Start a new agent run',\n handler: './rest/handlers/run-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.RUN_STATUS,\n description: 'Get status of a run',\n handler: './rest/handlers/status-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.CORRECT,\n description: 'Send correction to running agent(s)',\n handler: './rest/handlers/correct-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.STOP,\n description: 'Stop a running agent',\n handler: './rest/handlers/stop-handler.js',\n security: ['none'],\n },\n // Session management routes\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSIONS_LIST,\n description: 'List all sessions',\n handler: './rest/handlers/list-sessions-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_GET,\n description: 'Get session details',\n handler: './rest/handlers/get-session-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_CREATE,\n description: 'Create a new session',\n handler: './rest/handlers/create-session-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_TURNS,\n description: 'Get session turns (turn-based UI)',\n handler: './rest/handlers/get-session-turns-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_PLAN_GET,\n description: 'Get current session plan',\n handler: './rest/handlers/get-session-plan-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_PLAN_APPROVE,\n description: 'Approve current session plan',\n handler: './rest/handlers/approve-session-plan-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_PLAN_EXECUTE,\n description: 'Execute approved session plan',\n handler: './rest/handlers/execute-session-plan-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_PLAN_SPEC,\n description: 'Generate detailed spec from approved plan',\n handler: './rest/handlers/generate-spec-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_PLAN_SPEC_GET,\n description: 'Get current session spec',\n handler: './rest/handlers/get-spec-handler.js',\n security: ['none'],\n },\n // File change history routes (rollback & approve)\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_CHANGES,\n description: 'List file changes for session (optionally filtered by runId)',\n handler: './rest/handlers/list-file-changes-handler.js',\n security: ['none'],\n },\n {\n method: 'GET',\n path: AGENTS_ROUTES.SESSION_CHANGE_DIFF,\n description: 'Get unified diff for a specific file change',\n handler: './rest/handlers/get-file-diff-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_ROLLBACK,\n description: 'Rollback file changes for a session/run',\n handler: './rest/handlers/rollback-handler.js',\n security: ['none'],\n },\n {\n method: 'POST',\n path: AGENTS_ROUTES.SESSION_APPROVE,\n description: 'Approve file changes for a session/run',\n handler: './rest/handlers/approve-handler.js',\n security: ['none'],\n },\n ],\n },\n\n // WebSocket for real-time event streaming\n ws: {\n basePath: AGENTS_WS_BASE_PATH,\n defaults: {\n auth: 'none',\n idleTimeoutMs: 3600000, // 1 hour\n },\n channels: [\n {\n path: AGENTS_WS_CHANNELS.SESSION_STREAM,\n description: 'Persistent session stream (all runs in session)',\n handler: './ws/session-stream-handler.js',\n auth: 'none',\n },\n ],\n },\n\n artifacts: [\n {\n id: 'agent.memory.json',\n pathTemplate: '.agent-memory/memory.json',\n description: 'Persistent agent memory (facts, sessions, project context).',\n },\n ],\n\n studio: {\n version: 2 as const,\n remoteName: 'agentPlugin',\n pages: [\n {\n id: 'agent.overview',\n title: 'Agent',\n icon: 'RobotOutlined',\n route: '/p/agent',\n entry: './AgentsPage',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'agent',\n label: 'Agent',\n icon: 'RobotOutlined',\n target: 'agent.overview',\n order: 30,\n },\n ],\n },\n};\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface ApproveRequest {
|
|
5
|
+
runId?: string;
|
|
6
|
+
changeIds?: string[];
|
|
7
|
+
}
|
|
8
|
+
interface ApproveResponse {
|
|
9
|
+
approved: number;
|
|
10
|
+
changeIds: string[];
|
|
11
|
+
approvedAt: string;
|
|
12
|
+
}
|
|
13
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<ApproveRequest, unknown, unknown>, ApproveResponse>;
|
|
14
|
+
|
|
15
|
+
export { _default as default };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { SessionManager } from '@kb-labs/agent-core';
|
|
3
|
+
import { SnapshotStorage } from '@kb-labs/agent-history';
|
|
4
|
+
|
|
5
|
+
// src/rest/handlers/approve-handler.ts
|
|
6
|
+
var approve_handler_default = defineHandler({
|
|
7
|
+
async execute(ctx, input) {
|
|
8
|
+
const params = input.params;
|
|
9
|
+
const sessionId = params?.sessionId;
|
|
10
|
+
if (!sessionId) {
|
|
11
|
+
throw new Error("Session ID is required");
|
|
12
|
+
}
|
|
13
|
+
const body = input.body ?? {};
|
|
14
|
+
const sessionManager = new SessionManager(ctx.cwd);
|
|
15
|
+
const session = await sessionManager.loadSession(sessionId);
|
|
16
|
+
if (!session) {
|
|
17
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
18
|
+
}
|
|
19
|
+
const workingDir = session.workingDir || ctx.cwd;
|
|
20
|
+
const storage = new SnapshotStorage(workingDir);
|
|
21
|
+
let changes = await storage.listSnapshots(sessionId);
|
|
22
|
+
if (body.runId) {
|
|
23
|
+
changes = changes.filter((c) => c.runId === body.runId);
|
|
24
|
+
} else if (body.changeIds?.length) {
|
|
25
|
+
const ids = new Set(body.changeIds);
|
|
26
|
+
changes = changes.filter((c) => ids.has(c.id));
|
|
27
|
+
}
|
|
28
|
+
const approvedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
29
|
+
const approvedIds = [];
|
|
30
|
+
for (const change of changes) {
|
|
31
|
+
change.approved = true;
|
|
32
|
+
change.approvedAt = approvedAt;
|
|
33
|
+
await storage.saveSnapshot(sessionId, change);
|
|
34
|
+
approvedIds.push(change.id);
|
|
35
|
+
}
|
|
36
|
+
if (body.runId && approvedIds.length > 0) {
|
|
37
|
+
const updatedSummaries = changes.map((c) => ({
|
|
38
|
+
changeId: c.id,
|
|
39
|
+
filePath: c.filePath,
|
|
40
|
+
operation: c.operation,
|
|
41
|
+
timestamp: c.timestamp,
|
|
42
|
+
linesAdded: c.metadata?.linesAdded,
|
|
43
|
+
linesRemoved: c.metadata?.linesRemoved,
|
|
44
|
+
isNew: !c.before,
|
|
45
|
+
sizeAfter: c.after.size,
|
|
46
|
+
approved: true,
|
|
47
|
+
approvedAt
|
|
48
|
+
}));
|
|
49
|
+
await sessionManager.updateTurnFileChanges(sessionId, body.runId, updatedSummaries);
|
|
50
|
+
}
|
|
51
|
+
ctx.platform.logger.info(
|
|
52
|
+
`[approve-handler] Session ${sessionId}: approved ${approvedIds.length} changes`
|
|
53
|
+
);
|
|
54
|
+
return { approved: approvedIds.length, changeIds: approvedIds, approvedAt };
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export { approve_handler_default as default };
|
|
59
|
+
//# sourceMappingURL=approve-handler.js.map
|
|
60
|
+
//# sourceMappingURL=approve-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/approve-handler.ts"],"names":[],"mappings":"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","file":"approve-handler.js","sourcesContent":["/**\n * POST /sessions/:sessionId/approve\n * Mark file changes as explicitly approved by the user.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager } from '@kb-labs/agent-core';\nimport { SnapshotStorage } from '@kb-labs/agent-history';\n\ninterface ApproveRequest {\n runId?: string;\n changeIds?: string[];\n}\n\ninterface ApproveResponse {\n approved: number;\n changeIds: string[];\n approvedAt: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<ApproveRequest>\n ): Promise<ApproveResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n\n if (!sessionId) {throw new Error('Session ID is required');}\n\n const body = (input.body ?? {}) as ApproveRequest;\n\n const sessionManager = new SessionManager(ctx.cwd);\n const session = await sessionManager.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Use session's own workingDir for snapshot lookup (may differ from ctx.cwd)\n const workingDir = session.workingDir || ctx.cwd;\n const storage = new SnapshotStorage(workingDir);\n let changes = await storage.listSnapshots(sessionId);\n\n if (body.runId) {\n changes = changes.filter((c) => c.runId === body.runId);\n } else if (body.changeIds?.length) {\n const ids = new Set(body.changeIds);\n changes = changes.filter((c) => ids.has(c.id));\n }\n\n const approvedAt = new Date().toISOString();\n const approvedIds: string[] = [];\n\n for (const change of changes) {\n change.approved = true;\n change.approvedAt = approvedAt;\n await storage.saveSnapshot(sessionId, change);\n approvedIds.push(change.id);\n }\n\n // Patch turns.json so the UI reflects approved state after page reload\n if (body.runId && approvedIds.length > 0) {\n const updatedSummaries = changes.map((c) => ({\n changeId: c.id,\n filePath: c.filePath,\n operation: c.operation,\n timestamp: c.timestamp,\n linesAdded: c.metadata?.linesAdded,\n linesRemoved: c.metadata?.linesRemoved,\n isNew: !c.before,\n sizeAfter: c.after.size,\n approved: true,\n approvedAt,\n }));\n await sessionManager.updateTurnFileChanges(sessionId, body.runId, updatedSummaries);\n }\n\n ctx.platform.logger.info(\n `[approve-handler] Session ${sessionId}: approved ${approvedIds.length} changes`\n );\n\n return { approved: approvedIds.length, changeIds: approvedIds, approvedAt };\n },\n});\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
import { ApproveSessionPlanRequest, ApproveSessionPlanResponse } from '@kb-labs/agent-contracts';
|
|
4
|
+
|
|
5
|
+
interface ApprovePlanRouteParams {
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<ApproveSessionPlanRequest, unknown, ApprovePlanRouteParams>, ApproveSessionPlanResponse>;
|
|
9
|
+
|
|
10
|
+
export { _default as default };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { SessionManager } from '@kb-labs/agent-core';
|
|
3
|
+
import { promises } from 'fs';
|
|
4
|
+
|
|
5
|
+
// src/rest/handlers/approve-session-plan-handler.ts
|
|
6
|
+
async function loadPlan(planPath) {
|
|
7
|
+
const content = await promises.readFile(planPath, "utf-8");
|
|
8
|
+
return JSON.parse(content);
|
|
9
|
+
}
|
|
10
|
+
var approve_session_plan_handler_default = defineHandler({
|
|
11
|
+
async execute(ctx, input) {
|
|
12
|
+
const params = input.params;
|
|
13
|
+
const sessionId = params?.sessionId;
|
|
14
|
+
const body = input.body ?? {};
|
|
15
|
+
if (!sessionId) {
|
|
16
|
+
throw new Error("Session ID is required");
|
|
17
|
+
}
|
|
18
|
+
const baseManager = new SessionManager(ctx.cwd);
|
|
19
|
+
const session = await baseManager.loadSession(sessionId);
|
|
20
|
+
if (!session) {
|
|
21
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
22
|
+
}
|
|
23
|
+
const workingDir = session.workingDir || ctx.cwd;
|
|
24
|
+
const sessionManager = new SessionManager(workingDir);
|
|
25
|
+
const planPath = sessionManager.getSessionPlanPath(sessionId);
|
|
26
|
+
let plan;
|
|
27
|
+
try {
|
|
28
|
+
plan = await loadPlan(planPath);
|
|
29
|
+
} catch {
|
|
30
|
+
throw new Error(`Plan not found for session ${sessionId}`);
|
|
31
|
+
}
|
|
32
|
+
const approvedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
33
|
+
const approvedPlan = {
|
|
34
|
+
...plan,
|
|
35
|
+
status: "approved",
|
|
36
|
+
updatedAt: approvedAt,
|
|
37
|
+
approvalComment: body.comment?.trim() || void 0,
|
|
38
|
+
approvedAt
|
|
39
|
+
};
|
|
40
|
+
await promises.writeFile(planPath, JSON.stringify(approvedPlan, null, 2), "utf-8");
|
|
41
|
+
ctx.platform.logger.info(`[approve-session-plan] Session ${sessionId}: plan approved`);
|
|
42
|
+
return {
|
|
43
|
+
sessionId,
|
|
44
|
+
plan: approvedPlan,
|
|
45
|
+
approvedAt
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export { approve_session_plan_handler_default as default };
|
|
51
|
+
//# sourceMappingURL=approve-session-plan-handler.js.map
|
|
52
|
+
//# sourceMappingURL=approve-session-plan-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/approve-session-plan-handler.ts"],"names":["fs"],"mappings":";;;;;AAcA,eAAe,SAAS,QAAA,EAAqC;AAC3D,EAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,EAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAC3B;AAEA,IAAO,uCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACqC;AACrC,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,MAAM,YAAY,MAAA,EAAQ,SAAA;AAC1B,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,IAAA,IAAQ,EAAC;AAE7B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,WAAA,CAAY,SAAS,CAAA;AACvD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,GAAA,CAAI,GAAA;AAC7C,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,UAAU,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AAE5D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,QAAQ,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,UAAA;AAAA,MACR,SAAA,EAAW,UAAA;AAAA,MACX,eAAA,EAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,EAAK,IAAK,MAAA;AAAA,MACzC;AAAA,KACF;AAEA,IAAA,MAAMA,QAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAE3E,IAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,CAAA,eAAA,CAAiB,CAAA;AAErF,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACF,CAAC","file":"approve-session-plan-handler.js","sourcesContent":["/**\n * POST /sessions/:sessionId/plan/approve\n * Mark current session plan as approved.\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { SessionManager } from '@kb-labs/agent-core';\nimport type { ApproveSessionPlanRequest, ApproveSessionPlanResponse, TaskPlan } from '@kb-labs/agent-contracts';\nimport { promises as fs } from 'node:fs';\n\ninterface ApprovePlanRouteParams {\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<ApproveSessionPlanRequest, unknown, ApprovePlanRouteParams>\n ): Promise<ApproveSessionPlanResponse> {\n const params = input.params as Record<string, string> | undefined;\n const sessionId = params?.sessionId;\n const body = (input.body ?? {}) as ApproveSessionPlanRequest;\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 const approvedAt = new Date().toISOString();\n const approvedPlan = {\n ...plan,\n status: 'approved' as const,\n updatedAt: approvedAt,\n approvalComment: body.comment?.trim() || undefined,\n approvedAt,\n } as TaskPlan;\n\n await fs.writeFile(planPath, JSON.stringify(approvedPlan, null, 2), 'utf-8');\n\n ctx.platform.logger.info(`[approve-session-plan] Session ${sessionId}: plan approved`);\n\n return {\n sessionId,\n plan: approvedPlan,\n approvedAt,\n };\n },\n});\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
import { CorrectionRequest, CorrectionResponse } from '@kb-labs/agent-contracts';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<CorrectionRequest, unknown, unknown>, CorrectionResponse>;
|
|
6
|
+
|
|
7
|
+
export { _default as default };
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { defineHandler, useAnalytics, useCache, usePlatform } from '@kb-labs/sdk';
|
|
2
|
+
import { AGENT_ANALYTICS_EVENTS } from '@kb-labs/agent-contracts';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/correct-handler.ts
|
|
5
|
+
var CACHE_PREFIX = "agent:run:";
|
|
6
|
+
var EVENT_TOPIC_PREFIX = "agent:events:";
|
|
7
|
+
var CACHE_TTL = 36e5;
|
|
8
|
+
var RunManagerImpl = class {
|
|
9
|
+
/** Live agents and listeners (not cacheable) */
|
|
10
|
+
activeRuns = /* @__PURE__ */ new Map();
|
|
11
|
+
/** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */
|
|
12
|
+
sessionListeners = /* @__PURE__ */ new Map();
|
|
13
|
+
/** sessionId per runId — set when run is registered */
|
|
14
|
+
runSessionMap = /* @__PURE__ */ new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Generate unique run ID
|
|
17
|
+
*/
|
|
18
|
+
generateRunId() {
|
|
19
|
+
return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a new run
|
|
23
|
+
*/
|
|
24
|
+
async register(runId, task, agent, sessionManager, sessionId) {
|
|
25
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
26
|
+
const run = {
|
|
27
|
+
runId,
|
|
28
|
+
task,
|
|
29
|
+
status: "pending",
|
|
30
|
+
agent,
|
|
31
|
+
sessionManager,
|
|
32
|
+
startedAt: now,
|
|
33
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
34
|
+
lastSeq: 0,
|
|
35
|
+
eventBuffer: []
|
|
36
|
+
};
|
|
37
|
+
this.activeRuns.set(runId, run);
|
|
38
|
+
if (sessionId) {
|
|
39
|
+
this.runSessionMap.set(runId, sessionId);
|
|
40
|
+
}
|
|
41
|
+
await this.saveToCache(run);
|
|
42
|
+
return run;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get run by ID (from memory first, then cache for state)
|
|
46
|
+
*/
|
|
47
|
+
get(runId) {
|
|
48
|
+
return this.activeRuns.get(runId);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if run exists (in memory or cache)
|
|
52
|
+
*/
|
|
53
|
+
async exists(runId) {
|
|
54
|
+
if (this.activeRuns.has(runId)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
const state = await this.getState(runId);
|
|
58
|
+
return state !== null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get run state from cache (for completed runs or cross-process access)
|
|
62
|
+
*/
|
|
63
|
+
async getState(runId) {
|
|
64
|
+
const cache = useCache();
|
|
65
|
+
if (!cache) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return cache.get(`${CACHE_PREFIX}${runId}`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Update run status
|
|
72
|
+
*/
|
|
73
|
+
async updateStatus(runId, status, extra) {
|
|
74
|
+
const run = this.activeRuns.get(runId);
|
|
75
|
+
if (run) {
|
|
76
|
+
run.status = status;
|
|
77
|
+
if (extra) {
|
|
78
|
+
Object.assign(run, extra);
|
|
79
|
+
}
|
|
80
|
+
await this.saveToCache(run);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Save run state to cache
|
|
85
|
+
*/
|
|
86
|
+
async saveToCache(run) {
|
|
87
|
+
const cache = useCache();
|
|
88
|
+
if (!cache) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const state = {
|
|
92
|
+
runId: run.runId,
|
|
93
|
+
task: run.task,
|
|
94
|
+
status: run.status,
|
|
95
|
+
startedAt: run.startedAt,
|
|
96
|
+
completedAt: run.completedAt,
|
|
97
|
+
durationMs: run.durationMs,
|
|
98
|
+
summary: run.summary,
|
|
99
|
+
error: run.error
|
|
100
|
+
};
|
|
101
|
+
await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);
|
|
102
|
+
}
|
|
103
|
+
/** Track subscriptions for cleanup */
|
|
104
|
+
subscriptions = /* @__PURE__ */ new Map();
|
|
105
|
+
/**
|
|
106
|
+
* Add event listener to run (uses eventBus for cross-process)
|
|
107
|
+
*/
|
|
108
|
+
addListener(runId, callback) {
|
|
109
|
+
const platform = usePlatform();
|
|
110
|
+
if (!platform?.eventBus) {
|
|
111
|
+
const run2 = this.activeRuns.get(runId);
|
|
112
|
+
if (run2) {
|
|
113
|
+
run2.listeners.add(callback);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const topic = `${EVENT_TOPIC_PREFIX}${runId}`;
|
|
119
|
+
const unsubscribe = platform.eventBus.subscribe(topic, async (event) => {
|
|
120
|
+
try {
|
|
121
|
+
callback(event);
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
if (!this.subscriptions.has(runId)) {
|
|
126
|
+
this.subscriptions.set(runId, /* @__PURE__ */ new Map());
|
|
127
|
+
}
|
|
128
|
+
this.subscriptions.get(runId).set(callback, unsubscribe);
|
|
129
|
+
const run = this.activeRuns.get(runId);
|
|
130
|
+
if (run) {
|
|
131
|
+
run.listeners.add(callback);
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Remove event listener from run
|
|
137
|
+
*/
|
|
138
|
+
removeListener(runId, callback) {
|
|
139
|
+
const runSubs = this.subscriptions.get(runId);
|
|
140
|
+
if (runSubs) {
|
|
141
|
+
const unsubscribe = runSubs.get(callback);
|
|
142
|
+
if (unsubscribe) {
|
|
143
|
+
unsubscribe();
|
|
144
|
+
runSubs.delete(callback);
|
|
145
|
+
}
|
|
146
|
+
if (runSubs.size === 0) {
|
|
147
|
+
this.subscriptions.delete(runId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const run = this.activeRuns.get(runId);
|
|
151
|
+
if (run) {
|
|
152
|
+
run.listeners.delete(callback);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Broadcast event to all listeners of a run (uses eventBus for cross-process)
|
|
157
|
+
* Assigns monotonic sequence number for reliable ordering
|
|
158
|
+
* @returns The event with seq assigned (for persistence)
|
|
159
|
+
*/
|
|
160
|
+
broadcast(runId, event) {
|
|
161
|
+
const platform = usePlatform();
|
|
162
|
+
const run = this.activeRuns.get(runId);
|
|
163
|
+
let seqEvent = event;
|
|
164
|
+
if (run) {
|
|
165
|
+
run.lastSeq++;
|
|
166
|
+
seqEvent = { ...event, seq: run.lastSeq, runId };
|
|
167
|
+
run.eventBuffer.push(seqEvent);
|
|
168
|
+
}
|
|
169
|
+
if (platform?.eventBus) {
|
|
170
|
+
const topic = `${EVENT_TOPIC_PREFIX}${runId}`;
|
|
171
|
+
platform.eventBus.publish(topic, seqEvent).catch(() => {
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (run) {
|
|
175
|
+
for (const listener of run.listeners) {
|
|
176
|
+
try {
|
|
177
|
+
listener(seqEvent);
|
|
178
|
+
} catch {
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const sessionId = this.runSessionMap.get(runId);
|
|
183
|
+
if (sessionId) {
|
|
184
|
+
const sListeners = this.sessionListeners.get(sessionId);
|
|
185
|
+
if (sListeners) {
|
|
186
|
+
for (const listener of sListeners) {
|
|
187
|
+
try {
|
|
188
|
+
listener(seqEvent);
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return seqEvent;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Add a session-level listener — receives events from ALL runs in this session.
|
|
198
|
+
*/
|
|
199
|
+
addSessionListener(sessionId, callback) {
|
|
200
|
+
if (!this.sessionListeners.has(sessionId)) {
|
|
201
|
+
this.sessionListeners.set(sessionId, /* @__PURE__ */ new Set());
|
|
202
|
+
}
|
|
203
|
+
this.sessionListeners.get(sessionId).add(callback);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Remove a session-level listener.
|
|
207
|
+
*/
|
|
208
|
+
removeSessionListener(sessionId, callback) {
|
|
209
|
+
const listeners = this.sessionListeners.get(sessionId);
|
|
210
|
+
if (listeners) {
|
|
211
|
+
listeners.delete(callback);
|
|
212
|
+
if (listeners.size === 0) {
|
|
213
|
+
this.sessionListeners.delete(sessionId);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get replay buffer for a run (all events emitted since start).
|
|
219
|
+
* Used by WS handler to send missed events on late connection.
|
|
220
|
+
* Optionally filter by afterSeq to only get events the client hasn't seen.
|
|
221
|
+
*/
|
|
222
|
+
getEventBuffer(runId, afterSeq) {
|
|
223
|
+
const run = this.activeRuns.get(runId);
|
|
224
|
+
if (!run) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
if (afterSeq != null) {
|
|
228
|
+
return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);
|
|
229
|
+
}
|
|
230
|
+
return [...run.eventBuffer];
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* List all active runs
|
|
234
|
+
*/
|
|
235
|
+
listActive() {
|
|
236
|
+
return Array.from(this.activeRuns.values()).map((r) => ({
|
|
237
|
+
runId: r.runId,
|
|
238
|
+
task: r.task,
|
|
239
|
+
status: r.status,
|
|
240
|
+
startedAt: r.startedAt
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Request graceful stop of a running agent (and its child agents via propagated AbortSignal).
|
|
245
|
+
* Agent finishes its current tool call then exits at the next iteration boundary.
|
|
246
|
+
*/
|
|
247
|
+
requestStop(runId) {
|
|
248
|
+
const run = this.activeRuns.get(runId);
|
|
249
|
+
if (!run || run.status !== "running" || !run.agent) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
run.agent.requestStop();
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Clean up completed runs from memory (cache handles its own TTL)
|
|
257
|
+
*/
|
|
258
|
+
cleanup() {
|
|
259
|
+
for (const [runId, run] of this.activeRuns) {
|
|
260
|
+
if (run.status === "completed" || run.status === "failed" || run.status === "stopped") {
|
|
261
|
+
this.activeRuns.delete(runId);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
var GLOBAL_KEY = "__kb_agent_run_manager__";
|
|
267
|
+
if (!globalThis[GLOBAL_KEY]) {
|
|
268
|
+
globalThis[GLOBAL_KEY] = new RunManagerImpl();
|
|
269
|
+
}
|
|
270
|
+
var RunManager = globalThis[GLOBAL_KEY];
|
|
271
|
+
|
|
272
|
+
// src/rest/handlers/correct-handler.ts
|
|
273
|
+
var correct_handler_default = defineHandler({
|
|
274
|
+
async execute(ctx, input) {
|
|
275
|
+
const { runId } = input.params;
|
|
276
|
+
const body = input.body;
|
|
277
|
+
if (!body?.message) {
|
|
278
|
+
throw new Error("Correction message is required");
|
|
279
|
+
}
|
|
280
|
+
ctx.platform.logger.info(`[correct-handler] Correction for run ${runId}: ${body.message.slice(0, 50)}...`);
|
|
281
|
+
const run = RunManager.get(runId);
|
|
282
|
+
if (!run) {
|
|
283
|
+
return {
|
|
284
|
+
correctionId: "",
|
|
285
|
+
routedTo: [],
|
|
286
|
+
reason: `Run ${runId} not found`,
|
|
287
|
+
applied: false
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
if (run.status !== "running") {
|
|
291
|
+
return {
|
|
292
|
+
correctionId: "",
|
|
293
|
+
routedTo: [],
|
|
294
|
+
reason: `Run ${runId} is not running (status: ${run.status})`,
|
|
295
|
+
applied: false
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const correctionId = `corr-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
299
|
+
run.agent?.injectUserContext(body.message);
|
|
300
|
+
const result = {
|
|
301
|
+
correctionId,
|
|
302
|
+
routedTo: [run.agent?.agentId ?? runId],
|
|
303
|
+
reason: "Injected via injectUserContext",
|
|
304
|
+
applied: !!run.agent
|
|
305
|
+
};
|
|
306
|
+
const analytics = useAnalytics();
|
|
307
|
+
await analytics?.track(
|
|
308
|
+
result.applied ? AGENT_ANALYTICS_EVENTS.CORRECTION_APPLIED : AGENT_ANALYTICS_EVENTS.CORRECTION_REJECTED,
|
|
309
|
+
{
|
|
310
|
+
runId,
|
|
311
|
+
correctionId: result.correctionId,
|
|
312
|
+
routedTo: result.routedTo,
|
|
313
|
+
messageLength: body.message.length,
|
|
314
|
+
targetAgentId: body.targetAgentId
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
ctx.platform.logger.info(
|
|
318
|
+
`[correct-handler] Correction ${result.correctionId} routed to: ${result.routedTo.join(", ")}`
|
|
319
|
+
);
|
|
320
|
+
return result;
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
export { correct_handler_default as default };
|
|
325
|
+
//# sourceMappingURL=correct-handler.js.map
|
|
326
|
+
//# sourceMappingURL=correct-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/run-manager.ts","../../../src/rest/handlers/correct-handler.ts"],"names":["run"],"mappings":"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","file":"correct-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/:runId/correct handler\n *\n * Injects user correction into running agent(s)\n */\n\nimport { defineHandler, useAnalytics, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CorrectionRequest, CorrectionResponse } from '@kb-labs/agent-contracts';\nimport { AGENT_ANALYTICS_EVENTS } from '@kb-labs/agent-contracts';\nimport { RunManager } from '../run-manager.js';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<CorrectionRequest>\n ): Promise<CorrectionResponse> {\n const { runId } = input.params as { runId: string };\n const body = input.body as CorrectionRequest | undefined;\n\n if (!body?.message) {\n throw new Error('Correction message is required');\n }\n\n ctx.platform.logger.info(`[correct-handler] Correction for run ${runId}: ${body.message.slice(0, 50)}...`);\n\n const run = RunManager.get(runId);\n\n if (!run) {\n return {\n correctionId: '',\n routedTo: [],\n reason: `Run ${runId} not found`,\n applied: false,\n };\n }\n\n if (run.status !== 'running') {\n return {\n correctionId: '',\n routedTo: [],\n reason: `Run ${runId} is not running (status: ${run.status})`,\n applied: false,\n };\n }\n\n // Inject correction into the running agent via the public IAgentRunner API\n const correctionId = `corr-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n run.agent?.injectUserContext(body.message);\n const result: CorrectionResponse = {\n correctionId,\n routedTo: [run.agent?.agentId ?? runId],\n reason: 'Injected via injectUserContext',\n applied: !!run.agent,\n };\n\n // Track correction\n const analytics = useAnalytics();\n await analytics?.track(\n result.applied ? AGENT_ANALYTICS_EVENTS.CORRECTION_APPLIED : AGENT_ANALYTICS_EVENTS.CORRECTION_REJECTED,\n {\n runId,\n correctionId: result.correctionId,\n routedTo: result.routedTo,\n messageLength: body.message.length,\n targetAgentId: body.targetAgentId,\n }\n );\n\n ctx.platform.logger.info(\n `[correct-handler] Correction ${result.correctionId} routed to: ${result.routedTo.join(', ')}`\n );\n\n return result;\n },\n});\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
import { CreateSessionRequest, CreateSessionResponse } from '@kb-labs/agent-contracts';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<CreateSessionRequest, unknown, unknown>, CreateSessionResponse>;
|
|
6
|
+
|
|
7
|
+
export { _default as default };
|