@probelabs/visor 0.1.181 → 0.1.182
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/defaults/code-talk.yaml +80 -14
- package/defaults/engineer.yaml +33 -15
- package/defaults/skills/code-explorer.yaml +5 -0
- package/dist/agent-protocol/a2a-frontend.d.ts +10 -0
- package/dist/agent-protocol/a2a-frontend.d.ts.map +1 -1
- package/dist/agent-protocol/task-evaluator.d.ts +52 -0
- package/dist/agent-protocol/task-evaluator.d.ts.map +1 -0
- package/dist/agent-protocol/task-store.d.ts +5 -3
- package/dist/agent-protocol/task-store.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-tui.d.ts +34 -0
- package/dist/agent-protocol/tasks-tui.d.ts.map +1 -0
- package/dist/agent-protocol/trace-serializer.d.ts +90 -0
- package/dist/agent-protocol/trace-serializer.d.ts.map +1 -0
- package/dist/agent-protocol/track-execution.d.ts +2 -0
- package/dist/agent-protocol/track-execution.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/defaults/code-talk.yaml +80 -14
- package/dist/defaults/engineer.yaml +33 -15
- package/dist/defaults/skills/code-explorer.yaml +5 -0
- package/dist/docs/commands.md +57 -14
- package/dist/docs/configuration.md +2 -0
- package/dist/docs/guides/graceful-restart.md +178 -0
- package/dist/docs/observability.md +69 -0
- package/dist/docs/production-deployment.md +17 -0
- package/dist/email/polling-runner.d.ts +4 -0
- package/dist/email/polling-runner.d.ts.map +1 -1
- package/dist/generated/config-schema.d.ts +70 -6
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +73 -6
- package/dist/index.js +5006 -886
- package/dist/output/traces/{run-2026-03-17T13-58-29-402Z.ndjson → run-2026-03-18T19-02-50-465Z.ndjson} +84 -84
- package/dist/{traces/run-2026-03-17T13-59-10-403Z.ndjson → output/traces/run-2026-03-18T19-03-30-428Z.ndjson} +2037 -2037
- package/dist/providers/mcp-custom-sse-server.d.ts +4 -0
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
- package/dist/runners/graceful-restart.d.ts +46 -0
- package/dist/runners/graceful-restart.d.ts.map +1 -0
- package/dist/runners/mcp-server-runner.d.ts +12 -0
- package/dist/runners/mcp-server-runner.d.ts.map +1 -1
- package/dist/runners/runner-factory.d.ts.map +1 -1
- package/dist/runners/runner-host.d.ts +12 -0
- package/dist/runners/runner-host.d.ts.map +1 -1
- package/dist/runners/runner.d.ts +12 -0
- package/dist/runners/runner.d.ts.map +1 -1
- package/dist/sdk/{a2a-frontend-IWOUJOIZ.mjs → a2a-frontend-4LP3MLTS.mjs} +47 -5
- package/dist/sdk/a2a-frontend-4LP3MLTS.mjs.map +1 -0
- package/dist/sdk/a2a-frontend-5J3UNFY4.mjs +1718 -0
- package/dist/sdk/a2a-frontend-5J3UNFY4.mjs.map +1 -0
- package/dist/sdk/{a2a-frontend-BDACLGMA.mjs → a2a-frontend-MU5EO2HZ.mjs} +35 -1
- package/dist/sdk/a2a-frontend-MU5EO2HZ.mjs.map +1 -0
- package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs → check-provider-registry-MHXQGUNN.mjs} +7 -7
- package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs → check-provider-registry-RRWCXSTG.mjs} +3 -3
- package/dist/sdk/{check-provider-registry-67ZLGDDQ.mjs → check-provider-registry-Y33CRFVD.mjs} +7 -7
- package/dist/sdk/{chunk-DGIH6EX3.mjs → chunk-4AXAVXG5.mjs} +151 -281
- package/dist/sdk/chunk-4AXAVXG5.mjs.map +1 -0
- package/dist/sdk/{chunk-VMVIM4JB.mjs → chunk-4I3TJ7UJ.mjs} +37 -7
- package/dist/sdk/chunk-4I3TJ7UJ.mjs.map +1 -0
- package/dist/sdk/{chunk-VXC2XNQJ.mjs → chunk-5J3DNRF7.mjs} +3 -3
- package/dist/sdk/{chunk-7YZSSO4X.mjs → chunk-6DPPP7LD.mjs} +10 -10
- package/dist/sdk/chunk-7ERVRLDV.mjs +296 -0
- package/dist/sdk/chunk-7ERVRLDV.mjs.map +1 -0
- package/dist/sdk/{chunk-4DVP6KVC.mjs → chunk-7Z2WHX2J.mjs} +71 -30
- package/dist/sdk/chunk-7Z2WHX2J.mjs.map +1 -0
- package/dist/sdk/chunk-ANUT54HW.mjs +1502 -0
- package/dist/sdk/chunk-ANUT54HW.mjs.map +1 -0
- package/dist/sdk/{chunk-J73GEFPT.mjs → chunk-DHETLQIX.mjs} +2 -2
- package/dist/sdk/{chunk-QGBASDYP.mjs → chunk-JCOSKBMP.mjs} +71 -30
- package/dist/sdk/chunk-JCOSKBMP.mjs.map +1 -0
- package/dist/sdk/chunk-MK7ONH47.mjs +739 -0
- package/dist/sdk/chunk-MK7ONH47.mjs.map +1 -0
- package/dist/sdk/chunk-QXT47ZHR.mjs +390 -0
- package/dist/sdk/chunk-QXT47ZHR.mjs.map +1 -0
- package/dist/sdk/chunk-V75NEIXL.mjs +296 -0
- package/dist/sdk/chunk-V75NEIXL.mjs.map +1 -0
- package/dist/sdk/chunk-ZOF5QT6U.mjs +5943 -0
- package/dist/sdk/chunk-ZOF5QT6U.mjs.map +1 -0
- package/dist/sdk/{config-TSA5FUOM.mjs → config-2STD74CJ.mjs} +2 -2
- package/dist/sdk/config-JE4HKTWW.mjs +16 -0
- package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs → failure-condition-evaluator-5DZYMCGW.mjs} +4 -4
- package/dist/sdk/failure-condition-evaluator-R6DCDJAV.mjs +18 -0
- package/dist/sdk/{github-frontend-3SDFCCKI.mjs → github-frontend-3PSCKPAJ.mjs} +4 -4
- package/dist/sdk/github-frontend-L3F5JXPJ.mjs +1394 -0
- package/dist/sdk/github-frontend-L3F5JXPJ.mjs.map +1 -0
- package/dist/sdk/{host-QE4L7UXE.mjs → host-54CHV2LW.mjs} +3 -3
- package/dist/sdk/{host-VBBSLUWG.mjs → host-WAU6CT42.mjs} +3 -3
- package/dist/sdk/{host-CVH2CSHM.mjs → host-X5ZZCEWN.mjs} +2 -2
- package/dist/sdk/{routing-YVMTKFDZ.mjs → routing-CVQT4KHX.mjs} +5 -5
- package/dist/sdk/routing-EBAE5SSO.mjs +26 -0
- package/dist/sdk/{schedule-tool-Z5VG67JK.mjs → schedule-tool-POY3CDZL.mjs} +7 -7
- package/dist/sdk/{schedule-tool-ADUXTCY7.mjs → schedule-tool-R2OAATUS.mjs} +7 -7
- package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs → schedule-tool-Z6QYL2B3.mjs} +3 -3
- package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs → schedule-tool-handler-J4NUETJ6.mjs} +3 -3
- package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs → schedule-tool-handler-JMAKHPI7.mjs} +7 -7
- package/dist/sdk/{schedule-tool-handler-QOJVFRB4.mjs → schedule-tool-handler-MWFUIQKR.mjs} +7 -7
- package/dist/sdk/sdk.d.mts +33 -0
- package/dist/sdk/sdk.d.ts +33 -0
- package/dist/sdk/sdk.js +2058 -342
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +6 -6
- package/dist/sdk/task-evaluator-HLNXKKVV.mjs +1278 -0
- package/dist/sdk/task-evaluator-HLNXKKVV.mjs.map +1 -0
- package/dist/sdk/{trace-helpers-KXDOJWBL.mjs → trace-helpers-HL5FBX65.mjs} +3 -3
- package/dist/sdk/trace-helpers-WJXYVV4S.mjs +29 -0
- package/dist/sdk/trace-helpers-WJXYVV4S.mjs.map +1 -0
- package/dist/sdk/trace-reader-ZY77OFNM.mjs +266 -0
- package/dist/sdk/trace-reader-ZY77OFNM.mjs.map +1 -0
- package/dist/sdk/track-execution-MKIQXP2C.mjs +136 -0
- package/dist/sdk/track-execution-MKIQXP2C.mjs.map +1 -0
- package/dist/sdk/track-execution-YUXQ6WQH.mjs +136 -0
- package/dist/sdk/track-execution-YUXQ6WQH.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs → workflow-check-provider-SE5I7EMA.mjs} +7 -7
- package/dist/sdk/workflow-check-provider-SE5I7EMA.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs → workflow-check-provider-VKYGI5GK.mjs} +3 -3
- package/dist/sdk/workflow-check-provider-VKYGI5GK.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-CJXW2Z4F.mjs → workflow-check-provider-YDGZRI3Z.mjs} +7 -7
- package/dist/sdk/workflow-check-provider-YDGZRI3Z.mjs.map +1 -0
- package/dist/slack/socket-runner.d.ts +12 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/teams/webhook-runner.d.ts +4 -0
- package/dist/teams/webhook-runner.d.ts.map +1 -1
- package/dist/telegram/polling-runner.d.ts +2 -0
- package/dist/telegram/polling-runner.d.ts.map +1 -1
- package/dist/traces/{run-2026-03-17T13-58-29-402Z.ndjson → run-2026-03-18T19-02-50-465Z.ndjson} +84 -84
- package/dist/{output/traces/run-2026-03-17T13-59-10-403Z.ndjson → traces/run-2026-03-18T19-03-30-428Z.ndjson} +2037 -2037
- package/dist/types/config.d.ts +33 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/whatsapp/webhook-runner.d.ts +4 -0
- package/dist/whatsapp/webhook-runner.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/sdk/a2a-frontend-BDACLGMA.mjs.map +0 -1
- package/dist/sdk/a2a-frontend-IWOUJOIZ.mjs.map +0 -1
- package/dist/sdk/chunk-4DVP6KVC.mjs.map +0 -1
- package/dist/sdk/chunk-DGIH6EX3.mjs.map +0 -1
- package/dist/sdk/chunk-QGBASDYP.mjs.map +0 -1
- package/dist/sdk/chunk-VMVIM4JB.mjs.map +0 -1
- /package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs.map → check-provider-registry-MHXQGUNN.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs.map → check-provider-registry-RRWCXSTG.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-67ZLGDDQ.mjs.map → check-provider-registry-Y33CRFVD.mjs.map} +0 -0
- /package/dist/sdk/{chunk-VXC2XNQJ.mjs.map → chunk-5J3DNRF7.mjs.map} +0 -0
- /package/dist/sdk/{chunk-7YZSSO4X.mjs.map → chunk-6DPPP7LD.mjs.map} +0 -0
- /package/dist/sdk/{chunk-J73GEFPT.mjs.map → chunk-DHETLQIX.mjs.map} +0 -0
- /package/dist/sdk/{config-TSA5FUOM.mjs.map → config-2STD74CJ.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs.map → config-JE4HKTWW.mjs.map} +0 -0
- /package/dist/sdk/{routing-YVMTKFDZ.mjs.map → failure-condition-evaluator-5DZYMCGW.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-ADUXTCY7.mjs.map → failure-condition-evaluator-R6DCDJAV.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-3SDFCCKI.mjs.map → github-frontend-3PSCKPAJ.mjs.map} +0 -0
- /package/dist/sdk/{host-CVH2CSHM.mjs.map → host-54CHV2LW.mjs.map} +0 -0
- /package/dist/sdk/{host-QE4L7UXE.mjs.map → host-WAU6CT42.mjs.map} +0 -0
- /package/dist/sdk/{host-VBBSLUWG.mjs.map → host-X5ZZCEWN.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-Z5VG67JK.mjs.map → routing-CVQT4KHX.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs.map → routing-EBAE5SSO.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs.map → schedule-tool-POY3CDZL.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs.map → schedule-tool-R2OAATUS.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-QOJVFRB4.mjs.map → schedule-tool-Z6QYL2B3.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-KXDOJWBL.mjs.map → schedule-tool-handler-J4NUETJ6.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-CJXW2Z4F.mjs.map → schedule-tool-handler-JMAKHPI7.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs.map → schedule-tool-handler-MWFUIQKR.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs.map → trace-helpers-HL5FBX65.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agent-protocol/task-store.ts","../../src/agent-protocol/task-stream-manager.ts","../../src/agent-protocol/push-notification-manager.ts","../../src/agent-protocol/task-queue.ts","../../src/agent-protocol/a2a-frontend.ts"],"sourcesContent":["/**\n * Persistent task store for agent protocol tasks.\n *\n * SQLite-backed (reuses the better-sqlite3 pattern from scheduler).\n * Stores agent tasks with full state machine enforcement.\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport { logger } from '../logger';\nimport {\n AgentTask,\n AgentMessage,\n AgentArtifact,\n AgentSendMessageConfig,\n TaskState,\n TaskNotFoundError,\n ContextMismatchError,\n} from './types';\nimport { assertValidTransition } from './state-transitions';\n\n// ---------------------------------------------------------------------------\n// better-sqlite3 type declarations (avoid compile-time import)\n// ---------------------------------------------------------------------------\n\ninterface BetterSqliteDatabase {\n pragma(source: string): unknown;\n exec(source: string): void;\n prepare(source: string): BetterSqliteStatement;\n close(): void;\n}\n\ninterface BetterSqliteStatement {\n run(...params: unknown[]): { changes: number };\n get(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n}\n\n// ---------------------------------------------------------------------------\n// Database row shape\n// ---------------------------------------------------------------------------\n\ninterface TaskRow {\n id: string;\n context_id: string;\n state: string;\n created_at: string;\n updated_at: string;\n request_message: string; // JSON\n request_config: string | null; // JSON\n request_metadata: string | null; // JSON\n status_message: string | null; // JSON\n artifacts: string; // JSON array\n history: string; // JSON array\n workflow_id: string | null;\n run_id: string | null;\n claimed_by: string | null;\n claimed_at: string | null;\n expires_at: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction safeJsonParse<T = unknown>(value: string | null): T | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction nowISO(): string {\n return new Date().toISOString();\n}\n\nfunction taskRowToAgentTask(row: TaskRow): AgentTask {\n return {\n id: row.id,\n context_id: row.context_id,\n status: {\n state: row.state as TaskState,\n message: safeJsonParse<AgentMessage>(row.status_message),\n timestamp: row.updated_at,\n },\n artifacts: safeJsonParse<AgentArtifact[]>(row.artifacts) ?? [],\n history: safeJsonParse<AgentMessage[]>(row.history) ?? [],\n metadata: safeJsonParse<Record<string, unknown>>(row.request_metadata),\n workflow_id: row.workflow_id ?? undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// TaskStore Interface\n// ---------------------------------------------------------------------------\n\nexport interface CreateTaskParams {\n contextId: string;\n requestMessage: AgentMessage;\n requestConfig?: AgentSendMessageConfig;\n requestMetadata?: Record<string, unknown>;\n workflowId?: string;\n expiresAt?: string; // ISO 8601\n}\n\nexport interface ListTasksFilter {\n contextId?: string;\n state?: TaskState[];\n workflowId?: string;\n search?: string; // text search in request_message\n claimedBy?: string; // filter by instance/worker\n limit?: number; // default 50, max 200\n offset?: number;\n}\n\n/** Raw task row for queue monitoring — includes claim metadata. */\nexport interface TaskQueueRow {\n id: string;\n context_id: string;\n state: TaskState;\n created_at: string;\n updated_at: string;\n claimed_by: string | null;\n claimed_at: string | null;\n workflow_id: string | null;\n run_id: string | null;\n request_message: string; // first message text (extracted)\n source: string; // extracted from request_metadata.source\n metadata: Record<string, unknown>; // full request_metadata\n}\n\nexport interface ListTasksResult {\n tasks: AgentTask[];\n total: number;\n}\n\nexport interface TaskStore {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n\n // CRUD\n createTask(params: CreateTaskParams): AgentTask;\n getTask(taskId: string): AgentTask | null;\n listTasks(filter: ListTasksFilter): ListTasksResult;\n\n // State mutations\n updateTaskState(taskId: string, newState: TaskState, statusMessage?: AgentMessage): void;\n /** Set claimed_by/claimed_at on a task (used by trackExecution to record instance ID). */\n claimTask(taskId: string, workerId: string): void;\n addArtifact(taskId: string, artifact: AgentArtifact): void;\n appendHistory(taskId: string, message: AgentMessage): void;\n setRunId(taskId: string, runId: string): void;\n\n // Queue operations (Milestone 4)\n claimNextSubmitted(workerId: string): AgentTask | null;\n reclaimStaleTasks(workerId: string, staleTimeoutMs?: number): AgentTask[];\n releaseClaim(taskId: string): void;\n\n // Queue monitoring (optional — only SqliteTaskStore implements this)\n listTasksRaw?(filter: ListTasksFilter): { rows: TaskQueueRow[]; total: number };\n\n // Cleanup & recovery\n /** Mark all 'working' tasks as 'failed' (crash recovery on startup). */\n failStaleTasks(reason?: string): number;\n /** Mark 'working' tasks older than the given age as 'failed' (runtime stale detection). */\n failStaleTasksByAge(olderThanMs: number, reason?: string): number;\n /** Delete completed/failed/canceled tasks older than the given age. */\n purgeOldTasks(olderThanMs: number): number;\n deleteExpiredTasks(): string[];\n deleteTask(taskId: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// SQLite Implementation\n// ---------------------------------------------------------------------------\n\nexport class SqliteTaskStore implements TaskStore {\n private db: BetterSqliteDatabase | null = null;\n private dbPath: string;\n\n constructor(filename?: string) {\n this.dbPath = filename || '.visor/agent-tasks.db';\n }\n\n async initialize(): Promise<void> {\n const resolvedPath = path.resolve(process.cwd(), this.dbPath);\n const dir = path.dirname(resolvedPath);\n fs.mkdirSync(dir, { recursive: true });\n\n // Load better-sqlite3 via createRequire (ncc-safe)\n const { createRequire } = require('module') as typeof import('module');\n const runtimeRequire = createRequire(__filename);\n let Database: new (filename: string) => BetterSqliteDatabase;\n try {\n Database = runtimeRequire('better-sqlite3');\n } catch (err: unknown) {\n const code = (err as { code?: string })?.code;\n if (code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND') {\n throw new Error(\n 'better-sqlite3 is required for agent protocol task storage. ' +\n 'Install it with: npm install better-sqlite3'\n );\n }\n throw err;\n }\n\n this.db = new Database(resolvedPath);\n this.db.pragma('journal_mode = WAL');\n this.migrateSchema();\n logger.info(`[AgentTaskStore] Initialized at ${this.dbPath}`);\n }\n\n async shutdown(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n private getDb(): BetterSqliteDatabase {\n if (!this.db) throw new Error('TaskStore not initialized');\n return this.db;\n }\n\n /** Expose the underlying database for sibling managers (e.g. PushNotificationManager). */\n getDatabase(): unknown {\n return this.getDb();\n }\n\n private migrateSchema(): void {\n const db = this.getDb();\n db.exec(`\n CREATE TABLE IF NOT EXISTS agent_tasks (\n id TEXT PRIMARY KEY,\n context_id TEXT NOT NULL,\n state TEXT NOT NULL DEFAULT 'submitted',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n request_message TEXT NOT NULL,\n request_config TEXT,\n request_metadata TEXT,\n status_message TEXT,\n artifacts TEXT DEFAULT '[]',\n history TEXT DEFAULT '[]',\n workflow_id TEXT,\n run_id TEXT,\n claimed_by TEXT,\n claimed_at TEXT,\n expires_at TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_agent_tasks_context ON agent_tasks(context_id);\n CREATE INDEX IF NOT EXISTS idx_agent_tasks_state ON agent_tasks(state);\n CREATE INDEX IF NOT EXISTS idx_agent_tasks_updated ON agent_tasks(updated_at);\n CREATE INDEX IF NOT EXISTS idx_agent_tasks_claim ON agent_tasks(state, claimed_by, claimed_at);\n CREATE INDEX IF NOT EXISTS idx_agent_tasks_expires ON agent_tasks(expires_at);\n `);\n }\n\n // -------------------------------------------------------------------------\n // CRUD\n // -------------------------------------------------------------------------\n\n createTask(params: CreateTaskParams): AgentTask {\n const db = this.getDb();\n const id = crypto.randomUUID();\n const now = nowISO();\n const contextId = this.resolveContextId(params.requestMessage, params.contextId);\n\n const expiresAt = params.expiresAt ?? null;\n\n db.prepare(\n `INSERT INTO agent_tasks\n (id, context_id, state, created_at, updated_at,\n request_message, request_config, request_metadata,\n workflow_id, expires_at, artifacts, history)\n VALUES (?, ?, 'submitted', ?, ?,\n ?, ?, ?,\n ?, ?, '[]', '[]')`\n ).run(\n id,\n contextId,\n now,\n now,\n JSON.stringify(params.requestMessage),\n params.requestConfig ? JSON.stringify(params.requestConfig) : null,\n params.requestMetadata ? JSON.stringify(params.requestMetadata) : null,\n params.workflowId ?? null,\n expiresAt\n );\n\n return {\n id,\n context_id: contextId,\n status: { state: 'submitted', timestamp: now },\n artifacts: [],\n history: [],\n metadata: params.requestMetadata,\n workflow_id: params.workflowId,\n };\n }\n\n getTask(taskId: string): AgentTask | null {\n const db = this.getDb();\n const row = db.prepare('SELECT * FROM agent_tasks WHERE id = ?').get(taskId) as\n | TaskRow\n | undefined;\n return row ? taskRowToAgentTask(row) : null;\n }\n\n private buildFilterClause(filter: ListTasksFilter): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (filter.contextId) {\n conditions.push('context_id = ?');\n params.push(filter.contextId);\n }\n if (filter.state && filter.state.length > 0) {\n const placeholders = filter.state.map(() => '?').join(', ');\n conditions.push(`state IN (${placeholders})`);\n params.push(...filter.state);\n }\n if (filter.workflowId) {\n conditions.push('workflow_id = ?');\n params.push(filter.workflowId);\n }\n if (filter.search) {\n // Escape SQL LIKE wildcards to prevent wildcard injection\n const escaped = filter.search.replace(/[%_\\\\]/g, '\\\\$&');\n conditions.push(\"request_message LIKE ? ESCAPE '\\\\'\");\n params.push(`%${escaped}%`);\n }\n if (filter.claimedBy) {\n conditions.push('claimed_by = ?');\n params.push(filter.claimedBy);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n return { where, params };\n }\n\n listTasks(filter: ListTasksFilter): ListTasksResult {\n const db = this.getDb();\n const { where, params } = this.buildFilterClause(filter);\n\n const countRow = db\n .prepare(`SELECT COUNT(*) as total FROM agent_tasks ${where}`)\n .get(...params) as { total: number };\n const total = countRow.total;\n\n const limit = Math.min(filter.limit ?? 50, 200);\n const offset = filter.offset ?? 0;\n const rows = db\n .prepare(`SELECT * FROM agent_tasks ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as TaskRow[];\n\n return {\n tasks: rows.map(taskRowToAgentTask),\n total,\n };\n }\n\n listTasksRaw(filter: ListTasksFilter): { rows: TaskQueueRow[]; total: number } {\n const db = this.getDb();\n const { where, params } = this.buildFilterClause(filter);\n\n const countRow = db\n .prepare(`SELECT COUNT(*) as total FROM agent_tasks ${where}`)\n .get(...params) as { total: number };\n const total = countRow.total;\n\n const limit = Math.min(filter.limit ?? 50, 200);\n const offset = filter.offset ?? 0;\n const rawRows = db\n .prepare(`SELECT * FROM agent_tasks ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as TaskRow[];\n\n const rows: TaskQueueRow[] = rawRows.map(r => {\n let messageText = '';\n try {\n const msg = JSON.parse(r.request_message);\n const parts = msg.parts ?? msg.content?.parts ?? [];\n const textPart = parts.find((p: any) => p.type === 'text' || typeof p.text === 'string');\n messageText = textPart?.text ?? '';\n } catch {}\n let source = '-';\n let metadata: Record<string, unknown> = {};\n try {\n metadata = JSON.parse(r.request_metadata || '{}');\n source = (metadata.source as string) || '-';\n } catch {}\n return {\n id: r.id,\n context_id: r.context_id,\n state: r.state as TaskState,\n created_at: r.created_at,\n updated_at: r.updated_at,\n claimed_by: r.claimed_by,\n claimed_at: r.claimed_at,\n workflow_id: r.workflow_id,\n run_id: r.run_id,\n request_message: messageText,\n source,\n metadata,\n };\n });\n\n return { rows, total };\n }\n\n // -------------------------------------------------------------------------\n // State mutations\n // -------------------------------------------------------------------------\n\n updateTaskState(taskId: string, newState: TaskState, statusMessage?: AgentMessage): void {\n const db = this.getDb();\n const row = db.prepare('SELECT state FROM agent_tasks WHERE id = ?').get(taskId) as\n | { state: string }\n | undefined;\n\n if (!row) throw new TaskNotFoundError(taskId);\n\n assertValidTransition(row.state as TaskState, newState);\n\n const now = nowISO();\n db.prepare(\n `UPDATE agent_tasks\n SET state = ?, updated_at = ?, status_message = ?\n WHERE id = ?`\n ).run(newState, now, statusMessage ? JSON.stringify(statusMessage) : null, taskId);\n }\n\n claimTask(taskId: string, workerId: string): void {\n const db = this.getDb();\n const now = nowISO();\n db.prepare(\n `UPDATE agent_tasks SET claimed_by = ?, claimed_at = ?, updated_at = ? WHERE id = ?`\n ).run(workerId, now, now, taskId);\n }\n\n addArtifact(taskId: string, artifact: AgentArtifact): void {\n const db = this.getDb();\n const row = db.prepare('SELECT artifacts FROM agent_tasks WHERE id = ?').get(taskId) as\n | { artifacts: string }\n | undefined;\n\n if (!row) throw new TaskNotFoundError(taskId);\n\n const artifacts = safeJsonParse<AgentArtifact[]>(row.artifacts) ?? [];\n artifacts.push(artifact);\n\n db.prepare('UPDATE agent_tasks SET artifacts = ?, updated_at = ? WHERE id = ?').run(\n JSON.stringify(artifacts),\n nowISO(),\n taskId\n );\n }\n\n appendHistory(taskId: string, message: AgentMessage): void {\n const db = this.getDb();\n const row = db.prepare('SELECT history FROM agent_tasks WHERE id = ?').get(taskId) as\n | { history: string }\n | undefined;\n\n if (!row) throw new TaskNotFoundError(taskId);\n\n const history = safeJsonParse<AgentMessage[]>(row.history) ?? [];\n history.push(message);\n\n db.prepare('UPDATE agent_tasks SET history = ?, updated_at = ? WHERE id = ?').run(\n JSON.stringify(history),\n nowISO(),\n taskId\n );\n }\n\n setRunId(taskId: string, runId: string): void {\n const db = this.getDb();\n const result = db\n .prepare('UPDATE agent_tasks SET run_id = ?, updated_at = ? WHERE id = ?')\n .run(runId, nowISO(), taskId);\n\n if (result.changes === 0) throw new TaskNotFoundError(taskId);\n }\n\n // -------------------------------------------------------------------------\n // Queue operations\n // -------------------------------------------------------------------------\n\n claimNextSubmitted(workerId: string): AgentTask | null {\n const db = this.getDb();\n const now = nowISO();\n\n // Atomic claim: find oldest unclaimed SUBMITTED task only.\n // Does NOT touch 'working' tasks — those are handled separately by\n // reclaimStaleTasks() to avoid reclaiming genuinely-running long tasks.\n const row = db\n .prepare(\n `UPDATE agent_tasks\n SET state = 'working', claimed_by = ?, claimed_at = ?, updated_at = ?\n WHERE id = (\n SELECT id FROM agent_tasks\n WHERE state = 'submitted'\n AND claimed_by IS NULL\n ORDER BY created_at ASC\n LIMIT 1\n )\n RETURNING *`\n )\n .get(workerId, now, now) as TaskRow | undefined;\n\n return row ? taskRowToAgentTask(row) : null;\n }\n\n reclaimStaleTasks(_workerId: string, staleTimeoutMs?: number): AgentTask[] {\n const db = this.getDb();\n const now = nowISO();\n const staleTimeoutSec = Math.floor((staleTimeoutMs ?? 300_000) / 1000);\n\n // Reclaim tasks stuck in 'working' state whose claim has expired.\n // Resets them to 'submitted' so they re-enter the normal claim queue.\n const rows = db\n .prepare(\n `UPDATE agent_tasks\n SET state = 'submitted', claimed_by = NULL, claimed_at = NULL, updated_at = ?\n WHERE state = 'working'\n AND claimed_at IS NOT NULL\n AND claimed_at < datetime('now', '-' || ? || ' seconds')\n RETURNING *`\n )\n .all(now, staleTimeoutSec) as TaskRow[];\n\n return rows.map(taskRowToAgentTask);\n }\n\n releaseClaim(taskId: string): void {\n const db = this.getDb();\n db.prepare(\n `UPDATE agent_tasks\n SET state = 'submitted', claimed_by = NULL, claimed_at = NULL, updated_at = ?\n WHERE id = ? AND state = 'working'`\n ).run(nowISO(), taskId);\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n failStaleTasks(reason?: string): number {\n const db = this.getDb();\n const now = nowISO();\n const msg = reason || 'Process terminated while task was running';\n const statusMessage = JSON.stringify({\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: msg }],\n });\n const result = db\n .prepare(\n `UPDATE agent_tasks\n SET state = 'failed', updated_at = ?, status_message = ?\n WHERE state = 'working'`\n )\n .run(now, statusMessage);\n return result.changes;\n }\n\n failStaleTasksByAge(olderThanMs: number, reason?: string): number {\n const db = this.getDb();\n const now = nowISO();\n const cutoff = new Date(Date.now() - olderThanMs).toISOString();\n const msg = reason || 'Task exceeded maximum working duration';\n const statusMessage = JSON.stringify({\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: msg }],\n });\n const result = db\n .prepare(\n `UPDATE agent_tasks\n SET state = 'failed', updated_at = ?, status_message = ?\n WHERE state = 'working'\n AND updated_at <= ?`\n )\n .run(now, statusMessage, cutoff);\n return result.changes;\n }\n\n purgeOldTasks(olderThanMs: number): number {\n const db = this.getDb();\n const cutoff = new Date(Date.now() - olderThanMs).toISOString();\n const result = db\n .prepare(\n `DELETE FROM agent_tasks\n WHERE state IN ('completed', 'failed', 'canceled', 'rejected')\n AND updated_at <= ?`\n )\n .run(cutoff);\n return result.changes;\n }\n\n deleteExpiredTasks(): string[] {\n const db = this.getDb();\n const now = nowISO();\n\n // Collect IDs first so callers can cascade-delete related data (e.g. push configs)\n const rows = db\n .prepare('SELECT id FROM agent_tasks WHERE expires_at IS NOT NULL AND expires_at < ?')\n .all(now) as { id: string }[];\n\n if (rows.length > 0) {\n db.prepare('DELETE FROM agent_tasks WHERE expires_at IS NOT NULL AND expires_at < ?').run(\n now\n );\n }\n\n return rows.map(r => r.id);\n }\n\n deleteTask(taskId: string): void {\n const db = this.getDb();\n db.prepare('DELETE FROM agent_tasks WHERE id = ?').run(taskId);\n }\n\n // -------------------------------------------------------------------------\n // Context ID resolution\n // -------------------------------------------------------------------------\n\n private resolveContextId(message: AgentMessage, providedContextId: string): string {\n // If message has task_id, check for context consistency\n if (message.task_id) {\n const existingTask = this.getTask(message.task_id);\n if (existingTask) {\n if (message.context_id && message.context_id !== existingTask.context_id) {\n throw new ContextMismatchError(message.context_id, existingTask.context_id);\n }\n return existingTask.context_id;\n }\n }\n\n // Use message context_id if provided, otherwise use the provided contextId param\n return message.context_id ?? providedContextId;\n }\n}\n","/**\n * TaskStreamManager — manages SSE subscribers for task updates.\n *\n * Provides subscribe/emit/cleanup for real-time task event streaming.\n * Each subscriber is an HTTP ServerResponse that receives SSE events.\n */\n\nimport http from 'http';\nimport type { TaskStatusUpdateEvent, TaskArtifactUpdateEvent } from './types';\nimport { isTerminalState } from './state-transitions';\n\nexport type TaskEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\nexport class TaskStreamManager {\n private subscribers = new Map<string, Set<http.ServerResponse>>();\n private keepaliveTimers = new Map<http.ServerResponse, ReturnType<typeof setInterval>>();\n private keepaliveIntervalMs: number;\n\n constructor(keepaliveIntervalMs = 30_000) {\n this.keepaliveIntervalMs = keepaliveIntervalMs;\n }\n\n /**\n * Subscribe an HTTP response to SSE events for a task.\n * Sets SSE headers and registers cleanup on disconnect.\n */\n subscribe(taskId: string, res: http.ServerResponse): void {\n // Set SSE headers\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n\n if (!this.subscribers.has(taskId)) {\n this.subscribers.set(taskId, new Set());\n }\n this.subscribers.get(taskId)!.add(res);\n\n // Clean up on disconnect\n res.on('close', () => {\n this.removeSubscriber(taskId, res);\n });\n\n // Send keepalive every N seconds\n const timer = setInterval(() => {\n if (res.writable) {\n res.write(': keepalive\\n\\n');\n } else {\n this.removeSubscriber(taskId, res);\n }\n }, this.keepaliveIntervalMs);\n this.keepaliveTimers.set(res, timer);\n }\n\n /**\n * Emit an event to all subscribers of a task.\n * If the event is a terminal status update, closes all connections.\n */\n emit(taskId: string, event: TaskEvent): void {\n const subs = this.subscribers.get(taskId);\n if (!subs || subs.size === 0) return;\n\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\n for (const res of subs) {\n if (res.writable) {\n res.write(data);\n }\n }\n\n // If terminal state, close all connections for this task\n if (event.type === 'TaskStatusUpdateEvent' && isTerminalState(event.status.state)) {\n for (const res of subs) {\n this.clearKeepalive(res);\n if (res.writable) {\n res.end();\n }\n }\n this.subscribers.delete(taskId);\n }\n }\n\n /**\n * Check if a task has any active subscribers.\n */\n hasSubscribers(taskId: string): boolean {\n return (this.subscribers.get(taskId)?.size ?? 0) > 0;\n }\n\n /**\n * Get count of subscribers for a task.\n */\n getSubscriberCount(taskId: string): number {\n return this.subscribers.get(taskId)?.size ?? 0;\n }\n\n /**\n * Close all connections and clean up.\n */\n shutdown(): void {\n for (const [, subs] of this.subscribers) {\n for (const res of subs) {\n this.clearKeepalive(res);\n if (res.writable) {\n res.end();\n }\n }\n subs.clear();\n }\n this.subscribers.clear();\n }\n\n private removeSubscriber(taskId: string, res: http.ServerResponse): void {\n this.clearKeepalive(res);\n const subs = this.subscribers.get(taskId);\n if (subs) {\n subs.delete(res);\n if (subs.size === 0) {\n this.subscribers.delete(taskId);\n }\n }\n }\n\n private clearKeepalive(res: http.ServerResponse): void {\n const timer = this.keepaliveTimers.get(res);\n if (timer) {\n clearInterval(timer);\n this.keepaliveTimers.delete(res);\n }\n }\n}\n","/**\n * PushNotificationManager — delivers webhook push notifications for task events.\n *\n * Persists push notification configs in the task store's SQLite database,\n * and delivers events via HTTP POST with retry logic.\n */\n\nimport crypto from 'crypto';\nimport { logger } from '../logger';\nimport type {\n AgentPushNotificationConfig,\n TaskStatusUpdateEvent,\n TaskArtifactUpdateEvent,\n} from './types';\n\nexport type PushEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ---------------------------------------------------------------------------\n// Database interface (minimal subset of better-sqlite3)\n// ---------------------------------------------------------------------------\n\ninterface PushConfigRow {\n id: string;\n task_id: string;\n url: string;\n token: string | null;\n auth_scheme: string | null;\n auth_credentials: string | null;\n created_at: string;\n}\n\ninterface DbLike {\n exec(source: string): void;\n prepare(source: string): {\n run(...params: unknown[]): { changes: number };\n get(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Manager\n// ---------------------------------------------------------------------------\n\nexport class PushNotificationManager {\n private db: DbLike | null = null;\n private maxRetries: number;\n private baseDelayMs: number;\n private deliveryTimeoutMs: number;\n\n constructor(options?: { maxRetries?: number; baseDelayMs?: number; deliveryTimeoutMs?: number }) {\n this.maxRetries = options?.maxRetries ?? 3;\n this.baseDelayMs = options?.baseDelayMs ?? 1000;\n this.deliveryTimeoutMs = options?.deliveryTimeoutMs ?? 10_000;\n }\n\n /**\n * Initialize with a database connection. Must be called before any operations.\n * Creates the push configs table if it doesn't exist.\n */\n initialize(db: DbLike): void {\n this.db = db;\n // Enable foreign key enforcement (must be set per-connection in SQLite)\n db.exec('PRAGMA foreign_keys = ON');\n this.migrateSchema();\n }\n\n private migrateSchema(): void {\n this.getDb().exec(`\n CREATE TABLE IF NOT EXISTS agent_push_configs (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL,\n url TEXT NOT NULL,\n token TEXT,\n auth_scheme TEXT,\n auth_credentials TEXT,\n created_at TEXT NOT NULL,\n FOREIGN KEY (task_id) REFERENCES agent_tasks(id) ON DELETE CASCADE\n );\n CREATE INDEX IF NOT EXISTS idx_agent_push_task ON agent_push_configs(task_id);\n `);\n }\n\n private getDb(): DbLike {\n if (!this.db) throw new Error('PushNotificationManager not initialized');\n return this.db;\n }\n\n // -------------------------------------------------------------------------\n // CRUD\n // -------------------------------------------------------------------------\n\n create(config: AgentPushNotificationConfig): AgentPushNotificationConfig {\n const db = this.getDb();\n const id = config.id ?? crypto.randomUUID();\n const now = new Date().toISOString();\n\n db.prepare(\n `INSERT INTO agent_push_configs (id, task_id, url, token, auth_scheme, auth_credentials, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`\n ).run(\n id,\n config.task_id,\n config.url,\n config.token ?? null,\n config.auth_scheme ?? null,\n config.auth_credentials ?? null,\n now\n );\n\n return { ...config, id };\n }\n\n get(taskId: string, configId: string): AgentPushNotificationConfig | null {\n const db = this.getDb();\n const row = db\n .prepare('SELECT * FROM agent_push_configs WHERE id = ? AND task_id = ?')\n .get(configId, taskId) as PushConfigRow | undefined;\n\n return row ? this.rowToConfig(row) : null;\n }\n\n list(taskId: string): AgentPushNotificationConfig[] {\n const db = this.getDb();\n const rows = db\n .prepare('SELECT * FROM agent_push_configs WHERE task_id = ? ORDER BY created_at ASC')\n .all(taskId) as PushConfigRow[];\n\n return rows.map(r => this.rowToConfig(r));\n }\n\n delete(taskId: string, configId: string): boolean {\n const db = this.getDb();\n const result = db\n .prepare('DELETE FROM agent_push_configs WHERE id = ? AND task_id = ?')\n .run(configId, taskId);\n return result.changes > 0;\n }\n\n deleteForTask(taskId: string): number {\n const db = this.getDb();\n const result = db.prepare('DELETE FROM agent_push_configs WHERE task_id = ?').run(taskId);\n return result.changes;\n }\n\n // -------------------------------------------------------------------------\n // Delivery\n // -------------------------------------------------------------------------\n\n /**\n * Deliver an event to all push configs registered for a task.\n * Uses exponential backoff retry for server errors.\n */\n async notifyAll(taskId: string, event: PushEvent): Promise<void> {\n const configs = this.list(taskId);\n if (configs.length === 0) return;\n\n const deliveries = configs.map(config => this.deliver(config, event));\n await Promise.allSettled(deliveries);\n }\n\n private async deliver(config: AgentPushNotificationConfig, event: PushEvent): Promise<void> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (config.auth_scheme && config.auth_credentials) {\n headers['Authorization'] = `${config.auth_scheme} ${config.auth_credentials}`;\n }\n\n const body = JSON.stringify(event);\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const resp = await fetch(config.url, {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(this.deliveryTimeoutMs),\n });\n if (resp.ok) return;\n if (resp.status >= 400 && resp.status < 500) {\n // Client error, don't retry\n logger.warn(`Push notification to ${config.url} returned ${resp.status}, not retrying`);\n return;\n }\n // Server error, retry\n } catch (err) {\n logger.warn(\n `Push notification delivery attempt ${attempt + 1} failed for ${config.url}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n if (attempt < this.maxRetries - 1) {\n await new Promise(r => setTimeout(r, this.baseDelayMs * Math.pow(2, attempt)));\n }\n }\n logger.error(\n `Push notification delivery failed after ${this.maxRetries} attempts for task ${config.task_id} to ${config.url}`\n );\n }\n\n private rowToConfig(row: PushConfigRow): AgentPushNotificationConfig {\n return {\n id: row.id,\n task_id: row.task_id,\n url: row.url,\n token: row.token ?? undefined,\n auth_scheme: row.auth_scheme ?? undefined,\n auth_credentials: row.auth_credentials ?? undefined,\n };\n }\n}\n","/**\n * Async task queue for agent protocol tasks.\n *\n * Polls the task store for SUBMITTED tasks, claims them, and executes\n * them via the engine. Same polling pattern as the scheduler.\n */\n\nimport crypto from 'crypto';\nimport { logger } from '../logger';\nimport type { TaskStore } from './task-store';\nimport type { AgentTask, AgentMessage } from './types';\nimport { withActiveSpan } from '../telemetry/trace-helpers';\n\n// ---------------------------------------------------------------------------\n// Queue config\n// ---------------------------------------------------------------------------\n\nexport interface TaskQueueConfig {\n pollInterval: number; // ms, default 1000\n maxConcurrent: number; // default 5\n staleClaimTimeout: number; // ms, default 300000\n}\n\nconst DEFAULT_CONFIG: TaskQueueConfig = {\n pollInterval: 1000,\n maxConcurrent: 5,\n staleClaimTimeout: 300_000,\n};\n\n// ---------------------------------------------------------------------------\n// Execute callback type\n// ---------------------------------------------------------------------------\n\nexport type TaskExecutor = (task: AgentTask) => Promise<{\n success: boolean;\n checkResults?: Record<string, unknown>;\n error?: string;\n summary?: string;\n /** When true, the executor already set the terminal state — the queue should skip its own transition. */\n stateAlreadySet?: boolean;\n}>;\n\n// ---------------------------------------------------------------------------\n// TaskQueue\n// ---------------------------------------------------------------------------\n\nexport class TaskQueue {\n private running = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private activeCount = 0;\n private config: TaskQueueConfig;\n private workerId: string;\n\n constructor(\n private taskStore: TaskStore,\n private executor: TaskExecutor,\n _eventBus: unknown,\n config?: Partial<TaskQueueConfig>,\n workerId?: string\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.workerId = workerId ?? crypto.randomUUID();\n }\n\n start(): void {\n this.running = true;\n this.schedulePoll();\n logger.info(\n `Task queue started (worker=${this.workerId}, maxConcurrent=${this.config.maxConcurrent})`\n );\n }\n\n async stop(): Promise<void> {\n this.running = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n // Wait for active tasks to finish (with timeout)\n const shutdownTimeout = 30_000;\n const start = Date.now();\n while (this.activeCount > 0 && Date.now() - start < shutdownTimeout) {\n await new Promise(r => setTimeout(r, 100));\n }\n\n if (this.activeCount > 0) {\n logger.warn(`Task queue stopped with ${this.activeCount} active tasks`);\n }\n }\n\n getActiveCount(): number {\n return this.activeCount;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n private schedulePoll(): void {\n if (!this.running) return;\n this.timer = setTimeout(() => this.poll(), this.config.pollInterval);\n }\n\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n // Reclaim stale tasks from crashed workers back to 'submitted'\n this.taskStore.reclaimStaleTasks(this.workerId, this.config.staleClaimTimeout);\n\n while (this.activeCount < this.config.maxConcurrent) {\n const task = this.taskStore.claimNextSubmitted(this.workerId);\n if (!task) break;\n\n this.activeCount++;\n this.executeTask(task).finally(() => {\n this.activeCount--;\n });\n }\n } catch (err) {\n logger.error(`Task queue poll error: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n this.schedulePoll();\n }\n\n private async executeTask(task: AgentTask): Promise<void> {\n await withActiveSpan(\n 'agent.queue.execute',\n {\n 'agent.task.id': task.id,\n 'agent.queue.worker_id': this.workerId,\n },\n async () => this._executeTaskInner(task)\n );\n }\n\n private async _executeTaskInner(task: AgentTask): Promise<void> {\n try {\n // Task is already in WORKING state from claimNextSubmitted\n\n const result = await this.executor(task);\n\n // If the executor already handled the terminal state transition, we're done.\n if (result.stateAlreadySet) {\n return;\n }\n\n // Set terminal state\n if (result.success) {\n const completedMsg: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [\n {\n text: result.summary ?? 'Task completed successfully',\n media_type: 'text/markdown',\n },\n ],\n };\n this.taskStore.updateTaskState(task.id, 'completed', completedMsg);\n } else {\n this.taskStore.updateTaskState(task.id, 'failed', {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: result.error ?? 'Task execution failed' }],\n });\n }\n } catch (err) {\n logger.error(\n `Task ${task.id} execution failed: ${err instanceof Error ? err.message : String(err)}`\n );\n try {\n this.taskStore.updateTaskState(task.id, 'failed', {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: err instanceof Error ? err.message : 'Unknown error' }],\n });\n } catch {\n // ignore double-failure\n }\n }\n }\n}\n","/**\n * A2A Frontend — serves Visor as an A2A-compliant agent.\n *\n * Implements the A2A HTTP endpoints:\n * GET /.well-known/agent-card.json (public, no auth)\n * POST /message:send (auth required)\n * GET /tasks/{id} (auth required)\n * GET /tasks (auth required)\n * POST /tasks/{id}:cancel (auth required)\n *\n * Milestone 5 adds SSE streaming and push notifications.\n */\n\nimport http from 'http';\nimport https from 'https';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport { logger } from '../logger';\nimport type { ActiveFrontend, FrontendContext } from '../frontends/host';\nimport type { TaskStore } from './task-store';\nimport { SqliteTaskStore } from './task-store';\nimport type {\n AgentCard,\n AgentProtocolConfig,\n AgentMessage,\n AgentSendMessageRequest,\n AgentSendMessageResponse,\n AgentTask,\n AgentArtifact,\n AgentPart,\n AgentPushNotificationConfig,\n TaskState,\n TaskStatusUpdateEvent,\n TaskArtifactUpdateEvent,\n} from './types';\nimport {\n TaskNotFoundError,\n InvalidStateTransitionError,\n InvalidRequestError,\n ContextMismatchError,\n ParseError,\n} from './types';\nimport { isTerminalState } from './state-transitions';\nimport { TaskStreamManager } from './task-stream-manager';\nimport { PushNotificationManager } from './push-notification-manager';\nimport { TaskQueue } from './task-queue';\nimport type { TaskExecutor } from './task-queue';\nimport type { VisorConfig } from '../types/config';\nimport type { CheckExecutionOptions } from '../types/execution';\nimport { withActiveSpan } from '../telemetry/trace-helpers';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction readJsonBody(req: http.IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n try {\n const body = Buffer.concat(chunks).toString('utf8');\n resolve(body ? JSON.parse(body) : {});\n } catch {\n reject(new ParseError('Malformed JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\nfunction sendJson(res: http.ServerResponse, status: number, data: unknown): void {\n const body = JSON.stringify(data);\n res.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(body),\n });\n res.end(body);\n}\n\nfunction sendError(\n res: http.ServerResponse,\n httpStatus: number,\n message: string,\n code?: number\n): void {\n sendJson(res, httpStatus, {\n error: {\n code: code ?? -httpStatus,\n message,\n },\n });\n}\n\nfunction timingSafeEqual(a: string | undefined, b: string | undefined): boolean {\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n try {\n return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nfunction validateAuth(req: http.IncomingMessage, config: AgentProtocolConfig): boolean {\n if (!config.auth || config.auth.type === 'none') return true;\n\n if (config.auth.type === 'bearer') {\n const header = req.headers['authorization'];\n if (!header || !header.startsWith('Bearer ')) return false;\n const token = header.slice(7);\n const expected = config.auth.token_env ? process.env[config.auth.token_env] : undefined;\n return timingSafeEqual(token, expected);\n }\n\n if (config.auth.type === 'api_key') {\n const headerName = config.auth.header_name ?? 'x-api-key';\n const key = req.headers[headerName.toLowerCase()] as string | undefined;\n const expected = config.auth.key_env ? process.env[config.auth.key_env] : undefined;\n if (timingSafeEqual(key, expected)) return true;\n\n // Also check URL query parameters using param_name (default 'api_key')\n const paramName = config.auth.param_name ?? 'api_key';\n const url = new URL(req.url || '', 'http://localhost');\n const queryKey = url.searchParams.get(paramName) ?? undefined;\n return timingSafeEqual(queryKey, expected);\n }\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Workflow translation\n// ---------------------------------------------------------------------------\n\nfunction resolveWorkflow(req: AgentSendMessageRequest, config: AgentProtocolConfig): string {\n if (config.skill_routing && Object.keys(config.skill_routing).length > 0) {\n const requestedSkill = req.metadata?.skill_id as string | undefined;\n if (requestedSkill && config.skill_routing[requestedSkill]) {\n return config.skill_routing[requestedSkill];\n }\n }\n return config.default_workflow ?? 'assistant';\n}\n\nexport function messageToWorkflowInput(\n message: AgentMessage,\n task: AgentTask\n): Record<string, unknown> {\n const textContent = message.parts\n .filter(p => p.text != null)\n .map(p => p.text)\n .join('\\n');\n\n const dataParts = message.parts.filter(p => p.data != null);\n const structuredData =\n dataParts.length === 1\n ? dataParts[0].data\n : dataParts.length > 1\n ? dataParts.map(p => p.data)\n : undefined;\n\n const fileParts = message.parts.filter(p => p.url != null || p.raw != null);\n\n return {\n question: textContent,\n task: textContent,\n data: structuredData,\n files: fileParts.length > 0 ? fileParts : undefined,\n _agent: {\n task_id: task.id,\n context_id: task.context_id,\n message_id: message.message_id,\n metadata: message.metadata,\n },\n };\n}\n\n/** Convert engine check results to A2A artifacts (used by task queue in M4) */\nexport function resultToArtifacts(checkResults: Record<string, unknown>): AgentArtifact[] {\n const artifacts: AgentArtifact[] = [];\n\n for (const [checkId, checkResult] of Object.entries(checkResults ?? {})) {\n if (!checkResult || typeof checkResult !== 'object') continue;\n const cr = checkResult as Record<string, unknown>;\n if (cr.status === 'skipped') continue;\n\n const parts: AgentPart[] = [];\n\n if (typeof cr.output === 'string') {\n parts.push({ text: cr.output, media_type: 'text/markdown' });\n } else if (typeof cr.output === 'object' && cr.output !== null) {\n const output = cr.output as Record<string, unknown>;\n if ('text' in output && typeof output.text === 'string') {\n parts.push({ text: output.text, media_type: 'text/markdown' });\n }\n parts.push({ data: cr.output, media_type: 'application/json' });\n }\n\n if (Array.isArray(cr.issues) && cr.issues.length > 0) {\n parts.push({ data: cr.issues, media_type: 'application/json' });\n }\n\n if (parts.length > 0) {\n artifacts.push({\n artifact_id: crypto.randomUUID(),\n name: checkId,\n description: `Output from check: ${checkId}`,\n parts,\n });\n }\n }\n\n return artifacts;\n}\n\n// ---------------------------------------------------------------------------\n// A2A Frontend\n// ---------------------------------------------------------------------------\n\nexport class A2AFrontend implements ActiveFrontend {\n readonly name = 'a2a';\n\n private server: http.Server | https.Server | null = null;\n private taskStore: TaskStore;\n private agentCard: AgentCard | null = null;\n private config: AgentProtocolConfig;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private _ctx: FrontendContext | null = null;\n private streamManager = new TaskStreamManager();\n private pushManager = new PushNotificationManager();\n private _engine: any = null; // StateMachineExecutionEngine\n private _visorConfig: VisorConfig | null = null;\n private taskQueue: TaskQueue | null = null;\n\n private _boundPort = 0;\n\n constructor(config: AgentProtocolConfig, taskStore?: TaskStore) {\n this.config = config;\n this.taskStore = taskStore ?? new SqliteTaskStore();\n }\n\n /** The actual port the server is listening on (useful when config.port is 0). */\n get boundPort(): number {\n return this._boundPort;\n }\n\n /** Set the execution engine for running workflows. */\n setEngine(engine: any): void {\n this._engine = engine;\n }\n\n /** Set the full Visor config (needed for check definitions). */\n setVisorConfig(config: VisorConfig): void {\n this._visorConfig = config;\n }\n\n async start(ctx: FrontendContext): Promise<void> {\n this._ctx = ctx;\n\n // 1. Initialize task store\n await this.taskStore.initialize();\n\n // 2. Initialize push notification manager with shared db\n const db = (this.taskStore as SqliteTaskStore).getDatabase?.();\n if (db) {\n this.pushManager.initialize(db as any);\n }\n\n // 3. Pick up engine/visorConfig from FrontendContext (if provided)\n if (ctx.engine) this._engine = ctx.engine;\n if (ctx.visorConfig) this._visorConfig = ctx.visorConfig as VisorConfig;\n\n // 4. Load and validate agent card (file path → inline → none)\n if (this.config.agent_card) {\n const cardPath = this.config.agent_card;\n const raw = fs.readFileSync(cardPath, 'utf8');\n this.agentCard = JSON.parse(raw) as AgentCard;\n } else if (this.config.agent_card_inline) {\n this.agentCard = { ...this.config.agent_card_inline };\n }\n\n // URL patching deferred until after server.listen() so _boundPort is known\n\n // 5. Create HTTP server\n const handler = this.handleRequest.bind(this);\n if (this.config.tls) {\n const tlsOptions = {\n cert: fs.readFileSync(this.config.tls.cert),\n key: fs.readFileSync(this.config.tls.key),\n };\n this.server = https.createServer(tlsOptions, handler);\n } else {\n this.server = http.createServer(handler);\n }\n\n // 6. Subscribe to EventBus\n ctx.eventBus.on('CheckCompleted', (event: any) => {\n const envelope = event?.payload ? event : { payload: event };\n const taskId = envelope.metadata?.agentTaskId as string | undefined;\n if (!taskId) return;\n // Store intermediate artifacts and emit to streams\n try {\n const artifact = this.checkResultToArtifact(envelope.payload);\n if (artifact) {\n this.taskStore.addArtifact(taskId, artifact);\n const task = this.taskStore.getTask(taskId);\n if (task) {\n this.emitArtifactEvent(taskId, task.context_id, artifact, false, false);\n }\n }\n } catch {\n // ignore\n }\n });\n\n ctx.eventBus.on('CheckErrored', (event: any) => {\n const envelope = event?.payload ? event : { payload: event };\n const taskId = envelope.metadata?.agentTaskId as string | undefined;\n if (!taskId) return;\n logger.warn(`Agent task ${taskId}: check errored`);\n });\n\n ctx.eventBus.on('HumanInputRequested', (event: any) => {\n const envelope = event?.payload ? event : { payload: event };\n const taskId = envelope.metadata?.agentTaskId as string | undefined;\n if (!taskId) return;\n try {\n const statusMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: envelope.payload?.prompt ?? 'Agent requires input' }],\n };\n this.taskStore.updateTaskState(taskId, 'input_required', statusMessage);\n const task = this.taskStore.getTask(taskId);\n if (task) {\n this.emitStatusEvent(taskId, task.context_id, task.status);\n }\n } catch {\n // ignore\n }\n });\n\n // 7. Start cleanup sweep\n this.startCleanupSweep();\n\n // 8. Start TaskQueue if engine is available (for non-blocking task execution)\n if (this._engine && this._visorConfig) {\n const executor = this.createTaskExecutor();\n const queueCfg = this.config.queue;\n this.taskQueue = new TaskQueue(\n this.taskStore,\n executor,\n null,\n queueCfg\n ? {\n pollInterval: queueCfg.poll_interval,\n maxConcurrent: queueCfg.max_concurrent,\n staleClaimTimeout: queueCfg.stale_claim_timeout,\n }\n : undefined\n );\n this.taskQueue.start();\n logger.info('[A2A] TaskQueue started for async task execution');\n }\n\n // 9. Listen\n const port = this.config.port ?? 9000;\n const host = this.config.host ?? '0.0.0.0';\n await new Promise<void>(resolve => {\n this.server!.listen(port, host, () => {\n const addr = this.server!.address();\n this._boundPort = typeof addr === 'object' && addr ? addr.port : port;\n logger.info(`A2A server listening on ${host}:${this._boundPort}`);\n resolve();\n });\n });\n\n // Patch agent card URLs now that the bound port is known\n if (this.agentCard) {\n const publicUrl = this.config.public_url ?? `http://${host}:${this._boundPort}`;\n if (!this.agentCard.supported_interfaces?.length) {\n this.agentCard.supported_interfaces = [{ url: publicUrl, protocol_binding: 'a2a/v1' }];\n } else {\n for (const iface of this.agentCard.supported_interfaces) {\n // Patch interfaces that need a local URL: a2a/v1 binding, missing URL, placeholder,\n // localhost/0.0.0.0 addresses, or relative paths\n if (\n iface.protocol_binding === 'a2a/v1' ||\n !iface.url ||\n !iface.url.startsWith('http') ||\n iface.url.includes('localhost') ||\n iface.url.includes('0.0.0.0')\n ) {\n iface.url = publicUrl;\n }\n }\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopCleanupSweep();\n if (this.taskQueue) {\n this.taskQueue.stop();\n this.taskQueue = null;\n }\n this.streamManager.shutdown();\n if (this.server) {\n await new Promise<void>((resolve, reject) => {\n this.server!.close(err => (err ? reject(err) : resolve()));\n });\n this.server = null;\n }\n await this.taskStore.shutdown();\n }\n\n // -------------------------------------------------------------------------\n // HTTP request dispatcher\n // -------------------------------------------------------------------------\n\n private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n\n // Agent Card: public, no auth\n if (url.pathname === '/.well-known/agent-card.json' && req.method === 'GET') {\n return this.serveAgentCard(res);\n }\n\n // All other routes: require auth\n if (!validateAuth(req, this.config)) {\n return sendError(res, 401, 'Unauthorized');\n }\n\n try {\n // SendMessage\n if (url.pathname === '/message:send' && req.method === 'POST') {\n return await this.handleSendMessage(req, res);\n }\n // SendStreamingMessage\n if (url.pathname === '/message:stream' && req.method === 'POST') {\n if (!this.agentCard?.capabilities?.streaming) {\n return sendError(res, 400, 'Streaming not supported', -32002);\n }\n return await this.handleSendStreamingMessage(req, res);\n }\n\n // GetTask\n const taskMatch = url.pathname.match(/^\\/tasks\\/([^/:]+)$/);\n if (taskMatch && req.method === 'GET') {\n return this.handleGetTask(taskMatch[1], res);\n }\n\n // ListTasks\n if (url.pathname === '/tasks' && req.method === 'GET') {\n return this.handleListTasks(url.searchParams, res);\n }\n\n // CancelTask\n const cancelMatch = url.pathname.match(/^\\/tasks\\/([^/:]+):cancel$/);\n if (cancelMatch && req.method === 'POST') {\n return this.handleCancelTask(cancelMatch[1], res);\n }\n\n // SubscribeToTask\n const subscribeMatch = url.pathname.match(/^\\/tasks\\/([^/:]+):subscribe$/);\n if (subscribeMatch && req.method === 'GET') {\n if (!this.agentCard?.capabilities?.streaming) {\n return sendError(res, 400, 'Streaming not supported', -32002);\n }\n return this.handleSubscribeToTask(subscribeMatch[1], res);\n }\n\n // Push notification config routes\n const pushListMatch = url.pathname.match(/^\\/tasks\\/([^/:]+)\\/pushNotificationConfigs$/);\n if (pushListMatch) {\n if (!this.agentCard?.capabilities?.push_notifications) {\n return sendError(res, 400, 'Push notifications not supported', -32002);\n }\n if (req.method === 'POST') {\n return await this.handleCreatePushConfig(pushListMatch[1], req, res);\n }\n if (req.method === 'GET') {\n return this.handleListPushConfigs(pushListMatch[1], res);\n }\n }\n\n const pushDetailMatch = url.pathname.match(\n /^\\/tasks\\/([^/:]+)\\/pushNotificationConfigs\\/([^/:]+)$/\n );\n if (pushDetailMatch) {\n if (!this.agentCard?.capabilities?.push_notifications) {\n return sendError(res, 400, 'Push notifications not supported', -32002);\n }\n if (req.method === 'GET') {\n return this.handleGetPushConfig(pushDetailMatch[1], pushDetailMatch[2], res);\n }\n if (req.method === 'DELETE') {\n return this.handleDeletePushConfig(pushDetailMatch[1], pushDetailMatch[2], res);\n }\n }\n\n sendError(res, 404, 'MethodNotFound', -32601);\n } catch (err) {\n if (err instanceof ParseError) {\n return sendError(res, 400, err.message, -32700);\n }\n if (err instanceof TaskNotFoundError) {\n return sendError(res, 404, err.message, -32001);\n }\n if (err instanceof InvalidStateTransitionError) {\n return sendError(res, 409, err.message, -32003);\n }\n if (err instanceof InvalidRequestError) {\n return sendError(res, 400, err.message, -32600);\n }\n if (err instanceof ContextMismatchError) {\n return sendError(res, 400, err.message, -32600);\n }\n logger.error(`A2A request error: ${err instanceof Error ? err.message : String(err)}`);\n sendError(res, 500, 'Internal error');\n }\n }\n\n // -------------------------------------------------------------------------\n // Endpoint handlers\n // -------------------------------------------------------------------------\n\n private serveAgentCard(res: http.ServerResponse): void {\n if (!this.agentCard) {\n return sendError(res, 404, 'Agent Card not configured');\n }\n sendJson(res, 200, this.agentCard);\n }\n\n private async handleSendMessage(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): Promise<void> {\n const body = (await readJsonBody(req)) as AgentSendMessageRequest;\n\n if (!body.message?.parts?.length) {\n throw new InvalidRequestError('Message must contain at least one part');\n }\n\n // Check if follow-up to existing task\n const existingTaskId = body.message.task_id;\n if (existingTaskId) {\n const response = await this.handleFollowUpMessage(existingTaskId, body);\n return sendJson(res, 200, response);\n }\n\n // Resolve context\n const contextId = body.message.context_id ?? crypto.randomUUID();\n\n // Determine workflow\n const workflowId = resolveWorkflow(body, this.config);\n const blocking = body.configuration?.blocking ?? false;\n\n await withActiveSpan(\n 'agent.task',\n {\n 'agent.task.context_id': contextId,\n 'agent.task.workflow': workflowId,\n 'agent.task.blocking': blocking,\n 'agent.task.message_id': body.message.message_id ?? '',\n },\n async () => {\n // Create task\n const task = this.taskStore.createTask({\n contextId,\n requestMessage: body.message,\n requestConfig: body.configuration,\n requestMetadata: body.metadata,\n workflowId,\n });\n\n // Append user message to history\n this.taskStore.appendHistory(task.id, body.message);\n\n if (blocking) {\n // Execute synchronously\n await this.executeTaskDirectly(task, body.message);\n let finalTask = this.taskStore.getTask(task.id)!;\n\n // Respect history_length\n const historyLength = body.configuration?.history_length;\n if (historyLength !== undefined) {\n finalTask = {\n ...finalTask,\n history: finalTask.history.slice(-historyLength),\n };\n }\n\n // Filter accepted_output_modes\n if (body.configuration?.accepted_output_modes?.length) {\n finalTask = this.filterOutputModes(finalTask, body.configuration.accepted_output_modes);\n }\n\n return sendJson(res, 200, { task: finalTask });\n }\n\n // Non-blocking: return task immediately (queue picks it up in Milestone 4)\n return sendJson(res, 200, { task: this.taskStore.getTask(task.id)! });\n }\n );\n }\n\n private async handleFollowUpMessage(\n taskId: string,\n req: AgentSendMessageRequest\n ): Promise<AgentSendMessageResponse> {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n\n if (task.status.state !== 'input_required' && task.status.state !== 'auth_required') {\n throw new InvalidStateTransitionError(\n task.status.state,\n 'working',\n 'Task is not awaiting input'\n );\n }\n\n // Validate context match\n if (req.message.context_id && req.message.context_id !== task.context_id) {\n throw new ContextMismatchError(req.message.context_id, task.context_id);\n }\n\n // Append follow-up message to history\n this.taskStore.appendHistory(taskId, req.message);\n\n // Transition task to working state\n this.taskStore.updateTaskState(taskId, 'working');\n this.emitStatusEvent(taskId, task.context_id, {\n state: 'working',\n timestamp: new Date().toISOString(),\n });\n\n // Extract text content from the follow-up message\n const textContent = req.message.parts\n .filter(p => p.text != null)\n .map(p => p.text)\n .join('\\n');\n\n // Publish HumanInputReceived event on the EventBus so the engine can resume\n if (this._ctx?.eventBus) {\n await (this._ctx.eventBus as any).emit({\n type: 'HumanInputReceived',\n taskId,\n message: textContent,\n });\n }\n\n // Re-execute the task with the follow-up message\n const blocking = req.configuration?.blocking ?? false;\n if (blocking) {\n await this.executeTaskDirectly(task, req.message);\n let finalTask = this.taskStore.getTask(taskId)!;\n\n // Respect history_length\n const historyLength = req.configuration?.history_length;\n if (historyLength !== undefined) {\n finalTask = {\n ...finalTask,\n history: finalTask.history.slice(-historyLength),\n };\n }\n\n return { task: finalTask };\n }\n\n // Non-blocking: kick off execution in the background\n const updatedTask = this.taskStore.getTask(taskId)!;\n this.executeTaskDirectly(updatedTask, req.message).catch(() => {\n // Error already handled inside executeTaskDirectly\n });\n\n return { task: this.taskStore.getTask(taskId)! };\n }\n\n private handleGetTask(taskId: string, res: http.ServerResponse): void {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n sendJson(res, 200, task);\n }\n\n private handleListTasks(params: URLSearchParams, res: http.ServerResponse): void {\n const contextId = params.get('context_id') ?? undefined;\n const stateParam = params.get('state');\n const state = stateParam ? (stateParam.split(',') as TaskState[]) : undefined;\n const limit = params.has('limit') ? parseInt(params.get('limit')!, 10) : undefined;\n const offset = params.has('offset') ? parseInt(params.get('offset')!, 10) : undefined;\n\n const result = this.taskStore.listTasks({ contextId, state, limit, offset });\n sendJson(res, 200, result);\n }\n\n private handleCancelTask(taskId: string, res: http.ServerResponse): void {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n\n this.taskStore.updateTaskState(taskId, 'canceled');\n const updated = this.taskStore.getTask(taskId)!;\n sendJson(res, 200, updated);\n }\n\n // -------------------------------------------------------------------------\n // Streaming handlers\n // -------------------------------------------------------------------------\n\n private async handleSendStreamingMessage(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): Promise<void> {\n const body = (await readJsonBody(req)) as AgentSendMessageRequest;\n\n if (!body.message?.parts?.length) {\n throw new InvalidRequestError('Message must contain at least one part');\n }\n\n // Create task (same as handleSendMessage)\n const contextId = body.message.context_id ?? crypto.randomUUID();\n const workflowId = resolveWorkflow(body, this.config);\n\n const task = this.taskStore.createTask({\n contextId,\n requestMessage: body.message,\n requestConfig: body.configuration,\n requestMetadata: body.metadata,\n workflowId,\n });\n\n this.taskStore.appendHistory(task.id, body.message);\n\n // Subscribe response to SSE\n this.streamManager.subscribe(task.id, res);\n\n // Emit initial status\n this.emitStatusEvent(task.id, contextId, task.status);\n\n // Execute the task (status events will be emitted as it progresses)\n this.executeTaskDirectly(task, body.message)\n .then(() => {\n const finalTask = this.taskStore.getTask(task.id);\n if (finalTask) {\n this.emitStatusEvent(task.id, contextId, finalTask.status);\n }\n })\n .catch(() => {\n // Error already handled in executeTaskDirectly\n });\n }\n\n private handleSubscribeToTask(taskId: string, res: http.ServerResponse): void {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n\n // If already terminal, send the final event and close\n if (isTerminalState(task.status.state)) {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n const event: TaskStatusUpdateEvent = {\n type: 'TaskStatusUpdateEvent',\n task_id: taskId,\n context_id: task.context_id,\n status: task.status,\n };\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n res.end();\n return;\n }\n\n // Subscribe for future events\n this.streamManager.subscribe(taskId, res);\n\n // Send current status\n this.emitStatusEvent(taskId, task.context_id, task.status);\n }\n\n // -------------------------------------------------------------------------\n // Push notification handlers\n // -------------------------------------------------------------------------\n\n private async handleCreatePushConfig(\n taskId: string,\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): Promise<void> {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n\n const body = (await readJsonBody(req)) as Partial<AgentPushNotificationConfig>;\n if (!body.url) {\n throw new InvalidRequestError('Push notification config must include url');\n }\n\n const config = this.pushManager.create({\n task_id: taskId,\n url: body.url,\n token: body.token,\n auth_scheme: body.auth_scheme,\n auth_credentials: body.auth_credentials,\n });\n\n sendJson(res, 200, config);\n }\n\n private handleListPushConfigs(taskId: string, res: http.ServerResponse): void {\n const task = this.taskStore.getTask(taskId);\n if (!task) throw new TaskNotFoundError(taskId);\n\n const configs = this.pushManager.list(taskId);\n sendJson(res, 200, { configs });\n }\n\n private handleGetPushConfig(taskId: string, configId: string, res: http.ServerResponse): void {\n const config = this.pushManager.get(taskId, configId);\n if (!config) {\n return sendError(res, 404, 'Push notification config not found', -32001);\n }\n sendJson(res, 200, config);\n }\n\n private handleDeletePushConfig(taskId: string, configId: string, res: http.ServerResponse): void {\n const deleted = this.pushManager.delete(taskId, configId);\n if (!deleted) {\n return sendError(res, 404, 'Push notification config not found', -32001);\n }\n sendJson(res, 200, { deleted: true });\n }\n\n // -------------------------------------------------------------------------\n // Event emission helpers\n // -------------------------------------------------------------------------\n\n /** Emit a task status update to SSE subscribers and push notification targets. */\n emitStatusEvent(\n taskId: string,\n contextId: string,\n status: { state: TaskState; message?: AgentMessage; timestamp: string }\n ): void {\n const event: TaskStatusUpdateEvent = {\n type: 'TaskStatusUpdateEvent',\n task_id: taskId,\n context_id: contextId,\n status,\n };\n this.streamManager.emit(taskId, event);\n this.pushManager.notifyAll(taskId, event).catch(err => {\n logger.error(`Push notification error: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n /** Emit an artifact update to SSE subscribers and push notification targets. */\n emitArtifactEvent(\n taskId: string,\n contextId: string,\n artifact: AgentArtifact,\n append: boolean,\n lastChunk: boolean\n ): void {\n const event: TaskArtifactUpdateEvent = {\n type: 'TaskArtifactUpdateEvent',\n task_id: taskId,\n context_id: contextId,\n artifact,\n append,\n last_chunk: lastChunk,\n };\n this.streamManager.emit(taskId, event);\n this.pushManager.notifyAll(taskId, event).catch(err => {\n logger.error(`Push notification error: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n // -------------------------------------------------------------------------\n // Execution\n // -------------------------------------------------------------------------\n\n /**\n * Execute a task, either via the engine (if available) or with a stub response (for tests).\n */\n private async executeTaskDirectly(task: AgentTask, message: AgentMessage): Promise<void> {\n try {\n // Only transition to working if not already in that state (follow-up messages\n // already set the state to working before calling this method)\n const currentTask = this.taskStore.getTask(task.id);\n if (currentTask && currentTask.status.state !== 'working') {\n this.taskStore.updateTaskState(task.id, 'working');\n this.emitStatusEvent(task.id, task.context_id, {\n state: 'working',\n timestamp: new Date().toISOString(),\n });\n }\n\n if (this._engine && this._visorConfig) {\n // Engine-backed execution\n await this.executeTaskViaEngine(task, message);\n } else {\n // Stub execution (no engine available — e.g., in tests)\n const agentResponse: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: `Task ${task.id} received and processed.`, media_type: 'text/markdown' }],\n };\n this.taskStore.appendHistory(task.id, agentResponse);\n this.taskStore.updateTaskState(task.id, 'completed', agentResponse);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error';\n logger.error(`[A2A] Task ${task.id} execution failed: ${errorMsg}`);\n try {\n const failMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: errorMsg }],\n };\n this.taskStore.updateTaskState(task.id, 'failed', failMessage);\n this.emitStatusEvent(task.id, task.context_id, {\n state: 'failed',\n message: failMessage,\n timestamp: new Date().toISOString(),\n });\n } catch {\n // ignore double-failure\n }\n }\n }\n\n /**\n * Execute a task through the Visor engine.\n * Creates a fresh engine execution per task and converts results to artifacts.\n */\n private async executeTaskViaEngine(task: AgentTask, message: AgentMessage): Promise<void> {\n const workflowId = task.workflow_id ?? this.config.default_workflow;\n\n // Determine which checks to run\n const checks = workflowId ? [workflowId] : ['all'];\n\n // Convert the A2A message into workflow input variables (question, task, data, files, _agent)\n const workflowInputs = messageToWorkflowInput(message, task);\n\n // Merge workflow inputs into the engine's execution context so templates can\n // access them via {{ inputs.question }}, {{ inputs.task }}, etc.\n const prevCtx: any = this._engine.getExecutionContext?.() || {};\n this._engine.setExecutionContext?.({ ...prevCtx, workflowInputs });\n\n // Build execution options\n const execOptions: CheckExecutionOptions = {\n checks,\n config: this._visorConfig!,\n timeout: 300_000,\n };\n\n // Execute via the engine\n const result = await this._engine.executeChecks(execOptions);\n\n // Use the grouped results if available\n const groupedResults =\n (result as any)?.executionStatistics?.groupedResults ?? (result as any)?.results ?? {};\n\n // Build artifacts from the analysis result\n const artifacts: AgentArtifact[] = [];\n\n // Add a summary artifact from reviewSummary\n if (result?.reviewSummary) {\n const summaryParts: AgentPart[] = [];\n if (result.reviewSummary.issues?.length) {\n const issueText = result.reviewSummary.issues\n .map((i: any) => `- **${i.severity}**: ${i.message} (${i.file}:${i.line})`)\n .join('\\n');\n summaryParts.push({ text: `## Issues Found\\n\\n${issueText}`, media_type: 'text/markdown' });\n summaryParts.push({ data: result.reviewSummary.issues, media_type: 'application/json' });\n }\n if (summaryParts.length > 0) {\n artifacts.push({\n artifact_id: crypto.randomUUID(),\n name: 'review-summary',\n description: 'Review summary with issues found',\n parts: summaryParts,\n });\n }\n }\n\n // Add per-check artifacts from grouped results\n if (groupedResults && typeof groupedResults === 'object') {\n for (const [groupName, groupChecks] of Object.entries(groupedResults)) {\n if (!Array.isArray(groupChecks)) continue;\n for (const cr of groupChecks as any[]) {\n const parts: AgentPart[] = [];\n if (typeof cr.content === 'string' && cr.content.trim()) {\n parts.push({ text: cr.content, media_type: 'text/markdown' });\n }\n if (cr.output != null) {\n parts.push({ data: cr.output, media_type: 'application/json' });\n }\n if (parts.length > 0) {\n artifacts.push({\n artifact_id: crypto.randomUUID(),\n name: cr.checkName ?? groupName,\n description: `Output from check: ${cr.checkName ?? groupName}`,\n parts,\n });\n }\n }\n }\n }\n\n // If no structured artifacts, create a simple text result\n if (artifacts.length === 0) {\n artifacts.push({\n artifact_id: crypto.randomUUID(),\n name: 'result',\n description: 'Execution result',\n parts: [\n {\n text: `Executed ${checks.join(', ')} checks. ${result?.checksExecuted?.length ?? 0} checks ran.`,\n media_type: 'text/markdown',\n },\n ],\n });\n }\n\n // Store artifacts and emit events\n for (let i = 0; i < artifacts.length; i++) {\n this.taskStore.addArtifact(task.id, artifacts[i]);\n this.emitArtifactEvent(\n task.id,\n task.context_id,\n artifacts[i],\n false,\n i === artifacts.length - 1\n );\n }\n\n // Mark completed\n const agentResponse: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [\n {\n text: `Completed ${artifacts.length} artifact(s) from ${result?.checksExecuted?.length ?? 0} check(s).`,\n media_type: 'text/markdown',\n },\n ],\n metadata: {\n executionTime: result?.executionTime,\n checksExecuted: result?.checksExecuted,\n },\n };\n this.taskStore.appendHistory(task.id, agentResponse);\n this.taskStore.updateTaskState(task.id, 'completed', agentResponse);\n this.emitStatusEvent(task.id, task.context_id, {\n state: 'completed',\n message: agentResponse,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Create a TaskExecutor callback for the TaskQueue.\n * The queue handles state transitions (submitted → working), so the executor\n * focuses on running the engine and converting results.\n */\n private createTaskExecutor(): TaskExecutor {\n return async (\n task: AgentTask\n ): Promise<{\n success: boolean;\n checkResults?: Record<string, unknown>;\n error?: string;\n stateAlreadySet?: boolean;\n }> => {\n try {\n // Get the user message from history\n const userMessage = task.history.find(m => m.role === 'user');\n if (!userMessage) return { success: false, error: 'No user message found' };\n\n await this.executeTaskViaEngine(task, userMessage);\n return { success: true, stateAlreadySet: true };\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error';\n return { success: false, error: errorMsg, stateAlreadySet: true };\n }\n };\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private checkResultToArtifact(payload: unknown): AgentArtifact | null {\n if (!payload || typeof payload !== 'object') return null;\n const p = payload as Record<string, unknown>;\n\n const parts: AgentPart[] = [];\n if (typeof p.output === 'string') {\n parts.push({ text: p.output, media_type: 'text/markdown' });\n } else if (typeof p.output === 'object' && p.output !== null) {\n parts.push({ data: p.output, media_type: 'application/json' });\n }\n\n if (parts.length === 0) return null;\n\n return {\n artifact_id: crypto.randomUUID(),\n name: (p.checkId as string) ?? 'check-result',\n parts,\n };\n }\n\n private filterOutputModes(task: AgentTask, acceptedModes: string[]): AgentTask {\n const filteredArtifacts = task.artifacts\n .map(a => ({\n ...a,\n parts: a.parts.filter(p =>\n acceptedModes.some(mode => (p.media_type ?? 'text/plain').startsWith(mode))\n ),\n }))\n .filter(a => a.parts.length > 0);\n\n return { ...task, artifacts: filteredArtifacts };\n }\n\n private startCleanupSweep(): void {\n // Run every hour\n this.cleanupTimer = setInterval(() => {\n try {\n const deletedTaskIds = this.taskStore.deleteExpiredTasks();\n if (deletedTaskIds.length > 0) {\n // Cascade-delete push notification configs for removed tasks\n for (const taskId of deletedTaskIds) {\n this.pushManager.deleteForTask(taskId);\n }\n logger.info(`[A2A] Cleaned up ${deletedTaskIds.length} expired tasks`);\n }\n } catch (err) {\n logger.error(\n `[A2A] Cleanup sweep error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }, 3600_000);\n }\n\n private stopCleanupSweep(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Public accessors (for testing)\n // -------------------------------------------------------------------------\n\n getTaskStore(): TaskStore {\n return this.taskStore;\n }\n\n getAgentCard(): AgentCard | null {\n return this.agentCard;\n }\n}\n"],"mappings":"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","names":["crypto","crypto","fs","crypto"]}
|