@axiom-lattice/cli-a2a 0.1.5 → 0.1.6

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.
Files changed (65) hide show
  1. package/.turbo/turbo-build.log +34 -32
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +85 -2
  4. package/__tests__/opencode-executor.test.ts +631 -31
  5. package/__tests__/session-store-path.test.ts +40 -0
  6. package/dist/{chunk-NQIDRU47.mjs → chunk-54SKDK3D.mjs} +78 -32
  7. package/dist/chunk-54SKDK3D.mjs.map +1 -0
  8. package/dist/chunk-BSNQOP2W.mjs +350 -0
  9. package/dist/chunk-BSNQOP2W.mjs.map +1 -0
  10. package/dist/chunk-DRFFQJII.mjs +195 -0
  11. package/dist/chunk-DRFFQJII.mjs.map +1 -0
  12. package/dist/chunk-URJDRXJW.mjs +378 -0
  13. package/dist/chunk-URJDRXJW.mjs.map +1 -0
  14. package/dist/{chunk-G7AGL2QA.mjs → chunk-WZB7FBSX.mjs} +23 -5
  15. package/dist/chunk-WZB7FBSX.mjs.map +1 -0
  16. package/dist/{chunk-LXL47XMZ.mjs → chunk-YGUPSPZO.mjs} +9 -1
  17. package/dist/chunk-YGUPSPZO.mjs.map +1 -0
  18. package/dist/{chunk-35NFMGMS.mjs → chunk-ZP3JNJQJ.mjs} +3 -3
  19. package/dist/chunk-ZP3JNJQJ.mjs.map +1 -0
  20. package/dist/cli.js +769 -156
  21. package/dist/cli.js.map +1 -1
  22. package/dist/cli.mjs +7 -6
  23. package/dist/cli.mjs.map +1 -1
  24. package/dist/executor-LLE5VEFJ.mjs +12 -0
  25. package/dist/executor-LO7P3KUW.mjs +12 -0
  26. package/dist/{executor-RVBGAWUF.mjs → executor-OOLGGXHS.mjs} +4 -3
  27. package/dist/{executors-QIIKBUMJ.mjs → executors-AQHOPGSR.mjs} +2 -2
  28. package/dist/index.d.mts +92 -21
  29. package/dist/index.d.ts +92 -21
  30. package/dist/index.js +731 -123
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +15 -7
  33. package/package.json +10 -3
  34. package/runtime/cli-path.cjs +3 -0
  35. package/runtime/cli-path.d.ts +1 -0
  36. package/runtime/cli-path.mjs +5 -0
  37. package/src/config/defaults.ts +3 -1
  38. package/src/config/types.ts +8 -3
  39. package/src/executors/claude/client.ts +44 -14
  40. package/src/executors/claude/executor.ts +65 -30
  41. package/src/executors/codex/client.ts +239 -16
  42. package/src/executors/codex/executor.ts +70 -37
  43. package/src/executors/events.ts +15 -1
  44. package/src/executors/index.ts +13 -6
  45. package/src/executors/opencode/client.ts +192 -18
  46. package/src/executors/opencode/executor.ts +65 -30
  47. package/src/index.ts +8 -0
  48. package/src/local-state.ts +53 -0
  49. package/src/server/agent-card.ts +1 -0
  50. package/src/server/index.ts +22 -7
  51. package/src/session-store.ts +262 -0
  52. package/dist/chunk-35NFMGMS.mjs.map +0 -1
  53. package/dist/chunk-G7AGL2QA.mjs.map +0 -1
  54. package/dist/chunk-LXL47XMZ.mjs.map +0 -1
  55. package/dist/chunk-NQIDRU47.mjs.map +0 -1
  56. package/dist/chunk-VSZ3DACI.mjs +0 -179
  57. package/dist/chunk-VSZ3DACI.mjs.map +0 -1
  58. package/dist/chunk-WNCDOYZS.mjs +0 -187
  59. package/dist/chunk-WNCDOYZS.mjs.map +0 -1
  60. package/dist/executor-OWPVDUXH.mjs +0 -11
  61. package/dist/executor-XWHWUVQ3.mjs +0 -11
  62. /package/dist/{executor-OWPVDUXH.mjs.map → executor-LLE5VEFJ.mjs.map} +0 -0
  63. /package/dist/{executor-RVBGAWUF.mjs.map → executor-LO7P3KUW.mjs.map} +0 -0
  64. /package/dist/{executor-XWHWUVQ3.mjs.map → executor-OOLGGXHS.mjs.map} +0 -0
  65. /package/dist/{executors-QIIKBUMJ.mjs.map → executors-AQHOPGSR.mjs.map} +0 -0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/executors/index.ts","../src/executors/opencode/client.ts","../src/executors/events.ts","../src/executors/opencode/executor.ts","../src/executors/codex/client.ts","../src/executors/codex/executor.ts","../src/executors/claude/client.ts","../src/executors/claude/executor.ts","../src/bridge.ts","../src/cli.ts","../src/config/loader.ts","../src/config/defaults.ts","../src/server/index.ts","../src/server/agent-card.ts"],"sourcesContent":["/**\n * Lightweight structured logger for the CLI A2A gateway.\n *\n * Uses pino-compatible structured logging. In production mode the output is\n * JSON; in dev mode it is pretty-printed via pino-pretty.\n */\n\nexport enum LogLevel {\n DEBUG = 10,\n INFO = 20,\n WARN = 30,\n ERROR = 40,\n}\n\ninterface LogEntry {\n level: LogLevel;\n msg: string;\n ctx: Record<string, unknown>;\n ts: string;\n}\n\nclass Logger {\n private level: LogLevel = LogLevel.INFO;\n private name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n child(name: string): Logger {\n const childLogger = new Logger(`${this.name}:${name}`);\n childLogger.level = this.level;\n return childLogger;\n }\n\n debug(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, msg, ctx);\n }\n\n info(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, msg, ctx);\n }\n\n warn(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, msg, ctx);\n }\n\n error(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.ERROR, msg, ctx);\n }\n\n private log(level: LogLevel, msg: string, ctx?: Record<string, unknown>): void {\n if (level < this.level) return;\n\n const entry: LogEntry = {\n level,\n msg,\n ctx: { name: this.name, ...ctx },\n ts: new Date().toISOString(),\n };\n\n const output = process.env.NODE_ENV === 'production'\n ? JSON.stringify(entry)\n : `${entry.ts} [${LogLevel[entry.level]}] ${entry.ctx.name}: ${msg}${ctx && Object.keys(ctx).length > 1 ? ' ' + JSON.stringify(ctx) : ''}`;\n\n if (level >= LogLevel.WARN) {\n process.stderr.write(output + '\\n');\n } else {\n process.stdout.write(output + '\\n');\n }\n }\n}\n\nexport const logger = new Logger('cli-a2a');\n","/**\n * Executor types and common interfaces for CLI A2A providers.\n *\n * Each provider (OpenCode, Codex, Claude) implements its own executor\n * conforming to the A2AExecutor interface which extends the SDK's\n * AgentExecutor with lifecycle methods (initialize, shutdown).\n */\n\nimport type { AgentExecutor } from '@a2a-js/sdk/server';\n\n/**\n * Extended executor interface with lifecycle methods.\n *\n * The base AgentExecutor from @a2a-js/sdk only defines execute() and\n * cancelTask(). We add initialize() for server setup and shutdown()\n * for graceful cleanup.\n */\nexport interface A2AExecutor extends AgentExecutor {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport type { AgentExecutor, RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nexport { TaskState } from '@a2a-js/sdk';\nexport { v4 as uuidv4 } from 'uuid';\n\nimport type { AgentConfig, ProviderType } from '../config/types.js';\n\n/**\n * Factory function type: given resolved config, produce an executor.\n */\nexport type ExecutorFactory = (config: Required<AgentConfig>) => A2AExecutor;\n\n/**\n * Map provider type to executor factory.\n */\nconst registry = new Map<ProviderType, ExecutorFactory>();\n\nexport function registerExecutor(provider: ProviderType, factory: ExecutorFactory): void {\n registry.set(provider, factory);\n}\n\nexport function getExecutor(provider: ProviderType): ExecutorFactory | undefined {\n return registry.get(provider);\n}\n\nexport function createExecutor(config: Required<AgentConfig>): A2AExecutor {\n const factory = registry.get(config.provider);\n if (!factory) {\n const available = Array.from(registry.keys()).join(', ');\n throw new Error(`Unknown provider: ${config.provider}. Available: ${available}`);\n }\n return factory(config);\n}\n","/**\n * OpenCode CLI client wrapper.\n *\n * Spawns the OpenCode CLI as a child process. Uses `opencode run` with\n * optional `--attach` to connect to an existing server. Captures stdout\n * as the response. Same pattern as Codex and Claude Code clients.\n */\n\nimport { spawn } from 'node:child_process';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('opencode:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface OpenCodeClientConfig {\n /** Path to the opencode binary (default: \"opencode\") */\n cliPath: string;\n /** Working directory for the process */\n workdir: string;\n /** Model identifier (e.g. \"anthropic/claude-sonnet-4\") */\n model?: string;\n /** Agent preset name */\n agent?: string;\n /** Optional URL of a running OpenCode server to attach to */\n attachUrl?: string;\n /** Timeout in ms (default: 600_000 = 10 min) */\n timeout?: number;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class OpenCodeClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: OpenCodeClientConfig) {}\n\n /** Abort the currently running child process (if any). */\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the OpenCode CLI and return the response text.\n */\n async execute(prompt: string): Promise<string> {\n const cliPath = this.config.cliPath || 'opencode';\n const timeout = this.config.timeout ?? 600_000;\n const MAX_PROMPT = 100_000; // safe below typical ARG_MAX\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}). Split into smaller messages or use a provider with HTTP API transport.`);\n }\n\n // Only pass essential env vars\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n // Forward auth env vars if present\n for (const key of ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OPENCODE_SERVER_PASSWORD', 'OPENCODE_SERVER_USERNAME']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n\n const args: string[] = ['run', prompt];\n\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.agent) {\n args.push('--agent', this.config.agent);\n }\n if (this.config.attachUrl) {\n args.push('--attach', this.config.attachUrl);\n }\n // Default format captures plain text output\n args.push('--format', 'default');\n // Never go interactive\n args.push('--dangerously-skip-permissions');\n\n log.info('Spawning opencode', { cliPath, workdir: this.config.workdir, model: this.config.model });\n\n return new Promise<string>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: this.config.workdir || process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000; // 10MB\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`OpenCode execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('OpenCode stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n const errMsg = stderr.trim() || stdout.trim() || `OpenCode exited with code ${code}`;\n log.warn('OpenCode non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('OpenCode spawn failed', { error: err.message });\n reject(new Error(`Failed to start opencode: ${err.message}. Is it installed?`));\n });\n });\n }\n}\n","/**\n * A2A event publishing helpers.\n *\n * Thin wrappers around ExecutionEventBus.publish() that construct\n * spec-compliant A2A task status and artifact update events.\n */\n\nimport { TaskState } from '@a2a-js/sdk';\nimport type { TaskStatusUpdateEvent, TaskArtifactUpdateEvent } from '@a2a-js/sdk';\nimport type { ExecutionEventBus } from '@a2a-js/sdk/server';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Register a task with the execution event bus before publishing any events.\n */\nexport function publishTask(bus: ExecutionEventBus, taskId: string, contextId: string): void {\n bus.publish({\n kind: 'task',\n taskId,\n contextId,\n } as unknown as TaskStatusUpdateEvent);\n}\n\n/**\n * Publish a task status update.\n */\nexport function publishStatus(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n state: TaskState | string,\n messageText?: string,\n final?: boolean,\n): void {\n const event: TaskStatusUpdateEvent = {\n kind: 'task-status-update',\n taskId,\n contextId,\n status: {\n state: state as TaskState,\n message: messageText\n ? { role: 'agent', parts: [{ kind: 'text', text: messageText }] }\n : undefined,\n },\n final: final ?? false,\n } as unknown as TaskStatusUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish a complete artifact (non-streaming).\n */\nexport function publishFinalArtifact(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n text: string,\n): void {\n const artifactId = uuidv4();\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text }],\n },\n lastChunk: true,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish a streaming artifact chunk.\n */\nexport function publishStreamingChunk(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n artifactId: string,\n chunkText: string,\n): void {\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text: chunkText }],\n },\n lastChunk: false,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish the final streaming chunk with full accumulated text.\n */\nexport function publishLastChunkMarker(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n artifactId: string,\n fullText: string,\n): void {\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text: fullText }],\n },\n lastChunk: true,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n","/**\n * OpenCode A2A Executor\n *\n * Bridges the local OpenCode CLI to the A2A protocol. Spawns `opencode run`\n * as a child process for each request and captures stdout as the response.\n * Same spawn pattern as Codex and Claude Code executors.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nimport type { Message as A2AMessage } from '@a2a-js/sdk';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport { logger } from '../../logger.js';\nimport { OpenCodeClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n} from '../events.js';\n\nconst log = logger.child('opencode:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class OpenCodeExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: OpenCodeClient | null = null;\n private initialized = false;\n\n constructor(config: Required<AgentConfig>) {\n this.config = config;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const oc = this.config.opencode;\n this.client = new OpenCodeClient({\n cliPath: 'opencode',\n workdir: oc.projectDirectory || process.cwd(),\n model: oc.model || undefined,\n agent: oc.agent || undefined,\n attachUrl: oc.baseUrl || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { workdir: oc.projectDirectory, model: oc.model });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, contextId, userMessage, task } = ctx;\n await this.initialize();\n\n try {\n if (!task) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n publishStatus(bus, taskId, contextId, 'working', 'Processing request...');\n\n const promptText = this.extractText(userMessage);\n log.info('Sending prompt to OpenCode', { taskId, len: promptText.length });\n\n const response = await this.client!.execute(promptText);\n\n const finalText = response || 'No response from OpenCode.';\n publishFinalArtifact(bus, taskId, contextId, finalText);\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, len: finalText.length });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for OpenCode task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'OpenCode task cancelled', true);\n bus.finished();\n }\n\n private extractText(message: A2AMessage): string {\n return message.parts\n .filter((p) => {\n const part = p as unknown as Record<string, unknown>;\n const text = part.text as string | undefined;\n return text !== undefined && text !== null;\n })\n .map((p) => (p as unknown as { text: string }).text)\n .join('\\n');\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createOpenCodeExecutor(config: Required<AgentConfig>): A2AExecutor {\n return new OpenCodeExecutor(config);\n}\n","/**\n * Codex CLI client wrapper.\n *\n * Spawns the OpenAI Codex CLI as a child process, sends prompts via stdin,\n * captures stdout as the response. Supports configurable CLI path, working\n * directory, model selection, and timeout.\n */\n\nimport { spawn } from 'node:child_process';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('codex:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface CodexClientConfig {\n /** Path to the codex binary (default: \"codex\") */\n cliPath: string;\n /** Working directory for the codex process */\n workdir: string;\n /** Model identifier (e.g. \"gpt-4o\") — passed as CODELLM env or --model flag */\n model?: string;\n /** OpenAI API key — passed as OPENAI_API_KEY env */\n apiKey?: string;\n /** Timeout in ms (default: 300_000 = 5 min) */\n timeout?: number;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class CodexClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: CodexClientConfig) {}\n\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the Codex CLI and return the response text.\n */\n async execute(prompt: string): Promise<string> {\n const cliPath = this.config.cliPath || 'codex';\n const timeout = this.config.timeout ?? 300_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}). Split into smaller messages.`);\n }\n\n // Only pass relevant env vars to child process\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n // Forward common proxy/no-proxy settings\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n\n if (this.config.apiKey) {\n env['OPENAI_API_KEY'] = this.config.apiKey;\n }\n\n const args: string[] = [];\n // Some codex versions support --model flag\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n args.push(prompt);\n\n log.info('Spawning codex', { cliPath, workdir: this.config.workdir, model: this.config.model });\n\n return new Promise<string>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: this.config.workdir || process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n // Force kill after 5s grace period\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`Codex execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('Codex stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n const errMsg = stderr.trim() || stdout.trim() || `Codex exited with code ${code}`;\n log.warn('Codex non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('Codex spawn failed', { error: err.message });\n reject(new Error(`Failed to start codex: ${err.message}. Is it installed? (npm i -g @openai/codex)`));\n });\n });\n }\n}\n","/**\n * Codex A2A Executor\n *\n * Bridges the local Codex CLI to the A2A protocol. Spawns Codex as a\n * child process for each request and captures stdout as the response.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nimport type { Message as A2AMessage } from '@a2a-js/sdk';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport { logger } from '../../logger.js';\nimport { CodexClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n} from '../events.js';\n\nconst log = logger.child('codex:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class CodexExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: CodexClient | null = null;\n private initialized = false;\n\n constructor(config: Required<AgentConfig>) {\n this.config = config;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const cx = this.config.codex;\n this.client = new CodexClient({\n cliPath: cx.cliPath!,\n workdir: cx.workdir!,\n model: cx.model || undefined,\n apiKey: cx.apiKey || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { cliPath: cx.cliPath, workdir: cx.workdir });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, contextId, userMessage, task } = ctx;\n await this.initialize();\n\n try {\n // 1. Register task\n if (!task) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n // 2. Working\n publishStatus(bus, taskId, contextId, 'working', 'Processing request...');\n\n // 3. Extract prompt text\n const promptText = this.extractText(userMessage);\n\n log.info('Sending prompt to Codex', { taskId, len: promptText.length });\n\n // 4. Execute\n const response = await this.client!.execute(promptText);\n\n // 5. Finalize\n const finalText = response || 'No response from Codex.';\n publishFinalArtifact(bus, taskId, contextId, finalText);\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, len: finalText.length });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for Codex task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'Codex task cancelled', true);\n bus.finished();\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────\n\n private extractText(message: A2AMessage): string {\n return message.parts\n .filter((p) => {\n const part = p as unknown as Record<string, unknown>;\n const text = part.text as string | undefined;\n return text !== undefined && text !== null;\n })\n .map((p) => (p as unknown as { text: string }).text)\n .join('\\n');\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCodexExecutor(config: Required<AgentConfig>): A2AExecutor {\n return new CodexExecutor(config);\n}\n","/**\n * Claude Code CLI client wrapper.\n *\n * Spawns the Anthropic Claude Code CLI as a child process in non-interactive\n * print mode (`-p`). Sends prompts, captures stdout as the response.\n * Supports configurable CLI path, working directory, model, and timeout.\n */\n\nimport { spawn } from 'node:child_process';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('claude:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ClaudeClientConfig {\n /** Path to the claude binary (default: \"claude\") */\n cliPath: string;\n /** Working directory for the process */\n workdir: string;\n /** Model identifier (e.g. \"claude-sonnet-4-20250514\") — passed via --model */\n model?: string;\n /** Anthropic API key — passed as ANTHROPIC_API_KEY env */\n apiKey?: string;\n /** Timeout in ms (default: 300_000 = 5 min) */\n timeout?: number;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class ClaudeClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: ClaudeClientConfig) {}\n\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the Claude Code CLI and return the response text.\n */\n async execute(prompt: string): Promise<string> {\n const cliPath = this.config.cliPath || 'claude';\n const timeout = this.config.timeout ?? 300_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}). Split into smaller messages.`);\n }\n\n // Only pass relevant env vars to child process\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n // Forward common proxy/no-proxy settings\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n\n if (this.config.apiKey) {\n env['ANTHROPIC_API_KEY'] = this.config.apiKey;\n }\n\n const args: string[] = ['-p'];\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n args.push(prompt);\n\n log.info('Spawning claude', { cliPath, workdir: this.config.workdir, model: this.config.model });\n\n return new Promise<string>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: this.config.workdir || process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n // Force kill after 5s grace period\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`Claude Code execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('Claude stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n const errMsg = stderr.trim() || stdout.trim() || `Claude Code exited with code ${code}`;\n log.warn('Claude non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('Claude spawn failed', { error: err.message });\n reject(new Error(`Failed to start claude: ${err.message}. Install: npm i -g @anthropic-ai/claude-code`));\n });\n });\n }\n}\n","/**\n * Claude Code A2A Executor\n *\n * Bridges the local Claude Code CLI to the A2A protocol. Spawns Claude Code\n * in non-interactive print mode (`-p`) for each request and captures stdout\n * as the response.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nimport type { Message as A2AMessage } from '@a2a-js/sdk';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport { logger } from '../../logger.js';\nimport { ClaudeClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n} from '../events.js';\n\nconst log = logger.child('claude:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class ClaudeExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: ClaudeClient | null = null;\n private initialized = false;\n\n constructor(config: Required<AgentConfig>) {\n this.config = config;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const cc = this.config.claude;\n this.client = new ClaudeClient({\n cliPath: cc.cliPath!,\n workdir: cc.workdir!,\n model: cc.model || undefined,\n apiKey: cc.apiKey || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { cliPath: cc.cliPath, workdir: cc.workdir });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, contextId, userMessage, task } = ctx;\n await this.initialize();\n\n try {\n if (!task) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n publishStatus(bus, taskId, contextId, 'working', 'Processing request...');\n\n const promptText = this.extractText(userMessage);\n log.info('Sending prompt to Claude Code', { taskId, len: promptText.length });\n\n const response = await this.client!.execute(promptText);\n\n const finalText = response || 'No response from Claude Code.';\n publishFinalArtifact(bus, taskId, contextId, finalText);\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, len: finalText.length });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for Claude Code task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'Claude Code task cancelled', true);\n bus.finished();\n }\n\n private extractText(message: A2AMessage): string {\n return message.parts\n .filter((p) => {\n const part = p as unknown as Record<string, unknown>;\n const text = part.text as string | undefined;\n return text !== undefined && text !== null;\n })\n .map((p) => (p as unknown as { text: string }).text)\n .join('\\n');\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createClaudeExecutor(config: Required<AgentConfig>): A2AExecutor {\n return new ClaudeExecutor(config);\n}\n","/**\n * A2A Bridge Client — connects to the gateway's WebSocket bridge and\n * proxies HTTP requests from the gateway to the local A2A Express server.\n *\n * Enables agents behind NAT/firewall to receive A2A requests without\n * a public IP or SSH tunnel. The agent opens an outbound WebSocket (which\n * is almost never blocked), and the gateway pushes requests over it.\n */\n\nimport { connect } from 'node:net';\nimport { randomBytes } from 'node:crypto';\nimport { logger } from './logger.js';\n\nconst log = logger.child('bridge');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface BridgeConfig {\n /** Gateway WebSocket URL (e.g. ws://gateway:8080/api/a2a/bridge) */\n bridgeUrl: string;\n /** API key for gateway auth (sent as x-api-key header during WebSocket upgrade) */\n apiKey: string;\n /** Agent ID to register as on the gateway */\n agentId: string;\n /** Full agent card object to advertise */\n agentCard: Record<string, unknown>;\n /** Local A2A server base URL to forward requests to */\n localBaseUrl: string;\n /** Reconnect delay in ms (default: 5000) */\n reconnectDelay?: number;\n}\n\n// ─── Very lightweight WS client (no dependency) ─────────────────────────────\n// Uses Node.js built-in HTTP upgrade → WebSocket framing (RFC 6455 minimal).\n// Enough for JSON text frames. Avoids pulling in the ws library.\n\nclass SimpleWs {\n private socket: ReturnType<typeof connect> | null = null;\n private buffer = Buffer.alloc(0);\n private handshaking = true;\n private httpBuffer = '';\n\n onopen?: () => void;\n onmessage?: (data: string) => void;\n onclose?: (code: number) => void;\n onerror?: (err: Error) => void;\n\n connect(urlStr: string, apiKey: string): void {\n const url = new URL(urlStr);\n const host = url.hostname;\n const port = parseInt(url.port) || (url.protocol === 'wss:' ? 443 : 80);\n const path = url.pathname + url.search;\n\n const key = randomBytes(16).toString('base64');\n\n const req = connect({ host, port }, () => {\n // Send WebSocket upgrade handshake\n const headers = [\n `GET ${path} HTTP/1.1`,\n `Host: ${host}:${port}`,\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Key: ${key}`,\n 'Sec-WebSocket-Version: 13',\n `x-api-key: ${apiKey}`,\n '',\n '',\n ].join('\\r\\n');\n\n if (this.socket) {\n this.socket.write(headers);\n }\n });\n\n this.socket = req;\n\n req.on('data', (chunk: Buffer) => {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n\n // First, validate HTTP upgrade response\n if (this.handshaking) {\n this.httpBuffer += chunk.toString();\n const headerEnd = this.httpBuffer.indexOf('\\r\\n\\r\\n');\n if (headerEnd === -1) return; // not complete yet\n\n const header = this.httpBuffer.substring(0, headerEnd);\n const statusLine = header.split('\\r\\n')[0] || '';\n\n if (!statusLine.startsWith('HTTP/1.1 101')) {\n // Extract response body for diagnostics\n const bodyStart = headerEnd + 4;\n const bodyText = this.httpBuffer.substring(bodyStart).trim();\n const errMsg = statusLine\n ? `WebSocket upgrade rejected: ${statusLine}`\n : 'WebSocket upgrade failed: no status line';\n this.onerror?.(new Error(errMsg + (bodyText ? ` (${bodyText.slice(0, 200)})` : '')));\n this.socket?.destroy();\n this.socket = null;\n return;\n }\n\n // Upgrade successful — discard HTTP header, keep any remaining data\n this.handshaking = false;\n const remaining = this.buffer.subarray(headerEnd + 4);\n this.buffer = remaining;\n this.httpBuffer = '';\n if (this.onopen) this.onopen();\n\n if (remaining.length === 0) return;\n // Fall through to frame parsing below\n }\n\n // Parse WebSocket frames\n while (this.buffer.length >= 2) {\n const opcode = this.buffer[0] & 0x0f;\n const masked = (this.buffer[1] & 0x80) !== 0;\n let offset = 2;\n let payloadLen = this.buffer[1] & 0x7f;\n\n if (payloadLen === 126) {\n if (this.buffer.length < 4) break;\n payloadLen = this.buffer.readUInt16BE(2);\n offset = 4;\n } else if (payloadLen === 127) {\n if (this.buffer.length < 10) break;\n // readUInt32BE for high 32 bits (should be 0 for realistic payloads)\n const hi = this.buffer.readUInt32BE(2);\n const lo = this.buffer.readUInt32BE(6);\n payloadLen = hi * 0x100000000 + lo;\n offset = 10;\n }\n\n if (this.buffer.length < offset + payloadLen) break;\n\n const payload = this.buffer.subarray(offset, offset + payloadLen);\n this.buffer = this.buffer.subarray(offset + payloadLen);\n\n if (masked) {\n // Server→client frames shouldn't be masked per spec, but handle anyway\n const mask = payload.subarray(0, 4);\n const data = payload.subarray(4);\n for (let i = 0; i < data.length; i++) {\n data[i] ^= mask[i % 4];\n }\n if (opcode === 1) {\n this.onmessage?.(data.toString());\n }\n } else {\n if (opcode === 1) {\n this.onmessage?.(payload.toString());\n } else if (opcode === 8) {\n this.onclose?.(1000);\n return;\n } else if (opcode === 9) {\n // Ping — respond with pong\n const pong = Buffer.from([0x8a, 0]);\n this.socket?.write(pong);\n }\n }\n }\n });\n\n req.on('error', (err: Error) => {\n this.onerror?.(err);\n });\n\n req.on('close', () => {\n this.onclose?.(1006);\n });\n }\n\n send(data: string): void {\n if (!this.socket) return;\n const payload = Buffer.from(data, 'utf-8');\n const len = payload.length;\n const maskKey = randomBytes(4);\n\n // RFC 6455: client MUST mask frames to server\n const masked = Buffer.alloc(len);\n for (let i = 0; i < len; i++) {\n masked[i] = payload[i] ^ maskKey[i % 4];\n }\n\n let header: Buffer;\n if (len < 126) {\n header = Buffer.alloc(6);\n header[0] = 0x81; // FIN + text opcode\n header[1] = 0x80 | len; // MASK bit set + length\n maskKey.copy(header, 2);\n } else if (len < 65536) {\n header = Buffer.alloc(8);\n header[0] = 0x81;\n header[1] = 0x80 | 126; // MASK + 126 marker\n header.writeUInt16BE(len, 2);\n maskKey.copy(header, 4);\n } else {\n header = Buffer.alloc(14);\n header[0] = 0x81;\n header[1] = 0x80 | 127; // MASK + 127 marker\n header.writeUInt32BE(0, 2);\n header.writeUInt32BE(len, 6);\n maskKey.copy(header, 10);\n }\n\n this.socket.write(Buffer.concat([header, masked]));\n }\n\n close(): void {\n if (!this.socket) return;\n const frame = Buffer.from([0x88, 0x00]); // close frame\n this.socket.write(frame);\n this.socket.destroy();\n this.socket = null;\n }\n}\n\n// ─── Bridge Client ──────────────────────────────────────────────────────────\n\nexport class BridgeClient {\n private ws: SimpleWs | null = null;\n private running = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private config: BridgeConfig) {}\n\n /**\n * Start the bridge — connect WebSocket and begin serving proxy requests.\n * Returns a promise that resolves when connected. Reconnects on disconnect.\n */\n async start(): Promise<void> {\n this.running = true;\n\n return new Promise((resolve, reject) => {\n this.ws = new SimpleWs();\n\n let firstConnect = true;\n\n this.ws.onopen = () => {\n log.info('Bridge connected');\n // Register with the gateway\n this.ws!.send(JSON.stringify({\n type: 'agent:register',\n agentId: this.config.agentId,\n agentCard: this.config.agentCard,\n }));\n };\n\n this.ws.onmessage = async (raw: string) => {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n if (msg.type === 'agent:registered') {\n log.info('Agent registered via bridge', { agentId: this.config.agentId });\n if (firstConnect) {\n firstConnect = false;\n resolve();\n }\n return;\n }\n\n if (msg.type === 'http:request') {\n this.handleHttpRequest(msg);\n }\n };\n\n this.ws.onclose = () => {\n log.warn('Bridge disconnected, reconnecting...');\n if (this.running) {\n this.reconnectTimer = setTimeout(\n () => this.start().catch(() => {}),\n this.config.reconnectDelay ?? 5000,\n );\n }\n };\n\n this.ws.onerror = (err: Error) => {\n log.error('Bridge error', { error: err.message });\n if (firstConnect) {\n firstConnect = false;\n reject(err);\n }\n };\n\n log.info('Connecting bridge', { url: this.config.bridgeUrl });\n this.ws.connect(this.config.bridgeUrl, this.config.apiKey);\n });\n }\n\n /**\n * Stop the bridge.\n */\n stop(): void {\n this.running = false;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n this.ws = null;\n log.info('Bridge stopped');\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private async handleHttpRequest(msg: Record<string, unknown>): Promise<void> {\n const requestId = msg.requestId as string;\n const method = (msg.method as string) ?? 'GET';\n const path = (msg.path as string) ?? '/';\n const headers = (msg.headers as Record<string, string>) ?? {};\n const body = (msg.body as string) ?? '';\n\n const url = `${this.config.localBaseUrl}${path}`;\n\n try {\n const fetchHeaders: Record<string, string> = { ...headers };\n const fetchOpts: RequestInit = {\n method,\n headers: fetchHeaders,\n signal: AbortSignal.timeout(300_000),\n };\n\n if (body && method !== 'GET') {\n fetchOpts.body = body;\n }\n\n const resp = await fetch(url, fetchOpts);\n\n const responseBody = await resp.text();\n\n const responseHeaders: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n this.ws?.send(JSON.stringify({\n type: 'http:response',\n requestId,\n status: resp.status,\n headers: responseHeaders,\n body: responseBody,\n }));\n } catch (err) {\n log.error('Proxy request failed', { url, error: (err as Error).message });\n this.ws?.send(JSON.stringify({\n type: 'http:error',\n requestId,\n message: (err as Error).message,\n }));\n }\n }\n}\n","#!/usr/bin/env node\n/**\n * CLI A2A Gateway — Entry Point\n *\n * Usage:\n * npx @axiom-lattice/cli-a2a --provider opencode --config agents/example.json\n * npx @axiom-lattice/cli-a2a --provider opencode --port 3000 --opencode-url http://localhost:4096\n *\n * Run with --help for full usage.\n */\n\nimport { parseArgs } from 'node:util';\nimport { dirname, resolve } from 'node:path';\nimport { resolveConfig } from './config/loader.js';\nimport type { AgentConfig, ProviderType } from './config/types.js';\nimport { createA2AServer } from './server/index.js';\nimport { logger, LogLevel } from './logger.js';\n\nconst log = logger.child('cli');\n\n// ─── Version ────────────────────────────────────────────────────────────────\n\nconst PKG_VERSION = '0.1.0';\n\n// ─── Usage ──────────────────────────────────────────────────────────────────\n\nfunction printUsage(): void {\n console.log(`\nUsage: cli-a2a [options]\n\nOptions:\n --provider <name> Provider: opencode | codex | claude\n --config, -c <path> Path to agent JSON config file\n --port, -p <number> A2A server port (default: 3000)\n --hostname <addr> Bind address (default: 0.0.0.0)\n --advertise-host <host> Hostname for agent card URLs\n --agent-name <name> Agent display name\n --agent-description <desc> Agent description\n --log-level <level> debug | info | warn | error (default: info)\n\nGateway Registration:\n --register-url <url> Gateway URL to register this agent with\n --register-key <key> API key for gateway authentication\n --unregister-on-shutdown Remove agent from gateway on exit\n\nBridge (NAT traversal):\n --bridge-url <url> Gateway WebSocket bridge (ws://gateway:8080/api/a2a/bridge)\n --bridge-key <key> API key for bridge authentication\n\nOpenCode Options:\n --opencode-url <url> OpenCode server URL (default: http://localhost:4096)\n --directory, -d <path> Project directory\n --model, -m <provider/model> LLM model (e.g. anthropic/claude-sonnet-4)\n --agent <name> OpenCode agent preset\n\nCodex Options:\n --codex-model <model> Codex model ID\n --codex-api-key <key> OpenAI API key\n\nClaude Options:\n --claude-model <model> Claude Code model ID\n --claude-api-key <key> Anthropic API key\n\n --help, -h Show this help\n --version, -v Show version\n\nExamples:\n npx @axiom-lattice/cli-a2a --provider opencode\n npx @axiom-lattice/cli-a2a --provider opencode --port 3001 --opencode-url http://localhost:4096\n npx @axiom-lattice/cli-a2a --config ./my-agent.json\n npx @axiom-lattice/cli-a2a --provider opencode --model anthropic/claude-sonnet-4\n npx @axiom-lattice/cli-a2a --provider opencode --register-url http://gateway:8080 --register-key sk-xxx --unregister-on-shutdown\n npx @axiom-lattice/cli-a2a --provider opencode --bridge-url ws://gateway:8080/api/a2a/bridge --bridge-key sk-xxx\n`);\n}\n\n// ─── CLI Args ───────────────────────────────────────────────────────────────\n\nfunction parseCliArgs(): {\n configPath?: string;\n overrides: Partial<AgentConfig>;\n registerUrl?: string;\n registerKey?: string;\n unregisterOnShutdown: boolean;\n bridgeUrl?: string;\n bridgeKey?: string;\n} {\n const { values } = parseArgs({\n options: {\n provider: { type: 'string' },\n config: { type: 'string', short: 'c' },\n port: { type: 'string', short: 'p' },\n hostname: { type: 'string' },\n 'advertise-host': { type: 'string' },\n 'agent-name': { type: 'string' },\n 'agent-description':{ type: 'string' },\n 'opencode-url': { type: 'string' },\n directory: { type: 'string', short: 'd' },\n model: { type: 'string', short: 'm' },\n agent: { type: 'string' },\n 'codex-model': { type: 'string' },\n 'codex-api-key': { type: 'string' },\n 'claude-model': { type: 'string' },\n 'claude-api-key': { type: 'string' },\n 'log-level': { type: 'string' },\n 'register-url': { type: 'string' },\n 'register-key': { type: 'string' },\n 'unregister-on-shutdown': { type: 'boolean' },\n 'bridge-url': { type: 'string' },\n 'bridge-key': { type: 'string' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n strict: false,\n });\n\n if (values.help) {\n printUsage();\n process.exit(0);\n }\n\n if (values.version) {\n console.log(PKG_VERSION);\n process.exit(0);\n }\n\n const overrides: Partial<AgentConfig> = {};\n\n // Provider\n if (values.provider) {\n overrides.provider = values.provider as ProviderType;\n }\n\n // Server\n if (values.port || values.hostname || values['advertise-host']) {\n overrides.server = {};\n if (values.port) overrides.server.port = parseInt(values.port as string, 10);\n if (values.hostname) overrides.server.hostname = values.hostname as string;\n if (values['advertise-host']) overrides.server.advertiseHost = values['advertise-host'] as string;\n }\n\n // Agent card\n const agentCardOverrides: Partial<AgentConfig['agentCard']> = {};\n if (values['agent-name']) agentCardOverrides.name = values['agent-name'] as string;\n if (values['agent-description']) agentCardOverrides.description = values['agent-description'] as string;\n if (Object.keys(agentCardOverrides).length > 0) {\n overrides.agentCard = agentCardOverrides as AgentConfig['agentCard'];\n }\n\n // OpenCode\n const hasOpenCode = !!(values['opencode-url'] || values.directory || values.model || values.agent);\n if (hasOpenCode) {\n overrides.opencode = {};\n if (values['opencode-url']) overrides.opencode.baseUrl = values['opencode-url'] as string;\n if (values.directory) overrides.opencode.projectDirectory = values.directory as string;\n if (values.model) overrides.opencode.model = values.model as string;\n if (values.agent) overrides.opencode.agent = values.agent as string;\n }\n\n // Codex\n const hasCodex = !!(values['codex-model'] || values['codex-api-key']);\n if (hasCodex) {\n overrides.codex = {};\n if (values['codex-model']) overrides.codex.model = values['codex-model'] as string;\n if (values['codex-api-key']) overrides.codex.apiKey = values['codex-api-key'] as string;\n }\n\n // Claude\n const hasClaude = !!(values['claude-model'] || values['claude-api-key']);\n if (hasClaude) {\n overrides.claude = {};\n if (values['claude-model']) overrides.claude.model = values['claude-model'] as string;\n if (values['claude-api-key']) overrides.claude.apiKey = values['claude-api-key'] as string;\n }\n\n // Logging\n if (values['log-level']) {\n overrides.logging = { level: values['log-level'] as 'debug' | 'info' | 'warn' | 'error' };\n }\n\n const configPath = (values.config) as string | undefined;\n const registerUrl = values['register-url'] as string | undefined;\n const registerKey = values['register-key'] as string | undefined;\n const unregisterOnShutdown = (values['unregister-on-shutdown'] as boolean) ?? false;\n const bridgeUrl = values['bridge-url'] as string | undefined;\n const bridgeKey = values['bridge-key'] as string | undefined;\n return { configPath, overrides, registerUrl, registerKey, unregisterOnShutdown, bridgeUrl, bridgeKey };\n}\n\n// ─── Gateway Registration ───────────────────────────────────────────────────\n\nasync function registerWithGateway(\n registerUrl: string,\n registerKey: string,\n config: Required<AgentConfig>,\n agentCardUrl: string,\n): Promise<{ assistantId: string; agentCardUrl: string } | null> {\n const body = {\n name: config.agentCard.name,\n description: config.agentCard.description,\n graphDefinition: {\n type: 'a2a_remote',\n key: `a2a-${config.provider}-${config.agentCard.name.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`,\n name: config.agentCard.name,\n description: config.agentCard.description,\n prompt: config.agentCard.description,\n agentCardUrl,\n timeout: config.timeouts.prompt,\n },\n };\n\n try {\n const url = registerUrl.replace(/\\/$/, '') + '/api/assistants';\n log.info('Registering with gateway', { url, agentCardUrl });\n\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${registerKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n log.error('Gateway registration failed', { status: resp.status, body: text });\n return null;\n }\n\n const result = await resp.json() as { data?: { id: string } };\n const assistantId = result.data?.id ?? body.graphDefinition.key;\n\n log.info('Registered with gateway', { assistantId, agentCardUrl });\n console.log(`Registered as agent: ${assistantId}`);\n console.log(`Agent card: ${agentCardUrl}`);\n\n return { assistantId, agentCardUrl };\n } catch (err) {\n log.error('Gateway registration error', { error: (err as Error).message });\n return null;\n }\n}\n\nasync function unregisterFromGateway(\n registerUrl: string,\n registerKey: string,\n assistantId: string,\n): Promise<void> {\n try {\n const url = `${registerUrl.replace(/\\/$/, '')}/api/assistants/${assistantId}`;\n log.info('Unregistering from gateway', { assistantId });\n\n const resp = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${registerKey}`,\n },\n });\n\n if (!resp.ok && resp.status !== 404) {\n log.warn('Gateway unregistration failed', { status: resp.status });\n } else {\n log.info('Unregistered from gateway', { assistantId });\n }\n } catch (err) {\n log.warn('Gateway unregistration error', { error: (err as Error).message });\n }\n}\n\n// ─── Main ───────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const { configPath, overrides, registerUrl, registerKey, unregisterOnShutdown, bridgeUrl, bridgeKey } = parseCliArgs();\n\n // Resolve config\n const config = resolveConfig(configPath, overrides);\n\n // Set configDir for relative path resolution\n if (configPath) {\n config.configDir = dirname(resolve(configPath));\n }\n\n // Apply log level\n const levelStr = config.logging.level ?? 'info';\n const levelMap: Record<string, LogLevel> = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n logger.setLevel(levelMap[levelStr] ?? LogLevel.INFO);\n\n if (!configPath) {\n log.info('No --config provided — running with defaults + CLI args.');\n }\n\n log.info('Starting CLI A2A Gateway', {\n provider: config.provider,\n config: configPath ?? '(defaults)',\n agent: config.agentCard.name,\n port: config.server?.port,\n });\n\n // Register executors\n const { registerExecutor } = await import('./executors/index.js');\n const { createOpenCodeExecutor } = await import('./executors/opencode/executor.js');\n const { createCodexExecutor } = await import('./executors/codex/executor.js');\n const { createClaudeExecutor } = await import('./executors/claude/executor.js');\n registerExecutor('opencode', createOpenCodeExecutor);\n registerExecutor('codex', createCodexExecutor);\n registerExecutor('claude', createClaudeExecutor);\n\n // Start server\n const server = await createA2AServer(config);\n\n const listenPort = config.server?.port ?? 3000;\n const agentId = `a2a-${config.provider}-${listenPort}`;\n\n // Connect bridge to gateway (NAT traversal)\n let bridgeClient: { start(): Promise<void>; stop(): void } | null = null;\n if (bridgeUrl && bridgeKey) {\n const { BridgeClient } = await import('./bridge.js');\n const agentCardUrl = `${config.server?.advertiseProtocol ?? 'http'}://${config.server?.advertiseHost ?? 'localhost'}:${listenPort}/.well-known/agent-card.json`;\n\n bridgeClient = new BridgeClient({\n bridgeUrl: bridgeUrl.replace(/^http/, 'ws'),\n apiKey: bridgeKey,\n agentId,\n agentCard: {\n name: config.agentCard.name,\n description: config.agentCard.description,\n url: agentCardUrl,\n },\n localBaseUrl: `http://localhost:${listenPort}`,\n });\n\n bridgeClient.start().then(() => {\n log.info('Bridge connected — agent reachable via gateway proxy');\n console.log(`Bridge: ws://gateway → localhost:${listenPort}`);\n }).catch((err: Error) => {\n log.error('Bridge connection failed', { error: err.message });\n });\n }\n\n // Register with gateway (HTTP-based self-registration)\n let registeredAssistantId: string | null = null;\n if (registerUrl && registerKey) {\n // When bridge is active, the agent card URL must point to the gateway proxy\n // so the orchestrator reaches the agent through the WebSocket bridge, not directly.\n const agentCardUrl = bridgeUrl\n ? `${registerUrl.replace(/\\/$/, '')}/api/a2a/bridge/proxy/${agentId}/.well-known/agent-card.json`\n : `${config.server?.advertiseProtocol ?? 'http'}://${config.server?.advertiseHost ?? 'localhost'}:${listenPort}/.well-known/agent-card.json`;\n\n const reg = await registerWithGateway(\n registerUrl,\n registerKey,\n config,\n agentCardUrl,\n );\n if (reg) {\n registeredAssistantId = reg.assistantId;\n }\n }\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n log.info(`${signal} received, shutting down...`);\n bridgeClient?.stop();\n if (registeredAssistantId && registerUrl && registerKey && unregisterOnShutdown) {\n await unregisterFromGateway(registerUrl, registerKey, registeredAssistantId);\n }\n await server.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\nmain().catch((err) => {\n log.error('Fatal error', { error: (err as Error).message, stack: (err as Error).stack });\n process.exit(1);\n});\n","/**\n * Config loader — reads JSON config files and resolves the final config\n * by merging layers: defaults ← config file ← env overrides ← CLI args.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { resolveDefaults } from './defaults.js';\nimport type { AgentConfig } from './types.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('config');\n\n/**\n * Read and parse a JSON config file.\n */\nexport function loadConfigFile(filePath: string): Partial<AgentConfig> {\n const absPath = resolve(filePath);\n if (!existsSync(absPath)) {\n throw new Error(`Config file not found: ${absPath}`);\n }\n try {\n const raw = readFileSync(absPath, 'utf-8');\n return JSON.parse(raw) as Partial<AgentConfig>;\n } catch (err) {\n const msg = err instanceof SyntaxError\n ? `Invalid JSON in config file: ${err.message}`\n : `Failed to read config file: ${(err as Error).message}`;\n throw new Error(msg);\n }\n}\n\n/**\n * Load env overrides for provider configs.\n */\nfunction loadEnvOverrides(): Partial<AgentConfig> {\n const overrides: Partial<AgentConfig> = {\n opencode: {},\n codex: {},\n claude: {},\n };\n\n // OpenCode\n if (process.env.OPENCODE_URL) overrides.opencode!.baseUrl = process.env.OPENCODE_URL;\n if (process.env.OPENCODE_DIRECTORY) overrides.opencode!.projectDirectory = process.env.OPENCODE_DIRECTORY;\n if (process.env.OPENCODE_MODEL) overrides.opencode!.model = process.env.OPENCODE_MODEL;\n if (process.env.OPENCODE_AGENT) overrides.opencode!.agent = process.env.OPENCODE_AGENT;\n if (process.env.OPENCODE_SYSTEM_PROMPT) overrides.opencode!.systemPrompt = process.env.OPENCODE_SYSTEM_PROMPT;\n\n // Codex\n if (process.env.OPENAI_API_KEY) overrides.codex!.apiKey = process.env.OPENAI_API_KEY;\n if (process.env.CODEX_MODEL) overrides.codex!.model = process.env.CODEX_MODEL;\n\n // Claude Code\n if (process.env.ANTHROPIC_API_KEY) overrides.claude!.apiKey = process.env.ANTHROPIC_API_KEY;\n if (process.env.CLAUDE_MODEL) overrides.claude!.model = process.env.CLAUDE_MODEL;\n\n return overrides;\n}\n\n/**\n * Resolve full config from defaults + file + env.\n */\nexport function resolveConfig(\n configPath?: string,\n cliOverrides?: Partial<AgentConfig>,\n): Required<AgentConfig> {\n // Layer 1: File\n let fileConfig: Partial<AgentConfig> = {};\n if (configPath) {\n fileConfig = loadConfigFile(configPath);\n log.info('Loaded config file', { path: configPath });\n }\n\n // Layer 2: Env\n const envOverrides = loadEnvOverrides();\n\n // Layer 3: CLI\n const cliConfig = cliOverrides ?? {};\n\n // Deep merge: defaults ← file ← env ← CLI\n // Start with a proper deep copy of merged defaults+file to avoid mutating the frozen defaults\n const cloned = structuredClone(resolveDefaults(fileConfig)) as Required<AgentConfig>;\n const base = cloned;\n\n // Then merge env overrides\n mergeOverrides(base, envOverrides);\n\n // Then merge CLI overrides\n mergeOverrides(base, cliConfig);\n\n // Populate configDir\n if (configPath) {\n base.configDir = dirname(resolve(configPath));\n }\n\n return base;\n}\n\nfunction mergeOverrides(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const key of Object.keys(source)) {\n const srcVal = source[key];\n const tgtVal = target[key];\n if (\n srcVal !== undefined &&\n srcVal !== null &&\n typeof srcVal === 'object' &&\n !Array.isArray(srcVal) &&\n tgtVal !== undefined &&\n typeof tgtVal === 'object' &&\n !Array.isArray(tgtVal)\n ) {\n // Do not merge empty override objects\n if (Object.keys(srcVal as Record<string, unknown>).length > 0) {\n mergeOverrides(tgtVal as Record<string, unknown>, srcVal as Record<string, unknown>);\n }\n } else if (srcVal !== undefined && srcVal !== null) {\n target[key] = srcVal;\n }\n }\n}\n","/**\n * Default configuration values.\n *\n * Every field has a sensible default so the agent runs without a config file.\n */\n\nimport type { AgentConfig } from './types.js';\n\nfunction withDefaults<T extends Record<string, unknown>>(\n partial: Partial<T>,\n defaults: Required<T>,\n): Required<T> {\n const result = { ...defaults } as Record<string, unknown>;\n for (const key of Object.keys(partial) as Array<keyof T>) {\n const val = partial[key] as unknown;\n if (val !== undefined && val !== null) {\n if (\n typeof val === 'object' &&\n !Array.isArray(val) &&\n typeof defaults[key] === 'object' &&\n !Array.isArray(defaults[key])\n ) {\n result[key as string] = {\n ...(defaults[key] as Record<string, unknown>),\n ...(val as Record<string, unknown>),\n };\n } else {\n result[key as string] = val;\n }\n }\n }\n return result as unknown as Required<T>;\n}\n\ntype ResolvedConfig = Omit<Required<AgentConfig>, 'opencode' | 'codex' | 'claude' | 'configDir'> & {\n opencode: Required<Required<AgentConfig>['opencode']>;\n codex: Required<Required<AgentConfig>['codex']>;\n claude: Required<Required<AgentConfig>['claude']>;\n configDir: string | undefined;\n};\n\nconst DEFAULTS: Readonly<ResolvedConfig> = Object.freeze({\n provider: 'opencode' as const,\n agentCard: {\n name: 'CLI A2A Agent',\n description: 'A multi-provider A2A agent driven by local CLI coding tools.',\n protocolVersion: '0.3.0',\n version: '0.1.0',\n skills: [],\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n streaming: true,\n pushNotifications: false,\n },\n server: {\n port: 3000,\n hostname: '0.0.0.0',\n advertiseHost: 'localhost',\n advertiseProtocol: 'http',\n },\n session: {\n titlePrefix: 'A2A Session',\n reuseByContext: true,\n ttl: 3_600_000,\n cleanupInterval: 300_000,\n },\n features: {\n autoApprovePermissions: true,\n autoAnswerQuestions: true,\n streamArtifactChunks: false,\n enablePollingFallback: true,\n },\n timeouts: {\n prompt: 600_000,\n pollingInterval: 2_000,\n healthCheck: 30_000,\n },\n logging: {\n level: 'info',\n },\n opencode: {\n baseUrl: 'http://localhost:4096',\n projectDirectory: '',\n model: '',\n agent: '',\n systemPrompt: '',\n systemPromptMode: 'append',\n contextFile: 'context.md',\n contextPrompt: '',\n },\n codex: {\n cliPath: 'codex',\n workdir: process.cwd(),\n model: '',\n apiKey: '',\n },\n claude: {\n cliPath: 'claude',\n workdir: process.cwd(),\n model: '',\n apiKey: '',\n },\n configDir: undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} as any);\n\nexport function resolveDefaults(overrides: Partial<AgentConfig>): Required<AgentConfig> {\n return withDefaults(overrides, DEFAULTS) as unknown as Required<AgentConfig>;\n}\n","/**\n * A2A HTTP Server\n *\n * Creates an Express server with standard A2A endpoints:\n * - GET /.well-known/agent-card.json → Agent Card\n * - POST /a2a/jsonrpc → JSON-RPC transport\n * - POST /a2a/rest → REST transport\n * - GET /health → Health check\n */\n\nimport express, { type RequestHandler } from 'express';\nimport { AGENT_CARD_PATH } from '@a2a-js/sdk';\nimport { DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server';\nimport {\n jsonRpcHandler,\n restHandler,\n UserBuilder,\n} from '@a2a-js/sdk/server/express';\n\nimport type { AgentConfig } from '../config/types.js';\nimport { buildAgentCard } from './agent-card.js';\nimport { createExecutor } from '../executors/index.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('server');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ServerHandle {\n app: ReturnType<typeof express>;\n server: ReturnType<ReturnType<typeof express>['listen']>;\n shutdown(): Promise<void>;\n}\n\n// ─── Server Factory ─────────────────────────────────────────────────────────\n\nexport async function createA2AServer(config: Required<AgentConfig>): Promise<ServerHandle> {\n const srv = config.server;\n const port = srv.port ?? 3000;\n const hostname = srv.hostname ?? '0.0.0.0';\n const advertiseHost = srv.advertiseHost ?? 'localhost';\n const advertiseProto = srv.advertiseProtocol ?? 'http';\n\n // 1. Create executor\n const executor = createExecutor(config);\n await executor.initialize();\n\n // 2. Build agent card\n const agentCard = buildAgentCard(config);\n\n // 3. A2A request handler\n const taskStore = new InMemoryTaskStore();\n const requestHandler = new DefaultRequestHandler(agentCard, taskStore, executor);\n\n // 4. Express app\n const app = express();\n\n // A2A-Version header\n app.use((_req, res, next) => {\n res.setHeader('A2A-Version', '0.3');\n next();\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'healthy', agent: agentCard.name, provider: config.provider });\n });\n\n // Agent card — dynamic URL rewriting for reverse proxy support\n const serveAgentCard: RequestHandler = (req, res) => {\n const host = req.headers.host || `${advertiseHost}:${port}`;\n const proto = (req.headers['x-forwarded-proto'] as string) || advertiseProto;\n const dynamicBase = `${proto}://${host}`;\n res.json({\n ...agentCard,\n url: `${dynamicBase}/a2a/jsonrpc`,\n additionalInterfaces: [\n { transport: 'JSONRPC', url: `${dynamicBase}/a2a/jsonrpc` },\n { transport: 'REST', url: `${dynamicBase}/a2a/rest` },\n ],\n });\n };\n\n app.get(`/${AGENT_CARD_PATH}`, serveAgentCard);\n app.get('/.well-known/agent.json', serveAgentCard);\n app.get('/.well-known/agent-json', serveAgentCard);\n\n // A2A transport handlers\n app.use('/a2a/jsonrpc', jsonRpcHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }));\n app.use('/a2a/rest', restHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }));\n\n // 5. Start listening\n const httpServer = app.listen(port, hostname, () => {\n log.info('A2A server started', { bind: hostname, port, proto: advertiseProto });\n\n const banner = [\n '',\n '╔══════════════════════════════════════════════════════════════╗',\n `║ CLI A2A Gateway — ${config.provider.padEnd(28)}║`,\n '╠══════════════════════════════════════════════════════════════╣',\n `║ Agent: ${agentCard.name}`,\n `║ Bind: ${hostname}:${port}`,\n `║ Agent Card: ${advertiseProto}://${advertiseHost}:${port}/${AGENT_CARD_PATH}`,\n `║ JSON-RPC: ${advertiseProto}://${advertiseHost}:${port}/a2a/jsonrpc`,\n `║ REST: ${advertiseProto}://${advertiseHost}:${port}/a2a/rest`,\n `║ Health: ${advertiseProto}://${advertiseHost}:${port}/health`,\n '╠══════════════════════════════════════════════════════════════╣',\n '║ Ready. Press Ctrl+C to stop. ║',\n '╚══════════════════════════════════════════════════════════════╝',\n ].join('\\n');\n console.log(banner);\n });\n\n // 6. Return handle\n return {\n app,\n server: httpServer,\n async shutdown() {\n httpServer.close();\n await executor.shutdown();\n log.info('Server shut down');\n },\n };\n}\n","/**\n * Agent Card builder.\n *\n * Builds an A2A-compliant AgentCard from the resolved config.\n */\n\nimport type { AgentCard, AgentSkill } from '@a2a-js/sdk';\nimport type { AgentConfig } from '../config/types.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('agent-card');\n\nexport function buildAgentCard(config: Required<AgentConfig>): AgentCard {\n const { agentCard, server } = config;\n const proto = server.advertiseProtocol ?? 'http';\n const host = server.advertiseHost ?? 'localhost';\n const port = server.port ?? 3000;\n const baseUrl = `${proto}://${host}:${port}`;\n\n const skills: AgentSkill[] = (agentCard.skills ?? []).map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n tags: s.tags ?? [],\n examples: s.examples ?? [],\n }));\n\n const card: AgentCard = {\n name: agentCard.name,\n description: agentCard.description,\n protocolVersion: agentCard.protocolVersion ?? '0.3.0',\n version: agentCard.version ?? '1.0.0',\n url: `${baseUrl}/a2a/jsonrpc`,\n // Default input/output modes (A2A v1.0 normalized names)\n defaultInputModes: (agentCard.defaultInputModes as Array<'text' | 'file' | 'image' | 'audio'>) ?? ['text'],\n defaultOutputModes: (agentCard.defaultOutputModes as Array<'text' | 'file' | 'image' | 'audio'>) ?? ['text'],\n skills,\n capabilities: {\n streaming: agentCard.streaming ?? true,\n pushNotifications: agentCard.pushNotifications ?? false,\n },\n // Additional interfaces advertised to orchestrators\n additionalInterfaces: [\n { transport: 'JSONRPC', url: `${baseUrl}/a2a/jsonrpc` },\n { transport: 'REST', url: `${baseUrl}/a2a/rest` },\n ],\n };\n\n log.info('Agent card built', { name: card.name, url: card.url, skills: card.skills?.length ?? 0 });\n return card;\n}\n"],"mappings":"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","names":["LogLevel","log","resolve","uuidv4","import_uuid","log","import_node_child_process","log","init_client","resolve","executor_exports","log","init_executor","init_client","import_node_child_process","log","init_client","resolve","executor_exports","log","init_executor","init_client","log","resolve","import_node_path","import_sdk","import_express","log","log","express","log","registerExecutor","createOpenCodeExecutor","createCodexExecutor","createClaudeExecutor","BridgeClient"]}
1
+ {"version":3,"sources":["../src/logger.ts","../src/executors/index.ts","../src/session-store.ts","../src/executors/opencode/client.ts","../src/executors/events.ts","../src/executors/opencode/executor.ts","../src/executors/codex/client.ts","../src/executors/codex/executor.ts","../src/executors/claude/client.ts","../src/executors/claude/executor.ts","../src/bridge.ts","../src/cli.ts","../src/config/loader.ts","../src/config/defaults.ts","../src/server/index.ts","../src/server/agent-card.ts"],"sourcesContent":["/**\n * Lightweight structured logger for the CLI A2A gateway.\n *\n * Uses pino-compatible structured logging. In production mode the output is\n * JSON; in dev mode it is pretty-printed via pino-pretty.\n */\n\nexport enum LogLevel {\n DEBUG = 10,\n INFO = 20,\n WARN = 30,\n ERROR = 40,\n}\n\ninterface LogEntry {\n level: LogLevel;\n msg: string;\n ctx: Record<string, unknown>;\n ts: string;\n}\n\nclass Logger {\n private level: LogLevel = LogLevel.INFO;\n private name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n child(name: string): Logger {\n const childLogger = new Logger(`${this.name}:${name}`);\n childLogger.level = this.level;\n return childLogger;\n }\n\n debug(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, msg, ctx);\n }\n\n info(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, msg, ctx);\n }\n\n warn(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, msg, ctx);\n }\n\n error(msg: string, ctx?: Record<string, unknown>): void {\n this.log(LogLevel.ERROR, msg, ctx);\n }\n\n private log(level: LogLevel, msg: string, ctx?: Record<string, unknown>): void {\n if (level < this.level) return;\n\n const entry: LogEntry = {\n level,\n msg,\n ctx: { name: this.name, ...ctx },\n ts: new Date().toISOString(),\n };\n\n const output = process.env.NODE_ENV === 'production'\n ? JSON.stringify(entry)\n : `${entry.ts} [${LogLevel[entry.level]}] ${entry.ctx.name}: ${msg}${ctx && Object.keys(ctx).length > 1 ? ' ' + JSON.stringify(ctx) : ''}`;\n\n if (level >= LogLevel.WARN) {\n process.stderr.write(output + '\\n');\n } else {\n process.stdout.write(output + '\\n');\n }\n }\n}\n\nexport const logger = new Logger('cli-a2a');\n","/**\n * Executor types and common interfaces for CLI A2A providers.\n *\n * Each provider (OpenCode, Codex, Claude) implements its own executor\n * conforming to the A2AExecutor interface which extends the SDK's\n * AgentExecutor with lifecycle methods (initialize, shutdown).\n */\n\nimport type { AgentExecutor } from '@a2a-js/sdk/server';\nimport type { SessionBindingStore } from '../session-store.js';\nimport type { AgentConfig, ProviderType } from '../config/types.js';\n\n/**\n * Extended executor interface with lifecycle methods.\n *\n * The base AgentExecutor from @a2a-js/sdk only defines execute() and\n * cancelTask(). We add initialize() for server setup and shutdown()\n * for graceful cleanup.\n */\nexport interface A2AExecutor extends AgentExecutor {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport type { AgentExecutor, RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\nexport { TaskState } from '@a2a-js/sdk';\nexport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Factory function type: given resolved config and a session store,\n * produce an executor.\n */\nexport type ExecutorFactory = (\n config: Required<AgentConfig>,\n sessionStore: SessionBindingStore,\n) => A2AExecutor;\n\n/**\n * Map provider type to executor factory.\n */\nconst registry = new Map<ProviderType, ExecutorFactory>();\n\nexport function registerExecutor(provider: ProviderType, factory: ExecutorFactory): void {\n registry.set(provider, factory);\n}\n\nexport function getExecutor(provider: ProviderType): ExecutorFactory | undefined {\n return registry.get(provider);\n}\n\nexport function createExecutor(\n config: Required<AgentConfig>,\n sessionStore: SessionBindingStore,\n): A2AExecutor {\n const factory = registry.get(config.provider);\n if (!factory) {\n const available = Array.from(registry.keys()).join(', ');\n throw new Error(`Unknown provider: ${config.provider}. Available: ${available}`);\n }\n return factory(config, sessionStore);\n}\n","/**\n * SessionBindingStore\n *\n * Persists A2A contextId → CLI sessionId mappings so that multi-turn\n * conversations survive process restarts. Supports atomic file writes,\n * in-memory caching, TTL-based cleanup, and corrupted-file recovery.\n */\n\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { mkdirSync, writeFileSync, readFileSync, renameSync, unlinkSync, existsSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { logger } from './logger.js';\nimport type { ProviderType } from './config/types.js';\n\nconst log = logger.child('session-store');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface SessionBinding {\n provider: ProviderType;\n contextId: string;\n sessionId: string;\n activeTaskId?: string;\n activeTaskState?: string;\n createdAt: string;\n updatedAt: string;\n expiresAt?: string;\n}\n\ninterface StoreData {\n version: 1;\n bindings: SessionBinding[];\n}\n\n// ─── Defaults ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_STORE_DIR = join(\n homedir(),\n 'Library',\n 'Application Support',\n 'axiom-lattice',\n 'cli-a2a',\n);\nconst DEFAULT_STORE_PATH = join(DEFAULT_STORE_DIR, 'sessions.json');\nconst DEFAULT_CLEANUP_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\nexport function resolveSessionStorePath(options: {\n configuredPath?: string;\n provider: ProviderType;\n port: number;\n storeDir?: string;\n}): string {\n if (options.configuredPath && options.configuredPath.length > 0) {\n return options.configuredPath;\n }\n\n return join(\n options.storeDir ?? DEFAULT_STORE_DIR,\n `sessions-${options.provider}-${options.port}.json`,\n );\n}\n\n// ─── Store ──────────────────────────────────────────────────────────────────\n\nexport class SessionBindingStore {\n private cache = new Map<string, SessionBinding>();\n private storePath: string;\n private persist: boolean;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private dirty = false;\n private flushTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(opts?: {\n storePath?: string;\n persist?: boolean;\n cleanupIntervalMs?: number;\n }) {\n this.storePath = (opts?.storePath && opts.storePath.length > 0)\n ? opts.storePath\n : DEFAULT_STORE_PATH;\n this.persist = opts?.persist ?? true;\n this.loadFromFile();\n this.startCleanup(opts?.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS);\n }\n\n // ── Public API ────────────────────────────────────────────────────────\n\n get(contextId: string, provider: ProviderType): SessionBinding | null {\n const key = this.makeKey(contextId, provider);\n const binding = this.cache.get(key);\n if (!binding) return null;\n\n if (this.isExpired(binding)) {\n this.cache.delete(key);\n this.markDirty();\n return null;\n }\n\n return binding;\n }\n\n set(binding: SessionBinding): void {\n const key = this.makeKey(binding.contextId, binding.provider);\n this.cache.set(key, binding);\n this.markDirty();\n }\n\n delete(contextId: string, provider: ProviderType): boolean {\n const key = this.makeKey(contextId, provider);\n const existed = this.cache.delete(key);\n if (existed) this.markDirty();\n return existed;\n }\n\n clearActiveTask(contextId: string, provider: ProviderType): void {\n const binding = this.get(contextId, provider);\n if (binding) {\n binding.activeTaskId = undefined;\n binding.activeTaskState = undefined;\n binding.updatedAt = new Date().toISOString();\n this.markDirty();\n }\n }\n\n /**\n * Remove all expired entries.\n * Called automatically on the cleanup interval; call manually before shutdown.\n */\n cleanup(): number {\n let removed = 0;\n for (const [key, binding] of this.cache) {\n if (this.isExpired(binding)) {\n this.cache.delete(key);\n removed++;\n }\n }\n if (removed > 0) {\n this.markDirty();\n log.info('TTL cleanup completed', { removed, remaining: this.cache.size });\n }\n return removed;\n }\n\n /**\n * Graceful shutdown: stop cleanup timer, flush pending writes.\n */\n shutdown(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n this.flushToFile();\n log.info('Session store shut down', { bindings: this.cache.size });\n }\n\n /** For testing: return the number of cached bindings. */\n get size(): number {\n return this.cache.size;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private makeKey(contextId: string, provider: ProviderType): string {\n return `${provider}:${contextId}`;\n }\n\n private isExpired(binding: SessionBinding): boolean {\n if (!binding.expiresAt) return false;\n return Date.now() >= new Date(binding.expiresAt).getTime();\n }\n\n private startCleanup(intervalMs: number): void {\n this.cleanupTimer = setInterval(() => this.cleanup(), intervalMs);\n this.cleanupTimer.unref(); // don't keep process alive\n }\n\n // ── Persistence ───────────────────────────────────────────────────────\n\n private markDirty(): void {\n if (!this.persist) return;\n this.dirty = true;\n if (!this.flushTimeout) {\n // Debounce writes by 1 second to batch rapid updates\n this.flushTimeout = setTimeout(() => {\n this.flushToFile();\n }, 1000);\n }\n }\n\n private flushToFile(): void {\n this.flushTimeout = null;\n if (!this.persist || !this.dirty) return;\n this.dirty = false;\n this.writeAtomically();\n }\n\n private writeAtomically(): void {\n const tmpPath = this.storePath + '.tmp';\n const data: StoreData = {\n version: 1,\n bindings: Array.from(this.cache.values()),\n };\n\n try {\n mkdirSync(dirname(this.storePath), { recursive: true });\n writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\n renameSync(tmpPath, this.storePath);\n } catch (err) {\n log.error('Failed to write session store', { error: (err as Error).message });\n // Clean up temp file if it exists\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n }\n }\n\n private loadFromFile(): void {\n if (!this.persist || !existsSync(this.storePath)) return;\n\n try {\n const raw = readFileSync(this.storePath, 'utf-8');\n const data = JSON.parse(raw) as StoreData;\n\n if (!data || !Array.isArray(data.bindings)) {\n throw new Error('Invalid store format: bindings array missing');\n }\n\n let loaded = 0;\n let expired = 0;\n for (const b of data.bindings) {\n if (!b.provider || !b.contextId || !b.sessionId) continue; // skip malformed\n if (this.isExpired(b)) {\n expired++;\n continue;\n }\n const key = this.makeKey(b.contextId, b.provider);\n this.cache.set(key, b);\n loaded++;\n }\n\n log.info('Session store loaded', { path: this.storePath, loaded, expired });\n } catch (err) {\n log.error('Failed to load session store — starting fresh', {\n path: this.storePath,\n error: (err as Error).message,\n });\n this.cache.clear();\n // Write a clean empty store so the corrupted file doesn't block next start\n this.writeAtomically();\n }\n }\n}\n\n/**\n * Generate a new contextId for use when the A2A client doesn't provide one.\n */\nexport function generateContextId(): string {\n return randomUUID();\n}\n","/**\n * OpenCode CLI client wrapper.\n *\n * Spawns the OpenCode CLI as a child process. For the first turn, uses\n * `--format json` to discover the session ID, then extracts the response\n * text. For subsequent turns, uses `--session <id>` to continue the\n * conversation with plain text output.\n */\n\nimport { spawn } from 'node:child_process';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('opencode:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface OpenCodeClientConfig {\n /** Path to the opencode binary (default: \"opencode\") */\n cliPath: string;\n /** Working directory for the process */\n workdir: string;\n /** Model identifier (e.g. \"anthropic/claude-sonnet-4\") */\n model?: string;\n /** Agent preset name */\n agent?: string;\n /** Optional URL of a running OpenCode server to attach to */\n attachUrl?: string;\n /** Timeout in ms (default: 600_000 = 10 min) */\n timeout?: number;\n}\n\nexport interface OpenCodeExecuteResult {\n text: string;\n sessionId: string;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class OpenCodeClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: OpenCodeClientConfig) {}\n\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the OpenCode CLI.\n *\n * @param prompt - The user prompt text.\n * @param sessionId - If provided, continues the session with `--session`.\n * Otherwise creates a new session using `--format json` to capture the\n * session ID.\n * @param workingDirectory - Optional per-request working directory override.\n * Falls back to config.workdir if not provided.\n */\n async execute(prompt: string, sessionId?: string, workingDirectory?: string): Promise<OpenCodeExecuteResult> {\n if (sessionId) {\n const text = await this.runResume(prompt, sessionId, workingDirectory);\n return { text, sessionId };\n }\n return this.runNew(prompt, workingDirectory);\n }\n\n private resolveWorkdir(override?: string): string {\n return override || this.config.workdir || process.cwd();\n }\n\n // ── New session (first turn) ──────────────────────────────────────────\n\n private async runNew(prompt: string, workingDirectory?: string): Promise<OpenCodeExecuteResult> {\n const cliPath = this.config.cliPath || 'opencode';\n const timeout = this.config.timeout ?? 600_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}).`);\n }\n\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n for (const key of ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OPENCODE_SERVER_PASSWORD', 'OPENCODE_SERVER_USERNAME']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n\n const args: string[] = ['run', '--format', 'json'];\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.agent) {\n args.push('--agent', this.config.agent);\n }\n if (this.config.attachUrl) {\n args.push('--attach', this.config.attachUrl);\n }\n args.push('--dangerously-skip-permissions', prompt);\n\n const workdir = this.resolveWorkdir(workingDirectory);\n log.info('Spawning opencode (new session, json)', { cliPath, workdir });\n\n return new Promise<OpenCodeExecuteResult>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: workdir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`OpenCode execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('OpenCode stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code !== 0) {\n const errMsg = stderr.trim() || stdout.trim() || `OpenCode exited with code ${code}`;\n log.warn('OpenCode non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n return;\n }\n\n try {\n const { text, sessionId } = this.parseJsonEvents(stdout);\n resolve({ text, sessionId });\n } catch (err) {\n reject(new Error(`Failed to parse OpenCode JSON output: ${(err as Error).message}`));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('OpenCode spawn failed', { error: err.message });\n reject(new Error(`Failed to start opencode: ${err.message}. Is it installed?`));\n });\n });\n }\n\n // ── Resume session ────────────────────────────────────────────────────\n\n private async runResume(prompt: string, sessionId: string, workingDirectory?: string): Promise<string> {\n const cliPath = this.config.cliPath || 'opencode';\n const timeout = this.config.timeout ?? 600_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}).`);\n }\n\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n for (const key of ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OPENCODE_SERVER_PASSWORD', 'OPENCODE_SERVER_USERNAME']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n\n const args: string[] = ['run', '--session', sessionId];\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.agent) {\n args.push('--agent', this.config.agent);\n }\n if (this.config.attachUrl) {\n args.push('--attach', this.config.attachUrl);\n }\n args.push('--format', 'default', '--dangerously-skip-permissions', prompt);\n\n const workdir = this.resolveWorkdir(workingDirectory);\n log.info('Spawning opencode (resume)', { sessionId, workdir });\n\n return new Promise<string>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: workdir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`OpenCode execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('OpenCode stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n const errMsg = stderr.trim() || stdout.trim() || `OpenCode exited with code ${code}`;\n log.warn('OpenCode non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('OpenCode spawn failed', { error: err.message });\n reject(new Error(`Failed to start opencode: ${err.message}. Is it installed?`));\n });\n });\n }\n\n // ── Parser ────────────────────────────────────────────────────────────\n\n /**\n * Parse newline-delimited JSON events from OpenCode's `--format json` output.\n * Extracts the sessionID from the first event that contains it, and\n * accumulates text content from relevant events.\n */\n private parseJsonEvents(stdout: string): { text: string; sessionId: string } {\n const lines = stdout.split('\\n').filter((l) => l.trim());\n let sessionId = '';\n const textParts: string[] = [];\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n\n // Capture sessionID from any event that has it\n if (!sessionId && event.sessionID) {\n sessionId = event.sessionID as string;\n }\n\n // Skip error events — they don't contain user-facing text\n if (event.type === 'error') continue;\n\n // Extract text from events that have content\n // Common OpenCode event shapes: { type, text }, { type, content }, { message }\n const text = event.text as string | undefined\n || event.content as string | undefined\n || event.message as string | undefined;\n\n if (text) {\n textParts.push(text);\n }\n }\n\n if (!sessionId) {\n // Fallback: if no sessionID in JSON, the output may be plain text from\n // a non-JSON mode invocation. Return the raw text.\n return {\n text: textParts.join('\\n').trim() || stdout.trim(),\n sessionId: '',\n };\n }\n\n return {\n text: textParts.join('\\n').trim() || 'No response from OpenCode.',\n sessionId,\n };\n }\n}\n","/**\n * A2A event publishing helpers.\n *\n * Thin wrappers around ExecutionEventBus.publish() that construct\n * spec-compliant A2A task status and artifact update events.\n */\n\nimport { TaskState } from '@a2a-js/sdk';\nimport type { TaskStatusUpdateEvent, TaskArtifactUpdateEvent, Message as A2AMessage } from '@a2a-js/sdk';\nimport type { ExecutionEventBus } from '@a2a-js/sdk/server';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Extract plain text content from an A2A message's parts.\n */\nexport function extractText(message: A2AMessage): string {\n return message.parts\n .filter((p) => {\n const part = p as unknown as Record<string, unknown>;\n const text = part.text as string | undefined;\n return text !== undefined && text !== null;\n })\n .map((p) => (p as unknown as { text: string }).text)\n .join('\\n');\n}\n\n/**\n * Register a task with the execution event bus before publishing any events.\n */\nexport function publishTask(bus: ExecutionEventBus, taskId: string, contextId: string): void {\n bus.publish({\n kind: 'task',\n taskId,\n contextId,\n } as unknown as TaskStatusUpdateEvent);\n}\n\n/**\n * Publish a task status update.\n */\nexport function publishStatus(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n state: TaskState | string,\n messageText?: string,\n final?: boolean,\n): void {\n const event: TaskStatusUpdateEvent = {\n kind: 'task-status-update',\n taskId,\n contextId,\n status: {\n state: state as TaskState,\n message: messageText\n ? { role: 'agent', parts: [{ kind: 'text', text: messageText }] }\n : undefined,\n },\n final: final ?? false,\n } as unknown as TaskStatusUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish a complete artifact (non-streaming).\n */\nexport function publishFinalArtifact(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n text: string,\n): void {\n const artifactId = uuidv4();\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text }],\n },\n lastChunk: true,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish a streaming artifact chunk.\n */\nexport function publishStreamingChunk(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n artifactId: string,\n chunkText: string,\n): void {\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text: chunkText }],\n },\n lastChunk: false,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n\n/**\n * Publish the final streaming chunk with full accumulated text.\n */\nexport function publishLastChunkMarker(\n bus: ExecutionEventBus,\n taskId: string,\n contextId: string,\n artifactId: string,\n fullText: string,\n): void {\n const event: TaskArtifactUpdateEvent = {\n kind: 'task-artifact-update',\n taskId,\n contextId,\n artifact: {\n artifactId,\n parts: [{ kind: 'text', text: fullText }],\n },\n lastChunk: true,\n } as unknown as TaskArtifactUpdateEvent;\n bus.publish(event);\n}\n","/**\n * OpenCode A2A Executor\n *\n * Bridges the local OpenCode CLI to the A2A protocol. Spawns `opencode run`\n * as a child process for each request. Supports multi-turn conversation\n * via contextId → sessionId binding through SessionBindingStore.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport type { SessionBindingStore } from '../../session-store.js';\nimport { generateContextId } from '../../session-store.js';\nimport { logger } from '../../logger.js';\nimport { OpenCodeClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n extractText,\n} from '../events.js';\n\nconst log = logger.child('opencode:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class OpenCodeExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: OpenCodeClient | null = null;\n private initialized = false;\n private sessionStore: SessionBindingStore;\n\n constructor(config: Required<AgentConfig>, sessionStore: SessionBindingStore) {\n this.config = config;\n this.sessionStore = sessionStore;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const oc = this.config.opencode;\n this.client = new OpenCodeClient({\n cliPath: 'opencode',\n workdir: oc.projectDirectory || process.cwd(),\n model: oc.model || undefined,\n agent: oc.agent || undefined,\n attachUrl: oc.baseUrl || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { workdir: oc.projectDirectory, model: oc.model });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, userMessage } = ctx;\n await this.initialize();\n\n const reuseByContext = this.config.session?.reuseByContext ?? true;\n\n let contextId = ctx.contextId;\n if (!contextId) {\n contextId = generateContextId();\n log.info('Generated new contextId', { contextId, taskId });\n }\n\n const binding = reuseByContext\n ? this.sessionStore.get(contextId, 'opencode')\n : null;\n\n const sessionId = binding?.sessionId;\n\n try {\n const existingTask = ctx.task;\n if (!existingTask) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n publishStatus(bus, taskId, contextId, 'working');\n\n const promptText = extractText(userMessage);\n\n // Extract per-request workingDirectory from A2A message metadata\n const userMsg = userMessage as unknown as Record<string, unknown>;\n const workingDirectory = userMsg.metadata &&\n typeof userMsg.metadata === 'object'\n ? (userMsg.metadata as Record<string, unknown>).workingDirectory as string | undefined\n : undefined;\n\n log.info('Sending prompt to OpenCode', {\n taskId,\n contextId,\n sessionId: sessionId || '(new)',\n len: promptText.length,\n workingDirectory: workingDirectory || '(default)',\n });\n\n const result = await this.client!.execute(promptText, sessionId, workingDirectory);\n\n this.sessionStore.set({\n provider: 'opencode',\n contextId,\n sessionId: result.sessionId,\n activeTaskId: undefined,\n activeTaskState: undefined,\n createdAt: binding?.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + (this.config.session?.ttl ?? 24 * 60 * 60 * 1000)).toISOString(),\n });\n\n publishFinalArtifact(bus, taskId, contextId, result.text || 'No response from OpenCode.');\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, contextId, sessionId: result.sessionId });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, contextId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for OpenCode task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'OpenCode task cancelled', true);\n bus.finished();\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createOpenCodeExecutor(\n config: Required<AgentConfig>,\n sessionStore: SessionBindingStore,\n): A2AExecutor {\n return new OpenCodeExecutor(config, sessionStore);\n}\n","/**\n * Codex CLI client wrapper.\n *\n * Spawns the OpenAI Codex CLI as a child process, sends prompts via stdin,\n * captures stdout as the response. Supports session persistence: on first\n * call the thread_id is extracted from JSONL output, and subsequent calls\n * use `codex exec resume <sessionId>` for multi-turn continuation.\n */\n\nimport { spawn } from 'node:child_process';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('codex:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface CodexClientConfig {\n /** Path to the codex binary (default: \"codex\") */\n cliPath: string;\n /** Working directory for the codex process */\n workdir: string;\n /** Model identifier (e.g. \"gpt-4o\") — passed as CODELLM env or --model flag */\n model?: string;\n /** OpenAI API key — passed as OPENAI_API_KEY env */\n apiKey?: string;\n /** Timeout in ms (default: 300_000 = 5 min) */\n timeout?: number;\n}\n\nexport interface CodexExecuteResult {\n text: string;\n sessionId: string;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class CodexClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: CodexClientConfig) {}\n\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the Codex CLI.\n *\n * @param prompt - The user prompt text.\n * @param sessionId - If provided, resumes an existing session.\n * Otherwise creates a new session and extracts the thread_id from JSONL.\n * @param workingDirectory - Optional per-request working directory override.\n */\n async execute(prompt: string, sessionId?: string, workingDirectory?: string): Promise<CodexExecuteResult> {\n if (sessionId) {\n return this.executeResume(prompt, sessionId, workingDirectory);\n }\n return this.executeNew(prompt, workingDirectory);\n }\n\n private resolveWorkdir(override?: string): string {\n return override || this.config.workdir || process.cwd();\n }\n\n // ── New session (first turn) ──────────────────────────────────────────\n\n private async executeNew(prompt: string, workingDirectory?: string): Promise<CodexExecuteResult> {\n const cliPath = this.config.cliPath || 'codex';\n const timeout = this.config.timeout ?? 300_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}). Split into smaller messages.`);\n }\n\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n if (this.config.apiKey) {\n env['OPENAI_API_KEY'] = this.config.apiKey;\n }\n\n const args: string[] = ['exec', '--json'];\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n args.push(\n '--dangerously-bypass-approvals-and-sandbox',\n '--skip-git-repo-check',\n prompt,\n );\n\n const workdir = this.resolveWorkdir(workingDirectory);\n log.info('Spawning codex (new session)', { cliPath, workdir, model: this.config.model });\n\n return new Promise<CodexExecuteResult>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: workdir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`Codex execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('Codex stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code !== 0) {\n const errMsg = stderr.trim() || stdout.trim() || `Codex exited with code ${code}`;\n log.warn('Codex non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n return;\n }\n\n try {\n const { text, sessionId } = this.parseJsonl(stdout);\n resolve({ text, sessionId });\n } catch (err) {\n reject(new Error(`Failed to parse Codex JSONL output: ${(err as Error).message}`));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('Codex spawn failed', { error: err.message });\n reject(new Error(`Failed to start codex: ${err.message}. Is it installed? (npm i -g @openai/codex)`));\n });\n });\n }\n\n // ── Resume session (subsequent turns) ─────────────────────────────────\n\n private async executeResume(prompt: string, sessionId: string, workingDirectory?: string): Promise<CodexExecuteResult> {\n const cliPath = this.config.cliPath || 'codex';\n const timeout = this.config.timeout ?? 300_000;\n const MAX_PROMPT = 100_000;\n\n if (prompt.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${prompt.length} chars, max ${MAX_PROMPT}). Split into smaller messages.`);\n }\n\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n if (this.config.apiKey) {\n env['OPENAI_API_KEY'] = this.config.apiKey;\n }\n\n const args: string[] = ['exec', 'resume', sessionId];\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n args.push(\n '--dangerously-bypass-approvals-and-sandbox',\n '--skip-git-repo-check',\n prompt,\n );\n\n const workdir = this.resolveWorkdir(workingDirectory);\n log.info('Spawning codex (resume)', { sessionId, workdir });\n\n return new Promise<CodexExecuteResult>((resolve, reject) => {\n const child = spawn(cliPath, args, {\n cwd: workdir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`Codex execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('Codex stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code !== 0) {\n const errMsg = stderr.trim() || stdout.trim() || `Codex exited with code ${code}`;\n log.warn('Codex non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n return;\n }\n\n // Resume output: the CLI prints session metadata header + agent response.\n // Strip the header lines (first 2+ lines before the actual output).\n // The header looks like:\n // OpenAI Codex v0.142.0\n // --------\n // workdir: ...\n // ...\n // --------\n // user\n // ...\n // codex\n // <actual response>\n const text = this.extractResumeText(stdout);\n resolve({ text, sessionId });\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('Codex spawn failed', { error: err.message });\n reject(new Error(`Failed to start codex: ${err.message}. Is it installed? (npm i -g @openai/codex)`));\n });\n });\n }\n\n // ── Parsers ───────────────────────────────────────────────────────────\n\n /**\n * Parse JSONL output to extract session thread_id and agent response text.\n */\n private parseJsonl(stdout: string): { text: string; sessionId: string } {\n const lines = stdout.split('\\n').filter((l) => l.trim());\n let sessionId = '';\n const textParts: string[] = [];\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n\n // Extract thread_id from thread.started event\n if (event.type === 'thread.started' && event.thread_id) {\n sessionId = event.thread_id as string;\n }\n\n // Extract text from agent messages in item.completed events\n if (event.type === 'item.completed') {\n const item = event.item as Record<string, unknown> | undefined;\n if (item && item.type === 'agent_message' && item.text) {\n textParts.push(item.text as string);\n }\n }\n }\n\n if (!sessionId) {\n throw new Error('No thread_id found in Codex JSONL output');\n }\n\n return {\n text: textParts.join('\\n').trim() || 'No response from Codex.',\n sessionId,\n };\n }\n\n /**\n * Extract the agent response text from the resume mode output.\n *\n * The resume output includes a CLI header followed by the conversation.\n * We extract everything after the last \"codex\" marker line as the\n * latest agent response.\n */\n private extractResumeText(stdout: string): string {\n const lines = stdout.split('\\n');\n\n // Find the separator: the last \"codex\" line marks the start of the response\n let responseStart = -1;\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim() === 'codex') {\n responseStart = i;\n }\n }\n\n if (responseStart >= 0 && responseStart + 1 < lines.length) {\n return lines.slice(responseStart + 1).join('\\n').trim();\n }\n\n // Fallback: strip known header lines\n let skipHeader = true;\n const resultLines: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (skipHeader) {\n if (trimmed === '--------' || trimmed === 'codex') {\n skipHeader = false;\n }\n continue;\n }\n if (trimmed === 'user' || trimmed === 'codex') {\n continue;\n }\n if (trimmed.startsWith('tokens used')) {\n if (resultLines.length > 0) resultLines.pop();\n break;\n }\n resultLines.push(line);\n }\n\n return resultLines.join('\\n').trim() || stdout.trim();\n }\n}\n","/**\n * Codex A2A Executor\n *\n * Bridges the local Codex CLI to the A2A protocol. Spawns Codex as a\n * child process for each request. Supports multi-turn conversation via\n * contextId → sessionId binding through SessionBindingStore.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport type { SessionBindingStore } from '../../session-store.js';\nimport { generateContextId } from '../../session-store.js';\nimport { logger } from '../../logger.js';\nimport { CodexClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n extractText,\n} from '../events.js';\n\nconst log = logger.child('codex:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class CodexExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: CodexClient | null = null;\n private initialized = false;\n private sessionStore: SessionBindingStore;\n\n constructor(config: Required<AgentConfig>, sessionStore: SessionBindingStore) {\n this.config = config;\n this.sessionStore = sessionStore;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const cx = this.config.codex;\n this.client = new CodexClient({\n cliPath: cx.cliPath!,\n workdir: cx.workdir!,\n model: cx.model || undefined,\n apiKey: cx.apiKey || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { cliPath: cx.cliPath, workdir: cx.workdir });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, userMessage } = ctx;\n await this.initialize();\n\n const reuseByContext = this.config.session?.reuseByContext ?? true;\n\n // Resolve contextId: use provided one or generate new\n let contextId = ctx.contextId;\n if (!contextId) {\n contextId = generateContextId();\n log.info('Generated new contextId', { contextId, taskId });\n }\n\n // Look up existing session binding\n const binding = reuseByContext\n ? this.sessionStore.get(contextId, 'codex')\n : null;\n\n const sessionId = binding?.sessionId;\n\n try {\n // Register task (always include contextId so client can track)\n const existingTask = ctx.task;\n if (!existingTask) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n publishStatus(bus, taskId, contextId, 'working');\n\n const promptText = extractText(userMessage);\n\n // Extract per-request workingDirectory from A2A message metadata\n const userMsg = userMessage as unknown as Record<string, unknown>;\n const workingDirectory = userMsg.metadata &&\n typeof userMsg.metadata === 'object'\n ? (userMsg.metadata as Record<string, unknown>).workingDirectory as string | undefined\n : undefined;\n\n log.info('Sending prompt to Codex', {\n taskId,\n contextId,\n sessionId: sessionId || '(new)',\n len: promptText.length,\n workingDirectory: workingDirectory || '(default)',\n });\n\n const result = await this.client!.execute(promptText, sessionId, workingDirectory);\n\n // Save or update session binding\n this.sessionStore.set({\n provider: 'codex',\n contextId,\n sessionId: result.sessionId,\n activeTaskId: undefined,\n activeTaskState: undefined,\n createdAt: binding?.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + (this.config.session?.ttl ?? 24 * 60 * 60 * 1000)).toISOString(),\n });\n\n // Finalize\n publishFinalArtifact(bus, taskId, contextId, result.text || 'No response from Codex.');\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, contextId, sessionId: result.sessionId });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, contextId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for Codex task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'Codex task cancelled', true);\n bus.finished();\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createCodexExecutor(\n config: Required<AgentConfig>,\n sessionStore: SessionBindingStore,\n): A2AExecutor {\n return new CodexExecutor(config, sessionStore);\n}\n","/**\n * Claude Code CLI client wrapper.\n *\n * Spawns the Anthropic Claude Code CLI as a child process in non-interactive\n * print mode (`-p`). Sends prompts, captures stdout as the response.\n * Supports session persistence: first call uses `--session-id <uuid>` to\n * create a named session; subsequent calls use `--resume <uuid>` to continue.\n */\n\nimport { spawn } from 'node:child_process';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../logger.js';\n\nconst log = logger.child('claude:client');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ClaudeClientConfig {\n /** Path to the claude binary (default: \"claude\") */\n cliPath: string;\n /** Working directory for the process */\n workdir: string;\n /** Model identifier (e.g. \"claude-sonnet-4-20250514\") — passed via --model */\n model?: string;\n /** Anthropic API key — passed as ANTHROPIC_API_KEY env */\n apiKey?: string;\n /** Timeout in ms (default: 300_000 = 5 min) */\n timeout?: number;\n}\n\nexport interface ClaudeExecuteResult {\n text: string;\n sessionId: string;\n}\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class ClaudeClient {\n private currentChild: ReturnType<typeof spawn> | null = null;\n\n constructor(private config: ClaudeClientConfig) {}\n\n abort(): void {\n if (this.currentChild) {\n this.currentChild.kill('SIGTERM');\n setTimeout(() => {\n if (this.currentChild?.exitCode === null) {\n this.currentChild.kill('SIGKILL');\n }\n }, 5000);\n this.currentChild = null;\n }\n }\n\n /**\n * Execute a prompt via the Claude Code CLI.\n *\n * @param prompt - The user prompt text.\n * @param sessionId - If provided, resumes the session with `--resume`.\n * Otherwise creates a new session with `--session-id <new-uuid>`.\n * @param workingDirectory - Optional per-request working directory override.\n * @returns The response text and the session ID (new or existing).\n */\n async execute(prompt: string, sessionId?: string, workingDirectory?: string): Promise<ClaudeExecuteResult> {\n if (sessionId) {\n const text = await this.run(['-p', '--resume', sessionId, prompt], workingDirectory);\n return { text, sessionId };\n }\n\n const newSessionId = uuidv4();\n const text = await this.run(['-p', '--session-id', newSessionId, prompt], workingDirectory);\n return { text, sessionId: newSessionId };\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private async run(args: string[], workingDirectory?: string): Promise<string> {\n const cliPath = this.config.cliPath || 'claude';\n const timeout = this.config.timeout ?? 300_000;\n const MAX_PROMPT = 100_000;\n\n // Validate prompt size\n const promptArg = args[args.length - 1];\n if (promptArg && promptArg.length > MAX_PROMPT) {\n throw new Error(`Prompt too large (${promptArg.length} chars, max ${MAX_PROMPT}). Split into smaller messages.`);\n }\n\n // Only pass relevant env vars to child process\n const env: Record<string, string> = {\n PATH: process.env.PATH ?? '',\n HOME: process.env.HOME ?? '',\n };\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'no_proxy']) {\n if (process.env[key]) env[key] = process.env[key];\n }\n if (this.config.apiKey) {\n env['ANTHROPIC_API_KEY'] = this.config.apiKey;\n }\n\n // Build full args: base args + model + prompt\n const fullArgs: string[] = [];\n for (const arg of args.slice(0, -1)) {\n fullArgs.push(arg);\n }\n if (this.config.model) {\n fullArgs.push('--model', this.config.model);\n }\n fullArgs.push(promptArg);\n\n const workdir = workingDirectory || this.config.workdir || process.cwd();\n log.info('Spawning claude', { cliPath, workdir, model: this.config.model });\n\n return new Promise<string>((resolve, reject) => {\n const child = spawn(cliPath, fullArgs, {\n cwd: workdir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.currentChild = child;\n\n let stdout = '';\n let stderr = '';\n const MAX_OUTPUT = 10_000_000;\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n const forceTimer = setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, 5000);\n child.on('close', () => clearTimeout(forceTimer));\n reject(new Error(`Claude Code execution timed out after ${timeout}ms`));\n }, timeout);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n if (stdout.length > MAX_OUTPUT) {\n child.kill('SIGTERM');\n setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); }, 5000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n log.debug('Claude stderr', { text: chunk.toString().trim() });\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n this.currentChild = null;\n\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n const errMsg = stderr.trim() || stdout.trim() || `Claude Code exited with code ${code}`;\n log.warn('Claude non-zero exit', { code, stderr: errMsg });\n reject(new Error(errMsg));\n }\n });\n\n child.on('error', (err) => {\n clearTimeout(timer);\n log.error('Claude spawn failed', { error: err.message });\n reject(new Error(`Failed to start claude: ${err.message}. Install: npm i -g @anthropic-ai/claude-code`));\n });\n });\n }\n}\n","/**\n * Claude Code A2A Executor\n *\n * Bridges the local Claude Code CLI to the A2A protocol. Spawns Claude Code\n * in non-interactive print mode (`-p`) for each request. Supports multi-turn\n * conversation via contextId → sessionId binding through SessionBindingStore.\n */\n\nimport type { A2AExecutor } from '../index.js';\nimport type { RequestContext, ExecutionEventBus } from '@a2a-js/sdk/server';\n\nimport type { AgentConfig } from '../../config/types.js';\nimport type { SessionBindingStore } from '../../session-store.js';\nimport { generateContextId } from '../../session-store.js';\nimport { logger } from '../../logger.js';\nimport { ClaudeClient } from './client.js';\nimport {\n publishTask,\n publishStatus,\n publishFinalArtifact,\n extractText,\n} from '../events.js';\n\nconst log = logger.child('claude:executor');\n\n// ─── Executor ───────────────────────────────────────────────────────────────\n\nexport class ClaudeExecutor implements A2AExecutor {\n private config: Required<AgentConfig>;\n private client: ClaudeClient | null = null;\n private initialized = false;\n private sessionStore: SessionBindingStore;\n\n constructor(config: Required<AgentConfig>, sessionStore: SessionBindingStore) {\n this.config = config;\n this.sessionStore = sessionStore;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const cc = this.config.claude;\n this.client = new ClaudeClient({\n cliPath: cc.cliPath!,\n workdir: cc.workdir!,\n model: cc.model || undefined,\n apiKey: cc.apiKey || undefined,\n timeout: this.config.timeouts.prompt ?? 600_000,\n });\n\n this.initialized = true;\n log.info('Executor initialized', { cliPath: cc.cliPath, workdir: cc.workdir });\n }\n\n async shutdown(): Promise<void> {\n this.client = null;\n this.initialized = false;\n log.info('Executor shut down');\n }\n\n async execute(ctx: RequestContext, bus: ExecutionEventBus): Promise<void> {\n const { taskId, userMessage } = ctx;\n await this.initialize();\n\n const reuseByContext = this.config.session?.reuseByContext ?? true;\n\n let contextId = ctx.contextId;\n if (!contextId) {\n contextId = generateContextId();\n log.info('Generated new contextId', { contextId, taskId });\n }\n\n const binding = reuseByContext\n ? this.sessionStore.get(contextId, 'claude')\n : null;\n\n const sessionId = binding?.sessionId;\n\n try {\n const existingTask = ctx.task;\n if (!existingTask) {\n publishTask(bus, taskId, contextId);\n publishStatus(bus, taskId, contextId, 'submitted');\n }\n\n publishStatus(bus, taskId, contextId, 'working');\n\n const promptText = extractText(userMessage);\n\n // Extract per-request workingDirectory from A2A message metadata\n const userMsg = userMessage as unknown as Record<string, unknown>;\n const workingDirectory = userMsg.metadata &&\n typeof userMsg.metadata === 'object'\n ? (userMsg.metadata as Record<string, unknown>).workingDirectory as string | undefined\n : undefined;\n\n log.info('Sending prompt to Claude Code', {\n taskId,\n contextId,\n sessionId: sessionId || '(new)',\n len: promptText.length,\n workingDirectory: workingDirectory || '(default)',\n });\n\n const result = await this.client!.execute(promptText, sessionId, workingDirectory);\n\n this.sessionStore.set({\n provider: 'claude',\n contextId,\n sessionId: result.sessionId,\n activeTaskId: undefined,\n activeTaskState: undefined,\n createdAt: binding?.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + (this.config.session?.ttl ?? 24 * 60 * 60 * 1000)).toISOString(),\n });\n\n publishFinalArtifact(bus, taskId, contextId, result.text || 'No response from Claude Code.');\n publishStatus(bus, taskId, contextId, 'completed', undefined, true);\n bus.finished();\n log.info('Task completed', { taskId, contextId, sessionId: result.sessionId });\n\n } catch (error) {\n const msg = (error as Error).message ?? String(error);\n log.error('Execution failed', { taskId, contextId, error: msg });\n publishStatus(bus, taskId, contextId, 'failed', `Error: ${msg}`, true);\n bus.finished();\n }\n }\n\n async cancelTask(taskId: string, bus: ExecutionEventBus): Promise<void> {\n log.info('Cancel requested for Claude Code task', { taskId });\n this.client?.abort();\n publishStatus(bus, taskId, '', 'canceled', 'Claude Code task cancelled', true);\n bus.finished();\n }\n}\n\n// ─── Factory ────────────────────────────────────────────────────────────────\n\nexport function createClaudeExecutor(\n config: Required<AgentConfig>,\n sessionStore: SessionBindingStore,\n): A2AExecutor {\n return new ClaudeExecutor(config, sessionStore);\n}\n","/**\n * A2A Bridge Client — connects to the gateway's WebSocket bridge and\n * proxies HTTP requests from the gateway to the local A2A Express server.\n *\n * Enables agents behind NAT/firewall to receive A2A requests without\n * a public IP or SSH tunnel. The agent opens an outbound WebSocket (which\n * is almost never blocked), and the gateway pushes requests over it.\n */\n\nimport { connect } from 'node:net';\nimport { randomBytes } from 'node:crypto';\nimport { logger } from './logger.js';\n\nconst log = logger.child('bridge');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface BridgeConfig {\n /** Gateway WebSocket URL (e.g. ws://gateway:8080/api/a2a/bridge) */\n bridgeUrl: string;\n /** API key for gateway auth (sent as x-api-key header during WebSocket upgrade) */\n apiKey: string;\n /** Agent ID to register as on the gateway */\n agentId: string;\n /** Full agent card object to advertise */\n agentCard: Record<string, unknown>;\n /** Local A2A server base URL to forward requests to */\n localBaseUrl: string;\n /** Reconnect delay in ms (default: 5000) */\n reconnectDelay?: number;\n}\n\n// ─── Very lightweight WS client (no dependency) ─────────────────────────────\n// Uses Node.js built-in HTTP upgrade → WebSocket framing (RFC 6455 minimal).\n// Enough for JSON text frames. Avoids pulling in the ws library.\n\nclass SimpleWs {\n private socket: ReturnType<typeof connect> | null = null;\n private buffer = Buffer.alloc(0);\n private handshaking = true;\n private httpBuffer = '';\n\n onopen?: () => void;\n onmessage?: (data: string) => void;\n onclose?: (code: number) => void;\n onerror?: (err: Error) => void;\n\n connect(urlStr: string, apiKey: string): void {\n const url = new URL(urlStr);\n const host = url.hostname;\n const port = parseInt(url.port) || (url.protocol === 'wss:' ? 443 : 80);\n const path = url.pathname + url.search;\n\n const key = randomBytes(16).toString('base64');\n\n const req = connect({ host, port }, () => {\n // Send WebSocket upgrade handshake\n const headers = [\n `GET ${path} HTTP/1.1`,\n `Host: ${host}:${port}`,\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Key: ${key}`,\n 'Sec-WebSocket-Version: 13',\n `x-api-key: ${apiKey}`,\n '',\n '',\n ].join('\\r\\n');\n\n if (this.socket) {\n this.socket.write(headers);\n }\n });\n\n this.socket = req;\n\n req.on('data', (chunk: Buffer) => {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n\n // First, validate HTTP upgrade response\n if (this.handshaking) {\n this.httpBuffer += chunk.toString();\n const headerEnd = this.httpBuffer.indexOf('\\r\\n\\r\\n');\n if (headerEnd === -1) return; // not complete yet\n\n const header = this.httpBuffer.substring(0, headerEnd);\n const statusLine = header.split('\\r\\n')[0] || '';\n\n if (!statusLine.startsWith('HTTP/1.1 101')) {\n // Extract response body for diagnostics\n const bodyStart = headerEnd + 4;\n const bodyText = this.httpBuffer.substring(bodyStart).trim();\n const errMsg = statusLine\n ? `WebSocket upgrade rejected: ${statusLine}`\n : 'WebSocket upgrade failed: no status line';\n this.onerror?.(new Error(errMsg + (bodyText ? ` (${bodyText.slice(0, 200)})` : '')));\n this.socket?.destroy();\n this.socket = null;\n return;\n }\n\n // Upgrade successful — discard HTTP header, keep any remaining data\n this.handshaking = false;\n const remaining = this.buffer.subarray(headerEnd + 4);\n this.buffer = remaining;\n this.httpBuffer = '';\n if (this.onopen) this.onopen();\n\n if (remaining.length === 0) return;\n // Fall through to frame parsing below\n }\n\n // Parse WebSocket frames\n while (this.buffer.length >= 2) {\n const opcode = this.buffer[0] & 0x0f;\n const masked = (this.buffer[1] & 0x80) !== 0;\n let offset = 2;\n let payloadLen = this.buffer[1] & 0x7f;\n\n if (payloadLen === 126) {\n if (this.buffer.length < 4) break;\n payloadLen = this.buffer.readUInt16BE(2);\n offset = 4;\n } else if (payloadLen === 127) {\n if (this.buffer.length < 10) break;\n // readUInt32BE for high 32 bits (should be 0 for realistic payloads)\n const hi = this.buffer.readUInt32BE(2);\n const lo = this.buffer.readUInt32BE(6);\n payloadLen = hi * 0x100000000 + lo;\n offset = 10;\n }\n\n if (this.buffer.length < offset + payloadLen) break;\n\n const payload = this.buffer.subarray(offset, offset + payloadLen);\n this.buffer = this.buffer.subarray(offset + payloadLen);\n\n if (masked) {\n // Server→client frames shouldn't be masked per spec, but handle anyway\n const mask = payload.subarray(0, 4);\n const data = payload.subarray(4);\n for (let i = 0; i < data.length; i++) {\n data[i] ^= mask[i % 4];\n }\n if (opcode === 1) {\n this.onmessage?.(data.toString());\n }\n } else {\n if (opcode === 1) {\n this.onmessage?.(payload.toString());\n } else if (opcode === 8) {\n this.onclose?.(1000);\n return;\n } else if (opcode === 9) {\n // Ping — respond with pong\n const pong = Buffer.from([0x8a, 0]);\n this.socket?.write(pong);\n }\n }\n }\n });\n\n req.on('error', (err: Error) => {\n this.onerror?.(err);\n });\n\n req.on('close', () => {\n this.onclose?.(1006);\n });\n }\n\n send(data: string): void {\n if (!this.socket) return;\n const payload = Buffer.from(data, 'utf-8');\n const len = payload.length;\n const maskKey = randomBytes(4);\n\n // RFC 6455: client MUST mask frames to server\n const masked = Buffer.alloc(len);\n for (let i = 0; i < len; i++) {\n masked[i] = payload[i] ^ maskKey[i % 4];\n }\n\n let header: Buffer;\n if (len < 126) {\n header = Buffer.alloc(6);\n header[0] = 0x81; // FIN + text opcode\n header[1] = 0x80 | len; // MASK bit set + length\n maskKey.copy(header, 2);\n } else if (len < 65536) {\n header = Buffer.alloc(8);\n header[0] = 0x81;\n header[1] = 0x80 | 126; // MASK + 126 marker\n header.writeUInt16BE(len, 2);\n maskKey.copy(header, 4);\n } else {\n header = Buffer.alloc(14);\n header[0] = 0x81;\n header[1] = 0x80 | 127; // MASK + 127 marker\n header.writeUInt32BE(0, 2);\n header.writeUInt32BE(len, 6);\n maskKey.copy(header, 10);\n }\n\n this.socket.write(Buffer.concat([header, masked]));\n }\n\n close(): void {\n if (!this.socket) return;\n const frame = Buffer.from([0x88, 0x00]); // close frame\n this.socket.write(frame);\n this.socket.destroy();\n this.socket = null;\n }\n}\n\n// ─── Bridge Client ──────────────────────────────────────────────────────────\n\nexport class BridgeClient {\n private ws: SimpleWs | null = null;\n private running = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private config: BridgeConfig) {}\n\n /**\n * Start the bridge — connect WebSocket and begin serving proxy requests.\n * Returns a promise that resolves when connected. Reconnects on disconnect.\n */\n async start(): Promise<void> {\n this.running = true;\n\n return new Promise((resolve, reject) => {\n this.ws = new SimpleWs();\n\n let firstConnect = true;\n\n this.ws.onopen = () => {\n log.info('Bridge connected');\n // Register with the gateway\n this.ws!.send(JSON.stringify({\n type: 'agent:register',\n agentId: this.config.agentId,\n agentCard: this.config.agentCard,\n }));\n };\n\n this.ws.onmessage = async (raw: string) => {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n if (msg.type === 'agent:registered') {\n log.info('Agent registered via bridge', { agentId: this.config.agentId });\n if (firstConnect) {\n firstConnect = false;\n resolve();\n }\n return;\n }\n\n if (msg.type === 'http:request') {\n this.handleHttpRequest(msg);\n }\n };\n\n this.ws.onclose = () => {\n log.warn('Bridge disconnected, reconnecting...');\n if (this.running) {\n this.reconnectTimer = setTimeout(\n () => this.start().catch(() => {}),\n this.config.reconnectDelay ?? 5000,\n );\n }\n };\n\n this.ws.onerror = (err: Error) => {\n log.error('Bridge error', { error: err.message });\n if (firstConnect) {\n firstConnect = false;\n reject(err);\n }\n };\n\n log.info('Connecting bridge', { url: this.config.bridgeUrl });\n this.ws.connect(this.config.bridgeUrl, this.config.apiKey);\n });\n }\n\n /**\n * Stop the bridge.\n */\n stop(): void {\n this.running = false;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n this.ws = null;\n log.info('Bridge stopped');\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private async handleHttpRequest(msg: Record<string, unknown>): Promise<void> {\n const requestId = msg.requestId as string;\n const method = (msg.method as string) ?? 'GET';\n const path = (msg.path as string) ?? '/';\n const headers = (msg.headers as Record<string, string>) ?? {};\n const body = (msg.body as string) ?? '';\n\n const url = `${this.config.localBaseUrl}${path}`;\n\n try {\n const fetchHeaders: Record<string, string> = { ...headers };\n const fetchOpts: RequestInit = {\n method,\n headers: fetchHeaders,\n signal: AbortSignal.timeout(300_000),\n };\n\n if (body && method !== 'GET') {\n fetchOpts.body = body;\n }\n\n const resp = await fetch(url, fetchOpts);\n\n const responseBody = await resp.text();\n\n const responseHeaders: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n this.ws?.send(JSON.stringify({\n type: 'http:response',\n requestId,\n status: resp.status,\n headers: responseHeaders,\n body: responseBody,\n }));\n } catch (err) {\n log.error('Proxy request failed', { url, error: (err as Error).message });\n this.ws?.send(JSON.stringify({\n type: 'http:error',\n requestId,\n message: (err as Error).message,\n }));\n }\n }\n}\n","#!/usr/bin/env node\n/**\n * CLI A2A Gateway — Entry Point\n *\n * Usage:\n * npx @axiom-lattice/cli-a2a --provider opencode --config agents/example.json\n * npx @axiom-lattice/cli-a2a --provider opencode --port 3000 --opencode-url http://localhost:4096\n *\n * Run with --help for full usage.\n */\n\nimport { parseArgs } from 'node:util';\nimport { dirname, resolve } from 'node:path';\nimport { resolveConfig } from './config/loader.js';\nimport type { AgentConfig, ProviderType } from './config/types.js';\nimport { createA2AServer } from './server/index.js';\nimport { logger, LogLevel } from './logger.js';\n\nconst log = logger.child('cli');\n\n// ─── Version ────────────────────────────────────────────────────────────────\n\nconst PKG_VERSION = '0.1.0';\n\n// ─── Usage ──────────────────────────────────────────────────────────────────\n\nfunction printUsage(): void {\n console.log(`\nUsage: cli-a2a [options]\n\nOptions:\n --provider <name> Provider: opencode | codex | claude\n --config, -c <path> Path to agent JSON config file\n --port, -p <number> A2A server port (default: 3000)\n --hostname <addr> Bind address (default: 0.0.0.0)\n --advertise-host <host> Hostname for agent card URLs\n --agent-name <name> Agent display name\n --agent-description <desc> Agent description\n --log-level <level> debug | info | warn | error (default: info)\n\nGateway Registration:\n --register-url <url> Gateway URL to register this agent with\n --register-key <key> API key for gateway authentication\n --unregister-on-shutdown Remove agent from gateway on exit\n\nBridge (NAT traversal):\n --bridge-url <url> Gateway WebSocket bridge (ws://gateway:8080/api/a2a/bridge)\n --bridge-key <key> API key for bridge authentication\n\nOpenCode Options:\n --opencode-url <url> OpenCode server URL (default: http://localhost:4096)\n --directory, -d <path> Project directory\n --model, -m <provider/model> LLM model (e.g. anthropic/claude-sonnet-4)\n --agent <name> OpenCode agent preset\n\nCodex Options:\n --codex-model <model> Codex model ID\n --codex-api-key <key> OpenAI API key\n\nClaude Options:\n --claude-model <model> Claude Code model ID\n --claude-api-key <key> Anthropic API key\n\n --help, -h Show this help\n --version, -v Show version\n\nExamples:\n npx @axiom-lattice/cli-a2a --provider opencode\n npx @axiom-lattice/cli-a2a --provider opencode --port 3001 --opencode-url http://localhost:4096\n npx @axiom-lattice/cli-a2a --config ./my-agent.json\n npx @axiom-lattice/cli-a2a --provider opencode --model anthropic/claude-sonnet-4\n npx @axiom-lattice/cli-a2a --provider opencode --register-url http://gateway:8080 --register-key sk-xxx --unregister-on-shutdown\n npx @axiom-lattice/cli-a2a --provider opencode --bridge-url ws://gateway:8080/api/a2a/bridge --bridge-key sk-xxx\n`);\n}\n\n// ─── CLI Args ───────────────────────────────────────────────────────────────\n\nfunction parseCliArgs(): {\n configPath?: string;\n overrides: Partial<AgentConfig>;\n registerUrl?: string;\n registerKey?: string;\n unregisterOnShutdown: boolean;\n bridgeUrl?: string;\n bridgeKey?: string;\n} {\n const { values } = parseArgs({\n options: {\n provider: { type: 'string' },\n config: { type: 'string', short: 'c' },\n port: { type: 'string', short: 'p' },\n hostname: { type: 'string' },\n 'advertise-host': { type: 'string' },\n 'agent-name': { type: 'string' },\n 'agent-description':{ type: 'string' },\n 'opencode-url': { type: 'string' },\n directory: { type: 'string', short: 'd' },\n model: { type: 'string', short: 'm' },\n agent: { type: 'string' },\n 'codex-model': { type: 'string' },\n 'codex-api-key': { type: 'string' },\n 'claude-model': { type: 'string' },\n 'claude-api-key': { type: 'string' },\n 'log-level': { type: 'string' },\n 'register-url': { type: 'string' },\n 'register-key': { type: 'string' },\n 'unregister-on-shutdown': { type: 'boolean' },\n 'bridge-url': { type: 'string' },\n 'bridge-key': { type: 'string' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n strict: false,\n });\n\n if (values.help) {\n printUsage();\n process.exit(0);\n }\n\n if (values.version) {\n console.log(PKG_VERSION);\n process.exit(0);\n }\n\n const overrides: Partial<AgentConfig> = {};\n\n // Provider\n if (values.provider) {\n overrides.provider = values.provider as ProviderType;\n }\n\n // Server\n if (values.port || values.hostname || values['advertise-host']) {\n overrides.server = {};\n if (values.port) overrides.server.port = parseInt(values.port as string, 10);\n if (values.hostname) overrides.server.hostname = values.hostname as string;\n if (values['advertise-host']) overrides.server.advertiseHost = values['advertise-host'] as string;\n }\n\n // Agent card\n const agentCardOverrides: Partial<AgentConfig['agentCard']> = {};\n if (values['agent-name']) agentCardOverrides.name = values['agent-name'] as string;\n if (values['agent-description']) agentCardOverrides.description = values['agent-description'] as string;\n if (Object.keys(agentCardOverrides).length > 0) {\n overrides.agentCard = agentCardOverrides as AgentConfig['agentCard'];\n }\n\n // OpenCode\n const hasOpenCode = !!(values['opencode-url'] || values.directory || values.model || values.agent);\n if (hasOpenCode) {\n overrides.opencode = {};\n if (values['opencode-url']) overrides.opencode.baseUrl = values['opencode-url'] as string;\n if (values.directory) overrides.opencode.projectDirectory = values.directory as string;\n if (values.model) overrides.opencode.model = values.model as string;\n if (values.agent) overrides.opencode.agent = values.agent as string;\n }\n\n // Codex\n const hasCodex = !!(values['codex-model'] || values['codex-api-key']);\n if (hasCodex) {\n overrides.codex = {};\n if (values['codex-model']) overrides.codex.model = values['codex-model'] as string;\n if (values['codex-api-key']) overrides.codex.apiKey = values['codex-api-key'] as string;\n }\n\n // Claude\n const hasClaude = !!(values['claude-model'] || values['claude-api-key']);\n if (hasClaude) {\n overrides.claude = {};\n if (values['claude-model']) overrides.claude.model = values['claude-model'] as string;\n if (values['claude-api-key']) overrides.claude.apiKey = values['claude-api-key'] as string;\n }\n\n // Logging\n if (values['log-level']) {\n overrides.logging = { level: values['log-level'] as 'debug' | 'info' | 'warn' | 'error' };\n }\n\n const configPath = (values.config) as string | undefined;\n const registerUrl = values['register-url'] as string | undefined;\n const registerKey = values['register-key'] as string | undefined;\n const unregisterOnShutdown = (values['unregister-on-shutdown'] as boolean) ?? false;\n const bridgeUrl = values['bridge-url'] as string | undefined;\n const bridgeKey = values['bridge-key'] as string | undefined;\n return { configPath, overrides, registerUrl, registerKey, unregisterOnShutdown, bridgeUrl, bridgeKey };\n}\n\n// ─── Gateway Registration ───────────────────────────────────────────────────\n\nasync function registerWithGateway(\n registerUrl: string,\n registerKey: string,\n config: Required<AgentConfig>,\n agentCardUrl: string,\n): Promise<{ assistantId: string; agentCardUrl: string } | null> {\n const body = {\n name: config.agentCard.name,\n description: config.agentCard.description,\n graphDefinition: {\n type: 'a2a_remote',\n key: `a2a-${config.provider}-${config.agentCard.name.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`,\n name: config.agentCard.name,\n description: config.agentCard.description,\n prompt: config.agentCard.description,\n agentCardUrl,\n timeout: config.timeouts.prompt,\n },\n };\n\n try {\n const url = registerUrl.replace(/\\/$/, '') + '/api/assistants';\n log.info('Registering with gateway', { url, agentCardUrl });\n\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${registerKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n log.error('Gateway registration failed', { status: resp.status, body: text });\n return null;\n }\n\n const result = await resp.json() as { data?: { id: string } };\n const assistantId = result.data?.id ?? body.graphDefinition.key;\n\n log.info('Registered with gateway', { assistantId, agentCardUrl });\n console.log(`Registered as agent: ${assistantId}`);\n console.log(`Agent card: ${agentCardUrl}`);\n\n return { assistantId, agentCardUrl };\n } catch (err) {\n log.error('Gateway registration error', { error: (err as Error).message });\n return null;\n }\n}\n\nasync function unregisterFromGateway(\n registerUrl: string,\n registerKey: string,\n assistantId: string,\n): Promise<void> {\n try {\n const url = `${registerUrl.replace(/\\/$/, '')}/api/assistants/${assistantId}`;\n log.info('Unregistering from gateway', { assistantId });\n\n const resp = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${registerKey}`,\n },\n });\n\n if (!resp.ok && resp.status !== 404) {\n log.warn('Gateway unregistration failed', { status: resp.status });\n } else {\n log.info('Unregistered from gateway', { assistantId });\n }\n } catch (err) {\n log.warn('Gateway unregistration error', { error: (err as Error).message });\n }\n}\n\n// ─── Main ───────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const { configPath, overrides, registerUrl, registerKey, unregisterOnShutdown, bridgeUrl, bridgeKey } = parseCliArgs();\n\n // Resolve config\n const config = resolveConfig(configPath, overrides);\n\n // Set configDir for relative path resolution\n if (configPath) {\n config.configDir = dirname(resolve(configPath));\n }\n\n // Apply log level\n const levelStr = config.logging.level ?? 'info';\n const levelMap: Record<string, LogLevel> = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n logger.setLevel(levelMap[levelStr] ?? LogLevel.INFO);\n\n if (!configPath) {\n log.info('No --config provided — running with defaults + CLI args.');\n }\n\n log.info('Starting CLI A2A Gateway', {\n provider: config.provider,\n config: configPath ?? '(defaults)',\n agent: config.agentCard.name,\n port: config.server?.port,\n });\n\n // Register executors\n const { registerExecutor } = await import('./executors/index.js');\n const { createOpenCodeExecutor } = await import('./executors/opencode/executor.js');\n const { createCodexExecutor } = await import('./executors/codex/executor.js');\n const { createClaudeExecutor } = await import('./executors/claude/executor.js');\n registerExecutor('opencode', createOpenCodeExecutor);\n registerExecutor('codex', createCodexExecutor);\n registerExecutor('claude', createClaudeExecutor);\n\n // Start server\n const server = await createA2AServer(config);\n\n const listenPort = config.server?.port ?? 3000;\n const agentId = `a2a-${config.provider}-${listenPort}`;\n\n // Connect bridge to gateway (NAT traversal)\n let bridgeClient: { start(): Promise<void>; stop(): void } | null = null;\n if (bridgeUrl && bridgeKey) {\n const { BridgeClient } = await import('./bridge.js');\n const agentCardUrl = `${config.server?.advertiseProtocol ?? 'http'}://${config.server?.advertiseHost ?? 'localhost'}:${listenPort}/.well-known/agent-card.json`;\n\n bridgeClient = new BridgeClient({\n bridgeUrl: bridgeUrl.replace(/^http/, 'ws'),\n apiKey: bridgeKey,\n agentId,\n agentCard: {\n name: config.agentCard.name,\n description: config.agentCard.description,\n url: agentCardUrl,\n },\n localBaseUrl: `http://localhost:${listenPort}`,\n });\n\n bridgeClient.start().then(() => {\n log.info('Bridge connected — agent reachable via gateway proxy');\n console.log(`Bridge: ws://gateway → localhost:${listenPort}`);\n }).catch((err: Error) => {\n log.error('Bridge connection failed', { error: err.message });\n });\n }\n\n // Register with gateway (HTTP-based self-registration)\n let registeredAssistantId: string | null = null;\n if (registerUrl && registerKey) {\n // When bridge is active, the agent card URL must point to the gateway proxy\n // so the orchestrator reaches the agent through the WebSocket bridge, not directly.\n const agentCardUrl = bridgeUrl\n ? `${registerUrl.replace(/\\/$/, '')}/api/a2a/bridge/proxy/${agentId}/.well-known/agent-card.json`\n : `${config.server?.advertiseProtocol ?? 'http'}://${config.server?.advertiseHost ?? 'localhost'}:${listenPort}/.well-known/agent-card.json`;\n\n const reg = await registerWithGateway(\n registerUrl,\n registerKey,\n config,\n agentCardUrl,\n );\n if (reg) {\n registeredAssistantId = reg.assistantId;\n }\n }\n\n // Graceful shutdown\n const shutdown = async (signal: string) => {\n log.info(`${signal} received, shutting down...`);\n bridgeClient?.stop();\n if (registeredAssistantId && registerUrl && registerKey && unregisterOnShutdown) {\n await unregisterFromGateway(registerUrl, registerKey, registeredAssistantId);\n }\n await server.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n}\n\nmain().catch((err) => {\n log.error('Fatal error', { error: (err as Error).message, stack: (err as Error).stack });\n process.exit(1);\n});\n","/**\n * Config loader — reads JSON config files and resolves the final config\n * by merging layers: defaults ← config file ← env overrides ← CLI args.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { resolveDefaults } from './defaults.js';\nimport type { AgentConfig } from './types.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('config');\n\n/**\n * Read and parse a JSON config file.\n */\nexport function loadConfigFile(filePath: string): Partial<AgentConfig> {\n const absPath = resolve(filePath);\n if (!existsSync(absPath)) {\n throw new Error(`Config file not found: ${absPath}`);\n }\n try {\n const raw = readFileSync(absPath, 'utf-8');\n return JSON.parse(raw) as Partial<AgentConfig>;\n } catch (err) {\n const msg = err instanceof SyntaxError\n ? `Invalid JSON in config file: ${err.message}`\n : `Failed to read config file: ${(err as Error).message}`;\n throw new Error(msg);\n }\n}\n\n/**\n * Load env overrides for provider configs.\n */\nfunction loadEnvOverrides(): Partial<AgentConfig> {\n const overrides: Partial<AgentConfig> = {\n opencode: {},\n codex: {},\n claude: {},\n };\n\n // OpenCode\n if (process.env.OPENCODE_URL) overrides.opencode!.baseUrl = process.env.OPENCODE_URL;\n if (process.env.OPENCODE_DIRECTORY) overrides.opencode!.projectDirectory = process.env.OPENCODE_DIRECTORY;\n if (process.env.OPENCODE_MODEL) overrides.opencode!.model = process.env.OPENCODE_MODEL;\n if (process.env.OPENCODE_AGENT) overrides.opencode!.agent = process.env.OPENCODE_AGENT;\n if (process.env.OPENCODE_SYSTEM_PROMPT) overrides.opencode!.systemPrompt = process.env.OPENCODE_SYSTEM_PROMPT;\n\n // Codex\n if (process.env.OPENAI_API_KEY) overrides.codex!.apiKey = process.env.OPENAI_API_KEY;\n if (process.env.CODEX_MODEL) overrides.codex!.model = process.env.CODEX_MODEL;\n\n // Claude Code\n if (process.env.ANTHROPIC_API_KEY) overrides.claude!.apiKey = process.env.ANTHROPIC_API_KEY;\n if (process.env.CLAUDE_MODEL) overrides.claude!.model = process.env.CLAUDE_MODEL;\n\n return overrides;\n}\n\n/**\n * Resolve full config from defaults + file + env.\n */\nexport function resolveConfig(\n configPath?: string,\n cliOverrides?: Partial<AgentConfig>,\n): Required<AgentConfig> {\n // Layer 1: File\n let fileConfig: Partial<AgentConfig> = {};\n if (configPath) {\n fileConfig = loadConfigFile(configPath);\n log.info('Loaded config file', { path: configPath });\n }\n\n // Layer 2: Env\n const envOverrides = loadEnvOverrides();\n\n // Layer 3: CLI\n const cliConfig = cliOverrides ?? {};\n\n // Deep merge: defaults ← file ← env ← CLI\n // Start with a proper deep copy of merged defaults+file to avoid mutating the frozen defaults\n const cloned = structuredClone(resolveDefaults(fileConfig)) as Required<AgentConfig>;\n const base = cloned;\n\n // Then merge env overrides\n mergeOverrides(base, envOverrides);\n\n // Then merge CLI overrides\n mergeOverrides(base, cliConfig);\n\n // Populate configDir\n if (configPath) {\n base.configDir = dirname(resolve(configPath));\n }\n\n return base;\n}\n\nfunction mergeOverrides(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const key of Object.keys(source)) {\n const srcVal = source[key];\n const tgtVal = target[key];\n if (\n srcVal !== undefined &&\n srcVal !== null &&\n typeof srcVal === 'object' &&\n !Array.isArray(srcVal) &&\n tgtVal !== undefined &&\n typeof tgtVal === 'object' &&\n !Array.isArray(tgtVal)\n ) {\n // Do not merge empty override objects\n if (Object.keys(srcVal as Record<string, unknown>).length > 0) {\n mergeOverrides(tgtVal as Record<string, unknown>, srcVal as Record<string, unknown>);\n }\n } else if (srcVal !== undefined && srcVal !== null) {\n target[key] = srcVal;\n }\n }\n}\n","/**\n * Default configuration values.\n *\n * Every field has a sensible default so the agent runs without a config file.\n */\n\nimport type { AgentConfig } from './types.js';\n\nfunction withDefaults<T extends Record<string, unknown>>(\n partial: Partial<T>,\n defaults: Required<T>,\n): Required<T> {\n const result = { ...defaults } as Record<string, unknown>;\n for (const key of Object.keys(partial) as Array<keyof T>) {\n const val = partial[key] as unknown;\n if (val !== undefined && val !== null) {\n if (\n typeof val === 'object' &&\n !Array.isArray(val) &&\n typeof defaults[key] === 'object' &&\n !Array.isArray(defaults[key])\n ) {\n result[key as string] = {\n ...(defaults[key] as Record<string, unknown>),\n ...(val as Record<string, unknown>),\n };\n } else {\n result[key as string] = val;\n }\n }\n }\n return result as unknown as Required<T>;\n}\n\ntype ResolvedConfig = Omit<Required<AgentConfig>, 'opencode' | 'codex' | 'claude' | 'configDir'> & {\n opencode: Required<Required<AgentConfig>['opencode']>;\n codex: Required<Required<AgentConfig>['codex']>;\n claude: Required<Required<AgentConfig>['claude']>;\n configDir: string | undefined;\n};\n\nconst DEFAULTS: Readonly<ResolvedConfig> = Object.freeze({\n provider: 'opencode' as const,\n agentCard: {\n name: 'CLI A2A Agent',\n description: 'A multi-provider A2A agent driven by local CLI coding tools.',\n protocolVersion: '0.3.0',\n version: '0.1.0',\n skills: [],\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n streaming: true,\n pushNotifications: false,\n },\n server: {\n port: 3000,\n hostname: '0.0.0.0',\n advertiseHost: 'localhost',\n advertiseProtocol: 'http',\n },\n session: {\n titlePrefix: 'A2A Session',\n reuseByContext: true,\n persist: true,\n storePath: '',\n ttl: 3_600_000,\n cleanupInterval: 300_000,\n },\n features: {\n autoApprovePermissions: true,\n autoAnswerQuestions: true,\n streamArtifactChunks: false,\n enablePollingFallback: true,\n },\n timeouts: {\n prompt: 600_000,\n pollingInterval: 2_000,\n healthCheck: 30_000,\n },\n logging: {\n level: 'info',\n },\n opencode: {\n baseUrl: '',\n projectDirectory: '',\n model: '',\n agent: '',\n systemPrompt: '',\n systemPromptMode: 'append',\n contextFile: 'context.md',\n contextPrompt: '',\n },\n codex: {\n cliPath: 'codex',\n workdir: process.cwd(),\n model: '',\n apiKey: '',\n },\n claude: {\n cliPath: 'claude',\n workdir: process.cwd(),\n model: '',\n apiKey: '',\n },\n configDir: undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} as any);\n\nexport function resolveDefaults(overrides: Partial<AgentConfig>): Required<AgentConfig> {\n return withDefaults(overrides, DEFAULTS) as unknown as Required<AgentConfig>;\n}\n","/**\n * A2A HTTP Server\n *\n * Creates an Express server with standard A2A endpoints:\n * - GET /.well-known/agent-card.json → Agent Card\n * - POST /a2a/jsonrpc → JSON-RPC transport\n * - POST /a2a/rest → REST transport\n * - GET /health → Health check\n */\n\nimport express, { type RequestHandler } from 'express';\nimport { AGENT_CARD_PATH } from '@a2a-js/sdk';\nimport { DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server';\nimport {\n jsonRpcHandler,\n restHandler,\n UserBuilder,\n} from '@a2a-js/sdk/server/express';\n\nimport type { AgentConfig } from '../config/types.js';\nimport { buildAgentCard } from './agent-card.js';\nimport { createExecutor } from '../executors/index.js';\nimport { SessionBindingStore, resolveSessionStorePath } from '../session-store.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('server');\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ServerHandle {\n app: ReturnType<typeof express>;\n server: ReturnType<ReturnType<typeof express>['listen']>;\n shutdown(): Promise<void>;\n}\n\n// ─── Server Factory ─────────────────────────────────────────────────────────\n\nexport async function createA2AServer(config: Required<AgentConfig>): Promise<ServerHandle> {\n const srv = config.server;\n const port = srv.port ?? 3000;\n const hostname = srv.hostname ?? '0.0.0.0';\n const advertiseHost = srv.advertiseHost ?? 'localhost';\n const advertiseProto = srv.advertiseProtocol ?? 'http';\n\n const sessionConf = config.session;\n\n // 1. Session store\n const sessionStore = new SessionBindingStore({\n persist: sessionConf.persist ?? true,\n storePath: resolveSessionStorePath({\n configuredPath: sessionConf.storePath,\n provider: config.provider,\n port,\n }),\n cleanupIntervalMs: sessionConf.cleanupInterval,\n });\n\n // 2. Create executor\n const executor = createExecutor(config, sessionStore);\n await executor.initialize();\n\n // 3. Build agent card\n const agentCard = buildAgentCard(config);\n\n // 4. A2A request handler\n const taskStore = new InMemoryTaskStore();\n const requestHandler = new DefaultRequestHandler(agentCard, taskStore, executor);\n\n // 5. Express app\n const app = express();\n\n // A2A-Version header\n app.use((_req, res, next) => {\n res.setHeader('A2A-Version', '0.3');\n next();\n });\n\n // Health check\n app.get('/health', (_req, res) => {\n res.json({ status: 'healthy', agent: agentCard.name, provider: config.provider });\n });\n\n // Agent card — dynamic URL rewriting for reverse proxy support\n const serveAgentCard: RequestHandler = (req, res) => {\n const host = req.headers.host || `${advertiseHost}:${port}`;\n const proto = (req.headers['x-forwarded-proto'] as string) || advertiseProto;\n const dynamicBase = `${proto}://${host}`;\n res.json({\n ...agentCard,\n url: `${dynamicBase}/a2a/jsonrpc`,\n additionalInterfaces: [\n { transport: 'JSONRPC', url: `${dynamicBase}/a2a/jsonrpc` },\n { transport: 'REST', url: `${dynamicBase}/a2a/rest` },\n ],\n });\n };\n\n app.get(`/${AGENT_CARD_PATH}`, serveAgentCard);\n app.get('/.well-known/agent.json', serveAgentCard);\n app.get('/.well-known/agent-json', serveAgentCard);\n\n // A2A transport handlers\n app.use('/a2a/jsonrpc', jsonRpcHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }));\n app.use('/a2a/rest', restHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }));\n\n // 6. Start listening\n const httpServer = app.listen(port, hostname, () => {\n log.info('A2A server started', { bind: hostname, port, proto: advertiseProto });\n\n const banner = [\n '',\n '╔══════════════════════════════════════════════════════════════╗',\n `║ CLI A2A Gateway — ${config.provider.padEnd(28)}║`,\n '╠══════════════════════════════════════════════════════════════╣',\n `║ Agent: ${agentCard.name}`,\n `║ Bind: ${hostname}:${port}`,\n `║ Agent Card: ${advertiseProto}://${advertiseHost}:${port}/${AGENT_CARD_PATH}`,\n `║ JSON-RPC: ${advertiseProto}://${advertiseHost}:${port}/a2a/jsonrpc`,\n `║ REST: ${advertiseProto}://${advertiseHost}:${port}/a2a/rest`,\n `║ Health: ${advertiseProto}://${advertiseHost}:${port}/health`,\n '╠══════════════════════════════════════════════════════════════╣',\n '║ Ready. Press Ctrl+C to stop. ║',\n '╚══════════════════════════════════════════════════════════════╝',\n ].join('\\n');\n console.log(banner);\n });\n\n // 7. Return handle\n return {\n app,\n server: httpServer,\n async shutdown() {\n httpServer.close();\n await executor.shutdown();\n sessionStore.shutdown();\n log.info('Server shut down');\n },\n };\n}\n","/**\n * Agent Card builder.\n *\n * Builds an A2A-compliant AgentCard from the resolved config.\n */\n\nimport type { AgentCard, AgentSkill } from '@a2a-js/sdk';\nimport type { AgentConfig } from '../config/types.js';\nimport { logger } from '../logger.js';\n\nconst log = logger.child('agent-card');\n\nexport function buildAgentCard(config: Required<AgentConfig>): AgentCard {\n const { agentCard, server } = config;\n const proto = server.advertiseProtocol ?? 'http';\n const host = server.advertiseHost ?? 'localhost';\n const port = server.port ?? 3000;\n const baseUrl = `${proto}://${host}:${port}`;\n\n const skills: AgentSkill[] = (agentCard.skills ?? []).map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n tags: s.tags ?? [],\n examples: s.examples ?? [],\n }));\n\n const card: AgentCard = {\n name: agentCard.name,\n description: agentCard.description,\n protocolVersion: agentCard.protocolVersion ?? '0.3.0',\n version: agentCard.version ?? '1.0.0',\n url: `${baseUrl}/a2a/jsonrpc`,\n // Default input/output modes (A2A v1.0 normalized names)\n defaultInputModes: (agentCard.defaultInputModes as Array<'text' | 'file' | 'image' | 'audio'>) ?? ['text'],\n defaultOutputModes: (agentCard.defaultOutputModes as Array<'text' | 'file' | 'image' | 'audio'>) ?? ['text'],\n skills,\n capabilities: {\n streaming: agentCard.streaming ?? true,\n pushNotifications: agentCard.pushNotifications ?? false,\n stateTransitionHistory: true,\n },\n // Additional interfaces advertised to orchestrators\n additionalInterfaces: [\n { transport: 'JSONRPC', url: `${baseUrl}/a2a/jsonrpc` },\n { transport: 'REST', url: `${baseUrl}/a2a/rest` },\n ],\n };\n\n log.info('Agent card built', { name: card.name, url: card.url, skills: card.skills?.length ?? 0 });\n return card;\n}\n"],"mappings":"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","names":["LogLevel","import_node_path","import_node_fs","log","log","resolve","uuidv4","import_uuid","log","import_node_child_process","log","init_client","resolve","executor_exports","log","init_executor","init_client","import_node_child_process","import_uuid","log","init_client","text","uuidv4","resolve","executor_exports","log","init_executor","init_client","import_node_crypto","log","resolve","import_node_path","import_sdk","import_express","log","log","express","log","registerExecutor","createOpenCodeExecutor","createCodexExecutor","createClaudeExecutor","BridgeClient"]}