@agentic-patterns/runtime 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/events/types.ts","../src/events/claude-code.ts","../src/events/claude-code-mapper.ts","../src/events/sandbox-types.ts","../src/events/event-bus.ts","../src/events/event-profiles.ts","../src/events/agent-event-bus.ts","../src/events/sandbox-event-bus.ts","../src/gates/base.ts","../src/gates/safety.ts","../src/gates/rate-limit.ts","../src/gates/approval.ts","../src/gates/audit.ts","../src/runner/agent-runner.ts","../src/runner/message-utils.ts","../src/runner/claude-code-runner.ts","../src/runner/sdk-bridge.ts","../src/runner/claude-code-api-runner.ts","../src/runner/mock-runner.ts","../src/runner/toolbox-executor.ts","../src/runner/create-runner.ts","../src/providers/types.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/google.ts","../src/providers/groq.ts","../src/providers/mistral.ts","../src/providers/xai.ts","../src/providers/deepseek.ts","../src/providers/openrouter.ts","../src/providers/ollama.ts","../src/providers/claude-code.ts","../src/providers/index.ts","../src/transport/in-process.ts","../src/transport/messaging-toolbox.ts","../src/transport/sse-formatter.ts","../src/runtime/agent-node.ts","../src/runtime/agency-runtime.ts","../src/conversation/conversation.ts","../src/conversation/store.ts","../src/exporters/base.ts","../src/exporters/console.ts","../src/exporters/langfuse.ts","../src/exporters/otel.ts","../src/exporters/sse.ts","../src/presets/coordinator.ts","../src/presets/judgments.ts","../src/presets/responsibilities.ts","../src/presets/orchestrator.ts","../src/presets/analyst.ts","../src/presets/retrieval.ts","../src/presets/agents/calculator.ts","../src/presets/agents/todo-manager.ts","../src/presets/agents/writing-coach.ts","../src/workflows/base.ts","../src/workflows/sequential.ts","../src/workflows/parallel.ts","../src/workflows/retry-loop.ts","../src/workflows/evaluators.ts","../src/workflows/task-loop.ts","../src/workflows/evaluator-loop.ts","../src/workflows/conversation-loop.ts","../src/admin/schemas.ts","../src/admin/collector.ts","../src/admin/service.ts","../src/streaming/stdio-adapter.ts"],"sourcesContent":["// @agentic-patterns/runtime — barrel export\nexport * from \"./events/index.js\";\nexport * from \"./gates/index.js\";\nexport * from \"./runner/index.js\";\nexport * from \"./transport/index.js\";\nexport * from \"./runtime/index.js\";\nexport * from \"./conversation/index.js\";\nexport * from \"./exporters/index.js\";\nexport * from \"./presets/index.js\";\nexport * from \"./workflows/index.js\";\nexport * from \"./admin/index.js\";\nexport * from \"./streaming/index.js\";\nexport * from \"./providers/index.js\";\n","/**\n * Core event types for runner observability.\n *\n * All events use a discriminated union on the `type` field.\n * Trace fields (traceId, runId, spanId, parentSpanId, timestamp) on every event.\n */\n\nimport type { ClaudeCodeHookEvent } from \"./claude-code.js\";\n\n/**\n * Generate a unique ID string.\n *\n * Uses crypto.randomUUID() when available (Node 19+, modern browsers),\n * falls back to a timestamp+counter approach.\n */\nlet _counter = 0;\nfunction generateId(): string {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n // Safe to use: `crypto` is present at runtime in Node 19+ and browsers.\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Base event interface\n// ---------------------------------------------------------------------------\n\nexport interface BaseEvent {\n readonly type: string;\n readonly traceId: string;\n readonly runId: string;\n readonly spanId: string;\n readonly parentSpanId?: string;\n readonly timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Message events\n// ---------------------------------------------------------------------------\n\nexport interface MessageStartEvent extends BaseEvent {\n readonly type: \"agent.message.start\";\n readonly agentName: string;\n readonly agentConfig?: Record<string, unknown>;\n}\n\nexport interface MessageChunkEvent extends BaseEvent {\n readonly type: \"agent.message.chunk\";\n readonly delta: string;\n readonly chunkIndex: number;\n}\n\nexport interface MessageCompleteEvent extends BaseEvent {\n readonly type: \"agent.message.complete\";\n readonly content: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly model: string;\n}\n\n// ---------------------------------------------------------------------------\n// Reasoning\n// ---------------------------------------------------------------------------\n\nexport interface ReasoningEvent extends BaseEvent {\n readonly type: \"agent.reasoning\";\n readonly content: string;\n readonly isComplete: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Tool call events\n// ---------------------------------------------------------------------------\n\nexport interface ToolCallIntent extends BaseEvent {\n readonly type: \"agent.tool.intent\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n}\n\nexport interface ToolCallRejectedEvent extends BaseEvent {\n readonly type: \"agent.tool.rejected\";\n readonly toolName: string;\n readonly reason: string;\n readonly gateName: string;\n readonly gateCategory: string;\n readonly originalIntent: ToolCallIntent;\n}\n\nexport interface ToolCallStartEvent extends BaseEvent {\n readonly type: \"agent.tool.start\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n readonly parentEventId?: string;\n}\n\nexport interface ToolCallEndEvent extends BaseEvent {\n readonly type: \"agent.tool.end\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n readonly result: unknown;\n readonly error?: string;\n readonly durationMs: number;\n readonly resultTokens: number;\n}\n\n// ---------------------------------------------------------------------------\n// Iteration events\n// ---------------------------------------------------------------------------\n\nexport interface IterationStartEvent extends BaseEvent {\n readonly type: \"agent.iteration.start\";\n readonly iteration: number;\n readonly maxIterations: number;\n}\n\nexport interface IterationEndEvent extends BaseEvent {\n readonly type: \"agent.iteration.end\";\n readonly iteration: number;\n readonly toolCallsCount: number;\n readonly hasMore: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// LLM call events\n// ---------------------------------------------------------------------------\n\nexport interface LLMCallStartEvent extends BaseEvent {\n readonly type: \"agent.llm.start\";\n readonly model: string;\n readonly messageCount: number;\n readonly hasTools: boolean;\n}\n\nexport interface LLMCallEndEvent extends BaseEvent {\n readonly type: \"agent.llm.end\";\n readonly model: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly durationMs: number;\n readonly hasToolCalls: boolean;\n readonly finishReason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation events\n// ---------------------------------------------------------------------------\n\nexport interface ConversationStartEvent extends BaseEvent {\n readonly type: \"agent.conversation.start\";\n readonly conversationId: string;\n readonly agentName: string;\n}\n\nexport interface ConversationEndEvent extends BaseEvent {\n readonly type: \"agent.conversation.end\";\n readonly conversationId: string;\n readonly reason: \"completed\" | \"error\" | \"cancelled\";\n}\n\n// ---------------------------------------------------------------------------\n// Message cancel event\n// ---------------------------------------------------------------------------\n\nexport interface MessageCancelEvent extends BaseEvent {\n readonly type: \"agent.message.cancel\";\n readonly reason?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Thinking lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface ThinkingStartEvent extends BaseEvent {\n readonly type: \"agent.thinking.start\";\n}\n\n// ---------------------------------------------------------------------------\n// Tool progress event\n// ---------------------------------------------------------------------------\n\nexport interface ToolProgressEvent extends BaseEvent {\n readonly type: \"agent.tool.progress\";\n readonly toolCallId: string;\n readonly progress?: number;\n readonly statusText?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Error event\n// ---------------------------------------------------------------------------\n\nexport interface ErrorEvent extends BaseEvent {\n readonly type: \"agent.error\";\n readonly errorType: string;\n readonly message: string;\n readonly recoverable: boolean;\n readonly stackTrace?: string;\n readonly context: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union\n// ---------------------------------------------------------------------------\n\nexport type AgentEvent =\n | ConversationStartEvent\n | ConversationEndEvent\n | MessageStartEvent\n | MessageChunkEvent\n | MessageCompleteEvent\n | MessageCancelEvent\n | ReasoningEvent\n | ThinkingStartEvent\n | ToolCallIntent\n | ToolCallRejectedEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolProgressEvent\n | IterationStartEvent\n | IterationEndEvent\n | LLMCallStartEvent\n | LLMCallEndEvent\n | ErrorEvent\n | ClaudeCodeHookEvent;\n\n/** All possible agent event type strings. */\nexport type AgentEventType = AgentEvent[\"type\"];\n\n/** Subset of events for backward-compatible StreamEvent alias. */\nexport type StreamEvent =\n | ConversationStartEvent\n | ConversationEndEvent\n | MessageStartEvent\n | MessageChunkEvent\n | MessageCompleteEvent\n | MessageCancelEvent\n | ReasoningEvent\n | ThinkingStartEvent\n | ToolCallIntent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolProgressEvent\n | IterationStartEvent\n | IterationEndEvent\n | LLMCallStartEvent\n | LLMCallEndEvent;\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create an event with auto-filled timestamp and optional spanId.\n *\n * @param type - The event type discriminant\n * @param data - Event fields (excluding type, timestamp; spanId optional)\n * @returns A fully-formed event\n */\nexport function createEvent<T extends AgentEventType>(\n type: T,\n data: Omit<Extract<AgentEvent, { type: T }>, \"type\" | \"timestamp\" | \"spanId\"> & {\n spanId?: string;\n },\n): Extract<AgentEvent, { type: T }> {\n return {\n ...data,\n type,\n timestamp: new Date(),\n spanId: data.spanId ?? generateId(),\n } as Extract<AgentEvent, { type: T }>;\n}\n","/**\n * Claude Code hook event — bridges Claude Code lifecycle hooks into the\n * AgentEventBus.\n *\n * The Claude Code CLI emits hook callbacks (PreToolUse, PostToolUse,\n * SessionStart, etc.) as JSON payloads to a configured command. The hook\n * bridge in `@agentic-patterns/server` receives those payloads via HTTP\n * and republishes each one as a `ClaudeCodeHookEvent`.\n *\n * The full raw hook payload is preserved on `payload` so downstream\n * consumers (dashboards, exporters) never lose information. A small\n * mappable subset (PreToolUse / PostToolUse) is also projected onto the\n * canonical `agent.tool.start` / `agent.tool.end` events by the\n * `mapClaudeCodeHookToAgentEvents` helper in\n * `./claude-code-mapper.ts` — that lives in a separate file so this\n * module stays a pure type/constant declaration.\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\nexport const CLAUDE_CODE_HOOK_EVENTS = [\n \"SessionStart\",\n \"InstructionsLoaded\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PermissionRequest\",\n \"PermissionDenied\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Notification\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"TaskCreated\",\n \"TaskCompleted\",\n \"Stop\",\n \"StopFailure\",\n \"TeammateIdle\",\n \"ConfigChange\",\n \"CwdChanged\",\n \"FileChanged\",\n \"WorktreeCreate\",\n \"WorktreeRemove\",\n \"PreCompact\",\n \"PostCompact\",\n \"Elicitation\",\n \"ElicitationResult\",\n \"SessionEnd\",\n] as const;\n\nexport type ClaudeCodeHookName = (typeof CLAUDE_CODE_HOOK_EVENTS)[number];\n\n/**\n * A single Claude Code hook callback, lifted into an AgentEvent.\n *\n * Every Claude Code hook invocation produces one of these. The full\n * raw payload is preserved on `payload`; common fields (sessionId,\n * cwd, toolName, ...) are also surfaced as top-level convenience\n * properties for typed consumers. PreToolUse and PostToolUse can be\n * additionally mapped to canonical `agent.tool.start` / `agent.tool.end`\n * events via `mapClaudeCodeHookToAgentEvents`.\n */\nexport interface ClaudeCodeHookEvent extends BaseEvent {\n readonly type: \"claude_code.hook\";\n readonly hookName: ClaudeCodeHookName;\n readonly sessionId: string;\n readonly transcriptPath?: string;\n readonly cwd?: string;\n readonly permissionMode?: string;\n readonly toolName?: string;\n readonly toolInput?: unknown;\n readonly toolResponse?: unknown;\n readonly toolUseId?: string;\n /** Full raw hook payload, preserved verbatim. */\n readonly payload: Record<string, unknown>;\n /**\n * Correlation id propagated from a runner (e.g. `ClaudeCodeRunner`) that\n * is already observing this session. When present, the hook route SKIPS\n * deriving `agent.tool.start`/`agent.tool.end` events — the runner\n * already emits them — while still preserving the raw hook event for\n * full fidelity (PreCompact, PermissionRequest, etc.).\n */\n readonly runnerCorrelationId?: string;\n}\n\nexport function isClaudeCodeHookName(s: unknown): s is ClaudeCodeHookName {\n return typeof s === \"string\" && (CLAUDE_CODE_HOOK_EVENTS as readonly string[]).includes(s);\n}\n","/**\n * Map Claude Code hook events to canonical AgentEvent variants.\n *\n * Only PreToolUse / PostToolUse currently map to standard events\n * (`agent.tool.start` / `agent.tool.end`). All other hook names yield\n * an empty array — consumers that want full coverage should subscribe\n * to `claude_code.hook` directly.\n */\n\nimport type { ClaudeCodeHookEvent } from \"./claude-code.js\";\nimport type { AgentEvent } from \"./types.js\";\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n}\n\nexport function mapClaudeCodeHookToAgentEvents(event: ClaudeCodeHookEvent): AgentEvent[] {\n const { hookName, traceId, runId, spanId, parentSpanId, toolUseId, toolName } = event;\n const toolCallId = toolUseId ?? spanId;\n const args = toRecord(event.toolInput);\n\n if (hookName === \"PreToolUse\") {\n return [\n {\n type: \"agent.tool.start\",\n traceId,\n runId,\n spanId,\n parentSpanId,\n timestamp: new Date(),\n toolCallId,\n toolName: toolName ?? \"unknown\",\n arguments: args,\n },\n ];\n }\n\n if (hookName === \"PostToolUse\") {\n const errorVal = (event.payload as { error?: unknown }).error;\n const errorStr =\n typeof errorVal === \"string\"\n ? errorVal\n : errorVal !== undefined && errorVal !== null\n ? String(errorVal)\n : undefined;\n\n return [\n {\n type: \"agent.tool.end\",\n traceId,\n runId,\n spanId,\n parentSpanId,\n timestamp: new Date(),\n toolCallId,\n toolName: toolName ?? \"unknown\",\n arguments: args,\n result: event.toolResponse,\n durationMs: 0,\n resultTokens: 0,\n ...(errorStr !== undefined ? { error: errorStr } : {}),\n },\n ];\n }\n\n return [];\n}\n","/**\n * Sandbox events for inter-agent communication and environment lifecycle.\n *\n * All sandbox events carry an AgentAddress origin and extend BaseEvent.\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// AgentAddress\n// ---------------------------------------------------------------------------\n\nexport interface AgentAddress {\n readonly deviceId: string;\n readonly instanceId: string;\n readonly agentId: string;\n readonly role: string;\n}\n\nexport function createAgentAddress(partial?: Partial<AgentAddress>): AgentAddress {\n return {\n deviceId: partial?.deviceId ?? \"\",\n instanceId: partial?.instanceId ?? \"\",\n agentId: partial?.agentId ?? \"\",\n role: partial?.role ?? \"\",\n };\n}\n\nexport function agentAddressToString(addr: AgentAddress): string {\n return `${addr.role}@${addr.deviceId}/${addr.instanceId}/${addr.agentId}`;\n}\n\n// ---------------------------------------------------------------------------\n// Base sandbox event\n// ---------------------------------------------------------------------------\n\nexport interface BaseSandboxEvent extends BaseEvent {\n readonly origin: AgentAddress;\n readonly target?: AgentAddress;\n readonly correlationId?: string;\n readonly agencyId: string;\n readonly lineupRunId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Communication events\n// ---------------------------------------------------------------------------\n\nexport interface AgentMessageEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.message\";\n readonly content: string;\n readonly metadata: Record<string, unknown>;\n}\n\nexport interface AgentBroadcastEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.broadcast\";\n readonly content: string;\n readonly channel: string;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface AgentJoinEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.join\";\n readonly reason: string;\n}\n\nexport interface AgentLeaveEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.leave\";\n readonly reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Task coordination events\n// ---------------------------------------------------------------------------\n\nexport interface TaskCreateEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.create\";\n readonly taskId: string;\n readonly taskTitle: string;\n}\n\nexport interface TaskUpdateEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.update\";\n readonly taskId: string;\n readonly changes: Record<string, unknown>;\n}\n\nexport interface TaskAssignEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.assign\";\n readonly taskId: string;\n readonly assignee: AgentAddress;\n}\n\n// ---------------------------------------------------------------------------\n// Health events\n// ---------------------------------------------------------------------------\n\nexport interface HealthPingEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.health.ping\";\n}\n\nexport interface HealthPongEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.health.pong\";\n readonly status: string;\n readonly uptimeSeconds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Node lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface NodeLifecycleEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.node.lifecycle\";\n readonly nodeEventType:\n | \"node.started\"\n | \"node.stopped\"\n | \"node.message_received\"\n | \"node.response_sent\";\n readonly message: string;\n readonly metadata: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union\n// ---------------------------------------------------------------------------\n\nexport type SandboxEvent =\n | AgentMessageEvent\n | AgentBroadcastEvent\n | AgentJoinEvent\n | AgentLeaveEvent\n | TaskCreateEvent\n | TaskUpdateEvent\n | TaskAssignEvent\n | HealthPingEvent\n | HealthPongEvent\n | NodeLifecycleEvent;\n\nexport type SandboxEventType = SandboxEvent[\"type\"];\n\n// ---------------------------------------------------------------------------\n// Serialization (JSON for transport)\n// ---------------------------------------------------------------------------\n\ninterface SerializedAddress {\n deviceId: string;\n instanceId: string;\n agentId: string;\n role: string;\n}\n\nfunction serializeAddress(addr: AgentAddress): SerializedAddress {\n return {\n deviceId: addr.deviceId,\n instanceId: addr.instanceId,\n agentId: addr.agentId,\n role: addr.role,\n };\n}\n\nfunction deserializeAddress(raw: Record<string, unknown>): AgentAddress {\n // Support legacy lxc_id key\n const instanceId =\n (raw.instanceId as string | undefined) ??\n (raw.instance_id as string | undefined) ??\n (raw.lxc_id as string | undefined) ??\n \"\";\n return {\n deviceId: (raw.deviceId as string | undefined) ?? (raw.device_id as string | undefined) ?? \"\",\n instanceId,\n agentId: (raw.agentId as string | undefined) ?? (raw.agent_id as string | undefined) ?? \"\",\n role: (raw.role as string | undefined) ?? \"\",\n };\n}\n\n/**\n * Serialize a sandbox event to a JSON string for transport.\n */\nexport function serializeSandboxEventToString(event: SandboxEvent): string {\n const data: Record<string, unknown> = {\n type: event.type,\n spanId: event.spanId,\n timestamp: event.timestamp.toISOString(),\n runId: event.runId,\n agencyId: event.agencyId,\n lineupRunId: event.lineupRunId,\n correlationId: event.correlationId,\n origin: serializeAddress(event.origin),\n };\n\n if (event.target) {\n data.target = serializeAddress(event.target);\n }\n\n // Add type-specific fields\n switch (event.type) {\n case \"sandbox.agent.message\":\n data.content = event.content;\n data.metadata = event.metadata;\n break;\n case \"sandbox.agent.broadcast\":\n data.content = event.content;\n data.channel = event.channel;\n break;\n case \"sandbox.agent.join\":\n case \"sandbox.agent.leave\":\n data.reason = event.reason;\n break;\n case \"sandbox.task.create\":\n data.taskId = event.taskId;\n data.taskTitle = event.taskTitle;\n break;\n case \"sandbox.task.update\":\n data.taskId = event.taskId;\n data.changes = event.changes;\n break;\n case \"sandbox.task.assign\":\n data.taskId = event.taskId;\n data.assignee = serializeAddress(event.assignee);\n break;\n case \"sandbox.health.ping\":\n break;\n case \"sandbox.health.pong\":\n data.status = event.status;\n data.uptimeSeconds = event.uptimeSeconds;\n break;\n case \"sandbox.node.lifecycle\":\n data.nodeEventType = event.nodeEventType;\n data.message = event.message;\n data.metadata = event.metadata;\n break;\n }\n\n return JSON.stringify(data);\n}\n\n/**\n * Serialize a sandbox event to bytes for transport.\n */\nexport function serializeSandboxEvent(event: SandboxEvent): Uint8Array {\n const json = serializeSandboxEventToString(event);\n return new Uint8Array(Array.from(json, (c) => c.charCodeAt(0)));\n}\n\n/**\n * Deserialize a sandbox event from a JSON string.\n */\nexport function deserializeSandboxEventFromString(json: string): SandboxEvent {\n const d = JSON.parse(json) as Record<string, unknown>;\n const origin = deserializeAddress((d.origin as Record<string, unknown>) ?? {});\n const target = d.target ? deserializeAddress(d.target as Record<string, unknown>) : undefined;\n const eventType = d.type as string;\n\n const base: Omit<BaseSandboxEvent, \"type\"> = {\n traceId: (d.traceId as string) ?? (d.runId as string) ?? \"\",\n runId: (d.runId as string) ?? \"\",\n spanId: (d.spanId as string) ?? \"\",\n parentSpanId: d.parentSpanId as string | undefined,\n timestamp: new Date((d.timestamp as string) ?? Date.now()),\n origin,\n target,\n correlationId: d.correlationId as string | undefined,\n agencyId: (d.agencyId as string) ?? \"\",\n lineupRunId: (d.lineupRunId as string) ?? \"\",\n };\n\n switch (eventType) {\n case \"sandbox.agent.message\":\n return {\n ...base,\n type: \"sandbox.agent.message\",\n content: (d.content as string) ?? \"\",\n metadata: (d.metadata as Record<string, unknown>) ?? {},\n };\n case \"sandbox.agent.broadcast\":\n return {\n ...base,\n type: \"sandbox.agent.broadcast\",\n content: (d.content as string) ?? \"\",\n channel: (d.channel as string) ?? \"\",\n };\n case \"sandbox.agent.join\":\n return {\n ...base,\n type: \"sandbox.agent.join\",\n reason: (d.reason as string) ?? \"\",\n };\n case \"sandbox.agent.leave\":\n return {\n ...base,\n type: \"sandbox.agent.leave\",\n reason: (d.reason as string) ?? \"\",\n };\n case \"sandbox.task.create\":\n return {\n ...base,\n type: \"sandbox.task.create\",\n taskId: (d.taskId as string) ?? \"\",\n taskTitle: (d.taskTitle as string) ?? \"\",\n };\n case \"sandbox.task.update\":\n return {\n ...base,\n type: \"sandbox.task.update\",\n taskId: (d.taskId as string) ?? \"\",\n changes: (d.changes as Record<string, unknown>) ?? {},\n };\n case \"sandbox.task.assign\":\n return {\n ...base,\n type: \"sandbox.task.assign\",\n taskId: (d.taskId as string) ?? \"\",\n assignee: d.assignee\n ? deserializeAddress(d.assignee as Record<string, unknown>)\n : createAgentAddress(),\n };\n case \"sandbox.health.ping\":\n return { ...base, type: \"sandbox.health.ping\" };\n case \"sandbox.health.pong\":\n return {\n ...base,\n type: \"sandbox.health.pong\",\n status: (d.status as string) ?? \"healthy\",\n uptimeSeconds: (d.uptimeSeconds as number) ?? 0,\n };\n case \"sandbox.node.lifecycle\":\n return {\n ...base,\n type: \"sandbox.node.lifecycle\",\n nodeEventType: (d.nodeEventType as NodeLifecycleEvent[\"nodeEventType\"]) ?? \"node.started\",\n message: (d.message as string) ?? \"\",\n metadata: (d.metadata as Record<string, unknown>) ?? {},\n };\n default:\n // Fallback: return as agent.message with empty content\n return {\n ...base,\n type: \"sandbox.agent.message\",\n content: \"\",\n metadata: {},\n };\n }\n}\n\n/**\n * Deserialize a sandbox event from bytes.\n */\nexport function deserializeSandboxEvent(data: Uint8Array): SandboxEvent {\n const json = Array.from(data, (b) => String.fromCharCode(b)).join(\"\");\n return deserializeSandboxEventFromString(json);\n}\n","/**\n * Async-capable event bus for publishing and subscribing to events.\n *\n * Handlers sorted by priority (higher = executed first).\n * Middleware can transform or drop events (return null).\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Handler function that receives an event. Can be sync or async. */\nexport type EventHandlerFn<E extends BaseEvent = BaseEvent> = (\n event: E,\n) => unknown | Promise<unknown>;\n\n/** Middleware function. Return null to stop propagation, or a new event to transform. */\nexport type MiddlewareFn<E extends BaseEvent = BaseEvent> = (\n event: E,\n) => E | null | Promise<E | null>;\n\n/** Wrapped handler with priority metadata. */\ninterface HandlerEntry {\n readonly handler: EventHandlerFn;\n readonly priority: number;\n readonly eventTypes: readonly string[];\n}\n\nfunction canHandle(entry: HandlerEntry, event: BaseEvent): boolean {\n return entry.eventTypes.length === 0 || entry.eventTypes.includes(event.type);\n}\n\n// ---------------------------------------------------------------------------\n// EventBus\n// ---------------------------------------------------------------------------\n\nexport class EventBus {\n private _handlers: Map<string, HandlerEntry[]> = new Map();\n private _globalHandlers: HandlerEntry[] = [];\n private _middleware: MiddlewareFn[] = [];\n\n /**\n * Subscribe a handler to a specific event type.\n *\n * @param eventType - Event type string to listen for\n * @param handler - Handler function (sync or async)\n * @param priority - Higher priority executes first (default 0)\n */\n subscribe(eventType: string, handler: EventHandlerFn, priority = 0): void {\n const entry: HandlerEntry = {\n handler,\n priority,\n eventTypes: [eventType],\n };\n\n let list = this._handlers.get(eventType);\n if (!list) {\n list = [];\n this._handlers.set(eventType, list);\n }\n list.push(entry);\n // Sort descending by priority\n list.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Subscribe a handler to all events.\n */\n subscribeAll(handler: EventHandlerFn, priority = 0): void {\n const entry: HandlerEntry = { handler, priority, eventTypes: [] };\n this._globalHandlers.push(entry);\n this._globalHandlers.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Unsubscribe a handler from a specific event type.\n */\n unsubscribe(eventType: string, handler: EventHandlerFn): void {\n const list = this._handlers.get(eventType);\n if (list) {\n this._handlers.set(\n eventType,\n list.filter((h) => h.handler !== handler),\n );\n }\n }\n\n /**\n * Unsubscribe a handler from all events.\n */\n unsubscribeAll(handler: EventHandlerFn): void {\n this._globalHandlers = this._globalHandlers.filter((h) => h.handler !== handler);\n }\n\n /**\n * Add middleware to process events before handlers.\n *\n * Middleware can modify events or stop propagation by returning null.\n */\n addMiddleware(middleware: MiddlewareFn): void {\n this._middleware.push(middleware);\n }\n\n /**\n * Publish an event to all registered handlers.\n *\n * @returns List of handler results\n */\n async publish(event: BaseEvent): Promise<unknown[]> {\n // Apply middleware\n let processed: BaseEvent | null = event;\n for (const mw of this._middleware) {\n const result = mw(processed);\n processed = result instanceof Promise ? await result : result;\n if (processed === null) {\n return [];\n }\n }\n\n // Gather handlers\n const specific = this._handlers.get(processed.type) ?? [];\n const globals = this._globalHandlers.filter((h) => canHandle(h, processed));\n\n const all = [...specific, ...globals].sort((a, b) => b.priority - a.priority);\n\n // Execute handlers\n const results: unknown[] = [];\n for (const entry of all) {\n try {\n const r = entry.handler(processed);\n results.push(r instanceof Promise ? await r : r);\n } catch (_err) {\n // Continue executing other handlers (matches Python behavior)\n }\n }\n\n return results;\n }\n\n /**\n * Clear all handlers and middleware.\n */\n clear(): void {\n this._handlers.clear();\n this._globalHandlers = [];\n this._middleware = [];\n }\n\n /**\n * Get the number of handlers for an event type or total.\n */\n getHandlerCount(eventType?: string): number {\n if (eventType) {\n return (this._handlers.get(eventType) ?? []).length;\n }\n let count = 0;\n for (const list of this._handlers.values()) {\n count += list.length;\n }\n return count + this._globalHandlers.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Global instance\n// ---------------------------------------------------------------------------\n\nlet _globalEventBus: EventBus | null = null;\n\nexport function getEventBus(): EventBus {\n if (!_globalEventBus) {\n _globalEventBus = new EventBus();\n }\n return _globalEventBus;\n}\n\nexport function setEventBus(bus: EventBus): void {\n _globalEventBus = bus;\n}\n","/**\n * Event profiles for curated event subscriptions.\n *\n * Profiles are handler groups that subscribe to specific event types\n * for different use cases (UX rendering, observability, debugging).\n */\n\nimport type { EventBus, EventHandlerFn } from \"./event-bus.js\";\n\n// ---------------------------------------------------------------------------\n// Profile enum\n// ---------------------------------------------------------------------------\n\nexport const EventProfile = {\n UX: \"ux\",\n OBSERVABILITY: \"obs\",\n DEBUG: \"debug\",\n TOOLS: \"tools\",\n STREAMING: \"stream\",\n} as const;\n\nexport type EventProfile = (typeof EventProfile)[keyof typeof EventProfile];\n\n// ---------------------------------------------------------------------------\n// Profile -> event type mappings\n// ---------------------------------------------------------------------------\n\nexport const PROFILE_EVENT_TYPES: Readonly<Record<EventProfile, readonly string[]>> = {\n [EventProfile.UX]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.chunk\",\n \"agent.message.complete\",\n \"agent.message.cancel\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n \"claude_code.hook\",\n ],\n [EventProfile.OBSERVABILITY]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.complete\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n ],\n [EventProfile.DEBUG]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.chunk\",\n \"agent.message.complete\",\n \"agent.message.cancel\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n ],\n [EventProfile.TOOLS]: [\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n ],\n [EventProfile.STREAMING]: [\"agent.message.chunk\"],\n};\n\n// ---------------------------------------------------------------------------\n// Subscription helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Subscribe handler to all event types in a profile.\n *\n * @returns List of event types subscribed to.\n */\nexport function subscribeProfile(\n bus: EventBus,\n profile: EventProfile,\n handler: EventHandlerFn,\n priority = 0,\n): string[] {\n const eventTypes = [...PROFILE_EVENT_TYPES[profile]];\n for (const eventType of eventTypes) {\n bus.subscribe(eventType, handler, priority);\n }\n return eventTypes;\n}\n\n/**\n * Unsubscribe handler from all event types in a profile.\n */\nexport function unsubscribeProfile(\n bus: EventBus,\n profile: EventProfile,\n handler: EventHandlerFn,\n): void {\n for (const eventType of PROFILE_EVENT_TYPES[profile]) {\n bus.unsubscribe(eventType, handler);\n }\n}\n\n/**\n * Subscribe to multiple profiles, deduplicating event types.\n */\nexport function subscribeProfiles(\n bus: EventBus,\n profiles: EventProfile[],\n handler: EventHandlerFn,\n priority = 0,\n): string[] {\n const eventTypes = new Set<string>();\n for (const profile of profiles) {\n for (const et of PROFILE_EVENT_TYPES[profile]) {\n eventTypes.add(et);\n }\n }\n for (const eventType of eventTypes) {\n bus.subscribe(eventType, handler, priority);\n }\n return [...eventTypes];\n}\n","/**\n * Agent-specific event bus with gate chain for intent filtering.\n *\n * Extends the base EventBus with safety gates that can intercept,\n * block, or modify intent events before they're published.\n */\n\nimport type { Gate, GateResult } from \"../gates/base.js\";\nimport { EventBus } from \"./event-bus.js\";\nimport type { BaseEvent, ToolCallIntent, ToolCallRejectedEvent } from \"./types.js\";\n\nexport class AgentEventBus extends EventBus {\n private _gateChain: Gate[] = [];\n\n /**\n * Add a gate to the chain, automatically sorted by category.\n */\n addGate(gate: Gate): void {\n this._gateChain.push(gate);\n this._gateChain.sort((a, b) => a.category - b.category);\n }\n\n /**\n * Remove a gate from the chain.\n */\n removeGate(gate: Gate): void {\n const idx = this._gateChain.indexOf(gate);\n if (idx !== -1) {\n this._gateChain.splice(idx, 1);\n }\n }\n\n /**\n * Clear all gates from the chain.\n */\n clearGates(): void {\n this._gateChain = [];\n }\n\n /**\n * Get a copy of the gate chain.\n */\n get gates(): readonly Gate[] {\n return [...this._gateChain];\n }\n\n /**\n * Publish an event, running intent events through gate chain.\n *\n * Intent events (those with type ending in \".intent\") are checked by each gate.\n * If any gate blocks the event, a ToolCallRejected event is emitted instead.\n * Regular events bypass gates entirely.\n */\n override async publish(event: BaseEvent): Promise<unknown[]> {\n const isIntent = event.type.endsWith(\".intent\");\n\n if (!isIntent) {\n return super.publish(event);\n }\n\n // Run intent event through gate chain\n let currentEvent: BaseEvent = event;\n for (const gate of this._gateChain) {\n const result = await gate.check(currentEvent);\n\n if (isGateResultObject(result)) {\n if (result.action === \"block\") {\n await this._emitRejection(currentEvent, gate, result.reason);\n return [];\n }\n if (result.action === \"modify\" && result.event) {\n currentEvent = result.event;\n }\n }\n }\n\n // All gates passed, publish the (possibly modified) event\n return super.publish(currentEvent);\n }\n\n private async _emitRejection(event: BaseEvent, gate: Gate, reason?: string): Promise<void> {\n const intent = event as ToolCallIntent;\n const rejection: ToolCallRejectedEvent = {\n type: \"agent.tool.rejected\",\n traceId: intent.traceId,\n runId: intent.runId,\n spanId: `${Date.now().toString(36)}-rejection`,\n timestamp: new Date(),\n toolName: intent.toolName ?? \"\",\n reason: reason ?? gate.getBlockReason(event),\n gateName: gate.name,\n gateCategory: gate.categoryName,\n originalIntent: intent,\n };\n await super.publish(rejection);\n }\n}\n\nfunction isGateResultObject(result: GateResult): result is GateResult {\n return typeof result === \"object\" && result !== null && \"action\" in result;\n}\n\n// ---------------------------------------------------------------------------\n// Global instance\n// ---------------------------------------------------------------------------\n\nlet _agentEventBus: AgentEventBus | null = null;\n\nexport function getAgentEventBus(): AgentEventBus {\n if (!_agentEventBus) {\n _agentEventBus = new AgentEventBus();\n }\n return _agentEventBus;\n}\n\nexport function setAgentEventBus(bus: AgentEventBus): void {\n _agentEventBus = bus;\n}\n","/**\n * SandboxEventBus - AgentEventBus with pluggable transport for cross-agent messaging.\n *\n * Extends AgentEventBus with dual publish: local handlers + transport publish\n * for SandboxEvents. Subscribes to both direct and broadcast channels.\n */\n\nimport type { Transport, TransportMessage } from \"../transport/types.js\";\nimport { AgentEventBus } from \"./agent-event-bus.js\";\nimport type { AgentAddress, BaseSandboxEvent, SandboxEvent } from \"./sandbox-types.js\";\nimport { deserializeSandboxEvent, serializeSandboxEvent } from \"./sandbox-types.js\";\nimport type { BaseEvent } from \"./types.js\";\n\n/**\n * Check if an event is a SandboxEvent (has origin + agencyId fields).\n */\nfunction isSandboxEvent(event: BaseEvent): event is SandboxEvent {\n return typeof event === \"object\" && event !== null && \"origin\" in event && \"agencyId\" in event;\n}\n\n/**\n * AgentEventBus extended with transport-aware publishing.\n *\n * - `publish()` dispatches both locally AND to transport for SandboxEvents.\n * - Regular AgentEvents only dispatch locally.\n * - Remote events received via transport are dispatched locally only (no echo loop).\n */\nexport class SandboxEventBus extends AgentEventBus {\n readonly address: AgentAddress;\n private _transport: Transport;\n /**\n * Set of spanIds that this bus has already dispatched locally.\n * Prevents duplicate local dispatch when the InProcessTransport\n * echoes our own publish back to us via subscription.\n */\n private _locallyPublished = new Set<string>();\n\n constructor(address: AgentAddress, transport: Transport) {\n super();\n this.address = address;\n this._transport = transport;\n }\n\n /**\n * Connect transport and set up subscriptions for direct + broadcast channels.\n */\n async start(): Promise<void> {\n await this._transport.connect();\n await this._transport.ensureStream(\"AGENCY_EVENTS\", [\"agency.>\"]);\n\n // Subscribe to direct messages for this agent\n await this._transport.subscribe(\n `agency.*.run.*.agent.${this.address.agentId}`,\n (msg) => this._onRemoteEvent(msg),\n `agent-${this.address.agentId}`,\n );\n\n // Subscribe to broadcasts\n await this._transport.subscribe(\n \"agency.*._broadcast\",\n (msg) => this._onRemoteEvent(msg),\n `broadcast-${this.address.agentId}`,\n );\n }\n\n /**\n * Close transport.\n */\n async stop(): Promise<void> {\n await this._transport.close();\n }\n\n /**\n * Publish event locally and to transport if it's a SandboxEvent.\n *\n * 1. Local gate chain + handlers (via super.publish)\n * 2. If SandboxEvent, also publish to transport\n */\n override async publish(event: BaseEvent): Promise<unknown[]> {\n // Track this event to prevent duplicate local dispatch from transport echo\n this._locallyPublished.add(event.spanId);\n\n // Local dispatch\n const results = await super.publish(event);\n\n // If SandboxEvent, also publish to transport\n if (isSandboxEvent(event)) {\n const subject = this._resolveSubject(event);\n await this._transport.publish(subject, serializeSandboxEvent(event));\n }\n\n // Cleanup tracking (keep set bounded)\n if (this._locallyPublished.size > 1000) {\n const entries = [...this._locallyPublished];\n for (let i = 0; i < entries.length - 500; i++) {\n this._locallyPublished.delete(entries[i]!);\n }\n }\n\n return results;\n }\n\n /**\n * Map event target to transport subject.\n *\n * Targeted: agency.{agencyId}.run.{lineupRunId}.agent.{targetId}\n * Broadcast: agency.{agencyId}._broadcast\n */\n private _resolveSubject(event: SandboxEvent): string {\n const base = event as BaseSandboxEvent;\n if (base.target) {\n return `agency.${base.agencyId}.run.${base.lineupRunId}.agent.${base.target.agentId}`;\n }\n return `agency.${base.agencyId}._broadcast`;\n }\n\n /**\n * Inject remote transport message into local EventBus (no re-publish to transport).\n *\n * Skips events we already published locally (echo prevention for shared transport).\n */\n private async _onRemoteEvent(msg: TransportMessage): Promise<void> {\n const event = deserializeSandboxEvent(msg.data);\n\n // Skip events we already dispatched locally (echo from shared InProcessTransport)\n if (this._locallyPublished.has(event.spanId)) {\n await msg.ack();\n return;\n }\n\n // Mark as locally published to prevent re-entry\n this._locallyPublished.add(event.spanId);\n\n // Local dispatch only (do not re-publish to transport)\n await super.publish(event);\n await msg.ack();\n }\n}\n","/**\n * Gate base interface and types.\n *\n * Gates intercept intent events and can block, allow, or modify them.\n * They execute in category order: SAFETY -> RATE_LIMIT -> APPROVAL -> AUDIT.\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Gate category — lower values run first\n// ---------------------------------------------------------------------------\n\nexport const GateCategory = {\n SAFETY: 0,\n RATE_LIMIT: 1,\n APPROVAL: 2,\n AUDIT: 3,\n} as const;\n\nexport type GateCategory = (typeof GateCategory)[keyof typeof GateCategory];\n\nexport const GATE_CATEGORY_NAMES: Readonly<Record<GateCategory, string>> = {\n [GateCategory.SAFETY]: \"SAFETY\",\n [GateCategory.RATE_LIMIT]: \"RATE_LIMIT\",\n [GateCategory.APPROVAL]: \"APPROVAL\",\n [GateCategory.AUDIT]: \"AUDIT\",\n};\n\n// ---------------------------------------------------------------------------\n// Gate result\n// ---------------------------------------------------------------------------\n\nexport type GateResult =\n | { action: \"allow\" }\n | { action: \"block\"; reason: string }\n | { action: \"modify\"; event: BaseEvent };\n\nexport const GateAllow: GateResult = { action: \"allow\" };\n\nexport function GateBlock(reason: string): GateResult {\n return { action: \"block\", reason };\n}\n\nexport function GateModify(event: BaseEvent): GateResult {\n return { action: \"modify\", event };\n}\n\n// ---------------------------------------------------------------------------\n// Gate interface\n// ---------------------------------------------------------------------------\n\nexport interface Gate {\n /** Category of this gate for ordering. */\n readonly category: GateCategory;\n\n /** Gate name for rejection messages. */\n readonly name: string;\n\n /** Human-readable category name. */\n readonly categoryName: string;\n\n /** Check an intent event. */\n check(event: BaseEvent): Promise<GateResult>;\n\n /** Get reason why event was blocked. */\n getBlockReason(event: BaseEvent): string;\n}\n\n/**\n * Abstract base class for gates.\n * Subclasses must implement check() and set category.\n */\nexport abstract class BaseGate implements Gate {\n abstract readonly category: GateCategory;\n\n get name(): string {\n return this.constructor.name;\n }\n\n get categoryName(): string {\n return GATE_CATEGORY_NAMES[this.category];\n }\n\n abstract check(event: BaseEvent): Promise<GateResult>;\n\n getBlockReason(_event: BaseEvent): string {\n return \"Blocked by gate policy\";\n }\n}\n","/**\n * Safety gate for blocking dangerous operations.\n *\n * Category: SAFETY (runs first in chain)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\nexport class SafetyGate extends BaseGate {\n readonly category = GateCategory.SAFETY;\n\n private _blockedTools: Set<string>;\n private _blockedPatterns: RegExp[];\n private _blockMessage: string;\n\n constructor(options?: {\n blockedTools?: Set<string>;\n blockedPatterns?: string[];\n blockMessage?: string;\n }) {\n super();\n this._blockedTools = options?.blockedTools ?? new Set();\n this._blockedPatterns = (options?.blockedPatterns ?? []).map((p) => new RegExp(p));\n this._blockMessage = options?.blockMessage ?? \"Tool is not allowed by safety policy\";\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const toolName = (event as { toolName?: string }).toolName ?? \"\";\n\n if (this._blockedTools.has(toolName)) {\n return GateBlock(this.getBlockReason(event));\n }\n\n for (const pattern of this._blockedPatterns) {\n if (pattern.test(toolName)) {\n return GateBlock(this.getBlockReason(event));\n }\n }\n\n return GateAllow;\n }\n\n override getBlockReason(event: BaseEvent): string {\n const toolName = (event as { toolName?: string }).toolName ?? \"unknown\";\n return `${this._blockMessage}: '${toolName}'`;\n }\n}\n","/**\n * Rate limit gate using token bucket algorithm.\n *\n * Category: RATE_LIMIT (runs second)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\nexport class RateLimitGate extends BaseGate {\n readonly category = GateCategory.RATE_LIMIT;\n\n private _rate: number;\n private _burst: number;\n private _tokens: number;\n private _lastUpdate: number;\n\n constructor(options?: {\n callsPerMinute?: number;\n burstSize?: number;\n }) {\n super();\n const callsPerMinute = options?.callsPerMinute ?? 60;\n this._rate = callsPerMinute / 60.0;\n this._burst = options?.burstSize ?? callsPerMinute;\n this._tokens = this._burst;\n this._lastUpdate = Date.now() / 1000; // seconds\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const now = Date.now() / 1000;\n const elapsed = now - this._lastUpdate;\n this._tokens = Math.min(this._burst, this._tokens + elapsed * this._rate);\n this._lastUpdate = now;\n\n if (this._tokens >= 1.0) {\n this._tokens -= 1.0;\n return GateAllow;\n }\n\n return GateBlock(this.getBlockReason(event));\n }\n\n override getBlockReason(_event: BaseEvent): string {\n return `Rate limit exceeded (${Math.round(this._rate * 60)} calls/min)`;\n }\n}\n","/**\n * Human approval gate for tool calls.\n *\n * Category: APPROVAL (runs third)\n */\n\nimport type { BaseEvent, ToolCallIntent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\n/** Callback that decides whether to approve a tool call. */\nexport type ApprovalCallback = (event: ToolCallIntent) => boolean | Promise<boolean>;\n\nexport class HumanApprovalGate extends BaseGate {\n readonly category = GateCategory.APPROVAL;\n\n private _approvalFn: ApprovalCallback;\n private _tools: Set<string> | undefined;\n private _autoApprove: boolean;\n\n constructor(options?: {\n approvalFn?: ApprovalCallback;\n tools?: Set<string>;\n autoApprove?: boolean;\n }) {\n super();\n this._approvalFn = options?.approvalFn ?? (() => true);\n this._tools = options?.tools;\n this._autoApprove = options?.autoApprove ?? false;\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const toolName = (event as ToolCallIntent).toolName ?? \"\";\n\n // Check if this tool needs approval\n if (this._tools && !this._tools.has(toolName)) {\n return GateAllow;\n }\n\n if (this._autoApprove) {\n return GateAllow;\n }\n\n const approved = await this._approvalFn(event as ToolCallIntent);\n return approved ? GateAllow : GateBlock(this.getBlockReason(event));\n }\n\n override getBlockReason(event: BaseEvent): string {\n const toolName = (event as { toolName?: string }).toolName ?? \"unknown\";\n return `Human declined approval for '${toolName}'`;\n }\n}\n","/**\n * Audit gate for logging all intents.\n *\n * Category: AUDIT (runs last, never blocks)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateCategory, type GateResult } from \"./base.js\";\n\n/** Logger interface — matches console.info signature. */\nexport interface AuditLogger {\n info(message: string, ...args: unknown[]): void;\n}\n\nexport class AuditGate extends BaseGate {\n readonly category = GateCategory.AUDIT;\n\n /** Recorded entries for testing/inspection. */\n readonly entries: Array<{ type: string; toolName: string; timestamp: Date }> = [];\n\n private _logger: AuditLogger | undefined;\n\n constructor(options?: { logger?: AuditLogger }) {\n super();\n this._logger = options?.logger;\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n const toolName = (event as { toolName?: string }).toolName ?? \"\";\n this.entries.push({\n type: event.type,\n toolName,\n timestamp: new Date(),\n });\n\n if (this._logger) {\n this._logger.info(`Intent: ${event.type}`, {\n type: event.type,\n toolName,\n runId: event.runId,\n });\n }\n\n return GateAllow;\n }\n}\n","/**\n * AgentRunner — The standard agentic execution loop on Vercel AI SDK.\n *\n * Ported from Python: systems/runners/agent.py\n *\n * Key differences from Python:\n * - Parallel tool execution via Promise.all (Python is sequential)\n * - Vercel AI SDK handles tool schema conversion (Python manually builds OpenAI JSON)\n * - maxSteps: 1 forces one LLM call per iteration for gate interception control\n * - MockLanguageModelV1 for testing (replaces Python's MockRunner)\n */\n\nimport type { ToolSchema } from \"@agentic-patterns/core\";\nimport {\n type CoreMessage,\n type LanguageModelV1,\n type ToolCallPart,\n type ToolResultPart,\n generateId,\n generateText,\n streamText,\n} from \"ai\";\n\nimport { type AgentEventBus, getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport { type AgentEvent, createEvent } from \"../events/types.js\";\nimport { convertHistory } from \"./message-utils.js\";\nimport type { AgentLike, RunOptions, RunResult, RunnerProtocol, ToolExecutor } from \"./types.js\";\n\n// Re-export AgentLike here so existing consumers importing from \"./agent-runner\"\n// (including the public barrel and workflow modules) continue to work.\nexport type { AgentLike };\n\n// ---------------------------------------------------------------------------\n// ToolCallBlocked error\n// ---------------------------------------------------------------------------\n\nexport class ToolCallBlocked extends Error {\n readonly toolName: string;\n readonly reason: string;\n\n constructor(toolName: string, reason: string) {\n super(`Tool call '${toolName}' blocked: ${reason}`);\n this.name = \"ToolCallBlocked\";\n this.toolName = toolName;\n this.reason = reason;\n }\n}\n\n// ---------------------------------------------------------------------------\n// AgentRunner\n// ---------------------------------------------------------------------------\n\n/**\n * The standard agentic execution loop.\n *\n * Executes agents using a tool loop pattern with the Vercel AI SDK.\n *\n * The runner implements an agentic tool loop:\n * 1. Send message to LLM with system prompt and tools\n * 2. If LLM returns tool_calls, execute them via toolExecutor (parallel)\n * 3. Feed tool results back to LLM\n * 4. Repeat until LLM returns final response or maxIterations reached\n */\nexport class AgentRunner implements RunnerProtocol {\n private _eventBus: AgentEventBus | undefined;\n private readonly _model: LanguageModelV1;\n\n constructor(model: LanguageModelV1, eventBus?: AgentEventBus) {\n this._model = model;\n this._eventBus = eventBus;\n }\n\n private get eventBus(): AgentEventBus {\n if (!this._eventBus) {\n this._eventBus = getAgentEventBus();\n }\n return this._eventBus;\n }\n\n private async emit(event: AgentEvent): Promise<unknown[]> {\n return this.eventBus.publish(event);\n }\n\n /**\n * Emit an intent event and check if it was blocked by a gate.\n * Returns true if allowed, false if blocked.\n */\n private async emitIntent(event: AgentEvent): Promise<boolean> {\n const results = await this.eventBus.publish(event);\n // If no gates, always allowed; if gates exist and returned empty list, blocked\n return results.length > 0 || this.eventBus.gates.length === 0;\n }\n\n /**\n * Convert agent tools to Vercel AI SDK tool format.\n */\n private convertTools(\n agent: AgentLike,\n _executor?: ToolExecutor,\n ): Record<string, { description: string; parameters: unknown }> {\n // AgentLike.getTools() returns unknown[] at the protocol boundary;\n // AgentRunner knows real agents produce ToolSchema[] and narrows here.\n const agentTools = agent.getTools() as ToolSchema[];\n if (agentTools.length === 0) return {};\n\n const tools: Record<string, { description: string; parameters: unknown }> = {};\n for (const t of agentTools) {\n const vercel = t.toVercelAI();\n tools[t.name] = {\n description: vercel.description,\n parameters: vercel.parameters,\n };\n }\n return tools;\n }\n\n async run(agent: AgentLike, message: string, options?: RunOptions): Promise<RunResult> {\n // Set event bus if provided\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const effectiveTraceId = options?.traceId ?? runId;\n const maxIterations = options?.maxIterations ?? 10;\n const toolExecutor = options?.toolExecutor;\n\n // Resolve model name and tools\n const modelName = agent.getModel();\n const agentTools = agent.getTools() as ToolSchema[];\n const tools = this.convertTools(agent, toolExecutor);\n const hasTools = agentTools.length > 0;\n\n // Emit message start event (root of the trace)\n const startEvent = createEvent(\"agent.message.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: modelName,\n tools: agentTools.map((t) => t.name),\n },\n });\n const rootSpanId = startEvent.spanId;\n await this.emit(startEvent);\n\n // Build initial messages from history\n const messages: CoreMessage[] = [];\n if (options?.messageHistory) {\n messages.push(...convertHistory(options.messageHistory));\n }\n messages.push({ role: \"user\" as const, content: message });\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalToolCalls = 0;\n\n // Get system prompt\n const system = agent.renderInitialPrompt();\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n // Emit iteration start\n const iterStart = createEvent(\"agent.iteration.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: rootSpanId,\n iteration,\n maxIterations,\n });\n const iterSpanId = iterStart.spanId;\n await this.emit(iterStart);\n\n // Emit LLM call start\n const llmStart = createEvent(\"agent.llm.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n model: modelName,\n messageCount: messages.length + 1, // +1 for system\n hasTools,\n });\n const llmSpanId = llmStart.spanId;\n await this.emit(llmStart);\n\n const llmStartTime = Date.now();\n\n let result: Awaited<ReturnType<typeof generateText>>;\n try {\n result = await generateText({\n model: this._model,\n system,\n messages,\n tools: hasTools ? tools : undefined,\n maxSteps: 1, // Force single step for gate interception\n });\n } catch (e: unknown) {\n const llmDuration = Date.now() - llmStartTime;\n await this.emit(\n createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: llmDuration,\n hasToolCalls: false,\n finishReason: \"error\",\n }),\n );\n const err = e instanceof Error ? e : new Error(String(e));\n await this.emit(\n createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: err.name,\n message: err.message,\n recoverable: false,\n context: {},\n }),\n );\n throw e;\n }\n\n const llmDuration = Date.now() - llmStartTime;\n\n // Track token usage\n const iterInputTokens = result.usage?.promptTokens ?? 0;\n const iterOutputTokens = result.usage?.completionTokens ?? 0;\n totalInputTokens += iterInputTokens;\n totalOutputTokens += iterOutputTokens;\n\n const resultToolCalls = result.toolCalls ?? [];\n const hasToolCalls = resultToolCalls.length > 0;\n\n // If the model produced reasoning (extended-thinking, o-series, etc.),\n // emit a single thinking.start + completed agent.reasoning pair. The\n // non-streaming path can't expose per-delta events, so one summary is\n // the faithful best-effort mapping.\n const reasoningContent = (result as { reasoning?: string | undefined }).reasoning;\n if (reasoningContent && reasoningContent.length > 0) {\n await this.emit(\n createEvent(\"agent.thinking.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: llmSpanId,\n }),\n );\n await this.emit(\n createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningContent,\n isComplete: true,\n }),\n );\n }\n\n // Emit LLM call end\n await this.emit(\n createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: iterInputTokens,\n outputTokens: iterOutputTokens,\n durationMs: llmDuration,\n hasToolCalls,\n finishReason: hasToolCalls ? \"tool_calls\" : (result.finishReason ?? \"stop\"),\n }),\n );\n\n // No tool calls = done\n if (!hasToolCalls) {\n const content = result.text ?? \"\";\n\n // Emit iteration end\n await this.emit(\n createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: 0,\n hasMore: false,\n }),\n );\n\n // Emit message complete\n await this.emit(\n createEvent(\"agent.message.complete\", {\n traceId: effectiveTraceId,\n runId,\n spanId: rootSpanId,\n parentSpanId: rootSpanId,\n content,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n model: modelName,\n }),\n );\n\n return {\n response: content,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n toolCallsCount: totalToolCalls,\n iterations: iteration + 1,\n finishReason: result.finishReason ?? \"stop\",\n };\n }\n\n // Has tool calls — execute them in parallel\n for (const tc of resultToolCalls) {\n const intent = createEvent(\"agent.tool.intent\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n });\n const allowed = await this.emitIntent(intent);\n if (!allowed) {\n throw new ToolCallBlocked(tc.toolName, \"Blocked by gate\");\n }\n }\n\n // Parallel tool execution\n const toolResults = await Promise.all(\n resultToolCalls.map(async (tc) => {\n const tcStart = createEvent(\"agent.tool.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n });\n const tcSpanId = tcStart.spanId;\n await this.emit(tcStart);\n\n const startTime = Date.now();\n let toolResult: unknown;\n let errorMsg: string | undefined;\n\n try {\n if (toolExecutor) {\n toolResult = await toolExecutor.execute(\n tc.toolName,\n tc.args as Record<string, unknown>,\n );\n } else {\n toolResult = { error: \"No tool executor configured\" };\n errorMsg = \"No tool executor configured\";\n }\n } catch (e: unknown) {\n const err = e instanceof Error ? e : new Error(String(e));\n toolResult = { error: err.message };\n errorMsg = err.message;\n }\n\n const durationMs = Date.now() - startTime;\n totalToolCalls++;\n\n await this.emit(\n createEvent(\"agent.tool.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: tcSpanId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n result: toolResult,\n error: errorMsg,\n durationMs,\n resultTokens: 0,\n }),\n );\n\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: toolResult,\n };\n }),\n );\n\n // Append messages for next iteration\n const assistantContent: Array<ToolCallPart | { type: \"text\"; text: string }> = [];\n if (result.text) {\n assistantContent.push({ type: \"text\" as const, text: result.text });\n }\n for (const tc of resultToolCalls) {\n assistantContent.push({\n type: \"tool-call\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n messages.push({ role: \"assistant\" as const, content: assistantContent });\n\n const toolResultParts: ToolResultPart[] = toolResults.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n result: tr.result,\n }));\n messages.push({ role: \"tool\" as const, content: toolResultParts });\n\n // Emit iteration end\n await this.emit(\n createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: resultToolCalls.length,\n hasMore: true,\n }),\n );\n }\n\n // Max iterations exceeded\n return {\n response: \"\",\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n toolCallsCount: totalToolCalls,\n iterations: maxIterations,\n finishReason: \"max_iterations\",\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream() — Streaming execution loop using fullStream\n // ---------------------------------------------------------------------------\n\n async *stream(\n agent: AgentLike,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const effectiveTraceId = options?.traceId ?? runId;\n const maxIterations = options?.maxIterations ?? 10;\n const toolExecutor = options?.toolExecutor;\n const conversationId = generateId();\n\n const modelName = agent.getModel();\n const agentTools = agent.getTools();\n const tools = this.convertTools(agent, toolExecutor);\n const hasTools = agentTools.length > 0;\n\n const system = agent.renderInitialPrompt();\n const messages: CoreMessage[] = [];\n if (options?.messageHistory) {\n messages.push(...convertHistory(options.messageHistory));\n }\n messages.push({ role: \"user\" as const, content: message });\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalToolCalls = 0;\n let fullText = \"\";\n\n // Conversation start\n const convStart = createEvent(\"agent.conversation.start\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n agentName: agent.role.name,\n });\n await this.emit(convStart);\n yield convStart;\n\n // Message start\n const msgStart = createEvent(\"agent.message.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n });\n const rootSpanId = msgStart.spanId;\n await this.emit(msgStart);\n yield msgStart;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n // Iteration start\n const iterStart = createEvent(\"agent.iteration.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: rootSpanId,\n iteration,\n maxIterations,\n });\n const iterSpanId = iterStart.spanId;\n await this.emit(iterStart);\n yield iterStart;\n\n // LLM start\n const llmStart = createEvent(\"agent.llm.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n model: modelName,\n messageCount: messages.length + 1,\n hasTools,\n });\n const llmSpanId = llmStart.spanId;\n await this.emit(llmStart);\n yield llmStart;\n\n const llmStartTime = Date.now();\n\n // Use fullStream to get text + tool calls + errors in one pass\n const streamResult = streamText({\n model: this._model,\n system,\n messages,\n tools: hasTools ? tools : undefined,\n maxSteps: 1,\n });\n\n let iterText = \"\";\n let chunkIndex = 0;\n const pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result?: unknown;\n }> = [];\n let stepUsage: { promptTokens: number; completionTokens: number } | undefined;\n let stepFinishReason = \"stop\";\n let hadError = false;\n\n // Reasoning-block tracking. Some models (Claude extended thinking,\n // o-series, Gemini 2.5 thinking, DeepSeek Reasoner) emit one or more\n // reasoning deltas before switching back to text/tool-calls. We emit\n // exactly one `agent.thinking.start` per block, stream per-delta\n // `agent.reasoning` events with `isComplete: false`, then one final\n // `agent.reasoning` with `isComplete: true` carrying the full\n // accumulated text when the block ends.\n let reasoningActive = false;\n let reasoningText = \"\";\n\n for await (const part of streamResult.fullStream) {\n switch (part.type) {\n case \"text-delta\": {\n // Transition reasoning -> text: close the reasoning block first.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n iterText += part.textDelta;\n const chunkEvent = createEvent(\"agent.message.chunk\", {\n traceId: effectiveTraceId,\n runId,\n delta: part.textDelta,\n chunkIndex: chunkIndex++,\n });\n await this.emit(chunkEvent);\n yield chunkEvent;\n break;\n }\n case \"reasoning\": {\n if (!reasoningActive) {\n reasoningActive = true;\n reasoningText = \"\";\n const startEvent = createEvent(\"agent.thinking.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: llmSpanId,\n });\n await this.emit(startEvent);\n yield startEvent;\n }\n reasoningText += part.textDelta;\n const deltaEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: part.textDelta,\n isComplete: false,\n });\n await this.emit(deltaEvent);\n yield deltaEvent;\n break;\n }\n case \"tool-call\": {\n // Transition reasoning -> tool-call: close the reasoning block.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n pendingToolCalls.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args as Record<string, unknown>,\n });\n break;\n }\n case \"step-finish\": {\n stepUsage = part.usage;\n stepFinishReason = part.finishReason;\n break;\n }\n case \"error\": {\n hadError = true;\n const llmDuration = Date.now() - llmStartTime;\n const llmEndErr = createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: llmDuration,\n hasToolCalls: false,\n finishReason: \"error\",\n });\n await this.emit(llmEndErr);\n yield llmEndErr;\n\n const err = part.error instanceof Error ? part.error : new Error(String(part.error));\n const errEvent = createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: err.name,\n message: err.message,\n recoverable: false,\n context: {},\n });\n await this.emit(errEvent);\n yield errEvent;\n break;\n }\n default:\n // step-start, finish, reasoning-signature, redacted-reasoning, etc. — skip\n break;\n }\n }\n\n // Stream ended while a reasoning block is still open — close it out.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n\n if (hadError) {\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"error\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n fullText += iterText;\n\n // Update token tracking\n const iterInputTokens = stepUsage?.promptTokens ?? 0;\n const iterOutputTokens = stepUsage?.completionTokens ?? 0;\n totalInputTokens += iterInputTokens;\n totalOutputTokens += iterOutputTokens;\n\n const hasToolCalls = pendingToolCalls.length > 0;\n const llmDuration = Date.now() - llmStartTime;\n\n // LLM end\n const llmEnd = createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: iterInputTokens,\n outputTokens: iterOutputTokens,\n durationMs: llmDuration,\n hasToolCalls,\n finishReason: hasToolCalls ? \"tool_calls\" : stepFinishReason,\n });\n await this.emit(llmEnd);\n yield llmEnd;\n\n // No tool calls = done\n if (!hasToolCalls) {\n const iterEnd = createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: 0,\n hasMore: false,\n });\n await this.emit(iterEnd);\n yield iterEnd;\n\n const msgComplete = createEvent(\"agent.message.complete\", {\n traceId: effectiveTraceId,\n runId,\n spanId: rootSpanId,\n parentSpanId: rootSpanId,\n content: fullText,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n model: modelName,\n });\n await this.emit(msgComplete);\n yield msgComplete;\n\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"completed\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n // Process tool calls\n for (const tc of pendingToolCalls) {\n const intent = createEvent(\"agent.tool.intent\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n });\n await this.emit(intent);\n yield intent;\n\n const allowed = await this.emitIntent(intent);\n if (!allowed) {\n const errEvent = createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: \"ToolCallBlocked\",\n message: `Tool call '${tc.toolName}' blocked by gate`,\n recoverable: false,\n context: {},\n });\n await this.emit(errEvent);\n yield errEvent;\n\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"error\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n const tcStart = createEvent(\"agent.tool.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n });\n const tcSpanId = tcStart.spanId;\n await this.emit(tcStart);\n yield tcStart;\n\n const startTime = Date.now();\n let toolResult: unknown;\n let errorMsg: string | undefined;\n\n try {\n if (toolExecutor) {\n toolResult = await toolExecutor.execute(tc.toolName, tc.args);\n } else {\n toolResult = { error: \"No tool executor configured\" };\n errorMsg = \"No tool executor configured\";\n }\n } catch (e: unknown) {\n const err = e instanceof Error ? e : new Error(String(e));\n toolResult = { error: err.message };\n errorMsg = err.message;\n }\n\n const durationMs = Date.now() - startTime;\n totalToolCalls++;\n tc.result = toolResult;\n\n const tcEnd = createEvent(\"agent.tool.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: tcSpanId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n result: toolResult,\n error: errorMsg,\n durationMs,\n resultTokens: 0,\n });\n await this.emit(tcEnd);\n yield tcEnd;\n }\n\n // Build messages for next iteration\n const assistantContent: Array<ToolCallPart | { type: \"text\"; text: string }> = [];\n if (iterText) {\n assistantContent.push({ type: \"text\" as const, text: iterText });\n }\n for (const tc of pendingToolCalls) {\n assistantContent.push({\n type: \"tool-call\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n messages.push({ role: \"assistant\" as const, content: assistantContent });\n\n const toolResultParts: ToolResultPart[] = pendingToolCalls.map((tc) => ({\n type: \"tool-result\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: tc.result,\n }));\n messages.push({ role: \"tool\" as const, content: toolResultParts });\n\n // Iteration end\n const iterEnd = createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: pendingToolCalls.length,\n hasMore: true,\n });\n await this.emit(iterEnd);\n yield iterEnd;\n }\n\n // Max iterations reached\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"completed\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n }\n}\n","/**\n * Message history conversion — canonical format to Vercel AI SDK CoreMessage[].\n *\n * Ported from Python: _convert_history_to_messages() in runners/agent.py\n */\n\nimport type { CoreMessage } from \"ai\";\nimport type { CanonicalMessage } from \"./types.js\";\n\n/**\n * Convert canonical internal message format to Vercel AI SDK CoreMessage[].\n *\n * Canonical format (from orchestration layer):\n * { kind: \"request\", parts: [{ type: \"user_prompt\", content: \"...\" }] }\n * { kind: \"response\", parts: [\n * { type: \"text\", content: \"...\" },\n * { type: \"tool_call\", tool_name: \"...\", tool_call_id: \"...\", arguments: {} },\n * { type: \"tool_return\", tool_name: \"...\", tool_call_id: \"...\", content: \"...\" },\n * ]}\n *\n * Vercel AI SDK format:\n * { role: \"user\", content: \"...\" }\n * { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool-call\", ... }] }\n * { role: \"tool\", content: [{ type: \"tool-result\", ... }] }\n */\nexport function convertHistory(history: CanonicalMessage[]): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n for (const msg of history) {\n if (msg.kind === \"request\") {\n // Request messages contain user prompts\n for (const part of msg.parts) {\n if (part.type === \"user_prompt\" && part.content) {\n messages.push({ role: \"user\" as const, content: part.content });\n }\n // system_prompt parts are handled separately by agent.getSystemPrompt()\n }\n } else if (msg.kind === \"response\") {\n // Response messages contain assistant text and tool calls\n const textParts: string[] = [];\n const toolCalls: Array<{\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }> = [];\n const toolReturns: Array<{\n toolCallId: string;\n content: string;\n }> = [];\n\n for (const part of msg.parts) {\n if (part.type === \"text\" && part.content) {\n textParts.push(part.content);\n } else if (part.type === \"tool_call\") {\n toolCalls.push({\n toolCallId: part.tool_call_id ?? \"\",\n toolName: part.tool_name ?? \"\",\n args: part.arguments ?? {},\n });\n } else if (part.type === \"tool_return\") {\n toolReturns.push({\n toolCallId: part.tool_call_id ?? \"\",\n content: part.content ?? \"\",\n });\n }\n }\n\n // Build assistant message with content parts array for mixed text+tool calls\n if (textParts.length > 0 || toolCalls.length > 0) {\n if (toolCalls.length === 0) {\n // Text-only response\n messages.push({\n role: \"assistant\" as const,\n content: textParts.join(\"\"),\n });\n } else {\n // Mixed text + tool calls — use content array format\n const contentParts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n > = [];\n\n if (textParts.length > 0) {\n contentParts.push({ type: \"text\", text: textParts.join(\"\") });\n }\n for (const tc of toolCalls) {\n contentParts.push({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n\n messages.push({\n role: \"assistant\" as const,\n content: contentParts,\n });\n }\n }\n\n // Tool results as separate tool messages\n if (toolReturns.length > 0) {\n const toolResultParts = toolReturns.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: \"\", // not available in canonical format\n result: tr.content,\n }));\n messages.push({\n role: \"tool\" as const,\n content: toolResultParts,\n });\n }\n }\n }\n\n return messages;\n}\n","/**\n * ClaudeCodeRunner — Runner backed by the Claude Agent SDK.\n *\n * Mirrors Python: agentic_patterns/core/systems/runners/claude_code.py\n *\n * Wraps the Claude Agent SDK's query() function to execute agents through\n * Claude Code's subprocess-based architecture. Claude Code manages its own\n * tool loop, so toolExecutor is accepted for interface compatibility but\n * not used.\n *\n * Event bridging:\n * - PreToolUse hook → ToolCallIntent (gate chain) + ToolCallStartEvent\n * - PostToolUse hook → ToolCallEndEvent with result\n * - SDKAssistantMessage → MessageStart/Complete, Reasoning\n * - SDKResultMessage → MessageComplete with usage stats\n * - SDKPartialAssistantMessage → MessageChunk (streaming)\n */\n\nimport type { ToolSchema } from \"@agentic-patterns/core\";\nimport {\n type HookCallback,\n type HookCallbackMatcher,\n type Options as SDKOptions,\n query,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { generateId } from \"ai\";\n\nimport { type AgentEventBus, getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport { type AgentEvent, createEvent } from \"../events/types.js\";\nimport { type AgentLikeForBridge, buildAgentServers } from \"./sdk-bridge.js\";\nimport type { RunOptions, RunResult, RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Model mapping\n// ---------------------------------------------------------------------------\n\nconst MODEL_MAP: Record<string, string> = {\n opus: \"opus\",\n sonnet: \"sonnet\",\n haiku: \"haiku\",\n};\n\nfunction mapModel(modelName: string): string | undefined {\n const lower = modelName.toLowerCase();\n for (const [key, value] of Object.entries(MODEL_MAP)) {\n if (lower.includes(key)) return value;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Correlation id plumbing\n//\n// When the runner invokes the Claude Agent SDK, the SDK spawns a Claude Code\n// CLI subprocess whose hooks POST back to our server. We tag those hooks\n// with a correlation id via the `AP_RUNNER_CORRELATION_ID` env var so the\n// server knows the runner is already observing the session — the raw\n// `claude_code.hook` event is still kept (PreCompact, PermissionRequest,\n// etc. give value the runner doesn't emit) but the derived\n// `agent.tool.start`/`agent.tool.end` events are SUPPRESSED to avoid\n// double-counting alongside the runner's own tool events.\n// ---------------------------------------------------------------------------\n\nexport const AP_RUNNER_CORRELATION_ENV = \"AP_RUNNER_CORRELATION_ID\";\n\nfunction newCorrelationId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Set `AP_RUNNER_CORRELATION_ID` on `process.env` for the duration of an\n * SDK invocation. Returns a restore function that puts the previous value\n * back (or deletes the key if it wasn't set). Safe to call in environments\n * without `process` — becomes a no-op.\n *\n * Child processes spawned transitively by the SDK inherit this env var,\n * which is what `hooks/emit.mjs` reads to tag its POSTs.\n */\nfunction setCorrelationEnv(id: string): () => void {\n if (typeof process === \"undefined\" || !process.env) {\n return () => {\n /* no-op */\n };\n }\n const prior = process.env[AP_RUNNER_CORRELATION_ENV];\n process.env[AP_RUNNER_CORRELATION_ENV] = id;\n return () => {\n if (prior === undefined) {\n delete process.env[AP_RUNNER_CORRELATION_ENV];\n } else {\n process.env[AP_RUNNER_CORRELATION_ENV] = prior;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// ClaudeCodeRunner\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeRunnerOptions {\n /** Default SDK options applied before per-run overrides. */\n defaults?: Partial<SDKOptions>;\n /** Optional event bus for emitting agent events. */\n eventBus?: AgentEventBus;\n}\n\n/**\n * Runner that delegates execution to Claude Code via the Agent SDK.\n *\n * Claude Code manages its own tool loop, permissions, and file access.\n * This runner translates SDK messages into the AgentEvent stream so that\n * the rest of the framework (gates, exporters, UX) works transparently.\n *\n * Gate enforcement is handled via PreToolUse hooks — if a gate blocks a\n * ToolCallIntent, the hook returns `permissionDecision: 'deny'` to the\n * SDK so the tool is never executed.\n */\nexport class ClaudeCodeRunner implements RunnerProtocol {\n protected _eventBus: AgentEventBus | undefined;\n protected readonly _defaults: Partial<SDKOptions>;\n\n constructor(opts?: ClaudeCodeRunnerOptions) {\n this._eventBus = opts?.eventBus;\n this._defaults = opts?.defaults ?? {};\n }\n\n protected get eventBus(): AgentEventBus {\n if (!this._eventBus) {\n this._eventBus = getAgentEventBus();\n }\n return this._eventBus;\n }\n\n protected async emit(event: AgentEvent): Promise<void> {\n await this.eventBus.publish(event);\n }\n\n /**\n * Publish a ToolCallIntent through the gate chain.\n * Returns true if the intent was allowed, false if blocked.\n */\n protected async emitIntent(intent: AgentEvent & { type: \"agent.tool.intent\" }): Promise<boolean> {\n // Track whether a gate blocked the intent by listening for rejection events.\n // We can't use publish()'s return value because an empty array means either\n // \"blocked by gate\" or \"no subscribers\" — both return [].\n let blocked = false;\n const onRejected = () => {\n blocked = true;\n };\n this.eventBus.subscribe(\"agent.tool.rejected\", onRejected);\n try {\n await this.eventBus.publish(intent);\n } finally {\n this.eventBus.unsubscribe(\"agent.tool.rejected\", onRejected);\n }\n return !blocked;\n }\n\n async run(agent: AgentLikeForBridge, message: string, options?: RunOptions): Promise<RunResult> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const traceId = options?.traceId ?? runId;\n const correlationId = newCorrelationId();\n\n // Build SDK options with hooks for gate enforcement\n const sdkOptions = this._buildOptions(agent, options, {\n runId,\n traceId,\n parentSpanId: options?.parentSpanId,\n });\n\n // Emit message start\n const startEvent = createEvent(\"agent.message.start\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: agent.getModel(),\n tools: agent.getTools().map((t: ToolSchema) => t.name),\n runnerCorrelationId: correlationId,\n },\n });\n await this.emit(startEvent);\n\n const contentParts: string[] = [];\n let toolCallsMade = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n const model = agent.getModel();\n\n const restoreCorrelation = setCorrelationEnv(correlationId);\n\n try {\n for await (const msg of query({ prompt: message, options: sdkOptions })) {\n if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n contentParts.push(block.text);\n } else if (\"thinking\" in block && typeof block.thinking === \"string\") {\n await this.emit(\n createEvent(\"agent.reasoning\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n content: block.thinking,\n isComplete: true,\n }),\n );\n } else if (\"name\" in block) {\n // ToolUseBlock — count only; event emission handled by hooks\n toolCallsMade++;\n }\n }\n }\n } else if (msg.type === \"result\") {\n if (\"usage\" in msg && msg.usage) {\n const usage = msg.usage as unknown as Record<string, number>;\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (\"result\" in msg && typeof msg.result === \"string\" && contentParts.length === 0) {\n contentParts.push(msg.result);\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n await this.emit(\n createEvent(\"agent.error\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n errorType: error.name,\n message: error.message,\n recoverable: false,\n context: {},\n }),\n );\n throw err;\n } finally {\n restoreCorrelation();\n }\n\n const content = contentParts.join(\"\");\n\n await this.emit(\n createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n spanId: startEvent.spanId,\n parentSpanId: startEvent.spanId,\n content,\n inputTokens,\n outputTokens,\n model,\n }),\n );\n\n return {\n response: content,\n inputTokens,\n outputTokens,\n toolCallsCount: toolCallsMade,\n iterations: 1, // Claude Code manages its own loop\n finishReason: \"stop\",\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream() — streaming mode with MessageChunk events\n // ---------------------------------------------------------------------------\n\n async *stream(\n agent: AgentLikeForBridge,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const traceId = options?.traceId ?? runId;\n const correlationId = newCorrelationId();\n\n const sdkOptions = this._buildOptions(agent, options, {\n runId,\n traceId,\n parentSpanId: options?.parentSpanId,\n includePartialMessages: true,\n });\n\n // Emit and yield message start\n const startEvent = createEvent(\"agent.message.start\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: agent.getModel(),\n tools: agent.getTools().map((t: ToolSchema) => t.name),\n runnerCorrelationId: correlationId,\n },\n });\n await this.emit(startEvent);\n yield startEvent;\n\n const contentParts: string[] = [];\n let chunkIndex = 0;\n let gotChunks = false;\n let toolCallsMade = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n const model = agent.getModel();\n\n const restoreCorrelation = setCorrelationEnv(correlationId);\n\n try {\n for await (const msg of query({ prompt: message, options: sdkOptions })) {\n // Partial/streaming messages → MessageChunk events\n const msgType = msg.type as string;\n if (msgType === \"stream_event\" && \"event\" in msg) {\n const streamMsg = msg as unknown as { event?: { delta?: { text?: string } } };\n const text = streamMsg.event?.delta?.text;\n if (text) {\n const chunkEvent = createEvent(\"agent.message.chunk\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n delta: text,\n chunkIndex,\n });\n await this.emit(chunkEvent);\n yield chunkEvent;\n contentParts.push(text);\n chunkIndex++;\n gotChunks = true;\n }\n } else if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n // Skip if chunks already captured this text\n if (!gotChunks) {\n contentParts.push(block.text);\n }\n } else if (\"thinking\" in block && typeof block.thinking === \"string\") {\n const reasoningEvent = createEvent(\"agent.reasoning\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n content: block.thinking,\n isComplete: true,\n });\n await this.emit(reasoningEvent);\n yield reasoningEvent;\n } else if (\"name\" in block) {\n // Count only; events emitted by hooks\n toolCallsMade++;\n }\n }\n }\n } else if (msg.type === \"result\") {\n if (\"usage\" in msg && msg.usage) {\n const usage = msg.usage as unknown as Record<string, number>;\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (\"result\" in msg && typeof msg.result === \"string\" && contentParts.length === 0) {\n contentParts.push(msg.result);\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const errorEvent = createEvent(\"agent.error\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n errorType: error.name,\n message: error.message,\n recoverable: false,\n context: {},\n });\n await this.emit(errorEvent);\n throw err;\n } finally {\n restoreCorrelation();\n }\n\n const finalContent = contentParts.join(\"\");\n const completeEvent = createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n spanId: startEvent.spanId,\n parentSpanId: startEvent.spanId,\n content: finalContent,\n inputTokens,\n outputTokens,\n model,\n });\n await this.emit(completeEvent);\n yield completeEvent;\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n protected _buildOptions(\n agent: AgentLikeForBridge,\n options: RunOptions | undefined,\n context: {\n runId: string;\n traceId: string;\n parentSpanId?: string;\n includePartialMessages?: boolean;\n },\n ): SDKOptions {\n const sdkOpts: SDKOptions = {\n ...this._defaults,\n systemPrompt: agent.getSystemPrompt(),\n model: mapModel(agent.getModel()) ?? this._defaults.model,\n maxTurns: options?.maxIterations ?? 10,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n hooks: this._makeHooks(context.runId, context.traceId, context.parentSpanId),\n };\n\n if (context.includePartialMessages) {\n sdkOpts.includePartialMessages = true;\n }\n\n // Wire agent capabilities as SDK MCP servers\n if (agent.role.capabilities.length > 0) {\n const { mcpServers, allowedTools } = buildAgentServers(agent);\n if (Object.keys(mcpServers).length > 0) {\n sdkOpts.mcpServers = mcpServers as SDKOptions[\"mcpServers\"];\n sdkOpts.allowedTools = [...(sdkOpts.allowedTools ?? []), ...allowedTools];\n }\n }\n\n return sdkOpts;\n }\n\n /**\n * Create SDK hook definitions that bridge to AgentEvent emissions.\n *\n * PreToolUse: emits ToolCallIntent through the gate chain. If gates\n * block the intent, returns `permissionDecision: 'deny'` to the SDK\n * so the tool is never executed. Otherwise emits ToolCallStartEvent.\n *\n * PostToolUse: emits ToolCallEndEvent with the tool result.\n */\n private _makeHooks(\n runId: string,\n traceId: string,\n parentSpanId: string | undefined,\n ): Partial<Record<string, HookCallbackMatcher[]>> {\n // Map tool_use_id → span_id so start/end events share the same\n // span_id (required by exporters like Langfuse to correlate them).\n const tcSpanIds = new Map<string, string>();\n\n const onPreToolUse: HookCallback = async (input, toolUseId, _opts) => {\n const toolName = ((input as Record<string, unknown>).tool_name as string) ?? \"\";\n const toolInput = (input as Record<string, unknown>).tool_input;\n const tcId = toolUseId ?? generateId();\n const args =\n typeof toolInput === \"object\" && toolInput !== null\n ? (toolInput as Record<string, unknown>)\n : {};\n\n // Run intent through gate chain\n const intent = createEvent(\"agent.tool.intent\", {\n runId,\n traceId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n });\n\n const allowed = await this.emitIntent(intent);\n\n if (!allowed) {\n // Gate blocked — tell the SDK to deny this tool call\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: \"Blocked by gate\",\n },\n };\n }\n\n // Allowed — emit start event and remember its span_id\n const startEvent = createEvent(\"agent.tool.start\", {\n runId,\n traceId,\n parentSpanId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n });\n tcSpanIds.set(tcId, startEvent.spanId);\n await this.emit(startEvent);\n return {};\n };\n\n const onPostToolUse: HookCallback = async (input, toolUseId, _opts) => {\n const toolName = ((input as Record<string, unknown>).tool_name as string) ?? \"\";\n const toolInput = (input as Record<string, unknown>).tool_input;\n const toolResponse = (input as Record<string, unknown>).tool_response;\n const tcId = toolUseId ?? generateId();\n const args =\n typeof toolInput === \"object\" && toolInput !== null\n ? (toolInput as Record<string, unknown>)\n : {};\n\n // Reuse span_id from the matching start event so exporters\n // can correlate the pair.\n const spanId = tcSpanIds.get(tcId);\n tcSpanIds.delete(tcId);\n\n const endEvent = createEvent(\"agent.tool.end\", {\n runId,\n traceId,\n parentSpanId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n result: toolResponse,\n durationMs: 0,\n resultTokens: 0,\n ...(spanId ? { spanId } : {}),\n });\n await this.emit(endEvent);\n return {};\n };\n\n return {\n PreToolUse: [{ hooks: [onPreToolUse] }],\n PostToolUse: [{ hooks: [onPostToolUse] }],\n };\n }\n}\n","/**\n * SDK Bridge — converts framework capabilities to Claude Agent SDK MCP servers.\n *\n * Mirrors Python: agentic_patterns/core/systems/tools/sdk_bridge.py\n *\n * Each Capability becomes a named MCP server with tools derived from\n * the capability's Toolbox and optional Playbook. The runner wires these\n * servers into the SDK options so Claude Code can call them as\n * `mcp__{server}__{tool}`.\n */\n\nimport type { Capability, ToolSchema, Toolbox } from \"@agentic-patterns/core\";\nimport { createSdkMcpServer, tool as sdkTool } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ZodObject, ZodRawShape } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Zod shape extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the raw shape from a ZodTypeAny that is actually a ZodObject.\n * The SDK's tool() expects ZodRawShape (e.g. { query: z.string() }),\n * but our Toolbox stores ZodTypeAny. This safely extracts the shape.\n */\nfunction extractShape(schema: unknown): ZodRawShape {\n const obj = schema as ZodObject<ZodRawShape>;\n if (obj && typeof obj === \"object\" && \"shape\" in obj) {\n return obj.shape as ZodRawShape;\n }\n // Fallback: empty shape (tool takes no arguments)\n return {};\n}\n\n// ---------------------------------------------------------------------------\n// Toolbox → SDK MCP tools\n// ---------------------------------------------------------------------------\n\nfunction toolsFromToolbox(toolbox: Toolbox) {\n const sdkTools = [];\n for (const [name, def] of Object.entries(toolbox.tools)) {\n const shape = extractShape(def.parameters);\n sdkTools.push(\n sdkTool(name, def.description, shape, async (args: Record<string, unknown>) => {\n const result = await toolbox.execute(name, args);\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? \"\");\n const isError = typeof result === \"object\" && result !== null && \"error\" in result;\n return {\n content: [{ type: \"text\" as const, text }],\n ...(isError ? { isError: true } : {}),\n };\n }),\n );\n }\n return sdkTools;\n}\n\n// ---------------------------------------------------------------------------\n// Capability → server\n// ---------------------------------------------------------------------------\n\nfunction toSnake(name: string): string {\n return name\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/^_|_$/g, \"\")\n .toLowerCase();\n}\n\nexport function buildCapabilityServer(capability: Capability) {\n const serverName = toSnake(capability.name);\n const sdkTools = toolsFromToolbox(capability.toolbox);\n\n // Add playbook plays as SDK tools if present\n if (capability.playbook) {\n for (const [name, def] of Object.entries(capability.playbook.plays)) {\n const shape = extractShape(def.parameters);\n const playbook = capability.playbook;\n sdkTools.push(\n sdkTool(name, def.description, shape, async (args: Record<string, unknown>) => {\n const result = await playbook.execute(name, args);\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? \"\");\n const isError = typeof result === \"object\" && result !== null && \"error\" in result;\n return {\n content: [{ type: \"text\" as const, text }],\n ...(isError ? { isError: true } : {}),\n };\n }),\n );\n }\n }\n\n const serverConfig = createSdkMcpServer({\n name: serverName,\n tools: sdkTools,\n });\n\n const allowedTools = sdkTools.map((t: { name: string }) => `mcp__${serverName}__${t.name}`);\n return { serverName, serverConfig, allowedTools };\n}\n\n// ---------------------------------------------------------------------------\n// Agent → all servers\n// ---------------------------------------------------------------------------\n\nexport interface AgentLikeForBridge {\n readonly role: {\n readonly name: string;\n readonly capabilities: ReadonlyArray<Capability>;\n };\n getModel(): string;\n getTools(): ToolSchema[];\n getSystemPrompt(): string;\n renderInitialPrompt(): string;\n}\n\nexport function buildAgentServers(agent: AgentLikeForBridge) {\n const mcpServers: Record<string, unknown> = {};\n const allowedTools: string[] = [];\n\n for (const cap of agent.role.capabilities) {\n const { serverName, serverConfig, allowedTools: tools } = buildCapabilityServer(cap);\n mcpServers[serverName] = serverConfig;\n allowedTools.push(...tools);\n }\n\n return { mcpServers, allowedTools };\n}\n","/**\n * ClaudeCodeAPIRunner — Claude Agent SDK in plain-API mode.\n *\n * The agent runs through the Claude Code subprocess but in a sandboxed\n * configuration that strips everything CC-flavored:\n *\n * - System prompt: framework's, fully replacing CC's.\n * - Built-in tools (Read/Bash/Edit/...): disabled via `tools: []`.\n * - claude.ai connector MCP servers (Gmail/Calendar/Drive/...):\n * disabled by isolating CLAUDE_CONFIG_DIR to an ephemeral tmpdir.\n * - User/project settings, plugins, skills, hooks: not loaded\n * (settingSources defaults to []; new CLAUDE_CONFIG_DIR is empty).\n * - MCP servers from agent capabilities: still wired up.\n *\n * Auth: reads the Max-subscription OAuth token from the OS credential\n * store and injects it via `CLAUDE_CODE_OAUTH_TOKEN`. This bypasses\n * the binary's path-bound Keychain lookup (which would otherwise fail\n * when CLAUDE_CONFIG_DIR is redirected) while preserving Max-sub auth.\n *\n * Currently macOS-only — credential lookup uses the `security` CLI.\n * On other platforms, falls back to the parent ClaudeCodeRunner\n * behavior (auth works, connectors leak — see ClaudeCodeRunner docs).\n *\n * Mirrors Python: agentic_patterns/core/systems/runners/claude_api.py\n */\n\nimport { execSync } from \"node:child_process\";\nimport { mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { Options as SDKOptions } from \"@anthropic-ai/claude-agent-sdk\";\n\nimport { ClaudeCodeRunner, type ClaudeCodeRunnerOptions } from \"./claude-code-runner.js\";\nimport type { AgentLikeForBridge } from \"./sdk-bridge.js\";\nimport type { RunOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// OAuth loading\n// ---------------------------------------------------------------------------\n\ninterface OAuthCredential {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n subscriptionType?: string;\n}\n\n/**\n * Read the Max-subscription OAuth token from the OS credential store.\n * Returns null if unavailable (non-macOS, not logged in, etc.) — caller\n * falls back to letting the CC binary do its own auth lookup.\n */\nfunction loadMaxSubOAuth(): OAuthCredential | null {\n if (process.platform !== \"darwin\") return null;\n const user = process.env.USER;\n if (!user) return null;\n try {\n const raw = execSync(\n `security find-generic-password -a \"${user}\" -s \"Claude Code-credentials\" -w`,\n { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n const parsed = JSON.parse(raw) as { claudeAiOauth?: OAuthCredential };\n const oauth = parsed.claudeAiOauth;\n if (!oauth?.accessToken) return null;\n return oauth;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Runner\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeAPIRunnerOptions extends ClaudeCodeRunnerOptions {\n /**\n * Disable the OAuth-injection sandboxing path. When true, behaves\n * like a stripped ClaudeCodeRunner with `tools: []` only — auth and\n * connectors fall through to the binary's defaults.\n *\n * Useful for debugging or for environments where the OS credential\n * store is unavailable.\n */\n disableSandbox?: boolean;\n\n /**\n * Tool names or `mcp__<server>` server-prefixes to additionally\n * block via SDK `disallowedTools`. Rarely needed when sandboxing\n * is enabled (connectors are already stripped via config isolation).\n */\n extraDisallowedTools?: string[];\n}\n\n/**\n * Runner that uses the Claude Agent SDK as a plain Claude API call,\n * sandboxed away from the user's Claude Code environment.\n *\n * Drops in for AgentRunner — both implement RunnerProtocol identically.\n */\nexport class ClaudeCodeAPIRunner extends ClaudeCodeRunner {\n private readonly _disableSandbox: boolean;\n private readonly _extraDisallowed: readonly string[];\n private readonly _isolatedConfigDir: string | null;\n\n constructor(opts?: ClaudeCodeAPIRunnerOptions) {\n super(opts);\n this._disableSandbox = opts?.disableSandbox ?? false;\n this._extraDisallowed = opts?.extraDisallowedTools ?? [];\n this._isolatedConfigDir = this._disableSandbox\n ? null\n : mkdtempSync(join(tmpdir(), \"ap-cc-api-\"));\n }\n\n protected override _buildOptions(\n agent: AgentLikeForBridge,\n options: RunOptions | undefined,\n context: {\n runId: string;\n traceId: string;\n parentSpanId?: string;\n includePartialMessages?: boolean;\n },\n ): SDKOptions {\n const sdkOpts = super._buildOptions(agent, options, context);\n\n // Disable every built-in CC tool. MCP servers from agent capabilities\n // were already added by the parent and remain available.\n (sdkOpts as SDKOptions & { tools?: string[] }).tools = [];\n\n if (this._extraDisallowed.length > 0) {\n sdkOpts.disallowedTools = [\n ...(sdkOpts.disallowedTools ?? []),\n ...this._extraDisallowed,\n ];\n }\n\n // Sandbox: redirect CLAUDE_CONFIG_DIR + inject OAuth token via env.\n // Strips connectors, settings, plugins, skills, hooks — without\n // breaking Max-sub auth.\n if (!this._disableSandbox && this._isolatedConfigDir) {\n const oauth = loadMaxSubOAuth();\n if (oauth) {\n const baseEnv: Record<string, string> = Object.fromEntries(\n Object.entries(process.env).filter(([, v]) => typeof v === \"string\") as [string, string][],\n );\n sdkOpts.env = {\n ...baseEnv,\n ...(sdkOpts.env ?? {}),\n CLAUDE_CONFIG_DIR: this._isolatedConfigDir,\n CLAUDE_CODE_OAUTH_TOKEN: oauth.accessToken,\n };\n }\n // If oauth load failed (non-macOS, not logged in), fall through\n // to the parent's behavior — auth still works, connectors leak.\n }\n\n return sdkOpts;\n }\n}\n","/**\n * MockRunner — Deterministic runner for testing agents without LLM calls.\n *\n * Pattern-based response routing with tool call simulation and event emission.\n * Implements RunnerProtocol for drop-in testing.\n */\n\nimport { generateId } from \"ai\";\n\nimport type { AgentEvent } from \"../events/types.js\";\nimport { createEvent } from \"../events/types.js\";\nimport type { AgentLike, RunOptions, RunResult, RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A canned response for the mock runner. */\nexport interface MockResponse {\n content: string;\n toolCalls?: Array<{\n name: string;\n arguments: Record<string, unknown>;\n result?: unknown;\n }>;\n inputTokens?: number;\n outputTokens?: number;\n delayMs?: number;\n error?: Error;\n}\n\n/** A recorded call to the mock runner. */\nexport interface MockCall {\n message: string;\n agentName: string;\n model: string;\n timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// MockRunner\n// ---------------------------------------------------------------------------\n\n/**\n * Deterministic runner for testing agents without LLM calls.\n *\n * Supports substring-based trigger matching, wildcard defaults,\n * tool call simulation, delay simulation, and full event lifecycle.\n *\n * Example:\n * const runner = new MockRunner()\n * .addResponse(\"hello\", { content: \"Hi there!\" })\n * .addResponse(\"*\", { content: \"Default response\" });\n */\nexport class MockRunner implements RunnerProtocol {\n private _responses: Array<{ trigger: string; response: MockResponse }> = [];\n private _callHistory: MockCall[] = [];\n\n /** Read-only call history. */\n get callHistory(): readonly MockCall[] {\n return this._callHistory;\n }\n\n /**\n * Add a canned response.\n *\n * @param trigger - Substring to match against the message, or \"*\" for wildcard default.\n * @param response - The response to return when triggered.\n * @returns this for fluent chaining.\n */\n addResponse(trigger: string, response: MockResponse): this {\n this._responses.push({ trigger, response });\n return this;\n }\n\n /**\n * Clear all responses and call history.\n *\n * @returns this for fluent chaining.\n */\n clear(): this {\n this._responses = [];\n this._callHistory = [];\n return this;\n }\n\n /**\n * Execute an agent and return a result (non-streaming).\n */\n async run(agent: AgentLike, message: string, options?: RunOptions): Promise<RunResult> {\n const matched = this._findResponse(message);\n\n this._callHistory.push({\n message,\n agentName: agent.role.name,\n model: agent.getModel(),\n timestamp: new Date(),\n });\n\n if (matched.delayMs && matched.delayMs > 0) {\n await delay(matched.delayMs);\n }\n\n if (matched.error) {\n throw matched.error;\n }\n\n let toolCallsCount = 0;\n if (matched.toolCalls) {\n if (options?.toolExecutor) {\n for (const tc of matched.toolCalls) {\n await options.toolExecutor.execute(tc.name, tc.arguments);\n toolCallsCount++;\n }\n } else {\n toolCallsCount = matched.toolCalls.length;\n }\n }\n\n return {\n response: matched.content,\n inputTokens: matched.inputTokens ?? 0,\n outputTokens: matched.outputTokens ?? 0,\n toolCallsCount,\n iterations: 1,\n finishReason: \"stop\",\n };\n }\n\n /**\n * Execute an agent with streaming event emission.\n */\n async *stream(\n agent: AgentLike,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n const traceId = options?.traceId ?? generateId();\n const runId = generateId();\n\n yield createEvent(\"agent.message.start\", {\n traceId,\n runId,\n agentName: agent.role.name,\n });\n\n const matched = this._findResponse(message);\n\n this._callHistory.push({\n message,\n agentName: agent.role.name,\n model: agent.getModel(),\n timestamp: new Date(),\n });\n\n if (matched.delayMs && matched.delayMs > 0) {\n await delay(matched.delayMs);\n }\n\n if (matched.error) {\n yield createEvent(\"agent.error\", {\n traceId,\n runId,\n errorType: matched.error.name,\n message: matched.error.message,\n recoverable: false,\n context: {},\n });\n return;\n }\n\n if (matched.toolCalls) {\n for (const tc of matched.toolCalls) {\n const toolCallId = generateId();\n yield createEvent(\"agent.tool.start\", {\n traceId,\n runId,\n toolCallId,\n toolName: tc.name,\n arguments: tc.arguments,\n });\n\n let result: unknown = tc.result ?? null;\n let error: string | undefined;\n if (options?.toolExecutor) {\n try {\n result = await options.toolExecutor.execute(tc.name, tc.arguments);\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n }\n\n yield createEvent(\"agent.tool.end\", {\n traceId,\n runId,\n toolCallId,\n toolName: tc.name,\n arguments: tc.arguments,\n result,\n error,\n durationMs: 0,\n resultTokens: 0,\n });\n }\n }\n\n yield createEvent(\"agent.message.chunk\", {\n traceId,\n runId,\n delta: matched.content,\n chunkIndex: 0,\n });\n\n yield createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n content: matched.content,\n inputTokens: matched.inputTokens ?? 0,\n outputTokens: matched.outputTokens ?? 0,\n model: agent.getModel(),\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n /** Find matching response: substring first, then wildcard, then auto-fallback. */\n private _findResponse(message: string): MockResponse {\n for (const entry of this._responses) {\n if (entry.trigger !== \"*\" && message.includes(entry.trigger)) {\n return entry.response;\n }\n }\n for (const entry of this._responses) {\n if (entry.trigger === \"*\") {\n return entry.response;\n }\n }\n return { content: `Mock response to: ${message}` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * ToolboxExecutor — adapts an agent's Capability toolboxes into the\n * ToolExecutor interface that AgentRunner needs to actually execute\n * tool calls.\n *\n * Without this, AgentRunner can FORMAT tool schemas for the LLM but\n * can't EXECUTE them — tool calls silently return\n * \"No tool executor configured\".\n */\n\nimport type { ToolExecutor } from \"./types.js\";\n\n/** Minimal shape — matches what Agent.role.capabilities[].toolbox exposes. */\ninterface ToolboxLike {\n readonly name: string;\n execute(name: string, args: unknown): Promise<unknown>;\n readonly tools: Record<string, { execute: (args: Record<string, unknown>) => Promise<unknown> }>;\n}\n\n/** Minimal shape — matches what Agent.role.capabilities[] exposes. */\ninterface CapabilityLike {\n readonly toolbox: ToolboxLike;\n}\n\n/** Minimal shape — matches what Agent.role exposes. */\ninterface AgentWithCapabilities {\n readonly role: {\n readonly name: string;\n readonly capabilities?: readonly CapabilityLike[];\n };\n}\n\n/**\n * Build a `ToolExecutor` from an agent's capability toolboxes.\n *\n * Iterates the agent's capabilities, indexes every tool by name, and\n * dispatches `execute(name, args)` to the owning toolbox. Handles the\n * `mcp__<toolbox>__<tool>` naming convention that MCP-bridged tools use.\n */\nexport function createToolboxExecutor(agent: AgentWithCapabilities): ToolExecutor {\n // Build a lookup: toolName → toolbox.execute\n const lookup = new Map<string, ToolboxLike>();\n const capabilities = agent.role.capabilities ?? [];\n\n for (const cap of capabilities) {\n const tb = cap.toolbox;\n for (const toolName of Object.keys(tb.tools)) {\n // Register under plain name\n lookup.set(toolName, tb);\n // Also register under MCP-prefixed name (mcp__<toolbox>__<tool>)\n lookup.set(`mcp__${tb.name}__${toolName}`, tb);\n }\n }\n\n return {\n async execute(name: string, args: Record<string, unknown>): Promise<unknown> {\n // Try exact match first\n const tb = lookup.get(name);\n if (tb) {\n // Strip MCP prefix to get the actual tool name the toolbox expects\n const actualName = name.includes(\"__\") ? name.split(\"__\").pop()! : name;\n return tb.execute(actualName, args);\n }\n throw new Error(`Tool \"${name}\" not found. Available: ${[...lookup.keys()].join(\", \")}`);\n },\n };\n}\n","/**\n * `createRunner()` — zero-config runner factory.\n *\n * Selection priority (first match wins):\n * 1. options.runner → use it verbatim\n * 2. options.model (LanguageModelV1) → new AgentRunner(model)\n * 3. options.provider + tier/modelId → new AgentRunner(provider.load(...))\n * 4. env vars (in PROVIDER_PRIORITY order) → new AgentRunner(...)\n * 5. claude CLI on PATH → new ClaudeCodeAPIRunner() (fallback, limited events)\n * 6. options.fallbackToMock === true → new MockRunner()\n * 7. throw\n *\n * See docs/runners.md (§4) for the design doc.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { LanguageModelV1 } from \"ai\";\n\nimport type { AgentEventBus } from \"../events/agent-event-bus.js\";\nimport {\n PROVIDERS,\n PROVIDER_PRIORITY,\n type ProviderProtocol,\n type ProviderTier,\n type SupportedProvider,\n resolveModelId,\n} from \"../providers/index.js\";\nimport { AgentRunner } from \"./agent-runner.js\";\nimport { ClaudeCodeAPIRunner } from \"./claude-code-api-runner.js\";\nimport { MockRunner } from \"./mock-runner.js\";\nimport type { RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface CreateRunnerOptions {\n /**\n * Explicit runner instance. Wins over everything else — useful for\n * tests (`runner: new MockRunner()`) or bespoke setups.\n */\n runner?: RunnerProtocol;\n /**\n * Explicit provider. Overrides env-based detection. Requires the\n * corresponding `@ai-sdk/*` package to be installed.\n */\n provider?: SupportedProvider;\n /**\n * Explicit model id. Falls through to the provider's tier default.\n * Ignored if `runner` or `model` is set.\n *\n * When omitted, `process.env.AGENT_MODEL` is read as a default — this\n * is the only way to pin an exact model from a `.env` file (e.g.\n * `AGENT_MODEL=qwen3.6:27b` to use a model the framework's tier map\n * doesn't list).\n */\n modelId?: string;\n /**\n * Cross-provider tier selector — \"opus\" | \"sonnet\" | \"haiku\". Resolved\n * via each `ProviderProtocol.tiers` map. Default: \"sonnet\".\n * Ignored if `modelId` is set.\n *\n * When omitted, `process.env.AGENT_TIER` is read as a default. Invalid\n * values are silently ignored (fall through to the \"sonnet\" default).\n */\n tier?: ProviderTier;\n /**\n * Pre-constructed `LanguageModelV1`. Short-circuits provider resolution;\n * the factory wraps it in `AgentRunner`.\n */\n model?: LanguageModelV1;\n /** Optional event bus. Passed through to the constructed runner. */\n eventBus?: AgentEventBus;\n /** Log the selection decision to console. Defaults to true. */\n verbose?: boolean;\n /**\n * If no runnable configuration is found, fall back to `MockRunner`\n * instead of throwing. Defaults to false.\n */\n fallbackToMock?: boolean;\n}\n\nexport type RunnerSource =\n | \"explicit-runner\"\n | \"explicit-model\"\n | \"explicit-provider\"\n | `env-${SupportedProvider}`\n | \"claude-cli\"\n | \"mock-fallback\";\n\nexport interface RunnerSelection {\n runner: RunnerProtocol;\n /** Human-readable explanation, e.g. `\"using anthropic (env ANTHROPIC_API_KEY)\"`. */\n reason: string;\n /** Which branch of the priority tree fired. */\n source: RunnerSource;\n}\n\n/**\n * Construct a runner from explicit opts / env vars / Claude CLI presence.\n * Returns the runner plus metadata about why it was chosen.\n */\nexport async function createRunner(opts: CreateRunnerOptions = {}): Promise<RunnerSelection> {\n const verbose = opts.verbose ?? true;\n\n // Env-driven defaults applied to provider resolution. AGENT_MODEL pins\n // an exact model id (wins over tier, matching resolveModelId's\n // explicit-modelId-over-tier rule); AGENT_TIER picks one of the three\n // cross-provider tier slots. Both are ignored when `runner` / `model`\n // short-circuit provider resolution.\n const tier = opts.tier ?? envTier();\n const modelId = opts.modelId ?? process.env.AGENT_MODEL;\n\n // 1. Explicit runner wins.\n if (opts.runner) {\n return log(verbose, {\n runner: opts.runner,\n reason: \"using caller-provided runner\",\n source: \"explicit-runner\",\n });\n }\n\n // 2. Explicit LanguageModelV1 → AgentRunner.\n if (opts.model) {\n return log(verbose, {\n runner: new AgentRunner(opts.model, opts.eventBus),\n reason: \"using caller-provided LanguageModelV1 via AgentRunner\",\n source: \"explicit-model\",\n });\n }\n\n // 3. Explicit provider.\n if (opts.provider) {\n const provider = PROVIDERS[opts.provider];\n const resolved = resolveModelId(provider, modelId, tier);\n const model = await provider.load(resolved);\n return log(verbose, {\n runner: new AgentRunner(model, opts.eventBus),\n reason: `using ${opts.provider} (explicit, model=${resolved})`,\n source: \"explicit-provider\",\n });\n }\n\n // 4. Env-based auto-detection, in PROVIDER_PRIORITY order.\n for (const name of PROVIDER_PRIORITY) {\n const provider = PROVIDERS[name];\n const matchedEnv = provider.envVars.find((v) => process.env[v]);\n if (matchedEnv) {\n const resolved = resolveModelId(provider, modelId, tier);\n const model = await provider.load(resolved);\n return log(verbose, {\n runner: new AgentRunner(model, opts.eventBus),\n reason: `using ${name} (env ${matchedEnv}, model=${resolved})`,\n source: `env-${name}` as RunnerSource,\n });\n }\n }\n\n // 5. Claude CLI probe.\n if (await hasClaudeCli()) {\n const runner = new ClaudeCodeAPIRunner({\n eventBus: opts.eventBus,\n defaults: { tools: [] },\n });\n return log(verbose, {\n runner,\n reason:\n \"using ClaudeCodeAPIRunner (claude CLI on PATH) — limited event vocabulary; set ANTHROPIC_API_KEY for AgentRunner with full events\",\n source: \"claude-cli\",\n });\n }\n\n // 6. Mock fallback (opt-in).\n if (opts.fallbackToMock) {\n return log(verbose, {\n runner: new MockRunner(),\n reason: \"no runnable configuration — falling back to MockRunner (fallbackToMock=true)\",\n source: \"mock-fallback\",\n });\n }\n\n // 7. Throw.\n throw new Error(\n [\n \"createRunner: no runnable configuration found.\",\n \"Provide one of:\",\n \" • options.runner (a RunnerProtocol instance)\",\n \" • options.model (a LanguageModelV1)\",\n \" • options.provider + the matching @ai-sdk/* package installed\",\n \" • an env var: ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,\",\n \" GROQ_API_KEY, MISTRAL_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY,\",\n \" OPENROUTER_API_KEY, or OLLAMA_HOST\",\n \" • `claude` CLI on PATH (Claude Max login or ANTHROPIC_API_KEY)\",\n \" • options.fallbackToMock = true\",\n ].join(\"\\n\"),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Read AGENT_TIER from env and validate. Mistyped values (e.g. \"sonnet \")\n * fall through to undefined so the downstream default kicks in instead\n * of indexing the tier map with garbage.\n */\nfunction envTier(): ProviderTier | undefined {\n const v = process.env.AGENT_TIER;\n return v === \"opus\" || v === \"sonnet\" || v === \"haiku\" ? v : undefined;\n}\n\nfunction log(verbose: boolean, selection: RunnerSelection): RunnerSelection {\n if (verbose) {\n process.stdout.write(`[runner] ${selection.reason}\\n`);\n }\n return selection;\n}\n\n/**\n * Probe whether `claude` is on PATH. Returns false on any error (not\n * installed, timeout, crashed). Cached for the process lifetime to keep\n * repeated `createRunner()` calls cheap.\n */\nlet _claudeCliCache: boolean | undefined;\nasync function hasClaudeCli(): Promise<boolean> {\n if (_claudeCliCache !== undefined) return _claudeCliCache;\n _claudeCliCache = await new Promise<boolean>((resolve) => {\n const child = spawn(\"claude\", [\"--version\"], {\n stdio: \"ignore\",\n // shell: true handles Windows `.cmd` extension and generally behaves\n // for \"is this command on PATH\" probes.\n shell: process.platform === \"win32\",\n });\n const timer = setTimeout(() => {\n child.kill();\n resolve(false);\n }, 2000);\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n resolve(code === 0);\n });\n child.on(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n return _claudeCliCache;\n}\n\n/** @internal — tests use this to reset the CLI-probe cache between runs. */\nexport function _resetClaudeCliCache(): void {\n _claudeCliCache = undefined;\n}\n\n/**\n * Utility consumed by tests: returns the active provider's adapter if any.\n * Kept `@internal` so we don't stamp it as a public API.\n *\n * @internal\n */\nexport function _getProviderByName(name: SupportedProvider): ProviderProtocol {\n return PROVIDERS[name];\n}\n","/**\n * Provider adapter protocol.\n *\n * A `ProviderProtocol` describes one LLM provider in three axes:\n * • which env vars indicate the provider is available\n * • a cross-provider tier map (opus / sonnet / haiku) giving default\n * model ids at each quality/cost rung\n * • a `load(modelId)` method that dynamically imports the provider\n * package and returns a Vercel AI SDK `LanguageModelV1`\n *\n * Adding a provider = dropping one file under `providers/`. No conditionals\n * to grow — `createRunner()` reads the registry in `providers/index.ts`.\n */\n\nimport type { LanguageModelV1 } from \"ai\";\n\n/** Supported provider identifiers. Matches directory / file names below. */\nexport type SupportedProvider =\n | \"anthropic\"\n | \"openai\"\n | \"google\"\n | \"groq\"\n | \"mistral\"\n | \"xai\"\n | \"deepseek\"\n | \"openrouter\"\n | \"ollama\";\n\n/**\n * Cross-provider tier selector.\n *\n * opus — most capable / expensive / slowest\n * sonnet — balanced default\n * haiku — fastest / cheapest / smallest\n *\n * Agents written against tiers stay portable across providers and hardware.\n */\nexport type ProviderTier = \"opus\" | \"sonnet\" | \"haiku\";\n\n/** Per-provider adapter. One constant per provider file. */\nexport interface ProviderProtocol {\n readonly name: SupportedProvider;\n /** Default model id for each tier. */\n readonly tiers: Readonly<Record<ProviderTier, string>>;\n /**\n * Env variables whose presence indicates this provider is usable.\n * First-matched-first-wins during `createRunner()` auto-detection.\n */\n readonly envVars: readonly string[];\n /**\n * Dynamically import the provider's `@ai-sdk/*` (or equivalent) package\n * and return a `LanguageModelV1` for the given model id. Throws a helpful\n * error if the package isn't installed.\n */\n load(modelId: string): Promise<LanguageModelV1>;\n}\n\n// ---------------------------------------------------------------------------\n// Dynamic import helper\n// ---------------------------------------------------------------------------\n\n/**\n * Dynamically import a provider package. If it's not installed, throw an\n * error that tells the caller how to fix it.\n */\n// biome-ignore lint/suspicious/noExplicitAny: imported module shape is opaque\nexport async function importProvider(pkg: string, provider: string): Promise<any> {\n try {\n return await import(/* @vite-ignore */ pkg);\n } catch (e) {\n throw new Error(\n `createRunner: provider \"${provider}\" requires \"${pkg}\" to be installed. ` +\n `Run: pnpm add ${pkg}`,\n { cause: e },\n );\n }\n}\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const anthropicProvider: ProviderProtocol = {\n name: \"anthropic\",\n tiers: {\n opus: \"claude-opus-4-5\",\n sonnet: \"claude-sonnet-4-5\",\n haiku: \"claude-haiku-4-5\",\n },\n envVars: [\"ANTHROPIC_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/anthropic\", \"anthropic\");\n return mod.anthropic(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const openaiProvider: ProviderProtocol = {\n name: \"openai\",\n tiers: {\n opus: \"gpt-4.1\",\n sonnet: \"gpt-4o\",\n haiku: \"gpt-4o-mini\",\n },\n envVars: [\"OPENAI_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/openai\", \"openai\");\n return mod.openai(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const googleProvider: ProviderProtocol = {\n name: \"google\",\n tiers: {\n opus: \"gemini-2.5-pro\",\n sonnet: \"gemini-2.5-flash\",\n haiku: \"gemini-2.5-flash-lite\",\n },\n envVars: [\"GOOGLE_GENERATIVE_AI_API_KEY\", \"GOOGLE_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/google\", \"google\");\n return mod.google(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const groqProvider: ProviderProtocol = {\n name: \"groq\",\n tiers: {\n opus: \"llama-3.3-70b-versatile\",\n sonnet: \"llama-3.1-70b-versatile\",\n haiku: \"llama-3.1-8b-instant\",\n },\n envVars: [\"GROQ_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/groq\", \"groq\");\n return mod.groq(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const mistralProvider: ProviderProtocol = {\n name: \"mistral\",\n tiers: {\n opus: \"mistral-large-latest\",\n sonnet: \"mistral-medium-latest\",\n haiku: \"mistral-small-latest\",\n },\n envVars: [\"MISTRAL_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/mistral\", \"mistral\");\n return mod.mistral(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const xaiProvider: ProviderProtocol = {\n name: \"xai\",\n tiers: {\n opus: \"grok-4\",\n sonnet: \"grok-3\",\n haiku: \"grok-3-mini\",\n },\n envVars: [\"XAI_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/xai\", \"xai\");\n return mod.xai(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const deepseekProvider: ProviderProtocol = {\n name: \"deepseek\",\n tiers: {\n opus: \"deepseek-reasoner\",\n sonnet: \"deepseek-chat\",\n // DeepSeek has no dedicated small-fast model today; reuse chat.\n haiku: \"deepseek-chat\",\n },\n envVars: [\"DEEPSEEK_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/deepseek\", \"deepseek\");\n return mod.deepseek(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\n/**\n * OpenRouter gateways 150+ models across every major provider. Our tier\n * defaults route to Claude (repo's center of gravity); callers who want\n * a non-Claude default pass `modelId` explicitly (e.g. \"meta-llama/llama-3.3-70b\").\n */\nexport const openrouterProvider: ProviderProtocol = {\n name: \"openrouter\",\n tiers: {\n opus: \"anthropic/claude-opus-4-5\",\n sonnet: \"anthropic/claude-sonnet-4-5\",\n haiku: \"anthropic/claude-haiku-4-5\",\n },\n envVars: [\"OPENROUTER_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@openrouter/ai-sdk-provider\", \"openrouter\");\n return mod.openrouter(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\n/**\n * Ollama — local-only OSS models via HTTP.\n *\n * Default tier map uses the Qwen3 family because Qwen's team explicitly\n * prioritizes tool-calling and keeps the same grammar across sizes — so\n * agents scale between haiku↔sonnet↔opus without prompt changes.\n *\n * Sized for 16GB-class consumer GPUs (tested on 4080 Super):\n * opus (30B MoE, activates 3B/token) — ~14 GB VRAM, 50–80 tok/s\n * sonnet (14B dense) — ~9 GB VRAM, 30–50 tok/s\n * haiku (4B dense) — ~3 GB VRAM, 100+ tok/s\n *\n * Override with `options.modelId` if you want a different family.\n */\nexport const ollamaProvider: ProviderProtocol = {\n name: \"ollama\",\n tiers: {\n opus: \"qwen3:30b-a3b\",\n sonnet: \"qwen3:14b\",\n haiku: \"qwen3:4b\",\n },\n envVars: [\"OLLAMA_HOST\"],\n async load(modelId) {\n const mod = await importProvider(\"ollama-ai-provider\", \"ollama\");\n // ollama-ai-provider doesn't read OLLAMA_HOST from env — pass it\n // explicitly so remote GPU boxes (e.g. behind a VPN) work out of\n // the box when the user sets the env var.\n const host = process.env.OLLAMA_HOST;\n // simulateStreaming: use the reliable non-streaming API (which\n // correctly returns tool_calls) wrapped in a stream interface.\n // Real streaming silently drops tool calls for many models.\n const settings = { simulateStreaming: true };\n if (host) {\n const baseURL = `${host.replace(/\\/$/, \"\")}/api`;\n const provider = mod.createOllama({ baseURL });\n return provider(modelId, settings);\n }\n return mod.ollama(modelId, settings);\n },\n};\n","/**\n * Claude Code LanguageModelV1 provider.\n *\n * Wraps the Claude Agent SDK's `query()` function in a Vercel AI SDK\n * `LanguageModelV1` so agents can be executed through `AgentRunner` using\n * a Claude Max subscription (OAuth cached in ~/.claude) or an\n * `ANTHROPIC_API_KEY` env var picked up by the SDK itself.\n *\n * Unlike `ClaudeCodeRunner` / `ClaudeCodeAPIRunner`, this provider plugs\n * into the *standard* AgentRunner execution loop. That means the full\n * canonical event vocabulary (`iteration.start`, `llm.start`, `tool.*`,\n * `iteration.end`, `llm.end`, …) fires automatically — closing the\n * observability gap those runners have.\n *\n * Each `doGenerate` / `doStream` call runs a fresh single-turn SDK query:\n *\n * 1. System prompt + conversation history (including prior tool\n * use / tool result parts) is flattened to a string prompt.\n * 2. Tool schemas are registered as MCP tools on an in-process server.\n * 3. `canUseTool` intercepts tool invocations, records them, and denies\n * with `interrupt: true` so the SDK stops immediately. The recorded\n * tool calls are surfaced in the LanguageModelV1 response as\n * `toolCalls`.\n * 4. SDK assistant / result messages are translated back to\n * LanguageModelV1 output shape (`text`, `toolCalls`, `finishReason`,\n * `usage`).\n * 5. Claude-Code-native tools (Read/Write/Edit/Bash/…) are disallowed so\n * only framework tools flow.\n */\n\nimport {\n type McpSdkServerConfigWithInstance,\n type PermissionResult,\n type Options as SDKOptions,\n createSdkMcpServer,\n query,\n tool as sdkTool,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n LanguageModelV1Prompt,\n LanguageModelV1StreamPart,\n} from \"ai\";\nimport type { z } from \"zod\";\n\n// Types not re-exported from \"ai\"; derive from the SDK's public shape.\ntype DoGenerateResult = Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>;\ntype LanguageModelV1FinishReason = DoGenerateResult[\"finishReason\"];\ntype LanguageModelV1FunctionToolCall = NonNullable<DoGenerateResult[\"toolCalls\"]>[number];\ntype RegularMode = Extract<LanguageModelV1CallOptions[\"mode\"], { type: \"regular\" }>;\ntype RegularTool = NonNullable<RegularMode[\"tools\"]>[number];\ntype LanguageModelV1FunctionTool = Extract<RegularTool, { type: \"function\" }>;\n\n// ---------------------------------------------------------------------------\n// Model name mapping\n// ---------------------------------------------------------------------------\n\nconst MODEL_MAP: Record<string, string> = {\n opus: \"opus\",\n sonnet: \"sonnet\",\n haiku: \"haiku\",\n};\n\nfunction mapModel(modelName: string): string | undefined {\n const lower = modelName.toLowerCase();\n for (const [key, value] of Object.entries(MODEL_MAP)) {\n if (lower.includes(key)) return value;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Tools blocked in \"API mode\" — only framework tools flow\n// ---------------------------------------------------------------------------\n\nconst BLOCKED_BUILTIN_TOOLS: readonly string[] = [\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"Glob\",\n \"Grep\",\n \"Agent\",\n \"NotebookEdit\",\n \"TodoRead\",\n \"TodoWrite\",\n \"WebFetch\",\n \"WebSearch\",\n];\n\n// ---------------------------------------------------------------------------\n// Provider options\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeProviderOptions {\n /** Defaults merged with every SDK query call. */\n defaults?: Partial<SDKOptions>;\n /** Include Claude Code's built-in tools (Read/Write/Bash/…). Default: false. */\n allowBuiltinTools?: boolean;\n /**\n * Max turns inside the SDK loop. Default: 10.\n *\n * Within one `doGenerate`, Claude may emit prose-only on its first turn\n * and produce a tool call on a later turn. `canUseTool` aborts on the\n * first tool call regardless, so this only needs to be generous enough\n * to allow \"plan-then-tool\" sequences. A too-low value causes the SDK\n * to throw `Reached maximum number of turns` before Claude reaches any\n * tool call.\n */\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Prompt flattening\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the single system prompt from a LanguageModelV1 message array.\n *\n * LanguageModelV1Prompt only ever contains one leading system message (if\n * any) — the AI SDK normalizes `generateText({ system, messages })` into\n * a prompt that starts with `{ role: 'system' }`.\n */\nfunction extractSystemPrompt(prompt: LanguageModelV1Prompt): string | undefined {\n const first = prompt[0];\n if (first && first.role === \"system\") return first.content;\n return undefined;\n}\n\n/** Stringify any JSON-ish value for embedding in a text prompt. */\nfunction stringifyValue(v: unknown): string {\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\n/**\n * Render non-system conversation messages into a single user-facing prompt\n * string. Tool call / tool result parts are rendered inline as tagged\n * blocks so Claude understands the history without requiring SDK session\n * resume support.\n */\nfunction renderConversation(prompt: LanguageModelV1Prompt): string {\n const parts: string[] = [];\n\n for (const msg of prompt) {\n if (msg.role === \"user\") {\n const text = renderUserContent(msg);\n if (text) parts.push(text);\n } else if (msg.role === \"assistant\") {\n const text = renderAssistantContent(msg);\n if (text) parts.push(`Assistant: ${text}`);\n } else if (msg.role === \"tool\") {\n const text = renderToolContent(msg);\n if (text) parts.push(text);\n }\n // system is handled separately via extractSystemPrompt\n }\n\n return parts.join(\"\\n\\n\");\n}\n\ntype PromptMessage = LanguageModelV1Prompt[number];\n\nfunction renderUserContent(msg: Extract<PromptMessage, { role: \"user\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") chunks.push(part.text);\n // Image / file parts are dropped — Claude Agent SDK prompt string\n // cannot carry them losslessly without session APIs.\n }\n return chunks.join(\"\\n\");\n}\n\nfunction renderAssistantContent(msg: Extract<PromptMessage, { role: \"assistant\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n chunks.push(part.text);\n } else if (part.type === \"tool-call\") {\n chunks.push(\n `[tool-call name=${part.toolName} id=${part.toolCallId}] ${stringifyValue(part.args)}`,\n );\n }\n }\n return chunks.join(\"\\n\");\n}\n\nfunction renderToolContent(msg: Extract<PromptMessage, { role: \"tool\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n chunks.push(\n `[tool-result name=${part.toolName} id=${part.toolCallId}] ${stringifyValue(part.result)}`,\n );\n }\n return chunks.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Tools → MCP server\n// ---------------------------------------------------------------------------\n\nconst FRAMEWORK_SERVER = \"agent_runner_tools\";\n\n/**\n * Build an in-process MCP server that exposes each LanguageModelV1 function\n * tool. The handlers never actually execute — `canUseTool` intercepts first\n * and aborts. They're still installed so Claude sees real tool schemas.\n */\nfunction buildToolsServer(tools: ReadonlyArray<LanguageModelV1FunctionTool>):\n | {\n server: McpSdkServerConfigWithInstance;\n allowedTools: string[];\n }\n | undefined {\n if (tools.length === 0) return undefined;\n\n const sdkTools = tools.map((t) =>\n // We pass an empty Zod shape — Claude will still see the tool name +\n // description and `canUseTool` records the actual call arguments.\n sdkTool(t.name, t.description ?? \"\", {} as Record<string, z.ZodTypeAny>, async () => {\n // Never reached — canUseTool aborts before handler runs.\n return {\n content: [{ type: \"text\" as const, text: \"__AGENT_RUNNER_INTERCEPTED__\" }],\n };\n }),\n );\n\n const server = createSdkMcpServer({\n name: FRAMEWORK_SERVER,\n tools: sdkTools,\n });\n\n const allowedTools = sdkTools.map((t: { name: string }) => `mcp__${FRAMEWORK_SERVER}__${t.name}`);\n\n return { server, allowedTools };\n}\n\n/**\n * Resolve `mcp__server__tool` back to the original tool name Claude was\n * offered. For framework tools we strip the `mcp__agent_runner_tools__`\n * prefix so `LanguageModelV1` consumers see the original tool names.\n */\nfunction normalizeToolName(sdkToolName: string): string {\n const prefix = `mcp__${FRAMEWORK_SERVER}__`;\n if (sdkToolName.startsWith(prefix)) return sdkToolName.slice(prefix.length);\n return sdkToolName;\n}\n\n// ---------------------------------------------------------------------------\n// ClaudeCodeLanguageModel\n// ---------------------------------------------------------------------------\n\ninterface PendingToolCall {\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: Record<string, unknown>;\n}\n\nexport class ClaudeCodeLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = \"v1\" as const;\n readonly provider = \"claude-code\";\n readonly modelId: string;\n readonly defaultObjectGenerationMode = \"tool\" as const;\n\n private readonly _opts: ClaudeCodeProviderOptions;\n\n constructor(modelId: string, opts: ClaudeCodeProviderOptions = {}) {\n this.modelId = modelId;\n this._opts = opts;\n }\n\n // -------------------------------------------------------------------------\n // doGenerate\n // -------------------------------------------------------------------------\n\n doGenerate(options: LanguageModelV1CallOptions): ReturnType<LanguageModelV1[\"doGenerate\"]> {\n return this._doGenerate(options);\n }\n\n private async _doGenerate(\n options: LanguageModelV1CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>> {\n const { systemPrompt, promptString, sdkOptions, captured } = this._prepare(options);\n\n const textParts: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let sdkStopReason: string | null = null;\n\n try {\n for await (const msg of query({\n prompt: promptString,\n options: { ...sdkOptions, systemPrompt },\n })) {\n if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\n block &&\n typeof block === \"object\" &&\n \"text\" in block &&\n typeof block.text === \"string\"\n ) {\n textParts.push(block.text);\n }\n }\n }\n } else if (msg.type === \"result\") {\n const m = msg as Record<string, unknown>;\n const usage = m.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (typeof m.stop_reason === \"string\") {\n sdkStopReason = m.stop_reason;\n }\n }\n }\n } catch (err) {\n // `canUseTool` may throw `AbortError` when we interrupt. If we have\n // captured tool calls, that's a successful short-circuit — fall\n // through. Otherwise rethrow.\n if (captured.toolCalls.length === 0) throw err;\n }\n\n const text = textParts.join(\"\");\n const toolCalls: LanguageModelV1FunctionToolCall[] = captured.toolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: JSON.stringify(tc.args),\n }));\n\n const finishReason = deriveFinishReason({\n hasToolCalls: toolCalls.length > 0,\n sdkStopReason,\n });\n\n return {\n text,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n finishReason,\n usage: { promptTokens: inputTokens, completionTokens: outputTokens },\n rawCall: {\n rawPrompt: promptString,\n rawSettings: { systemPrompt, model: sdkOptions.model ?? this.modelId },\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // doStream\n // -------------------------------------------------------------------------\n\n doStream(options: LanguageModelV1CallOptions): ReturnType<LanguageModelV1[\"doStream\"]> {\n return this._doStream(options);\n }\n\n private async _doStream(\n options: LanguageModelV1CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doStream\"]>>> {\n const { systemPrompt, promptString, sdkOptions, captured } = this._prepare(options);\n\n const stream = new ReadableStream<LanguageModelV1StreamPart>({\n start: async (controller) => {\n let inputTokens = 0;\n let outputTokens = 0;\n let sdkStopReason: string | null = null;\n const emittedTextChunks = new Set<number>();\n const textBuffer: string[] = [];\n\n try {\n for await (const msg of query({\n prompt: promptString,\n options: { ...sdkOptions, systemPrompt, includePartialMessages: true },\n })) {\n const msgType = (msg as { type?: string }).type;\n if (msgType === \"stream_event\" && \"event\" in msg) {\n const maybe = msg as { event?: { delta?: { text?: string } } };\n const delta = maybe.event?.delta?.text;\n if (delta) {\n textBuffer.push(delta);\n controller.enqueue({ type: \"text-delta\", textDelta: delta });\n }\n } else if (msgType === \"assistant\" && \"message\" in msg) {\n const content = (msg as { message?: { content?: unknown[] } }).message?.content;\n if (Array.isArray(content)) {\n let idx = 0;\n for (const block of content) {\n if (\n block &&\n typeof block === \"object\" &&\n \"text\" in (block as Record<string, unknown>) &&\n typeof (block as { text: unknown }).text === \"string\"\n ) {\n if (textBuffer.length === 0 && !emittedTextChunks.has(idx)) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: (block as { text: string }).text,\n });\n emittedTextChunks.add(idx);\n }\n }\n idx++;\n }\n }\n } else if (msgType === \"result\") {\n const m = msg as Record<string, unknown>;\n const usage = m.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (typeof m.stop_reason === \"string\") sdkStopReason = m.stop_reason;\n }\n }\n } catch (err) {\n if (captured.toolCalls.length === 0) {\n controller.enqueue({ type: \"error\", error: err });\n controller.close();\n return;\n }\n }\n\n for (const tc of captured.toolCalls) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: JSON.stringify(tc.args),\n });\n }\n\n const finishReason = deriveFinishReason({\n hasToolCalls: captured.toolCalls.length > 0,\n sdkStopReason,\n });\n\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: { promptTokens: inputTokens, completionTokens: outputTokens },\n });\n controller.close();\n },\n });\n\n return {\n stream,\n rawCall: {\n rawPrompt: promptString,\n rawSettings: { systemPrompt, model: sdkOptions.model ?? this.modelId },\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // Internal — build SDK options + prompt string for a call\n // -------------------------------------------------------------------------\n\n private _prepare(options: LanguageModelV1CallOptions): {\n systemPrompt: string | undefined;\n promptString: string;\n sdkOptions: SDKOptions;\n captured: { toolCalls: PendingToolCall[] };\n } {\n const systemPrompt = extractSystemPrompt(options.prompt);\n const promptString = renderConversation(options.prompt) || \" \";\n\n const fnTools: LanguageModelV1FunctionTool[] = [];\n if (options.mode.type === \"regular\" && options.mode.tools) {\n for (const t of options.mode.tools) {\n if (t.type === \"function\") fnTools.push(t);\n }\n }\n\n const captured: { toolCalls: PendingToolCall[] } = { toolCalls: [] };\n\n const canUseTool: SDKOptions[\"canUseTool\"] = async (\n toolName: string,\n input: Record<string, unknown>,\n ctx: { toolUseID: string },\n ): Promise<PermissionResult> => {\n const normalized = normalizeToolName(toolName);\n captured.toolCalls.push({\n toolCallId: ctx.toolUseID,\n toolName: normalized,\n args: input,\n });\n return {\n behavior: \"deny\",\n message: \"Tool call intercepted by AgentRunner\",\n interrupt: true,\n };\n };\n\n const sdkOptions: SDKOptions = {\n ...(this._opts.defaults ?? {}),\n model: mapModel(this.modelId) ?? this._opts.defaults?.model ?? this.modelId,\n maxTurns: this._opts.maxTurns ?? 10,\n permissionMode: \"default\",\n canUseTool,\n };\n\n const built = buildToolsServer(fnTools);\n if (built) {\n sdkOptions.mcpServers = {\n ...(sdkOptions.mcpServers ?? {}),\n [FRAMEWORK_SERVER]: built.server,\n } as SDKOptions[\"mcpServers\"];\n sdkOptions.allowedTools = [...(sdkOptions.allowedTools ?? []), ...built.allowedTools];\n }\n\n if (!this._opts.allowBuiltinTools) {\n sdkOptions.disallowedTools = [\n ...(sdkOptions.disallowedTools ?? []),\n ...BLOCKED_BUILTIN_TOOLS,\n ];\n }\n\n return { systemPrompt, promptString, sdkOptions, captured };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Derive finish reason\n// ---------------------------------------------------------------------------\n\nfunction deriveFinishReason(args: {\n hasToolCalls: boolean;\n sdkStopReason: string | null;\n}): LanguageModelV1FinishReason {\n if (args.hasToolCalls) return \"tool-calls\";\n switch (args.sdkStopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"stop\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a `LanguageModelV1` backed by the Claude Agent SDK.\n *\n * @example\n * ```ts\n * import { claudeCode } from \"@agentic-patterns/runtime/providers\";\n * import { AgentRunner } from \"@agentic-patterns/runtime\";\n *\n * const runner = new AgentRunner(claudeCode(\"sonnet\"));\n * const result = await runner.run(agent, \"What is 17 + 28?\");\n * ```\n */\nexport function claudeCode(\n modelId: string,\n opts?: ClaudeCodeProviderOptions,\n): ClaudeCodeLanguageModel {\n return new ClaudeCodeLanguageModel(modelId, opts);\n}\n","/**\n * Provider adapter registry.\n *\n * Each provider exports a `ProviderProtocol` constant that knows its env\n * vars, tier map, and how to dynamically load the `@ai-sdk/*` (or\n * equivalent) package. The registry below is consumed by `createRunner()`\n * for provider auto-detection and tier resolution.\n *\n * Registry order matters for env-based auto-detection: the first provider\n * with a matching env var wins. We lead with Anthropic (repo's center of\n * gravity: the Claude Agent SDK is a peer dep). Callers who want a\n * different order pass `options.provider` explicitly.\n */\n\nexport type { ProviderProtocol, ProviderTier, SupportedProvider } from \"./types.js\";\nexport { anthropicProvider } from \"./anthropic.js\";\nexport { openaiProvider } from \"./openai.js\";\nexport { googleProvider } from \"./google.js\";\nexport { groqProvider } from \"./groq.js\";\nexport { mistralProvider } from \"./mistral.js\";\nexport { xaiProvider } from \"./xai.js\";\nexport { deepseekProvider } from \"./deepseek.js\";\nexport { openrouterProvider } from \"./openrouter.js\";\nexport { ollamaProvider } from \"./ollama.js\";\n\n// Claude Code LanguageModelV1 adapter — wraps the Claude Agent SDK so\n// Max subscription users can feed Claude through AgentRunner like any\n// other @ai-sdk/* provider with full event vocabulary.\nexport { claudeCode, ClaudeCodeLanguageModel } from \"./claude-code.js\";\nexport type { ClaudeCodeProviderOptions } from \"./claude-code.js\";\n\nimport { anthropicProvider } from \"./anthropic.js\";\nimport { deepseekProvider } from \"./deepseek.js\";\nimport { googleProvider } from \"./google.js\";\nimport { groqProvider } from \"./groq.js\";\nimport { mistralProvider } from \"./mistral.js\";\nimport { ollamaProvider } from \"./ollama.js\";\nimport { openaiProvider } from \"./openai.js\";\nimport { openrouterProvider } from \"./openrouter.js\";\nimport type { ProviderProtocol, ProviderTier, SupportedProvider } from \"./types.js\";\nimport { xaiProvider } from \"./xai.js\";\n\n/** All supported providers keyed by name. */\nexport const PROVIDERS: Readonly<Record<SupportedProvider, ProviderProtocol>> = {\n anthropic: anthropicProvider,\n openai: openaiProvider,\n google: googleProvider,\n groq: groqProvider,\n mistral: mistralProvider,\n xai: xaiProvider,\n deepseek: deepseekProvider,\n openrouter: openrouterProvider,\n ollama: ollamaProvider,\n};\n\n/**\n * Env-detection priority. First entry whose `envVars` include a set env\n * variable wins. Order reflects repo defaults — Anthropic first, OSS local\n * (Ollama) last so remote providers are preferred when both exist.\n */\nexport const PROVIDER_PRIORITY: readonly SupportedProvider[] = [\n \"anthropic\",\n \"openai\",\n \"google\",\n \"groq\",\n \"mistral\",\n \"xai\",\n \"deepseek\",\n \"openrouter\",\n \"ollama\",\n];\n\n/** Resolve a model id for a (provider, tier?, explicitModelId?) triple. */\nexport function resolveModelId(\n provider: ProviderProtocol,\n explicitModelId?: string,\n tier: ProviderTier = \"sonnet\",\n): string {\n return explicitModelId ?? provider.tiers[tier];\n}\n","/**\n * In-process transport with NATS-compatible subject wildcards.\n *\n * Zero-dependency in-memory pub/sub for multi-agent communication.\n * Supports NATS wildcard patterns: `*` (single token) and `>` (trailing tokens).\n */\n\nimport type { Transport, TransportMessage } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Subject matching (NATS-style)\n// ---------------------------------------------------------------------------\n\ninterface Subscription {\n readonly pattern: string;\n readonly regex: RegExp;\n readonly callback: (msg: TransportMessage) => void | Promise<void>;\n}\n\n/**\n * Convert a NATS subject pattern to a RegExp.\n *\n * NATS wildcards:\n * `*` matches exactly one token (segment between dots)\n * `>` matches one or more trailing tokens (must be the last segment)\n */\nexport function subjectToRegex(pattern: string): RegExp {\n const parts = pattern.split(\".\");\n const regexParts: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n if (part === \">\") {\n regexParts.push(\"[^.]+(?:\\\\.[^.]+)*\");\n break; // > must be last\n }\n if (part === \"*\") {\n regexParts.push(\"[^.]+\");\n } else {\n regexParts.push(part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n }\n\n return new RegExp(`^${regexParts.join(\"\\\\.\")}$`);\n}\n\n/**\n * Test whether a subject matches a NATS-style pattern.\n */\nexport function matchSubject(pattern: string, subject: string): boolean {\n return subjectToRegex(pattern).test(subject);\n}\n\n// ---------------------------------------------------------------------------\n// InProcessTransport\n// ---------------------------------------------------------------------------\n\n/**\n * Zero-dependency in-process transport with NATS-compatible wildcards.\n *\n * All messaging is synchronous within the process -- no network I/O.\n * `connect()` and `ensureStream()` are no-ops.\n */\nexport class InProcessTransport implements Transport {\n private _subscriptions: Subscription[] = [];\n private _connected = false;\n\n async connect(): Promise<void> {\n this._connected = true;\n }\n\n async close(): Promise<void> {\n this._subscriptions = [];\n this._connected = false;\n }\n\n async ensureStream(_name: string, _subjects: string[]): Promise<void> {\n // No-op: streams are a JetStream concept\n }\n\n async publish(subject: string, data: Uint8Array): Promise<void> {\n const msg: TransportMessage = {\n data,\n subject,\n ack: async () => {\n // No-op for in-memory transport\n },\n };\n\n for (const sub of [...this._subscriptions]) {\n if (sub.regex.test(subject)) {\n const result = sub.callback(msg);\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n }\n\n async subscribe(\n subject: string,\n callback: (msg: TransportMessage) => void | Promise<void>,\n _durable?: string,\n ): Promise<void> {\n const sub: Subscription = {\n pattern: subject,\n regex: subjectToRegex(subject),\n callback,\n };\n this._subscriptions.push(sub);\n }\n\n async request(subject: string, data: Uint8Array, _timeout = 5000): Promise<Uint8Array> {\n const msg: TransportMessage = {\n data,\n subject,\n ack: async () => {},\n };\n\n for (const sub of [...this._subscriptions]) {\n if (sub.regex.test(subject)) {\n const result = sub.callback(msg);\n let resp: unknown;\n if (result instanceof Promise) {\n resp = await result;\n } else {\n resp = result;\n }\n if (resp instanceof Uint8Array) {\n return resp;\n }\n }\n }\n\n throw new Error(`No handler for request on ${subject}`);\n }\n\n /** Whether the transport is currently connected. */\n get connected(): boolean {\n return this._connected;\n }\n}\n","/**\n * MessagingToolbox - inter-agent communication tools over shared transport.\n *\n * Provides send_message, broadcast, and list_team tools that publish\n * SandboxEvents to the bus, enabling fully event-driven agent conversations.\n */\n\nimport { type ToolDefinition, Toolbox } from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\nimport type { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type {\n AgentAddress,\n AgentBroadcastEvent,\n AgentMessageEvent,\n} from \"../events/sandbox-types.js\";\n\n/**\n * Tools for inter-agent communication within an agency.\n *\n * Each tool publishes a SandboxEvent to the bus, which then dispatches\n * both locally and over transport.\n */\nexport class MessagingToolbox extends Toolbox {\n readonly name = \"Messaging\";\n readonly description = \"Tools for sending messages to other agents on the team.\";\n\n private readonly _bus: SandboxEventBus;\n private readonly _address: AgentAddress;\n private readonly _agencyId: string;\n private readonly _runId: string;\n private readonly _roster: Record<string, AgentAddress>;\n readonly tools: Record<string, ToolDefinition>;\n\n constructor(\n bus: SandboxEventBus,\n address: AgentAddress,\n agencyId: string,\n runId: string,\n roster: Record<string, AgentAddress>,\n ) {\n super();\n this._bus = bus;\n this._address = address;\n this._agencyId = agencyId;\n this._runId = runId;\n this._roster = roster;\n\n this.tools = {\n send_message: {\n description: \"Send a direct message to another agent by role name.\",\n parameters: z.object({\n to: z.string().describe(\"Target agent role name\"),\n content: z.string().describe(\"Message content\"),\n }),\n execute: async (args: Record<string, unknown>): Promise<unknown> => {\n const { to, content } = args as { to: string; content: string };\n return this._sendMessage(to, content);\n },\n },\n\n broadcast: {\n description: \"Broadcast a message to all agents in the agency.\",\n parameters: z.object({\n content: z.string().describe(\"Message content to broadcast\"),\n }),\n execute: async (args: Record<string, unknown>): Promise<unknown> => {\n const { content } = args as { content: string };\n return this._broadcast(content);\n },\n },\n\n list_team: {\n description: \"List all agents in the agency with their roles.\",\n parameters: z.object({}),\n execute: async (): Promise<unknown> => {\n return this._listTeam();\n },\n },\n };\n }\n\n private async _sendMessage(to: string, content: string): Promise<string> {\n const target = this._roster[to];\n if (!target) {\n const available = Object.keys(this._roster).sort().join(\", \");\n return `Unknown agent '${to}'. Available agents: ${available}`;\n }\n\n const event: AgentMessageEvent = {\n type: \"sandbox.agent.message\",\n traceId: \"\",\n runId: \"\",\n spanId: `${Date.now().toString(36)}-msg`,\n timestamp: new Date(),\n origin: this._address,\n target,\n agencyId: this._agencyId,\n lineupRunId: this._runId,\n content,\n metadata: {},\n };\n\n await this._bus.publish(event);\n return `Message sent to ${to}.`;\n }\n\n private async _broadcast(content: string): Promise<string> {\n const event: AgentBroadcastEvent = {\n type: \"sandbox.agent.broadcast\",\n traceId: \"\",\n runId: \"\",\n spanId: `${Date.now().toString(36)}-bcast`,\n timestamp: new Date(),\n origin: this._address,\n agencyId: this._agencyId,\n lineupRunId: this._runId,\n content,\n channel: \"\",\n };\n\n await this._bus.publish(event);\n return \"Message broadcast to all agents.\";\n }\n\n private _listTeam(): Array<{ role: string; agentId: string }> {\n return Object.entries(this._roster)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([role, addr]) => ({\n role,\n agentId: addr.agentId,\n }));\n }\n}\n","/**\n * SSE (Server-Sent Events) formatter for agent events.\n *\n * Converts internal AgentEvent types to SSE-formatted strings for streaming\n * to clients over HTTP. Maps all 20 canonical events via a single typed\n * discriminated-union switch (`toSSEMapping`) so event name, payload, and\n * exhaustiveness live in one place.\n */\n\nimport type { AgentEvent, AgentEventType } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Canonical wire event names (string union)\n// ---------------------------------------------------------------------------\n\n/**\n * Client-facing SSE event name. Matches the 20 canonical events defined in\n * the admin-observability spec. Used anywhere an SSE frame is produced so\n * the compiler catches typos like `\"thinking.complete\"` vs `\"thinking\"`.\n */\nexport type SSEEventName =\n | \"conversation.start\"\n | \"conversation.end\"\n | \"message.start\"\n | \"message.delta\"\n | \"message.complete\"\n | \"message.cancel\"\n | \"thinking.start\"\n | \"thinking\"\n | \"thinking.complete\"\n | \"tool.intent\"\n | \"tool.start\"\n | \"tool.progress\"\n | \"tool.end\"\n | \"tool.rejected\"\n | \"iteration.start\"\n | \"iteration.end\"\n | \"llm.start\"\n | \"llm.end\"\n | \"error\"\n | \"claude_code.hook\"\n | \"done\";\n\n/** Result of mapping an AgentEvent to its canonical SSE shape. */\nexport interface SSEMapping {\n readonly name: SSEEventName;\n readonly payload: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Single source of truth — event -> wire name + payload\n// ---------------------------------------------------------------------------\n\n/**\n * Map an `AgentEvent` to its canonical SSE wire name and payload. The\n * discriminated-union switch narrows `event` automatically so field access\n * is fully typed without casts. The `never` default is a compile-time\n * exhaustiveness check — adding a new variant to `AgentEvent` fails\n * typechecking here until a branch is added.\n *\n * Returns `null` only when a non-AgentEvent slips through at runtime\n * (e.g., a hand-constructed event with an unrecognised `type`).\n */\nexport function toSSEMapping(event: AgentEvent): SSEMapping | null {\n switch (event.type) {\n case \"agent.conversation.start\":\n return {\n name: \"conversation.start\",\n payload: { conversation_id: event.conversationId, agent_name: event.agentName },\n };\n case \"agent.conversation.end\":\n return {\n name: \"conversation.end\",\n payload: { conversation_id: event.conversationId, reason: event.reason },\n };\n case \"agent.message.start\":\n return { name: \"message.start\", payload: { agent_name: event.agentName } };\n case \"agent.message.chunk\":\n return {\n name: \"message.delta\",\n payload: { delta: event.delta, chunk_index: event.chunkIndex },\n };\n case \"agent.message.complete\":\n return {\n name: \"message.complete\",\n payload: {\n content: event.content,\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n model: event.model,\n },\n };\n case \"agent.message.cancel\":\n return { name: \"message.cancel\", payload: { reason: event.reason } };\n case \"agent.thinking.start\":\n return { name: \"thinking.start\", payload: {} };\n case \"agent.reasoning\":\n return {\n name: event.isComplete ? \"thinking.complete\" : \"thinking\",\n payload: { content: event.content },\n };\n case \"agent.tool.intent\":\n return {\n name: \"tool.intent\",\n payload: {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n arguments: event.arguments,\n },\n };\n case \"agent.tool.start\":\n return {\n name: \"tool.start\",\n payload: {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n arguments: event.arguments,\n },\n };\n case \"agent.tool.progress\":\n return {\n name: \"tool.progress\",\n payload: {\n tool_call_id: event.toolCallId,\n progress: event.progress,\n status_text: event.statusText,\n },\n };\n case \"agent.tool.end\": {\n const payload: Record<string, unknown> = {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n result: event.result,\n duration_ms: event.durationMs,\n };\n if (event.error !== undefined) payload.error = event.error;\n return { name: \"tool.end\", payload };\n }\n case \"agent.tool.rejected\":\n return {\n name: \"tool.rejected\",\n payload: {\n tool_name: event.toolName,\n reason: event.reason,\n gate_name: event.gateName,\n },\n };\n case \"agent.iteration.start\":\n return {\n name: \"iteration.start\",\n payload: { iteration: event.iteration, max_iterations: event.maxIterations },\n };\n case \"agent.iteration.end\":\n return {\n name: \"iteration.end\",\n payload: {\n iteration: event.iteration,\n tool_calls_count: event.toolCallsCount,\n has_more: event.hasMore,\n },\n };\n case \"agent.llm.start\":\n return {\n name: \"llm.start\",\n payload: {\n model: event.model,\n message_count: event.messageCount,\n has_tools: event.hasTools,\n },\n };\n case \"agent.llm.end\":\n return {\n name: \"llm.end\",\n payload: {\n model: event.model,\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n duration_ms: event.durationMs,\n finish_reason: event.finishReason,\n },\n };\n case \"agent.error\":\n return {\n name: \"error\",\n payload: {\n error_type: event.errorType,\n message: event.message,\n recoverable: event.recoverable,\n },\n };\n case \"claude_code.hook\":\n return {\n name: \"claude_code.hook\",\n payload: {\n hook_name: event.hookName,\n session_id: event.sessionId,\n cwd: event.cwd,\n tool_name: event.toolName,\n tool_input: event.toolInput,\n tool_response: event.toolResponse,\n tool_use_id: event.toolUseId,\n permission_mode: event.permissionMode,\n transcript_path: event.transcriptPath,\n runner_correlation_id: event.runnerCorrelationId,\n payload: event.payload,\n },\n };\n default: {\n // Exhaustiveness check — a new AgentEvent variant without a branch here\n // is a compile-time error.\n const _exhaustive: never = event;\n void _exhaustive;\n return null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Derived: name map and payload extractor (thin wrappers around toSSEMapping)\n// ---------------------------------------------------------------------------\n\n/**\n * Map from internal `AgentEvent.type` to canonical SSE wire name. Useful\n * when a consumer only needs the name (routing, logging) and not the\n * payload. For `agent.reasoning` the default entry is `\"thinking\"`; the\n * `isComplete=true` variant produces `\"thinking.complete\"` via\n * `toSSEMapping` — consumers that care should use that directly.\n */\nexport const SSE_EVENT_NAMES: Readonly<Record<AgentEventType, SSEEventName>> = {\n \"agent.conversation.start\": \"conversation.start\",\n \"agent.conversation.end\": \"conversation.end\",\n \"agent.message.start\": \"message.start\",\n \"agent.message.chunk\": \"message.delta\",\n \"agent.message.complete\": \"message.complete\",\n \"agent.message.cancel\": \"message.cancel\",\n \"agent.thinking.start\": \"thinking.start\",\n \"agent.reasoning\": \"thinking\",\n \"agent.tool.intent\": \"tool.intent\",\n \"agent.tool.start\": \"tool.start\",\n \"agent.tool.progress\": \"tool.progress\",\n \"agent.tool.end\": \"tool.end\",\n \"agent.tool.rejected\": \"tool.rejected\",\n \"agent.iteration.start\": \"iteration.start\",\n \"agent.iteration.end\": \"iteration.end\",\n \"agent.llm.start\": \"llm.start\",\n \"agent.llm.end\": \"llm.end\",\n \"agent.error\": \"error\",\n \"claude_code.hook\": \"claude_code.hook\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// SSEFormatter class\n// ---------------------------------------------------------------------------\n\n/**\n * Formats `AgentEvent`s as SSE frames with canonical event names.\n *\n * Delegates all mapping to `toSSEMapping`; this class exists to carry the\n * trace-context enrichment (traceId + timestamp) onto the payload so the\n * runtime's admin SSE broadcast stays self-describing.\n */\nexport class SSEFormatter {\n /** Format an AgentEvent as an SSE frame string, or `null` if unmappable. */\n format(event: AgentEvent): string | null {\n const mapping = toSSEMapping(event);\n if (!mapping) return null;\n const enriched = {\n ...mapping.payload,\n traceId: event.traceId,\n timestamp: event.timestamp.toISOString(),\n };\n return `event: ${mapping.name}\\ndata: ${JSON.stringify(enriched)}\\n\\n`;\n }\n\n /**\n * Extract the payload from an event using canonical snake_case field\n * names. Static so StdioAdapter and other consumers can reuse it without\n * instantiating a formatter. Returns `null` if the event has no mapping.\n */\n static extractPayload(event: AgentEvent): Record<string, unknown> | null {\n return toSSEMapping(event)?.payload ?? null;\n }\n\n /** Format a stream-terminator \"done\" event. */\n static formatDone(): string {\n return \"event: done\\ndata: {}\\n\\n\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible function API\n// ---------------------------------------------------------------------------\n\nconst _defaultFormatter = new SSEFormatter();\n\n/**\n * Format an AgentEvent as an SSE frame string.\n *\n * @deprecated Use `new SSEFormatter().format(event)` instead.\n */\nexport function formatSSE(event: AgentEvent): string | null {\n return _defaultFormatter.format(event);\n}\n","/**\n * AgentNode - event-driven agent wrapper for multi-agent systems.\n *\n * Wraps an Agent with a message queue and worker loop that listens to\n * SandboxEventBus events, batches incoming messages, and runs them through\n * a runner (LLM or mock).\n *\n * Architecture: Bus -> Queue -> Worker -> Runner -> Tools -> Bus\n */\n\nimport type { Agent } from \"@agentic-patterns/core\";\nimport type { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type {\n AgentAddress,\n AgentBroadcastEvent,\n AgentMessageEvent,\n NodeLifecycleEvent,\n SandboxEvent,\n} from \"../events/sandbox-types.js\";\nimport type { CanonicalMessage, RunnerProtocol } from \"../runner/types.js\";\nimport type { MessagingToolbox } from \"../transport/messaging-toolbox.js\";\n\n// Timers that work in both Node and browser environments\ndeclare function setTimeout(callback: () => void, ms: number): number;\ndeclare function clearTimeout(id: number): void;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_IDLE_TIMEOUT = 10_000; // 10s of queue-idle before stopping\nexport const DEFAULT_GLOBAL_TIMEOUT = 120_000; // 120s hard stop (first message wait)\nexport const DEFAULT_MAX_TURNS = 20;\nexport const BATCH_WINDOW = 100; // 100ms window for batch draining\n\n// ---------------------------------------------------------------------------\n// AgentNode options\n// ---------------------------------------------------------------------------\n\nexport interface AgentNodeOptions {\n readonly name: string;\n readonly agent: Agent;\n readonly bus: SandboxEventBus;\n readonly address: AgentAddress;\n readonly toolbox: MessagingToolbox;\n readonly runner: RunnerProtocol;\n readonly traceId?: string;\n readonly maxTurns?: number;\n readonly idleTimeout?: number;\n readonly globalTimeout?: number;\n}\n\n// ---------------------------------------------------------------------------\n// AgentNode\n// ---------------------------------------------------------------------------\n\ntype QueuedEvent = AgentMessageEvent | AgentBroadcastEvent;\n\n/**\n * Event-driven agent wrapper. Bus -> Queue -> Worker -> Runner -> Bus.\n *\n * Each node owns its own SandboxEventBus (wired to a shared transport)\n * and listens for messages addressed to its AgentAddress.\n *\n * Lifecycle events emitted on the bus:\n * - node.started: when the node begins listening\n * - node.stopped: when the worker exits\n * - node.message_received: when messages are dequeued for processing\n * - node.response_sent: after the runner produces a response\n */\nexport class AgentNode {\n readonly name: string;\n readonly agent: Agent;\n readonly address: AgentAddress;\n\n private readonly _bus: SandboxEventBus;\n private readonly _toolbox: MessagingToolbox;\n private readonly _runner: RunnerProtocol;\n private readonly _traceId: string;\n private readonly _maxTurns: number;\n private readonly _idleTimeout: number;\n private readonly _globalTimeout: number;\n\n private _queue: QueuedEvent[] = [];\n private _queueResolve?: () => void;\n private _conversation: CanonicalMessage[] = [];\n private _turnsTaken = 0;\n private _workerPromise: Promise<void> | null = null;\n private _stopped = false;\n readonly transcript: string[] = [];\n\n constructor(options: AgentNodeOptions) {\n this.name = options.name;\n this.agent = options.agent;\n this.address = options.address;\n this._bus = options.bus;\n this._toolbox = options.toolbox;\n this._runner = options.runner;\n this._traceId = options.traceId ?? \"\";\n this._maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n this._idleTimeout = options.idleTimeout ?? DEFAULT_IDLE_TIMEOUT;\n this._globalTimeout = options.globalTimeout ?? DEFAULT_GLOBAL_TIMEOUT;\n }\n\n // ── Lifecycle ──\n\n /**\n * Subscribe to bus events and start the worker loop.\n */\n async start(): Promise<void> {\n this._bus.subscribe(\"sandbox.agent.message\", (event) => {\n this._onMessage(event as AgentMessageEvent);\n });\n this._bus.subscribe(\"sandbox.agent.broadcast\", (event) => {\n this._onBroadcast(event as AgentBroadcastEvent);\n });\n this._workerPromise = this._worker();\n await this._emitLifecycle(\"node.started\", { node: this.name });\n }\n\n /**\n * Stop the worker loop.\n */\n async stop(): Promise<void> {\n this._stopped = true;\n // Wake up the queue waiter so the worker can exit\n if (this._queueResolve) {\n this._queueResolve();\n }\n if (this._workerPromise) {\n await this._workerPromise;\n }\n await this._emitLifecycle(\"node.stopped\", { node: this.name });\n }\n\n /**\n * Seed a message into the queue from the orchestrator.\n */\n async inject(content: string): Promise<void> {\n const synthetic: AgentMessageEvent = {\n type: \"sandbox.agent.message\",\n traceId: this._traceId,\n runId: \"\",\n spanId: `${Date.now().toString(36)}-inject`,\n timestamp: new Date(),\n origin: { deviceId: \"\", instanceId: \"\", agentId: \"system\", role: \"system\" },\n target: this.address,\n agencyId: this._bus.address.deviceId,\n lineupRunId: \"\",\n content,\n metadata: {},\n };\n this._enqueue(synthetic);\n }\n\n /** Number of turns the worker has completed. */\n get turnsTaken(): number {\n return this._turnsTaken;\n }\n\n /** Whether the worker is done (stopped or completed). */\n get isDone(): boolean {\n return this._stopped;\n }\n\n // ── Message filtering ──\n\n private _shouldHandle(event: SandboxEvent): boolean {\n if (event.type === \"sandbox.agent.message\") {\n const msg = event as AgentMessageEvent;\n return (\n msg.target !== undefined &&\n msg.target !== null &&\n msg.target.agentId === this.address.agentId &&\n msg.origin.agentId !== this.address.agentId\n );\n }\n if (event.type === \"sandbox.agent.broadcast\") {\n return event.origin.agentId !== this.address.agentId;\n }\n return false;\n }\n\n private _onMessage(event: AgentMessageEvent): void {\n if (this._shouldHandle(event)) {\n this._enqueue(event);\n }\n }\n\n private _onBroadcast(event: AgentBroadcastEvent): void {\n if (this._shouldHandle(event)) {\n this._enqueue(event);\n }\n }\n\n private _enqueue(event: QueuedEvent): void {\n this._queue.push(event);\n if (this._queueResolve) {\n this._queueResolve();\n this._queueResolve = undefined;\n }\n }\n\n // ── Worker loop ──\n\n private _waitForMessage(timeout: number): Promise<QueuedEvent | null> {\n if (this._queue.length > 0) {\n return Promise.resolve(this._queue.shift()!);\n }\n\n return new Promise<QueuedEvent | null>((resolve) => {\n // biome-ignore lint/style/useConst: assigned in setTimeout closure below\n let timer: ReturnType<typeof setTimeout>;\n\n this._queueResolve = () => {\n clearTimeout(timer);\n if (this._queue.length > 0) {\n resolve(this._queue.shift()!);\n } else {\n resolve(null);\n }\n };\n\n timer = setTimeout(() => {\n this._queueResolve = undefined;\n resolve(null);\n }, timeout);\n });\n }\n\n private _drainQueue(): QueuedEvent[] {\n const batch = [...this._queue];\n this._queue = [];\n return batch;\n }\n\n private async _worker(): Promise<void> {\n while (this._turnsTaken < this._maxTurns && !this._stopped) {\n // First message: wait up to global timeout; subsequent: use idle timeout\n const timeout = this._turnsTaken === 0 ? this._globalTimeout : this._idleTimeout;\n const msg = await this._waitForMessage(timeout);\n\n if (!msg || this._stopped) break;\n\n // Drain additional queued messages (batch window)\n await new Promise<void>((r) => setTimeout(r, BATCH_WINDOW));\n const batch = [msg, ...this._drainQueue()];\n\n // Emit lifecycle event\n await this._emitLifecycle(\"node.message_received\", {\n node: this.name,\n count: batch.length,\n });\n\n // Format incoming messages as user input\n const userMsg = this._formatIncoming(batch);\n\n for (const p of batch) {\n this.transcript.push(`<- ${p.origin.role}: ${p.content}`);\n }\n\n try {\n const result = await this._runner.run(this.agent, userMsg, {\n toolExecutor: this._toolbox,\n messageHistory: this._conversation,\n traceId: this._traceId || undefined,\n maxIterations: 10,\n });\n\n // Append to conversation for continuity\n const request: CanonicalMessage = {\n kind: \"request\" as const,\n parts: [{ type: \"user_prompt\", content: userMsg }],\n };\n const response: CanonicalMessage = {\n kind: \"response\" as const,\n parts: [{ type: \"text\", content: result.response }],\n };\n this._conversation.push(request);\n this._conversation.push(response);\n\n this._turnsTaken++;\n this.transcript.push(`-> ${this.name}: ${result.response}`);\n\n // Emit lifecycle event\n await this._emitLifecycle(\"node.response_sent\", {\n node: this.name,\n toolCalls: result.toolCallsCount,\n tokens: result.inputTokens + result.outputTokens,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.transcript.push(`! ${this.name} error: ${message}`);\n break;\n }\n }\n }\n\n // ── Helpers ──\n\n private _formatIncoming(events: QueuedEvent[]): string {\n const parts: string[] = [];\n for (const e of events) {\n if (e.type === \"sandbox.agent.message\") {\n parts.push(`[Message from ${e.origin.role}]: ${e.content}`);\n } else if (e.type === \"sandbox.agent.broadcast\") {\n parts.push(`[Broadcast from ${e.origin.role}]: ${e.content}`);\n }\n }\n return parts.join(\"\\n\\n\");\n }\n\n private async _emitLifecycle(\n nodeEventType: NodeLifecycleEvent[\"nodeEventType\"],\n metadata: Record<string, unknown>,\n ): Promise<void> {\n const event: NodeLifecycleEvent = {\n type: \"sandbox.node.lifecycle\",\n traceId: this._traceId,\n runId: \"\",\n spanId: `${Date.now().toString(36)}-lifecycle`,\n timestamp: new Date(),\n origin: this.address,\n agencyId: \"\",\n lineupRunId: \"\",\n nodeEventType,\n message: `${nodeEventType}: ${this.name}`,\n metadata,\n };\n await this._bus.publish(event);\n }\n}\n","/**\n * AgencyRuntime - takes an Agency atom and produces a running system of AgentNode instances.\n *\n * Bridges the declarative Agency definition (atoms layer) to the runtime systems layer\n * by creating transport, building agents with roles/capabilities, and wiring up\n * event-driven communication between nodes.\n *\n * Architecture:\n * Agency (atom) -> AgencyRuntime -> [AgentNode, AgentNode, ...] on shared transport\n */\n\nimport {\n type Agency,\n AgentBuilder,\n type AgentSpecData,\n Capability,\n Judgment,\n Mission,\n Persona,\n RoleBuilder,\n TextManual,\n} from \"@agentic-patterns/core\";\nimport { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type { AgentAddress } from \"../events/sandbox-types.js\";\nimport type { RunnerProtocol } from \"../runner/types.js\";\nimport { InProcessTransport } from \"../transport/in-process.js\";\nimport { MessagingToolbox } from \"../transport/messaging-toolbox.js\";\nimport { AgentNode } from \"./agent-node.js\";\n\n// ---------------------------------------------------------------------------\n// ID generation (works without DOM or Node types)\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Messaging manual (inline, matches Python _MessagingManual)\n// ---------------------------------------------------------------------------\n\nconst MESSAGING_GUIDANCE =\n \"## Team Communication\\n\" +\n \"Use send_message(to, content) to message a specific teammate by role name.\\n\" +\n \"Use broadcast(content) for team-wide announcements.\\n\" +\n \"Use list_team() to see who's on the team.\\n\\n\" +\n \"Keep messages brief and actionable. Don't send more than 2 messages per turn.\\n\" +\n \"When your work is done, stop messaging.\";\n\n// ---------------------------------------------------------------------------\n// AgencyRuntime\n// ---------------------------------------------------------------------------\n\n/**\n * Takes an Agency atom and creates an AgentNode swarm with transport wiring.\n *\n * Lifecycle:\n * const runtime = new AgencyRuntime(agency, runner);\n * await runtime.start(); // creates transport, builds nodes, starts all\n * await runtime.injectCoordinator(\"Go!\");\n * ...\n * await runtime.stop(); // stops all nodes and transport\n */\nexport class AgencyRuntime {\n private readonly _agency: Agency;\n private readonly _runner: RunnerProtocol;\n private readonly _runId: string;\n private _transport: InProcessTransport | null = null;\n private _nodes: Record<string, AgentNode> = {};\n private _buses: Record<string, SandboxEventBus> = {};\n private _addresses: Record<string, AgentAddress> = {};\n private _started = false;\n\n constructor(agency: Agency, runner: RunnerProtocol, runId?: string) {\n this._agency = agency;\n this._runner = runner;\n this._runId = runId ?? generateId();\n }\n\n // ── Lifecycle ──\n\n /**\n * Create transport, build nodes, start all.\n */\n async start(): Promise<void> {\n if (this._started) return;\n\n // 1. Create transport (MVP: in-process only)\n this._transport = new InProcessTransport();\n\n // 2. Build addresses for all agents (needed for roster)\n for (const spec of this._agency.data.agents) {\n const addr: AgentAddress = {\n deviceId: \"local\",\n instanceId: this._runId,\n agentId: spec.role,\n role: spec.role,\n };\n this._addresses[spec.role] = addr;\n }\n\n // 3. Build AgentNode per AgentSpec\n for (const spec of this._agency.data.agents) {\n const node = await this._buildNode(spec);\n this._nodes[spec.role] = node;\n }\n\n // 4. Start all nodes\n for (const node of Object.values(this._nodes)) {\n await node.start();\n }\n\n this._started = true;\n }\n\n /**\n * Stop all nodes and transport.\n */\n async stop(): Promise<void> {\n if (!this._started) return;\n\n // Stop nodes\n for (const node of Object.values(this._nodes)) {\n await node.stop();\n }\n\n // Stop buses\n for (const bus of Object.values(this._buses)) {\n await bus.stop();\n }\n\n this._started = false;\n }\n\n // ── Messaging ──\n\n /**\n * Inject a message to a specific agent by role.\n */\n async inject(role: string, content: string): Promise<void> {\n const node = this._nodes[role];\n if (!node) {\n const available = Object.keys(this._nodes).sort().join(\", \");\n throw new Error(`No agent with role '${role}'. Available: ${available}`);\n }\n await node.inject(content);\n }\n\n /**\n * Inject a message to the coordinator agent.\n */\n async injectCoordinator(content: string): Promise<void> {\n const coord = this._agency.coordinator;\n if (!coord) {\n throw new Error(\"Agency has no coordinator\");\n }\n await this.inject(coord.role, content);\n }\n\n // ── Introspection ──\n\n /**\n * Get the coordinator's address.\n */\n get coordinatorAddress(): AgentAddress | undefined {\n const coord = this._agency.coordinator;\n if (!coord) return undefined;\n return this._addresses[coord.role];\n }\n\n /**\n * Return role -> state mapping for all nodes.\n */\n status(): Record<string, \"running\" | \"stopped\"> {\n const result: Record<string, \"running\" | \"stopped\"> = {};\n for (const [role, node] of Object.entries(this._nodes)) {\n result[role] = node.isDone ? \"stopped\" : \"running\";\n }\n return result;\n }\n\n /**\n * Access the underlying nodes (read-only view).\n */\n get nodes(): Record<string, AgentNode> {\n return { ...this._nodes };\n }\n\n /**\n * The run ID for this runtime instance.\n */\n get runId(): string {\n return this._runId;\n }\n\n // ── Internal ──\n\n /**\n * Build a single AgentNode from an AgentSpec.\n */\n private async _buildNode(spec: AgentSpecData): Promise<AgentNode> {\n if (!this._transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n const addr = this._addresses[spec.role];\n if (!addr) {\n throw new Error(`No address for role '${spec.role}'`);\n }\n\n // 1. SandboxEventBus with shared transport\n const bus = new SandboxEventBus(addr, this._transport);\n await bus.start();\n this._buses[spec.role] = bus;\n\n // 2. MessagingToolbox with full roster\n const toolbox = new MessagingToolbox(bus, addr, this._agency.data.name, this._runId, {\n ...this._addresses,\n });\n\n // 3. Wrap in Capability with messaging manual\n const manual = new TextManual(\n \"Team Communication\",\n MESSAGING_GUIDANCE,\n \"How to communicate with teammates\",\n );\n const messagingCap = new Capability(\"messaging\", \"Inter-agent messaging\", toolbox, manual);\n\n // 4. Build Role\n const personaData = spec.persona;\n const persona = personaData\n ? new Persona(personaData)\n : new Persona({\n identity: `a ${spec.role} agent`,\n tone: \"professional and concise\",\n });\n\n const roleBuilder = new RoleBuilder(spec.role)\n .withPersona(persona)\n .withCapability(messagingCap)\n .withDefaultModel(spec.model);\n\n if (spec.judgment) {\n roleBuilder.withJudgment(new Judgment(spec.judgment));\n }\n\n const role = roleBuilder.build();\n\n // 5. Build Agent\n const mission = new Mission({\n objective: `Fulfill the ${spec.role} role within the ${this._agency.data.name} agency.`,\n });\n const agent = new AgentBuilder(role).withMission(mission).build();\n\n // 6. Create AgentNode\n return new AgentNode({\n name: spec.role,\n agent,\n bus,\n address: addr,\n toolbox,\n runner: this._runner,\n maxTurns: spec.max_turns,\n });\n }\n}\n","/**\n * Conversation runtime - stateful multi-turn conversation management.\n *\n * Ported from Python: systems/conversation.py\n */\n\nimport type { AgentEventBus } from \"../events/agent-event-bus.js\";\nimport { getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport { createEvent } from \"../events/types.js\";\nimport type {\n AgentLike,\n CanonicalMessage,\n CanonicalMessagePart,\n RunResult,\n RunnerProtocol,\n ToolExecutor,\n} from \"../runner/types.js\";\nimport type { ConversationStoreProtocol } from \"./store.js\";\n\n// ---------------------------------------------------------------------------\n// Exchange\n// ---------------------------------------------------------------------------\n\n/** A single tool call record within an exchange. */\nexport interface ToolCallRecord {\n readonly name: string;\n readonly id?: string;\n readonly arguments?: Record<string, unknown>;\n}\n\n/** A complete user->assistant exchange in a conversation. */\nexport interface Exchange {\n readonly number: number;\n readonly invocationId: string;\n readonly user: string;\n readonly assistant: string;\n readonly toolCalls: ToolCallRecord[];\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly timestamp: Date;\n}\n\n/**\n * Total tokens for an exchange.\n */\nexport function exchangeTotalTokens(exchange: Exchange): number {\n return exchange.inputTokens + exchange.outputTokens;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation\n// ---------------------------------------------------------------------------\n\n/**\n * A live conversation that can be continued.\n *\n * Core runtime abstraction for multi-turn conversations.\n * Tracks state, history, and manages execution.\n *\n * Example:\n * const conversation = new Conversation(agent, runner);\n * const exchange = await conversation.send(\"Hello!\");\n * console.log(exchange.assistant);\n */\nexport class Conversation {\n readonly id: string;\n readonly agent: AgentLike;\n readonly runner: RunnerProtocol;\n\n private _store: ConversationStoreProtocol | undefined;\n private _storeConversationId: string | undefined;\n private _toolExecutor: ToolExecutor | undefined;\n private _state: Record<string, unknown>;\n private _history: Exchange[] = [];\n private _exchangeCount = 0;\n\n constructor(\n agent: AgentLike,\n runner: RunnerProtocol,\n options?: {\n id?: string;\n store?: ConversationStoreProtocol;\n toolExecutor?: ToolExecutor;\n state?: Record<string, unknown>;\n history?: Exchange[];\n },\n ) {\n this.agent = agent;\n this.runner = runner;\n this.id = options?.id ?? generateUUID();\n this._store = options?.store;\n this._toolExecutor = options?.toolExecutor;\n this._state = options?.state ?? {};\n if (options?.history) {\n this._history = [...options.history];\n this._exchangeCount = this._history.length;\n }\n }\n\n /** String session ID for SDK compatibility. */\n get sessionId(): string {\n return this.id;\n }\n\n /** Number of completed exchanges. */\n get exchangeCount(): number {\n return this._exchangeCount;\n }\n\n /** All completed exchanges (copy). */\n get history(): Exchange[] {\n return [...this._history];\n }\n\n /** Alias for history — matches spec's `exchanges` getter. */\n get exchanges(): Exchange[] {\n return this.history;\n }\n\n /** Working state. */\n get state(): Record<string, unknown> {\n return { ...this._state };\n }\n\n /** Aggregate token usage across all exchanges. */\n get totalTokens(): { input: number; output: number; total: number } {\n const input = this._history.reduce((s, e) => s + e.inputTokens, 0);\n const output = this._history.reduce((s, e) => s + e.outputTokens, 0);\n return { input, output, total: input + output };\n }\n\n /** Most recent exchange, or undefined if no history. */\n get lastExchange(): Exchange | undefined {\n return this._history.length > 0 ? this._history[this._history.length - 1] : undefined;\n }\n\n /** Clear conversation history. */\n clear(): void {\n this._history = [];\n this._exchangeCount = 0;\n }\n\n /** Rollback conversation to a specific exchange (inclusive). */\n rollback(toExchange: number): void {\n this._history = this._history.filter((e) => e.number <= toExchange);\n this._exchangeCount = this._history.length;\n }\n\n /**\n * Send a message and get a response.\n */\n async send(message: string): Promise<Exchange> {\n this._exchangeCount += 1;\n const invocationId = generateUUID();\n\n const messageHistory = this._toMessageHistory();\n\n const result: RunResult = await this.runner.run(this.agent, message, {\n messageHistory,\n toolExecutor: this._toolExecutor,\n });\n\n const exchange: Exchange = {\n number: this._exchangeCount,\n invocationId,\n user: message,\n assistant: result.response,\n toolCalls: [],\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n timestamp: new Date(),\n };\n\n this._history.push(exchange);\n\n if (this._store) {\n await this._persistExchange(exchange);\n }\n\n return exchange;\n }\n\n /**\n * Send a message and stream the response.\n *\n * Yields AgentEvents as they arrive. After streaming completes,\n * the exchange is recorded in history.\n */\n async *stream(\n message: string,\n options?: { eventBus?: AgentEventBus },\n ): AsyncGenerator<AgentEvent> {\n if (!this.runner.stream) {\n throw new Error(\"Runner does not support streaming\");\n }\n\n this._exchangeCount += 1;\n const invocationId = generateUUID();\n const messageHistory = this._toMessageHistory();\n const eventBus = options?.eventBus ?? getAgentEventBus();\n\n // Get trace ID from message.start event (will be emitted by runner)\n // For now, generate one\n const traceId = invocationId;\n const runId = generateUUID();\n\n // Emit conversation start\n const convStartEvent = createEvent(\"agent.conversation.start\", {\n traceId,\n runId,\n conversationId: this.id,\n agentName: this.agent.role.name,\n });\n yield convStartEvent;\n await eventBus.publish(convStartEvent);\n\n let fullResponse = \"\";\n let totalInput = 0;\n let totalOutput = 0;\n let error: Error | undefined;\n\n try {\n for await (const event of this.runner.stream(this.agent, message, {\n messageHistory,\n toolExecutor: this._toolExecutor,\n eventBus: options?.eventBus,\n })) {\n yield event;\n\n // Accumulate response data from events\n if (event.type === \"agent.message.chunk\") {\n fullResponse += event.delta;\n }\n if (event.type === \"agent.message.complete\") {\n fullResponse = event.content;\n totalInput = event.inputTokens;\n totalOutput = event.outputTokens;\n }\n }\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n }\n\n const exchange: Exchange = {\n number: this._exchangeCount,\n invocationId,\n user: message,\n assistant: fullResponse,\n toolCalls: [],\n inputTokens: totalInput,\n outputTokens: totalOutput,\n timestamp: new Date(),\n };\n\n this._history.push(exchange);\n\n if (this._store) {\n await this._persistExchange(exchange);\n }\n\n // Emit conversation end\n const convEndEvent = createEvent(\"agent.conversation.end\", {\n traceId,\n runId,\n conversationId: this.id,\n reason: error ? \"error\" : \"completed\",\n });\n yield convEndEvent;\n await eventBus.publish(convEndEvent);\n\n // Rethrow error after emitting conversation.end\n if (error) {\n throw error;\n }\n }\n\n /**\n * Create a new conversation branch.\n *\n * @param atExchange - Exchange number to branch from (undefined = current)\n */\n async fork(atExchange?: number): Promise<Conversation> {\n const branchPoint = atExchange ?? this._exchangeCount;\n\n const forked = new Conversation(this.agent, this.runner, {\n store: this._store,\n toolExecutor: this._toolExecutor,\n state: { ...this._state },\n });\n\n forked._history = this._history.filter((e) => e.number <= branchPoint);\n forked._exchangeCount = forked._history.length;\n\n return forked;\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n /**\n * Persist an exchange to the store using the new protocol.\n */\n private async _persistExchange(exchange: Exchange): Promise<void> {\n if (!this._store) return;\n\n if (!this._storeConversationId) {\n const conv = await this._store.createConversation(\n this.agent.role.name,\n this.agent.getModel(),\n );\n this._storeConversationId = conv.id;\n }\n\n await this._store.addMessage(this._storeConversationId, \"request\", [\n { type: \"user_prompt\", content: exchange.user },\n ]);\n\n await this._store.addMessage(\n this._storeConversationId,\n \"response\",\n [{ type: \"text\", content: exchange.assistant }],\n {\n inputTokens: exchange.inputTokens,\n outputTokens: exchange.outputTokens,\n },\n );\n }\n\n /**\n * Convert history to canonical message format for runners.\n */\n private _toMessageHistory(): CanonicalMessage[] {\n const messages: CanonicalMessage[] = [];\n for (const exchange of this._history) {\n messages.push({\n kind: \"request\",\n parts: [{ type: \"user_prompt\", content: exchange.user }],\n });\n const parts: CanonicalMessagePart[] = [{ type: \"text\", content: exchange.assistant }];\n for (const tc of exchange.toolCalls) {\n parts.push({\n type: \"tool_call\",\n tool_name: tc.name,\n tool_call_id: tc.id,\n arguments: tc.arguments,\n });\n }\n messages.push({\n kind: \"response\",\n parts,\n });\n }\n return messages;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateUUID(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n","/**\n * ConversationStoreProtocol — structured persistence for conversations.\n *\n * Ported from Python: systems/stores/base.py\n */\n\n// ---------------------------------------------------------------------------\n// ID generation\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Stored record types\n// ---------------------------------------------------------------------------\n\n/** A stored conversation record. */\nexport interface StoredConversation {\n readonly id: string;\n readonly agentName: string;\n readonly model: string;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n readonly metadata: Record<string, unknown>;\n}\n\n/** A stored message within a conversation. */\nexport interface StoredMessage {\n readonly id: string;\n readonly conversationId: string;\n readonly kind: \"request\" | \"response\";\n readonly runId?: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly createdAt: Date;\n readonly parts: StoredMessagePart[];\n}\n\n/** A part of a stored message. */\nexport interface StoredMessagePart {\n readonly id: string;\n readonly messageId: string;\n readonly type: string;\n readonly content?: string;\n readonly metadata: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Protocol\n// ---------------------------------------------------------------------------\n\n/** Structured conversation persistence protocol. */\nexport interface ConversationStoreProtocol {\n createConversation(agentName: string, model: string): Promise<StoredConversation>;\n\n getConversation(conversationId: string): Promise<StoredConversation | null>;\n\n updateConversation(\n conversationId: string,\n updates: Record<string, unknown>,\n ): Promise<StoredConversation>;\n\n addMessage(\n conversationId: string,\n kind: \"request\" | \"response\",\n parts: Array<{\n type: string;\n content?: string;\n metadata?: Record<string, unknown>;\n }>,\n options?: {\n runId?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n ): Promise<StoredMessage>;\n\n getMessages(conversationId: string, limit?: number): Promise<StoredMessage[]>;\n\n getMessageParts(messageId: string): Promise<StoredMessagePart[]>;\n}\n\n// ---------------------------------------------------------------------------\n// MemoryStore\n// ---------------------------------------------------------------------------\n\n/** In-memory implementation of ConversationStoreProtocol. */\nexport class MemoryStore implements ConversationStoreProtocol {\n private _conversations = new Map<string, StoredConversation>();\n private _messages = new Map<string, StoredMessage[]>();\n private _parts = new Map<string, StoredMessagePart[]>();\n\n async createConversation(agentName: string, model: string): Promise<StoredConversation> {\n const now = new Date();\n const conv: StoredConversation = {\n id: generateId(),\n agentName,\n model,\n createdAt: now,\n updatedAt: now,\n metadata: {},\n };\n this._conversations.set(conv.id, conv);\n this._messages.set(conv.id, []);\n return conv;\n }\n\n async getConversation(conversationId: string): Promise<StoredConversation | null> {\n return this._conversations.get(conversationId) ?? null;\n }\n\n async updateConversation(\n conversationId: string,\n updates: Record<string, unknown>,\n ): Promise<StoredConversation> {\n const existing = this._conversations.get(conversationId);\n if (!existing) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n const updated: StoredConversation = {\n ...existing,\n metadata: { ...existing.metadata, ...updates },\n updatedAt: new Date(),\n };\n this._conversations.set(conversationId, updated);\n return updated;\n }\n\n async addMessage(\n conversationId: string,\n kind: \"request\" | \"response\",\n parts: Array<{\n type: string;\n content?: string;\n metadata?: Record<string, unknown>;\n }>,\n options?: {\n runId?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n ): Promise<StoredMessage> {\n const convMessages = this._messages.get(conversationId);\n if (!convMessages) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n\n const messageId = generateId();\n const storedParts: StoredMessagePart[] = parts.map((p) => ({\n id: generateId(),\n messageId,\n type: p.type,\n content: p.content,\n metadata: p.metadata ?? {},\n }));\n\n const msg: StoredMessage = {\n id: messageId,\n conversationId,\n kind,\n runId: options?.runId,\n inputTokens: options?.inputTokens ?? 0,\n outputTokens: options?.outputTokens ?? 0,\n createdAt: new Date(),\n parts: storedParts,\n };\n\n convMessages.push(msg);\n this._parts.set(messageId, storedParts);\n return msg;\n }\n\n async getMessages(conversationId: string, limit?: number): Promise<StoredMessage[]> {\n const msgs = this._messages.get(conversationId) ?? [];\n if (limit !== undefined && limit > 0) {\n return msgs.slice(-limit);\n }\n return [...msgs];\n }\n\n async getMessageParts(messageId: string): Promise<StoredMessagePart[]> {\n return this._parts.get(messageId) ?? [];\n }\n}\n","/**\n * Base exporter protocol and class for event-driven observability.\n *\n * Exporters subscribe to EventBus profiles and handle events for\n * rendering, tracing, or metrics collection.\n *\n * Ported from Python: systems/exporters/base.py\n */\n\nimport type { EventBus } from \"../events/event-bus.js\";\nimport { EventProfile, subscribeProfile, unsubscribeProfile } from \"../events/event-profiles.js\";\nimport type { BaseEvent } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Exporter interface\n// ---------------------------------------------------------------------------\n\n/** Protocol for event exporters. */\nexport interface Exporter {\n attach(bus: EventBus): void;\n detach(bus: EventBus): void;\n}\n\n// ---------------------------------------------------------------------------\n// BaseExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Base class with profile-based subscription.\n *\n * Subclasses set `profile` and implement `_on<Suffix>` methods.\n * The `handleEvent` dispatcher converts event_type to method name:\n * \"agent.message.start\" -> \"_onMessageStart\"\n * \"agent.tool.end\" -> \"_onToolEnd\"\n * \"agent.reasoning\" -> \"_onReasoning\"\n * \"agent.error\" -> \"_onError\"\n */\nexport abstract class BaseExporter implements Exporter {\n profile: EventProfile = EventProfile.UX;\n\n /** Subscribe to all event types in this exporter's profile. */\n attach(bus: EventBus): void {\n subscribeProfile(bus, this.profile, this._boundHandleEvent);\n }\n\n /** Unsubscribe from all event types in this exporter's profile. */\n detach(bus: EventBus): void {\n unsubscribeProfile(bus, this.profile, this._boundHandleEvent);\n }\n\n /**\n * Dispatch to _on<Suffix> methods by event type.\n *\n * Converts event type (e.g. \"agent.message.start\") to handler\n * method name (e.g. \"_onMessageStart\") by stripping the \"agent.\"\n * prefix and converting dot-separated segments to camelCase.\n */\n async handleEvent(event: BaseEvent): Promise<void> {\n const eventType = event.type;\n if (!eventType) return;\n\n // Strip \"agent.\" prefix and convert to camelCase handler name\n const suffix = eventType\n .replace(\"agent.\", \"\")\n .split(\".\")\n .map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))\n .join(\"\");\n\n const handlerName = `_on${suffix.charAt(0).toUpperCase()}${suffix.slice(1)}`;\n\n // biome-ignore lint/suspicious/noExplicitAny: dynamic dispatch by design\n const handler = (this as any)[handlerName];\n if (typeof handler === \"function\") {\n await handler.call(this, event);\n }\n }\n\n /** Bound reference for subscribe/unsubscribe identity. */\n private _boundHandleEvent = (event: BaseEvent) => this.handleEvent(event);\n}\n","/**\n * Console exporter - plain text output for agent execution.\n *\n * Provides terminal output via EventBus subscription.\n * Uses a Logger interface to avoid hard dependency on Node globals.\n *\n * Ported from Python: systems/exporters/console.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n MessageChunkEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ReasoningEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n/** Logger interface for console output. */\nexport interface ConsoleLogger {\n log(message: string): void;\n error(message: string): void;\n write(text: string): void;\n}\n\n/** No-op logger that silently discards output. */\nfunction noopLogger(): ConsoleLogger {\n return {\n log: () => {},\n error: () => {},\n write: () => {},\n };\n}\n\n/**\n * Console exporter that prints agent events to stdout.\n *\n * Subscribes to UX profile events and renders them as plain text.\n */\nexport class ConsoleExporter extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _verbose: boolean;\n private _logger: ConsoleLogger;\n private _contentBuffer: string[] = [];\n private _toolNames = new Map<string, string>();\n\n constructor(options?: { verbose?: boolean; logger?: ConsoleLogger }) {\n super();\n this._verbose = options?.verbose ?? true;\n this._logger = options?.logger ?? noopLogger();\n }\n\n /** @internal */\n async _onMessageStart(_event: MessageStartEvent): Promise<void> {\n if (this._verbose) {\n this._logger.log(\"\");\n this._logger.log(\"-\".repeat(60));\n this._logger.log(\"Agent thinking...\");\n }\n }\n\n /** @internal */\n async _onMessageChunk(event: MessageChunkEvent): Promise<void> {\n this._contentBuffer.push(event.delta);\n this._logger.write(event.delta);\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n // Only render full content if nothing was streamed\n if (this._contentBuffer.length === 0 && event.content) {\n this._logger.log(\"\");\n this._logger.log(event.content);\n }\n\n this._logger.log(\"\"); // Newline after content\n\n if (this._verbose) {\n this._logger.log(\n `Tokens: ${event.inputTokens} in / ${event.outputTokens} out | Model: ${event.model}`,\n );\n }\n\n this._contentBuffer = [];\n }\n\n /** @internal */\n async _onReasoning(event: ReasoningEvent): Promise<void> {\n if (event.isComplete) return;\n if (this._verbose) {\n const content =\n event.content.length > 500 ? `${event.content.slice(0, 500)}...` : event.content;\n this._logger.log(`[Reasoning] ${content}`);\n this._logger.log(\"\");\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n this._toolNames.set(event.toolCallId, event.toolName);\n if (this._verbose) {\n this._logger.log(` Tool: ${event.toolName}...`);\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const toolName = this._toolNames.get(event.toolCallId) ?? event.toolName;\n this._toolNames.delete(event.toolCallId);\n\n if (this._verbose) {\n if (event.error) {\n this._logger.log(` Error: ${event.error}`);\n } else {\n this._logger.log(` Done: ${toolName} (${event.durationMs}ms)`);\n }\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n this._logger.log(\"\");\n this._logger.error(`Error [${event.errorType}]: ${event.message}`);\n }\n}\n\n/**\n * Factory function for console exporter.\n */\nexport function createConsoleExporter(options?: {\n verbose?: boolean;\n logger?: ConsoleLogger;\n}): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n","/**\n * Langfuse exporter - LLM observability with traces and generations.\n *\n * Exports agent events to Langfuse for LLM-specific observability\n * including traces, generations (LLM calls), and spans (tool calls).\n *\n * Requires @langfuse/langfuse as an optional peer dependency.\n *\n * Ported from Python: systems/exporters/langfuse.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n LLMCallStartEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ReasoningEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Langfuse client interface (minimal shape)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal interface for Langfuse client.\n *\n * Users provide the real Langfuse client from @langfuse/langfuse.\n * We define this interface to avoid a hard dependency.\n */\nexport interface LangfuseClient {\n startSpan(params: Record<string, unknown>): LangfuseSpan;\n flush(): void;\n}\n\n/** Minimal Langfuse span interface. */\nexport interface LangfuseSpan {\n startSpan(params: Record<string, unknown>): LangfuseSpan;\n startObservation(params: Record<string, unknown>): LangfuseObservation;\n update(params: Record<string, unknown>): void;\n updateTrace(params: Record<string, unknown>): void;\n end(): void;\n}\n\n/** Minimal Langfuse observation interface. */\nexport interface LangfuseObservation {\n update(params: Record<string, unknown>): void;\n end(): void;\n}\n\n// ---------------------------------------------------------------------------\n// LangfuseExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Export agent events to Langfuse for LLM observability.\n *\n * Maps the agent event hierarchy to Langfuse concepts:\n * - MessageStart -> Root span (creates trace implicitly)\n * - LLM calls -> Generation (nested under root/iteration span)\n * - Tool calls -> Generation (nested under root/iteration span)\n * - MessageComplete -> Trace update with final output\n */\nexport class LangfuseExporter extends BaseExporter {\n override profile = EventProfile.OBSERVABILITY;\n\n private langfuse: LangfuseClient;\n private captureContent: boolean;\n private _rootSpans = new Map<string, LangfuseSpan>();\n private _iterationSpans = new Map<string, LangfuseSpan>();\n private _generations = new Map<string, LangfuseObservation>();\n private _spans = new Map<string, LangfuseObservation>();\n private _traceInputSet = new Set<string>();\n private _iterToolNames = new Map<string, string[]>();\n private _iterOutputTokens = new Map<string, number>();\n private _iterUserMessage = new Map<string, string | undefined>();\n private _prevIterToolNames = new Map<string, string[]>();\n\n constructor(options: {\n client: LangfuseClient;\n captureContent?: boolean;\n }) {\n super();\n this.langfuse = options.client;\n this.captureContent = options.captureContent ?? true;\n }\n\n private _toHexId(uuidStr: string): string {\n return uuidStr.replace(/-/g, \"\").toLowerCase();\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n const traceName = event.agentName || \"agent.run\";\n const runId = event.runId;\n const parentSpanId = event.parentSpanId;\n\n let rootSpan: LangfuseSpan;\n if (parentSpanId) {\n const traceId = this._toHexId(event.traceId || runId);\n rootSpan = this.langfuse.startSpan({\n trace_context: {\n trace_id: traceId,\n parent_span_id: this._toHexId(parentSpanId),\n },\n name: \"agent.run\",\n metadata: { run_id: runId },\n });\n } else {\n rootSpan = this.langfuse.startSpan({\n name: \"agent.run\",\n metadata: { run_id: runId },\n });\n }\n\n rootSpan.updateTrace({ name: traceName });\n\n if (event.agentConfig) {\n rootSpan.update({ input: event.agentConfig });\n }\n\n this._rootSpans.set(runId, rootSpan);\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n const rootSpan = this._rootSpans.get(event.runId);\n if (rootSpan) {\n const iterSpan = rootSpan.startSpan({\n name: `iteration.${event.iteration}`,\n metadata: {\n iteration: event.iteration,\n max_iterations: event.maxIterations,\n },\n });\n this._iterationSpans.set(event.runId, iterSpan);\n this._iterToolNames.set(event.runId, []);\n this._iterOutputTokens.set(event.runId, 0);\n }\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n const iterSpan = this._iterationSpans.get(event.runId);\n this._iterationSpans.delete(event.runId);\n\n if (iterSpan) {\n let iterInput: string | undefined;\n let iterOutput: string | undefined;\n\n if (this.captureContent) {\n const prevTools = this._prevIterToolNames.get(event.runId);\n if (prevTools && prevTools.length > 0) {\n iterInput = `Tool results from: ${prevTools.join(\", \")}`;\n } else {\n iterInput = this._iterUserMessage.get(event.runId) ?? undefined;\n }\n\n const toolNames = this._iterToolNames.get(event.runId) ?? [];\n const outputTokens = this._iterOutputTokens.get(event.runId) ?? 0;\n if (toolNames.length > 0) {\n iterOutput = `Called tools: ${toolNames.join(\", \")}`;\n } else {\n iterOutput = `Final response (${outputTokens} tokens)`;\n }\n }\n\n const toolNames = this._iterToolNames.get(event.runId) ?? [];\n this._iterToolNames.delete(event.runId);\n if (toolNames.length > 0) {\n this._prevIterToolNames.set(event.runId, toolNames);\n } else {\n this._prevIterToolNames.delete(event.runId);\n }\n this._iterOutputTokens.delete(event.runId);\n\n iterSpan.update({\n input: iterInput,\n output: iterOutput,\n metadata: {\n iteration: event.iteration,\n tool_calls_count: event.toolCallsCount,\n has_more: event.hasMore,\n },\n });\n iterSpan.end();\n }\n }\n\n /** @internal */\n async _onLlmStart(event: LLMCallStartEvent): Promise<void> {\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const generation = parent.startObservation({\n as_type: \"generation\",\n name: \"llm.call\",\n model: event.model,\n });\n this._generations.set(event.spanId, generation);\n }\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n const generation = this._generations.get(event.spanId);\n this._generations.delete(event.spanId);\n\n if (generation) {\n generation.update({\n usage_details: {\n input: event.inputTokens,\n output: event.outputTokens,\n },\n metadata: { finish_reason: event.finishReason },\n });\n generation.end();\n\n if (this._iterOutputTokens.has(event.runId)) {\n this._iterOutputTokens.set(event.runId, event.outputTokens);\n }\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n const toolNames = this._iterToolNames.get(event.runId);\n if (toolNames) {\n toolNames.push(event.toolName);\n }\n\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const observation = parent.startObservation({\n as_type: \"generation\",\n name: `tool.${event.toolName}`,\n input: this.captureContent ? event.arguments : undefined,\n });\n this._spans.set(event.spanId, observation);\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const observation = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n\n if (observation) {\n const metadata: Record<string, unknown> = {\n duration_ms: event.durationMs,\n };\n if (event.resultTokens) {\n metadata.result_tokens = event.resultTokens;\n }\n\n const updateKwargs: Record<string, unknown> = {\n output: this.captureContent ? event.result : undefined,\n metadata,\n };\n if (event.resultTokens) {\n updateKwargs.usage_details = {\n output: event.resultTokens,\n total: event.resultTokens,\n };\n }\n\n observation.update(updateKwargs);\n observation.end();\n }\n }\n\n /** @internal */\n async _onReasoning(event: ReasoningEvent): Promise<void> {\n if (!event.isComplete) return;\n\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const reasoningSpan = parent.startSpan({\n name: \"reasoning\",\n output: this.captureContent ? event.content : undefined,\n });\n reasoningSpan.end();\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const errorSpan = parent.startSpan({\n name: \"error\",\n input: { error_type: event.errorType, message: event.message },\n level: \"ERROR\",\n });\n errorSpan.end();\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n this._traceInputSet.delete(event.runId);\n this._iterUserMessage.delete(event.runId);\n this._prevIterToolNames.delete(event.runId);\n this._iterToolNames.delete(event.runId);\n this._iterOutputTokens.delete(event.runId);\n\n const rootSpan = this._rootSpans.get(event.runId);\n this._rootSpans.delete(event.runId);\n\n if (rootSpan) {\n rootSpan.update({\n output: this.captureContent ? event.content : undefined,\n });\n rootSpan.updateTrace({\n output: this.captureContent ? event.content : undefined,\n metadata: {\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n model: event.model,\n },\n });\n rootSpan.end();\n }\n }\n\n /** Flush pending events to Langfuse. */\n flush(): void {\n this.langfuse.flush();\n }\n}\n","/**\n * OpenTelemetry exporter - spans to OTLP collector.\n *\n * Exports agent events as OpenTelemetry spans following Gen AI\n * semantic conventions for LLM observability.\n *\n * Requires @opentelemetry/api as an optional peer dependency.\n *\n * Ported from Python: systems/exporters/otel.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n LLMCallStartEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// OTel interfaces (minimal shape to avoid hard dependency)\n// ---------------------------------------------------------------------------\n\n/** Minimal OTel Span interface. */\nexport interface OTelSpan {\n setAttribute(key: string, value: string | number | boolean): void;\n setStatus(status: { code: number; message?: string }): void;\n recordException(error: Error): void;\n end(): void;\n}\n\n/** Minimal OTel Tracer interface. */\nexport interface OTelTracer {\n startSpan(name: string, options?: Record<string, unknown>): OTelSpan;\n}\n\n/** OTel StatusCode constants. */\nexport const OTelStatusCode = {\n OK: 1,\n ERROR: 2,\n} as const;\n\n// ---------------------------------------------------------------------------\n// OTelExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Export agent events as OpenTelemetry spans.\n *\n * Maps the agent event hierarchy to OTel spans:\n * agent.run (root) -> iteration -> llm_call / tool_call\n *\n * Follows Gen AI semantic conventions:\n * - gen_ai.system = \"vercel-ai-sdk\"\n * - gen_ai.request.model = model name\n * - gen_ai.usage.input_tokens / output_tokens\n */\nexport class OTelExporter extends BaseExporter {\n override profile = EventProfile.OBSERVABILITY;\n\n private tracer: OTelTracer;\n /** Whether to capture prompt/completion content in spans. */\n readonly captureContent: boolean;\n private _spans = new Map<string, OTelSpan>();\n\n constructor(options: {\n tracer: OTelTracer;\n captureContent?: boolean;\n }) {\n super();\n this.tracer = options.tracer;\n this.captureContent = options.captureContent ?? false;\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n const span = this.tracer.startSpan(\"agent.run\");\n span.setAttribute(\"agent.run_id\", event.runId);\n if (event.traceId) {\n span.setAttribute(\"agent.trace_id\", event.traceId);\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n const span = this.tracer.startSpan(`agent.iteration.${event.iteration}`);\n span.setAttribute(\"agent.iteration\", event.iteration);\n span.setAttribute(\"agent.max_iterations\", event.maxIterations);\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"agent.tool_calls_count\", event.toolCallsCount);\n span.setAttribute(\"agent.has_more\", event.hasMore);\n span.end();\n }\n }\n\n /** @internal */\n async _onLlmStart(event: LLMCallStartEvent): Promise<void> {\n const span = this.tracer.startSpan(\"gen_ai.chat\");\n span.setAttribute(\"gen_ai.system\", \"vercel-ai-sdk\");\n span.setAttribute(\"gen_ai.request.model\", event.model);\n span.setAttribute(\"gen_ai.request.message_count\", event.messageCount);\n if (this.captureContent) {\n span.setAttribute(\"gen_ai.request.has_tools\", event.hasTools);\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"gen_ai.usage.input_tokens\", event.inputTokens);\n span.setAttribute(\"gen_ai.usage.output_tokens\", event.outputTokens);\n span.setAttribute(\"gen_ai.response.finish_reason\", event.finishReason);\n span.setAttribute(\"gen_ai.response.duration_ms\", event.durationMs);\n span.end();\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n const span = this.tracer.startSpan(`tool.${event.toolName}`);\n span.setAttribute(\"tool.name\", event.toolName);\n span.setAttribute(\"tool.call_id\", event.toolCallId);\n if (event.arguments) {\n span.setAttribute(\"tool.arguments\", JSON.stringify(event.arguments));\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"tool.duration_ms\", event.durationMs);\n if (event.error) {\n span.setStatus({ code: OTelStatusCode.ERROR, message: event.error });\n } else {\n span.setStatus({ code: OTelStatusCode.OK });\n }\n span.end();\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n const parentSpanId = event.parentSpanId;\n if (parentSpanId) {\n const span = this._spans.get(parentSpanId);\n if (span) {\n span.setStatus({\n code: OTelStatusCode.ERROR,\n message: event.message,\n });\n span.recordException(new Error(event.message));\n span.setAttribute(\"error.type\", event.errorType);\n }\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"agent.model\", event.model);\n span.setAttribute(\"agent.input_tokens\", event.inputTokens);\n span.setAttribute(\"agent.output_tokens\", event.outputTokens);\n span.end();\n }\n }\n}\n","/**\n * SSE Exporter — Fan-out broadcast to connected admin dashboard clients.\n *\n * Extends BaseExporter with UX profile. Formats events using SSEFormatter\n * and broadcasts to all connected ReadableStream clients.\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type { BaseEvent } from \"../events/types.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport { SSEFormatter } from \"../transport/sse-formatter.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SSEExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Broadcasts agent events as SSE frames to connected clients.\n *\n * Usage:\n * const exporter = new SSEExporter();\n * exporter.attach(eventBus);\n * const stream = exporter.connect(); // return to HTTP response\n * // Later:\n * exporter.disconnect(stream);\n */\nexport class SSEExporter extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _clients = new Map<\n ReadableStream<Uint8Array>,\n ReadableStreamDefaultController<Uint8Array>\n >();\n private _formatter = new SSEFormatter();\n private _encoder = new TextEncoder();\n\n /** Connect a new client. Returns a ReadableStream to pipe to the HTTP response. */\n connect(): ReadableStream<Uint8Array> {\n let savedController: ReadableStreamDefaultController<Uint8Array>;\n const stream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n savedController = controller;\n },\n });\n this._clients.set(stream, savedController!);\n return stream;\n }\n\n /** Disconnect a client stream. */\n disconnect(stream: ReadableStream<Uint8Array>): void {\n const controller = this._clients.get(stream);\n if (controller) {\n try {\n controller.close();\n } catch {\n // Already closed\n }\n this._clients.delete(stream);\n }\n }\n\n /** Number of connected clients. */\n get clientCount(): number {\n return this._clients.size;\n }\n\n /** Handle any event by broadcasting to all connected clients. */\n override async handleEvent(event: BaseEvent): Promise<void> {\n const frame = this._formatter.format(event as AgentEvent);\n if (!frame) return;\n\n const encoded = this._encoder.encode(frame);\n for (const [stream, controller] of this._clients) {\n try {\n controller.enqueue(encoded);\n } catch {\n // Client disconnected, clean up\n this._clients.delete(stream);\n }\n }\n }\n}\n","/**\n * Coordinator role preset - orchestrates specialist agents within an agency.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport { type Capability, Persona, type Role, RoleBuilder } from \"@agentic-patterns/core\";\nimport { QUALITY_REVIEW, ROUTING } from \"./judgments.js\";\nimport { ORCHESTRATION, QUALITY_GATE } from \"./responsibilities.js\";\n\n/**\n * Role that orchestrates specialist agents within an agency.\n *\n * A coordinator routes work to specialists, manages execution\n * sequence, and reviews output quality. It never performs\n * specialist work directly.\n */\nexport function coordinatorRole(options?: {\n capability?: Capability;\n}): Role {\n const builder = new RoleBuilder(\"Coordinator\")\n .withPersona(\n new Persona({\n identity:\n \"an orchestration specialist who routes work to the right specialist and reviews output quality\",\n tone: \"Direct and structured. State the action, delegate, evaluate the result.\",\n priorities: [\n \"Route each request to the correct specialist based on the task type\",\n \"Never perform specialist work directly — always delegate via tools\",\n \"Review specialist output for quality before returning\",\n \"Handle failures gracefully — retry or report clearly\",\n ],\n principles: [\n \"The coordinator orchestrates but does not do the domain work\",\n \"Quality review catches structural issues, not domain errors\",\n \"When in doubt about routing, gather more information first\",\n ],\n }),\n )\n .withJudgment(ROUTING)\n .withJudgment(QUALITY_REVIEW)\n .withResponsibility(ORCHESTRATION)\n .withResponsibility(QUALITY_GATE)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Judgments for orchestration archetypes.\n *\n * Ported from Python: library/orchestration/judgments.py\n */\n\nimport { Judgment } from \"@agentic-patterns/core\";\n\nexport const ROUTING = new Judgment({\n domain: \"work_routing\",\n heuristics: [\n \"Match the request type to the specialist with the closest capability\",\n \"When a request spans multiple specialists, sequence them logically\",\n \"Prefer the most specific specialist over a general-purpose one\",\n \"If the request is ambiguous, gather more information before routing\",\n ],\n constraints: [\n \"Never perform specialist work directly — always delegate\",\n \"Do not skip prerequisite steps (e.g., classification before description)\",\n \"Route to at most one specialist per step — do not fan out unless explicitly needed\",\n ],\n escalation_triggers: [\n \"All available specialists reject the request\",\n \"The request requires capabilities no specialist has\",\n ],\n examples: [\n {\n scenario: \"User asks 'describe the Champion field and then update it'\",\n good: \"Route to classify first, then describe, then check eligibility, then update — sequential, each step uses the previous result\",\n bad: \"Call describe and update simultaneously — update needs the description as context\",\n reasoning: \"Multi-step requests must be sequenced when later steps depend on earlier results\",\n },\n ],\n});\n\nexport const QUALITY_REVIEW = new Judgment({\n domain: \"output_quality\",\n heuristics: [\n \"Check that structured output has all required fields populated\",\n \"Verify that claims or proposals cite specific evidence\",\n \"Accept abstention as a valid and often preferred outcome\",\n \"Flag when output is technically valid but suspiciously brief or generic\",\n ],\n constraints: [\n \"Do not retry more than once for quality issues — report clearly instead\",\n \"Quality review checks structure, not domain correctness\",\n \"Never silently accept output that fails structural checks\",\n ],\n escalation_triggers: [\n \"Specialist output is unparseable after retry\",\n \"Output consistently fails quality checks\",\n ],\n examples: [\n {\n scenario: \"Proposal has a value but no evidence citations\",\n good: \"Reject — every proposed value must cite specific evidence. Ask specialist to retry.\",\n bad: \"Accept because the value looks reasonable\",\n reasoning:\n \"Structural quality gates enforce evidence requirements regardless of how plausible the value seems\",\n },\n ],\n});\n\nexport const INTENT_CLASSIFICATION = new Judgment({\n domain: \"user_intent\",\n heuristics: [\n \"Look for action verbs: 'describe', 'update', 'analyze', 'explain'\",\n \"Match domain nouns to registered extensions: 'field', 'deal', 'email'\",\n \"Consider conversation history — a follow-up may not repeat the domain\",\n \"When intent is ambiguous, ask a clarifying question rather than guessing\",\n ],\n constraints: [\n \"Never fabricate a response without routing to a specialist\",\n \"If no extension matches, say so — do not attempt to handle it directly\",\n \"Respect the user's explicit extension targeting if provided\",\n ],\n escalation_triggers: [\n \"User expresses frustration with routing\",\n \"The same request has been misrouted twice\",\n ],\n examples: [\n {\n scenario: \"User says 'describe the Champion field'\",\n good: \"Route to field_pipeline — 'describe' + 'field' maps clearly to field processing\",\n bad: \"Ask 'did you mean Salesforce?' — the intent is already clear\",\n reasoning: \"When action verb + domain noun match an extension, route immediately\",\n },\n ],\n});\n\nexport const RETRIEVAL_STRATEGY = new Judgment({\n domain: \"information_retrieval\",\n heuristics: [\n \"Decompose broad requests into specific, targeted search queries\",\n \"Start narrow (specific names, dates, amounts), broaden if results are sparse\",\n \"Cross-reference results from multiple queries to find corroborating evidence\",\n \"Prefer recent evidence over older evidence when both exist\",\n \"Stop searching when you have sufficient evidence for each requested dimension\",\n \"If a dimension has zero results after 2-3 queries, flag it as a gap rather than keep searching\",\n ],\n constraints: [\n \"Never fabricate facts — only return what the search tools actually found\",\n \"Always include the fact ID so the requesting agent can cite it\",\n \"Organize results by the dimensions the requester asked for, not by search query\",\n \"Return a coverage assessment — what was found vs what was requested\",\n ],\n escalation_triggers: [\n \"Critical dimension has zero evidence after multiple query strategies\",\n \"Search tools return errors or timeouts repeatedly\",\n ],\n examples: [\n {\n scenario: \"Request for 'evidence for MEDDPICC champion'\",\n good: \"Search 'champion', 'internal advocate', 'sponsor' -> organize by champion actions found\",\n bad: \"Search only 'champion' and return nothing when the term isn't used verbatim\",\n reasoning:\n \"Broad concepts need multiple query synonyms — a champion may be called an advocate or sponsor in the source material\",\n },\n {\n scenario: \"Request for 'competitive threats'\",\n good: \"Search 'competitor', known company names, 'alternative' -> flag if no competition evidence found\",\n bad: \"Keep searching with increasingly vague terms after 3 queries return nothing\",\n reasoning:\n \"After 2-3 targeted queries with no results, flag the gap — over-searching wastes tokens and returns noise\",\n },\n ],\n});\n\nexport const EVIDENCE_QUALITY = new Judgment({\n domain: \"evidence_quality\",\n heuristics: [\n \"Specificity beats vagueness — named entities, dates, and numbers are stronger evidence\",\n \"Recency matters — recent evidence outweighs older evidence unless the older is more authoritative\",\n \"Source authority matters — a CEO statement carries more weight than hearsay\",\n \"Corroboration strengthens — the same signal from multiple sources increases confidence\",\n \"Absence of evidence is not evidence of absence — flag gaps, don't fill them with assumptions\",\n ],\n constraints: [\n \"Never infer what is not explicitly stated in the evidence\",\n \"Score 0 for dimensions with no evidence, not 'unknown'\",\n \"Distinguish between 'not mentioned' (gap) and 'mentioned negatively' (risk)\",\n ],\n escalation_triggers: [\n \"Critical dimension has zero evidence\",\n \"Evidence is contradictory across sources\",\n ],\n examples: [\n {\n scenario: \"Two sources: email says '$2M cost' and transcript says 'significant cost'\",\n good: \"Use $2M — it's specific and quantified. Note the transcript corroborates qualitatively.\",\n bad: \"Average them or pick the less specific one\",\n reasoning: \"Specific quantified evidence always wins over vague qualitative statements\",\n },\n ],\n});\n","/**\n * Responsibilities for orchestration archetypes.\n *\n * Ported from Python: library/orchestration/responsibilities.py\n */\n\nimport { Responsibility } from \"@agentic-patterns/core\";\n\nexport const ORCHESTRATION = new Responsibility({\n key: \"orchestration\",\n name: \"Work Orchestration\",\n description:\n \"Route work to the correct specialist, manage execution sequence, and handle failures\",\n examples: [\n \"Determine which specialist should handle a request\",\n \"Sequence dependent tasks (classify before describe)\",\n \"Retry a specialist call if the first attempt fails\",\n ],\n});\n\nexport const QUALITY_GATE = new Responsibility({\n key: \"quality_gate\",\n name: \"Output Quality Review\",\n description: \"Review specialist output for structural quality before returning to the caller\",\n examples: [\n \"Check that a proposal includes required evidence citations\",\n \"Verify that all expected fields are populated\",\n \"Flag when a specialist abstains and explain why\",\n ],\n});\n\nexport const INTENT_ROUTING = new Responsibility({\n key: \"intent_routing\",\n name: \"Intent Classification & Routing\",\n description:\n \"Understand the user's request, classify their intent, and route to the right agency or agent\",\n examples: [\n \"Route 'describe the Champion field' to the field pipeline agency\",\n \"Route 'how is the deal going?' to the deal analysis agency\",\n \"Ask for clarification when the intent is ambiguous\",\n ],\n});\n\nexport const RESPONSE_SYNTHESIS = new Responsibility({\n key: \"response_synthesis\",\n name: \"Response Synthesis\",\n description: \"Combine specialist responses into coherent, user-facing answers\",\n examples: [\n \"Summarize a technical analysis for a non-technical user\",\n \"Explain why a recommendation was made, citing the evidence\",\n \"Present options when multiple agencies could handle the request\",\n ],\n});\n\nexport const INFORMATION_RETRIEVAL = new Responsibility({\n key: \"information_retrieval\",\n name: \"Information Retrieval\",\n description:\n \"Decompose information requests into targeted searches, execute them, filter for relevance, and organize results by the requester's stated dimensions\",\n examples: [\n \"Break 'find MEDDPICC evidence' into queries for each dimension\",\n \"Search for champion evidence using synonyms: champion, advocate, sponsor\",\n \"Return a coverage map showing which dimensions have evidence and which are gaps\",\n ],\n});\n\nexport const ANALYSIS = new Responsibility({\n key: \"analysis\",\n name: \"Evidence-Based Analysis\",\n description: \"Apply specialized judgment to produce a typed, evidence-backed assessment\",\n examples: [\n \"Score qualification fields based on evidence strength\",\n \"Assess risk flags with severity and supporting evidence\",\n \"Track momentum patterns across time-series data\",\n ],\n});\n","/**\n * Orchestrator role preset - conversational routing agent.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport { type Capability, Persona, type Role, RoleBuilder } from \"@agentic-patterns/core\";\nimport { INTENT_CLASSIFICATION } from \"./judgments.js\";\nimport { INTENT_ROUTING, RESPONSE_SYNTHESIS } from \"./responsibilities.js\";\n\n/**\n * Role that understands user intent and routes to agencies/agents.\n *\n * An orchestrator is the chat-facing agent that interprets what\n * users want, routes to the right specialist team, and synthesizes\n * responses. It maintains conversational context across turns.\n */\nexport function orchestratorRole(options?: {\n capability?: Capability;\n}): Role {\n const builder = new RoleBuilder(\"Orchestrator\")\n .withPersona(\n new Persona({\n identity:\n \"a conversational agent who understands what users need and connects them to the right specialist team\",\n tone: \"Warm but efficient. Acknowledge the request, route it, synthesize the response.\",\n priorities: [\n \"Understand the user's intent before routing\",\n \"Route to the most relevant extension or agency\",\n \"Synthesize specialist responses into coherent user-facing answers\",\n \"Maintain conversational context across turns\",\n ],\n principles: [\n \"Ask for clarification rather than guessing incorrectly\",\n \"The orchestrator facilitates but does not do the specialist work\",\n \"When multiple agencies could handle a request, explain the options\",\n ],\n }),\n )\n .withJudgment(INTENT_CLASSIFICATION)\n .withResponsibility(INTENT_ROUTING)\n .withResponsibility(RESPONSE_SYNTHESIS)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Analyst role preset - specialized judgment for evidence-based assessments.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport {\n type Capability,\n type Judgment,\n Persona,\n type Role,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\nimport { EVIDENCE_QUALITY } from \"./judgments.js\";\nimport { ANALYSIS } from \"./responsibilities.js\";\n\n/**\n * Role that applies specialized judgment to produce typed assessments.\n *\n * An analyst receives pre-gathered context and applies domain-specific\n * judgment heuristics to produce a structured, evidence-backed\n * assessment. Analysts do not gather data -- they reason over it.\n */\nexport function analystRole(options?: {\n domain?: string;\n capability?: Capability;\n extraJudgments?: Judgment[];\n}): Role {\n const domain = options?.domain ?? \"general\";\n\n const builder = new RoleBuilder(\"Analyst\")\n .withPersona(\n new Persona({\n identity: `a specialist analyst focused on ${domain}`,\n tone: \"Analytical and precise. Score with evidence, cite specifics, flag gaps explicitly.\",\n priorities: [\n \"Base every assessment on evidence found in the provided context\",\n \"Score dimensions quantitatively where possible (0-100)\",\n \"Explicitly flag gaps — dimensions with no evidence\",\n \"Distinguish between strong evidence and weak signals\",\n ],\n principles: [\n \"Never infer what is not explicitly stated in the evidence\",\n \"Absence of evidence is a gap to flag, not a value to guess\",\n \"Specificity and recency strengthen evidence quality\",\n ],\n }),\n )\n .withJudgment(EVIDENCE_QUALITY)\n .withResponsibility(ANALYSIS)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.extraJudgments) {\n for (const j of options.extraJudgments) {\n builder.withJudgment(j);\n }\n }\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Retrieval role preset - knowledge researcher.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport {\n type Capability,\n type Judgment,\n Persona,\n type Role,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\nimport { EVIDENCE_QUALITY, RETRIEVAL_STRATEGY } from \"./judgments.js\";\nimport { INFORMATION_RETRIEVAL } from \"./responsibilities.js\";\n\n/**\n * Role that finds and organizes relevant evidence from data sources.\n *\n * A retrieval agent decomposes information requests into targeted\n * search queries, executes them systematically, and organizes results\n * by the requester's stated dimensions.\n */\nexport function retrievalRole(options?: {\n capability?: Capability;\n extraJudgments?: Judgment[];\n}): Role {\n const builder = new RoleBuilder(\"Retrieval\")\n .withPersona(\n new Persona({\n identity:\n \"an intelligence analyst who finds and organizes relevant evidence from available data sources\",\n tone: \"Precise and organized. Report what was found, flag what wasn't, never fabricate.\",\n priorities: [\n \"Decompose requests into effective, targeted search queries\",\n \"Search systematically — start narrow, broaden only if needed\",\n \"Organize results by the requester's stated dimensions, not by query\",\n \"Flag gaps explicitly — missing evidence is valuable information\",\n ],\n principles: [\n \"Only return evidence actually found by search tools\",\n \"Stop searching when sufficient evidence is gathered for each dimension\",\n \"Gaps are valuable information — report them, don't fill them with guesses\",\n ],\n }),\n )\n .withJudgment(RETRIEVAL_STRATEGY)\n .withJudgment(EVIDENCE_QUALITY)\n .withResponsibility(INFORMATION_RETRIEVAL)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.extraJudgments) {\n for (const j of options.extraJudgments) {\n builder.withJudgment(j);\n }\n }\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Calculator agent preset — a fully-built agent that performs arithmetic\n * and algebraic calculations using dedicated tools.\n */\n\nimport {\n AgentBuilder,\n Capability,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n type ToolDefinition,\n Toolbox,\n} from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Toolbox\n// ---------------------------------------------------------------------------\n\nexport class CalculatorToolbox extends Toolbox {\n readonly name = \"calculator_operations\";\n readonly description = \"Arithmetic and algebraic calculator operations\";\n\n readonly tools: Record<string, ToolDefinition> = {\n add: {\n description: \"Add two numbers together\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a + b };\n },\n },\n subtract: {\n description: \"Subtract the second number from the first\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a - b };\n },\n },\n multiply: {\n description: \"Multiply two numbers together\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a * b };\n },\n },\n divide: {\n description: \"Divide the first number by the second\",\n parameters: z.object({\n a: z.number().describe(\"Dividend\"),\n b: z.number().describe(\"Divisor\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n if (b === 0) {\n throw new Error(\"Division by zero is undefined\");\n }\n return { result: a / b };\n },\n },\n power: {\n description: \"Raise a base to an exponent\",\n parameters: z.object({\n base: z.number().describe(\"Base number\"),\n exponent: z.number().describe(\"Exponent\"),\n }),\n execute: async (args) => {\n const { base, exponent } = args as { base: number; exponent: number };\n return { result: base ** exponent };\n },\n },\n sqrt: {\n description: \"Compute the square root of a number\",\n parameters: z.object({\n n: z.number().describe(\"Number to take the square root of\"),\n }),\n execute: async (args) => {\n const { n } = args as { n: number };\n if (n < 0) {\n throw new Error(\"Square root of a negative number is undefined\");\n }\n return { result: Math.sqrt(n) };\n },\n },\n percentage: {\n description: \"Calculate what percent% of value is\",\n parameters: z.object({\n value: z.number().describe(\"The base value\"),\n percent: z.number().describe(\"The percentage to compute\"),\n }),\n execute: async (args) => {\n const { value, percent } = args as { value: number; percent: number };\n return { result: (value * percent) / 100 };\n },\n },\n modulo: {\n description: \"Compute the remainder of dividing a by b\",\n parameters: z.object({\n a: z.number().describe(\"Dividend\"),\n b: z.number().describe(\"Divisor\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a % b };\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Agent builder\n// ---------------------------------------------------------------------------\n\nexport function buildCalculatorAgent() {\n const toolbox = new CalculatorToolbox();\n\n const role = new RoleBuilder(\"calculator-assistant\")\n .withPersona(\n new Persona({\n identity: \"A precise calculator that shows its work step by step\",\n tone: \"concise and mathematical\",\n priorities: [\"accuracy\", \"showing work\"],\n principles: [\"Always use the provided calculator tools — never do mental math\"],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"arithmetic and algebra\",\n heuristics: [\n \"Use the provided tools for every calculation\",\n \"Break compound expressions into sequential tool calls\",\n ],\n constraints: [\"Only answer math and numerical reasoning questions\"],\n }),\n )\n .withCapability(\n new Capability(\"calculator_operations\", \"Arithmetic and algebraic calculations\", toolbox),\n )\n .withResponsibility(\n new Responsibility({\n key: \"calculate\",\n name: \"Perform Calculations\",\n description: \"Perform calculations accurately using tools\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective: \"Help users with math calculations, compound operations, and numerical reasoning\",\n success_criteria: [\n \"Correct answers verified by tool use\",\n \"Work shown step by step\",\n \"Tools used for every calculation\",\n ],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Todo Manager agent preset.\n *\n * Provides an in-memory task list managed through five tools:\n * create_task, list_tasks, complete_task, delete_task, update_task.\n */\n\nimport {\n AgentBuilder,\n Capability,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n type ToolDefinition,\n Toolbox,\n} from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// In-memory task store\n// ---------------------------------------------------------------------------\n\ninterface Task {\n id: string;\n title: string;\n description?: string;\n status: \"pending\" | \"done\";\n}\n\nconst tasks = new Map<string, Task>();\nlet nextId = 1;\n\n// ---------------------------------------------------------------------------\n// TodoToolbox\n// ---------------------------------------------------------------------------\n\nexport class TodoToolbox extends Toolbox {\n readonly name = \"task_management\";\n readonly description = \"In-memory task list management\";\n\n readonly tools: Record<string, ToolDefinition> = {\n create_task: {\n description: \"Create a new task\",\n parameters: z.object({\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Optional task description\"),\n }),\n execute: async (args) => {\n const { title, description } = args as { title: string; description?: string };\n const id = `task-${nextId++}`;\n const task: Task = { id, title, description, status: \"pending\" };\n tasks.set(id, task);\n return { id: task.id, title: task.title, status: task.status };\n },\n },\n\n list_tasks: {\n description: \"List tasks, optionally filtered by status\",\n parameters: z.object({\n status: z\n .enum([\"pending\", \"done\"])\n .optional()\n .describe(\"Filter by status (pending or done)\"),\n }),\n execute: async (args) => {\n const { status } = args as { status?: \"pending\" | \"done\" };\n const all = Array.from(tasks.values());\n const filtered = status ? all.filter((t) => t.status === status) : all;\n return { tasks: filtered };\n },\n },\n\n complete_task: {\n description: \"Mark a task as done\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to complete\"),\n }),\n execute: async (args) => {\n const { id } = args as { id: string };\n const task = tasks.get(id);\n if (!task) {\n throw new Error(`Task not found: ${id}`);\n }\n task.status = \"done\";\n return { ...task };\n },\n },\n\n delete_task: {\n description: \"Delete a task\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to delete\"),\n }),\n execute: async (args) => {\n const { id } = args as { id: string };\n if (!tasks.has(id)) {\n throw new Error(`Task not found: ${id}`);\n }\n tasks.delete(id);\n return { deleted: true };\n },\n },\n\n update_task: {\n description: \"Update a task's title or description\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to update\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n }),\n execute: async (args) => {\n const { id, title, description } = args as {\n id: string;\n title?: string;\n description?: string;\n };\n const task = tasks.get(id);\n if (!task) {\n throw new Error(`Task not found: ${id}`);\n }\n if (title !== undefined) {\n task.title = title;\n }\n if (description !== undefined) {\n task.description = description;\n }\n return { ...task };\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// buildTodoAgent\n// ---------------------------------------------------------------------------\n\nexport function buildTodoAgent() {\n const role = new RoleBuilder(\"todo-manager\")\n .withPersona(\n new Persona({\n identity: \"An organized task manager that keeps things structured\",\n tone: \"helpful and structured\",\n priorities: [\"organization\", \"clarity\", \"completeness\"],\n principles: [\n \"Always confirm what was done after each action\",\n \"List remaining tasks proactively when asked about status\",\n ],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"task and project management\",\n heuristics: [\"Use the provided tools for all task operations\"],\n constraints: [\"Only manage tasks using the available tools\"],\n }),\n )\n .withCapability(new Capability(\"task_management\", \"Task Management\", new TodoToolbox()))\n .withResponsibility(\n new Responsibility({\n key: \"manage-tasks\",\n name: \"Manage Tasks\",\n description: \"Manage tasks — create, update, complete, and organize\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective: \"Help users manage their task lists efficiently using the provided tools\",\n success_criteria: [\n \"Tasks created and tracked accurately\",\n \"Tools used appropriately for all operations\",\n ],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Writing Coach — a tools-free agent preset that demonstrates\n * pure persona + reasoning without any toolbox or capability.\n */\n\nimport {\n AgentBuilder,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\n\nexport function buildWritingCoachAgent() {\n const role = new RoleBuilder(\"writing-coach\")\n .withPersona(\n new Persona({\n identity:\n \"An experienced writing coach who helps improve clarity, structure, and style. You give specific, actionable feedback — not vague praise.\",\n tone: \"encouraging but direct — like a good editor\",\n priorities: [\"clarity\", \"conciseness\", \"structure\", \"voice\"],\n principles: [\n \"Always explain WHY a change improves the writing, not just what to change\",\n \"Give concrete before/after examples when suggesting edits\",\n \"Preserve the author's voice — improve, don't rewrite\",\n \"Focus on the most impactful issues first, don't nitpick everything at once\",\n ],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"writing, editing, and communication\",\n heuristics: [\"Start with structure, then clarity, then style\"],\n constraints: [\n \"Never rewrite entire paragraphs without permission — suggest changes inline\",\n ],\n }),\n )\n .withResponsibility(\n new Responsibility({\n key: \"review\",\n name: \"Review and Improve Writing\",\n description: \"Review and improve written content\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective:\n \"Help users write more clearly and effectively by providing specific, actionable feedback on their text\",\n success_criteria: [\"Improved clarity\", \"Preserved author voice\", \"Actionable suggestions\"],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Workflow base types — shared types, events, hooks, and helpers\n * that all workflow patterns depend on.\n *\n * Ported from Python: workflows/base.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunResult, RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\n\n// Re-export AgentLike so workflow consumers don't need to import from runner\nexport type { AgentLike } from \"../runner/agent-runner.js\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\n/** Shared context passed through workflow steps. */\nexport type PatternContext = Record<string, unknown>;\n\n/** A message template: either a static string or a function that builds one. */\nexport type MessageTemplate = string | ((context: PatternContext) => string);\n\n// ---------------------------------------------------------------------------\n// Step\n// ---------------------------------------------------------------------------\n\n/** A single step in a workflow pattern. */\nexport interface Step {\n readonly agent: AgentLike;\n readonly messageTemplate: MessageTemplate;\n readonly name?: string;\n readonly outputKey?: string;\n readonly contextExtractor?: (result: StepResult, context: PatternContext) => PatternContext;\n}\n\n// ---------------------------------------------------------------------------\n// StepResult\n// ---------------------------------------------------------------------------\n\n/** Result of executing a single step. */\nexport interface StepResult {\n readonly stepName: string;\n readonly runResult: RunResult;\n /** Shortcut for `runResult.response`. */\n readonly content: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n}\n\n/**\n * Create a frozen StepResult from a RunResult.\n */\nexport function createStepResult(stepName: string, runResult: RunResult): StepResult {\n return Object.freeze({\n stepName,\n runResult,\n content: runResult.response,\n inputTokens: runResult.inputTokens,\n outputTokens: runResult.outputTokens,\n });\n}\n\n// ---------------------------------------------------------------------------\n// PatternResult\n// ---------------------------------------------------------------------------\n\n/** Aggregate result of a workflow pattern execution. */\nexport interface PatternResult {\n readonly totalInputTokens: number;\n readonly totalOutputTokens: number;\n readonly succeeded: boolean;\n readonly finalContent: string;\n}\n\n// ---------------------------------------------------------------------------\n// PatternEvent — discriminated union of 7 event types\n// ---------------------------------------------------------------------------\n\nexport interface PatternStartEvent {\n readonly type: \"pattern.start\";\n readonly patternName: string;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepStartEvent {\n readonly type: \"pattern.step.start\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepCompleteEvent {\n readonly type: \"pattern.step.complete\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly result: StepResult;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepErrorEvent {\n readonly type: \"pattern.step.error\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly error: Error;\n readonly timestamp: Date;\n}\n\nexport interface PatternIterationStartEvent {\n readonly type: \"pattern.iteration.start\";\n readonly iteration: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternIterationCompleteEvent {\n readonly type: \"pattern.iteration.complete\";\n readonly iteration: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternCompleteEvent {\n readonly type: \"pattern.complete\";\n readonly patternName: string;\n readonly result: PatternResult;\n readonly timestamp: Date;\n}\n\nexport type PatternEvent =\n | PatternStartEvent\n | PatternStepStartEvent\n | PatternStepCompleteEvent\n | PatternStepErrorEvent\n | PatternIterationStartEvent\n | PatternIterationCompleteEvent\n | PatternCompleteEvent;\n\n// ---------------------------------------------------------------------------\n// PatternHooks\n// ---------------------------------------------------------------------------\n\n/**\n * Callbacks for pattern lifecycle events.\n *\n * NOTE: These are workflow-level hooks for pattern orchestration.\n * They are NOT the same as the deprecated runner-level Hooks interface.\n */\nexport interface PatternHooks {\n onPatternStart?: (event: PatternStartEvent) => void | Promise<void>;\n onStepStart?: (event: PatternStepStartEvent) => void | Promise<void>;\n onStepComplete?: (event: PatternStepCompleteEvent) => void | Promise<void>;\n onStepError?: (event: PatternStepErrorEvent) => void | Promise<void>;\n onIterationStart?: (event: PatternIterationStartEvent) => void | Promise<void>;\n onIterationComplete?: (event: PatternIterationCompleteEvent) => void | Promise<void>;\n onPatternComplete?: (event: PatternCompleteEvent) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// PatternRunOptions\n// ---------------------------------------------------------------------------\n\n/** Options passed to pattern.run(). */\nexport interface PatternRunOptions {\n readonly runner: RunnerProtocol;\n readonly hooks?: PatternHooks;\n readonly toolExecutor?: ToolExecutor;\n readonly traceId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PatternProtocol\n// ---------------------------------------------------------------------------\n\n/** Interface that all workflow patterns implement. */\nexport interface PatternProtocol {\n run(context?: PatternContext, options?: PatternRunOptions): Promise<PatternResult>;\n}\n\n// ---------------------------------------------------------------------------\n// GoalEvaluatorProtocol\n// ---------------------------------------------------------------------------\n\n/** Result tuple: [achieved, reason, confident]. */\nexport type GoalEvaluationResult = readonly [achieved: boolean, reason: string, confident: boolean];\n\n/** Protocol for evaluating whether a goal has been achieved. */\nexport interface GoalEvaluatorProtocol {\n evaluate(goal: string, output: string, context?: PatternContext): Promise<GoalEvaluationResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a message template to a string.\n */\nexport function resolveMessage(template: MessageTemplate, context: PatternContext): string {\n if (typeof template === \"string\") {\n return template;\n }\n return template(context);\n}\n\n/**\n * Generate a step name, falling back to `step_<index>` if none provided.\n */\nexport function makeStepName(name: string | undefined, index: number): string {\n if (name !== undefined && name !== \"\") {\n return name;\n }\n return `step_${index}`;\n}\n\n/**\n * Execute a single step: resolve message, run agent, return result.\n */\nexport async function executeStep(\n step: Step,\n context: PatternContext,\n runner: RunnerProtocol,\n toolExecutor?: ToolExecutor,\n): Promise<StepResult> {\n const message = resolveMessage(step.messageTemplate, context);\n const runResult = await runner.run(step.agent, message, { toolExecutor });\n const stepName = makeStepName(step.name, 0);\n return createStepResult(stepName, runResult);\n}\n","/**\n * Sequential — Chain agents in sequence, threading context through the pipeline.\n *\n * Ported from Python: workflows/compositions/sequential.py\n */\n\nimport type {\n PatternContext,\n PatternProtocol,\n PatternResult,\n PatternRunOptions,\n Step,\n StepResult,\n} from \"./base.js\";\nimport { createStepResult, makeStepName, resolveMessage } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SequentialResult\n// ---------------------------------------------------------------------------\n\nexport interface SequentialResult extends PatternResult {\n readonly steps: ReadonlyArray<StepResult | PatternResult>;\n readonly finalContext: Readonly<PatternContext>;\n}\n\n// ---------------------------------------------------------------------------\n// SequentialOptions\n// ---------------------------------------------------------------------------\n\nexport interface SequentialOptions {\n readonly continueOnError?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Sequential\n// ---------------------------------------------------------------------------\n\n/**\n * Chain agents in sequence, threading context through the pipeline.\n *\n * Each step reads context, writes via `outputKey` and `contextExtractor`.\n * Supports nested patterns (any PatternProtocol) as steps.\n *\n * Example:\n * const seq = new Sequential([\n * { agent: writer, messageTemplate: \"Write about {topic}\" },\n * { agent: reviewer, messageTemplate: (ctx) => `Review: ${ctx.draft}` },\n * ]);\n */\nexport class Sequential implements PatternProtocol {\n private readonly steps: ReadonlyArray<Step | PatternProtocol>;\n private readonly continueOnError: boolean;\n\n constructor(steps: Array<Step | PatternProtocol>, options?: SequentialOptions) {\n this.steps = steps;\n this.continueOnError = options?.continueOnError ?? false;\n }\n\n async run(context: PatternContext = {}, options?: PatternRunOptions): Promise<SequentialResult> {\n const runner = options?.runner;\n const hooks = options?.hooks;\n const toolExecutor = options?.toolExecutor;\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"Sequential\",\n timestamp: new Date(),\n });\n\n let currentContext = { ...context };\n const stepResults: Array<StepResult | PatternResult> = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let succeeded = true;\n let finalContent = \"\";\n\n for (let i = 0; i < this.steps.length; i++) {\n const step = this.steps[i]!;\n\n await hooks?.onStepStart?.({\n type: \"pattern.step.start\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n timestamp: new Date(),\n });\n\n try {\n let result: StepResult | PatternResult;\n\n if (isStep(step)) {\n if (!runner) {\n throw new Error(\"Runner is required for Step execution\");\n }\n const message = resolveMessage(step.messageTemplate, currentContext);\n const runResult = await runner.run(step.agent, message, {\n toolExecutor,\n });\n const stepName = makeStepName(step.name, i);\n const stepResult = createStepResult(stepName, runResult);\n\n // Update context\n if (step.outputKey) {\n currentContext[step.outputKey] = stepResult.content;\n }\n if (step.contextExtractor) {\n currentContext = {\n ...currentContext,\n ...step.contextExtractor(stepResult, currentContext),\n };\n }\n\n result = stepResult;\n totalInputTokens += stepResult.inputTokens;\n totalOutputTokens += stepResult.outputTokens;\n finalContent = stepResult.content;\n } else {\n // Nested pattern\n const nestedResult = await step.run(currentContext, options);\n result = nestedResult;\n totalInputTokens += nestedResult.totalInputTokens;\n totalOutputTokens += nestedResult.totalOutputTokens;\n finalContent = nestedResult.finalContent;\n if (!nestedResult.succeeded) {\n succeeded = false;\n }\n }\n\n stepResults.push(result);\n\n await hooks?.onStepComplete?.({\n type: \"pattern.step.complete\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n result: isStepResult(result)\n ? result\n : createStepResult(`nested_${i}`, {\n response: result.finalContent,\n inputTokens: result.totalInputTokens,\n outputTokens: result.totalOutputTokens,\n toolCallsCount: 0,\n iterations: 1,\n finishReason: \"stop\",\n }),\n timestamp: new Date(),\n });\n } catch (error) {\n succeeded = false;\n const err = error instanceof Error ? error : new Error(String(error));\n\n await hooks?.onStepError?.({\n type: \"pattern.step.error\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n error: err,\n timestamp: new Date(),\n });\n\n if (!this.continueOnError) {\n break;\n }\n }\n }\n\n const result: SequentialResult = Object.freeze({\n steps: Object.freeze(stepResults),\n finalContext: Object.freeze(currentContext),\n totalInputTokens,\n totalOutputTokens,\n succeeded,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"Sequential\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nfunction isStep(step: Step | PatternProtocol): step is Step {\n return \"agent\" in step && \"messageTemplate\" in step;\n}\n\nfunction isStepResult(result: StepResult | PatternResult): result is StepResult {\n return \"stepName\" in result;\n}\n","/**\n * Parallel — Fan-out agents in parallel with optional concurrency limiting.\n *\n * Ported from Python: workflows/compositions/parallel.py\n */\n\nimport type {\n PatternContext,\n PatternProtocol,\n PatternResult,\n PatternRunOptions,\n Step,\n StepResult,\n} from \"./base.js\";\nimport { createStepResult, makeStepName, resolveMessage } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Consolidator\n// ---------------------------------------------------------------------------\n\n/** Consolidator: reduce step results to a single value. */\nexport type Consolidator = (results: StepResult[]) => unknown;\n\n/** Collect all step contents into an array. */\nexport function collectContents(results: StepResult[]): string[] {\n return results.map((r) => r.content);\n}\n\n/** Collect step contents keyed by step name. */\nexport function collectByName(results: StepResult[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const r of results) {\n out[r.stepName] = r.content;\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// ParallelResult\n// ---------------------------------------------------------------------------\n\nexport interface ParallelResult extends PatternResult {\n readonly results: ReadonlyArray<StepResult | Error>;\n readonly successful: ReadonlyArray<StepResult>;\n readonly failed: ReadonlyArray<readonly [number, Error]>;\n readonly consolidatedOutput: Readonly<Record<string, unknown>>;\n readonly allSucceeded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// ParallelOptions\n// ---------------------------------------------------------------------------\n\nexport interface ParallelOptions {\n readonly outputKey?: string;\n readonly consolidator?: Consolidator;\n readonly returnExceptions?: boolean;\n readonly maxConcurrency?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Parallel\n// ---------------------------------------------------------------------------\n\n/**\n * Fan-out agents in parallel with optional concurrency limiting.\n *\n * All steps receive the same context snapshot.\n * Results preserve input order.\n *\n * Example:\n * const par = new Parallel([\n * { agent: analyst1, messageTemplate: \"Analyze data\" },\n * { agent: analyst2, messageTemplate: \"Analyze data\" },\n * ], { maxConcurrency: 2 });\n */\nexport class Parallel implements PatternProtocol {\n private readonly steps: ReadonlyArray<Step>;\n private readonly outputKey: string | undefined;\n private readonly consolidator: Consolidator | undefined;\n private readonly returnExceptions: boolean;\n private readonly maxConcurrency: number | undefined;\n\n constructor(steps: Step[], options?: ParallelOptions) {\n this.steps = steps;\n this.outputKey = options?.outputKey;\n this.consolidator = options?.consolidator;\n this.returnExceptions = options?.returnExceptions ?? true;\n this.maxConcurrency = options?.maxConcurrency;\n }\n\n async run(context: PatternContext = {}, options?: PatternRunOptions): Promise<ParallelResult> {\n const runner = options?.runner;\n const hooks = options?.hooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for Parallel execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"Parallel\",\n timestamp: new Date(),\n });\n\n const contextSnapshot = { ...context };\n const orderedResults: Array<StepResult | Error> = new Array(this.steps.length);\n\n const executeOne = async (index: number): Promise<void> => {\n const step = this.steps[index]!;\n const stepName = makeStepName(step.name, index);\n\n await hooks?.onStepStart?.({\n type: \"pattern.step.start\",\n stepName,\n stepIndex: index,\n timestamp: new Date(),\n });\n\n try {\n const message = resolveMessage(step.messageTemplate, contextSnapshot);\n const runResult = await runner.run(step.agent, message, { toolExecutor });\n const stepResult = createStepResult(stepName, runResult);\n orderedResults[index] = stepResult;\n\n await hooks?.onStepComplete?.({\n type: \"pattern.step.complete\",\n stepName,\n stepIndex: index,\n result: stepResult,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n orderedResults[index] = err;\n\n await hooks?.onStepError?.({\n type: \"pattern.step.error\",\n stepName,\n stepIndex: index,\n error: err,\n timestamp: new Date(),\n });\n\n if (!this.returnExceptions) {\n throw err;\n }\n }\n };\n\n if (this.maxConcurrency && this.maxConcurrency > 0) {\n await runWithConcurrency(\n this.steps.map((_, i) => () => executeOne(i)),\n this.maxConcurrency,\n );\n } else {\n await Promise.all(this.steps.map((_, i) => executeOne(i)));\n }\n\n const successful: StepResult[] = [];\n const failed: Array<readonly [number, Error]> = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (let i = 0; i < orderedResults.length; i++) {\n const r = orderedResults[i]!;\n if (r instanceof Error) {\n failed.push([i, r] as const);\n } else {\n successful.push(r);\n totalInputTokens += r.inputTokens;\n totalOutputTokens += r.outputTokens;\n }\n }\n\n let consolidatedOutput: Record<string, unknown> = {};\n if (this.consolidator && successful.length > 0) {\n const consolidated = this.consolidator(successful);\n if (this.outputKey) {\n consolidatedOutput[this.outputKey] = consolidated;\n } else {\n consolidatedOutput = { consolidated };\n }\n }\n\n const allSucceeded = failed.length === 0;\n const finalContent = successful.length > 0 ? successful[successful.length - 1]!.content : \"\";\n\n const result: ParallelResult = Object.freeze({\n results: Object.freeze(orderedResults),\n successful: Object.freeze(successful),\n failed: Object.freeze(failed),\n consolidatedOutput: Object.freeze(consolidatedOutput),\n allSucceeded,\n totalInputTokens,\n totalOutputTokens,\n succeeded: allSucceeded,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"Parallel\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Concurrency pool\n// ---------------------------------------------------------------------------\n\nasync function runWithConcurrency(\n tasks: Array<() => Promise<void>>,\n maxConcurrency: number,\n): Promise<void> {\n const executing = new Set<Promise<void>>();\n for (const task of tasks) {\n const p = task().then(() => {\n executing.delete(p);\n });\n executing.add(p);\n if (executing.size >= maxConcurrency) {\n await Promise.race(executing);\n }\n }\n await Promise.all(executing);\n}\n","/**\n * RetryLoop — Generic async retry wrapper with pluggable backoff strategies.\n *\n * Not agent-specific — wraps any `() => Promise<T>`.\n *\n * Ported from Python: workflows/loops/retry.py\n */\n\nimport type { PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Backoff strategies\n// ---------------------------------------------------------------------------\n\n/** Backoff strategy: given an attempt number (0-based), return delay in ms. */\nexport interface BackoffStrategy {\n getDelay(attempt: number): number;\n}\n\n/** Fixed delay between retries. */\nexport class FixedBackoff implements BackoffStrategy {\n constructor(private readonly delayMs: number) {}\n getDelay(_attempt: number): number {\n return this.delayMs;\n }\n}\n\n/** Exponential backoff: baseMs * 2^attempt, capped at maxMs. */\nexport class ExponentialBackoff implements BackoffStrategy {\n constructor(\n private readonly baseMs: number = 1000,\n private readonly maxMs: number = 60000,\n ) {}\n getDelay(attempt: number): number {\n return Math.min(this.baseMs * 2 ** attempt, this.maxMs);\n }\n}\n\n/** Jittered exponential backoff: adds random jitter to exponential delay. */\nexport class JitteredBackoff implements BackoffStrategy {\n private readonly exponential: ExponentialBackoff;\n constructor(baseMs = 1000, maxMs = 60000) {\n this.exponential = new ExponentialBackoff(baseMs, maxMs);\n }\n getDelay(attempt: number): number {\n const base = this.exponential.getDelay(attempt);\n return Math.floor(base * (0.5 + Math.random() * 0.5));\n }\n}\n\n// ---------------------------------------------------------------------------\n// RetryResult\n// ---------------------------------------------------------------------------\n\n/** Exit reason for a retry loop. */\nexport type RetryExitReason = \"success\" | \"max_attempts\" | \"fatal_error\" | \"timeout\";\n\n/** Result of a retry loop execution. */\nexport interface RetryResult<T> extends PatternResult {\n readonly exitReason: RetryExitReason;\n readonly attempts: number;\n readonly value?: T;\n readonly lastError?: Error;\n}\n\n// ---------------------------------------------------------------------------\n// RetryLoop options\n// ---------------------------------------------------------------------------\n\nexport interface RetryLoopOptions {\n readonly maxAttempts?: number;\n readonly backoff?: BackoffStrategy;\n readonly timeoutMs?: number;\n readonly fatalErrors?: ReadonlyArray<abstract new (...args: never[]) => Error>;\n readonly onRetry?: (attempt: number, error: Error) => void | Promise<void>;\n readonly hooks?: PatternHooks;\n}\n\nexport interface RetryRunOptions {\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// RetryLoop\n// ---------------------------------------------------------------------------\n\n/**\n * Generic async retry wrapper with pluggable backoff.\n *\n * Example:\n * const loop = new RetryLoop<string>({ maxAttempts: 3 });\n * const result = await loop.run(async () => fetchData());\n */\nexport class RetryLoop<T> {\n private readonly maxAttempts: number;\n private readonly backoff: BackoffStrategy;\n private readonly timeoutMs: number | undefined;\n private readonly fatalErrors: ReadonlyArray<abstract new (...args: never[]) => Error>;\n private readonly onRetry: ((attempt: number, error: Error) => void | Promise<void>) | undefined;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(options: RetryLoopOptions = {}) {\n this.maxAttempts = options.maxAttempts ?? 3;\n this.backoff = options.backoff ?? new ExponentialBackoff();\n this.timeoutMs = options.timeoutMs;\n this.fatalErrors = options.fatalErrors ?? [];\n this.onRetry = options.onRetry;\n this.defaultHooks = options.hooks;\n }\n\n async run(fn: () => Promise<T>, options?: RetryRunOptions): Promise<RetryResult<T>> {\n const hooks = options?.hooks ?? this.defaultHooks;\n const startTime = Date.now();\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"RetryLoop\",\n timestamp: new Date(),\n });\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n // Check timeout before each attempt\n if (this.timeoutMs !== undefined && Date.now() - startTime >= this.timeoutMs) {\n const result = this.buildResult(\"timeout\", attempt, undefined, lastError);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n try {\n const value = await fn();\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n const result = this.buildResult(\"success\", attempt + 1, value, undefined);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n lastError = err;\n\n // Check for fatal errors\n if (this.isFatal(err)) {\n const result = this.buildResult(\"fatal_error\", attempt + 1, undefined, err);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n // Don't retry after the last attempt\n if (attempt < this.maxAttempts - 1) {\n await this.onRetry?.(attempt, err);\n const delayMs = this.backoff.getDelay(attempt);\n await sleep(delayMs);\n }\n }\n }\n\n const result = this.buildResult(\"max_attempts\", this.maxAttempts, undefined, lastError);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n private isFatal(error: Error): boolean {\n return this.fatalErrors.some((cls) => error instanceof cls);\n }\n\n private buildResult(\n exitReason: RetryExitReason,\n attempts: number,\n value: T | undefined,\n lastError: Error | undefined,\n ): RetryResult<T> {\n return Object.freeze({\n exitReason,\n attempts,\n value,\n lastError,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n succeeded: exitReason === \"success\",\n finalContent: \"\",\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Goal Evaluators — Four implementations of GoalEvaluatorProtocol,\n * ranked cheapest to most expensive.\n *\n * Ported from Python: workflows/evaluators.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol } from \"../runner/types.js\";\nimport type { GoalEvaluationResult, GoalEvaluatorProtocol, PatternContext } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SimpleGoalEvaluator — pattern matching (no LLM call)\n// ---------------------------------------------------------------------------\n\nexport interface SimpleGoalEvaluatorOptions {\n readonly successPatterns?: readonly string[];\n readonly failurePatterns?: readonly string[];\n}\n\n/**\n * Pattern-matching evaluator: checks output for success/failure substrings.\n * Returns not-confident if no patterns match.\n */\nexport class SimpleGoalEvaluator implements GoalEvaluatorProtocol {\n private readonly successPatterns: readonly string[];\n private readonly failurePatterns: readonly string[];\n\n constructor(options: SimpleGoalEvaluatorOptions = {}) {\n this.successPatterns = options.successPatterns ?? [\"GOAL_ACHIEVED\", \"TASK_COMPLETE\", \"SUCCESS\"];\n this.failurePatterns = options.failurePatterns ?? [\"CANNOT_PROCEED\", \"FAILED\", \"ERROR\"];\n }\n\n async evaluate(\n _goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const upper = output.toUpperCase();\n\n for (const pattern of this.successPatterns) {\n if (upper.includes(pattern.toUpperCase())) {\n return [true, `Matched success pattern: ${pattern}`, true] as const;\n }\n }\n\n for (const pattern of this.failurePatterns) {\n if (upper.includes(pattern.toUpperCase())) {\n return [false, `Matched failure pattern: ${pattern}`, true] as const;\n }\n }\n\n return [false, \"No patterns matched\", false] as const;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SelfEvalGoalEvaluator — parses GOAL_STATUS/PROGRESS markers\n// ---------------------------------------------------------------------------\n\n/**\n * Parses agent output for structured markers:\n * GOAL_STATUS: ACHIEVED|NOT_ACHIEVED\n * PROGRESS: <text>\n */\nexport class SelfEvalGoalEvaluator implements GoalEvaluatorProtocol {\n async evaluate(\n _goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const statusMatch = /GOAL_STATUS:\\s*(ACHIEVED|NOT_ACHIEVED)/i.exec(output);\n const progressMatch = /PROGRESS:\\s*(.+)/i.exec(output);\n\n if (statusMatch) {\n const achieved = statusMatch[1]?.toUpperCase() === \"ACHIEVED\";\n const reason =\n progressMatch?.[1]?.trim() ?? (achieved ? \"Goal achieved\" : \"Goal not achieved\");\n return [achieved, reason, true] as const;\n }\n\n if (progressMatch) {\n return [false, progressMatch[1]!.trim(), false] as const;\n }\n\n return [false, \"No GOAL_STATUS or PROGRESS markers found\", false] as const;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMGoalEvaluator — uses an evaluator agent\n// ---------------------------------------------------------------------------\n\nexport interface LLMGoalEvaluatorOptions {\n readonly agent: AgentLike;\n readonly runner: RunnerProtocol;\n}\n\n/**\n * Sends goal + output to an evaluator agent, parses GOAL_STATUS from response.\n */\nexport class LLMGoalEvaluator implements GoalEvaluatorProtocol {\n private readonly agent: AgentLike;\n private readonly runner: RunnerProtocol;\n\n constructor(options: LLMGoalEvaluatorOptions) {\n this.agent = options.agent;\n this.runner = options.runner;\n }\n\n async evaluate(\n goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const prompt = [\n \"Evaluate whether the following output achieves the stated goal.\",\n \"\",\n `GOAL: ${goal}`,\n \"\",\n `OUTPUT: ${output}`,\n \"\",\n \"Respond with exactly one of:\",\n \" GOAL_STATUS: ACHIEVED\",\n \" GOAL_STATUS: NOT_ACHIEVED\",\n \"Followed by:\",\n \" PROGRESS: <brief explanation>\",\n ].join(\"\\n\");\n\n const result = await this.runner.run(this.agent, prompt);\n\n // Parse the response using SelfEvalGoalEvaluator logic\n const selfEval = new SelfEvalGoalEvaluator();\n return selfEval.evaluate(goal, result.response);\n }\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorChain — cascade, stopping on first confident result\n// ---------------------------------------------------------------------------\n\n/**\n * Tries evaluators in order, stops on first confident result.\n * Falls back to last result if none are confident.\n */\nexport class EvaluatorChain implements GoalEvaluatorProtocol {\n private readonly evaluators: readonly GoalEvaluatorProtocol[];\n\n constructor(evaluators: GoalEvaluatorProtocol[]) {\n this.evaluators = evaluators;\n }\n\n async evaluate(\n goal: string,\n output: string,\n context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n let lastResult: GoalEvaluationResult = [false, \"No evaluators\", false] as const;\n\n for (const evaluator of this.evaluators) {\n const result = await evaluator.evaluate(goal, output, context);\n lastResult = result;\n\n const [, , confident] = result;\n if (confident) {\n return result;\n }\n }\n\n return lastResult;\n }\n}\n","/**\n * TaskLoop — Goal-driven iterative loop.\n *\n * Runs an agent toward a goal, evaluating progress each iteration.\n *\n * Ported from Python: workflows/loops/task.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { GoalEvaluatorProtocol, PatternContext, PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type TaskExitReason = \"goal_achieved\" | \"max_iterations\" | \"explicit_stop\" | \"error\";\n\nexport interface TaskState {\n readonly iteration: number;\n readonly history: readonly string[];\n getHistorySummary(): string;\n}\n\nexport interface TaskResult extends PatternResult {\n readonly exitReason: TaskExitReason;\n readonly iterations: number;\n readonly state: TaskState;\n}\n\n// ---------------------------------------------------------------------------\n// TaskLoopOptions\n// ---------------------------------------------------------------------------\n\nexport interface TaskLoopOptions {\n readonly maxIterations?: number;\n readonly stopPhrases?: readonly string[];\n readonly includeHistory?: boolean;\n readonly hooks?: PatternHooks;\n}\n\nexport interface TaskRunOptions {\n readonly runner: RunnerProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// TaskLoop\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STOP_PHRASES = [\"TASK_COMPLETE\", \"CANNOT_PROCEED\"];\n\n/**\n * Iterative loop that runs an agent toward a goal, evaluating progress.\n *\n * Example:\n * const loop = new TaskLoop(agent, evaluator, { maxIterations: 5 });\n * const result = await loop.run(\"Write a poem about TypeScript\", {}, { runner });\n */\nexport class TaskLoop {\n private readonly agent: AgentLike;\n private readonly goalEvaluator: GoalEvaluatorProtocol;\n private readonly maxIterations: number;\n private readonly stopPhrases: readonly string[];\n private readonly includeHistory: boolean;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(\n agent: AgentLike,\n goalEvaluator: GoalEvaluatorProtocol,\n options: TaskLoopOptions = {},\n ) {\n this.agent = agent;\n this.goalEvaluator = goalEvaluator;\n this.maxIterations = options.maxIterations ?? 10;\n this.stopPhrases = options.stopPhrases ?? DEFAULT_STOP_PHRASES;\n this.includeHistory = options.includeHistory ?? true;\n this.defaultHooks = options.hooks;\n }\n\n async run(\n goal: string,\n context: PatternContext = {},\n options?: TaskRunOptions,\n ): Promise<TaskResult> {\n const runner = options?.runner;\n const hooks = options?.hooks ?? this.defaultHooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for TaskLoop execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"TaskLoop\",\n timestamp: new Date(),\n });\n\n const history: string[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let exitReason: TaskExitReason = \"max_iterations\";\n let finalContent = \"\";\n\n for (let iteration = 0; iteration < this.maxIterations; iteration++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration,\n timestamp: new Date(),\n });\n\n // Build prompt\n const prompt = this.buildPrompt(goal, history, context);\n\n // Run agent\n const runResult = await runner.run(this.agent, prompt, { toolExecutor });\n const content = runResult.response;\n totalInputTokens += runResult.inputTokens;\n totalOutputTokens += runResult.outputTokens;\n finalContent = content;\n history.push(content);\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration,\n timestamp: new Date(),\n });\n\n // Check stop phrases\n if (this.containsStopPhrase(content)) {\n exitReason = \"explicit_stop\";\n break;\n }\n\n // Evaluate goal\n const [achieved] = await this.goalEvaluator.evaluate(goal, content, context);\n if (achieved) {\n exitReason = \"goal_achieved\";\n break;\n }\n }\n\n const state: TaskState = {\n iteration: history.length,\n history: Object.freeze([...history]),\n getHistorySummary() {\n return history.join(\"\\n---\\n\");\n },\n };\n\n const result: TaskResult = Object.freeze({\n exitReason,\n iterations: history.length,\n state,\n totalInputTokens,\n totalOutputTokens,\n succeeded: exitReason === \"goal_achieved\",\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"TaskLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private buildPrompt(goal: string, history: readonly string[], _context: PatternContext): string {\n const parts = [`GOAL: ${goal}`];\n\n if (this.includeHistory && history.length > 0) {\n parts.push(\"\");\n parts.push(\"PREVIOUS RESPONSES:\");\n for (let i = 0; i < history.length; i++) {\n parts.push(`[Iteration ${i + 1}]: ${history[i]}`);\n }\n }\n\n parts.push(\"\");\n parts.push(\"Continue working toward the goal.\");\n\n return parts.join(\"\\n\");\n }\n\n private containsStopPhrase(content: string): boolean {\n const upper = content.toUpperCase();\n return this.stopPhrases.some((phrase) => upper.includes(phrase.toUpperCase()));\n }\n}\n","/**\n * EvaluatorLoop — Producer-Evaluator Refinement Loop.\n *\n * Producer generates output → evaluator scores + critiques → producer refines.\n * Tracks best output by score, exits on quality/max/plateau/error.\n *\n * Ported from Python: workflows/loops/evaluator.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { PatternContext, PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type RefinementExitReason = \"quality_met\" | \"max_refinements\" | \"no_improvement\" | \"error\";\n\n/** A single evaluation of produced output. */\nexport interface Refinement {\n readonly iteration: number;\n readonly content: string;\n readonly score: number;\n readonly feedback: string;\n}\n\n/** Protocol for evaluating produced output and providing refinement feedback. */\nexport interface RefinementEvaluator {\n evaluate(\n input: string,\n output: string,\n context?: PatternContext,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }>;\n}\n\n/** Result of the evaluator loop. */\nexport interface RefinementResult extends PatternResult {\n readonly exitReason: RefinementExitReason;\n readonly refinements: readonly Refinement[];\n readonly bestOutput: string;\n readonly bestScore: number;\n readonly iterations: number;\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorLoop options\n// ---------------------------------------------------------------------------\n\nexport interface EvaluatorLoopOptions {\n readonly maxRefinements?: number;\n readonly minImprovement?: number;\n readonly hooks?: PatternHooks;\n}\n\nexport interface EvaluatorRunOptions {\n readonly runner: RunnerProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorLoop\n// ---------------------------------------------------------------------------\n\n/**\n * Self-critique refinement loop: producer generates, evaluator scores,\n * producer refines until quality is met or exit conditions are reached.\n *\n * Example:\n * const loop = new EvaluatorLoop(writerAgent, evaluator, { maxRefinements: 3 });\n * const result = await loop.run(\"Write a haiku\", { runner });\n */\nexport class EvaluatorLoop {\n private readonly producer: AgentLike;\n private readonly evaluator: RefinementEvaluator;\n private readonly maxRefinements: number;\n private readonly minImprovement: number;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(\n producer: AgentLike,\n evaluator: RefinementEvaluator,\n options: EvaluatorLoopOptions = {},\n ) {\n this.producer = producer;\n this.evaluator = evaluator;\n this.maxRefinements = options.maxRefinements ?? 5;\n this.minImprovement = options.minImprovement ?? 0.01;\n this.defaultHooks = options.hooks;\n }\n\n async run(input: string, options?: EvaluatorRunOptions): Promise<RefinementResult> {\n const runner = options?.runner;\n const hooks = options?.hooks ?? this.defaultHooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for EvaluatorLoop execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"EvaluatorLoop\",\n timestamp: new Date(),\n });\n\n const refinements: Refinement[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let bestOutput = \"\";\n let bestScore = Number.NEGATIVE_INFINITY;\n let exitReason: RefinementExitReason = \"max_refinements\";\n let previousScore = Number.NEGATIVE_INFINITY;\n let lastFeedback = \"\";\n\n for (let iteration = 0; iteration < this.maxRefinements; iteration++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration,\n timestamp: new Date(),\n });\n\n // Build prompt for producer\n const prompt = this.buildPrompt(input, iteration, lastFeedback);\n\n // Run producer\n const runResult = await runner.run(this.producer, prompt, { toolExecutor });\n const content = runResult.response;\n totalInputTokens += runResult.inputTokens;\n totalOutputTokens += runResult.outputTokens;\n\n // Evaluate output\n const evaluation = await this.evaluator.evaluate(input, content);\n\n const refinement: Refinement = Object.freeze({\n iteration,\n content,\n score: evaluation.score,\n feedback: evaluation.feedback,\n });\n refinements.push(refinement);\n\n // Track best\n if (evaluation.score > bestScore) {\n bestScore = evaluation.score;\n bestOutput = content;\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration,\n timestamp: new Date(),\n });\n\n // Check quality met\n if (evaluation.qualityMet) {\n exitReason = \"quality_met\";\n break;\n }\n\n // Check improvement plateau\n if (iteration > 0 && evaluation.score - previousScore < this.minImprovement) {\n exitReason = \"no_improvement\";\n break;\n }\n\n previousScore = evaluation.score;\n lastFeedback = evaluation.feedback;\n }\n\n const result: RefinementResult = Object.freeze({\n exitReason,\n refinements: Object.freeze(refinements),\n bestOutput,\n bestScore,\n iterations: refinements.length,\n totalInputTokens,\n totalOutputTokens,\n succeeded: exitReason === \"quality_met\",\n finalContent: bestOutput,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"EvaluatorLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private buildPrompt(input: string, iteration: number, feedback: string): string {\n if (iteration === 0) {\n return input;\n }\n return `${input}\\n\\nFEEDBACK FROM EVALUATOR:\\n${feedback}\\n\\nPlease revise your output based on this feedback.`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMRefinementEvaluator\n// ---------------------------------------------------------------------------\n\nexport interface LLMRefinementEvaluatorOptions {\n readonly qualityThreshold?: number;\n}\n\n/**\n * Uses an LLM agent to evaluate output quality, parse score and feedback.\n */\nexport class LLMRefinementEvaluator implements RefinementEvaluator {\n private readonly agent: AgentLike;\n private readonly runner: RunnerProtocol;\n private readonly qualityThreshold: number;\n\n constructor(\n agent: AgentLike,\n runner: RunnerProtocol,\n options: LLMRefinementEvaluatorOptions = {},\n ) {\n this.agent = agent;\n this.runner = runner;\n this.qualityThreshold = options.qualityThreshold ?? 0.8;\n }\n\n async evaluate(\n input: string,\n output: string,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n const prompt = [\n \"Evaluate the following output for the given input.\",\n \"\",\n `INPUT: ${input}`,\n \"\",\n `OUTPUT: ${output}`,\n \"\",\n \"Respond with:\",\n \"SCORE: <number between 0 and 1>\",\n \"FEEDBACK: <your critique>\",\n ].join(\"\\n\");\n\n const result = await this.runner.run(this.agent, prompt);\n const response = result.response;\n\n const scoreMatch = response.match(/SCORE:\\s*([\\d.]+)/);\n const feedbackMatch = response.match(/FEEDBACK:\\s*(.+)/s);\n\n const score = scoreMatch ? Number.parseFloat(scoreMatch[1] ?? \"0\") : 0;\n const feedback = feedbackMatch?.[1]?.trim() ?? \"No feedback provided\";\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// RubricEvaluator\n// ---------------------------------------------------------------------------\n\n/** A single rubric criterion with name, weight, and scoring function. */\nexport interface RubricCriterion {\n readonly name: string;\n readonly weight: number;\n readonly score: (input: string, output: string) => number | Promise<number>;\n}\n\n/**\n * Scores output against a set of weighted rubric criteria.\n */\nexport class RubricEvaluator implements RefinementEvaluator {\n private readonly criteria: readonly RubricCriterion[];\n private readonly qualityThreshold: number;\n\n constructor(criteria: readonly RubricCriterion[], qualityThreshold = 0.8) {\n this.criteria = criteria;\n this.qualityThreshold = qualityThreshold;\n }\n\n async evaluate(\n input: string,\n output: string,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n let totalWeight = 0;\n let weightedSum = 0;\n const feedbackParts: string[] = [];\n\n for (const criterion of this.criteria) {\n const criterionScore = await criterion.score(input, output);\n const clampedScore = Math.max(0, Math.min(1, criterionScore));\n totalWeight += criterion.weight;\n weightedSum += criterion.weight * clampedScore;\n feedbackParts.push(`${criterion.name}: ${clampedScore.toFixed(2)}`);\n }\n\n const score = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const feedback = feedbackParts.join(\"; \");\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// CompositeRefinementEvaluator\n// ---------------------------------------------------------------------------\n\n/** An evaluator with an associated weight for compositing. */\nexport interface WeightedEvaluator {\n readonly evaluator: RefinementEvaluator;\n readonly weight: number;\n}\n\n/**\n * Combines multiple evaluators into a weighted average score.\n */\nexport class CompositeRefinementEvaluator implements RefinementEvaluator {\n private readonly evaluators: readonly WeightedEvaluator[];\n private readonly qualityThreshold: number;\n\n constructor(evaluators: readonly WeightedEvaluator[], qualityThreshold = 0.8) {\n this.evaluators = evaluators;\n this.qualityThreshold = qualityThreshold;\n }\n\n async evaluate(\n input: string,\n output: string,\n context?: PatternContext,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n let totalWeight = 0;\n let weightedSum = 0;\n const feedbackParts: string[] = [];\n\n for (const { evaluator, weight } of this.evaluators) {\n const result = await evaluator.evaluate(input, output, context);\n totalWeight += weight;\n weightedSum += weight * result.score;\n feedbackParts.push(result.feedback);\n }\n\n const score = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const feedback = feedbackParts.join(\"\\n\");\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n","/**\n * ConversationLoop — Multi-turn conversation orchestration.\n *\n * Wraps the Conversation class, driving exchanges via external\n * inputFn/outputFn callbacks. Exits on exit phrase, max exchanges, or error.\n *\n * Ported from Python: workflows/loops/conversation.py\n */\n\nimport { Conversation } from \"../conversation/conversation.js\";\nimport type { ConversationStoreProtocol } from \"../conversation/store.js\";\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ConversationExitReason = \"exit_phrase\" | \"max_exchanges\" | \"input_closed\" | \"error\";\n\nexport interface ConversationResult extends PatternResult {\n readonly exitReason: ConversationExitReason;\n readonly exchangeCount: number;\n readonly conversation: Conversation;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ConversationLoopOptions {\n readonly maxExchanges?: number;\n readonly exitPhrases?: readonly string[];\n readonly store?: ConversationStoreProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\nexport interface ConversationRunOptions {\n readonly runner: RunnerProtocol;\n readonly inputFn: () => string | null | Promise<string | null>;\n readonly outputFn?: (response: string) => void | Promise<void>;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// ConversationLoop\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_EXIT_PHRASES = [\"exit\", \"quit\", \"bye\"];\n\n/**\n * Multi-turn conversation loop with external I/O callbacks.\n *\n * Example:\n * const loop = new ConversationLoop(agent, { maxExchanges: 10 });\n * const result = await loop.run({\n * runner,\n * inputFn: () => readLine(),\n * outputFn: (r) => console.log(r),\n * });\n */\nexport class ConversationLoop {\n private readonly agent: AgentLike;\n private readonly maxExchanges: number;\n private readonly exitPhrases: readonly string[];\n private readonly store: ConversationStoreProtocol | undefined;\n private readonly toolExecutor: ToolExecutor | undefined;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(agent: AgentLike, options: ConversationLoopOptions = {}) {\n this.agent = agent;\n this.maxExchanges = options.maxExchanges ?? 100;\n this.exitPhrases = options.exitPhrases ?? DEFAULT_EXIT_PHRASES;\n this.store = options.store;\n this.toolExecutor = options.toolExecutor;\n this.defaultHooks = options.hooks;\n }\n\n async run(options: ConversationRunOptions): Promise<ConversationResult> {\n const { runner, inputFn, outputFn } = options;\n const hooks = options.hooks ?? this.defaultHooks;\n\n const conversation = new Conversation(this.agent, runner, {\n store: this.store,\n toolExecutor: this.toolExecutor,\n });\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"ConversationLoop\",\n timestamp: new Date(),\n });\n\n let exitReason: ConversationExitReason = \"max_exchanges\";\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let finalContent = \"\";\n\n while (conversation.exchangeCount < this.maxExchanges) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration: conversation.exchangeCount,\n timestamp: new Date(),\n });\n\n // Get user input\n const userInput = await inputFn();\n\n if (userInput === null) {\n exitReason = \"input_closed\";\n break;\n }\n\n // Check exit phrases\n if (this.isExitPhrase(userInput)) {\n exitReason = \"exit_phrase\";\n break;\n }\n\n // Send message and get response\n const exchange = await conversation.send(userInput);\n totalInputTokens += exchange.inputTokens;\n totalOutputTokens += exchange.outputTokens;\n finalContent = exchange.assistant;\n\n // Output callback\n if (outputFn) {\n await outputFn(exchange.assistant);\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: conversation.exchangeCount - 1,\n timestamp: new Date(),\n });\n }\n\n const result: ConversationResult = Object.freeze({\n exitReason,\n exchangeCount: conversation.exchangeCount,\n conversation,\n totalInputTokens,\n totalOutputTokens,\n succeeded: true,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"ConversationLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private isExitPhrase(input: string): boolean {\n const lower = input.toLowerCase().trim();\n return this.exitPhrases.some((phrase) => lower === phrase.toLowerCase());\n }\n}\n","/**\n * Admin Zod schemas for dashboard and observability.\n *\n * Defines validated data shapes for agent statistics,\n * token usage, conversations, and trace data.\n */\n\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Token usage\n// ---------------------------------------------------------------------------\n\nexport const TokenUsageRowSchema = z.object({\n timestamp: z.date(),\n inputTokens: z.number(),\n outputTokens: z.number(),\n totalTokens: z.number(),\n model: z.string(),\n agentName: z.string(),\n});\nexport type TokenUsageRow = z.infer<typeof TokenUsageRowSchema>;\n\n// ---------------------------------------------------------------------------\n// Tool statistics\n// ---------------------------------------------------------------------------\n\nexport const ToolStatsSchema = z.object({\n toolName: z.string(),\n callCount: z.number().int().nonnegative(),\n errorCount: z.number().int().nonnegative(),\n totalDurationMs: z.number().nonnegative(),\n avgDurationMs: z.number().nonnegative(),\n lastUsed: z.date().optional(),\n});\nexport type ToolStats = z.infer<typeof ToolStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Agent statistics\n// ---------------------------------------------------------------------------\n\nexport const AgentStatsSchema = z.object({\n agentName: z.string(),\n status: z.enum([\"idle\", \"running\", \"error\", \"completed\"]),\n totalIterations: z.number().int().nonnegative(),\n totalToolCalls: z.number().int().nonnegative(),\n totalInputTokens: z.number().int().nonnegative(),\n totalOutputTokens: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n startedAt: z.date().optional(),\n lastEventAt: z.date().optional(),\n toolStats: z.array(ToolStatsSchema),\n});\nexport type AgentStats = z.infer<typeof AgentStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Dashboard statistics\n// ---------------------------------------------------------------------------\n\nexport const DashboardStatsSchema = z.object({\n agents: z.array(AgentStatsSchema),\n activeAgentCount: z.number().int().nonnegative(),\n totalTokensUsed: z.number().int().nonnegative(),\n totalToolCalls: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n activeConversationCount: z.number().int().nonnegative(),\n uptimeMs: z.number().nonnegative(),\n});\nexport type DashboardStats = z.infer<typeof DashboardStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Conversation summary\n// ---------------------------------------------------------------------------\n\nexport const ConversationSummarySchema = z.object({\n conversationId: z.string(),\n agentName: z.string(),\n messageCount: z.number().int().nonnegative(),\n tokenCount: z.number().int().nonnegative(),\n startedAt: z.date(),\n lastMessageAt: z.date().optional(),\n status: z.enum([\"active\", \"completed\", \"error\"]),\n});\nexport type ConversationSummary = z.infer<typeof ConversationSummarySchema>;\n\n// ---------------------------------------------------------------------------\n// Trace events\n// ---------------------------------------------------------------------------\n\nexport const TraceEventSchema = z.object({\n type: z.string(),\n timestamp: z.date(),\n spanId: z.string(),\n parentSpanId: z.string().optional(),\n data: z.record(z.unknown()),\n});\nexport type TraceEvent = z.infer<typeof TraceEventSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace iteration\n// ---------------------------------------------------------------------------\n\nexport const TraceIterationSchema = z.object({\n iteration: z.number().int().nonnegative(),\n events: z.array(TraceEventSchema),\n toolCalls: z.number().int().nonnegative(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n});\nexport type TraceIteration = z.infer<typeof TraceIterationSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace response\n// ---------------------------------------------------------------------------\n\nexport const TraceResponseSchema = z.object({\n traceId: z.string(),\n agentName: z.string(),\n iterations: z.array(TraceIterationSchema),\n totalDurationMs: z.number().nonnegative(),\n status: z.enum([\"running\", \"completed\", \"error\"]),\n});\nexport type TraceResponse = z.infer<typeof TraceResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace summary\n// ---------------------------------------------------------------------------\n\nexport const TraceSummarySchema = z.object({\n traceId: z.string(),\n agentName: z.string(),\n startedAt: z.date(),\n durationMs: z.number().nonnegative().optional(),\n status: z.enum([\"running\", \"completed\", \"error\"]),\n iterationCount: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n});\nexport type TraceSummary = z.infer<typeof TraceSummarySchema>;\n\n// ---------------------------------------------------------------------------\n// Date filters\n// ---------------------------------------------------------------------------\n\nexport const DateFiltersSchema = z.object({\n from: z.date().optional(),\n to: z.date().optional(),\n});\nexport type DateFilters = z.infer<typeof DateFiltersSchema>;\n\n// ---------------------------------------------------------------------------\n// Tool analytics (cross-agent aggregation)\n// ---------------------------------------------------------------------------\n\nexport const ToolAnalyticsSchema = z.object({\n toolName: z.string(),\n totalCalls: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n totalDurationMs: z.number().nonnegative(),\n avgDurationMs: z.number().nonnegative(),\n agentBreakdown: z.array(\n z.object({\n agentName: z.string(),\n callCount: z.number().int().nonnegative(),\n }),\n ),\n});\nexport type ToolAnalytics = z.infer<typeof ToolAnalyticsSchema>;\n\n// ---------------------------------------------------------------------------\n// Token usage group (for groupBy queries)\n// ---------------------------------------------------------------------------\n\nexport const TokenUsageGroupSchema = z.object({\n key: z.string(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n conversationCount: z.number().int().nonnegative(),\n});\nexport type TokenUsageGroup = z.infer<typeof TokenUsageGroupSchema>;\n","/**\n * In-memory event collector for admin observability.\n *\n * Extends BaseExporter to subscribe to agent events and maintain\n * live statistics, ring-buffered recent events, and per-agent state.\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n AgentEvent,\n BaseEvent,\n ConversationEndEvent,\n ConversationStartEvent,\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n MessageCancelEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"../exporters/base.js\";\nimport type {\n AgentStats,\n ConversationSummary,\n DashboardStats,\n DateFilters,\n TokenUsageGroup,\n ToolAnalytics,\n ToolStats,\n TraceEvent,\n TraceSummary,\n} from \"./schemas.js\";\n\n// ---------------------------------------------------------------------------\n// Ring buffer\n// ---------------------------------------------------------------------------\n\n/**\n * Fixed-capacity circular buffer with O(1) push and O(n) materialization.\n *\n * Uses a pre-allocated array with head index + length instead of Array.shift()\n * to avoid O(n) reindexing on every push at capacity.\n */\nclass RingBuffer<T> {\n private readonly _items: (T | undefined)[];\n private readonly _capacity: number;\n private _start = 0;\n private _length = 0;\n\n constructor(capacity: number) {\n this._capacity = capacity;\n this._items = new Array(capacity);\n }\n\n push(item: T): void {\n const end = (this._start + this._length) % this._capacity;\n this._items[end] = item;\n if (this._length < this._capacity) {\n this._length += 1;\n } else {\n this._start = (this._start + 1) % this._capacity;\n }\n }\n\n toArray(): T[] {\n const result: T[] = [];\n for (let i = 0; i < this._length; i++) {\n const item = this._items[(this._start + i) % this._capacity];\n if (item !== undefined) result.push(item);\n }\n return result;\n }\n\n get length(): number {\n return this._length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal mutable state\n// ---------------------------------------------------------------------------\n\ninterface MutableAgentStats {\n agentName: string;\n status: \"idle\" | \"running\" | \"error\" | \"completed\";\n totalIterations: number;\n totalToolCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalErrors: number;\n startedAt?: Date;\n lastEventAt?: Date;\n toolStats: Map<string, MutableToolStats>;\n}\n\ninterface MutableToolStats {\n toolName: string;\n callCount: number;\n errorCount: number;\n totalDurationMs: number;\n lastUsed?: Date;\n}\n\n/** Per-call log entry retained in a ring buffer for date-filtered queries. */\ninterface ToolCallLogEntry {\n readonly toolName: string;\n readonly agentName: string;\n readonly durationMs: number;\n readonly isError: boolean;\n readonly timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// InMemoryEventCollector\n// ---------------------------------------------------------------------------\n\n/**\n * Collects agent events in memory for admin dashboard queries.\n *\n * Subscribes to the UX event profile and maintains:\n * - Per-agent statistics (iterations, tokens, tool calls, errors)\n * - Per-tool statistics (call count, duration, errors)\n * - Ring buffer of recent trace events (capped at 1000)\n * - Trace summaries by traceId\n * - Token usage by model\n * - Active conversation tracking\n */\nexport class InMemoryEventCollector extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _startedAt = new Date();\n private _agents = new Map<string, MutableAgentStats>();\n private _recentEvents = new RingBuffer<TraceEvent>(1000);\n /** Bounded log of individual tool calls, used for date-filtered analytics. */\n private _toolCallLog = new RingBuffer<ToolCallLogEntry>(10_000);\n private _traces = new Map<\n string,\n {\n agentName: string;\n startedAt: Date;\n iterationCount: number;\n totalTokens: number;\n status: \"running\" | \"completed\" | \"error\";\n }\n >();\n private _tokensByModel = new Map<\n string,\n { input: number; output: number; conversations: Set<string> }\n >();\n private _activeConversations = new Set<string>();\n\n // ---------------------------------------------------------------------------\n // Query methods\n // ---------------------------------------------------------------------------\n\n /** Get dashboard-level aggregate statistics. */\n getDashboardStats(): DashboardStats {\n const agents = this._getAgentStatsList();\n return {\n agents,\n activeAgentCount: agents.filter((a) => a.status === \"running\").length,\n activeConversationCount: this._activeConversations.size,\n totalTokensUsed: agents.reduce((sum, a) => sum + a.totalInputTokens + a.totalOutputTokens, 0),\n totalToolCalls: agents.reduce((sum, a) => sum + a.totalToolCalls, 0),\n totalErrors: agents.reduce((sum, a) => sum + a.totalErrors, 0),\n uptimeMs: Date.now() - this._startedAt.getTime(),\n };\n }\n\n /** Get statistics for a specific agent. */\n getAgentStats(agentName: string): AgentStats | undefined {\n const internal = this._agents.get(agentName);\n if (!internal) return undefined;\n return this._toAgentStats(internal);\n }\n\n /** Get all agent statistics. */\n getAllAgentStats(): AgentStats[] {\n return this._getAgentStatsList();\n }\n\n /** Get recent trace events from the ring buffer. */\n getRecentEvents(limit?: number): TraceEvent[] {\n const all = this._recentEvents.toArray();\n if (limit !== undefined && limit < all.length) {\n return all.slice(all.length - limit);\n }\n return all;\n }\n\n /** Get all trace summaries. */\n getTraceSummaries(): TraceSummary[] {\n const summaries: TraceSummary[] = [];\n for (const [traceId, trace] of this._traces) {\n summaries.push({\n traceId,\n agentName: trace.agentName,\n startedAt: trace.startedAt,\n durationMs: Date.now() - trace.startedAt.getTime(),\n status: trace.status,\n iterationCount: trace.iterationCount,\n totalTokens: trace.totalTokens,\n });\n }\n return summaries;\n }\n\n /** Get conversations (derived from traces). */\n getConversations(): ConversationSummary[] {\n const conversations: ConversationSummary[] = [];\n for (const [traceId, trace] of this._traces) {\n conversations.push({\n conversationId: traceId,\n agentName: trace.agentName,\n messageCount: trace.iterationCount,\n tokenCount: trace.totalTokens,\n startedAt: trace.startedAt,\n status: trace.status === \"running\" ? \"active\" : trace.status,\n });\n }\n return conversations;\n }\n\n /**\n * Get cross-agent tool analytics.\n *\n * When `filters` specify a date range, aggregation runs over the\n * per-call log (bounded to the most recent 10,000 calls). Without\n * filters, uses the lifetime aggregates on each agent.\n */\n getToolAnalytics(filters?: DateFilters): ToolAnalytics[] {\n if (filters && (filters.from || filters.to)) {\n return this._getToolAnalyticsFromLog(filters);\n }\n\n const toolMap = new Map<\n string,\n {\n totalCalls: number;\n totalErrors: number;\n totalDurationMs: number;\n agentBreakdown: Map<string, number>;\n }\n >();\n\n for (const agent of this._agents.values()) {\n for (const ts of agent.toolStats.values()) {\n let entry = toolMap.get(ts.toolName);\n if (!entry) {\n entry = {\n totalCalls: 0,\n totalErrors: 0,\n totalDurationMs: 0,\n agentBreakdown: new Map(),\n };\n toolMap.set(ts.toolName, entry);\n }\n entry.totalCalls += ts.callCount;\n entry.totalErrors += ts.errorCount;\n entry.totalDurationMs += ts.totalDurationMs;\n entry.agentBreakdown.set(\n agent.agentName,\n (entry.agentBreakdown.get(agent.agentName) ?? 0) + ts.callCount,\n );\n }\n }\n\n const result: ToolAnalytics[] = [];\n for (const [toolName, entry] of toolMap) {\n const agentBreakdown = Array.from(entry.agentBreakdown.entries()).map(\n ([agentName, callCount]) => ({ agentName, callCount }),\n );\n result.push({\n toolName,\n totalCalls: entry.totalCalls,\n totalErrors: entry.totalErrors,\n totalDurationMs: entry.totalDurationMs,\n avgDurationMs: entry.totalCalls > 0 ? entry.totalDurationMs / entry.totalCalls : 0,\n agentBreakdown,\n });\n }\n return result;\n }\n\n /** Get token usage grouped by agent or model. */\n getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): TokenUsageGroup[] {\n if (params.groupBy === \"agent\") {\n return this._getAgentStatsList().map((a) => ({\n key: a.agentName,\n inputTokens: a.totalInputTokens,\n outputTokens: a.totalOutputTokens,\n totalTokens: a.totalInputTokens + a.totalOutputTokens,\n conversationCount: 0,\n }));\n }\n\n // groupBy model\n const result: TokenUsageGroup[] = [];\n for (const [model, entry] of this._tokensByModel) {\n result.push({\n key: model,\n inputTokens: entry.input,\n outputTokens: entry.output,\n totalTokens: entry.input + entry.output,\n conversationCount: entry.conversations.size,\n });\n }\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // Event dispatch (overrides BaseExporter's dynamic _on* dispatch with an\n // explicit switch so the compiler catches new event types in AgentEvent\n // that do not yet have a handler.)\n // ---------------------------------------------------------------------------\n\n override async handleEvent(event: BaseEvent): Promise<void> {\n const typed = event as AgentEvent;\n switch (typed.type) {\n case \"agent.conversation.start\":\n await this._onConversationStart(typed);\n return;\n case \"agent.conversation.end\":\n await this._onConversationEnd(typed);\n return;\n case \"agent.message.start\":\n await this._onMessageStart(typed);\n return;\n case \"agent.message.complete\":\n await this._onMessageComplete(typed);\n return;\n case \"agent.message.cancel\":\n await this._onMessageCancel(typed);\n return;\n case \"agent.iteration.start\":\n await this._onIterationStart(typed);\n return;\n case \"agent.iteration.end\":\n await this._onIterationEnd(typed);\n return;\n case \"agent.tool.start\":\n await this._onToolStart(typed);\n return;\n case \"agent.tool.end\":\n await this._onToolEnd(typed);\n return;\n case \"agent.llm.end\":\n await this._onLlmEnd(typed);\n return;\n case \"agent.error\":\n await this._onError(typed);\n return;\n // Events on the UX profile we observe but do not aggregate. Recorded\n // into the ring buffer only. Listed explicitly so adding a new event\n // type to the profile forces a choice here.\n case \"agent.message.chunk\":\n case \"agent.reasoning\":\n case \"agent.thinking.start\":\n case \"agent.tool.intent\":\n case \"agent.tool.rejected\":\n case \"agent.tool.progress\":\n case \"agent.llm.start\":\n case \"claude_code.hook\":\n this._recordEvent(typed);\n return;\n default: {\n // Exhaustiveness check — adding a new case to AgentEvent will cause\n // this line to fail typechecking until a branch is added above.\n const _exhaustive: never = typed;\n void _exhaustive;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Event handlers\n // ---------------------------------------------------------------------------\n\n /** @internal */\n async _onConversationStart(event: ConversationStartEvent): Promise<void> {\n this._recordEvent(event);\n this._activeConversations.add(event.conversationId);\n }\n\n /** @internal */\n async _onConversationEnd(event: ConversationEndEvent): Promise<void> {\n this._recordEvent(event);\n this._activeConversations.delete(event.conversationId);\n // Update trace status if we can find it\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = event.reason === \"error\" ? \"error\" : \"completed\";\n }\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n this._recordEvent(event);\n const agent = this._ensureAgent(event.agentName);\n agent.status = \"running\";\n if (!agent.startedAt) {\n agent.startedAt = event.timestamp;\n }\n agent.lastEventAt = event.timestamp;\n\n // Track trace\n if (!this._traces.has(event.traceId)) {\n this._traces.set(event.traceId, {\n agentName: event.agentName,\n startedAt: event.timestamp,\n iterationCount: 0,\n totalTokens: 0,\n status: \"running\",\n });\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n this._recordEvent(event);\n // Find agent by traceId\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalInputTokens += event.inputTokens;\n agent.totalOutputTokens += event.outputTokens;\n agent.lastEventAt = event.timestamp;\n }\n trace.totalTokens += event.inputTokens + event.outputTokens;\n }\n }\n\n /** @internal */\n async _onMessageCancel(event: MessageCancelEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = \"completed\";\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.iterationCount = event.iteration + 1;\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalIterations = Math.max(agent.totalIterations, event.iteration + 1);\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalToolCalls += 1;\n agent.lastEventAt = event.timestamp;\n\n // Update tool stats\n let toolStats = agent.toolStats.get(event.toolName);\n if (!toolStats) {\n toolStats = {\n toolName: event.toolName,\n callCount: 0,\n errorCount: 0,\n totalDurationMs: 0,\n };\n agent.toolStats.set(event.toolName, toolStats);\n }\n toolStats.callCount += 1;\n toolStats.totalDurationMs += event.durationMs;\n toolStats.lastUsed = event.timestamp;\n if (event.error) {\n toolStats.errorCount += 1;\n }\n\n // Append to per-call log so getToolAnalytics can apply date filters.\n this._toolCallLog.push({\n toolName: event.toolName,\n agentName: trace.agentName,\n durationMs: event.durationMs,\n isError: Boolean(event.error),\n timestamp: event.timestamp,\n });\n }\n }\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n this._recordEvent(event);\n\n // Track tokens by model\n let entry = this._tokensByModel.get(event.model);\n if (!entry) {\n entry = { input: 0, output: 0, conversations: new Set() };\n this._tokensByModel.set(event.model, entry);\n }\n entry.input += event.inputTokens;\n entry.output += event.outputTokens;\n const trace = this._traces.get(event.traceId);\n if (trace) {\n entry.conversations.add(event.traceId);\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = \"error\";\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalErrors += 1;\n agent.status = \"error\";\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private _ensureAgent(agentName: string): MutableAgentStats {\n let agent = this._agents.get(agentName);\n if (!agent) {\n agent = {\n agentName,\n status: \"idle\",\n totalIterations: 0,\n totalToolCalls: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalErrors: 0,\n toolStats: new Map(),\n };\n this._agents.set(agentName, agent);\n }\n return agent;\n }\n\n private _recordEvent(event: BaseEvent): void {\n this._recentEvents.push({\n type: event.type,\n timestamp: event.timestamp,\n spanId: event.spanId,\n parentSpanId: event.parentSpanId,\n data: {},\n });\n }\n\n private _toAgentStats(internal: MutableAgentStats): AgentStats {\n const toolStats: ToolStats[] = [];\n for (const ts of internal.toolStats.values()) {\n toolStats.push({\n toolName: ts.toolName,\n callCount: ts.callCount,\n errorCount: ts.errorCount,\n totalDurationMs: ts.totalDurationMs,\n avgDurationMs: ts.callCount > 0 ? ts.totalDurationMs / ts.callCount : 0,\n lastUsed: ts.lastUsed,\n });\n }\n return {\n agentName: internal.agentName,\n status: internal.status,\n totalIterations: internal.totalIterations,\n totalToolCalls: internal.totalToolCalls,\n totalInputTokens: internal.totalInputTokens,\n totalOutputTokens: internal.totalOutputTokens,\n totalErrors: internal.totalErrors,\n startedAt: internal.startedAt,\n lastEventAt: internal.lastEventAt,\n toolStats,\n };\n }\n\n private _getAgentStatsList(): AgentStats[] {\n const result: AgentStats[] = [];\n for (const internal of this._agents.values()) {\n result.push(this._toAgentStats(internal));\n }\n return result;\n }\n\n private _getToolAnalyticsFromLog(filters: DateFilters): ToolAnalytics[] {\n const from = filters.from?.getTime();\n const to = filters.to?.getTime();\n const toolMap = new Map<\n string,\n {\n totalCalls: number;\n totalErrors: number;\n totalDurationMs: number;\n agentBreakdown: Map<string, number>;\n }\n >();\n\n for (const entry of this._toolCallLog.toArray()) {\n const ts = entry.timestamp.getTime();\n if (from !== undefined && ts < from) continue;\n if (to !== undefined && ts > to) continue;\n\n let agg = toolMap.get(entry.toolName);\n if (!agg) {\n agg = {\n totalCalls: 0,\n totalErrors: 0,\n totalDurationMs: 0,\n agentBreakdown: new Map(),\n };\n toolMap.set(entry.toolName, agg);\n }\n agg.totalCalls += 1;\n if (entry.isError) agg.totalErrors += 1;\n agg.totalDurationMs += entry.durationMs;\n agg.agentBreakdown.set(entry.agentName, (agg.agentBreakdown.get(entry.agentName) ?? 0) + 1);\n }\n\n const result: ToolAnalytics[] = [];\n for (const [toolName, agg] of toolMap) {\n const agentBreakdown = Array.from(agg.agentBreakdown.entries()).map(\n ([agentName, callCount]) => ({ agentName, callCount }),\n );\n result.push({\n toolName,\n totalCalls: agg.totalCalls,\n totalErrors: agg.totalErrors,\n totalDurationMs: agg.totalDurationMs,\n avgDurationMs: agg.totalCalls > 0 ? agg.totalDurationMs / agg.totalCalls : 0,\n agentBreakdown,\n });\n }\n return result;\n }\n}\n","/**\n * Admin service protocol and in-memory implementation.\n *\n * AdminServiceProtocol defines the async interface for admin queries.\n * InMemoryAdminService delegates to an InMemoryEventCollector.\n */\n\nimport type { InMemoryEventCollector } from \"./collector.js\";\nimport type {\n AgentStats,\n ConversationSummary,\n DashboardStats,\n DateFilters,\n TokenUsageGroup,\n ToolAnalytics,\n TraceEvent,\n TraceSummary,\n} from \"./schemas.js\";\n\n// ---------------------------------------------------------------------------\n// Protocol\n// ---------------------------------------------------------------------------\n\n/** Async interface for admin dashboard queries. */\nexport interface AdminServiceProtocol {\n getDashboardStats(): Promise<DashboardStats>;\n getAgentStats(agentName: string): Promise<AgentStats | undefined>;\n getAllAgentStats(): Promise<AgentStats[]>;\n getRecentEvents(limit?: number): Promise<TraceEvent[]>;\n getTraceSummaries(): Promise<TraceSummary[]>;\n getConversations(): Promise<ConversationSummary[]>;\n getToolAnalytics(filters?: DateFilters): Promise<ToolAnalytics[]>;\n getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): Promise<TokenUsageGroup[]>;\n}\n\n// ---------------------------------------------------------------------------\n// In-memory implementation\n// ---------------------------------------------------------------------------\n\n/**\n * In-memory admin service backed by an InMemoryEventCollector.\n *\n * All methods delegate directly to the collector's synchronous query\n * methods, wrapped in Promise resolution for protocol compliance.\n */\nexport class InMemoryAdminService implements AdminServiceProtocol {\n private _collector: InMemoryEventCollector;\n\n constructor(collector: InMemoryEventCollector) {\n this._collector = collector;\n }\n\n async getDashboardStats(): Promise<DashboardStats> {\n return this._collector.getDashboardStats();\n }\n\n async getAgentStats(agentName: string): Promise<AgentStats | undefined> {\n return this._collector.getAgentStats(agentName);\n }\n\n async getAllAgentStats(): Promise<AgentStats[]> {\n return this._collector.getAllAgentStats();\n }\n\n async getRecentEvents(limit?: number): Promise<TraceEvent[]> {\n return this._collector.getRecentEvents(limit);\n }\n\n async getTraceSummaries(): Promise<TraceSummary[]> {\n return this._collector.getTraceSummaries();\n }\n\n async getConversations(): Promise<ConversationSummary[]> {\n return this._collector.getConversations();\n }\n\n async getToolAnalytics(filters?: DateFilters): Promise<ToolAnalytics[]> {\n return this._collector.getToolAnalytics(filters);\n }\n\n async getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): Promise<TokenUsageGroup[]> {\n return this._collector.getTokenUsage(params);\n }\n}\n","/**\n * StdioAdapter — JSON-RPC 2.0 over stdin/stdout for subprocess mode.\n *\n * Handles methods: listAgents, createConversation, sendMessage,\n * listConversations, getConversation. Uses SSEFormatter.extractPayload()\n * for event data in stream.event notifications.\n */\n\nimport * as readline from \"node:readline\";\nimport {\n type ConversationStoreProtocol,\n MemoryStore,\n type StoredConversation,\n} from \"../conversation/store.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport type { AgentLike, RunnerProtocol } from \"../runner/types.js\";\nimport { SSEFormatter } from \"../transport/sse-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id?: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: number | string | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params: unknown;\n}\n\ntype NotificationCallback = (notification: JSONRPCNotification) => void;\n\n// ---------------------------------------------------------------------------\n// StdioAdapter\n// ---------------------------------------------------------------------------\n\nexport class StdioAdapter {\n private _agents: AgentLike[];\n private _agentMap: Map<string, AgentLike>;\n private _runner: RunnerProtocol;\n private _store: ConversationStoreProtocol;\n private _conversations = new Map<string, StoredConversation>();\n\n constructor(opts: {\n agents: AgentLike[];\n runner: RunnerProtocol;\n store?: ConversationStoreProtocol;\n }) {\n this._agents = opts.agents;\n this._agentMap = new Map(opts.agents.map((a) => [a.role.name, a]));\n this._runner = opts.runner;\n this._store = opts.store ?? new MemoryStore();\n }\n\n /** Start reading JSON-RPC from stdin, writing to stdout. */\n async start(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const request = JSON.parse(trimmed) as JSONRPCRequest;\n const response = await this.handleRequest(request, (notification) => {\n process.stdout.write(`${JSON.stringify(notification)}\\n`);\n });\n if (request.id !== undefined) {\n process.stdout.write(`${JSON.stringify(response)}\\n`);\n }\n } catch {\n const errorResponse: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n };\n process.stdout.write(`${JSON.stringify(errorResponse)}\\n`);\n }\n }\n }\n\n /** Handle a single JSON-RPC request. Testable without stdin/stdout. */\n async handleRequest(\n request: JSONRPCRequest,\n onNotification?: NotificationCallback,\n ): Promise<JSONRPCResponse> {\n const id = request.id ?? null;\n\n try {\n switch (request.method) {\n case \"listAgents\":\n return this._listAgents(id);\n case \"createConversation\":\n return await this._createConversation(id, request.params);\n case \"sendMessage\":\n return await this._sendMessage(id, request.params, onNotification);\n case \"listConversations\":\n return await this._listConversations(id);\n case \"getConversation\":\n return await this._getConversation(id, request.params);\n default:\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32601, message: `Method not found: ${request.method}` },\n };\n }\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32603, message: err.message },\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Method handlers\n // ---------------------------------------------------------------------------\n\n private _listAgents(id: number | string | null): JSONRPCResponse {\n const agents = this._agents.map((a) => ({\n name: a.role.name,\n model: a.getModel(),\n }));\n return { jsonrpc: \"2.0\", id, result: agents };\n }\n\n private async _createConversation(\n id: number | string | null,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCResponse> {\n const agentName = params?.agentName as string | undefined;\n if (!agentName || !this._agentMap.has(agentName)) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Unknown agent: ${agentName}` },\n };\n }\n\n const agent = this._agentMap.get(agentName)!;\n const conv = await this._store.createConversation(agentName, agent.getModel());\n this._conversations.set(conv.id, conv);\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: {\n conversationId: conv.id,\n agentName: conv.agentName,\n model: conv.model,\n },\n };\n }\n\n private async _sendMessage(\n id: number | string | null,\n params?: Record<string, unknown>,\n onNotification?: NotificationCallback,\n ): Promise<JSONRPCResponse> {\n const conversationId = params?.conversationId as string | undefined;\n const message = params?.message as string | undefined;\n\n if (!conversationId || !message) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: -32602,\n message: \"Missing conversationId or message\",\n },\n };\n }\n\n const conv = this._conversations.get(conversationId);\n if (!conv) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Conversation not found: ${conversationId}` },\n };\n }\n\n const agent = this._agentMap.get(conv.agentName);\n if (!agent) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32603, message: `Agent not found: ${conv.agentName}` },\n };\n }\n\n // Use stream if available, otherwise fall back to run\n if (this._runner.stream) {\n const gen = this._runner.stream(agent, message);\n for await (const event of gen) {\n if (onNotification) {\n const payload = SSEFormatter.extractPayload(event as AgentEvent);\n if (payload) {\n onNotification({\n jsonrpc: \"2.0\",\n method: \"stream.event\",\n params: {\n type: event.type,\n data: payload,\n },\n });\n }\n }\n }\n } else {\n await this._runner.run(agent, message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: { status: \"completed\", conversationId },\n };\n }\n\n private async _listConversations(id: number | string | null): Promise<JSONRPCResponse> {\n const conversations: StoredConversation[] = [];\n // Get from store — iterate known conversation IDs\n for (const convId of this._conversations.keys()) {\n const conv = await this._store.getConversation(convId);\n if (conv) conversations.push(conv);\n }\n return { jsonrpc: \"2.0\", id, result: conversations };\n }\n\n private async _getConversation(\n id: number | string | null,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCResponse> {\n const conversationId = params?.conversationId as string | undefined;\n if (!conversationId) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: \"Missing conversationId\" },\n };\n }\n\n const conv = await this._store.getConversation(conversationId);\n if (!conv) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Conversation not found: ${conversationId}` },\n };\n }\n\n return { jsonrpc: \"2.0\", id, result: conv };\n }\n}\n"],"mappings":"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","names":["llmDuration","convEnd","iterEnd","import_claude_agent_sdk","import_ai","sdkTool","content","import_ai","import_node_child_process","import_claude_agent_sdk","MODEL_MAP","mapModel","sdkTool","import_core","_counter","generateId","_counter","_counter","generateId","toolNames","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_zod","import_core","import_zod","import_core","result","tasks","result","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/events/types.ts","../src/events/claude-code.ts","../src/events/claude-code-mapper.ts","../src/events/sandbox-types.ts","../src/events/event-bus.ts","../src/events/event-profiles.ts","../src/events/agent-event-bus.ts","../src/events/sandbox-event-bus.ts","../src/gates/base.ts","../src/gates/safety.ts","../src/gates/rate-limit.ts","../src/gates/approval.ts","../src/gates/audit.ts","../src/runner/agent-runner.ts","../src/runner/message-utils.ts","../src/runner/claude-code-runner.ts","../src/runner/sdk-bridge.ts","../src/runner/claude-code-api-runner.ts","../src/runner/mock-runner.ts","../src/runner/toolbox-executor.ts","../src/runner/create-runner.ts","../src/providers/types.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/google.ts","../src/providers/groq.ts","../src/providers/mistral.ts","../src/providers/xai.ts","../src/providers/deepseek.ts","../src/providers/openrouter.ts","../src/providers/ollama.ts","../src/providers/claude-code.ts","../src/providers/index.ts","../src/transport/in-process.ts","../src/transport/messaging-toolbox.ts","../src/transport/sse-formatter.ts","../src/runtime/agent-node.ts","../src/runtime/agency-runtime.ts","../src/conversation/conversation.ts","../src/conversation/store.ts","../src/exporters/base.ts","../src/exporters/console.ts","../src/exporters/langfuse.ts","../src/exporters/otel.ts","../src/exporters/sse.ts","../src/presets/coordinator.ts","../src/presets/judgments.ts","../src/presets/responsibilities.ts","../src/presets/orchestrator.ts","../src/presets/analyst.ts","../src/presets/retrieval.ts","../src/presets/agents/calculator.ts","../src/presets/agents/todo-manager.ts","../src/presets/agents/writing-coach.ts","../src/workflows/base.ts","../src/workflows/sequential.ts","../src/workflows/parallel.ts","../src/workflows/retry-loop.ts","../src/workflows/evaluators.ts","../src/workflows/task-loop.ts","../src/workflows/evaluator-loop.ts","../src/workflows/conversation-loop.ts","../src/admin/schemas.ts","../src/admin/collector.ts","../src/admin/service.ts","../src/streaming/stdio-adapter.ts"],"sourcesContent":["// @agentic-patterns/runtime — barrel export\nexport * from \"./events/index.js\";\nexport * from \"./gates/index.js\";\nexport * from \"./runner/index.js\";\nexport * from \"./transport/index.js\";\nexport * from \"./runtime/index.js\";\nexport * from \"./conversation/index.js\";\nexport * from \"./exporters/index.js\";\nexport * from \"./presets/index.js\";\nexport * from \"./workflows/index.js\";\nexport * from \"./admin/index.js\";\nexport * from \"./streaming/index.js\";\nexport * from \"./providers/index.js\";\n","/**\n * Core event types for runner observability.\n *\n * All events use a discriminated union on the `type` field.\n * Trace fields (traceId, runId, spanId, parentSpanId, timestamp) on every event.\n */\n\nimport type { ClaudeCodeHookEvent } from \"./claude-code.js\";\n\n/**\n * Generate a unique ID string.\n *\n * Uses crypto.randomUUID() when available (Node 19+, modern browsers),\n * falls back to a timestamp+counter approach.\n */\nlet _counter = 0;\nfunction generateId(): string {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n // Safe to use: `crypto` is present at runtime in Node 19+ and browsers.\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Base event interface\n// ---------------------------------------------------------------------------\n\nexport interface BaseEvent {\n readonly type: string;\n readonly traceId: string;\n readonly runId: string;\n readonly spanId: string;\n readonly parentSpanId?: string;\n readonly timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Message events\n// ---------------------------------------------------------------------------\n\nexport interface MessageStartEvent extends BaseEvent {\n readonly type: \"agent.message.start\";\n readonly agentName: string;\n readonly agentConfig?: Record<string, unknown>;\n}\n\nexport interface MessageChunkEvent extends BaseEvent {\n readonly type: \"agent.message.chunk\";\n readonly delta: string;\n readonly chunkIndex: number;\n}\n\nexport interface MessageCompleteEvent extends BaseEvent {\n readonly type: \"agent.message.complete\";\n readonly content: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly model: string;\n}\n\n// ---------------------------------------------------------------------------\n// Reasoning\n// ---------------------------------------------------------------------------\n\nexport interface ReasoningEvent extends BaseEvent {\n readonly type: \"agent.reasoning\";\n readonly content: string;\n readonly isComplete: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Tool call events\n// ---------------------------------------------------------------------------\n\nexport interface ToolCallIntent extends BaseEvent {\n readonly type: \"agent.tool.intent\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n}\n\nexport interface ToolCallRejectedEvent extends BaseEvent {\n readonly type: \"agent.tool.rejected\";\n readonly toolName: string;\n readonly reason: string;\n readonly gateName: string;\n readonly gateCategory: string;\n readonly originalIntent: ToolCallIntent;\n}\n\nexport interface ToolCallStartEvent extends BaseEvent {\n readonly type: \"agent.tool.start\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n readonly parentEventId?: string;\n}\n\nexport interface ToolCallEndEvent extends BaseEvent {\n readonly type: \"agent.tool.end\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly arguments: Record<string, unknown>;\n readonly result: unknown;\n readonly error?: string;\n readonly durationMs: number;\n readonly resultTokens: number;\n}\n\n// ---------------------------------------------------------------------------\n// Iteration events\n// ---------------------------------------------------------------------------\n\nexport interface IterationStartEvent extends BaseEvent {\n readonly type: \"agent.iteration.start\";\n readonly iteration: number;\n readonly maxIterations: number;\n}\n\nexport interface IterationEndEvent extends BaseEvent {\n readonly type: \"agent.iteration.end\";\n readonly iteration: number;\n readonly toolCallsCount: number;\n readonly hasMore: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// LLM call events\n// ---------------------------------------------------------------------------\n\nexport interface LLMCallStartEvent extends BaseEvent {\n readonly type: \"agent.llm.start\";\n readonly model: string;\n readonly messageCount: number;\n readonly hasTools: boolean;\n}\n\nexport interface LLMCallEndEvent extends BaseEvent {\n readonly type: \"agent.llm.end\";\n readonly model: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly durationMs: number;\n readonly hasToolCalls: boolean;\n readonly finishReason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation events\n// ---------------------------------------------------------------------------\n\nexport interface ConversationStartEvent extends BaseEvent {\n readonly type: \"agent.conversation.start\";\n readonly conversationId: string;\n readonly agentName: string;\n}\n\nexport interface ConversationEndEvent extends BaseEvent {\n readonly type: \"agent.conversation.end\";\n readonly conversationId: string;\n readonly reason: \"completed\" | \"error\" | \"cancelled\";\n}\n\n// ---------------------------------------------------------------------------\n// Message cancel event\n// ---------------------------------------------------------------------------\n\nexport interface MessageCancelEvent extends BaseEvent {\n readonly type: \"agent.message.cancel\";\n readonly reason?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Thinking lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface ThinkingStartEvent extends BaseEvent {\n readonly type: \"agent.thinking.start\";\n}\n\n// ---------------------------------------------------------------------------\n// Tool progress event\n// ---------------------------------------------------------------------------\n\nexport interface ToolProgressEvent extends BaseEvent {\n readonly type: \"agent.tool.progress\";\n readonly toolCallId: string;\n readonly progress?: number;\n readonly statusText?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Error event\n// ---------------------------------------------------------------------------\n\nexport interface ErrorEvent extends BaseEvent {\n readonly type: \"agent.error\";\n readonly errorType: string;\n readonly message: string;\n readonly recoverable: boolean;\n readonly stackTrace?: string;\n readonly context: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union\n// ---------------------------------------------------------------------------\n\nexport type AgentEvent =\n | ConversationStartEvent\n | ConversationEndEvent\n | MessageStartEvent\n | MessageChunkEvent\n | MessageCompleteEvent\n | MessageCancelEvent\n | ReasoningEvent\n | ThinkingStartEvent\n | ToolCallIntent\n | ToolCallRejectedEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolProgressEvent\n | IterationStartEvent\n | IterationEndEvent\n | LLMCallStartEvent\n | LLMCallEndEvent\n | ErrorEvent\n | ClaudeCodeHookEvent;\n\n/** All possible agent event type strings. */\nexport type AgentEventType = AgentEvent[\"type\"];\n\n/** Subset of events for backward-compatible StreamEvent alias. */\nexport type StreamEvent =\n | ConversationStartEvent\n | ConversationEndEvent\n | MessageStartEvent\n | MessageChunkEvent\n | MessageCompleteEvent\n | MessageCancelEvent\n | ReasoningEvent\n | ThinkingStartEvent\n | ToolCallIntent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolProgressEvent\n | IterationStartEvent\n | IterationEndEvent\n | LLMCallStartEvent\n | LLMCallEndEvent;\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create an event with auto-filled timestamp and optional spanId.\n *\n * @param type - The event type discriminant\n * @param data - Event fields (excluding type, timestamp; spanId optional)\n * @returns A fully-formed event\n */\nexport function createEvent<T extends AgentEventType>(\n type: T,\n data: Omit<Extract<AgentEvent, { type: T }>, \"type\" | \"timestamp\" | \"spanId\"> & {\n spanId?: string;\n },\n): Extract<AgentEvent, { type: T }> {\n return {\n ...data,\n type,\n timestamp: new Date(),\n spanId: data.spanId ?? generateId(),\n } as Extract<AgentEvent, { type: T }>;\n}\n","/**\n * Claude Code hook event — bridges Claude Code lifecycle hooks into the\n * AgentEventBus.\n *\n * The Claude Code CLI emits hook callbacks (PreToolUse, PostToolUse,\n * SessionStart, etc.) as JSON payloads to a configured command. The hook\n * bridge in `@agentic-patterns/server` receives those payloads via HTTP\n * and republishes each one as a `ClaudeCodeHookEvent`.\n *\n * The full raw hook payload is preserved on `payload` so downstream\n * consumers (dashboards, exporters) never lose information. A small\n * mappable subset (PreToolUse / PostToolUse) is also projected onto the\n * canonical `agent.tool.start` / `agent.tool.end` events by the\n * `mapClaudeCodeHookToAgentEvents` helper in\n * `./claude-code-mapper.ts` — that lives in a separate file so this\n * module stays a pure type/constant declaration.\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\nexport const CLAUDE_CODE_HOOK_EVENTS = [\n \"SessionStart\",\n \"InstructionsLoaded\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PermissionRequest\",\n \"PermissionDenied\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Notification\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"TaskCreated\",\n \"TaskCompleted\",\n \"Stop\",\n \"StopFailure\",\n \"TeammateIdle\",\n \"ConfigChange\",\n \"CwdChanged\",\n \"FileChanged\",\n \"WorktreeCreate\",\n \"WorktreeRemove\",\n \"PreCompact\",\n \"PostCompact\",\n \"Elicitation\",\n \"ElicitationResult\",\n \"SessionEnd\",\n] as const;\n\nexport type ClaudeCodeHookName = (typeof CLAUDE_CODE_HOOK_EVENTS)[number];\n\n/**\n * A single Claude Code hook callback, lifted into an AgentEvent.\n *\n * Every Claude Code hook invocation produces one of these. The full\n * raw payload is preserved on `payload`; common fields (sessionId,\n * cwd, toolName, ...) are also surfaced as top-level convenience\n * properties for typed consumers. PreToolUse and PostToolUse can be\n * additionally mapped to canonical `agent.tool.start` / `agent.tool.end`\n * events via `mapClaudeCodeHookToAgentEvents`.\n */\nexport interface ClaudeCodeHookEvent extends BaseEvent {\n readonly type: \"claude_code.hook\";\n readonly hookName: ClaudeCodeHookName;\n readonly sessionId: string;\n readonly transcriptPath?: string;\n readonly cwd?: string;\n readonly permissionMode?: string;\n readonly toolName?: string;\n readonly toolInput?: unknown;\n readonly toolResponse?: unknown;\n readonly toolUseId?: string;\n /** Full raw hook payload, preserved verbatim. */\n readonly payload: Record<string, unknown>;\n /**\n * Correlation id propagated from a runner (e.g. `ClaudeCodeRunner`) that\n * is already observing this session. When present, the hook route SKIPS\n * deriving `agent.tool.start`/`agent.tool.end` events — the runner\n * already emits them — while still preserving the raw hook event for\n * full fidelity (PreCompact, PermissionRequest, etc.).\n */\n readonly runnerCorrelationId?: string;\n}\n\nexport function isClaudeCodeHookName(s: unknown): s is ClaudeCodeHookName {\n return typeof s === \"string\" && (CLAUDE_CODE_HOOK_EVENTS as readonly string[]).includes(s);\n}\n","/**\n * Map Claude Code hook events to canonical AgentEvent variants.\n *\n * Only PreToolUse / PostToolUse currently map to standard events\n * (`agent.tool.start` / `agent.tool.end`). All other hook names yield\n * an empty array — consumers that want full coverage should subscribe\n * to `claude_code.hook` directly.\n */\n\nimport type { ClaudeCodeHookEvent } from \"./claude-code.js\";\nimport type { AgentEvent } from \"./types.js\";\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n}\n\nexport function mapClaudeCodeHookToAgentEvents(event: ClaudeCodeHookEvent): AgentEvent[] {\n const { hookName, traceId, runId, spanId, parentSpanId, toolUseId, toolName } = event;\n const toolCallId = toolUseId ?? spanId;\n const args = toRecord(event.toolInput);\n\n if (hookName === \"PreToolUse\") {\n return [\n {\n type: \"agent.tool.start\",\n traceId,\n runId,\n spanId,\n parentSpanId,\n timestamp: new Date(),\n toolCallId,\n toolName: toolName ?? \"unknown\",\n arguments: args,\n },\n ];\n }\n\n if (hookName === \"PostToolUse\") {\n const errorVal = (event.payload as { error?: unknown }).error;\n const errorStr =\n typeof errorVal === \"string\"\n ? errorVal\n : errorVal !== undefined && errorVal !== null\n ? String(errorVal)\n : undefined;\n\n return [\n {\n type: \"agent.tool.end\",\n traceId,\n runId,\n spanId,\n parentSpanId,\n timestamp: new Date(),\n toolCallId,\n toolName: toolName ?? \"unknown\",\n arguments: args,\n result: event.toolResponse,\n durationMs: 0,\n resultTokens: 0,\n ...(errorStr !== undefined ? { error: errorStr } : {}),\n },\n ];\n }\n\n return [];\n}\n","/**\n * Sandbox events for inter-agent communication and environment lifecycle.\n *\n * All sandbox events carry an AgentAddress origin and extend BaseEvent.\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// AgentAddress\n// ---------------------------------------------------------------------------\n\nexport interface AgentAddress {\n readonly deviceId: string;\n readonly instanceId: string;\n readonly agentId: string;\n readonly role: string;\n}\n\nexport function createAgentAddress(partial?: Partial<AgentAddress>): AgentAddress {\n return {\n deviceId: partial?.deviceId ?? \"\",\n instanceId: partial?.instanceId ?? \"\",\n agentId: partial?.agentId ?? \"\",\n role: partial?.role ?? \"\",\n };\n}\n\nexport function agentAddressToString(addr: AgentAddress): string {\n return `${addr.role}@${addr.deviceId}/${addr.instanceId}/${addr.agentId}`;\n}\n\n// ---------------------------------------------------------------------------\n// Base sandbox event\n// ---------------------------------------------------------------------------\n\nexport interface BaseSandboxEvent extends BaseEvent {\n readonly origin: AgentAddress;\n readonly target?: AgentAddress;\n readonly correlationId?: string;\n readonly agencyId: string;\n readonly lineupRunId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Communication events\n// ---------------------------------------------------------------------------\n\nexport interface AgentMessageEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.message\";\n readonly content: string;\n readonly metadata: Record<string, unknown>;\n}\n\nexport interface AgentBroadcastEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.broadcast\";\n readonly content: string;\n readonly channel: string;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface AgentJoinEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.join\";\n readonly reason: string;\n}\n\nexport interface AgentLeaveEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.agent.leave\";\n readonly reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Task coordination events\n// ---------------------------------------------------------------------------\n\nexport interface TaskCreateEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.create\";\n readonly taskId: string;\n readonly taskTitle: string;\n}\n\nexport interface TaskUpdateEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.update\";\n readonly taskId: string;\n readonly changes: Record<string, unknown>;\n}\n\nexport interface TaskAssignEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.task.assign\";\n readonly taskId: string;\n readonly assignee: AgentAddress;\n}\n\n// ---------------------------------------------------------------------------\n// Health events\n// ---------------------------------------------------------------------------\n\nexport interface HealthPingEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.health.ping\";\n}\n\nexport interface HealthPongEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.health.pong\";\n readonly status: string;\n readonly uptimeSeconds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Node lifecycle events\n// ---------------------------------------------------------------------------\n\nexport interface NodeLifecycleEvent extends BaseSandboxEvent {\n readonly type: \"sandbox.node.lifecycle\";\n readonly nodeEventType:\n | \"node.started\"\n | \"node.stopped\"\n | \"node.message_received\"\n | \"node.response_sent\";\n readonly message: string;\n readonly metadata: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union\n// ---------------------------------------------------------------------------\n\nexport type SandboxEvent =\n | AgentMessageEvent\n | AgentBroadcastEvent\n | AgentJoinEvent\n | AgentLeaveEvent\n | TaskCreateEvent\n | TaskUpdateEvent\n | TaskAssignEvent\n | HealthPingEvent\n | HealthPongEvent\n | NodeLifecycleEvent;\n\nexport type SandboxEventType = SandboxEvent[\"type\"];\n\n// ---------------------------------------------------------------------------\n// Serialization (JSON for transport)\n// ---------------------------------------------------------------------------\n\ninterface SerializedAddress {\n deviceId: string;\n instanceId: string;\n agentId: string;\n role: string;\n}\n\nfunction serializeAddress(addr: AgentAddress): SerializedAddress {\n return {\n deviceId: addr.deviceId,\n instanceId: addr.instanceId,\n agentId: addr.agentId,\n role: addr.role,\n };\n}\n\nfunction deserializeAddress(raw: Record<string, unknown>): AgentAddress {\n // Support legacy lxc_id key\n const instanceId =\n (raw.instanceId as string | undefined) ??\n (raw.instance_id as string | undefined) ??\n (raw.lxc_id as string | undefined) ??\n \"\";\n return {\n deviceId: (raw.deviceId as string | undefined) ?? (raw.device_id as string | undefined) ?? \"\",\n instanceId,\n agentId: (raw.agentId as string | undefined) ?? (raw.agent_id as string | undefined) ?? \"\",\n role: (raw.role as string | undefined) ?? \"\",\n };\n}\n\n/**\n * Serialize a sandbox event to a JSON string for transport.\n */\nexport function serializeSandboxEventToString(event: SandboxEvent): string {\n const data: Record<string, unknown> = {\n type: event.type,\n spanId: event.spanId,\n timestamp: event.timestamp.toISOString(),\n runId: event.runId,\n agencyId: event.agencyId,\n lineupRunId: event.lineupRunId,\n correlationId: event.correlationId,\n origin: serializeAddress(event.origin),\n };\n\n if (event.target) {\n data.target = serializeAddress(event.target);\n }\n\n // Add type-specific fields\n switch (event.type) {\n case \"sandbox.agent.message\":\n data.content = event.content;\n data.metadata = event.metadata;\n break;\n case \"sandbox.agent.broadcast\":\n data.content = event.content;\n data.channel = event.channel;\n break;\n case \"sandbox.agent.join\":\n case \"sandbox.agent.leave\":\n data.reason = event.reason;\n break;\n case \"sandbox.task.create\":\n data.taskId = event.taskId;\n data.taskTitle = event.taskTitle;\n break;\n case \"sandbox.task.update\":\n data.taskId = event.taskId;\n data.changes = event.changes;\n break;\n case \"sandbox.task.assign\":\n data.taskId = event.taskId;\n data.assignee = serializeAddress(event.assignee);\n break;\n case \"sandbox.health.ping\":\n break;\n case \"sandbox.health.pong\":\n data.status = event.status;\n data.uptimeSeconds = event.uptimeSeconds;\n break;\n case \"sandbox.node.lifecycle\":\n data.nodeEventType = event.nodeEventType;\n data.message = event.message;\n data.metadata = event.metadata;\n break;\n }\n\n return JSON.stringify(data);\n}\n\n/**\n * Serialize a sandbox event to bytes for transport.\n */\nexport function serializeSandboxEvent(event: SandboxEvent): Uint8Array {\n const json = serializeSandboxEventToString(event);\n return new Uint8Array(Array.from(json, (c) => c.charCodeAt(0)));\n}\n\n/**\n * Deserialize a sandbox event from a JSON string.\n */\nexport function deserializeSandboxEventFromString(json: string): SandboxEvent {\n const d = JSON.parse(json) as Record<string, unknown>;\n const origin = deserializeAddress((d.origin as Record<string, unknown>) ?? {});\n const target = d.target ? deserializeAddress(d.target as Record<string, unknown>) : undefined;\n const eventType = d.type as string;\n\n const base: Omit<BaseSandboxEvent, \"type\"> = {\n traceId: (d.traceId as string) ?? (d.runId as string) ?? \"\",\n runId: (d.runId as string) ?? \"\",\n spanId: (d.spanId as string) ?? \"\",\n parentSpanId: d.parentSpanId as string | undefined,\n timestamp: new Date((d.timestamp as string) ?? Date.now()),\n origin,\n target,\n correlationId: d.correlationId as string | undefined,\n agencyId: (d.agencyId as string) ?? \"\",\n lineupRunId: (d.lineupRunId as string) ?? \"\",\n };\n\n switch (eventType) {\n case \"sandbox.agent.message\":\n return {\n ...base,\n type: \"sandbox.agent.message\",\n content: (d.content as string) ?? \"\",\n metadata: (d.metadata as Record<string, unknown>) ?? {},\n };\n case \"sandbox.agent.broadcast\":\n return {\n ...base,\n type: \"sandbox.agent.broadcast\",\n content: (d.content as string) ?? \"\",\n channel: (d.channel as string) ?? \"\",\n };\n case \"sandbox.agent.join\":\n return {\n ...base,\n type: \"sandbox.agent.join\",\n reason: (d.reason as string) ?? \"\",\n };\n case \"sandbox.agent.leave\":\n return {\n ...base,\n type: \"sandbox.agent.leave\",\n reason: (d.reason as string) ?? \"\",\n };\n case \"sandbox.task.create\":\n return {\n ...base,\n type: \"sandbox.task.create\",\n taskId: (d.taskId as string) ?? \"\",\n taskTitle: (d.taskTitle as string) ?? \"\",\n };\n case \"sandbox.task.update\":\n return {\n ...base,\n type: \"sandbox.task.update\",\n taskId: (d.taskId as string) ?? \"\",\n changes: (d.changes as Record<string, unknown>) ?? {},\n };\n case \"sandbox.task.assign\":\n return {\n ...base,\n type: \"sandbox.task.assign\",\n taskId: (d.taskId as string) ?? \"\",\n assignee: d.assignee\n ? deserializeAddress(d.assignee as Record<string, unknown>)\n : createAgentAddress(),\n };\n case \"sandbox.health.ping\":\n return { ...base, type: \"sandbox.health.ping\" };\n case \"sandbox.health.pong\":\n return {\n ...base,\n type: \"sandbox.health.pong\",\n status: (d.status as string) ?? \"healthy\",\n uptimeSeconds: (d.uptimeSeconds as number) ?? 0,\n };\n case \"sandbox.node.lifecycle\":\n return {\n ...base,\n type: \"sandbox.node.lifecycle\",\n nodeEventType: (d.nodeEventType as NodeLifecycleEvent[\"nodeEventType\"]) ?? \"node.started\",\n message: (d.message as string) ?? \"\",\n metadata: (d.metadata as Record<string, unknown>) ?? {},\n };\n default:\n // Fallback: return as agent.message with empty content\n return {\n ...base,\n type: \"sandbox.agent.message\",\n content: \"\",\n metadata: {},\n };\n }\n}\n\n/**\n * Deserialize a sandbox event from bytes.\n */\nexport function deserializeSandboxEvent(data: Uint8Array): SandboxEvent {\n const json = Array.from(data, (b) => String.fromCharCode(b)).join(\"\");\n return deserializeSandboxEventFromString(json);\n}\n","/**\n * Async-capable event bus for publishing and subscribing to events.\n *\n * Handlers sorted by priority (higher = executed first).\n * Middleware can transform or drop events (return null).\n */\n\nimport type { BaseEvent } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Handler function that receives an event. Can be sync or async. */\nexport type EventHandlerFn<E extends BaseEvent = BaseEvent> = (\n event: E,\n) => unknown | Promise<unknown>;\n\n/** Middleware function. Return null to stop propagation, or a new event to transform. */\nexport type MiddlewareFn<E extends BaseEvent = BaseEvent> = (\n event: E,\n) => E | null | Promise<E | null>;\n\n/** Wrapped handler with priority metadata. */\ninterface HandlerEntry {\n readonly handler: EventHandlerFn;\n readonly priority: number;\n readonly eventTypes: readonly string[];\n}\n\nfunction canHandle(entry: HandlerEntry, event: BaseEvent): boolean {\n return entry.eventTypes.length === 0 || entry.eventTypes.includes(event.type);\n}\n\n// ---------------------------------------------------------------------------\n// EventBus\n// ---------------------------------------------------------------------------\n\nexport class EventBus {\n private _handlers: Map<string, HandlerEntry[]> = new Map();\n private _globalHandlers: HandlerEntry[] = [];\n private _middleware: MiddlewareFn[] = [];\n\n /**\n * Subscribe a handler to a specific event type.\n *\n * @param eventType - Event type string to listen for\n * @param handler - Handler function (sync or async)\n * @param priority - Higher priority executes first (default 0)\n */\n subscribe(eventType: string, handler: EventHandlerFn, priority = 0): void {\n const entry: HandlerEntry = {\n handler,\n priority,\n eventTypes: [eventType],\n };\n\n let list = this._handlers.get(eventType);\n if (!list) {\n list = [];\n this._handlers.set(eventType, list);\n }\n list.push(entry);\n // Sort descending by priority\n list.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Subscribe a handler to all events.\n */\n subscribeAll(handler: EventHandlerFn, priority = 0): void {\n const entry: HandlerEntry = { handler, priority, eventTypes: [] };\n this._globalHandlers.push(entry);\n this._globalHandlers.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Unsubscribe a handler from a specific event type.\n */\n unsubscribe(eventType: string, handler: EventHandlerFn): void {\n const list = this._handlers.get(eventType);\n if (list) {\n this._handlers.set(\n eventType,\n list.filter((h) => h.handler !== handler),\n );\n }\n }\n\n /**\n * Unsubscribe a handler from all events.\n */\n unsubscribeAll(handler: EventHandlerFn): void {\n this._globalHandlers = this._globalHandlers.filter((h) => h.handler !== handler);\n }\n\n /**\n * Add middleware to process events before handlers.\n *\n * Middleware can modify events or stop propagation by returning null.\n */\n addMiddleware(middleware: MiddlewareFn): void {\n this._middleware.push(middleware);\n }\n\n /**\n * Publish an event to all registered handlers.\n *\n * @returns List of handler results\n */\n async publish(event: BaseEvent): Promise<unknown[]> {\n // Apply middleware\n let processed: BaseEvent | null = event;\n for (const mw of this._middleware) {\n const result = mw(processed);\n processed = result instanceof Promise ? await result : result;\n if (processed === null) {\n return [];\n }\n }\n\n // Gather handlers\n const specific = this._handlers.get(processed.type) ?? [];\n const globals = this._globalHandlers.filter((h) => canHandle(h, processed));\n\n const all = [...specific, ...globals].sort((a, b) => b.priority - a.priority);\n\n // Execute handlers\n const results: unknown[] = [];\n for (const entry of all) {\n try {\n const r = entry.handler(processed);\n results.push(r instanceof Promise ? await r : r);\n } catch (_err) {\n // Continue executing other handlers (matches Python behavior)\n }\n }\n\n return results;\n }\n\n /**\n * Clear all handlers and middleware.\n */\n clear(): void {\n this._handlers.clear();\n this._globalHandlers = [];\n this._middleware = [];\n }\n\n /**\n * Get the number of handlers for an event type or total.\n */\n getHandlerCount(eventType?: string): number {\n if (eventType) {\n return (this._handlers.get(eventType) ?? []).length;\n }\n let count = 0;\n for (const list of this._handlers.values()) {\n count += list.length;\n }\n return count + this._globalHandlers.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Global instance\n// ---------------------------------------------------------------------------\n\nlet _globalEventBus: EventBus | null = null;\n\nexport function getEventBus(): EventBus {\n if (!_globalEventBus) {\n _globalEventBus = new EventBus();\n }\n return _globalEventBus;\n}\n\nexport function setEventBus(bus: EventBus): void {\n _globalEventBus = bus;\n}\n","/**\n * Event profiles for curated event subscriptions.\n *\n * Profiles are handler groups that subscribe to specific event types\n * for different use cases (UX rendering, observability, debugging).\n */\n\nimport type { EventBus, EventHandlerFn } from \"./event-bus.js\";\n\n// ---------------------------------------------------------------------------\n// Profile enum\n// ---------------------------------------------------------------------------\n\nexport const EventProfile = {\n UX: \"ux\",\n OBSERVABILITY: \"obs\",\n DEBUG: \"debug\",\n TOOLS: \"tools\",\n STREAMING: \"stream\",\n} as const;\n\nexport type EventProfile = (typeof EventProfile)[keyof typeof EventProfile];\n\n// ---------------------------------------------------------------------------\n// Profile -> event type mappings\n// ---------------------------------------------------------------------------\n\nexport const PROFILE_EVENT_TYPES: Readonly<Record<EventProfile, readonly string[]>> = {\n [EventProfile.UX]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.chunk\",\n \"agent.message.complete\",\n \"agent.message.cancel\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n \"claude_code.hook\",\n ],\n [EventProfile.OBSERVABILITY]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.complete\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n ],\n [EventProfile.DEBUG]: [\n \"agent.conversation.start\",\n \"agent.conversation.end\",\n \"agent.message.start\",\n \"agent.message.chunk\",\n \"agent.message.complete\",\n \"agent.message.cancel\",\n \"agent.reasoning\",\n \"agent.thinking.start\",\n \"agent.iteration.start\",\n \"agent.iteration.end\",\n \"agent.llm.start\",\n \"agent.llm.end\",\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n \"agent.error\",\n ],\n [EventProfile.TOOLS]: [\n \"agent.tool.intent\",\n \"agent.tool.rejected\",\n \"agent.tool.start\",\n \"agent.tool.end\",\n \"agent.tool.progress\",\n ],\n [EventProfile.STREAMING]: [\"agent.message.chunk\"],\n};\n\n// ---------------------------------------------------------------------------\n// Subscription helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Subscribe handler to all event types in a profile.\n *\n * @returns List of event types subscribed to.\n */\nexport function subscribeProfile(\n bus: EventBus,\n profile: EventProfile,\n handler: EventHandlerFn,\n priority = 0,\n): string[] {\n const eventTypes = [...PROFILE_EVENT_TYPES[profile]];\n for (const eventType of eventTypes) {\n bus.subscribe(eventType, handler, priority);\n }\n return eventTypes;\n}\n\n/**\n * Unsubscribe handler from all event types in a profile.\n */\nexport function unsubscribeProfile(\n bus: EventBus,\n profile: EventProfile,\n handler: EventHandlerFn,\n): void {\n for (const eventType of PROFILE_EVENT_TYPES[profile]) {\n bus.unsubscribe(eventType, handler);\n }\n}\n\n/**\n * Subscribe to multiple profiles, deduplicating event types.\n */\nexport function subscribeProfiles(\n bus: EventBus,\n profiles: EventProfile[],\n handler: EventHandlerFn,\n priority = 0,\n): string[] {\n const eventTypes = new Set<string>();\n for (const profile of profiles) {\n for (const et of PROFILE_EVENT_TYPES[profile]) {\n eventTypes.add(et);\n }\n }\n for (const eventType of eventTypes) {\n bus.subscribe(eventType, handler, priority);\n }\n return [...eventTypes];\n}\n","/**\n * Agent-specific event bus with gate chain for intent filtering.\n *\n * Extends the base EventBus with safety gates that can intercept,\n * block, or modify intent events before they're published.\n */\n\nimport type { Gate, GateResult } from \"../gates/base.js\";\nimport { EventBus } from \"./event-bus.js\";\nimport type { BaseEvent, ToolCallIntent, ToolCallRejectedEvent } from \"./types.js\";\n\nexport class AgentEventBus extends EventBus {\n private _gateChain: Gate[] = [];\n\n /**\n * Add a gate to the chain, automatically sorted by category.\n */\n addGate(gate: Gate): void {\n this._gateChain.push(gate);\n this._gateChain.sort((a, b) => a.category - b.category);\n }\n\n /**\n * Remove a gate from the chain.\n */\n removeGate(gate: Gate): void {\n const idx = this._gateChain.indexOf(gate);\n if (idx !== -1) {\n this._gateChain.splice(idx, 1);\n }\n }\n\n /**\n * Clear all gates from the chain.\n */\n clearGates(): void {\n this._gateChain = [];\n }\n\n /**\n * Get a copy of the gate chain.\n */\n get gates(): readonly Gate[] {\n return [...this._gateChain];\n }\n\n /**\n * Publish an event, running intent events through gate chain.\n *\n * Intent events (those with type ending in \".intent\") are checked by each gate.\n * If any gate blocks the event, a ToolCallRejected event is emitted instead.\n * Regular events bypass gates entirely.\n */\n override async publish(event: BaseEvent): Promise<unknown[]> {\n const isIntent = event.type.endsWith(\".intent\");\n\n if (!isIntent) {\n return super.publish(event);\n }\n\n // Run intent event through gate chain\n let currentEvent: BaseEvent = event;\n for (const gate of this._gateChain) {\n const result = await gate.check(currentEvent);\n\n if (isGateResultObject(result)) {\n if (result.action === \"block\") {\n await this._emitRejection(currentEvent, gate, result.reason);\n return [];\n }\n if (result.action === \"modify\" && result.event) {\n currentEvent = result.event;\n }\n }\n }\n\n // All gates passed, publish the (possibly modified) event\n return super.publish(currentEvent);\n }\n\n private async _emitRejection(event: BaseEvent, gate: Gate, reason?: string): Promise<void> {\n const intent = event as ToolCallIntent;\n const rejection: ToolCallRejectedEvent = {\n type: \"agent.tool.rejected\",\n traceId: intent.traceId,\n runId: intent.runId,\n spanId: `${Date.now().toString(36)}-rejection`,\n timestamp: new Date(),\n toolName: intent.toolName ?? \"\",\n reason: reason ?? gate.getBlockReason(event),\n gateName: gate.name,\n gateCategory: gate.categoryName,\n originalIntent: intent,\n };\n await super.publish(rejection);\n }\n}\n\nfunction isGateResultObject(result: GateResult): result is GateResult {\n return typeof result === \"object\" && result !== null && \"action\" in result;\n}\n\n// ---------------------------------------------------------------------------\n// Global instance\n// ---------------------------------------------------------------------------\n\nlet _agentEventBus: AgentEventBus | null = null;\n\nexport function getAgentEventBus(): AgentEventBus {\n if (!_agentEventBus) {\n _agentEventBus = new AgentEventBus();\n }\n return _agentEventBus;\n}\n\nexport function setAgentEventBus(bus: AgentEventBus): void {\n _agentEventBus = bus;\n}\n","/**\n * SandboxEventBus - AgentEventBus with pluggable transport for cross-agent messaging.\n *\n * Extends AgentEventBus with dual publish: local handlers + transport publish\n * for SandboxEvents. Subscribes to both direct and broadcast channels.\n */\n\nimport type { Transport, TransportMessage } from \"../transport/types.js\";\nimport { AgentEventBus } from \"./agent-event-bus.js\";\nimport type { AgentAddress, BaseSandboxEvent, SandboxEvent } from \"./sandbox-types.js\";\nimport { deserializeSandboxEvent, serializeSandboxEvent } from \"./sandbox-types.js\";\nimport type { BaseEvent } from \"./types.js\";\n\n/**\n * Check if an event is a SandboxEvent (has origin + agencyId fields).\n */\nfunction isSandboxEvent(event: BaseEvent): event is SandboxEvent {\n return typeof event === \"object\" && event !== null && \"origin\" in event && \"agencyId\" in event;\n}\n\n/**\n * AgentEventBus extended with transport-aware publishing.\n *\n * - `publish()` dispatches both locally AND to transport for SandboxEvents.\n * - Regular AgentEvents only dispatch locally.\n * - Remote events received via transport are dispatched locally only (no echo loop).\n */\nexport class SandboxEventBus extends AgentEventBus {\n readonly address: AgentAddress;\n private _transport: Transport;\n /**\n * Set of spanIds that this bus has already dispatched locally.\n * Prevents duplicate local dispatch when the InProcessTransport\n * echoes our own publish back to us via subscription.\n */\n private _locallyPublished = new Set<string>();\n\n constructor(address: AgentAddress, transport: Transport) {\n super();\n this.address = address;\n this._transport = transport;\n }\n\n /**\n * Connect transport and set up subscriptions for direct + broadcast channels.\n */\n async start(): Promise<void> {\n await this._transport.connect();\n await this._transport.ensureStream(\"AGENCY_EVENTS\", [\"agency.>\"]);\n\n // Subscribe to direct messages for this agent\n await this._transport.subscribe(\n `agency.*.run.*.agent.${this.address.agentId}`,\n (msg) => this._onRemoteEvent(msg),\n `agent-${this.address.agentId}`,\n );\n\n // Subscribe to broadcasts\n await this._transport.subscribe(\n \"agency.*._broadcast\",\n (msg) => this._onRemoteEvent(msg),\n `broadcast-${this.address.agentId}`,\n );\n }\n\n /**\n * Close transport.\n */\n async stop(): Promise<void> {\n await this._transport.close();\n }\n\n /**\n * Publish event locally and to transport if it's a SandboxEvent.\n *\n * 1. Local gate chain + handlers (via super.publish)\n * 2. If SandboxEvent, also publish to transport\n */\n override async publish(event: BaseEvent): Promise<unknown[]> {\n // Track this event to prevent duplicate local dispatch from transport echo\n this._locallyPublished.add(event.spanId);\n\n // Local dispatch\n const results = await super.publish(event);\n\n // If SandboxEvent, also publish to transport\n if (isSandboxEvent(event)) {\n const subject = this._resolveSubject(event);\n await this._transport.publish(subject, serializeSandboxEvent(event));\n }\n\n // Cleanup tracking (keep set bounded)\n if (this._locallyPublished.size > 1000) {\n const entries = [...this._locallyPublished];\n for (let i = 0; i < entries.length - 500; i++) {\n this._locallyPublished.delete(entries[i]!);\n }\n }\n\n return results;\n }\n\n /**\n * Map event target to transport subject.\n *\n * Targeted: agency.{agencyId}.run.{lineupRunId}.agent.{targetId}\n * Broadcast: agency.{agencyId}._broadcast\n */\n private _resolveSubject(event: SandboxEvent): string {\n const base = event as BaseSandboxEvent;\n if (base.target) {\n return `agency.${base.agencyId}.run.${base.lineupRunId}.agent.${base.target.agentId}`;\n }\n return `agency.${base.agencyId}._broadcast`;\n }\n\n /**\n * Inject remote transport message into local EventBus (no re-publish to transport).\n *\n * Skips events we already published locally (echo prevention for shared transport).\n */\n private async _onRemoteEvent(msg: TransportMessage): Promise<void> {\n const event = deserializeSandboxEvent(msg.data);\n\n // Skip events we already dispatched locally (echo from shared InProcessTransport)\n if (this._locallyPublished.has(event.spanId)) {\n await msg.ack();\n return;\n }\n\n // Mark as locally published to prevent re-entry\n this._locallyPublished.add(event.spanId);\n\n // Local dispatch only (do not re-publish to transport)\n await super.publish(event);\n await msg.ack();\n }\n}\n","/**\n * Gate base interface and types.\n *\n * Gates intercept intent events and can block, allow, or modify them.\n * They execute in category order: SAFETY -> RATE_LIMIT -> APPROVAL -> AUDIT.\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Gate category — lower values run first\n// ---------------------------------------------------------------------------\n\nexport const GateCategory = {\n SAFETY: 0,\n RATE_LIMIT: 1,\n APPROVAL: 2,\n AUDIT: 3,\n} as const;\n\nexport type GateCategory = (typeof GateCategory)[keyof typeof GateCategory];\n\nexport const GATE_CATEGORY_NAMES: Readonly<Record<GateCategory, string>> = {\n [GateCategory.SAFETY]: \"SAFETY\",\n [GateCategory.RATE_LIMIT]: \"RATE_LIMIT\",\n [GateCategory.APPROVAL]: \"APPROVAL\",\n [GateCategory.AUDIT]: \"AUDIT\",\n};\n\n// ---------------------------------------------------------------------------\n// Gate result\n// ---------------------------------------------------------------------------\n\nexport type GateResult =\n | { action: \"allow\" }\n | { action: \"block\"; reason: string }\n | { action: \"modify\"; event: BaseEvent };\n\nexport const GateAllow: GateResult = { action: \"allow\" };\n\nexport function GateBlock(reason: string): GateResult {\n return { action: \"block\", reason };\n}\n\nexport function GateModify(event: BaseEvent): GateResult {\n return { action: \"modify\", event };\n}\n\n// ---------------------------------------------------------------------------\n// Gate interface\n// ---------------------------------------------------------------------------\n\nexport interface Gate {\n /** Category of this gate for ordering. */\n readonly category: GateCategory;\n\n /** Gate name for rejection messages. */\n readonly name: string;\n\n /** Human-readable category name. */\n readonly categoryName: string;\n\n /** Check an intent event. */\n check(event: BaseEvent): Promise<GateResult>;\n\n /** Get reason why event was blocked. */\n getBlockReason(event: BaseEvent): string;\n}\n\n/**\n * Abstract base class for gates.\n * Subclasses must implement check() and set category.\n */\nexport abstract class BaseGate implements Gate {\n abstract readonly category: GateCategory;\n\n get name(): string {\n return this.constructor.name;\n }\n\n get categoryName(): string {\n return GATE_CATEGORY_NAMES[this.category];\n }\n\n abstract check(event: BaseEvent): Promise<GateResult>;\n\n getBlockReason(_event: BaseEvent): string {\n return \"Blocked by gate policy\";\n }\n}\n","/**\n * Safety gate for blocking dangerous operations.\n *\n * Category: SAFETY (runs first in chain)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\nexport class SafetyGate extends BaseGate {\n readonly category = GateCategory.SAFETY;\n\n private _blockedTools: Set<string>;\n private _blockedPatterns: RegExp[];\n private _blockMessage: string;\n\n constructor(options?: {\n blockedTools?: Set<string>;\n blockedPatterns?: string[];\n blockMessage?: string;\n }) {\n super();\n this._blockedTools = options?.blockedTools ?? new Set();\n this._blockedPatterns = (options?.blockedPatterns ?? []).map((p) => new RegExp(p));\n this._blockMessage = options?.blockMessage ?? \"Tool is not allowed by safety policy\";\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const toolName = (event as { toolName?: string }).toolName ?? \"\";\n\n if (this._blockedTools.has(toolName)) {\n return GateBlock(this.getBlockReason(event));\n }\n\n for (const pattern of this._blockedPatterns) {\n if (pattern.test(toolName)) {\n return GateBlock(this.getBlockReason(event));\n }\n }\n\n return GateAllow;\n }\n\n override getBlockReason(event: BaseEvent): string {\n const toolName = (event as { toolName?: string }).toolName ?? \"unknown\";\n return `${this._blockMessage}: '${toolName}'`;\n }\n}\n","/**\n * Rate limit gate using token bucket algorithm.\n *\n * Category: RATE_LIMIT (runs second)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\nexport class RateLimitGate extends BaseGate {\n readonly category = GateCategory.RATE_LIMIT;\n\n private _rate: number;\n private _burst: number;\n private _tokens: number;\n private _lastUpdate: number;\n\n constructor(options?: {\n callsPerMinute?: number;\n burstSize?: number;\n }) {\n super();\n const callsPerMinute = options?.callsPerMinute ?? 60;\n this._rate = callsPerMinute / 60.0;\n this._burst = options?.burstSize ?? callsPerMinute;\n this._tokens = this._burst;\n this._lastUpdate = Date.now() / 1000; // seconds\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const now = Date.now() / 1000;\n const elapsed = now - this._lastUpdate;\n this._tokens = Math.min(this._burst, this._tokens + elapsed * this._rate);\n this._lastUpdate = now;\n\n if (this._tokens >= 1.0) {\n this._tokens -= 1.0;\n return GateAllow;\n }\n\n return GateBlock(this.getBlockReason(event));\n }\n\n override getBlockReason(_event: BaseEvent): string {\n return `Rate limit exceeded (${Math.round(this._rate * 60)} calls/min)`;\n }\n}\n","/**\n * Human approval gate for tool calls.\n *\n * Category: APPROVAL (runs third)\n */\n\nimport type { BaseEvent, ToolCallIntent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateBlock, GateCategory, type GateResult } from \"./base.js\";\n\n/** Callback that decides whether to approve a tool call. */\nexport type ApprovalCallback = (event: ToolCallIntent) => boolean | Promise<boolean>;\n\nexport class HumanApprovalGate extends BaseGate {\n readonly category = GateCategory.APPROVAL;\n\n private _approvalFn: ApprovalCallback;\n private _tools: Set<string> | undefined;\n private _autoApprove: boolean;\n\n constructor(options?: {\n approvalFn?: ApprovalCallback;\n tools?: Set<string>;\n autoApprove?: boolean;\n }) {\n super();\n this._approvalFn = options?.approvalFn ?? (() => true);\n this._tools = options?.tools;\n this._autoApprove = options?.autoApprove ?? false;\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n if (event.type !== \"agent.tool.intent\") {\n return GateAllow;\n }\n\n const toolName = (event as ToolCallIntent).toolName ?? \"\";\n\n // Check if this tool needs approval\n if (this._tools && !this._tools.has(toolName)) {\n return GateAllow;\n }\n\n if (this._autoApprove) {\n return GateAllow;\n }\n\n const approved = await this._approvalFn(event as ToolCallIntent);\n return approved ? GateAllow : GateBlock(this.getBlockReason(event));\n }\n\n override getBlockReason(event: BaseEvent): string {\n const toolName = (event as { toolName?: string }).toolName ?? \"unknown\";\n return `Human declined approval for '${toolName}'`;\n }\n}\n","/**\n * Audit gate for logging all intents.\n *\n * Category: AUDIT (runs last, never blocks)\n */\n\nimport type { BaseEvent } from \"../events/types.js\";\nimport { BaseGate, GateAllow, GateCategory, type GateResult } from \"./base.js\";\n\n/** Logger interface — matches console.info signature. */\nexport interface AuditLogger {\n info(message: string, ...args: unknown[]): void;\n}\n\nexport class AuditGate extends BaseGate {\n readonly category = GateCategory.AUDIT;\n\n /** Recorded entries for testing/inspection. */\n readonly entries: Array<{ type: string; toolName: string; timestamp: Date }> = [];\n\n private _logger: AuditLogger | undefined;\n\n constructor(options?: { logger?: AuditLogger }) {\n super();\n this._logger = options?.logger;\n }\n\n async check(event: BaseEvent): Promise<GateResult> {\n const toolName = (event as { toolName?: string }).toolName ?? \"\";\n this.entries.push({\n type: event.type,\n toolName,\n timestamp: new Date(),\n });\n\n if (this._logger) {\n this._logger.info(`Intent: ${event.type}`, {\n type: event.type,\n toolName,\n runId: event.runId,\n });\n }\n\n return GateAllow;\n }\n}\n","/**\n * AgentRunner — The standard agentic execution loop on Vercel AI SDK.\n *\n * Ported from Python: systems/runners/agent.py\n *\n * Key differences from Python:\n * - Parallel tool execution via Promise.all (Python is sequential)\n * - Vercel AI SDK handles tool schema conversion (Python manually builds OpenAI JSON)\n * - maxSteps: 1 forces one LLM call per iteration for gate interception control\n * - MockLanguageModelV1 for testing (replaces Python's MockRunner)\n */\n\nimport type { ToolSchema } from \"@agentic-patterns/core\";\nimport {\n type CoreMessage,\n type LanguageModelV1,\n type ToolCallPart,\n type ToolResultPart,\n generateId,\n generateText,\n streamText,\n} from \"ai\";\n\nimport { type AgentEventBus, getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport { type AgentEvent, createEvent } from \"../events/types.js\";\nimport { convertHistory } from \"./message-utils.js\";\nimport type { AgentLike, RunOptions, RunResult, RunnerProtocol, ToolExecutor } from \"./types.js\";\n\n// Re-export AgentLike here so existing consumers importing from \"./agent-runner\"\n// (including the public barrel and workflow modules) continue to work.\nexport type { AgentLike };\n\n// ---------------------------------------------------------------------------\n// ToolCallBlocked error\n// ---------------------------------------------------------------------------\n\nexport class ToolCallBlocked extends Error {\n readonly toolName: string;\n readonly reason: string;\n\n constructor(toolName: string, reason: string) {\n super(`Tool call '${toolName}' blocked: ${reason}`);\n this.name = \"ToolCallBlocked\";\n this.toolName = toolName;\n this.reason = reason;\n }\n}\n\n// ---------------------------------------------------------------------------\n// AgentRunner\n// ---------------------------------------------------------------------------\n\n/**\n * The standard agentic execution loop.\n *\n * Executes agents using a tool loop pattern with the Vercel AI SDK.\n *\n * The runner implements an agentic tool loop:\n * 1. Send message to LLM with system prompt and tools\n * 2. If LLM returns tool_calls, execute them via toolExecutor (parallel)\n * 3. Feed tool results back to LLM\n * 4. Repeat until LLM returns final response or maxIterations reached\n */\nexport class AgentRunner implements RunnerProtocol {\n private _eventBus: AgentEventBus | undefined;\n private readonly _model: LanguageModelV1;\n\n constructor(model: LanguageModelV1, eventBus?: AgentEventBus) {\n this._model = model;\n this._eventBus = eventBus;\n }\n\n private get eventBus(): AgentEventBus {\n if (!this._eventBus) {\n this._eventBus = getAgentEventBus();\n }\n return this._eventBus;\n }\n\n private async emit(event: AgentEvent): Promise<unknown[]> {\n return this.eventBus.publish(event);\n }\n\n /**\n * Emit an intent event and check if it was blocked by a gate.\n * Returns true if allowed, false if blocked.\n */\n private async emitIntent(event: AgentEvent): Promise<boolean> {\n const results = await this.eventBus.publish(event);\n // If no gates, always allowed; if gates exist and returned empty list, blocked\n return results.length > 0 || this.eventBus.gates.length === 0;\n }\n\n /**\n * Convert agent tools to Vercel AI SDK tool format.\n */\n private convertTools(\n agent: AgentLike,\n _executor?: ToolExecutor,\n ): Record<string, { description: string; parameters: unknown }> {\n // AgentLike.getTools() returns unknown[] at the protocol boundary;\n // AgentRunner knows real agents produce ToolSchema[] and narrows here.\n const agentTools = agent.getTools() as ToolSchema[];\n if (agentTools.length === 0) return {};\n\n const tools: Record<string, { description: string; parameters: unknown }> = {};\n for (const t of agentTools) {\n const vercel = t.toVercelAI();\n tools[t.name] = {\n description: vercel.description,\n parameters: vercel.parameters,\n };\n }\n return tools;\n }\n\n async run(agent: AgentLike, message: string, options?: RunOptions): Promise<RunResult> {\n // Set event bus if provided\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const effectiveTraceId = options?.traceId ?? runId;\n const maxIterations = options?.maxIterations ?? 10;\n const toolExecutor = options?.toolExecutor;\n\n // Resolve model name and tools. Use the bound LanguageModelV1's actual\n // modelId for event attribution — agent.getModel() is the agent's\n // *declared* model (often a default) and can lie when the runtime\n // selected a different provider (e.g. agent declares claude-sonnet but\n // createRunner picked ollama qwen3:4b via OLLAMA_HOST).\n const modelName = this._model.modelId;\n const agentTools = agent.getTools() as ToolSchema[];\n const tools = this.convertTools(agent, toolExecutor);\n const hasTools = agentTools.length > 0;\n\n // Emit message start event (root of the trace)\n const startEvent = createEvent(\"agent.message.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: modelName,\n tools: agentTools.map((t) => t.name),\n },\n });\n const rootSpanId = startEvent.spanId;\n await this.emit(startEvent);\n\n // Build initial messages from history\n const messages: CoreMessage[] = [];\n if (options?.messageHistory) {\n messages.push(...convertHistory(options.messageHistory));\n }\n messages.push({ role: \"user\" as const, content: message });\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalToolCalls = 0;\n\n // Get system prompt\n const system = agent.renderInitialPrompt();\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n // Emit iteration start\n const iterStart = createEvent(\"agent.iteration.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: rootSpanId,\n iteration,\n maxIterations,\n });\n const iterSpanId = iterStart.spanId;\n await this.emit(iterStart);\n\n // Emit LLM call start\n const llmStart = createEvent(\"agent.llm.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n model: modelName,\n messageCount: messages.length + 1, // +1 for system\n hasTools,\n });\n const llmSpanId = llmStart.spanId;\n await this.emit(llmStart);\n\n const llmStartTime = Date.now();\n\n let result: Awaited<ReturnType<typeof generateText>>;\n try {\n result = await generateText({\n model: this._model,\n system,\n messages,\n tools: hasTools ? tools : undefined,\n maxSteps: 1, // Force single step for gate interception\n });\n } catch (e: unknown) {\n const llmDuration = Date.now() - llmStartTime;\n await this.emit(\n createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: llmDuration,\n hasToolCalls: false,\n finishReason: \"error\",\n }),\n );\n const err = e instanceof Error ? e : new Error(String(e));\n await this.emit(\n createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: err.name,\n message: err.message,\n recoverable: false,\n context: {},\n }),\n );\n throw e;\n }\n\n const llmDuration = Date.now() - llmStartTime;\n\n // Track token usage\n const iterInputTokens = result.usage?.promptTokens ?? 0;\n const iterOutputTokens = result.usage?.completionTokens ?? 0;\n totalInputTokens += iterInputTokens;\n totalOutputTokens += iterOutputTokens;\n\n const resultToolCalls = result.toolCalls ?? [];\n const hasToolCalls = resultToolCalls.length > 0;\n\n // If the model produced reasoning (extended-thinking, o-series, etc.),\n // emit a single thinking.start + completed agent.reasoning pair. The\n // non-streaming path can't expose per-delta events, so one summary is\n // the faithful best-effort mapping.\n const reasoningContent = (result as { reasoning?: string | undefined }).reasoning;\n if (reasoningContent && reasoningContent.length > 0) {\n await this.emit(\n createEvent(\"agent.thinking.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: llmSpanId,\n }),\n );\n await this.emit(\n createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningContent,\n isComplete: true,\n }),\n );\n }\n\n // Emit LLM call end\n await this.emit(\n createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: iterInputTokens,\n outputTokens: iterOutputTokens,\n durationMs: llmDuration,\n hasToolCalls,\n finishReason: hasToolCalls ? \"tool_calls\" : (result.finishReason ?? \"stop\"),\n }),\n );\n\n // No tool calls = done\n if (!hasToolCalls) {\n const content = result.text ?? \"\";\n\n // Emit iteration end\n await this.emit(\n createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: 0,\n hasMore: false,\n }),\n );\n\n // Emit message complete\n await this.emit(\n createEvent(\"agent.message.complete\", {\n traceId: effectiveTraceId,\n runId,\n spanId: rootSpanId,\n parentSpanId: rootSpanId,\n content,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n model: modelName,\n }),\n );\n\n return {\n response: content,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n toolCallsCount: totalToolCalls,\n iterations: iteration + 1,\n finishReason: result.finishReason ?? \"stop\",\n };\n }\n\n // Has tool calls — execute them in parallel\n for (const tc of resultToolCalls) {\n const intent = createEvent(\"agent.tool.intent\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n });\n const allowed = await this.emitIntent(intent);\n if (!allowed) {\n throw new ToolCallBlocked(tc.toolName, \"Blocked by gate\");\n }\n }\n\n // Parallel tool execution\n const toolResults = await Promise.all(\n resultToolCalls.map(async (tc) => {\n const tcStart = createEvent(\"agent.tool.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n });\n const tcSpanId = tcStart.spanId;\n await this.emit(tcStart);\n\n const startTime = Date.now();\n let toolResult: unknown;\n let errorMsg: string | undefined;\n\n try {\n if (toolExecutor) {\n toolResult = await toolExecutor.execute(\n tc.toolName,\n tc.args as Record<string, unknown>,\n );\n } else {\n toolResult = { error: \"No tool executor configured\" };\n errorMsg = \"No tool executor configured\";\n }\n } catch (e: unknown) {\n const err = e instanceof Error ? e : new Error(String(e));\n toolResult = { error: err.message };\n errorMsg = err.message;\n }\n\n const durationMs = Date.now() - startTime;\n totalToolCalls++;\n\n await this.emit(\n createEvent(\"agent.tool.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: tcSpanId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n result: toolResult,\n error: errorMsg,\n durationMs,\n resultTokens: 0,\n }),\n );\n\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: toolResult,\n };\n }),\n );\n\n // Append messages for next iteration\n const assistantContent: Array<ToolCallPart | { type: \"text\"; text: string }> = [];\n if (result.text) {\n assistantContent.push({ type: \"text\" as const, text: result.text });\n }\n for (const tc of resultToolCalls) {\n assistantContent.push({\n type: \"tool-call\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n messages.push({ role: \"assistant\" as const, content: assistantContent });\n\n const toolResultParts: ToolResultPart[] = toolResults.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n result: tr.result,\n }));\n messages.push({ role: \"tool\" as const, content: toolResultParts });\n\n // Emit iteration end\n await this.emit(\n createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: resultToolCalls.length,\n hasMore: true,\n }),\n );\n }\n\n // Max iterations exceeded\n return {\n response: \"\",\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n toolCallsCount: totalToolCalls,\n iterations: maxIterations,\n finishReason: \"max_iterations\",\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream() — Streaming execution loop using fullStream\n // ---------------------------------------------------------------------------\n\n async *stream(\n agent: AgentLike,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const effectiveTraceId = options?.traceId ?? runId;\n const maxIterations = options?.maxIterations ?? 10;\n const toolExecutor = options?.toolExecutor;\n const conversationId = generateId();\n\n const modelName = this._model.modelId;\n const agentTools = agent.getTools();\n const tools = this.convertTools(agent, toolExecutor);\n const hasTools = agentTools.length > 0;\n\n const system = agent.renderInitialPrompt();\n const messages: CoreMessage[] = [];\n if (options?.messageHistory) {\n messages.push(...convertHistory(options.messageHistory));\n }\n messages.push({ role: \"user\" as const, content: message });\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalToolCalls = 0;\n let fullText = \"\";\n\n // Conversation start\n const convStart = createEvent(\"agent.conversation.start\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n agentName: agent.role.name,\n });\n await this.emit(convStart);\n yield convStart;\n\n // Message start\n const msgStart = createEvent(\"agent.message.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n });\n const rootSpanId = msgStart.spanId;\n await this.emit(msgStart);\n yield msgStart;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n // Iteration start\n const iterStart = createEvent(\"agent.iteration.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: rootSpanId,\n iteration,\n maxIterations,\n });\n const iterSpanId = iterStart.spanId;\n await this.emit(iterStart);\n yield iterStart;\n\n // LLM start\n const llmStart = createEvent(\"agent.llm.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n model: modelName,\n messageCount: messages.length + 1,\n hasTools,\n });\n const llmSpanId = llmStart.spanId;\n await this.emit(llmStart);\n yield llmStart;\n\n const llmStartTime = Date.now();\n\n // Use fullStream to get text + tool calls + errors in one pass\n const streamResult = streamText({\n model: this._model,\n system,\n messages,\n tools: hasTools ? tools : undefined,\n maxSteps: 1,\n });\n\n let iterText = \"\";\n let chunkIndex = 0;\n const pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result?: unknown;\n }> = [];\n let stepUsage: { promptTokens: number; completionTokens: number } | undefined;\n let stepFinishReason = \"stop\";\n let hadError = false;\n\n // Reasoning-block tracking. Some models (Claude extended thinking,\n // o-series, Gemini 2.5 thinking, DeepSeek Reasoner) emit one or more\n // reasoning deltas before switching back to text/tool-calls. We emit\n // exactly one `agent.thinking.start` per block, stream per-delta\n // `agent.reasoning` events with `isComplete: false`, then one final\n // `agent.reasoning` with `isComplete: true` carrying the full\n // accumulated text when the block ends.\n let reasoningActive = false;\n let reasoningText = \"\";\n\n for await (const part of streamResult.fullStream) {\n switch (part.type) {\n case \"text-delta\": {\n // Transition reasoning -> text: close the reasoning block first.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n iterText += part.textDelta;\n const chunkEvent = createEvent(\"agent.message.chunk\", {\n traceId: effectiveTraceId,\n runId,\n delta: part.textDelta,\n chunkIndex: chunkIndex++,\n });\n await this.emit(chunkEvent);\n yield chunkEvent;\n break;\n }\n case \"reasoning\": {\n if (!reasoningActive) {\n reasoningActive = true;\n reasoningText = \"\";\n const startEvent = createEvent(\"agent.thinking.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: llmSpanId,\n });\n await this.emit(startEvent);\n yield startEvent;\n }\n reasoningText += part.textDelta;\n const deltaEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: part.textDelta,\n isComplete: false,\n });\n await this.emit(deltaEvent);\n yield deltaEvent;\n break;\n }\n case \"tool-call\": {\n // Transition reasoning -> tool-call: close the reasoning block.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n pendingToolCalls.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args as Record<string, unknown>,\n });\n break;\n }\n case \"step-finish\": {\n stepUsage = part.usage;\n stepFinishReason = part.finishReason;\n break;\n }\n case \"error\": {\n hadError = true;\n const llmDuration = Date.now() - llmStartTime;\n const llmEndErr = createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: llmDuration,\n hasToolCalls: false,\n finishReason: \"error\",\n });\n await this.emit(llmEndErr);\n yield llmEndErr;\n\n const err = part.error instanceof Error ? part.error : new Error(String(part.error));\n const errEvent = createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: err.name,\n message: err.message,\n recoverable: false,\n context: {},\n });\n await this.emit(errEvent);\n yield errEvent;\n break;\n }\n default:\n // step-start, finish, reasoning-signature, redacted-reasoning, etc. — skip\n break;\n }\n }\n\n // Stream ended while a reasoning block is still open — close it out.\n if (reasoningActive) {\n const reasoningCompleteEvent = createEvent(\"agent.reasoning\", {\n traceId: effectiveTraceId,\n runId,\n content: reasoningText,\n isComplete: true,\n });\n await this.emit(reasoningCompleteEvent);\n yield reasoningCompleteEvent;\n reasoningActive = false;\n reasoningText = \"\";\n }\n\n if (hadError) {\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"error\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n fullText += iterText;\n\n // Update token tracking\n const iterInputTokens = stepUsage?.promptTokens ?? 0;\n const iterOutputTokens = stepUsage?.completionTokens ?? 0;\n totalInputTokens += iterInputTokens;\n totalOutputTokens += iterOutputTokens;\n\n const hasToolCalls = pendingToolCalls.length > 0;\n const llmDuration = Date.now() - llmStartTime;\n\n // LLM end\n const llmEnd = createEvent(\"agent.llm.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: llmSpanId,\n parentSpanId: iterSpanId,\n model: modelName,\n inputTokens: iterInputTokens,\n outputTokens: iterOutputTokens,\n durationMs: llmDuration,\n hasToolCalls,\n finishReason: hasToolCalls ? \"tool_calls\" : stepFinishReason,\n });\n await this.emit(llmEnd);\n yield llmEnd;\n\n // No tool calls = done\n if (!hasToolCalls) {\n const iterEnd = createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: 0,\n hasMore: false,\n });\n await this.emit(iterEnd);\n yield iterEnd;\n\n const msgComplete = createEvent(\"agent.message.complete\", {\n traceId: effectiveTraceId,\n runId,\n spanId: rootSpanId,\n parentSpanId: rootSpanId,\n content: fullText,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n model: modelName,\n });\n await this.emit(msgComplete);\n yield msgComplete;\n\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"completed\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n // Process tool calls\n for (const tc of pendingToolCalls) {\n const intent = createEvent(\"agent.tool.intent\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n });\n await this.emit(intent);\n yield intent;\n\n const allowed = await this.emitIntent(intent);\n if (!allowed) {\n const errEvent = createEvent(\"agent.error\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n errorType: \"ToolCallBlocked\",\n message: `Tool call '${tc.toolName}' blocked by gate`,\n recoverable: false,\n context: {},\n });\n await this.emit(errEvent);\n yield errEvent;\n\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"error\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n return;\n }\n\n const tcStart = createEvent(\"agent.tool.start\", {\n traceId: effectiveTraceId,\n runId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n });\n const tcSpanId = tcStart.spanId;\n await this.emit(tcStart);\n yield tcStart;\n\n const startTime = Date.now();\n let toolResult: unknown;\n let errorMsg: string | undefined;\n\n try {\n if (toolExecutor) {\n toolResult = await toolExecutor.execute(tc.toolName, tc.args);\n } else {\n toolResult = { error: \"No tool executor configured\" };\n errorMsg = \"No tool executor configured\";\n }\n } catch (e: unknown) {\n const err = e instanceof Error ? e : new Error(String(e));\n toolResult = { error: err.message };\n errorMsg = err.message;\n }\n\n const durationMs = Date.now() - startTime;\n totalToolCalls++;\n tc.result = toolResult;\n\n const tcEnd = createEvent(\"agent.tool.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: tcSpanId,\n parentSpanId: iterSpanId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n arguments: tc.args,\n result: toolResult,\n error: errorMsg,\n durationMs,\n resultTokens: 0,\n });\n await this.emit(tcEnd);\n yield tcEnd;\n }\n\n // Build messages for next iteration\n const assistantContent: Array<ToolCallPart | { type: \"text\"; text: string }> = [];\n if (iterText) {\n assistantContent.push({ type: \"text\" as const, text: iterText });\n }\n for (const tc of pendingToolCalls) {\n assistantContent.push({\n type: \"tool-call\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n messages.push({ role: \"assistant\" as const, content: assistantContent });\n\n const toolResultParts: ToolResultPart[] = pendingToolCalls.map((tc) => ({\n type: \"tool-result\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: tc.result,\n }));\n messages.push({ role: \"tool\" as const, content: toolResultParts });\n\n // Iteration end\n const iterEnd = createEvent(\"agent.iteration.end\", {\n traceId: effectiveTraceId,\n runId,\n spanId: iterSpanId,\n parentSpanId: rootSpanId,\n iteration,\n toolCallsCount: pendingToolCalls.length,\n hasMore: true,\n });\n await this.emit(iterEnd);\n yield iterEnd;\n }\n\n // Max iterations reached\n const convEnd = createEvent(\"agent.conversation.end\", {\n traceId: effectiveTraceId,\n runId,\n conversationId,\n reason: \"completed\" as const,\n });\n await this.emit(convEnd);\n yield convEnd;\n }\n}\n","/**\n * Message history conversion — canonical format to Vercel AI SDK CoreMessage[].\n *\n * Ported from Python: _convert_history_to_messages() in runners/agent.py\n */\n\nimport type { CoreMessage } from \"ai\";\nimport type { CanonicalMessage } from \"./types.js\";\n\n/**\n * Convert canonical internal message format to Vercel AI SDK CoreMessage[].\n *\n * Canonical format (from orchestration layer):\n * { kind: \"request\", parts: [{ type: \"user_prompt\", content: \"...\" }] }\n * { kind: \"response\", parts: [\n * { type: \"text\", content: \"...\" },\n * { type: \"tool_call\", tool_name: \"...\", tool_call_id: \"...\", arguments: {} },\n * { type: \"tool_return\", tool_name: \"...\", tool_call_id: \"...\", content: \"...\" },\n * ]}\n *\n * Vercel AI SDK format:\n * { role: \"user\", content: \"...\" }\n * { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool-call\", ... }] }\n * { role: \"tool\", content: [{ type: \"tool-result\", ... }] }\n */\nexport function convertHistory(history: CanonicalMessage[]): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n for (const msg of history) {\n if (msg.kind === \"request\") {\n // Request messages contain user prompts\n for (const part of msg.parts) {\n if (part.type === \"user_prompt\" && part.content) {\n messages.push({ role: \"user\" as const, content: part.content });\n }\n // system_prompt parts are handled separately by agent.getSystemPrompt()\n }\n } else if (msg.kind === \"response\") {\n // Response messages contain assistant text and tool calls\n const textParts: string[] = [];\n const toolCalls: Array<{\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }> = [];\n const toolReturns: Array<{\n toolCallId: string;\n content: string;\n }> = [];\n\n for (const part of msg.parts) {\n if (part.type === \"text\" && part.content) {\n textParts.push(part.content);\n } else if (part.type === \"tool_call\") {\n toolCalls.push({\n toolCallId: part.tool_call_id ?? \"\",\n toolName: part.tool_name ?? \"\",\n args: part.arguments ?? {},\n });\n } else if (part.type === \"tool_return\") {\n toolReturns.push({\n toolCallId: part.tool_call_id ?? \"\",\n content: part.content ?? \"\",\n });\n }\n }\n\n // Build assistant message with content parts array for mixed text+tool calls\n if (textParts.length > 0 || toolCalls.length > 0) {\n if (toolCalls.length === 0) {\n // Text-only response\n messages.push({\n role: \"assistant\" as const,\n content: textParts.join(\"\"),\n });\n } else {\n // Mixed text + tool calls — use content array format\n const contentParts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n > = [];\n\n if (textParts.length > 0) {\n contentParts.push({ type: \"text\", text: textParts.join(\"\") });\n }\n for (const tc of toolCalls) {\n contentParts.push({\n type: \"tool-call\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n });\n }\n\n messages.push({\n role: \"assistant\" as const,\n content: contentParts,\n });\n }\n }\n\n // Tool results as separate tool messages\n if (toolReturns.length > 0) {\n const toolResultParts = toolReturns.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: \"\", // not available in canonical format\n result: tr.content,\n }));\n messages.push({\n role: \"tool\" as const,\n content: toolResultParts,\n });\n }\n }\n }\n\n return messages;\n}\n","/**\n * ClaudeCodeRunner — Runner backed by the Claude Agent SDK.\n *\n * Mirrors Python: agentic_patterns/core/systems/runners/claude_code.py\n *\n * Wraps the Claude Agent SDK's query() function to execute agents through\n * Claude Code's subprocess-based architecture. Claude Code manages its own\n * tool loop, so toolExecutor is accepted for interface compatibility but\n * not used.\n *\n * Event bridging:\n * - PreToolUse hook → ToolCallIntent (gate chain) + ToolCallStartEvent\n * - PostToolUse hook → ToolCallEndEvent with result\n * - SDKAssistantMessage → MessageStart/Complete, Reasoning\n * - SDKResultMessage → MessageComplete with usage stats\n * - SDKPartialAssistantMessage → MessageChunk (streaming)\n */\n\nimport type { ToolSchema } from \"@agentic-patterns/core\";\nimport {\n type HookCallback,\n type HookCallbackMatcher,\n type Options as SDKOptions,\n query,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { generateId } from \"ai\";\n\nimport { type AgentEventBus, getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport { type AgentEvent, createEvent } from \"../events/types.js\";\nimport { type AgentLikeForBridge, buildAgentServers } from \"./sdk-bridge.js\";\nimport type { RunOptions, RunResult, RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Model mapping\n// ---------------------------------------------------------------------------\n\nconst MODEL_MAP: Record<string, string> = {\n opus: \"opus\",\n sonnet: \"sonnet\",\n haiku: \"haiku\",\n};\n\nfunction mapModel(modelName: string): string | undefined {\n const lower = modelName.toLowerCase();\n for (const [key, value] of Object.entries(MODEL_MAP)) {\n if (lower.includes(key)) return value;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Correlation id plumbing\n//\n// When the runner invokes the Claude Agent SDK, the SDK spawns a Claude Code\n// CLI subprocess whose hooks POST back to our server. We tag those hooks\n// with a correlation id via the `AP_RUNNER_CORRELATION_ID` env var so the\n// server knows the runner is already observing the session — the raw\n// `claude_code.hook` event is still kept (PreCompact, PermissionRequest,\n// etc. give value the runner doesn't emit) but the derived\n// `agent.tool.start`/`agent.tool.end` events are SUPPRESSED to avoid\n// double-counting alongside the runner's own tool events.\n// ---------------------------------------------------------------------------\n\nexport const AP_RUNNER_CORRELATION_ENV = \"AP_RUNNER_CORRELATION_ID\";\n\nfunction newCorrelationId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Set `AP_RUNNER_CORRELATION_ID` on `process.env` for the duration of an\n * SDK invocation. Returns a restore function that puts the previous value\n * back (or deletes the key if it wasn't set). Safe to call in environments\n * without `process` — becomes a no-op.\n *\n * Child processes spawned transitively by the SDK inherit this env var,\n * which is what `hooks/emit.mjs` reads to tag its POSTs.\n */\nfunction setCorrelationEnv(id: string): () => void {\n if (typeof process === \"undefined\" || !process.env) {\n return () => {\n /* no-op */\n };\n }\n const prior = process.env[AP_RUNNER_CORRELATION_ENV];\n process.env[AP_RUNNER_CORRELATION_ENV] = id;\n return () => {\n if (prior === undefined) {\n delete process.env[AP_RUNNER_CORRELATION_ENV];\n } else {\n process.env[AP_RUNNER_CORRELATION_ENV] = prior;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// ClaudeCodeRunner\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeRunnerOptions {\n /** Default SDK options applied before per-run overrides. */\n defaults?: Partial<SDKOptions>;\n /** Optional event bus for emitting agent events. */\n eventBus?: AgentEventBus;\n}\n\n/**\n * Runner that delegates execution to Claude Code via the Agent SDK.\n *\n * Claude Code manages its own tool loop, permissions, and file access.\n * This runner translates SDK messages into the AgentEvent stream so that\n * the rest of the framework (gates, exporters, UX) works transparently.\n *\n * Gate enforcement is handled via PreToolUse hooks — if a gate blocks a\n * ToolCallIntent, the hook returns `permissionDecision: 'deny'` to the\n * SDK so the tool is never executed.\n */\nexport class ClaudeCodeRunner implements RunnerProtocol {\n protected _eventBus: AgentEventBus | undefined;\n protected readonly _defaults: Partial<SDKOptions>;\n\n constructor(opts?: ClaudeCodeRunnerOptions) {\n this._eventBus = opts?.eventBus;\n this._defaults = opts?.defaults ?? {};\n }\n\n protected get eventBus(): AgentEventBus {\n if (!this._eventBus) {\n this._eventBus = getAgentEventBus();\n }\n return this._eventBus;\n }\n\n protected async emit(event: AgentEvent): Promise<void> {\n await this.eventBus.publish(event);\n }\n\n /**\n * Publish a ToolCallIntent through the gate chain.\n * Returns true if the intent was allowed, false if blocked.\n */\n protected async emitIntent(intent: AgentEvent & { type: \"agent.tool.intent\" }): Promise<boolean> {\n // Track whether a gate blocked the intent by listening for rejection events.\n // We can't use publish()'s return value because an empty array means either\n // \"blocked by gate\" or \"no subscribers\" — both return [].\n let blocked = false;\n const onRejected = () => {\n blocked = true;\n };\n this.eventBus.subscribe(\"agent.tool.rejected\", onRejected);\n try {\n await this.eventBus.publish(intent);\n } finally {\n this.eventBus.unsubscribe(\"agent.tool.rejected\", onRejected);\n }\n return !blocked;\n }\n\n async run(agent: AgentLikeForBridge, message: string, options?: RunOptions): Promise<RunResult> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const traceId = options?.traceId ?? runId;\n const correlationId = newCorrelationId();\n\n // Build SDK options with hooks for gate enforcement\n const sdkOptions = this._buildOptions(agent, options, {\n runId,\n traceId,\n parentSpanId: options?.parentSpanId,\n });\n\n // Emit message start\n const startEvent = createEvent(\"agent.message.start\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: agent.getModel(),\n tools: agent.getTools().map((t: ToolSchema) => t.name),\n runnerCorrelationId: correlationId,\n },\n });\n await this.emit(startEvent);\n\n const contentParts: string[] = [];\n let toolCallsMade = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n const model = agent.getModel();\n\n const restoreCorrelation = setCorrelationEnv(correlationId);\n\n try {\n for await (const msg of query({ prompt: message, options: sdkOptions })) {\n if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n contentParts.push(block.text);\n } else if (\"thinking\" in block && typeof block.thinking === \"string\") {\n await this.emit(\n createEvent(\"agent.reasoning\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n content: block.thinking,\n isComplete: true,\n }),\n );\n } else if (\"name\" in block) {\n // ToolUseBlock — count only; event emission handled by hooks\n toolCallsMade++;\n }\n }\n }\n } else if (msg.type === \"result\") {\n if (\"usage\" in msg && msg.usage) {\n const usage = msg.usage as unknown as Record<string, number>;\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (\"result\" in msg && typeof msg.result === \"string\" && contentParts.length === 0) {\n contentParts.push(msg.result);\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n await this.emit(\n createEvent(\"agent.error\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n errorType: error.name,\n message: error.message,\n recoverable: false,\n context: {},\n }),\n );\n throw err;\n } finally {\n restoreCorrelation();\n }\n\n const content = contentParts.join(\"\");\n\n await this.emit(\n createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n spanId: startEvent.spanId,\n parentSpanId: startEvent.spanId,\n content,\n inputTokens,\n outputTokens,\n model,\n }),\n );\n\n return {\n response: content,\n inputTokens,\n outputTokens,\n toolCallsCount: toolCallsMade,\n iterations: 1, // Claude Code manages its own loop\n finishReason: \"stop\",\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream() — streaming mode with MessageChunk events\n // ---------------------------------------------------------------------------\n\n async *stream(\n agent: AgentLikeForBridge,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n if (options?.eventBus) {\n this._eventBus = options.eventBus;\n }\n\n const runId = generateId();\n const traceId = options?.traceId ?? runId;\n const correlationId = newCorrelationId();\n\n const sdkOptions = this._buildOptions(agent, options, {\n runId,\n traceId,\n parentSpanId: options?.parentSpanId,\n includePartialMessages: true,\n });\n\n // Emit and yield message start\n const startEvent = createEvent(\"agent.message.start\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n agentName: agent.role.name,\n agentConfig: {\n role: agent.role.name,\n model: agent.getModel(),\n tools: agent.getTools().map((t: ToolSchema) => t.name),\n runnerCorrelationId: correlationId,\n },\n });\n await this.emit(startEvent);\n yield startEvent;\n\n const contentParts: string[] = [];\n let chunkIndex = 0;\n let gotChunks = false;\n let toolCallsMade = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n const model = agent.getModel();\n\n const restoreCorrelation = setCorrelationEnv(correlationId);\n\n try {\n for await (const msg of query({ prompt: message, options: sdkOptions })) {\n // Partial/streaming messages → MessageChunk events\n const msgType = msg.type as string;\n if (msgType === \"stream_event\" && \"event\" in msg) {\n const streamMsg = msg as unknown as { event?: { delta?: { text?: string } } };\n const text = streamMsg.event?.delta?.text;\n if (text) {\n const chunkEvent = createEvent(\"agent.message.chunk\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n delta: text,\n chunkIndex,\n });\n await this.emit(chunkEvent);\n yield chunkEvent;\n contentParts.push(text);\n chunkIndex++;\n gotChunks = true;\n }\n } else if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n // Skip if chunks already captured this text\n if (!gotChunks) {\n contentParts.push(block.text);\n }\n } else if (\"thinking\" in block && typeof block.thinking === \"string\") {\n const reasoningEvent = createEvent(\"agent.reasoning\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n content: block.thinking,\n isComplete: true,\n });\n await this.emit(reasoningEvent);\n yield reasoningEvent;\n } else if (\"name\" in block) {\n // Count only; events emitted by hooks\n toolCallsMade++;\n }\n }\n }\n } else if (msg.type === \"result\") {\n if (\"usage\" in msg && msg.usage) {\n const usage = msg.usage as unknown as Record<string, number>;\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (\"result\" in msg && typeof msg.result === \"string\" && contentParts.length === 0) {\n contentParts.push(msg.result);\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const errorEvent = createEvent(\"agent.error\", {\n traceId,\n runId,\n parentSpanId: options?.parentSpanId,\n errorType: error.name,\n message: error.message,\n recoverable: false,\n context: {},\n });\n await this.emit(errorEvent);\n throw err;\n } finally {\n restoreCorrelation();\n }\n\n const finalContent = contentParts.join(\"\");\n const completeEvent = createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n spanId: startEvent.spanId,\n parentSpanId: startEvent.spanId,\n content: finalContent,\n inputTokens,\n outputTokens,\n model,\n });\n await this.emit(completeEvent);\n yield completeEvent;\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n protected _buildOptions(\n agent: AgentLikeForBridge,\n options: RunOptions | undefined,\n context: {\n runId: string;\n traceId: string;\n parentSpanId?: string;\n includePartialMessages?: boolean;\n },\n ): SDKOptions {\n const sdkOpts: SDKOptions = {\n ...this._defaults,\n systemPrompt: agent.getSystemPrompt(),\n model: mapModel(agent.getModel()) ?? this._defaults.model,\n maxTurns: options?.maxIterations ?? 10,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n hooks: this._makeHooks(context.runId, context.traceId, context.parentSpanId),\n };\n\n if (context.includePartialMessages) {\n sdkOpts.includePartialMessages = true;\n }\n\n // Wire agent capabilities as SDK MCP servers\n if (agent.role.capabilities.length > 0) {\n const { mcpServers, allowedTools } = buildAgentServers(agent);\n if (Object.keys(mcpServers).length > 0) {\n sdkOpts.mcpServers = mcpServers as SDKOptions[\"mcpServers\"];\n sdkOpts.allowedTools = [...(sdkOpts.allowedTools ?? []), ...allowedTools];\n }\n }\n\n return sdkOpts;\n }\n\n /**\n * Create SDK hook definitions that bridge to AgentEvent emissions.\n *\n * PreToolUse: emits ToolCallIntent through the gate chain. If gates\n * block the intent, returns `permissionDecision: 'deny'` to the SDK\n * so the tool is never executed. Otherwise emits ToolCallStartEvent.\n *\n * PostToolUse: emits ToolCallEndEvent with the tool result.\n */\n private _makeHooks(\n runId: string,\n traceId: string,\n parentSpanId: string | undefined,\n ): Partial<Record<string, HookCallbackMatcher[]>> {\n // Map tool_use_id → span_id so start/end events share the same\n // span_id (required by exporters like Langfuse to correlate them).\n const tcSpanIds = new Map<string, string>();\n\n const onPreToolUse: HookCallback = async (input, toolUseId, _opts) => {\n const toolName = ((input as Record<string, unknown>).tool_name as string) ?? \"\";\n const toolInput = (input as Record<string, unknown>).tool_input;\n const tcId = toolUseId ?? generateId();\n const args =\n typeof toolInput === \"object\" && toolInput !== null\n ? (toolInput as Record<string, unknown>)\n : {};\n\n // Run intent through gate chain\n const intent = createEvent(\"agent.tool.intent\", {\n runId,\n traceId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n });\n\n const allowed = await this.emitIntent(intent);\n\n if (!allowed) {\n // Gate blocked — tell the SDK to deny this tool call\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: \"Blocked by gate\",\n },\n };\n }\n\n // Allowed — emit start event and remember its span_id\n const startEvent = createEvent(\"agent.tool.start\", {\n runId,\n traceId,\n parentSpanId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n });\n tcSpanIds.set(tcId, startEvent.spanId);\n await this.emit(startEvent);\n return {};\n };\n\n const onPostToolUse: HookCallback = async (input, toolUseId, _opts) => {\n const toolName = ((input as Record<string, unknown>).tool_name as string) ?? \"\";\n const toolInput = (input as Record<string, unknown>).tool_input;\n const toolResponse = (input as Record<string, unknown>).tool_response;\n const tcId = toolUseId ?? generateId();\n const args =\n typeof toolInput === \"object\" && toolInput !== null\n ? (toolInput as Record<string, unknown>)\n : {};\n\n // Reuse span_id from the matching start event so exporters\n // can correlate the pair.\n const spanId = tcSpanIds.get(tcId);\n tcSpanIds.delete(tcId);\n\n const endEvent = createEvent(\"agent.tool.end\", {\n runId,\n traceId,\n parentSpanId,\n toolCallId: tcId,\n toolName,\n arguments: args,\n result: toolResponse,\n durationMs: 0,\n resultTokens: 0,\n ...(spanId ? { spanId } : {}),\n });\n await this.emit(endEvent);\n return {};\n };\n\n return {\n PreToolUse: [{ hooks: [onPreToolUse] }],\n PostToolUse: [{ hooks: [onPostToolUse] }],\n };\n }\n}\n","/**\n * SDK Bridge — converts framework capabilities to Claude Agent SDK MCP servers.\n *\n * Mirrors Python: agentic_patterns/core/systems/tools/sdk_bridge.py\n *\n * Each Capability becomes a named MCP server with tools derived from\n * the capability's Toolbox and optional Playbook. The runner wires these\n * servers into the SDK options so Claude Code can call them as\n * `mcp__{server}__{tool}`.\n */\n\nimport type { Capability, ToolSchema, Toolbox } from \"@agentic-patterns/core\";\nimport { createSdkMcpServer, tool as sdkTool } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ZodObject, ZodRawShape } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Zod shape extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the raw shape from a ZodTypeAny that is actually a ZodObject.\n * The SDK's tool() expects ZodRawShape (e.g. { query: z.string() }),\n * but our Toolbox stores ZodTypeAny. This safely extracts the shape.\n */\nfunction extractShape(schema: unknown): ZodRawShape {\n const obj = schema as ZodObject<ZodRawShape>;\n if (obj && typeof obj === \"object\" && \"shape\" in obj) {\n return obj.shape as ZodRawShape;\n }\n // Fallback: empty shape (tool takes no arguments)\n return {};\n}\n\n// ---------------------------------------------------------------------------\n// Toolbox → SDK MCP tools\n// ---------------------------------------------------------------------------\n\nfunction toolsFromToolbox(toolbox: Toolbox) {\n const sdkTools = [];\n for (const [name, def] of Object.entries(toolbox.tools)) {\n const shape = extractShape(def.parameters);\n sdkTools.push(\n sdkTool(name, def.description, shape, async (args: Record<string, unknown>) => {\n const result = await toolbox.execute(name, args);\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? \"\");\n const isError = typeof result === \"object\" && result !== null && \"error\" in result;\n return {\n content: [{ type: \"text\" as const, text }],\n ...(isError ? { isError: true } : {}),\n };\n }),\n );\n }\n return sdkTools;\n}\n\n// ---------------------------------------------------------------------------\n// Capability → server\n// ---------------------------------------------------------------------------\n\nfunction toSnake(name: string): string {\n return name\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/^_|_$/g, \"\")\n .toLowerCase();\n}\n\nexport function buildCapabilityServer(capability: Capability) {\n const serverName = toSnake(capability.name);\n const sdkTools = toolsFromToolbox(capability.toolbox);\n\n // Add playbook plays as SDK tools if present\n if (capability.playbook) {\n for (const [name, def] of Object.entries(capability.playbook.plays)) {\n const shape = extractShape(def.parameters);\n const playbook = capability.playbook;\n sdkTools.push(\n sdkTool(name, def.description, shape, async (args: Record<string, unknown>) => {\n const result = await playbook.execute(name, args);\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? \"\");\n const isError = typeof result === \"object\" && result !== null && \"error\" in result;\n return {\n content: [{ type: \"text\" as const, text }],\n ...(isError ? { isError: true } : {}),\n };\n }),\n );\n }\n }\n\n const serverConfig = createSdkMcpServer({\n name: serverName,\n tools: sdkTools,\n });\n\n const allowedTools = sdkTools.map((t: { name: string }) => `mcp__${serverName}__${t.name}`);\n return { serverName, serverConfig, allowedTools };\n}\n\n// ---------------------------------------------------------------------------\n// Agent → all servers\n// ---------------------------------------------------------------------------\n\nexport interface AgentLikeForBridge {\n readonly role: {\n readonly name: string;\n readonly capabilities: ReadonlyArray<Capability>;\n };\n getModel(): string;\n getTools(): ToolSchema[];\n getSystemPrompt(): string;\n renderInitialPrompt(): string;\n}\n\nexport function buildAgentServers(agent: AgentLikeForBridge) {\n const mcpServers: Record<string, unknown> = {};\n const allowedTools: string[] = [];\n\n for (const cap of agent.role.capabilities) {\n const { serverName, serverConfig, allowedTools: tools } = buildCapabilityServer(cap);\n mcpServers[serverName] = serverConfig;\n allowedTools.push(...tools);\n }\n\n return { mcpServers, allowedTools };\n}\n","/**\n * ClaudeCodeAPIRunner — Claude Agent SDK in plain-API mode.\n *\n * The agent runs through the Claude Code subprocess but in a sandboxed\n * configuration that strips everything CC-flavored:\n *\n * - System prompt: framework's, fully replacing CC's.\n * - Built-in tools (Read/Bash/Edit/...): disabled via `tools: []`.\n * - claude.ai connector MCP servers (Gmail/Calendar/Drive/...):\n * disabled by isolating CLAUDE_CONFIG_DIR to an ephemeral tmpdir.\n * - User/project settings, plugins, skills, hooks: not loaded\n * (settingSources defaults to []; new CLAUDE_CONFIG_DIR is empty).\n * - MCP servers from agent capabilities: still wired up.\n *\n * Auth: reads the Max-subscription OAuth token from the OS credential\n * store and injects it via `CLAUDE_CODE_OAUTH_TOKEN`. This bypasses\n * the binary's path-bound Keychain lookup (which would otherwise fail\n * when CLAUDE_CONFIG_DIR is redirected) while preserving Max-sub auth.\n *\n * Currently macOS-only — credential lookup uses the `security` CLI.\n * On other platforms, falls back to the parent ClaudeCodeRunner\n * behavior (auth works, connectors leak — see ClaudeCodeRunner docs).\n *\n * Mirrors Python: agentic_patterns/core/systems/runners/claude_api.py\n */\n\nimport { execSync } from \"node:child_process\";\nimport { mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { Options as SDKOptions } from \"@anthropic-ai/claude-agent-sdk\";\n\nimport { ClaudeCodeRunner, type ClaudeCodeRunnerOptions } from \"./claude-code-runner.js\";\nimport type { AgentLikeForBridge } from \"./sdk-bridge.js\";\nimport type { RunOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// OAuth loading\n// ---------------------------------------------------------------------------\n\ninterface OAuthCredential {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n subscriptionType?: string;\n}\n\n/**\n * Read the Max-subscription OAuth token from the OS credential store.\n * Returns null if unavailable (non-macOS, not logged in, etc.) — caller\n * falls back to letting the CC binary do its own auth lookup.\n */\nfunction loadMaxSubOAuth(): OAuthCredential | null {\n if (process.platform !== \"darwin\") return null;\n const user = process.env.USER;\n if (!user) return null;\n try {\n const raw = execSync(\n `security find-generic-password -a \"${user}\" -s \"Claude Code-credentials\" -w`,\n { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n const parsed = JSON.parse(raw) as { claudeAiOauth?: OAuthCredential };\n const oauth = parsed.claudeAiOauth;\n if (!oauth?.accessToken) return null;\n return oauth;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Runner\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeAPIRunnerOptions extends ClaudeCodeRunnerOptions {\n /**\n * Disable the OAuth-injection sandboxing path. When true, behaves\n * like a stripped ClaudeCodeRunner with `tools: []` only — auth and\n * connectors fall through to the binary's defaults.\n *\n * Useful for debugging or for environments where the OS credential\n * store is unavailable.\n */\n disableSandbox?: boolean;\n\n /**\n * Tool names or `mcp__<server>` server-prefixes to additionally\n * block via SDK `disallowedTools`. Rarely needed when sandboxing\n * is enabled (connectors are already stripped via config isolation).\n */\n extraDisallowedTools?: string[];\n}\n\n/**\n * Runner that uses the Claude Agent SDK as a plain Claude API call,\n * sandboxed away from the user's Claude Code environment.\n *\n * Drops in for AgentRunner — both implement RunnerProtocol identically.\n */\nexport class ClaudeCodeAPIRunner extends ClaudeCodeRunner {\n private readonly _disableSandbox: boolean;\n private readonly _extraDisallowed: readonly string[];\n private readonly _isolatedConfigDir: string | null;\n\n constructor(opts?: ClaudeCodeAPIRunnerOptions) {\n super(opts);\n this._disableSandbox = opts?.disableSandbox ?? false;\n this._extraDisallowed = opts?.extraDisallowedTools ?? [];\n this._isolatedConfigDir = this._disableSandbox\n ? null\n : mkdtempSync(join(tmpdir(), \"ap-cc-api-\"));\n }\n\n protected override _buildOptions(\n agent: AgentLikeForBridge,\n options: RunOptions | undefined,\n context: {\n runId: string;\n traceId: string;\n parentSpanId?: string;\n includePartialMessages?: boolean;\n },\n ): SDKOptions {\n const sdkOpts = super._buildOptions(agent, options, context);\n\n // Disable every built-in CC tool. MCP servers from agent capabilities\n // were already added by the parent and remain available.\n (sdkOpts as SDKOptions & { tools?: string[] }).tools = [];\n\n if (this._extraDisallowed.length > 0) {\n sdkOpts.disallowedTools = [\n ...(sdkOpts.disallowedTools ?? []),\n ...this._extraDisallowed,\n ];\n }\n\n // Sandbox: redirect CLAUDE_CONFIG_DIR + inject OAuth token via env.\n // Strips connectors, settings, plugins, skills, hooks — without\n // breaking Max-sub auth.\n if (!this._disableSandbox && this._isolatedConfigDir) {\n const oauth = loadMaxSubOAuth();\n if (oauth) {\n const baseEnv: Record<string, string> = Object.fromEntries(\n Object.entries(process.env).filter(([, v]) => typeof v === \"string\") as [string, string][],\n );\n sdkOpts.env = {\n ...baseEnv,\n ...(sdkOpts.env ?? {}),\n CLAUDE_CONFIG_DIR: this._isolatedConfigDir,\n CLAUDE_CODE_OAUTH_TOKEN: oauth.accessToken,\n };\n }\n // If oauth load failed (non-macOS, not logged in), fall through\n // to the parent's behavior — auth still works, connectors leak.\n }\n\n return sdkOpts;\n }\n}\n","/**\n * MockRunner — Deterministic runner for testing agents without LLM calls.\n *\n * Pattern-based response routing with tool call simulation and event emission.\n * Implements RunnerProtocol for drop-in testing.\n */\n\nimport { generateId } from \"ai\";\n\nimport type { AgentEvent } from \"../events/types.js\";\nimport { createEvent } from \"../events/types.js\";\nimport type { AgentLike, RunOptions, RunResult, RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A canned response for the mock runner. */\nexport interface MockResponse {\n content: string;\n toolCalls?: Array<{\n name: string;\n arguments: Record<string, unknown>;\n result?: unknown;\n }>;\n inputTokens?: number;\n outputTokens?: number;\n delayMs?: number;\n error?: Error;\n}\n\n/** A recorded call to the mock runner. */\nexport interface MockCall {\n message: string;\n agentName: string;\n model: string;\n timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// MockRunner\n// ---------------------------------------------------------------------------\n\n/**\n * Deterministic runner for testing agents without LLM calls.\n *\n * Supports substring-based trigger matching, wildcard defaults,\n * tool call simulation, delay simulation, and full event lifecycle.\n *\n * Example:\n * const runner = new MockRunner()\n * .addResponse(\"hello\", { content: \"Hi there!\" })\n * .addResponse(\"*\", { content: \"Default response\" });\n */\nexport class MockRunner implements RunnerProtocol {\n private _responses: Array<{ trigger: string; response: MockResponse }> = [];\n private _callHistory: MockCall[] = [];\n\n /** Read-only call history. */\n get callHistory(): readonly MockCall[] {\n return this._callHistory;\n }\n\n /**\n * Add a canned response.\n *\n * @param trigger - Substring to match against the message, or \"*\" for wildcard default.\n * @param response - The response to return when triggered.\n * @returns this for fluent chaining.\n */\n addResponse(trigger: string, response: MockResponse): this {\n this._responses.push({ trigger, response });\n return this;\n }\n\n /**\n * Clear all responses and call history.\n *\n * @returns this for fluent chaining.\n */\n clear(): this {\n this._responses = [];\n this._callHistory = [];\n return this;\n }\n\n /**\n * Execute an agent and return a result (non-streaming).\n */\n async run(agent: AgentLike, message: string, options?: RunOptions): Promise<RunResult> {\n const matched = this._findResponse(message);\n\n this._callHistory.push({\n message,\n agentName: agent.role.name,\n model: agent.getModel(),\n timestamp: new Date(),\n });\n\n if (matched.delayMs && matched.delayMs > 0) {\n await delay(matched.delayMs);\n }\n\n if (matched.error) {\n throw matched.error;\n }\n\n let toolCallsCount = 0;\n if (matched.toolCalls) {\n if (options?.toolExecutor) {\n for (const tc of matched.toolCalls) {\n await options.toolExecutor.execute(tc.name, tc.arguments);\n toolCallsCount++;\n }\n } else {\n toolCallsCount = matched.toolCalls.length;\n }\n }\n\n return {\n response: matched.content,\n inputTokens: matched.inputTokens ?? 0,\n outputTokens: matched.outputTokens ?? 0,\n toolCallsCount,\n iterations: 1,\n finishReason: \"stop\",\n };\n }\n\n /**\n * Execute an agent with streaming event emission.\n */\n async *stream(\n agent: AgentLike,\n message: string,\n options?: RunOptions,\n ): AsyncGenerator<AgentEvent> {\n const traceId = options?.traceId ?? generateId();\n const runId = generateId();\n\n yield createEvent(\"agent.message.start\", {\n traceId,\n runId,\n agentName: agent.role.name,\n });\n\n const matched = this._findResponse(message);\n\n this._callHistory.push({\n message,\n agentName: agent.role.name,\n model: agent.getModel(),\n timestamp: new Date(),\n });\n\n if (matched.delayMs && matched.delayMs > 0) {\n await delay(matched.delayMs);\n }\n\n if (matched.error) {\n yield createEvent(\"agent.error\", {\n traceId,\n runId,\n errorType: matched.error.name,\n message: matched.error.message,\n recoverable: false,\n context: {},\n });\n return;\n }\n\n if (matched.toolCalls) {\n for (const tc of matched.toolCalls) {\n const toolCallId = generateId();\n yield createEvent(\"agent.tool.start\", {\n traceId,\n runId,\n toolCallId,\n toolName: tc.name,\n arguments: tc.arguments,\n });\n\n let result: unknown = tc.result ?? null;\n let error: string | undefined;\n if (options?.toolExecutor) {\n try {\n result = await options.toolExecutor.execute(tc.name, tc.arguments);\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n }\n\n yield createEvent(\"agent.tool.end\", {\n traceId,\n runId,\n toolCallId,\n toolName: tc.name,\n arguments: tc.arguments,\n result,\n error,\n durationMs: 0,\n resultTokens: 0,\n });\n }\n }\n\n yield createEvent(\"agent.message.chunk\", {\n traceId,\n runId,\n delta: matched.content,\n chunkIndex: 0,\n });\n\n yield createEvent(\"agent.message.complete\", {\n traceId,\n runId,\n content: matched.content,\n inputTokens: matched.inputTokens ?? 0,\n outputTokens: matched.outputTokens ?? 0,\n model: agent.getModel(),\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n /** Find matching response: substring first, then wildcard, then auto-fallback. */\n private _findResponse(message: string): MockResponse {\n for (const entry of this._responses) {\n if (entry.trigger !== \"*\" && message.includes(entry.trigger)) {\n return entry.response;\n }\n }\n for (const entry of this._responses) {\n if (entry.trigger === \"*\") {\n return entry.response;\n }\n }\n return { content: `Mock response to: ${message}` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * ToolboxExecutor — adapts an agent's Capability toolboxes into the\n * ToolExecutor interface that AgentRunner needs to actually execute\n * tool calls.\n *\n * Without this, AgentRunner can FORMAT tool schemas for the LLM but\n * can't EXECUTE them — tool calls silently return\n * \"No tool executor configured\".\n */\n\nimport type { ToolExecutor } from \"./types.js\";\n\n/** Minimal shape — matches what Agent.role.capabilities[].toolbox exposes. */\ninterface ToolboxLike {\n readonly name: string;\n execute(name: string, args: unknown): Promise<unknown>;\n readonly tools: Record<string, { execute: (args: Record<string, unknown>) => Promise<unknown> }>;\n}\n\n/** Minimal shape — matches what Agent.role.capabilities[] exposes. */\ninterface CapabilityLike {\n readonly toolbox: ToolboxLike;\n}\n\n/** Minimal shape — matches what Agent.role exposes. */\ninterface AgentWithCapabilities {\n readonly role: {\n readonly name: string;\n readonly capabilities?: readonly CapabilityLike[];\n };\n}\n\n/**\n * Build a `ToolExecutor` from an agent's capability toolboxes.\n *\n * Iterates the agent's capabilities, indexes every tool by name, and\n * dispatches `execute(name, args)` to the owning toolbox. Handles the\n * `mcp__<toolbox>__<tool>` naming convention that MCP-bridged tools use.\n */\nexport function createToolboxExecutor(agent: AgentWithCapabilities): ToolExecutor {\n // Build a lookup: toolName → toolbox.execute\n const lookup = new Map<string, ToolboxLike>();\n const capabilities = agent.role.capabilities ?? [];\n\n for (const cap of capabilities) {\n const tb = cap.toolbox;\n for (const toolName of Object.keys(tb.tools)) {\n // Register under plain name\n lookup.set(toolName, tb);\n // Also register under MCP-prefixed name (mcp__<toolbox>__<tool>)\n lookup.set(`mcp__${tb.name}__${toolName}`, tb);\n }\n }\n\n return {\n async execute(name: string, args: Record<string, unknown>): Promise<unknown> {\n // Try exact match first\n const tb = lookup.get(name);\n if (tb) {\n // Strip MCP prefix to get the actual tool name the toolbox expects\n const actualName = name.includes(\"__\") ? name.split(\"__\").pop()! : name;\n return tb.execute(actualName, args);\n }\n throw new Error(`Tool \"${name}\" not found. Available: ${[...lookup.keys()].join(\", \")}`);\n },\n };\n}\n","/**\n * `createRunner()` — zero-config runner factory.\n *\n * Selection priority (first match wins):\n * 1. options.runner → use it verbatim\n * 2. options.model (LanguageModelV1) → new AgentRunner(model)\n * 3. options.provider + tier/modelId → new AgentRunner(provider.load(...))\n * 4. env vars (in PROVIDER_PRIORITY order) → new AgentRunner(...)\n * 5. claude CLI on PATH → new ClaudeCodeAPIRunner() (fallback, limited events)\n * 6. options.fallbackToMock === true → new MockRunner()\n * 7. throw\n *\n * See docs/runners.md (§4) for the design doc.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { LanguageModelV1 } from \"ai\";\n\nimport type { AgentEventBus } from \"../events/agent-event-bus.js\";\nimport {\n PROVIDERS,\n PROVIDER_PRIORITY,\n type ProviderProtocol,\n type ProviderTier,\n type SupportedProvider,\n resolveModelId,\n} from \"../providers/index.js\";\nimport { AgentRunner } from \"./agent-runner.js\";\nimport { ClaudeCodeAPIRunner } from \"./claude-code-api-runner.js\";\nimport { MockRunner } from \"./mock-runner.js\";\nimport type { RunnerProtocol } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface CreateRunnerOptions {\n /**\n * Explicit runner instance. Wins over everything else — useful for\n * tests (`runner: new MockRunner()`) or bespoke setups.\n */\n runner?: RunnerProtocol;\n /**\n * Explicit provider. Overrides env-based detection. Requires the\n * corresponding `@ai-sdk/*` package to be installed.\n */\n provider?: SupportedProvider;\n /**\n * Explicit model id. Falls through to the provider's tier default.\n * Ignored if `runner` or `model` is set.\n *\n * When omitted, `process.env.AGENT_MODEL` is read as a default — this\n * is the only way to pin an exact model from a `.env` file (e.g.\n * `AGENT_MODEL=qwen3.6:27b` to use a model the framework's tier map\n * doesn't list).\n */\n modelId?: string;\n /**\n * Cross-provider tier selector — \"opus\" | \"sonnet\" | \"haiku\". Resolved\n * via each `ProviderProtocol.tiers` map. Default: \"sonnet\".\n * Ignored if `modelId` is set.\n *\n * When omitted, `process.env.AGENT_TIER` is read as a default. Invalid\n * values are silently ignored (fall through to the \"sonnet\" default).\n */\n tier?: ProviderTier;\n /**\n * Pre-constructed `LanguageModelV1`. Short-circuits provider resolution;\n * the factory wraps it in `AgentRunner`.\n */\n model?: LanguageModelV1;\n /** Optional event bus. Passed through to the constructed runner. */\n eventBus?: AgentEventBus;\n /** Log the selection decision to console. Defaults to true. */\n verbose?: boolean;\n /**\n * If no runnable configuration is found, fall back to `MockRunner`\n * instead of throwing. Defaults to false.\n */\n fallbackToMock?: boolean;\n}\n\nexport type RunnerSource =\n | \"explicit-runner\"\n | \"explicit-model\"\n | \"explicit-provider\"\n | `env-${SupportedProvider}`\n | \"claude-cli\"\n | \"mock-fallback\";\n\nexport interface RunnerSelection {\n runner: RunnerProtocol;\n /** Human-readable explanation, e.g. `\"using anthropic (env ANTHROPIC_API_KEY)\"`. */\n reason: string;\n /** Which branch of the priority tree fired. */\n source: RunnerSource;\n}\n\n/**\n * Construct a runner from explicit opts / env vars / Claude CLI presence.\n * Returns the runner plus metadata about why it was chosen.\n */\nexport async function createRunner(opts: CreateRunnerOptions = {}): Promise<RunnerSelection> {\n const verbose = opts.verbose ?? true;\n\n // Env-driven defaults applied to provider resolution. AGENT_MODEL pins\n // an exact model id (wins over tier, matching resolveModelId's\n // explicit-modelId-over-tier rule); AGENT_TIER picks one of the three\n // cross-provider tier slots. Both are ignored when `runner` / `model`\n // short-circuit provider resolution.\n const tier = opts.tier ?? envTier();\n const modelId = opts.modelId ?? process.env.AGENT_MODEL;\n\n // 1. Explicit runner wins.\n if (opts.runner) {\n return log(verbose, {\n runner: opts.runner,\n reason: \"using caller-provided runner\",\n source: \"explicit-runner\",\n });\n }\n\n // 2. Explicit LanguageModelV1 → AgentRunner.\n if (opts.model) {\n return log(verbose, {\n runner: new AgentRunner(opts.model, opts.eventBus),\n reason: \"using caller-provided LanguageModelV1 via AgentRunner\",\n source: \"explicit-model\",\n });\n }\n\n // 3. Explicit provider.\n if (opts.provider) {\n const provider = PROVIDERS[opts.provider];\n const resolved = resolveModelId(provider, modelId, tier);\n const model = await provider.load(resolved);\n return log(verbose, {\n runner: new AgentRunner(model, opts.eventBus),\n reason: `using ${opts.provider} (explicit, model=${resolved})`,\n source: \"explicit-provider\",\n });\n }\n\n // 4. Env-based auto-detection, in PROVIDER_PRIORITY order.\n for (const name of PROVIDER_PRIORITY) {\n const provider = PROVIDERS[name];\n const matchedEnv = provider.envVars.find((v) => process.env[v]);\n if (matchedEnv) {\n const resolved = resolveModelId(provider, modelId, tier);\n const model = await provider.load(resolved);\n return log(verbose, {\n runner: new AgentRunner(model, opts.eventBus),\n reason: `using ${name} (env ${matchedEnv}, model=${resolved})`,\n source: `env-${name}` as RunnerSource,\n });\n }\n }\n\n // 5. Claude CLI probe.\n if (await hasClaudeCli()) {\n const runner = new ClaudeCodeAPIRunner({\n eventBus: opts.eventBus,\n defaults: { tools: [] },\n });\n return log(verbose, {\n runner,\n reason:\n \"using ClaudeCodeAPIRunner (claude CLI on PATH) — limited event vocabulary; set ANTHROPIC_API_KEY for AgentRunner with full events\",\n source: \"claude-cli\",\n });\n }\n\n // 6. Mock fallback (opt-in).\n if (opts.fallbackToMock) {\n return log(verbose, {\n runner: new MockRunner(),\n reason: \"no runnable configuration — falling back to MockRunner (fallbackToMock=true)\",\n source: \"mock-fallback\",\n });\n }\n\n // 7. Throw.\n throw new Error(\n [\n \"createRunner: no runnable configuration found.\",\n \"Provide one of:\",\n \" • options.runner (a RunnerProtocol instance)\",\n \" • options.model (a LanguageModelV1)\",\n \" • options.provider + the matching @ai-sdk/* package installed\",\n \" • an env var: ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,\",\n \" GROQ_API_KEY, MISTRAL_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY,\",\n \" OPENROUTER_API_KEY, or OLLAMA_HOST\",\n \" • `claude` CLI on PATH (Claude Max login or ANTHROPIC_API_KEY)\",\n \" • options.fallbackToMock = true\",\n ].join(\"\\n\"),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Read AGENT_TIER from env and validate. Mistyped values (e.g. \"sonnet \")\n * fall through to undefined so the downstream default kicks in instead\n * of indexing the tier map with garbage.\n */\nfunction envTier(): ProviderTier | undefined {\n const v = process.env.AGENT_TIER;\n return v === \"opus\" || v === \"sonnet\" || v === \"haiku\" ? v : undefined;\n}\n\nfunction log(verbose: boolean, selection: RunnerSelection): RunnerSelection {\n if (verbose) {\n process.stdout.write(`[runner] ${selection.reason}\\n`);\n }\n return selection;\n}\n\n/**\n * Probe whether `claude` is on PATH. Returns false on any error (not\n * installed, timeout, crashed). Cached for the process lifetime to keep\n * repeated `createRunner()` calls cheap.\n */\nlet _claudeCliCache: boolean | undefined;\nasync function hasClaudeCli(): Promise<boolean> {\n if (_claudeCliCache !== undefined) return _claudeCliCache;\n _claudeCliCache = await new Promise<boolean>((resolve) => {\n const child = spawn(\"claude\", [\"--version\"], {\n stdio: \"ignore\",\n // shell: true handles Windows `.cmd` extension and generally behaves\n // for \"is this command on PATH\" probes.\n shell: process.platform === \"win32\",\n });\n const timer = setTimeout(() => {\n child.kill();\n resolve(false);\n }, 2000);\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n resolve(code === 0);\n });\n child.on(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n return _claudeCliCache;\n}\n\n/** @internal — tests use this to reset the CLI-probe cache between runs. */\nexport function _resetClaudeCliCache(): void {\n _claudeCliCache = undefined;\n}\n\n/**\n * Utility consumed by tests: returns the active provider's adapter if any.\n * Kept `@internal` so we don't stamp it as a public API.\n *\n * @internal\n */\nexport function _getProviderByName(name: SupportedProvider): ProviderProtocol {\n return PROVIDERS[name];\n}\n","/**\n * Provider adapter protocol.\n *\n * A `ProviderProtocol` describes one LLM provider in three axes:\n * • which env vars indicate the provider is available\n * • a cross-provider tier map (opus / sonnet / haiku) giving default\n * model ids at each quality/cost rung\n * • a `load(modelId)` method that dynamically imports the provider\n * package and returns a Vercel AI SDK `LanguageModelV1`\n *\n * Adding a provider = dropping one file under `providers/`. No conditionals\n * to grow — `createRunner()` reads the registry in `providers/index.ts`.\n */\n\nimport type { LanguageModelV1 } from \"ai\";\n\n/** Supported provider identifiers. Matches directory / file names below. */\nexport type SupportedProvider =\n | \"anthropic\"\n | \"openai\"\n | \"google\"\n | \"groq\"\n | \"mistral\"\n | \"xai\"\n | \"deepseek\"\n | \"openrouter\"\n | \"ollama\";\n\n/**\n * Cross-provider tier selector.\n *\n * opus — most capable / expensive / slowest\n * sonnet — balanced default\n * haiku — fastest / cheapest / smallest\n *\n * Agents written against tiers stay portable across providers and hardware.\n */\nexport type ProviderTier = \"opus\" | \"sonnet\" | \"haiku\";\n\n/** Per-provider adapter. One constant per provider file. */\nexport interface ProviderProtocol {\n readonly name: SupportedProvider;\n /** Default model id for each tier. */\n readonly tiers: Readonly<Record<ProviderTier, string>>;\n /**\n * Env variables whose presence indicates this provider is usable.\n * First-matched-first-wins during `createRunner()` auto-detection.\n */\n readonly envVars: readonly string[];\n /**\n * Dynamically import the provider's `@ai-sdk/*` (or equivalent) package\n * and return a `LanguageModelV1` for the given model id. Throws a helpful\n * error if the package isn't installed.\n */\n load(modelId: string): Promise<LanguageModelV1>;\n}\n\n// ---------------------------------------------------------------------------\n// Dynamic import helper\n// ---------------------------------------------------------------------------\n\n/**\n * Dynamically import a provider package. If it's not installed, throw an\n * error that tells the caller how to fix it.\n */\n// biome-ignore lint/suspicious/noExplicitAny: imported module shape is opaque\nexport async function importProvider(pkg: string, provider: string): Promise<any> {\n try {\n return await import(/* @vite-ignore */ pkg);\n } catch (e) {\n throw new Error(\n `createRunner: provider \"${provider}\" requires \"${pkg}\" to be installed. ` +\n `Run: pnpm add ${pkg}`,\n { cause: e },\n );\n }\n}\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const anthropicProvider: ProviderProtocol = {\n name: \"anthropic\",\n tiers: {\n opus: \"claude-opus-4-5\",\n sonnet: \"claude-sonnet-4-5\",\n haiku: \"claude-haiku-4-5\",\n },\n envVars: [\"ANTHROPIC_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/anthropic\", \"anthropic\");\n return mod.anthropic(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const openaiProvider: ProviderProtocol = {\n name: \"openai\",\n tiers: {\n opus: \"gpt-4.1\",\n sonnet: \"gpt-4o\",\n haiku: \"gpt-4o-mini\",\n },\n envVars: [\"OPENAI_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/openai\", \"openai\");\n return mod.openai(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const googleProvider: ProviderProtocol = {\n name: \"google\",\n tiers: {\n opus: \"gemini-2.5-pro\",\n sonnet: \"gemini-2.5-flash\",\n haiku: \"gemini-2.5-flash-lite\",\n },\n envVars: [\"GOOGLE_GENERATIVE_AI_API_KEY\", \"GOOGLE_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/google\", \"google\");\n return mod.google(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const groqProvider: ProviderProtocol = {\n name: \"groq\",\n tiers: {\n opus: \"llama-3.3-70b-versatile\",\n sonnet: \"llama-3.1-70b-versatile\",\n haiku: \"llama-3.1-8b-instant\",\n },\n envVars: [\"GROQ_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/groq\", \"groq\");\n return mod.groq(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const mistralProvider: ProviderProtocol = {\n name: \"mistral\",\n tiers: {\n opus: \"mistral-large-latest\",\n sonnet: \"mistral-medium-latest\",\n haiku: \"mistral-small-latest\",\n },\n envVars: [\"MISTRAL_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/mistral\", \"mistral\");\n return mod.mistral(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const xaiProvider: ProviderProtocol = {\n name: \"xai\",\n tiers: {\n opus: \"grok-4\",\n sonnet: \"grok-3\",\n haiku: \"grok-3-mini\",\n },\n envVars: [\"XAI_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/xai\", \"xai\");\n return mod.xai(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\nexport const deepseekProvider: ProviderProtocol = {\n name: \"deepseek\",\n tiers: {\n opus: \"deepseek-reasoner\",\n sonnet: \"deepseek-chat\",\n // DeepSeek has no dedicated small-fast model today; reuse chat.\n haiku: \"deepseek-chat\",\n },\n envVars: [\"DEEPSEEK_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@ai-sdk/deepseek\", \"deepseek\");\n return mod.deepseek(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\n/**\n * OpenRouter gateways 150+ models across every major provider. Our tier\n * defaults route to Claude (repo's center of gravity); callers who want\n * a non-Claude default pass `modelId` explicitly (e.g. \"meta-llama/llama-3.3-70b\").\n */\nexport const openrouterProvider: ProviderProtocol = {\n name: \"openrouter\",\n tiers: {\n opus: \"anthropic/claude-opus-4-5\",\n sonnet: \"anthropic/claude-sonnet-4-5\",\n haiku: \"anthropic/claude-haiku-4-5\",\n },\n envVars: [\"OPENROUTER_API_KEY\"],\n async load(modelId) {\n const mod = await importProvider(\"@openrouter/ai-sdk-provider\", \"openrouter\");\n return mod.openrouter(modelId);\n },\n};\n","import { type ProviderProtocol, importProvider } from \"./types.js\";\n\n/**\n * Ollama — local-only OSS models via HTTP.\n *\n * Default tier map uses the Qwen3 family because Qwen's team explicitly\n * prioritizes tool-calling and keeps the same grammar across sizes — so\n * agents scale between haiku↔sonnet↔opus without prompt changes.\n *\n * Sized for 16GB-class consumer GPUs (tested on 4080 Super):\n * opus (30B MoE, activates 3B/token) — ~14 GB VRAM, 50–80 tok/s\n * sonnet (14B dense) — ~9 GB VRAM, 30–50 tok/s\n * haiku (4B dense) — ~3 GB VRAM, 100+ tok/s\n *\n * Override with `options.modelId` if you want a different family.\n */\nexport const ollamaProvider: ProviderProtocol = {\n name: \"ollama\",\n tiers: {\n opus: \"qwen3:30b-a3b\",\n sonnet: \"qwen3:14b\",\n haiku: \"qwen3:4b\",\n },\n envVars: [\"OLLAMA_HOST\"],\n async load(modelId) {\n const mod = await importProvider(\"ollama-ai-provider\", \"ollama\");\n // ollama-ai-provider doesn't read OLLAMA_HOST from env — pass it\n // explicitly so remote GPU boxes (e.g. behind a VPN) work out of\n // the box when the user sets the env var.\n const host = process.env.OLLAMA_HOST;\n // simulateStreaming: use the reliable non-streaming API (which\n // correctly returns tool_calls) wrapped in a stream interface.\n // Real streaming silently drops tool calls for many models.\n const settings = { simulateStreaming: true };\n if (host) {\n const baseURL = `${host.replace(/\\/$/, \"\")}/api`;\n const provider = mod.createOllama({ baseURL });\n return provider(modelId, settings);\n }\n return mod.ollama(modelId, settings);\n },\n};\n","/**\n * Claude Code LanguageModelV1 provider.\n *\n * Wraps the Claude Agent SDK's `query()` function in a Vercel AI SDK\n * `LanguageModelV1` so agents can be executed through `AgentRunner` using\n * a Claude Max subscription (OAuth cached in ~/.claude) or an\n * `ANTHROPIC_API_KEY` env var picked up by the SDK itself.\n *\n * Unlike `ClaudeCodeRunner` / `ClaudeCodeAPIRunner`, this provider plugs\n * into the *standard* AgentRunner execution loop. That means the full\n * canonical event vocabulary (`iteration.start`, `llm.start`, `tool.*`,\n * `iteration.end`, `llm.end`, …) fires automatically — closing the\n * observability gap those runners have.\n *\n * Each `doGenerate` / `doStream` call runs a fresh single-turn SDK query:\n *\n * 1. System prompt + conversation history (including prior tool\n * use / tool result parts) is flattened to a string prompt.\n * 2. Tool schemas are registered as MCP tools on an in-process server.\n * 3. `canUseTool` intercepts tool invocations, records them, and denies\n * with `interrupt: true` so the SDK stops immediately. The recorded\n * tool calls are surfaced in the LanguageModelV1 response as\n * `toolCalls`.\n * 4. SDK assistant / result messages are translated back to\n * LanguageModelV1 output shape (`text`, `toolCalls`, `finishReason`,\n * `usage`).\n * 5. Claude-Code-native tools (Read/Write/Edit/Bash/…) are disallowed so\n * only framework tools flow.\n */\n\nimport {\n type McpSdkServerConfigWithInstance,\n type PermissionResult,\n type Options as SDKOptions,\n createSdkMcpServer,\n query,\n tool as sdkTool,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n LanguageModelV1Prompt,\n LanguageModelV1StreamPart,\n} from \"ai\";\nimport type { z } from \"zod\";\n\n// Types not re-exported from \"ai\"; derive from the SDK's public shape.\ntype DoGenerateResult = Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>;\ntype LanguageModelV1FinishReason = DoGenerateResult[\"finishReason\"];\ntype LanguageModelV1FunctionToolCall = NonNullable<DoGenerateResult[\"toolCalls\"]>[number];\ntype RegularMode = Extract<LanguageModelV1CallOptions[\"mode\"], { type: \"regular\" }>;\ntype RegularTool = NonNullable<RegularMode[\"tools\"]>[number];\ntype LanguageModelV1FunctionTool = Extract<RegularTool, { type: \"function\" }>;\n\n// ---------------------------------------------------------------------------\n// Model name mapping\n// ---------------------------------------------------------------------------\n\nconst MODEL_MAP: Record<string, string> = {\n opus: \"opus\",\n sonnet: \"sonnet\",\n haiku: \"haiku\",\n};\n\nfunction mapModel(modelName: string): string | undefined {\n const lower = modelName.toLowerCase();\n for (const [key, value] of Object.entries(MODEL_MAP)) {\n if (lower.includes(key)) return value;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Tools blocked in \"API mode\" — only framework tools flow\n// ---------------------------------------------------------------------------\n\nconst BLOCKED_BUILTIN_TOOLS: readonly string[] = [\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"Glob\",\n \"Grep\",\n \"Agent\",\n \"NotebookEdit\",\n \"TodoRead\",\n \"TodoWrite\",\n \"WebFetch\",\n \"WebSearch\",\n];\n\n// ---------------------------------------------------------------------------\n// Provider options\n// ---------------------------------------------------------------------------\n\nexport interface ClaudeCodeProviderOptions {\n /** Defaults merged with every SDK query call. */\n defaults?: Partial<SDKOptions>;\n /** Include Claude Code's built-in tools (Read/Write/Bash/…). Default: false. */\n allowBuiltinTools?: boolean;\n /**\n * Max turns inside the SDK loop. Default: 10.\n *\n * Within one `doGenerate`, Claude may emit prose-only on its first turn\n * and produce a tool call on a later turn. `canUseTool` aborts on the\n * first tool call regardless, so this only needs to be generous enough\n * to allow \"plan-then-tool\" sequences. A too-low value causes the SDK\n * to throw `Reached maximum number of turns` before Claude reaches any\n * tool call.\n */\n maxTurns?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Prompt flattening\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the single system prompt from a LanguageModelV1 message array.\n *\n * LanguageModelV1Prompt only ever contains one leading system message (if\n * any) — the AI SDK normalizes `generateText({ system, messages })` into\n * a prompt that starts with `{ role: 'system' }`.\n */\nfunction extractSystemPrompt(prompt: LanguageModelV1Prompt): string | undefined {\n const first = prompt[0];\n if (first && first.role === \"system\") return first.content;\n return undefined;\n}\n\n/** Stringify any JSON-ish value for embedding in a text prompt. */\nfunction stringifyValue(v: unknown): string {\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\n/**\n * Render non-system conversation messages into a single user-facing prompt\n * string. Tool call / tool result parts are rendered inline as tagged\n * blocks so Claude understands the history without requiring SDK session\n * resume support.\n */\nfunction renderConversation(prompt: LanguageModelV1Prompt): string {\n const parts: string[] = [];\n\n for (const msg of prompt) {\n if (msg.role === \"user\") {\n const text = renderUserContent(msg);\n if (text) parts.push(text);\n } else if (msg.role === \"assistant\") {\n const text = renderAssistantContent(msg);\n if (text) parts.push(`Assistant: ${text}`);\n } else if (msg.role === \"tool\") {\n const text = renderToolContent(msg);\n if (text) parts.push(text);\n }\n // system is handled separately via extractSystemPrompt\n }\n\n return parts.join(\"\\n\\n\");\n}\n\ntype PromptMessage = LanguageModelV1Prompt[number];\n\nfunction renderUserContent(msg: Extract<PromptMessage, { role: \"user\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") chunks.push(part.text);\n // Image / file parts are dropped — Claude Agent SDK prompt string\n // cannot carry them losslessly without session APIs.\n }\n return chunks.join(\"\\n\");\n}\n\nfunction renderAssistantContent(msg: Extract<PromptMessage, { role: \"assistant\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n chunks.push(part.text);\n } else if (part.type === \"tool-call\") {\n chunks.push(\n `[tool-call name=${part.toolName} id=${part.toolCallId}] ${stringifyValue(part.args)}`,\n );\n }\n }\n return chunks.join(\"\\n\");\n}\n\nfunction renderToolContent(msg: Extract<PromptMessage, { role: \"tool\" }>): string {\n const chunks: string[] = [];\n for (const part of msg.content) {\n chunks.push(\n `[tool-result name=${part.toolName} id=${part.toolCallId}] ${stringifyValue(part.result)}`,\n );\n }\n return chunks.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Tools → MCP server\n// ---------------------------------------------------------------------------\n\nconst FRAMEWORK_SERVER = \"agent_runner_tools\";\n\n/**\n * Build an in-process MCP server that exposes each LanguageModelV1 function\n * tool. The handlers never actually execute — `canUseTool` intercepts first\n * and aborts. They're still installed so Claude sees real tool schemas.\n */\nfunction buildToolsServer(tools: ReadonlyArray<LanguageModelV1FunctionTool>):\n | {\n server: McpSdkServerConfigWithInstance;\n allowedTools: string[];\n }\n | undefined {\n if (tools.length === 0) return undefined;\n\n const sdkTools = tools.map((t) =>\n // We pass an empty Zod shape — Claude will still see the tool name +\n // description and `canUseTool` records the actual call arguments.\n sdkTool(t.name, t.description ?? \"\", {} as Record<string, z.ZodTypeAny>, async () => {\n // Never reached — canUseTool aborts before handler runs.\n return {\n content: [{ type: \"text\" as const, text: \"__AGENT_RUNNER_INTERCEPTED__\" }],\n };\n }),\n );\n\n const server = createSdkMcpServer({\n name: FRAMEWORK_SERVER,\n tools: sdkTools,\n });\n\n const allowedTools = sdkTools.map((t: { name: string }) => `mcp__${FRAMEWORK_SERVER}__${t.name}`);\n\n return { server, allowedTools };\n}\n\n/**\n * Resolve `mcp__server__tool` back to the original tool name Claude was\n * offered. For framework tools we strip the `mcp__agent_runner_tools__`\n * prefix so `LanguageModelV1` consumers see the original tool names.\n */\nfunction normalizeToolName(sdkToolName: string): string {\n const prefix = `mcp__${FRAMEWORK_SERVER}__`;\n if (sdkToolName.startsWith(prefix)) return sdkToolName.slice(prefix.length);\n return sdkToolName;\n}\n\n// ---------------------------------------------------------------------------\n// ClaudeCodeLanguageModel\n// ---------------------------------------------------------------------------\n\ninterface PendingToolCall {\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: Record<string, unknown>;\n}\n\nexport class ClaudeCodeLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = \"v1\" as const;\n readonly provider = \"claude-code\";\n readonly modelId: string;\n readonly defaultObjectGenerationMode = \"tool\" as const;\n\n private readonly _opts: ClaudeCodeProviderOptions;\n\n constructor(modelId: string, opts: ClaudeCodeProviderOptions = {}) {\n this.modelId = modelId;\n this._opts = opts;\n }\n\n // -------------------------------------------------------------------------\n // doGenerate\n // -------------------------------------------------------------------------\n\n doGenerate(options: LanguageModelV1CallOptions): ReturnType<LanguageModelV1[\"doGenerate\"]> {\n return this._doGenerate(options);\n }\n\n private async _doGenerate(\n options: LanguageModelV1CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>> {\n const { systemPrompt, promptString, sdkOptions, captured } = this._prepare(options);\n\n const textParts: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let sdkStopReason: string | null = null;\n\n try {\n for await (const msg of query({\n prompt: promptString,\n options: { ...sdkOptions, systemPrompt },\n })) {\n if (msg.type === \"assistant\" && \"message\" in msg) {\n const content = msg.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\n block &&\n typeof block === \"object\" &&\n \"text\" in block &&\n typeof block.text === \"string\"\n ) {\n textParts.push(block.text);\n }\n }\n }\n } else if (msg.type === \"result\") {\n const m = msg as Record<string, unknown>;\n const usage = m.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (typeof m.stop_reason === \"string\") {\n sdkStopReason = m.stop_reason;\n }\n }\n }\n } catch (err) {\n // `canUseTool` may throw `AbortError` when we interrupt. If we have\n // captured tool calls, that's a successful short-circuit — fall\n // through. Otherwise rethrow.\n if (captured.toolCalls.length === 0) throw err;\n }\n\n const text = textParts.join(\"\");\n const toolCalls: LanguageModelV1FunctionToolCall[] = captured.toolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: JSON.stringify(tc.args),\n }));\n\n const finishReason = deriveFinishReason({\n hasToolCalls: toolCalls.length > 0,\n sdkStopReason,\n });\n\n return {\n text,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n finishReason,\n usage: { promptTokens: inputTokens, completionTokens: outputTokens },\n rawCall: {\n rawPrompt: promptString,\n rawSettings: { systemPrompt, model: sdkOptions.model ?? this.modelId },\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // doStream\n // -------------------------------------------------------------------------\n\n doStream(options: LanguageModelV1CallOptions): ReturnType<LanguageModelV1[\"doStream\"]> {\n return this._doStream(options);\n }\n\n private async _doStream(\n options: LanguageModelV1CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doStream\"]>>> {\n const { systemPrompt, promptString, sdkOptions, captured } = this._prepare(options);\n\n const stream = new ReadableStream<LanguageModelV1StreamPart>({\n start: async (controller) => {\n let inputTokens = 0;\n let outputTokens = 0;\n let sdkStopReason: string | null = null;\n const emittedTextChunks = new Set<number>();\n const textBuffer: string[] = [];\n\n try {\n for await (const msg of query({\n prompt: promptString,\n options: { ...sdkOptions, systemPrompt, includePartialMessages: true },\n })) {\n const msgType = (msg as { type?: string }).type;\n if (msgType === \"stream_event\" && \"event\" in msg) {\n const maybe = msg as { event?: { delta?: { text?: string } } };\n const delta = maybe.event?.delta?.text;\n if (delta) {\n textBuffer.push(delta);\n controller.enqueue({ type: \"text-delta\", textDelta: delta });\n }\n } else if (msgType === \"assistant\" && \"message\" in msg) {\n const content = (msg as { message?: { content?: unknown[] } }).message?.content;\n if (Array.isArray(content)) {\n let idx = 0;\n for (const block of content) {\n if (\n block &&\n typeof block === \"object\" &&\n \"text\" in (block as Record<string, unknown>) &&\n typeof (block as { text: unknown }).text === \"string\"\n ) {\n if (textBuffer.length === 0 && !emittedTextChunks.has(idx)) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: (block as { text: string }).text,\n });\n emittedTextChunks.add(idx);\n }\n }\n idx++;\n }\n }\n } else if (msgType === \"result\") {\n const m = msg as Record<string, unknown>;\n const usage = m.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n if (typeof m.stop_reason === \"string\") sdkStopReason = m.stop_reason;\n }\n }\n } catch (err) {\n if (captured.toolCalls.length === 0) {\n controller.enqueue({ type: \"error\", error: err });\n controller.close();\n return;\n }\n }\n\n for (const tc of captured.toolCalls) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: JSON.stringify(tc.args),\n });\n }\n\n const finishReason = deriveFinishReason({\n hasToolCalls: captured.toolCalls.length > 0,\n sdkStopReason,\n });\n\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: { promptTokens: inputTokens, completionTokens: outputTokens },\n });\n controller.close();\n },\n });\n\n return {\n stream,\n rawCall: {\n rawPrompt: promptString,\n rawSettings: { systemPrompt, model: sdkOptions.model ?? this.modelId },\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // Internal — build SDK options + prompt string for a call\n // -------------------------------------------------------------------------\n\n private _prepare(options: LanguageModelV1CallOptions): {\n systemPrompt: string | undefined;\n promptString: string;\n sdkOptions: SDKOptions;\n captured: { toolCalls: PendingToolCall[] };\n } {\n const systemPrompt = extractSystemPrompt(options.prompt);\n const promptString = renderConversation(options.prompt) || \" \";\n\n const fnTools: LanguageModelV1FunctionTool[] = [];\n if (options.mode.type === \"regular\" && options.mode.tools) {\n for (const t of options.mode.tools) {\n if (t.type === \"function\") fnTools.push(t);\n }\n }\n\n const captured: { toolCalls: PendingToolCall[] } = { toolCalls: [] };\n\n const canUseTool: SDKOptions[\"canUseTool\"] = async (\n toolName: string,\n input: Record<string, unknown>,\n ctx: { toolUseID: string },\n ): Promise<PermissionResult> => {\n const normalized = normalizeToolName(toolName);\n captured.toolCalls.push({\n toolCallId: ctx.toolUseID,\n toolName: normalized,\n args: input,\n });\n return {\n behavior: \"deny\",\n message: \"Tool call intercepted by AgentRunner\",\n interrupt: true,\n };\n };\n\n const sdkOptions: SDKOptions = {\n ...(this._opts.defaults ?? {}),\n model: mapModel(this.modelId) ?? this._opts.defaults?.model ?? this.modelId,\n maxTurns: this._opts.maxTurns ?? 10,\n permissionMode: \"default\",\n canUseTool,\n };\n\n const built = buildToolsServer(fnTools);\n if (built) {\n sdkOptions.mcpServers = {\n ...(sdkOptions.mcpServers ?? {}),\n [FRAMEWORK_SERVER]: built.server,\n } as SDKOptions[\"mcpServers\"];\n sdkOptions.allowedTools = [...(sdkOptions.allowedTools ?? []), ...built.allowedTools];\n }\n\n if (!this._opts.allowBuiltinTools) {\n sdkOptions.disallowedTools = [\n ...(sdkOptions.disallowedTools ?? []),\n ...BLOCKED_BUILTIN_TOOLS,\n ];\n }\n\n return { systemPrompt, promptString, sdkOptions, captured };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Derive finish reason\n// ---------------------------------------------------------------------------\n\nfunction deriveFinishReason(args: {\n hasToolCalls: boolean;\n sdkStopReason: string | null;\n}): LanguageModelV1FinishReason {\n if (args.hasToolCalls) return \"tool-calls\";\n switch (args.sdkStopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"stop\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a `LanguageModelV1` backed by the Claude Agent SDK.\n *\n * @example\n * ```ts\n * import { claudeCode } from \"@agentic-patterns/runtime/providers\";\n * import { AgentRunner } from \"@agentic-patterns/runtime\";\n *\n * const runner = new AgentRunner(claudeCode(\"sonnet\"));\n * const result = await runner.run(agent, \"What is 17 + 28?\");\n * ```\n */\nexport function claudeCode(\n modelId: string,\n opts?: ClaudeCodeProviderOptions,\n): ClaudeCodeLanguageModel {\n return new ClaudeCodeLanguageModel(modelId, opts);\n}\n","/**\n * Provider adapter registry.\n *\n * Each provider exports a `ProviderProtocol` constant that knows its env\n * vars, tier map, and how to dynamically load the `@ai-sdk/*` (or\n * equivalent) package. The registry below is consumed by `createRunner()`\n * for provider auto-detection and tier resolution.\n *\n * Registry order matters for env-based auto-detection: the first provider\n * with a matching env var wins. We lead with Anthropic (repo's center of\n * gravity: the Claude Agent SDK is a peer dep). Callers who want a\n * different order pass `options.provider` explicitly.\n */\n\nexport type { ProviderProtocol, ProviderTier, SupportedProvider } from \"./types.js\";\nexport { anthropicProvider } from \"./anthropic.js\";\nexport { openaiProvider } from \"./openai.js\";\nexport { googleProvider } from \"./google.js\";\nexport { groqProvider } from \"./groq.js\";\nexport { mistralProvider } from \"./mistral.js\";\nexport { xaiProvider } from \"./xai.js\";\nexport { deepseekProvider } from \"./deepseek.js\";\nexport { openrouterProvider } from \"./openrouter.js\";\nexport { ollamaProvider } from \"./ollama.js\";\n\n// Claude Code LanguageModelV1 adapter — wraps the Claude Agent SDK so\n// Max subscription users can feed Claude through AgentRunner like any\n// other @ai-sdk/* provider with full event vocabulary.\nexport { claudeCode, ClaudeCodeLanguageModel } from \"./claude-code.js\";\nexport type { ClaudeCodeProviderOptions } from \"./claude-code.js\";\n\nimport { anthropicProvider } from \"./anthropic.js\";\nimport { deepseekProvider } from \"./deepseek.js\";\nimport { googleProvider } from \"./google.js\";\nimport { groqProvider } from \"./groq.js\";\nimport { mistralProvider } from \"./mistral.js\";\nimport { ollamaProvider } from \"./ollama.js\";\nimport { openaiProvider } from \"./openai.js\";\nimport { openrouterProvider } from \"./openrouter.js\";\nimport type { ProviderProtocol, ProviderTier, SupportedProvider } from \"./types.js\";\nimport { xaiProvider } from \"./xai.js\";\n\n/** All supported providers keyed by name. */\nexport const PROVIDERS: Readonly<Record<SupportedProvider, ProviderProtocol>> = {\n anthropic: anthropicProvider,\n openai: openaiProvider,\n google: googleProvider,\n groq: groqProvider,\n mistral: mistralProvider,\n xai: xaiProvider,\n deepseek: deepseekProvider,\n openrouter: openrouterProvider,\n ollama: ollamaProvider,\n};\n\n/**\n * Env-detection priority. First entry whose `envVars` include a set env\n * variable wins. Order reflects repo defaults — Anthropic first, OSS local\n * (Ollama) last so remote providers are preferred when both exist.\n */\nexport const PROVIDER_PRIORITY: readonly SupportedProvider[] = [\n \"anthropic\",\n \"openai\",\n \"google\",\n \"groq\",\n \"mistral\",\n \"xai\",\n \"deepseek\",\n \"openrouter\",\n \"ollama\",\n];\n\n/** Resolve a model id for a (provider, tier?, explicitModelId?) triple. */\nexport function resolveModelId(\n provider: ProviderProtocol,\n explicitModelId?: string,\n tier: ProviderTier = \"sonnet\",\n): string {\n return explicitModelId ?? provider.tiers[tier];\n}\n","/**\n * In-process transport with NATS-compatible subject wildcards.\n *\n * Zero-dependency in-memory pub/sub for multi-agent communication.\n * Supports NATS wildcard patterns: `*` (single token) and `>` (trailing tokens).\n */\n\nimport type { Transport, TransportMessage } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Subject matching (NATS-style)\n// ---------------------------------------------------------------------------\n\ninterface Subscription {\n readonly pattern: string;\n readonly regex: RegExp;\n readonly callback: (msg: TransportMessage) => void | Promise<void>;\n}\n\n/**\n * Convert a NATS subject pattern to a RegExp.\n *\n * NATS wildcards:\n * `*` matches exactly one token (segment between dots)\n * `>` matches one or more trailing tokens (must be the last segment)\n */\nexport function subjectToRegex(pattern: string): RegExp {\n const parts = pattern.split(\".\");\n const regexParts: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n if (part === \">\") {\n regexParts.push(\"[^.]+(?:\\\\.[^.]+)*\");\n break; // > must be last\n }\n if (part === \"*\") {\n regexParts.push(\"[^.]+\");\n } else {\n regexParts.push(part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n }\n }\n\n return new RegExp(`^${regexParts.join(\"\\\\.\")}$`);\n}\n\n/**\n * Test whether a subject matches a NATS-style pattern.\n */\nexport function matchSubject(pattern: string, subject: string): boolean {\n return subjectToRegex(pattern).test(subject);\n}\n\n// ---------------------------------------------------------------------------\n// InProcessTransport\n// ---------------------------------------------------------------------------\n\n/**\n * Zero-dependency in-process transport with NATS-compatible wildcards.\n *\n * All messaging is synchronous within the process -- no network I/O.\n * `connect()` and `ensureStream()` are no-ops.\n */\nexport class InProcessTransport implements Transport {\n private _subscriptions: Subscription[] = [];\n private _connected = false;\n\n async connect(): Promise<void> {\n this._connected = true;\n }\n\n async close(): Promise<void> {\n this._subscriptions = [];\n this._connected = false;\n }\n\n async ensureStream(_name: string, _subjects: string[]): Promise<void> {\n // No-op: streams are a JetStream concept\n }\n\n async publish(subject: string, data: Uint8Array): Promise<void> {\n const msg: TransportMessage = {\n data,\n subject,\n ack: async () => {\n // No-op for in-memory transport\n },\n };\n\n for (const sub of [...this._subscriptions]) {\n if (sub.regex.test(subject)) {\n const result = sub.callback(msg);\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n }\n\n async subscribe(\n subject: string,\n callback: (msg: TransportMessage) => void | Promise<void>,\n _durable?: string,\n ): Promise<void> {\n const sub: Subscription = {\n pattern: subject,\n regex: subjectToRegex(subject),\n callback,\n };\n this._subscriptions.push(sub);\n }\n\n async request(subject: string, data: Uint8Array, _timeout = 5000): Promise<Uint8Array> {\n const msg: TransportMessage = {\n data,\n subject,\n ack: async () => {},\n };\n\n for (const sub of [...this._subscriptions]) {\n if (sub.regex.test(subject)) {\n const result = sub.callback(msg);\n let resp: unknown;\n if (result instanceof Promise) {\n resp = await result;\n } else {\n resp = result;\n }\n if (resp instanceof Uint8Array) {\n return resp;\n }\n }\n }\n\n throw new Error(`No handler for request on ${subject}`);\n }\n\n /** Whether the transport is currently connected. */\n get connected(): boolean {\n return this._connected;\n }\n}\n","/**\n * MessagingToolbox - inter-agent communication tools over shared transport.\n *\n * Provides send_message, broadcast, and list_team tools that publish\n * SandboxEvents to the bus, enabling fully event-driven agent conversations.\n */\n\nimport { type ToolDefinition, Toolbox } from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\nimport type { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type {\n AgentAddress,\n AgentBroadcastEvent,\n AgentMessageEvent,\n} from \"../events/sandbox-types.js\";\n\n/**\n * Tools for inter-agent communication within an agency.\n *\n * Each tool publishes a SandboxEvent to the bus, which then dispatches\n * both locally and over transport.\n */\nexport class MessagingToolbox extends Toolbox {\n readonly name = \"Messaging\";\n readonly description = \"Tools for sending messages to other agents on the team.\";\n\n private readonly _bus: SandboxEventBus;\n private readonly _address: AgentAddress;\n private readonly _agencyId: string;\n private readonly _runId: string;\n private readonly _roster: Record<string, AgentAddress>;\n readonly tools: Record<string, ToolDefinition>;\n\n constructor(\n bus: SandboxEventBus,\n address: AgentAddress,\n agencyId: string,\n runId: string,\n roster: Record<string, AgentAddress>,\n ) {\n super();\n this._bus = bus;\n this._address = address;\n this._agencyId = agencyId;\n this._runId = runId;\n this._roster = roster;\n\n this.tools = {\n send_message: {\n description: \"Send a direct message to another agent by role name.\",\n parameters: z.object({\n to: z.string().describe(\"Target agent role name\"),\n content: z.string().describe(\"Message content\"),\n }),\n execute: async (args: Record<string, unknown>): Promise<unknown> => {\n const { to, content } = args as { to: string; content: string };\n return this._sendMessage(to, content);\n },\n },\n\n broadcast: {\n description: \"Broadcast a message to all agents in the agency.\",\n parameters: z.object({\n content: z.string().describe(\"Message content to broadcast\"),\n }),\n execute: async (args: Record<string, unknown>): Promise<unknown> => {\n const { content } = args as { content: string };\n return this._broadcast(content);\n },\n },\n\n list_team: {\n description: \"List all agents in the agency with their roles.\",\n parameters: z.object({}),\n execute: async (): Promise<unknown> => {\n return this._listTeam();\n },\n },\n };\n }\n\n private async _sendMessage(to: string, content: string): Promise<string> {\n const target = this._roster[to];\n if (!target) {\n const available = Object.keys(this._roster).sort().join(\", \");\n return `Unknown agent '${to}'. Available agents: ${available}`;\n }\n\n const event: AgentMessageEvent = {\n type: \"sandbox.agent.message\",\n traceId: \"\",\n runId: \"\",\n spanId: `${Date.now().toString(36)}-msg`,\n timestamp: new Date(),\n origin: this._address,\n target,\n agencyId: this._agencyId,\n lineupRunId: this._runId,\n content,\n metadata: {},\n };\n\n await this._bus.publish(event);\n return `Message sent to ${to}.`;\n }\n\n private async _broadcast(content: string): Promise<string> {\n const event: AgentBroadcastEvent = {\n type: \"sandbox.agent.broadcast\",\n traceId: \"\",\n runId: \"\",\n spanId: `${Date.now().toString(36)}-bcast`,\n timestamp: new Date(),\n origin: this._address,\n agencyId: this._agencyId,\n lineupRunId: this._runId,\n content,\n channel: \"\",\n };\n\n await this._bus.publish(event);\n return \"Message broadcast to all agents.\";\n }\n\n private _listTeam(): Array<{ role: string; agentId: string }> {\n return Object.entries(this._roster)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([role, addr]) => ({\n role,\n agentId: addr.agentId,\n }));\n }\n}\n","/**\n * SSE (Server-Sent Events) formatter for agent events.\n *\n * Converts internal AgentEvent types to SSE-formatted strings for streaming\n * to clients over HTTP. Maps all 20 canonical events via a single typed\n * discriminated-union switch (`toSSEMapping`) so event name, payload, and\n * exhaustiveness live in one place.\n */\n\nimport type { AgentEvent, AgentEventType } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Canonical wire event names (string union)\n// ---------------------------------------------------------------------------\n\n/**\n * Client-facing SSE event name. Matches the 20 canonical events defined in\n * the admin-observability spec. Used anywhere an SSE frame is produced so\n * the compiler catches typos like `\"thinking.complete\"` vs `\"thinking\"`.\n */\nexport type SSEEventName =\n | \"conversation.start\"\n | \"conversation.end\"\n | \"message.start\"\n | \"message.delta\"\n | \"message.complete\"\n | \"message.cancel\"\n | \"thinking.start\"\n | \"thinking\"\n | \"thinking.complete\"\n | \"tool.intent\"\n | \"tool.start\"\n | \"tool.progress\"\n | \"tool.end\"\n | \"tool.rejected\"\n | \"iteration.start\"\n | \"iteration.end\"\n | \"llm.start\"\n | \"llm.end\"\n | \"error\"\n | \"claude_code.hook\"\n | \"done\";\n\n/** Result of mapping an AgentEvent to its canonical SSE shape. */\nexport interface SSEMapping {\n readonly name: SSEEventName;\n readonly payload: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Single source of truth — event -> wire name + payload\n// ---------------------------------------------------------------------------\n\n/**\n * Map an `AgentEvent` to its canonical SSE wire name and payload. The\n * discriminated-union switch narrows `event` automatically so field access\n * is fully typed without casts. The `never` default is a compile-time\n * exhaustiveness check — adding a new variant to `AgentEvent` fails\n * typechecking here until a branch is added.\n *\n * Returns `null` only when a non-AgentEvent slips through at runtime\n * (e.g., a hand-constructed event with an unrecognised `type`).\n */\nexport function toSSEMapping(event: AgentEvent): SSEMapping | null {\n switch (event.type) {\n case \"agent.conversation.start\":\n return {\n name: \"conversation.start\",\n payload: { conversation_id: event.conversationId, agent_name: event.agentName },\n };\n case \"agent.conversation.end\":\n return {\n name: \"conversation.end\",\n payload: { conversation_id: event.conversationId, reason: event.reason },\n };\n case \"agent.message.start\":\n return { name: \"message.start\", payload: { agent_name: event.agentName } };\n case \"agent.message.chunk\":\n return {\n name: \"message.delta\",\n payload: { delta: event.delta, chunk_index: event.chunkIndex },\n };\n case \"agent.message.complete\":\n return {\n name: \"message.complete\",\n payload: {\n content: event.content,\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n model: event.model,\n },\n };\n case \"agent.message.cancel\":\n return { name: \"message.cancel\", payload: { reason: event.reason } };\n case \"agent.thinking.start\":\n return { name: \"thinking.start\", payload: {} };\n case \"agent.reasoning\":\n return {\n name: event.isComplete ? \"thinking.complete\" : \"thinking\",\n payload: { content: event.content },\n };\n case \"agent.tool.intent\":\n return {\n name: \"tool.intent\",\n payload: {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n arguments: event.arguments,\n },\n };\n case \"agent.tool.start\":\n return {\n name: \"tool.start\",\n payload: {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n arguments: event.arguments,\n },\n };\n case \"agent.tool.progress\":\n return {\n name: \"tool.progress\",\n payload: {\n tool_call_id: event.toolCallId,\n progress: event.progress,\n status_text: event.statusText,\n },\n };\n case \"agent.tool.end\": {\n const payload: Record<string, unknown> = {\n tool_call_id: event.toolCallId,\n tool_name: event.toolName,\n result: event.result,\n duration_ms: event.durationMs,\n };\n if (event.error !== undefined) payload.error = event.error;\n return { name: \"tool.end\", payload };\n }\n case \"agent.tool.rejected\":\n return {\n name: \"tool.rejected\",\n payload: {\n tool_name: event.toolName,\n reason: event.reason,\n gate_name: event.gateName,\n },\n };\n case \"agent.iteration.start\":\n return {\n name: \"iteration.start\",\n payload: { iteration: event.iteration, max_iterations: event.maxIterations },\n };\n case \"agent.iteration.end\":\n return {\n name: \"iteration.end\",\n payload: {\n iteration: event.iteration,\n tool_calls_count: event.toolCallsCount,\n has_more: event.hasMore,\n },\n };\n case \"agent.llm.start\":\n return {\n name: \"llm.start\",\n payload: {\n model: event.model,\n message_count: event.messageCount,\n has_tools: event.hasTools,\n },\n };\n case \"agent.llm.end\":\n return {\n name: \"llm.end\",\n payload: {\n model: event.model,\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n duration_ms: event.durationMs,\n finish_reason: event.finishReason,\n },\n };\n case \"agent.error\":\n return {\n name: \"error\",\n payload: {\n error_type: event.errorType,\n message: event.message,\n recoverable: event.recoverable,\n },\n };\n case \"claude_code.hook\":\n return {\n name: \"claude_code.hook\",\n payload: {\n hook_name: event.hookName,\n session_id: event.sessionId,\n cwd: event.cwd,\n tool_name: event.toolName,\n tool_input: event.toolInput,\n tool_response: event.toolResponse,\n tool_use_id: event.toolUseId,\n permission_mode: event.permissionMode,\n transcript_path: event.transcriptPath,\n runner_correlation_id: event.runnerCorrelationId,\n payload: event.payload,\n },\n };\n default: {\n // Exhaustiveness check — a new AgentEvent variant without a branch here\n // is a compile-time error.\n const _exhaustive: never = event;\n void _exhaustive;\n return null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Derived: name map and payload extractor (thin wrappers around toSSEMapping)\n// ---------------------------------------------------------------------------\n\n/**\n * Map from internal `AgentEvent.type` to canonical SSE wire name. Useful\n * when a consumer only needs the name (routing, logging) and not the\n * payload. For `agent.reasoning` the default entry is `\"thinking\"`; the\n * `isComplete=true` variant produces `\"thinking.complete\"` via\n * `toSSEMapping` — consumers that care should use that directly.\n */\nexport const SSE_EVENT_NAMES: Readonly<Record<AgentEventType, SSEEventName>> = {\n \"agent.conversation.start\": \"conversation.start\",\n \"agent.conversation.end\": \"conversation.end\",\n \"agent.message.start\": \"message.start\",\n \"agent.message.chunk\": \"message.delta\",\n \"agent.message.complete\": \"message.complete\",\n \"agent.message.cancel\": \"message.cancel\",\n \"agent.thinking.start\": \"thinking.start\",\n \"agent.reasoning\": \"thinking\",\n \"agent.tool.intent\": \"tool.intent\",\n \"agent.tool.start\": \"tool.start\",\n \"agent.tool.progress\": \"tool.progress\",\n \"agent.tool.end\": \"tool.end\",\n \"agent.tool.rejected\": \"tool.rejected\",\n \"agent.iteration.start\": \"iteration.start\",\n \"agent.iteration.end\": \"iteration.end\",\n \"agent.llm.start\": \"llm.start\",\n \"agent.llm.end\": \"llm.end\",\n \"agent.error\": \"error\",\n \"claude_code.hook\": \"claude_code.hook\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// SSEFormatter class\n// ---------------------------------------------------------------------------\n\n/**\n * Formats `AgentEvent`s as SSE frames with canonical event names.\n *\n * Delegates all mapping to `toSSEMapping`; this class exists to carry the\n * trace-context enrichment (traceId + timestamp) onto the payload so the\n * runtime's admin SSE broadcast stays self-describing.\n */\nexport class SSEFormatter {\n /** Format an AgentEvent as an SSE frame string, or `null` if unmappable. */\n format(event: AgentEvent): string | null {\n const mapping = toSSEMapping(event);\n if (!mapping) return null;\n const enriched = {\n ...mapping.payload,\n traceId: event.traceId,\n timestamp: event.timestamp.toISOString(),\n };\n return `event: ${mapping.name}\\ndata: ${JSON.stringify(enriched)}\\n\\n`;\n }\n\n /**\n * Extract the payload from an event using canonical snake_case field\n * names. Static so StdioAdapter and other consumers can reuse it without\n * instantiating a formatter. Returns `null` if the event has no mapping.\n */\n static extractPayload(event: AgentEvent): Record<string, unknown> | null {\n return toSSEMapping(event)?.payload ?? null;\n }\n\n /** Format a stream-terminator \"done\" event. */\n static formatDone(): string {\n return \"event: done\\ndata: {}\\n\\n\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible function API\n// ---------------------------------------------------------------------------\n\nconst _defaultFormatter = new SSEFormatter();\n\n/**\n * Format an AgentEvent as an SSE frame string.\n *\n * @deprecated Use `new SSEFormatter().format(event)` instead.\n */\nexport function formatSSE(event: AgentEvent): string | null {\n return _defaultFormatter.format(event);\n}\n","/**\n * AgentNode - event-driven agent wrapper for multi-agent systems.\n *\n * Wraps an Agent with a message queue and worker loop that listens to\n * SandboxEventBus events, batches incoming messages, and runs them through\n * a runner (LLM or mock).\n *\n * Architecture: Bus -> Queue -> Worker -> Runner -> Tools -> Bus\n */\n\nimport type { Agent } from \"@agentic-patterns/core\";\nimport type { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type {\n AgentAddress,\n AgentBroadcastEvent,\n AgentMessageEvent,\n NodeLifecycleEvent,\n SandboxEvent,\n} from \"../events/sandbox-types.js\";\nimport type { CanonicalMessage, RunnerProtocol } from \"../runner/types.js\";\nimport type { MessagingToolbox } from \"../transport/messaging-toolbox.js\";\n\n// Timers that work in both Node and browser environments\ndeclare function setTimeout(callback: () => void, ms: number): number;\ndeclare function clearTimeout(id: number): void;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_IDLE_TIMEOUT = 10_000; // 10s of queue-idle before stopping\nexport const DEFAULT_GLOBAL_TIMEOUT = 120_000; // 120s hard stop (first message wait)\nexport const DEFAULT_MAX_TURNS = 20;\nexport const BATCH_WINDOW = 100; // 100ms window for batch draining\n\n// ---------------------------------------------------------------------------\n// AgentNode options\n// ---------------------------------------------------------------------------\n\nexport interface AgentNodeOptions {\n readonly name: string;\n readonly agent: Agent;\n readonly bus: SandboxEventBus;\n readonly address: AgentAddress;\n readonly toolbox: MessagingToolbox;\n readonly runner: RunnerProtocol;\n readonly traceId?: string;\n readonly maxTurns?: number;\n readonly idleTimeout?: number;\n readonly globalTimeout?: number;\n}\n\n// ---------------------------------------------------------------------------\n// AgentNode\n// ---------------------------------------------------------------------------\n\ntype QueuedEvent = AgentMessageEvent | AgentBroadcastEvent;\n\n/**\n * Event-driven agent wrapper. Bus -> Queue -> Worker -> Runner -> Bus.\n *\n * Each node owns its own SandboxEventBus (wired to a shared transport)\n * and listens for messages addressed to its AgentAddress.\n *\n * Lifecycle events emitted on the bus:\n * - node.started: when the node begins listening\n * - node.stopped: when the worker exits\n * - node.message_received: when messages are dequeued for processing\n * - node.response_sent: after the runner produces a response\n */\nexport class AgentNode {\n readonly name: string;\n readonly agent: Agent;\n readonly address: AgentAddress;\n\n private readonly _bus: SandboxEventBus;\n private readonly _toolbox: MessagingToolbox;\n private readonly _runner: RunnerProtocol;\n private readonly _traceId: string;\n private readonly _maxTurns: number;\n private readonly _idleTimeout: number;\n private readonly _globalTimeout: number;\n\n private _queue: QueuedEvent[] = [];\n private _queueResolve?: () => void;\n private _conversation: CanonicalMessage[] = [];\n private _turnsTaken = 0;\n private _workerPromise: Promise<void> | null = null;\n private _stopped = false;\n readonly transcript: string[] = [];\n\n constructor(options: AgentNodeOptions) {\n this.name = options.name;\n this.agent = options.agent;\n this.address = options.address;\n this._bus = options.bus;\n this._toolbox = options.toolbox;\n this._runner = options.runner;\n this._traceId = options.traceId ?? \"\";\n this._maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n this._idleTimeout = options.idleTimeout ?? DEFAULT_IDLE_TIMEOUT;\n this._globalTimeout = options.globalTimeout ?? DEFAULT_GLOBAL_TIMEOUT;\n }\n\n // ── Lifecycle ──\n\n /**\n * Subscribe to bus events and start the worker loop.\n */\n async start(): Promise<void> {\n this._bus.subscribe(\"sandbox.agent.message\", (event) => {\n this._onMessage(event as AgentMessageEvent);\n });\n this._bus.subscribe(\"sandbox.agent.broadcast\", (event) => {\n this._onBroadcast(event as AgentBroadcastEvent);\n });\n this._workerPromise = this._worker();\n await this._emitLifecycle(\"node.started\", { node: this.name });\n }\n\n /**\n * Stop the worker loop.\n */\n async stop(): Promise<void> {\n this._stopped = true;\n // Wake up the queue waiter so the worker can exit\n if (this._queueResolve) {\n this._queueResolve();\n }\n if (this._workerPromise) {\n await this._workerPromise;\n }\n await this._emitLifecycle(\"node.stopped\", { node: this.name });\n }\n\n /**\n * Seed a message into the queue from the orchestrator.\n */\n async inject(content: string): Promise<void> {\n const synthetic: AgentMessageEvent = {\n type: \"sandbox.agent.message\",\n traceId: this._traceId,\n runId: \"\",\n spanId: `${Date.now().toString(36)}-inject`,\n timestamp: new Date(),\n origin: { deviceId: \"\", instanceId: \"\", agentId: \"system\", role: \"system\" },\n target: this.address,\n agencyId: this._bus.address.deviceId,\n lineupRunId: \"\",\n content,\n metadata: {},\n };\n this._enqueue(synthetic);\n }\n\n /** Number of turns the worker has completed. */\n get turnsTaken(): number {\n return this._turnsTaken;\n }\n\n /** Whether the worker is done (stopped or completed). */\n get isDone(): boolean {\n return this._stopped;\n }\n\n // ── Message filtering ──\n\n private _shouldHandle(event: SandboxEvent): boolean {\n if (event.type === \"sandbox.agent.message\") {\n const msg = event as AgentMessageEvent;\n return (\n msg.target !== undefined &&\n msg.target !== null &&\n msg.target.agentId === this.address.agentId &&\n msg.origin.agentId !== this.address.agentId\n );\n }\n if (event.type === \"sandbox.agent.broadcast\") {\n return event.origin.agentId !== this.address.agentId;\n }\n return false;\n }\n\n private _onMessage(event: AgentMessageEvent): void {\n if (this._shouldHandle(event)) {\n this._enqueue(event);\n }\n }\n\n private _onBroadcast(event: AgentBroadcastEvent): void {\n if (this._shouldHandle(event)) {\n this._enqueue(event);\n }\n }\n\n private _enqueue(event: QueuedEvent): void {\n this._queue.push(event);\n if (this._queueResolve) {\n this._queueResolve();\n this._queueResolve = undefined;\n }\n }\n\n // ── Worker loop ──\n\n private _waitForMessage(timeout: number): Promise<QueuedEvent | null> {\n if (this._queue.length > 0) {\n return Promise.resolve(this._queue.shift()!);\n }\n\n return new Promise<QueuedEvent | null>((resolve) => {\n // biome-ignore lint/style/useConst: assigned in setTimeout closure below\n let timer: ReturnType<typeof setTimeout>;\n\n this._queueResolve = () => {\n clearTimeout(timer);\n if (this._queue.length > 0) {\n resolve(this._queue.shift()!);\n } else {\n resolve(null);\n }\n };\n\n timer = setTimeout(() => {\n this._queueResolve = undefined;\n resolve(null);\n }, timeout);\n });\n }\n\n private _drainQueue(): QueuedEvent[] {\n const batch = [...this._queue];\n this._queue = [];\n return batch;\n }\n\n private async _worker(): Promise<void> {\n while (this._turnsTaken < this._maxTurns && !this._stopped) {\n // First message: wait up to global timeout; subsequent: use idle timeout\n const timeout = this._turnsTaken === 0 ? this._globalTimeout : this._idleTimeout;\n const msg = await this._waitForMessage(timeout);\n\n if (!msg || this._stopped) break;\n\n // Drain additional queued messages (batch window)\n await new Promise<void>((r) => setTimeout(r, BATCH_WINDOW));\n const batch = [msg, ...this._drainQueue()];\n\n // Emit lifecycle event\n await this._emitLifecycle(\"node.message_received\", {\n node: this.name,\n count: batch.length,\n });\n\n // Format incoming messages as user input\n const userMsg = this._formatIncoming(batch);\n\n for (const p of batch) {\n this.transcript.push(`<- ${p.origin.role}: ${p.content}`);\n }\n\n try {\n const result = await this._runner.run(this.agent, userMsg, {\n toolExecutor: this._toolbox,\n messageHistory: this._conversation,\n traceId: this._traceId || undefined,\n maxIterations: 10,\n });\n\n // Append to conversation for continuity\n const request: CanonicalMessage = {\n kind: \"request\" as const,\n parts: [{ type: \"user_prompt\", content: userMsg }],\n };\n const response: CanonicalMessage = {\n kind: \"response\" as const,\n parts: [{ type: \"text\", content: result.response }],\n };\n this._conversation.push(request);\n this._conversation.push(response);\n\n this._turnsTaken++;\n this.transcript.push(`-> ${this.name}: ${result.response}`);\n\n // Emit lifecycle event\n await this._emitLifecycle(\"node.response_sent\", {\n node: this.name,\n toolCalls: result.toolCallsCount,\n tokens: result.inputTokens + result.outputTokens,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.transcript.push(`! ${this.name} error: ${message}`);\n break;\n }\n }\n }\n\n // ── Helpers ──\n\n private _formatIncoming(events: QueuedEvent[]): string {\n const parts: string[] = [];\n for (const e of events) {\n if (e.type === \"sandbox.agent.message\") {\n parts.push(`[Message from ${e.origin.role}]: ${e.content}`);\n } else if (e.type === \"sandbox.agent.broadcast\") {\n parts.push(`[Broadcast from ${e.origin.role}]: ${e.content}`);\n }\n }\n return parts.join(\"\\n\\n\");\n }\n\n private async _emitLifecycle(\n nodeEventType: NodeLifecycleEvent[\"nodeEventType\"],\n metadata: Record<string, unknown>,\n ): Promise<void> {\n const event: NodeLifecycleEvent = {\n type: \"sandbox.node.lifecycle\",\n traceId: this._traceId,\n runId: \"\",\n spanId: `${Date.now().toString(36)}-lifecycle`,\n timestamp: new Date(),\n origin: this.address,\n agencyId: \"\",\n lineupRunId: \"\",\n nodeEventType,\n message: `${nodeEventType}: ${this.name}`,\n metadata,\n };\n await this._bus.publish(event);\n }\n}\n","/**\n * AgencyRuntime - takes an Agency atom and produces a running system of AgentNode instances.\n *\n * Bridges the declarative Agency definition (atoms layer) to the runtime systems layer\n * by creating transport, building agents with roles/capabilities, and wiring up\n * event-driven communication between nodes.\n *\n * Architecture:\n * Agency (atom) -> AgencyRuntime -> [AgentNode, AgentNode, ...] on shared transport\n */\n\nimport {\n type Agency,\n AgentBuilder,\n type AgentSpecData,\n Capability,\n Judgment,\n Mission,\n Persona,\n RoleBuilder,\n TextManual,\n} from \"@agentic-patterns/core\";\nimport { SandboxEventBus } from \"../events/sandbox-event-bus.js\";\nimport type { AgentAddress } from \"../events/sandbox-types.js\";\nimport type { RunnerProtocol } from \"../runner/types.js\";\nimport { InProcessTransport } from \"../transport/in-process.js\";\nimport { MessagingToolbox } from \"../transport/messaging-toolbox.js\";\nimport { AgentNode } from \"./agent-node.js\";\n\n// ---------------------------------------------------------------------------\n// ID generation (works without DOM or Node types)\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Messaging manual (inline, matches Python _MessagingManual)\n// ---------------------------------------------------------------------------\n\nconst MESSAGING_GUIDANCE =\n \"## Team Communication\\n\" +\n \"Use send_message(to, content) to message a specific teammate by role name.\\n\" +\n \"Use broadcast(content) for team-wide announcements.\\n\" +\n \"Use list_team() to see who's on the team.\\n\\n\" +\n \"Keep messages brief and actionable. Don't send more than 2 messages per turn.\\n\" +\n \"When your work is done, stop messaging.\";\n\n// ---------------------------------------------------------------------------\n// AgencyRuntime\n// ---------------------------------------------------------------------------\n\n/**\n * Takes an Agency atom and creates an AgentNode swarm with transport wiring.\n *\n * Lifecycle:\n * const runtime = new AgencyRuntime(agency, runner);\n * await runtime.start(); // creates transport, builds nodes, starts all\n * await runtime.injectCoordinator(\"Go!\");\n * ...\n * await runtime.stop(); // stops all nodes and transport\n */\nexport class AgencyRuntime {\n private readonly _agency: Agency;\n private readonly _runner: RunnerProtocol;\n private readonly _runId: string;\n private _transport: InProcessTransport | null = null;\n private _nodes: Record<string, AgentNode> = {};\n private _buses: Record<string, SandboxEventBus> = {};\n private _addresses: Record<string, AgentAddress> = {};\n private _started = false;\n\n constructor(agency: Agency, runner: RunnerProtocol, runId?: string) {\n this._agency = agency;\n this._runner = runner;\n this._runId = runId ?? generateId();\n }\n\n // ── Lifecycle ──\n\n /**\n * Create transport, build nodes, start all.\n */\n async start(): Promise<void> {\n if (this._started) return;\n\n // 1. Create transport (MVP: in-process only)\n this._transport = new InProcessTransport();\n\n // 2. Build addresses for all agents (needed for roster)\n for (const spec of this._agency.data.agents) {\n const addr: AgentAddress = {\n deviceId: \"local\",\n instanceId: this._runId,\n agentId: spec.role,\n role: spec.role,\n };\n this._addresses[spec.role] = addr;\n }\n\n // 3. Build AgentNode per AgentSpec\n for (const spec of this._agency.data.agents) {\n const node = await this._buildNode(spec);\n this._nodes[spec.role] = node;\n }\n\n // 4. Start all nodes\n for (const node of Object.values(this._nodes)) {\n await node.start();\n }\n\n this._started = true;\n }\n\n /**\n * Stop all nodes and transport.\n */\n async stop(): Promise<void> {\n if (!this._started) return;\n\n // Stop nodes\n for (const node of Object.values(this._nodes)) {\n await node.stop();\n }\n\n // Stop buses\n for (const bus of Object.values(this._buses)) {\n await bus.stop();\n }\n\n this._started = false;\n }\n\n // ── Messaging ──\n\n /**\n * Inject a message to a specific agent by role.\n */\n async inject(role: string, content: string): Promise<void> {\n const node = this._nodes[role];\n if (!node) {\n const available = Object.keys(this._nodes).sort().join(\", \");\n throw new Error(`No agent with role '${role}'. Available: ${available}`);\n }\n await node.inject(content);\n }\n\n /**\n * Inject a message to the coordinator agent.\n */\n async injectCoordinator(content: string): Promise<void> {\n const coord = this._agency.coordinator;\n if (!coord) {\n throw new Error(\"Agency has no coordinator\");\n }\n await this.inject(coord.role, content);\n }\n\n // ── Introspection ──\n\n /**\n * Get the coordinator's address.\n */\n get coordinatorAddress(): AgentAddress | undefined {\n const coord = this._agency.coordinator;\n if (!coord) return undefined;\n return this._addresses[coord.role];\n }\n\n /**\n * Return role -> state mapping for all nodes.\n */\n status(): Record<string, \"running\" | \"stopped\"> {\n const result: Record<string, \"running\" | \"stopped\"> = {};\n for (const [role, node] of Object.entries(this._nodes)) {\n result[role] = node.isDone ? \"stopped\" : \"running\";\n }\n return result;\n }\n\n /**\n * Access the underlying nodes (read-only view).\n */\n get nodes(): Record<string, AgentNode> {\n return { ...this._nodes };\n }\n\n /**\n * The run ID for this runtime instance.\n */\n get runId(): string {\n return this._runId;\n }\n\n // ── Internal ──\n\n /**\n * Build a single AgentNode from an AgentSpec.\n */\n private async _buildNode(spec: AgentSpecData): Promise<AgentNode> {\n if (!this._transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n const addr = this._addresses[spec.role];\n if (!addr) {\n throw new Error(`No address for role '${spec.role}'`);\n }\n\n // 1. SandboxEventBus with shared transport\n const bus = new SandboxEventBus(addr, this._transport);\n await bus.start();\n this._buses[spec.role] = bus;\n\n // 2. MessagingToolbox with full roster\n const toolbox = new MessagingToolbox(bus, addr, this._agency.data.name, this._runId, {\n ...this._addresses,\n });\n\n // 3. Wrap in Capability with messaging manual\n const manual = new TextManual(\n \"Team Communication\",\n MESSAGING_GUIDANCE,\n \"How to communicate with teammates\",\n );\n const messagingCap = new Capability(\"messaging\", \"Inter-agent messaging\", toolbox, manual);\n\n // 4. Build Role\n const personaData = spec.persona;\n const persona = personaData\n ? new Persona(personaData)\n : new Persona({\n identity: `a ${spec.role} agent`,\n tone: \"professional and concise\",\n });\n\n const roleBuilder = new RoleBuilder(spec.role)\n .withPersona(persona)\n .withCapability(messagingCap)\n .withDefaultModel(spec.model);\n\n if (spec.judgment) {\n roleBuilder.withJudgment(new Judgment(spec.judgment));\n }\n\n const role = roleBuilder.build();\n\n // 5. Build Agent\n const mission = new Mission({\n objective: `Fulfill the ${spec.role} role within the ${this._agency.data.name} agency.`,\n });\n const agent = new AgentBuilder(role).withMission(mission).build();\n\n // 6. Create AgentNode\n return new AgentNode({\n name: spec.role,\n agent,\n bus,\n address: addr,\n toolbox,\n runner: this._runner,\n maxTurns: spec.max_turns,\n });\n }\n}\n","/**\n * Conversation runtime - stateful multi-turn conversation management.\n *\n * Ported from Python: systems/conversation.py\n */\n\nimport type { AgentEventBus } from \"../events/agent-event-bus.js\";\nimport { getAgentEventBus } from \"../events/agent-event-bus.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport { createEvent } from \"../events/types.js\";\nimport type {\n AgentLike,\n CanonicalMessage,\n CanonicalMessagePart,\n RunResult,\n RunnerProtocol,\n ToolExecutor,\n} from \"../runner/types.js\";\nimport type { ConversationStoreProtocol } from \"./store.js\";\n\n// ---------------------------------------------------------------------------\n// Exchange\n// ---------------------------------------------------------------------------\n\n/** A single tool call record within an exchange. */\nexport interface ToolCallRecord {\n readonly name: string;\n readonly id?: string;\n readonly arguments?: Record<string, unknown>;\n}\n\n/** A complete user->assistant exchange in a conversation. */\nexport interface Exchange {\n readonly number: number;\n readonly invocationId: string;\n readonly user: string;\n readonly assistant: string;\n readonly toolCalls: ToolCallRecord[];\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly timestamp: Date;\n}\n\n/**\n * Total tokens for an exchange.\n */\nexport function exchangeTotalTokens(exchange: Exchange): number {\n return exchange.inputTokens + exchange.outputTokens;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation\n// ---------------------------------------------------------------------------\n\n/**\n * A live conversation that can be continued.\n *\n * Core runtime abstraction for multi-turn conversations.\n * Tracks state, history, and manages execution.\n *\n * Example:\n * const conversation = new Conversation(agent, runner);\n * const exchange = await conversation.send(\"Hello!\");\n * console.log(exchange.assistant);\n */\nexport class Conversation {\n readonly id: string;\n readonly agent: AgentLike;\n readonly runner: RunnerProtocol;\n\n private _store: ConversationStoreProtocol | undefined;\n private _storeConversationId: string | undefined;\n private _toolExecutor: ToolExecutor | undefined;\n private _state: Record<string, unknown>;\n private _history: Exchange[] = [];\n private _exchangeCount = 0;\n\n constructor(\n agent: AgentLike,\n runner: RunnerProtocol,\n options?: {\n id?: string;\n store?: ConversationStoreProtocol;\n toolExecutor?: ToolExecutor;\n state?: Record<string, unknown>;\n history?: Exchange[];\n },\n ) {\n this.agent = agent;\n this.runner = runner;\n this.id = options?.id ?? generateUUID();\n this._store = options?.store;\n this._toolExecutor = options?.toolExecutor;\n this._state = options?.state ?? {};\n if (options?.history) {\n this._history = [...options.history];\n this._exchangeCount = this._history.length;\n }\n }\n\n /** String session ID for SDK compatibility. */\n get sessionId(): string {\n return this.id;\n }\n\n /** Number of completed exchanges. */\n get exchangeCount(): number {\n return this._exchangeCount;\n }\n\n /** All completed exchanges (copy). */\n get history(): Exchange[] {\n return [...this._history];\n }\n\n /** Alias for history — matches spec's `exchanges` getter. */\n get exchanges(): Exchange[] {\n return this.history;\n }\n\n /** Working state. */\n get state(): Record<string, unknown> {\n return { ...this._state };\n }\n\n /** Aggregate token usage across all exchanges. */\n get totalTokens(): { input: number; output: number; total: number } {\n const input = this._history.reduce((s, e) => s + e.inputTokens, 0);\n const output = this._history.reduce((s, e) => s + e.outputTokens, 0);\n return { input, output, total: input + output };\n }\n\n /** Most recent exchange, or undefined if no history. */\n get lastExchange(): Exchange | undefined {\n return this._history.length > 0 ? this._history[this._history.length - 1] : undefined;\n }\n\n /** Clear conversation history. */\n clear(): void {\n this._history = [];\n this._exchangeCount = 0;\n }\n\n /** Rollback conversation to a specific exchange (inclusive). */\n rollback(toExchange: number): void {\n this._history = this._history.filter((e) => e.number <= toExchange);\n this._exchangeCount = this._history.length;\n }\n\n /**\n * Send a message and get a response.\n */\n async send(message: string): Promise<Exchange> {\n this._exchangeCount += 1;\n const invocationId = generateUUID();\n\n const messageHistory = this._toMessageHistory();\n\n const result: RunResult = await this.runner.run(this.agent, message, {\n messageHistory,\n toolExecutor: this._toolExecutor,\n });\n\n const exchange: Exchange = {\n number: this._exchangeCount,\n invocationId,\n user: message,\n assistant: result.response,\n toolCalls: [],\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n timestamp: new Date(),\n };\n\n this._history.push(exchange);\n\n if (this._store) {\n await this._persistExchange(exchange);\n }\n\n return exchange;\n }\n\n /**\n * Send a message and stream the response.\n *\n * Yields AgentEvents as they arrive. After streaming completes,\n * the exchange is recorded in history.\n */\n async *stream(\n message: string,\n options?: { eventBus?: AgentEventBus },\n ): AsyncGenerator<AgentEvent> {\n if (!this.runner.stream) {\n throw new Error(\"Runner does not support streaming\");\n }\n\n this._exchangeCount += 1;\n const invocationId = generateUUID();\n const messageHistory = this._toMessageHistory();\n const eventBus = options?.eventBus ?? getAgentEventBus();\n\n // Get trace ID from message.start event (will be emitted by runner)\n // For now, generate one\n const traceId = invocationId;\n const runId = generateUUID();\n\n // Emit conversation start\n const convStartEvent = createEvent(\"agent.conversation.start\", {\n traceId,\n runId,\n conversationId: this.id,\n agentName: this.agent.role.name,\n });\n yield convStartEvent;\n await eventBus.publish(convStartEvent);\n\n let fullResponse = \"\";\n let totalInput = 0;\n let totalOutput = 0;\n let error: Error | undefined;\n\n try {\n for await (const event of this.runner.stream(this.agent, message, {\n messageHistory,\n toolExecutor: this._toolExecutor,\n eventBus: options?.eventBus,\n })) {\n yield event;\n\n // Accumulate response data from events\n if (event.type === \"agent.message.chunk\") {\n fullResponse += event.delta;\n }\n if (event.type === \"agent.message.complete\") {\n fullResponse = event.content;\n totalInput = event.inputTokens;\n totalOutput = event.outputTokens;\n }\n }\n } catch (e) {\n error = e instanceof Error ? e : new Error(String(e));\n }\n\n const exchange: Exchange = {\n number: this._exchangeCount,\n invocationId,\n user: message,\n assistant: fullResponse,\n toolCalls: [],\n inputTokens: totalInput,\n outputTokens: totalOutput,\n timestamp: new Date(),\n };\n\n this._history.push(exchange);\n\n if (this._store) {\n await this._persistExchange(exchange);\n }\n\n // Emit conversation end\n const convEndEvent = createEvent(\"agent.conversation.end\", {\n traceId,\n runId,\n conversationId: this.id,\n reason: error ? \"error\" : \"completed\",\n });\n yield convEndEvent;\n await eventBus.publish(convEndEvent);\n\n // Rethrow error after emitting conversation.end\n if (error) {\n throw error;\n }\n }\n\n /**\n * Create a new conversation branch.\n *\n * @param atExchange - Exchange number to branch from (undefined = current)\n */\n async fork(atExchange?: number): Promise<Conversation> {\n const branchPoint = atExchange ?? this._exchangeCount;\n\n const forked = new Conversation(this.agent, this.runner, {\n store: this._store,\n toolExecutor: this._toolExecutor,\n state: { ...this._state },\n });\n\n forked._history = this._history.filter((e) => e.number <= branchPoint);\n forked._exchangeCount = forked._history.length;\n\n return forked;\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n /**\n * Persist an exchange to the store using the new protocol.\n */\n private async _persistExchange(exchange: Exchange): Promise<void> {\n if (!this._store) return;\n\n if (!this._storeConversationId) {\n const conv = await this._store.createConversation(\n this.agent.role.name,\n this.agent.getModel(),\n );\n this._storeConversationId = conv.id;\n }\n\n await this._store.addMessage(this._storeConversationId, \"request\", [\n { type: \"user_prompt\", content: exchange.user },\n ]);\n\n await this._store.addMessage(\n this._storeConversationId,\n \"response\",\n [{ type: \"text\", content: exchange.assistant }],\n {\n inputTokens: exchange.inputTokens,\n outputTokens: exchange.outputTokens,\n },\n );\n }\n\n /**\n * Convert history to canonical message format for runners.\n */\n private _toMessageHistory(): CanonicalMessage[] {\n const messages: CanonicalMessage[] = [];\n for (const exchange of this._history) {\n messages.push({\n kind: \"request\",\n parts: [{ type: \"user_prompt\", content: exchange.user }],\n });\n const parts: CanonicalMessagePart[] = [{ type: \"text\", content: exchange.assistant }];\n for (const tc of exchange.toolCalls) {\n parts.push({\n type: \"tool_call\",\n tool_name: tc.name,\n tool_call_id: tc.id,\n arguments: tc.arguments,\n });\n }\n messages.push({\n kind: \"response\",\n parts,\n });\n }\n return messages;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateUUID(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n","/**\n * ConversationStoreProtocol — structured persistence for conversations.\n *\n * Ported from Python: systems/stores/base.py\n */\n\n// ---------------------------------------------------------------------------\n// ID generation\n// ---------------------------------------------------------------------------\n\nlet _counter = 0;\nfunction generateId(): string {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return (globalThis as unknown as { crypto: { randomUUID(): string } }).crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${(++_counter).toString(36)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Stored record types\n// ---------------------------------------------------------------------------\n\n/** A stored conversation record. */\nexport interface StoredConversation {\n readonly id: string;\n readonly agentName: string;\n readonly model: string;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n readonly metadata: Record<string, unknown>;\n}\n\n/** A stored message within a conversation. */\nexport interface StoredMessage {\n readonly id: string;\n readonly conversationId: string;\n readonly kind: \"request\" | \"response\";\n readonly runId?: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly createdAt: Date;\n readonly parts: StoredMessagePart[];\n}\n\n/** A part of a stored message. */\nexport interface StoredMessagePart {\n readonly id: string;\n readonly messageId: string;\n readonly type: string;\n readonly content?: string;\n readonly metadata: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Protocol\n// ---------------------------------------------------------------------------\n\n/** Structured conversation persistence protocol. */\nexport interface ConversationStoreProtocol {\n createConversation(agentName: string, model: string): Promise<StoredConversation>;\n\n getConversation(conversationId: string): Promise<StoredConversation | null>;\n\n updateConversation(\n conversationId: string,\n updates: Record<string, unknown>,\n ): Promise<StoredConversation>;\n\n addMessage(\n conversationId: string,\n kind: \"request\" | \"response\",\n parts: Array<{\n type: string;\n content?: string;\n metadata?: Record<string, unknown>;\n }>,\n options?: {\n runId?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n ): Promise<StoredMessage>;\n\n getMessages(conversationId: string, limit?: number): Promise<StoredMessage[]>;\n\n getMessageParts(messageId: string): Promise<StoredMessagePart[]>;\n}\n\n// ---------------------------------------------------------------------------\n// MemoryStore\n// ---------------------------------------------------------------------------\n\n/** In-memory implementation of ConversationStoreProtocol. */\nexport class MemoryStore implements ConversationStoreProtocol {\n private _conversations = new Map<string, StoredConversation>();\n private _messages = new Map<string, StoredMessage[]>();\n private _parts = new Map<string, StoredMessagePart[]>();\n\n async createConversation(agentName: string, model: string): Promise<StoredConversation> {\n const now = new Date();\n const conv: StoredConversation = {\n id: generateId(),\n agentName,\n model,\n createdAt: now,\n updatedAt: now,\n metadata: {},\n };\n this._conversations.set(conv.id, conv);\n this._messages.set(conv.id, []);\n return conv;\n }\n\n async getConversation(conversationId: string): Promise<StoredConversation | null> {\n return this._conversations.get(conversationId) ?? null;\n }\n\n async updateConversation(\n conversationId: string,\n updates: Record<string, unknown>,\n ): Promise<StoredConversation> {\n const existing = this._conversations.get(conversationId);\n if (!existing) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n const updated: StoredConversation = {\n ...existing,\n metadata: { ...existing.metadata, ...updates },\n updatedAt: new Date(),\n };\n this._conversations.set(conversationId, updated);\n return updated;\n }\n\n async addMessage(\n conversationId: string,\n kind: \"request\" | \"response\",\n parts: Array<{\n type: string;\n content?: string;\n metadata?: Record<string, unknown>;\n }>,\n options?: {\n runId?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n ): Promise<StoredMessage> {\n const convMessages = this._messages.get(conversationId);\n if (!convMessages) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n\n const messageId = generateId();\n const storedParts: StoredMessagePart[] = parts.map((p) => ({\n id: generateId(),\n messageId,\n type: p.type,\n content: p.content,\n metadata: p.metadata ?? {},\n }));\n\n const msg: StoredMessage = {\n id: messageId,\n conversationId,\n kind,\n runId: options?.runId,\n inputTokens: options?.inputTokens ?? 0,\n outputTokens: options?.outputTokens ?? 0,\n createdAt: new Date(),\n parts: storedParts,\n };\n\n convMessages.push(msg);\n this._parts.set(messageId, storedParts);\n return msg;\n }\n\n async getMessages(conversationId: string, limit?: number): Promise<StoredMessage[]> {\n const msgs = this._messages.get(conversationId) ?? [];\n if (limit !== undefined && limit > 0) {\n return msgs.slice(-limit);\n }\n return [...msgs];\n }\n\n async getMessageParts(messageId: string): Promise<StoredMessagePart[]> {\n return this._parts.get(messageId) ?? [];\n }\n}\n","/**\n * Base exporter protocol and class for event-driven observability.\n *\n * Exporters subscribe to EventBus profiles and handle events for\n * rendering, tracing, or metrics collection.\n *\n * Ported from Python: systems/exporters/base.py\n */\n\nimport type { EventBus } from \"../events/event-bus.js\";\nimport { EventProfile, subscribeProfile, unsubscribeProfile } from \"../events/event-profiles.js\";\nimport type { BaseEvent } from \"../events/types.js\";\n\n// ---------------------------------------------------------------------------\n// Exporter interface\n// ---------------------------------------------------------------------------\n\n/** Protocol for event exporters. */\nexport interface Exporter {\n attach(bus: EventBus): void;\n detach(bus: EventBus): void;\n}\n\n// ---------------------------------------------------------------------------\n// BaseExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Base class with profile-based subscription.\n *\n * Subclasses set `profile` and implement `_on<Suffix>` methods.\n * The `handleEvent` dispatcher converts event_type to method name:\n * \"agent.message.start\" -> \"_onMessageStart\"\n * \"agent.tool.end\" -> \"_onToolEnd\"\n * \"agent.reasoning\" -> \"_onReasoning\"\n * \"agent.error\" -> \"_onError\"\n */\nexport abstract class BaseExporter implements Exporter {\n profile: EventProfile = EventProfile.UX;\n\n /** Subscribe to all event types in this exporter's profile. */\n attach(bus: EventBus): void {\n subscribeProfile(bus, this.profile, this._boundHandleEvent);\n }\n\n /** Unsubscribe from all event types in this exporter's profile. */\n detach(bus: EventBus): void {\n unsubscribeProfile(bus, this.profile, this._boundHandleEvent);\n }\n\n /**\n * Dispatch to _on<Suffix> methods by event type.\n *\n * Converts event type (e.g. \"agent.message.start\") to handler\n * method name (e.g. \"_onMessageStart\") by stripping the \"agent.\"\n * prefix and converting dot-separated segments to camelCase.\n */\n async handleEvent(event: BaseEvent): Promise<void> {\n const eventType = event.type;\n if (!eventType) return;\n\n // Strip \"agent.\" prefix and convert to camelCase handler name\n const suffix = eventType\n .replace(\"agent.\", \"\")\n .split(\".\")\n .map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))\n .join(\"\");\n\n const handlerName = `_on${suffix.charAt(0).toUpperCase()}${suffix.slice(1)}`;\n\n // biome-ignore lint/suspicious/noExplicitAny: dynamic dispatch by design\n const handler = (this as any)[handlerName];\n if (typeof handler === \"function\") {\n await handler.call(this, event);\n }\n }\n\n /** Bound reference for subscribe/unsubscribe identity. */\n private _boundHandleEvent = (event: BaseEvent) => this.handleEvent(event);\n}\n","/**\n * Console exporter - plain text output for agent execution.\n *\n * Provides terminal output via EventBus subscription.\n * Uses a Logger interface to avoid hard dependency on Node globals.\n *\n * Ported from Python: systems/exporters/console.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n MessageChunkEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ReasoningEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n/** Logger interface for console output. */\nexport interface ConsoleLogger {\n log(message: string): void;\n error(message: string): void;\n write(text: string): void;\n}\n\n/** No-op logger that silently discards output. */\nfunction noopLogger(): ConsoleLogger {\n return {\n log: () => {},\n error: () => {},\n write: () => {},\n };\n}\n\n/**\n * Console exporter that prints agent events to stdout.\n *\n * Subscribes to UX profile events and renders them as plain text.\n */\nexport class ConsoleExporter extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _verbose: boolean;\n private _logger: ConsoleLogger;\n private _contentBuffer: string[] = [];\n private _toolNames = new Map<string, string>();\n\n constructor(options?: { verbose?: boolean; logger?: ConsoleLogger }) {\n super();\n this._verbose = options?.verbose ?? true;\n this._logger = options?.logger ?? noopLogger();\n }\n\n /** @internal */\n async _onMessageStart(_event: MessageStartEvent): Promise<void> {\n if (this._verbose) {\n this._logger.log(\"\");\n this._logger.log(\"-\".repeat(60));\n this._logger.log(\"Agent thinking...\");\n }\n }\n\n /** @internal */\n async _onMessageChunk(event: MessageChunkEvent): Promise<void> {\n this._contentBuffer.push(event.delta);\n this._logger.write(event.delta);\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n // Only render full content if nothing was streamed\n if (this._contentBuffer.length === 0 && event.content) {\n this._logger.log(\"\");\n this._logger.log(event.content);\n }\n\n this._logger.log(\"\"); // Newline after content\n\n if (this._verbose) {\n this._logger.log(\n `Tokens: ${event.inputTokens} in / ${event.outputTokens} out | Model: ${event.model}`,\n );\n }\n\n this._contentBuffer = [];\n }\n\n /** @internal */\n async _onReasoning(event: ReasoningEvent): Promise<void> {\n if (event.isComplete) return;\n if (this._verbose) {\n const content =\n event.content.length > 500 ? `${event.content.slice(0, 500)}...` : event.content;\n this._logger.log(`[Reasoning] ${content}`);\n this._logger.log(\"\");\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n this._toolNames.set(event.toolCallId, event.toolName);\n if (this._verbose) {\n this._logger.log(` Tool: ${event.toolName}...`);\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const toolName = this._toolNames.get(event.toolCallId) ?? event.toolName;\n this._toolNames.delete(event.toolCallId);\n\n if (this._verbose) {\n if (event.error) {\n this._logger.log(` Error: ${event.error}`);\n } else {\n this._logger.log(` Done: ${toolName} (${event.durationMs}ms)`);\n }\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n this._logger.log(\"\");\n this._logger.error(`Error [${event.errorType}]: ${event.message}`);\n }\n}\n\n/**\n * Factory function for console exporter.\n */\nexport function createConsoleExporter(options?: {\n verbose?: boolean;\n logger?: ConsoleLogger;\n}): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n","/**\n * Langfuse exporter - LLM observability with traces and generations.\n *\n * Exports agent events to Langfuse for LLM-specific observability\n * including traces, generations (LLM calls), and spans (tool calls).\n *\n * Requires @langfuse/langfuse as an optional peer dependency.\n *\n * Ported from Python: systems/exporters/langfuse.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n LLMCallStartEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ReasoningEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Langfuse client interface (minimal shape)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal interface for Langfuse client.\n *\n * Users provide the real Langfuse client from @langfuse/langfuse.\n * We define this interface to avoid a hard dependency.\n */\nexport interface LangfuseClient {\n startSpan(params: Record<string, unknown>): LangfuseSpan;\n flush(): void;\n}\n\n/** Minimal Langfuse span interface. */\nexport interface LangfuseSpan {\n startSpan(params: Record<string, unknown>): LangfuseSpan;\n startObservation(params: Record<string, unknown>): LangfuseObservation;\n update(params: Record<string, unknown>): void;\n updateTrace(params: Record<string, unknown>): void;\n end(): void;\n}\n\n/** Minimal Langfuse observation interface. */\nexport interface LangfuseObservation {\n update(params: Record<string, unknown>): void;\n end(): void;\n}\n\n// ---------------------------------------------------------------------------\n// LangfuseExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Export agent events to Langfuse for LLM observability.\n *\n * Maps the agent event hierarchy to Langfuse concepts:\n * - MessageStart -> Root span (creates trace implicitly)\n * - LLM calls -> Generation (nested under root/iteration span)\n * - Tool calls -> Generation (nested under root/iteration span)\n * - MessageComplete -> Trace update with final output\n */\nexport class LangfuseExporter extends BaseExporter {\n override profile = EventProfile.OBSERVABILITY;\n\n private langfuse: LangfuseClient;\n private captureContent: boolean;\n private _rootSpans = new Map<string, LangfuseSpan>();\n private _iterationSpans = new Map<string, LangfuseSpan>();\n private _generations = new Map<string, LangfuseObservation>();\n private _spans = new Map<string, LangfuseObservation>();\n private _traceInputSet = new Set<string>();\n private _iterToolNames = new Map<string, string[]>();\n private _iterOutputTokens = new Map<string, number>();\n private _iterUserMessage = new Map<string, string | undefined>();\n private _prevIterToolNames = new Map<string, string[]>();\n\n constructor(options: {\n client: LangfuseClient;\n captureContent?: boolean;\n }) {\n super();\n this.langfuse = options.client;\n this.captureContent = options.captureContent ?? true;\n }\n\n private _toHexId(uuidStr: string): string {\n return uuidStr.replace(/-/g, \"\").toLowerCase();\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n const traceName = event.agentName || \"agent.run\";\n const runId = event.runId;\n const parentSpanId = event.parentSpanId;\n\n let rootSpan: LangfuseSpan;\n if (parentSpanId) {\n const traceId = this._toHexId(event.traceId || runId);\n rootSpan = this.langfuse.startSpan({\n trace_context: {\n trace_id: traceId,\n parent_span_id: this._toHexId(parentSpanId),\n },\n name: \"agent.run\",\n metadata: { run_id: runId },\n });\n } else {\n rootSpan = this.langfuse.startSpan({\n name: \"agent.run\",\n metadata: { run_id: runId },\n });\n }\n\n rootSpan.updateTrace({ name: traceName });\n\n if (event.agentConfig) {\n rootSpan.update({ input: event.agentConfig });\n }\n\n this._rootSpans.set(runId, rootSpan);\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n const rootSpan = this._rootSpans.get(event.runId);\n if (rootSpan) {\n const iterSpan = rootSpan.startSpan({\n name: `iteration.${event.iteration}`,\n metadata: {\n iteration: event.iteration,\n max_iterations: event.maxIterations,\n },\n });\n this._iterationSpans.set(event.runId, iterSpan);\n this._iterToolNames.set(event.runId, []);\n this._iterOutputTokens.set(event.runId, 0);\n }\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n const iterSpan = this._iterationSpans.get(event.runId);\n this._iterationSpans.delete(event.runId);\n\n if (iterSpan) {\n let iterInput: string | undefined;\n let iterOutput: string | undefined;\n\n if (this.captureContent) {\n const prevTools = this._prevIterToolNames.get(event.runId);\n if (prevTools && prevTools.length > 0) {\n iterInput = `Tool results from: ${prevTools.join(\", \")}`;\n } else {\n iterInput = this._iterUserMessage.get(event.runId) ?? undefined;\n }\n\n const toolNames = this._iterToolNames.get(event.runId) ?? [];\n const outputTokens = this._iterOutputTokens.get(event.runId) ?? 0;\n if (toolNames.length > 0) {\n iterOutput = `Called tools: ${toolNames.join(\", \")}`;\n } else {\n iterOutput = `Final response (${outputTokens} tokens)`;\n }\n }\n\n const toolNames = this._iterToolNames.get(event.runId) ?? [];\n this._iterToolNames.delete(event.runId);\n if (toolNames.length > 0) {\n this._prevIterToolNames.set(event.runId, toolNames);\n } else {\n this._prevIterToolNames.delete(event.runId);\n }\n this._iterOutputTokens.delete(event.runId);\n\n iterSpan.update({\n input: iterInput,\n output: iterOutput,\n metadata: {\n iteration: event.iteration,\n tool_calls_count: event.toolCallsCount,\n has_more: event.hasMore,\n },\n });\n iterSpan.end();\n }\n }\n\n /** @internal */\n async _onLlmStart(event: LLMCallStartEvent): Promise<void> {\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const generation = parent.startObservation({\n as_type: \"generation\",\n name: \"llm.call\",\n model: event.model,\n });\n this._generations.set(event.spanId, generation);\n }\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n const generation = this._generations.get(event.spanId);\n this._generations.delete(event.spanId);\n\n if (generation) {\n generation.update({\n usage_details: {\n input: event.inputTokens,\n output: event.outputTokens,\n },\n metadata: { finish_reason: event.finishReason },\n });\n generation.end();\n\n if (this._iterOutputTokens.has(event.runId)) {\n this._iterOutputTokens.set(event.runId, event.outputTokens);\n }\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n const toolNames = this._iterToolNames.get(event.runId);\n if (toolNames) {\n toolNames.push(event.toolName);\n }\n\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const observation = parent.startObservation({\n as_type: \"generation\",\n name: `tool.${event.toolName}`,\n input: this.captureContent ? event.arguments : undefined,\n });\n this._spans.set(event.spanId, observation);\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const observation = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n\n if (observation) {\n const metadata: Record<string, unknown> = {\n duration_ms: event.durationMs,\n };\n if (event.resultTokens) {\n metadata.result_tokens = event.resultTokens;\n }\n\n const updateKwargs: Record<string, unknown> = {\n output: this.captureContent ? event.result : undefined,\n metadata,\n };\n if (event.resultTokens) {\n updateKwargs.usage_details = {\n output: event.resultTokens,\n total: event.resultTokens,\n };\n }\n\n observation.update(updateKwargs);\n observation.end();\n }\n }\n\n /** @internal */\n async _onReasoning(event: ReasoningEvent): Promise<void> {\n if (!event.isComplete) return;\n\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const reasoningSpan = parent.startSpan({\n name: \"reasoning\",\n output: this.captureContent ? event.content : undefined,\n });\n reasoningSpan.end();\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n const parent = this._iterationSpans.get(event.runId) ?? this._rootSpans.get(event.runId);\n if (parent) {\n const errorSpan = parent.startSpan({\n name: \"error\",\n input: { error_type: event.errorType, message: event.message },\n level: \"ERROR\",\n });\n errorSpan.end();\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n this._traceInputSet.delete(event.runId);\n this._iterUserMessage.delete(event.runId);\n this._prevIterToolNames.delete(event.runId);\n this._iterToolNames.delete(event.runId);\n this._iterOutputTokens.delete(event.runId);\n\n const rootSpan = this._rootSpans.get(event.runId);\n this._rootSpans.delete(event.runId);\n\n if (rootSpan) {\n rootSpan.update({\n output: this.captureContent ? event.content : undefined,\n });\n rootSpan.updateTrace({\n output: this.captureContent ? event.content : undefined,\n metadata: {\n input_tokens: event.inputTokens,\n output_tokens: event.outputTokens,\n model: event.model,\n },\n });\n rootSpan.end();\n }\n }\n\n /** Flush pending events to Langfuse. */\n flush(): void {\n this.langfuse.flush();\n }\n}\n","/**\n * OpenTelemetry exporter - spans to OTLP collector.\n *\n * Exports agent events as OpenTelemetry spans following Gen AI\n * semantic conventions for LLM observability.\n *\n * Requires @opentelemetry/api as an optional peer dependency.\n *\n * Ported from Python: systems/exporters/otel.py\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n LLMCallStartEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// OTel interfaces (minimal shape to avoid hard dependency)\n// ---------------------------------------------------------------------------\n\n/** Minimal OTel Span interface. */\nexport interface OTelSpan {\n setAttribute(key: string, value: string | number | boolean): void;\n setStatus(status: { code: number; message?: string }): void;\n recordException(error: Error): void;\n end(): void;\n}\n\n/** Minimal OTel Tracer interface. */\nexport interface OTelTracer {\n startSpan(name: string, options?: Record<string, unknown>): OTelSpan;\n}\n\n/** OTel StatusCode constants. */\nexport const OTelStatusCode = {\n OK: 1,\n ERROR: 2,\n} as const;\n\n// ---------------------------------------------------------------------------\n// OTelExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Export agent events as OpenTelemetry spans.\n *\n * Maps the agent event hierarchy to OTel spans:\n * agent.run (root) -> iteration -> llm_call / tool_call\n *\n * Follows Gen AI semantic conventions:\n * - gen_ai.system = \"vercel-ai-sdk\"\n * - gen_ai.request.model = model name\n * - gen_ai.usage.input_tokens / output_tokens\n */\nexport class OTelExporter extends BaseExporter {\n override profile = EventProfile.OBSERVABILITY;\n\n private tracer: OTelTracer;\n /** Whether to capture prompt/completion content in spans. */\n readonly captureContent: boolean;\n private _spans = new Map<string, OTelSpan>();\n\n constructor(options: {\n tracer: OTelTracer;\n captureContent?: boolean;\n }) {\n super();\n this.tracer = options.tracer;\n this.captureContent = options.captureContent ?? false;\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n const span = this.tracer.startSpan(\"agent.run\");\n span.setAttribute(\"agent.run_id\", event.runId);\n if (event.traceId) {\n span.setAttribute(\"agent.trace_id\", event.traceId);\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n const span = this.tracer.startSpan(`agent.iteration.${event.iteration}`);\n span.setAttribute(\"agent.iteration\", event.iteration);\n span.setAttribute(\"agent.max_iterations\", event.maxIterations);\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"agent.tool_calls_count\", event.toolCallsCount);\n span.setAttribute(\"agent.has_more\", event.hasMore);\n span.end();\n }\n }\n\n /** @internal */\n async _onLlmStart(event: LLMCallStartEvent): Promise<void> {\n const span = this.tracer.startSpan(\"gen_ai.chat\");\n span.setAttribute(\"gen_ai.system\", \"vercel-ai-sdk\");\n span.setAttribute(\"gen_ai.request.model\", event.model);\n span.setAttribute(\"gen_ai.request.message_count\", event.messageCount);\n if (this.captureContent) {\n span.setAttribute(\"gen_ai.request.has_tools\", event.hasTools);\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"gen_ai.usage.input_tokens\", event.inputTokens);\n span.setAttribute(\"gen_ai.usage.output_tokens\", event.outputTokens);\n span.setAttribute(\"gen_ai.response.finish_reason\", event.finishReason);\n span.setAttribute(\"gen_ai.response.duration_ms\", event.durationMs);\n span.end();\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n const span = this.tracer.startSpan(`tool.${event.toolName}`);\n span.setAttribute(\"tool.name\", event.toolName);\n span.setAttribute(\"tool.call_id\", event.toolCallId);\n if (event.arguments) {\n span.setAttribute(\"tool.arguments\", JSON.stringify(event.arguments));\n }\n this._spans.set(event.spanId, span);\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"tool.duration_ms\", event.durationMs);\n if (event.error) {\n span.setStatus({ code: OTelStatusCode.ERROR, message: event.error });\n } else {\n span.setStatus({ code: OTelStatusCode.OK });\n }\n span.end();\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n const parentSpanId = event.parentSpanId;\n if (parentSpanId) {\n const span = this._spans.get(parentSpanId);\n if (span) {\n span.setStatus({\n code: OTelStatusCode.ERROR,\n message: event.message,\n });\n span.recordException(new Error(event.message));\n span.setAttribute(\"error.type\", event.errorType);\n }\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n const span = this._spans.get(event.spanId);\n this._spans.delete(event.spanId);\n if (span) {\n span.setAttribute(\"agent.model\", event.model);\n span.setAttribute(\"agent.input_tokens\", event.inputTokens);\n span.setAttribute(\"agent.output_tokens\", event.outputTokens);\n span.end();\n }\n }\n}\n","/**\n * SSE Exporter — Fan-out broadcast to connected admin dashboard clients.\n *\n * Extends BaseExporter with UX profile. Formats events using SSEFormatter\n * and broadcasts to all connected ReadableStream clients.\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type { BaseEvent } from \"../events/types.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport { SSEFormatter } from \"../transport/sse-formatter.js\";\nimport { BaseExporter } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SSEExporter\n// ---------------------------------------------------------------------------\n\n/**\n * Broadcasts agent events as SSE frames to connected clients.\n *\n * Usage:\n * const exporter = new SSEExporter();\n * exporter.attach(eventBus);\n * const stream = exporter.connect(); // return to HTTP response\n * // Later:\n * exporter.disconnect(stream);\n */\nexport class SSEExporter extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _clients = new Map<\n ReadableStream<Uint8Array>,\n ReadableStreamDefaultController<Uint8Array>\n >();\n private _formatter = new SSEFormatter();\n private _encoder = new TextEncoder();\n\n /** Connect a new client. Returns a ReadableStream to pipe to the HTTP response. */\n connect(): ReadableStream<Uint8Array> {\n let savedController: ReadableStreamDefaultController<Uint8Array>;\n const stream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n savedController = controller;\n },\n });\n this._clients.set(stream, savedController!);\n return stream;\n }\n\n /** Disconnect a client stream. */\n disconnect(stream: ReadableStream<Uint8Array>): void {\n const controller = this._clients.get(stream);\n if (controller) {\n try {\n controller.close();\n } catch {\n // Already closed\n }\n this._clients.delete(stream);\n }\n }\n\n /** Number of connected clients. */\n get clientCount(): number {\n return this._clients.size;\n }\n\n /** Handle any event by broadcasting to all connected clients. */\n override async handleEvent(event: BaseEvent): Promise<void> {\n const frame = this._formatter.format(event as AgentEvent);\n if (!frame) return;\n\n const encoded = this._encoder.encode(frame);\n for (const [stream, controller] of this._clients) {\n try {\n controller.enqueue(encoded);\n } catch {\n // Client disconnected, clean up\n this._clients.delete(stream);\n }\n }\n }\n}\n","/**\n * Coordinator role preset - orchestrates specialist agents within an agency.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport { type Capability, Persona, type Role, RoleBuilder } from \"@agentic-patterns/core\";\nimport { QUALITY_REVIEW, ROUTING } from \"./judgments.js\";\nimport { ORCHESTRATION, QUALITY_GATE } from \"./responsibilities.js\";\n\n/**\n * Role that orchestrates specialist agents within an agency.\n *\n * A coordinator routes work to specialists, manages execution\n * sequence, and reviews output quality. It never performs\n * specialist work directly.\n */\nexport function coordinatorRole(options?: {\n capability?: Capability;\n}): Role {\n const builder = new RoleBuilder(\"Coordinator\")\n .withPersona(\n new Persona({\n identity:\n \"an orchestration specialist who routes work to the right specialist and reviews output quality\",\n tone: \"Direct and structured. State the action, delegate, evaluate the result.\",\n priorities: [\n \"Route each request to the correct specialist based on the task type\",\n \"Never perform specialist work directly — always delegate via tools\",\n \"Review specialist output for quality before returning\",\n \"Handle failures gracefully — retry or report clearly\",\n ],\n principles: [\n \"The coordinator orchestrates but does not do the domain work\",\n \"Quality review catches structural issues, not domain errors\",\n \"When in doubt about routing, gather more information first\",\n ],\n }),\n )\n .withJudgment(ROUTING)\n .withJudgment(QUALITY_REVIEW)\n .withResponsibility(ORCHESTRATION)\n .withResponsibility(QUALITY_GATE)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Judgments for orchestration archetypes.\n *\n * Ported from Python: library/orchestration/judgments.py\n */\n\nimport { Judgment } from \"@agentic-patterns/core\";\n\nexport const ROUTING = new Judgment({\n domain: \"work_routing\",\n heuristics: [\n \"Match the request type to the specialist with the closest capability\",\n \"When a request spans multiple specialists, sequence them logically\",\n \"Prefer the most specific specialist over a general-purpose one\",\n \"If the request is ambiguous, gather more information before routing\",\n ],\n constraints: [\n \"Never perform specialist work directly — always delegate\",\n \"Do not skip prerequisite steps (e.g., classification before description)\",\n \"Route to at most one specialist per step — do not fan out unless explicitly needed\",\n ],\n escalation_triggers: [\n \"All available specialists reject the request\",\n \"The request requires capabilities no specialist has\",\n ],\n examples: [\n {\n scenario: \"User asks 'describe the Champion field and then update it'\",\n good: \"Route to classify first, then describe, then check eligibility, then update — sequential, each step uses the previous result\",\n bad: \"Call describe and update simultaneously — update needs the description as context\",\n reasoning: \"Multi-step requests must be sequenced when later steps depend on earlier results\",\n },\n ],\n});\n\nexport const QUALITY_REVIEW = new Judgment({\n domain: \"output_quality\",\n heuristics: [\n \"Check that structured output has all required fields populated\",\n \"Verify that claims or proposals cite specific evidence\",\n \"Accept abstention as a valid and often preferred outcome\",\n \"Flag when output is technically valid but suspiciously brief or generic\",\n ],\n constraints: [\n \"Do not retry more than once for quality issues — report clearly instead\",\n \"Quality review checks structure, not domain correctness\",\n \"Never silently accept output that fails structural checks\",\n ],\n escalation_triggers: [\n \"Specialist output is unparseable after retry\",\n \"Output consistently fails quality checks\",\n ],\n examples: [\n {\n scenario: \"Proposal has a value but no evidence citations\",\n good: \"Reject — every proposed value must cite specific evidence. Ask specialist to retry.\",\n bad: \"Accept because the value looks reasonable\",\n reasoning:\n \"Structural quality gates enforce evidence requirements regardless of how plausible the value seems\",\n },\n ],\n});\n\nexport const INTENT_CLASSIFICATION = new Judgment({\n domain: \"user_intent\",\n heuristics: [\n \"Look for action verbs: 'describe', 'update', 'analyze', 'explain'\",\n \"Match domain nouns to registered extensions: 'field', 'deal', 'email'\",\n \"Consider conversation history — a follow-up may not repeat the domain\",\n \"When intent is ambiguous, ask a clarifying question rather than guessing\",\n ],\n constraints: [\n \"Never fabricate a response without routing to a specialist\",\n \"If no extension matches, say so — do not attempt to handle it directly\",\n \"Respect the user's explicit extension targeting if provided\",\n ],\n escalation_triggers: [\n \"User expresses frustration with routing\",\n \"The same request has been misrouted twice\",\n ],\n examples: [\n {\n scenario: \"User says 'describe the Champion field'\",\n good: \"Route to field_pipeline — 'describe' + 'field' maps clearly to field processing\",\n bad: \"Ask 'did you mean Salesforce?' — the intent is already clear\",\n reasoning: \"When action verb + domain noun match an extension, route immediately\",\n },\n ],\n});\n\nexport const RETRIEVAL_STRATEGY = new Judgment({\n domain: \"information_retrieval\",\n heuristics: [\n \"Decompose broad requests into specific, targeted search queries\",\n \"Start narrow (specific names, dates, amounts), broaden if results are sparse\",\n \"Cross-reference results from multiple queries to find corroborating evidence\",\n \"Prefer recent evidence over older evidence when both exist\",\n \"Stop searching when you have sufficient evidence for each requested dimension\",\n \"If a dimension has zero results after 2-3 queries, flag it as a gap rather than keep searching\",\n ],\n constraints: [\n \"Never fabricate facts — only return what the search tools actually found\",\n \"Always include the fact ID so the requesting agent can cite it\",\n \"Organize results by the dimensions the requester asked for, not by search query\",\n \"Return a coverage assessment — what was found vs what was requested\",\n ],\n escalation_triggers: [\n \"Critical dimension has zero evidence after multiple query strategies\",\n \"Search tools return errors or timeouts repeatedly\",\n ],\n examples: [\n {\n scenario: \"Request for 'evidence for MEDDPICC champion'\",\n good: \"Search 'champion', 'internal advocate', 'sponsor' -> organize by champion actions found\",\n bad: \"Search only 'champion' and return nothing when the term isn't used verbatim\",\n reasoning:\n \"Broad concepts need multiple query synonyms — a champion may be called an advocate or sponsor in the source material\",\n },\n {\n scenario: \"Request for 'competitive threats'\",\n good: \"Search 'competitor', known company names, 'alternative' -> flag if no competition evidence found\",\n bad: \"Keep searching with increasingly vague terms after 3 queries return nothing\",\n reasoning:\n \"After 2-3 targeted queries with no results, flag the gap — over-searching wastes tokens and returns noise\",\n },\n ],\n});\n\nexport const EVIDENCE_QUALITY = new Judgment({\n domain: \"evidence_quality\",\n heuristics: [\n \"Specificity beats vagueness — named entities, dates, and numbers are stronger evidence\",\n \"Recency matters — recent evidence outweighs older evidence unless the older is more authoritative\",\n \"Source authority matters — a CEO statement carries more weight than hearsay\",\n \"Corroboration strengthens — the same signal from multiple sources increases confidence\",\n \"Absence of evidence is not evidence of absence — flag gaps, don't fill them with assumptions\",\n ],\n constraints: [\n \"Never infer what is not explicitly stated in the evidence\",\n \"Score 0 for dimensions with no evidence, not 'unknown'\",\n \"Distinguish between 'not mentioned' (gap) and 'mentioned negatively' (risk)\",\n ],\n escalation_triggers: [\n \"Critical dimension has zero evidence\",\n \"Evidence is contradictory across sources\",\n ],\n examples: [\n {\n scenario: \"Two sources: email says '$2M cost' and transcript says 'significant cost'\",\n good: \"Use $2M — it's specific and quantified. Note the transcript corroborates qualitatively.\",\n bad: \"Average them or pick the less specific one\",\n reasoning: \"Specific quantified evidence always wins over vague qualitative statements\",\n },\n ],\n});\n","/**\n * Responsibilities for orchestration archetypes.\n *\n * Ported from Python: library/orchestration/responsibilities.py\n */\n\nimport { Responsibility } from \"@agentic-patterns/core\";\n\nexport const ORCHESTRATION = new Responsibility({\n key: \"orchestration\",\n name: \"Work Orchestration\",\n description:\n \"Route work to the correct specialist, manage execution sequence, and handle failures\",\n examples: [\n \"Determine which specialist should handle a request\",\n \"Sequence dependent tasks (classify before describe)\",\n \"Retry a specialist call if the first attempt fails\",\n ],\n});\n\nexport const QUALITY_GATE = new Responsibility({\n key: \"quality_gate\",\n name: \"Output Quality Review\",\n description: \"Review specialist output for structural quality before returning to the caller\",\n examples: [\n \"Check that a proposal includes required evidence citations\",\n \"Verify that all expected fields are populated\",\n \"Flag when a specialist abstains and explain why\",\n ],\n});\n\nexport const INTENT_ROUTING = new Responsibility({\n key: \"intent_routing\",\n name: \"Intent Classification & Routing\",\n description:\n \"Understand the user's request, classify their intent, and route to the right agency or agent\",\n examples: [\n \"Route 'describe the Champion field' to the field pipeline agency\",\n \"Route 'how is the deal going?' to the deal analysis agency\",\n \"Ask for clarification when the intent is ambiguous\",\n ],\n});\n\nexport const RESPONSE_SYNTHESIS = new Responsibility({\n key: \"response_synthesis\",\n name: \"Response Synthesis\",\n description: \"Combine specialist responses into coherent, user-facing answers\",\n examples: [\n \"Summarize a technical analysis for a non-technical user\",\n \"Explain why a recommendation was made, citing the evidence\",\n \"Present options when multiple agencies could handle the request\",\n ],\n});\n\nexport const INFORMATION_RETRIEVAL = new Responsibility({\n key: \"information_retrieval\",\n name: \"Information Retrieval\",\n description:\n \"Decompose information requests into targeted searches, execute them, filter for relevance, and organize results by the requester's stated dimensions\",\n examples: [\n \"Break 'find MEDDPICC evidence' into queries for each dimension\",\n \"Search for champion evidence using synonyms: champion, advocate, sponsor\",\n \"Return a coverage map showing which dimensions have evidence and which are gaps\",\n ],\n});\n\nexport const ANALYSIS = new Responsibility({\n key: \"analysis\",\n name: \"Evidence-Based Analysis\",\n description: \"Apply specialized judgment to produce a typed, evidence-backed assessment\",\n examples: [\n \"Score qualification fields based on evidence strength\",\n \"Assess risk flags with severity and supporting evidence\",\n \"Track momentum patterns across time-series data\",\n ],\n});\n","/**\n * Orchestrator role preset - conversational routing agent.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport { type Capability, Persona, type Role, RoleBuilder } from \"@agentic-patterns/core\";\nimport { INTENT_CLASSIFICATION } from \"./judgments.js\";\nimport { INTENT_ROUTING, RESPONSE_SYNTHESIS } from \"./responsibilities.js\";\n\n/**\n * Role that understands user intent and routes to agencies/agents.\n *\n * An orchestrator is the chat-facing agent that interprets what\n * users want, routes to the right specialist team, and synthesizes\n * responses. It maintains conversational context across turns.\n */\nexport function orchestratorRole(options?: {\n capability?: Capability;\n}): Role {\n const builder = new RoleBuilder(\"Orchestrator\")\n .withPersona(\n new Persona({\n identity:\n \"a conversational agent who understands what users need and connects them to the right specialist team\",\n tone: \"Warm but efficient. Acknowledge the request, route it, synthesize the response.\",\n priorities: [\n \"Understand the user's intent before routing\",\n \"Route to the most relevant extension or agency\",\n \"Synthesize specialist responses into coherent user-facing answers\",\n \"Maintain conversational context across turns\",\n ],\n principles: [\n \"Ask for clarification rather than guessing incorrectly\",\n \"The orchestrator facilitates but does not do the specialist work\",\n \"When multiple agencies could handle a request, explain the options\",\n ],\n }),\n )\n .withJudgment(INTENT_CLASSIFICATION)\n .withResponsibility(INTENT_ROUTING)\n .withResponsibility(RESPONSE_SYNTHESIS)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Analyst role preset - specialized judgment for evidence-based assessments.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport {\n type Capability,\n type Judgment,\n Persona,\n type Role,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\nimport { EVIDENCE_QUALITY } from \"./judgments.js\";\nimport { ANALYSIS } from \"./responsibilities.js\";\n\n/**\n * Role that applies specialized judgment to produce typed assessments.\n *\n * An analyst receives pre-gathered context and applies domain-specific\n * judgment heuristics to produce a structured, evidence-backed\n * assessment. Analysts do not gather data -- they reason over it.\n */\nexport function analystRole(options?: {\n domain?: string;\n capability?: Capability;\n extraJudgments?: Judgment[];\n}): Role {\n const domain = options?.domain ?? \"general\";\n\n const builder = new RoleBuilder(\"Analyst\")\n .withPersona(\n new Persona({\n identity: `a specialist analyst focused on ${domain}`,\n tone: \"Analytical and precise. Score with evidence, cite specifics, flag gaps explicitly.\",\n priorities: [\n \"Base every assessment on evidence found in the provided context\",\n \"Score dimensions quantitatively where possible (0-100)\",\n \"Explicitly flag gaps — dimensions with no evidence\",\n \"Distinguish between strong evidence and weak signals\",\n ],\n principles: [\n \"Never infer what is not explicitly stated in the evidence\",\n \"Absence of evidence is a gap to flag, not a value to guess\",\n \"Specificity and recency strengthen evidence quality\",\n ],\n }),\n )\n .withJudgment(EVIDENCE_QUALITY)\n .withResponsibility(ANALYSIS)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.extraJudgments) {\n for (const j of options.extraJudgments) {\n builder.withJudgment(j);\n }\n }\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Retrieval role preset - knowledge researcher.\n *\n * Ported from Python: library/orchestration/archetypes.py\n */\n\nimport {\n type Capability,\n type Judgment,\n Persona,\n type Role,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\nimport { EVIDENCE_QUALITY, RETRIEVAL_STRATEGY } from \"./judgments.js\";\nimport { INFORMATION_RETRIEVAL } from \"./responsibilities.js\";\n\n/**\n * Role that finds and organizes relevant evidence from data sources.\n *\n * A retrieval agent decomposes information requests into targeted\n * search queries, executes them systematically, and organizes results\n * by the requester's stated dimensions.\n */\nexport function retrievalRole(options?: {\n capability?: Capability;\n extraJudgments?: Judgment[];\n}): Role {\n const builder = new RoleBuilder(\"Retrieval\")\n .withPersona(\n new Persona({\n identity:\n \"an intelligence analyst who finds and organizes relevant evidence from available data sources\",\n tone: \"Precise and organized. Report what was found, flag what wasn't, never fabricate.\",\n priorities: [\n \"Decompose requests into effective, targeted search queries\",\n \"Search systematically — start narrow, broaden only if needed\",\n \"Organize results by the requester's stated dimensions, not by query\",\n \"Flag gaps explicitly — missing evidence is valuable information\",\n ],\n principles: [\n \"Only return evidence actually found by search tools\",\n \"Stop searching when sufficient evidence is gathered for each dimension\",\n \"Gaps are valuable information — report them, don't fill them with guesses\",\n ],\n }),\n )\n .withJudgment(RETRIEVAL_STRATEGY)\n .withJudgment(EVIDENCE_QUALITY)\n .withResponsibility(INFORMATION_RETRIEVAL)\n .withDefaultModel(\"claude-sonnet-4-5-20250929\");\n\n if (options?.extraJudgments) {\n for (const j of options.extraJudgments) {\n builder.withJudgment(j);\n }\n }\n\n if (options?.capability) {\n builder.withCapability(options.capability);\n }\n\n return builder.build();\n}\n","/**\n * Calculator agent preset — a fully-built agent that performs arithmetic\n * and algebraic calculations using dedicated tools.\n */\n\nimport {\n AgentBuilder,\n Capability,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n type ToolDefinition,\n Toolbox,\n} from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Toolbox\n// ---------------------------------------------------------------------------\n\nexport class CalculatorToolbox extends Toolbox {\n readonly name = \"calculator_operations\";\n readonly description = \"Arithmetic and algebraic calculator operations\";\n\n readonly tools: Record<string, ToolDefinition> = {\n add: {\n description: \"Add two numbers together\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a + b };\n },\n },\n subtract: {\n description: \"Subtract the second number from the first\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a - b };\n },\n },\n multiply: {\n description: \"Multiply two numbers together\",\n parameters: z.object({\n a: z.number().describe(\"First number\"),\n b: z.number().describe(\"Second number\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a * b };\n },\n },\n divide: {\n description: \"Divide the first number by the second\",\n parameters: z.object({\n a: z.number().describe(\"Dividend\"),\n b: z.number().describe(\"Divisor\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n if (b === 0) {\n throw new Error(\"Division by zero is undefined\");\n }\n return { result: a / b };\n },\n },\n power: {\n description: \"Raise a base to an exponent\",\n parameters: z.object({\n base: z.number().describe(\"Base number\"),\n exponent: z.number().describe(\"Exponent\"),\n }),\n execute: async (args) => {\n const { base, exponent } = args as { base: number; exponent: number };\n return { result: base ** exponent };\n },\n },\n sqrt: {\n description: \"Compute the square root of a number\",\n parameters: z.object({\n n: z.number().describe(\"Number to take the square root of\"),\n }),\n execute: async (args) => {\n const { n } = args as { n: number };\n if (n < 0) {\n throw new Error(\"Square root of a negative number is undefined\");\n }\n return { result: Math.sqrt(n) };\n },\n },\n percentage: {\n description: \"Calculate what percent% of value is\",\n parameters: z.object({\n value: z.number().describe(\"The base value\"),\n percent: z.number().describe(\"The percentage to compute\"),\n }),\n execute: async (args) => {\n const { value, percent } = args as { value: number; percent: number };\n return { result: (value * percent) / 100 };\n },\n },\n modulo: {\n description: \"Compute the remainder of dividing a by b\",\n parameters: z.object({\n a: z.number().describe(\"Dividend\"),\n b: z.number().describe(\"Divisor\"),\n }),\n execute: async (args) => {\n const { a, b } = args as { a: number; b: number };\n return { result: a % b };\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Agent builder\n// ---------------------------------------------------------------------------\n\nexport function buildCalculatorAgent() {\n const toolbox = new CalculatorToolbox();\n\n const role = new RoleBuilder(\"calculator-assistant\")\n .withPersona(\n new Persona({\n identity: \"A precise calculator that shows its work step by step\",\n tone: \"concise and mathematical\",\n priorities: [\"accuracy\", \"showing work\"],\n principles: [\"Always use the provided calculator tools — never do mental math\"],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"arithmetic and algebra\",\n heuristics: [\n \"Use the provided tools for every calculation\",\n \"Break compound expressions into sequential tool calls\",\n ],\n constraints: [\"Only answer math and numerical reasoning questions\"],\n }),\n )\n .withCapability(\n new Capability(\"calculator_operations\", \"Arithmetic and algebraic calculations\", toolbox),\n )\n .withResponsibility(\n new Responsibility({\n key: \"calculate\",\n name: \"Perform Calculations\",\n description: \"Perform calculations accurately using tools\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective: \"Help users with math calculations, compound operations, and numerical reasoning\",\n success_criteria: [\n \"Correct answers verified by tool use\",\n \"Work shown step by step\",\n \"Tools used for every calculation\",\n ],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Todo Manager agent preset.\n *\n * Provides an in-memory task list managed through five tools:\n * create_task, list_tasks, complete_task, delete_task, update_task.\n */\n\nimport {\n AgentBuilder,\n Capability,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n type ToolDefinition,\n Toolbox,\n} from \"@agentic-patterns/core\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// In-memory task store\n// ---------------------------------------------------------------------------\n\ninterface Task {\n id: string;\n title: string;\n description?: string;\n status: \"pending\" | \"done\";\n}\n\nconst tasks = new Map<string, Task>();\nlet nextId = 1;\n\n// ---------------------------------------------------------------------------\n// TodoToolbox\n// ---------------------------------------------------------------------------\n\nexport class TodoToolbox extends Toolbox {\n readonly name = \"task_management\";\n readonly description = \"In-memory task list management\";\n\n readonly tools: Record<string, ToolDefinition> = {\n create_task: {\n description: \"Create a new task\",\n parameters: z.object({\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Optional task description\"),\n }),\n execute: async (args) => {\n const { title, description } = args as { title: string; description?: string };\n const id = `task-${nextId++}`;\n const task: Task = { id, title, description, status: \"pending\" };\n tasks.set(id, task);\n return { id: task.id, title: task.title, status: task.status };\n },\n },\n\n list_tasks: {\n description: \"List tasks, optionally filtered by status\",\n parameters: z.object({\n status: z\n .enum([\"pending\", \"done\"])\n .optional()\n .describe(\"Filter by status (pending or done)\"),\n }),\n execute: async (args) => {\n const { status } = args as { status?: \"pending\" | \"done\" };\n const all = Array.from(tasks.values());\n const filtered = status ? all.filter((t) => t.status === status) : all;\n return { tasks: filtered };\n },\n },\n\n complete_task: {\n description: \"Mark a task as done\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to complete\"),\n }),\n execute: async (args) => {\n const { id } = args as { id: string };\n const task = tasks.get(id);\n if (!task) {\n throw new Error(`Task not found: ${id}`);\n }\n task.status = \"done\";\n return { ...task };\n },\n },\n\n delete_task: {\n description: \"Delete a task\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to delete\"),\n }),\n execute: async (args) => {\n const { id } = args as { id: string };\n if (!tasks.has(id)) {\n throw new Error(`Task not found: ${id}`);\n }\n tasks.delete(id);\n return { deleted: true };\n },\n },\n\n update_task: {\n description: \"Update a task's title or description\",\n parameters: z.object({\n id: z.string().describe(\"Task ID to update\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n }),\n execute: async (args) => {\n const { id, title, description } = args as {\n id: string;\n title?: string;\n description?: string;\n };\n const task = tasks.get(id);\n if (!task) {\n throw new Error(`Task not found: ${id}`);\n }\n if (title !== undefined) {\n task.title = title;\n }\n if (description !== undefined) {\n task.description = description;\n }\n return { ...task };\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// buildTodoAgent\n// ---------------------------------------------------------------------------\n\nexport function buildTodoAgent() {\n const role = new RoleBuilder(\"todo-manager\")\n .withPersona(\n new Persona({\n identity: \"An organized task manager that keeps things structured\",\n tone: \"helpful and structured\",\n priorities: [\"organization\", \"clarity\", \"completeness\"],\n principles: [\n \"Always confirm what was done after each action\",\n \"List remaining tasks proactively when asked about status\",\n ],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"task and project management\",\n heuristics: [\"Use the provided tools for all task operations\"],\n constraints: [\"Only manage tasks using the available tools\"],\n }),\n )\n .withCapability(new Capability(\"task_management\", \"Task Management\", new TodoToolbox()))\n .withResponsibility(\n new Responsibility({\n key: \"manage-tasks\",\n name: \"Manage Tasks\",\n description: \"Manage tasks — create, update, complete, and organize\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective: \"Help users manage their task lists efficiently using the provided tools\",\n success_criteria: [\n \"Tasks created and tracked accurately\",\n \"Tools used appropriately for all operations\",\n ],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Writing Coach — a tools-free agent preset that demonstrates\n * pure persona + reasoning without any toolbox or capability.\n */\n\nimport {\n AgentBuilder,\n Judgment,\n Mission,\n Persona,\n Responsibility,\n RoleBuilder,\n} from \"@agentic-patterns/core\";\n\nexport function buildWritingCoachAgent() {\n const role = new RoleBuilder(\"writing-coach\")\n .withPersona(\n new Persona({\n identity:\n \"An experienced writing coach who helps improve clarity, structure, and style. You give specific, actionable feedback — not vague praise.\",\n tone: \"encouraging but direct — like a good editor\",\n priorities: [\"clarity\", \"conciseness\", \"structure\", \"voice\"],\n principles: [\n \"Always explain WHY a change improves the writing, not just what to change\",\n \"Give concrete before/after examples when suggesting edits\",\n \"Preserve the author's voice — improve, don't rewrite\",\n \"Focus on the most impactful issues first, don't nitpick everything at once\",\n ],\n }),\n )\n .withJudgment(\n new Judgment({\n domain: \"writing, editing, and communication\",\n heuristics: [\"Start with structure, then clarity, then style\"],\n constraints: [\n \"Never rewrite entire paragraphs without permission — suggest changes inline\",\n ],\n }),\n )\n .withResponsibility(\n new Responsibility({\n key: \"review\",\n name: \"Review and Improve Writing\",\n description: \"Review and improve written content\",\n }),\n )\n .withDefaultModel(\"sonnet\")\n .build();\n\n const mission = new Mission({\n objective:\n \"Help users write more clearly and effectively by providing specific, actionable feedback on their text\",\n success_criteria: [\"Improved clarity\", \"Preserved author voice\", \"Actionable suggestions\"],\n });\n\n return new AgentBuilder(role).withMission(mission).build();\n}\n","/**\n * Workflow base types — shared types, events, hooks, and helpers\n * that all workflow patterns depend on.\n *\n * Ported from Python: workflows/base.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunResult, RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\n\n// Re-export AgentLike so workflow consumers don't need to import from runner\nexport type { AgentLike } from \"../runner/agent-runner.js\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\n/** Shared context passed through workflow steps. */\nexport type PatternContext = Record<string, unknown>;\n\n/** A message template: either a static string or a function that builds one. */\nexport type MessageTemplate = string | ((context: PatternContext) => string);\n\n// ---------------------------------------------------------------------------\n// Step\n// ---------------------------------------------------------------------------\n\n/** A single step in a workflow pattern. */\nexport interface Step {\n readonly agent: AgentLike;\n readonly messageTemplate: MessageTemplate;\n readonly name?: string;\n readonly outputKey?: string;\n readonly contextExtractor?: (result: StepResult, context: PatternContext) => PatternContext;\n}\n\n// ---------------------------------------------------------------------------\n// StepResult\n// ---------------------------------------------------------------------------\n\n/** Result of executing a single step. */\nexport interface StepResult {\n readonly stepName: string;\n readonly runResult: RunResult;\n /** Shortcut for `runResult.response`. */\n readonly content: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n}\n\n/**\n * Create a frozen StepResult from a RunResult.\n */\nexport function createStepResult(stepName: string, runResult: RunResult): StepResult {\n return Object.freeze({\n stepName,\n runResult,\n content: runResult.response,\n inputTokens: runResult.inputTokens,\n outputTokens: runResult.outputTokens,\n });\n}\n\n// ---------------------------------------------------------------------------\n// PatternResult\n// ---------------------------------------------------------------------------\n\n/** Aggregate result of a workflow pattern execution. */\nexport interface PatternResult {\n readonly totalInputTokens: number;\n readonly totalOutputTokens: number;\n readonly succeeded: boolean;\n readonly finalContent: string;\n}\n\n// ---------------------------------------------------------------------------\n// PatternEvent — discriminated union of 7 event types\n// ---------------------------------------------------------------------------\n\nexport interface PatternStartEvent {\n readonly type: \"pattern.start\";\n readonly patternName: string;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepStartEvent {\n readonly type: \"pattern.step.start\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepCompleteEvent {\n readonly type: \"pattern.step.complete\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly result: StepResult;\n readonly timestamp: Date;\n}\n\nexport interface PatternStepErrorEvent {\n readonly type: \"pattern.step.error\";\n readonly stepName: string;\n readonly stepIndex: number;\n readonly error: Error;\n readonly timestamp: Date;\n}\n\nexport interface PatternIterationStartEvent {\n readonly type: \"pattern.iteration.start\";\n readonly iteration: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternIterationCompleteEvent {\n readonly type: \"pattern.iteration.complete\";\n readonly iteration: number;\n readonly timestamp: Date;\n}\n\nexport interface PatternCompleteEvent {\n readonly type: \"pattern.complete\";\n readonly patternName: string;\n readonly result: PatternResult;\n readonly timestamp: Date;\n}\n\nexport type PatternEvent =\n | PatternStartEvent\n | PatternStepStartEvent\n | PatternStepCompleteEvent\n | PatternStepErrorEvent\n | PatternIterationStartEvent\n | PatternIterationCompleteEvent\n | PatternCompleteEvent;\n\n// ---------------------------------------------------------------------------\n// PatternHooks\n// ---------------------------------------------------------------------------\n\n/**\n * Callbacks for pattern lifecycle events.\n *\n * NOTE: These are workflow-level hooks for pattern orchestration.\n * They are NOT the same as the deprecated runner-level Hooks interface.\n */\nexport interface PatternHooks {\n onPatternStart?: (event: PatternStartEvent) => void | Promise<void>;\n onStepStart?: (event: PatternStepStartEvent) => void | Promise<void>;\n onStepComplete?: (event: PatternStepCompleteEvent) => void | Promise<void>;\n onStepError?: (event: PatternStepErrorEvent) => void | Promise<void>;\n onIterationStart?: (event: PatternIterationStartEvent) => void | Promise<void>;\n onIterationComplete?: (event: PatternIterationCompleteEvent) => void | Promise<void>;\n onPatternComplete?: (event: PatternCompleteEvent) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// PatternRunOptions\n// ---------------------------------------------------------------------------\n\n/** Options passed to pattern.run(). */\nexport interface PatternRunOptions {\n readonly runner: RunnerProtocol;\n readonly hooks?: PatternHooks;\n readonly toolExecutor?: ToolExecutor;\n readonly traceId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PatternProtocol\n// ---------------------------------------------------------------------------\n\n/** Interface that all workflow patterns implement. */\nexport interface PatternProtocol {\n run(context?: PatternContext, options?: PatternRunOptions): Promise<PatternResult>;\n}\n\n// ---------------------------------------------------------------------------\n// GoalEvaluatorProtocol\n// ---------------------------------------------------------------------------\n\n/** Result tuple: [achieved, reason, confident]. */\nexport type GoalEvaluationResult = readonly [achieved: boolean, reason: string, confident: boolean];\n\n/** Protocol for evaluating whether a goal has been achieved. */\nexport interface GoalEvaluatorProtocol {\n evaluate(goal: string, output: string, context?: PatternContext): Promise<GoalEvaluationResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a message template to a string.\n */\nexport function resolveMessage(template: MessageTemplate, context: PatternContext): string {\n if (typeof template === \"string\") {\n return template;\n }\n return template(context);\n}\n\n/**\n * Generate a step name, falling back to `step_<index>` if none provided.\n */\nexport function makeStepName(name: string | undefined, index: number): string {\n if (name !== undefined && name !== \"\") {\n return name;\n }\n return `step_${index}`;\n}\n\n/**\n * Execute a single step: resolve message, run agent, return result.\n */\nexport async function executeStep(\n step: Step,\n context: PatternContext,\n runner: RunnerProtocol,\n toolExecutor?: ToolExecutor,\n): Promise<StepResult> {\n const message = resolveMessage(step.messageTemplate, context);\n const runResult = await runner.run(step.agent, message, { toolExecutor });\n const stepName = makeStepName(step.name, 0);\n return createStepResult(stepName, runResult);\n}\n","/**\n * Sequential — Chain agents in sequence, threading context through the pipeline.\n *\n * Ported from Python: workflows/compositions/sequential.py\n */\n\nimport type {\n PatternContext,\n PatternProtocol,\n PatternResult,\n PatternRunOptions,\n Step,\n StepResult,\n} from \"./base.js\";\nimport { createStepResult, makeStepName, resolveMessage } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SequentialResult\n// ---------------------------------------------------------------------------\n\nexport interface SequentialResult extends PatternResult {\n readonly steps: ReadonlyArray<StepResult | PatternResult>;\n readonly finalContext: Readonly<PatternContext>;\n}\n\n// ---------------------------------------------------------------------------\n// SequentialOptions\n// ---------------------------------------------------------------------------\n\nexport interface SequentialOptions {\n readonly continueOnError?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Sequential\n// ---------------------------------------------------------------------------\n\n/**\n * Chain agents in sequence, threading context through the pipeline.\n *\n * Each step reads context, writes via `outputKey` and `contextExtractor`.\n * Supports nested patterns (any PatternProtocol) as steps.\n *\n * Example:\n * const seq = new Sequential([\n * { agent: writer, messageTemplate: \"Write about {topic}\" },\n * { agent: reviewer, messageTemplate: (ctx) => `Review: ${ctx.draft}` },\n * ]);\n */\nexport class Sequential implements PatternProtocol {\n private readonly steps: ReadonlyArray<Step | PatternProtocol>;\n private readonly continueOnError: boolean;\n\n constructor(steps: Array<Step | PatternProtocol>, options?: SequentialOptions) {\n this.steps = steps;\n this.continueOnError = options?.continueOnError ?? false;\n }\n\n async run(context: PatternContext = {}, options?: PatternRunOptions): Promise<SequentialResult> {\n const runner = options?.runner;\n const hooks = options?.hooks;\n const toolExecutor = options?.toolExecutor;\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"Sequential\",\n timestamp: new Date(),\n });\n\n let currentContext = { ...context };\n const stepResults: Array<StepResult | PatternResult> = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let succeeded = true;\n let finalContent = \"\";\n\n for (let i = 0; i < this.steps.length; i++) {\n const step = this.steps[i]!;\n\n await hooks?.onStepStart?.({\n type: \"pattern.step.start\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n timestamp: new Date(),\n });\n\n try {\n let result: StepResult | PatternResult;\n\n if (isStep(step)) {\n if (!runner) {\n throw new Error(\"Runner is required for Step execution\");\n }\n const message = resolveMessage(step.messageTemplate, currentContext);\n const runResult = await runner.run(step.agent, message, {\n toolExecutor,\n });\n const stepName = makeStepName(step.name, i);\n const stepResult = createStepResult(stepName, runResult);\n\n // Update context\n if (step.outputKey) {\n currentContext[step.outputKey] = stepResult.content;\n }\n if (step.contextExtractor) {\n currentContext = {\n ...currentContext,\n ...step.contextExtractor(stepResult, currentContext),\n };\n }\n\n result = stepResult;\n totalInputTokens += stepResult.inputTokens;\n totalOutputTokens += stepResult.outputTokens;\n finalContent = stepResult.content;\n } else {\n // Nested pattern\n const nestedResult = await step.run(currentContext, options);\n result = nestedResult;\n totalInputTokens += nestedResult.totalInputTokens;\n totalOutputTokens += nestedResult.totalOutputTokens;\n finalContent = nestedResult.finalContent;\n if (!nestedResult.succeeded) {\n succeeded = false;\n }\n }\n\n stepResults.push(result);\n\n await hooks?.onStepComplete?.({\n type: \"pattern.step.complete\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n result: isStepResult(result)\n ? result\n : createStepResult(`nested_${i}`, {\n response: result.finalContent,\n inputTokens: result.totalInputTokens,\n outputTokens: result.totalOutputTokens,\n toolCallsCount: 0,\n iterations: 1,\n finishReason: \"stop\",\n }),\n timestamp: new Date(),\n });\n } catch (error) {\n succeeded = false;\n const err = error instanceof Error ? error : new Error(String(error));\n\n await hooks?.onStepError?.({\n type: \"pattern.step.error\",\n stepName: isStep(step) ? makeStepName(step.name, i) : `nested_${i}`,\n stepIndex: i,\n error: err,\n timestamp: new Date(),\n });\n\n if (!this.continueOnError) {\n break;\n }\n }\n }\n\n const result: SequentialResult = Object.freeze({\n steps: Object.freeze(stepResults),\n finalContext: Object.freeze(currentContext),\n totalInputTokens,\n totalOutputTokens,\n succeeded,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"Sequential\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nfunction isStep(step: Step | PatternProtocol): step is Step {\n return \"agent\" in step && \"messageTemplate\" in step;\n}\n\nfunction isStepResult(result: StepResult | PatternResult): result is StepResult {\n return \"stepName\" in result;\n}\n","/**\n * Parallel — Fan-out agents in parallel with optional concurrency limiting.\n *\n * Ported from Python: workflows/compositions/parallel.py\n */\n\nimport type {\n PatternContext,\n PatternProtocol,\n PatternResult,\n PatternRunOptions,\n Step,\n StepResult,\n} from \"./base.js\";\nimport { createStepResult, makeStepName, resolveMessage } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Consolidator\n// ---------------------------------------------------------------------------\n\n/** Consolidator: reduce step results to a single value. */\nexport type Consolidator = (results: StepResult[]) => unknown;\n\n/** Collect all step contents into an array. */\nexport function collectContents(results: StepResult[]): string[] {\n return results.map((r) => r.content);\n}\n\n/** Collect step contents keyed by step name. */\nexport function collectByName(results: StepResult[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const r of results) {\n out[r.stepName] = r.content;\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// ParallelResult\n// ---------------------------------------------------------------------------\n\nexport interface ParallelResult extends PatternResult {\n readonly results: ReadonlyArray<StepResult | Error>;\n readonly successful: ReadonlyArray<StepResult>;\n readonly failed: ReadonlyArray<readonly [number, Error]>;\n readonly consolidatedOutput: Readonly<Record<string, unknown>>;\n readonly allSucceeded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// ParallelOptions\n// ---------------------------------------------------------------------------\n\nexport interface ParallelOptions {\n readonly outputKey?: string;\n readonly consolidator?: Consolidator;\n readonly returnExceptions?: boolean;\n readonly maxConcurrency?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Parallel\n// ---------------------------------------------------------------------------\n\n/**\n * Fan-out agents in parallel with optional concurrency limiting.\n *\n * All steps receive the same context snapshot.\n * Results preserve input order.\n *\n * Example:\n * const par = new Parallel([\n * { agent: analyst1, messageTemplate: \"Analyze data\" },\n * { agent: analyst2, messageTemplate: \"Analyze data\" },\n * ], { maxConcurrency: 2 });\n */\nexport class Parallel implements PatternProtocol {\n private readonly steps: ReadonlyArray<Step>;\n private readonly outputKey: string | undefined;\n private readonly consolidator: Consolidator | undefined;\n private readonly returnExceptions: boolean;\n private readonly maxConcurrency: number | undefined;\n\n constructor(steps: Step[], options?: ParallelOptions) {\n this.steps = steps;\n this.outputKey = options?.outputKey;\n this.consolidator = options?.consolidator;\n this.returnExceptions = options?.returnExceptions ?? true;\n this.maxConcurrency = options?.maxConcurrency;\n }\n\n async run(context: PatternContext = {}, options?: PatternRunOptions): Promise<ParallelResult> {\n const runner = options?.runner;\n const hooks = options?.hooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for Parallel execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"Parallel\",\n timestamp: new Date(),\n });\n\n const contextSnapshot = { ...context };\n const orderedResults: Array<StepResult | Error> = new Array(this.steps.length);\n\n const executeOne = async (index: number): Promise<void> => {\n const step = this.steps[index]!;\n const stepName = makeStepName(step.name, index);\n\n await hooks?.onStepStart?.({\n type: \"pattern.step.start\",\n stepName,\n stepIndex: index,\n timestamp: new Date(),\n });\n\n try {\n const message = resolveMessage(step.messageTemplate, contextSnapshot);\n const runResult = await runner.run(step.agent, message, { toolExecutor });\n const stepResult = createStepResult(stepName, runResult);\n orderedResults[index] = stepResult;\n\n await hooks?.onStepComplete?.({\n type: \"pattern.step.complete\",\n stepName,\n stepIndex: index,\n result: stepResult,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n orderedResults[index] = err;\n\n await hooks?.onStepError?.({\n type: \"pattern.step.error\",\n stepName,\n stepIndex: index,\n error: err,\n timestamp: new Date(),\n });\n\n if (!this.returnExceptions) {\n throw err;\n }\n }\n };\n\n if (this.maxConcurrency && this.maxConcurrency > 0) {\n await runWithConcurrency(\n this.steps.map((_, i) => () => executeOne(i)),\n this.maxConcurrency,\n );\n } else {\n await Promise.all(this.steps.map((_, i) => executeOne(i)));\n }\n\n const successful: StepResult[] = [];\n const failed: Array<readonly [number, Error]> = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (let i = 0; i < orderedResults.length; i++) {\n const r = orderedResults[i]!;\n if (r instanceof Error) {\n failed.push([i, r] as const);\n } else {\n successful.push(r);\n totalInputTokens += r.inputTokens;\n totalOutputTokens += r.outputTokens;\n }\n }\n\n let consolidatedOutput: Record<string, unknown> = {};\n if (this.consolidator && successful.length > 0) {\n const consolidated = this.consolidator(successful);\n if (this.outputKey) {\n consolidatedOutput[this.outputKey] = consolidated;\n } else {\n consolidatedOutput = { consolidated };\n }\n }\n\n const allSucceeded = failed.length === 0;\n const finalContent = successful.length > 0 ? successful[successful.length - 1]!.content : \"\";\n\n const result: ParallelResult = Object.freeze({\n results: Object.freeze(orderedResults),\n successful: Object.freeze(successful),\n failed: Object.freeze(failed),\n consolidatedOutput: Object.freeze(consolidatedOutput),\n allSucceeded,\n totalInputTokens,\n totalOutputTokens,\n succeeded: allSucceeded,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"Parallel\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Concurrency pool\n// ---------------------------------------------------------------------------\n\nasync function runWithConcurrency(\n tasks: Array<() => Promise<void>>,\n maxConcurrency: number,\n): Promise<void> {\n const executing = new Set<Promise<void>>();\n for (const task of tasks) {\n const p = task().then(() => {\n executing.delete(p);\n });\n executing.add(p);\n if (executing.size >= maxConcurrency) {\n await Promise.race(executing);\n }\n }\n await Promise.all(executing);\n}\n","/**\n * RetryLoop — Generic async retry wrapper with pluggable backoff strategies.\n *\n * Not agent-specific — wraps any `() => Promise<T>`.\n *\n * Ported from Python: workflows/loops/retry.py\n */\n\nimport type { PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Backoff strategies\n// ---------------------------------------------------------------------------\n\n/** Backoff strategy: given an attempt number (0-based), return delay in ms. */\nexport interface BackoffStrategy {\n getDelay(attempt: number): number;\n}\n\n/** Fixed delay between retries. */\nexport class FixedBackoff implements BackoffStrategy {\n constructor(private readonly delayMs: number) {}\n getDelay(_attempt: number): number {\n return this.delayMs;\n }\n}\n\n/** Exponential backoff: baseMs * 2^attempt, capped at maxMs. */\nexport class ExponentialBackoff implements BackoffStrategy {\n constructor(\n private readonly baseMs: number = 1000,\n private readonly maxMs: number = 60000,\n ) {}\n getDelay(attempt: number): number {\n return Math.min(this.baseMs * 2 ** attempt, this.maxMs);\n }\n}\n\n/** Jittered exponential backoff: adds random jitter to exponential delay. */\nexport class JitteredBackoff implements BackoffStrategy {\n private readonly exponential: ExponentialBackoff;\n constructor(baseMs = 1000, maxMs = 60000) {\n this.exponential = new ExponentialBackoff(baseMs, maxMs);\n }\n getDelay(attempt: number): number {\n const base = this.exponential.getDelay(attempt);\n return Math.floor(base * (0.5 + Math.random() * 0.5));\n }\n}\n\n// ---------------------------------------------------------------------------\n// RetryResult\n// ---------------------------------------------------------------------------\n\n/** Exit reason for a retry loop. */\nexport type RetryExitReason = \"success\" | \"max_attempts\" | \"fatal_error\" | \"timeout\";\n\n/** Result of a retry loop execution. */\nexport interface RetryResult<T> extends PatternResult {\n readonly exitReason: RetryExitReason;\n readonly attempts: number;\n readonly value?: T;\n readonly lastError?: Error;\n}\n\n// ---------------------------------------------------------------------------\n// RetryLoop options\n// ---------------------------------------------------------------------------\n\nexport interface RetryLoopOptions {\n readonly maxAttempts?: number;\n readonly backoff?: BackoffStrategy;\n readonly timeoutMs?: number;\n readonly fatalErrors?: ReadonlyArray<abstract new (...args: never[]) => Error>;\n readonly onRetry?: (attempt: number, error: Error) => void | Promise<void>;\n readonly hooks?: PatternHooks;\n}\n\nexport interface RetryRunOptions {\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// RetryLoop\n// ---------------------------------------------------------------------------\n\n/**\n * Generic async retry wrapper with pluggable backoff.\n *\n * Example:\n * const loop = new RetryLoop<string>({ maxAttempts: 3 });\n * const result = await loop.run(async () => fetchData());\n */\nexport class RetryLoop<T> {\n private readonly maxAttempts: number;\n private readonly backoff: BackoffStrategy;\n private readonly timeoutMs: number | undefined;\n private readonly fatalErrors: ReadonlyArray<abstract new (...args: never[]) => Error>;\n private readonly onRetry: ((attempt: number, error: Error) => void | Promise<void>) | undefined;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(options: RetryLoopOptions = {}) {\n this.maxAttempts = options.maxAttempts ?? 3;\n this.backoff = options.backoff ?? new ExponentialBackoff();\n this.timeoutMs = options.timeoutMs;\n this.fatalErrors = options.fatalErrors ?? [];\n this.onRetry = options.onRetry;\n this.defaultHooks = options.hooks;\n }\n\n async run(fn: () => Promise<T>, options?: RetryRunOptions): Promise<RetryResult<T>> {\n const hooks = options?.hooks ?? this.defaultHooks;\n const startTime = Date.now();\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"RetryLoop\",\n timestamp: new Date(),\n });\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n // Check timeout before each attempt\n if (this.timeoutMs !== undefined && Date.now() - startTime >= this.timeoutMs) {\n const result = this.buildResult(\"timeout\", attempt, undefined, lastError);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n try {\n const value = await fn();\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n const result = this.buildResult(\"success\", attempt + 1, value, undefined);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n lastError = err;\n\n // Check for fatal errors\n if (this.isFatal(err)) {\n const result = this.buildResult(\"fatal_error\", attempt + 1, undefined, err);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: attempt,\n timestamp: new Date(),\n });\n\n // Don't retry after the last attempt\n if (attempt < this.maxAttempts - 1) {\n await this.onRetry?.(attempt, err);\n const delayMs = this.backoff.getDelay(attempt);\n await sleep(delayMs);\n }\n }\n }\n\n const result = this.buildResult(\"max_attempts\", this.maxAttempts, undefined, lastError);\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"RetryLoop\",\n result,\n timestamp: new Date(),\n });\n return result;\n }\n\n private isFatal(error: Error): boolean {\n return this.fatalErrors.some((cls) => error instanceof cls);\n }\n\n private buildResult(\n exitReason: RetryExitReason,\n attempts: number,\n value: T | undefined,\n lastError: Error | undefined,\n ): RetryResult<T> {\n return Object.freeze({\n exitReason,\n attempts,\n value,\n lastError,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n succeeded: exitReason === \"success\",\n finalContent: \"\",\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Goal Evaluators — Four implementations of GoalEvaluatorProtocol,\n * ranked cheapest to most expensive.\n *\n * Ported from Python: workflows/evaluators.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol } from \"../runner/types.js\";\nimport type { GoalEvaluationResult, GoalEvaluatorProtocol, PatternContext } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// SimpleGoalEvaluator — pattern matching (no LLM call)\n// ---------------------------------------------------------------------------\n\nexport interface SimpleGoalEvaluatorOptions {\n readonly successPatterns?: readonly string[];\n readonly failurePatterns?: readonly string[];\n}\n\n/**\n * Pattern-matching evaluator: checks output for success/failure substrings.\n * Returns not-confident if no patterns match.\n */\nexport class SimpleGoalEvaluator implements GoalEvaluatorProtocol {\n private readonly successPatterns: readonly string[];\n private readonly failurePatterns: readonly string[];\n\n constructor(options: SimpleGoalEvaluatorOptions = {}) {\n this.successPatterns = options.successPatterns ?? [\"GOAL_ACHIEVED\", \"TASK_COMPLETE\", \"SUCCESS\"];\n this.failurePatterns = options.failurePatterns ?? [\"CANNOT_PROCEED\", \"FAILED\", \"ERROR\"];\n }\n\n async evaluate(\n _goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const upper = output.toUpperCase();\n\n for (const pattern of this.successPatterns) {\n if (upper.includes(pattern.toUpperCase())) {\n return [true, `Matched success pattern: ${pattern}`, true] as const;\n }\n }\n\n for (const pattern of this.failurePatterns) {\n if (upper.includes(pattern.toUpperCase())) {\n return [false, `Matched failure pattern: ${pattern}`, true] as const;\n }\n }\n\n return [false, \"No patterns matched\", false] as const;\n }\n}\n\n// ---------------------------------------------------------------------------\n// SelfEvalGoalEvaluator — parses GOAL_STATUS/PROGRESS markers\n// ---------------------------------------------------------------------------\n\n/**\n * Parses agent output for structured markers:\n * GOAL_STATUS: ACHIEVED|NOT_ACHIEVED\n * PROGRESS: <text>\n */\nexport class SelfEvalGoalEvaluator implements GoalEvaluatorProtocol {\n async evaluate(\n _goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const statusMatch = /GOAL_STATUS:\\s*(ACHIEVED|NOT_ACHIEVED)/i.exec(output);\n const progressMatch = /PROGRESS:\\s*(.+)/i.exec(output);\n\n if (statusMatch) {\n const achieved = statusMatch[1]?.toUpperCase() === \"ACHIEVED\";\n const reason =\n progressMatch?.[1]?.trim() ?? (achieved ? \"Goal achieved\" : \"Goal not achieved\");\n return [achieved, reason, true] as const;\n }\n\n if (progressMatch) {\n return [false, progressMatch[1]!.trim(), false] as const;\n }\n\n return [false, \"No GOAL_STATUS or PROGRESS markers found\", false] as const;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMGoalEvaluator — uses an evaluator agent\n// ---------------------------------------------------------------------------\n\nexport interface LLMGoalEvaluatorOptions {\n readonly agent: AgentLike;\n readonly runner: RunnerProtocol;\n}\n\n/**\n * Sends goal + output to an evaluator agent, parses GOAL_STATUS from response.\n */\nexport class LLMGoalEvaluator implements GoalEvaluatorProtocol {\n private readonly agent: AgentLike;\n private readonly runner: RunnerProtocol;\n\n constructor(options: LLMGoalEvaluatorOptions) {\n this.agent = options.agent;\n this.runner = options.runner;\n }\n\n async evaluate(\n goal: string,\n output: string,\n _context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n const prompt = [\n \"Evaluate whether the following output achieves the stated goal.\",\n \"\",\n `GOAL: ${goal}`,\n \"\",\n `OUTPUT: ${output}`,\n \"\",\n \"Respond with exactly one of:\",\n \" GOAL_STATUS: ACHIEVED\",\n \" GOAL_STATUS: NOT_ACHIEVED\",\n \"Followed by:\",\n \" PROGRESS: <brief explanation>\",\n ].join(\"\\n\");\n\n const result = await this.runner.run(this.agent, prompt);\n\n // Parse the response using SelfEvalGoalEvaluator logic\n const selfEval = new SelfEvalGoalEvaluator();\n return selfEval.evaluate(goal, result.response);\n }\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorChain — cascade, stopping on first confident result\n// ---------------------------------------------------------------------------\n\n/**\n * Tries evaluators in order, stops on first confident result.\n * Falls back to last result if none are confident.\n */\nexport class EvaluatorChain implements GoalEvaluatorProtocol {\n private readonly evaluators: readonly GoalEvaluatorProtocol[];\n\n constructor(evaluators: GoalEvaluatorProtocol[]) {\n this.evaluators = evaluators;\n }\n\n async evaluate(\n goal: string,\n output: string,\n context?: PatternContext,\n ): Promise<GoalEvaluationResult> {\n let lastResult: GoalEvaluationResult = [false, \"No evaluators\", false] as const;\n\n for (const evaluator of this.evaluators) {\n const result = await evaluator.evaluate(goal, output, context);\n lastResult = result;\n\n const [, , confident] = result;\n if (confident) {\n return result;\n }\n }\n\n return lastResult;\n }\n}\n","/**\n * TaskLoop — Goal-driven iterative loop.\n *\n * Runs an agent toward a goal, evaluating progress each iteration.\n *\n * Ported from Python: workflows/loops/task.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { GoalEvaluatorProtocol, PatternContext, PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type TaskExitReason = \"goal_achieved\" | \"max_iterations\" | \"explicit_stop\" | \"error\";\n\nexport interface TaskState {\n readonly iteration: number;\n readonly history: readonly string[];\n getHistorySummary(): string;\n}\n\nexport interface TaskResult extends PatternResult {\n readonly exitReason: TaskExitReason;\n readonly iterations: number;\n readonly state: TaskState;\n}\n\n// ---------------------------------------------------------------------------\n// TaskLoopOptions\n// ---------------------------------------------------------------------------\n\nexport interface TaskLoopOptions {\n readonly maxIterations?: number;\n readonly stopPhrases?: readonly string[];\n readonly includeHistory?: boolean;\n readonly hooks?: PatternHooks;\n}\n\nexport interface TaskRunOptions {\n readonly runner: RunnerProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// TaskLoop\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STOP_PHRASES = [\"TASK_COMPLETE\", \"CANNOT_PROCEED\"];\n\n/**\n * Iterative loop that runs an agent toward a goal, evaluating progress.\n *\n * Example:\n * const loop = new TaskLoop(agent, evaluator, { maxIterations: 5 });\n * const result = await loop.run(\"Write a poem about TypeScript\", {}, { runner });\n */\nexport class TaskLoop {\n private readonly agent: AgentLike;\n private readonly goalEvaluator: GoalEvaluatorProtocol;\n private readonly maxIterations: number;\n private readonly stopPhrases: readonly string[];\n private readonly includeHistory: boolean;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(\n agent: AgentLike,\n goalEvaluator: GoalEvaluatorProtocol,\n options: TaskLoopOptions = {},\n ) {\n this.agent = agent;\n this.goalEvaluator = goalEvaluator;\n this.maxIterations = options.maxIterations ?? 10;\n this.stopPhrases = options.stopPhrases ?? DEFAULT_STOP_PHRASES;\n this.includeHistory = options.includeHistory ?? true;\n this.defaultHooks = options.hooks;\n }\n\n async run(\n goal: string,\n context: PatternContext = {},\n options?: TaskRunOptions,\n ): Promise<TaskResult> {\n const runner = options?.runner;\n const hooks = options?.hooks ?? this.defaultHooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for TaskLoop execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"TaskLoop\",\n timestamp: new Date(),\n });\n\n const history: string[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let exitReason: TaskExitReason = \"max_iterations\";\n let finalContent = \"\";\n\n for (let iteration = 0; iteration < this.maxIterations; iteration++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration,\n timestamp: new Date(),\n });\n\n // Build prompt\n const prompt = this.buildPrompt(goal, history, context);\n\n // Run agent\n const runResult = await runner.run(this.agent, prompt, { toolExecutor });\n const content = runResult.response;\n totalInputTokens += runResult.inputTokens;\n totalOutputTokens += runResult.outputTokens;\n finalContent = content;\n history.push(content);\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration,\n timestamp: new Date(),\n });\n\n // Check stop phrases\n if (this.containsStopPhrase(content)) {\n exitReason = \"explicit_stop\";\n break;\n }\n\n // Evaluate goal\n const [achieved] = await this.goalEvaluator.evaluate(goal, content, context);\n if (achieved) {\n exitReason = \"goal_achieved\";\n break;\n }\n }\n\n const state: TaskState = {\n iteration: history.length,\n history: Object.freeze([...history]),\n getHistorySummary() {\n return history.join(\"\\n---\\n\");\n },\n };\n\n const result: TaskResult = Object.freeze({\n exitReason,\n iterations: history.length,\n state,\n totalInputTokens,\n totalOutputTokens,\n succeeded: exitReason === \"goal_achieved\",\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"TaskLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private buildPrompt(goal: string, history: readonly string[], _context: PatternContext): string {\n const parts = [`GOAL: ${goal}`];\n\n if (this.includeHistory && history.length > 0) {\n parts.push(\"\");\n parts.push(\"PREVIOUS RESPONSES:\");\n for (let i = 0; i < history.length; i++) {\n parts.push(`[Iteration ${i + 1}]: ${history[i]}`);\n }\n }\n\n parts.push(\"\");\n parts.push(\"Continue working toward the goal.\");\n\n return parts.join(\"\\n\");\n }\n\n private containsStopPhrase(content: string): boolean {\n const upper = content.toUpperCase();\n return this.stopPhrases.some((phrase) => upper.includes(phrase.toUpperCase()));\n }\n}\n","/**\n * EvaluatorLoop — Producer-Evaluator Refinement Loop.\n *\n * Producer generates output → evaluator scores + critiques → producer refines.\n * Tracks best output by score, exits on quality/max/plateau/error.\n *\n * Ported from Python: workflows/loops/evaluator.py\n */\n\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { PatternContext, PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type RefinementExitReason = \"quality_met\" | \"max_refinements\" | \"no_improvement\" | \"error\";\n\n/** A single evaluation of produced output. */\nexport interface Refinement {\n readonly iteration: number;\n readonly content: string;\n readonly score: number;\n readonly feedback: string;\n}\n\n/** Protocol for evaluating produced output and providing refinement feedback. */\nexport interface RefinementEvaluator {\n evaluate(\n input: string,\n output: string,\n context?: PatternContext,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }>;\n}\n\n/** Result of the evaluator loop. */\nexport interface RefinementResult extends PatternResult {\n readonly exitReason: RefinementExitReason;\n readonly refinements: readonly Refinement[];\n readonly bestOutput: string;\n readonly bestScore: number;\n readonly iterations: number;\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorLoop options\n// ---------------------------------------------------------------------------\n\nexport interface EvaluatorLoopOptions {\n readonly maxRefinements?: number;\n readonly minImprovement?: number;\n readonly hooks?: PatternHooks;\n}\n\nexport interface EvaluatorRunOptions {\n readonly runner: RunnerProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// EvaluatorLoop\n// ---------------------------------------------------------------------------\n\n/**\n * Self-critique refinement loop: producer generates, evaluator scores,\n * producer refines until quality is met or exit conditions are reached.\n *\n * Example:\n * const loop = new EvaluatorLoop(writerAgent, evaluator, { maxRefinements: 3 });\n * const result = await loop.run(\"Write a haiku\", { runner });\n */\nexport class EvaluatorLoop {\n private readonly producer: AgentLike;\n private readonly evaluator: RefinementEvaluator;\n private readonly maxRefinements: number;\n private readonly minImprovement: number;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(\n producer: AgentLike,\n evaluator: RefinementEvaluator,\n options: EvaluatorLoopOptions = {},\n ) {\n this.producer = producer;\n this.evaluator = evaluator;\n this.maxRefinements = options.maxRefinements ?? 5;\n this.minImprovement = options.minImprovement ?? 0.01;\n this.defaultHooks = options.hooks;\n }\n\n async run(input: string, options?: EvaluatorRunOptions): Promise<RefinementResult> {\n const runner = options?.runner;\n const hooks = options?.hooks ?? this.defaultHooks;\n const toolExecutor = options?.toolExecutor;\n\n if (!runner) {\n throw new Error(\"Runner is required for EvaluatorLoop execution\");\n }\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"EvaluatorLoop\",\n timestamp: new Date(),\n });\n\n const refinements: Refinement[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let bestOutput = \"\";\n let bestScore = Number.NEGATIVE_INFINITY;\n let exitReason: RefinementExitReason = \"max_refinements\";\n let previousScore = Number.NEGATIVE_INFINITY;\n let lastFeedback = \"\";\n\n for (let iteration = 0; iteration < this.maxRefinements; iteration++) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration,\n timestamp: new Date(),\n });\n\n // Build prompt for producer\n const prompt = this.buildPrompt(input, iteration, lastFeedback);\n\n // Run producer\n const runResult = await runner.run(this.producer, prompt, { toolExecutor });\n const content = runResult.response;\n totalInputTokens += runResult.inputTokens;\n totalOutputTokens += runResult.outputTokens;\n\n // Evaluate output\n const evaluation = await this.evaluator.evaluate(input, content);\n\n const refinement: Refinement = Object.freeze({\n iteration,\n content,\n score: evaluation.score,\n feedback: evaluation.feedback,\n });\n refinements.push(refinement);\n\n // Track best\n if (evaluation.score > bestScore) {\n bestScore = evaluation.score;\n bestOutput = content;\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration,\n timestamp: new Date(),\n });\n\n // Check quality met\n if (evaluation.qualityMet) {\n exitReason = \"quality_met\";\n break;\n }\n\n // Check improvement plateau\n if (iteration > 0 && evaluation.score - previousScore < this.minImprovement) {\n exitReason = \"no_improvement\";\n break;\n }\n\n previousScore = evaluation.score;\n lastFeedback = evaluation.feedback;\n }\n\n const result: RefinementResult = Object.freeze({\n exitReason,\n refinements: Object.freeze(refinements),\n bestOutput,\n bestScore,\n iterations: refinements.length,\n totalInputTokens,\n totalOutputTokens,\n succeeded: exitReason === \"quality_met\",\n finalContent: bestOutput,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"EvaluatorLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private buildPrompt(input: string, iteration: number, feedback: string): string {\n if (iteration === 0) {\n return input;\n }\n return `${input}\\n\\nFEEDBACK FROM EVALUATOR:\\n${feedback}\\n\\nPlease revise your output based on this feedback.`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMRefinementEvaluator\n// ---------------------------------------------------------------------------\n\nexport interface LLMRefinementEvaluatorOptions {\n readonly qualityThreshold?: number;\n}\n\n/**\n * Uses an LLM agent to evaluate output quality, parse score and feedback.\n */\nexport class LLMRefinementEvaluator implements RefinementEvaluator {\n private readonly agent: AgentLike;\n private readonly runner: RunnerProtocol;\n private readonly qualityThreshold: number;\n\n constructor(\n agent: AgentLike,\n runner: RunnerProtocol,\n options: LLMRefinementEvaluatorOptions = {},\n ) {\n this.agent = agent;\n this.runner = runner;\n this.qualityThreshold = options.qualityThreshold ?? 0.8;\n }\n\n async evaluate(\n input: string,\n output: string,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n const prompt = [\n \"Evaluate the following output for the given input.\",\n \"\",\n `INPUT: ${input}`,\n \"\",\n `OUTPUT: ${output}`,\n \"\",\n \"Respond with:\",\n \"SCORE: <number between 0 and 1>\",\n \"FEEDBACK: <your critique>\",\n ].join(\"\\n\");\n\n const result = await this.runner.run(this.agent, prompt);\n const response = result.response;\n\n const scoreMatch = response.match(/SCORE:\\s*([\\d.]+)/);\n const feedbackMatch = response.match(/FEEDBACK:\\s*(.+)/s);\n\n const score = scoreMatch ? Number.parseFloat(scoreMatch[1] ?? \"0\") : 0;\n const feedback = feedbackMatch?.[1]?.trim() ?? \"No feedback provided\";\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// RubricEvaluator\n// ---------------------------------------------------------------------------\n\n/** A single rubric criterion with name, weight, and scoring function. */\nexport interface RubricCriterion {\n readonly name: string;\n readonly weight: number;\n readonly score: (input: string, output: string) => number | Promise<number>;\n}\n\n/**\n * Scores output against a set of weighted rubric criteria.\n */\nexport class RubricEvaluator implements RefinementEvaluator {\n private readonly criteria: readonly RubricCriterion[];\n private readonly qualityThreshold: number;\n\n constructor(criteria: readonly RubricCriterion[], qualityThreshold = 0.8) {\n this.criteria = criteria;\n this.qualityThreshold = qualityThreshold;\n }\n\n async evaluate(\n input: string,\n output: string,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n let totalWeight = 0;\n let weightedSum = 0;\n const feedbackParts: string[] = [];\n\n for (const criterion of this.criteria) {\n const criterionScore = await criterion.score(input, output);\n const clampedScore = Math.max(0, Math.min(1, criterionScore));\n totalWeight += criterion.weight;\n weightedSum += criterion.weight * clampedScore;\n feedbackParts.push(`${criterion.name}: ${clampedScore.toFixed(2)}`);\n }\n\n const score = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const feedback = feedbackParts.join(\"; \");\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// CompositeRefinementEvaluator\n// ---------------------------------------------------------------------------\n\n/** An evaluator with an associated weight for compositing. */\nexport interface WeightedEvaluator {\n readonly evaluator: RefinementEvaluator;\n readonly weight: number;\n}\n\n/**\n * Combines multiple evaluators into a weighted average score.\n */\nexport class CompositeRefinementEvaluator implements RefinementEvaluator {\n private readonly evaluators: readonly WeightedEvaluator[];\n private readonly qualityThreshold: number;\n\n constructor(evaluators: readonly WeightedEvaluator[], qualityThreshold = 0.8) {\n this.evaluators = evaluators;\n this.qualityThreshold = qualityThreshold;\n }\n\n async evaluate(\n input: string,\n output: string,\n context?: PatternContext,\n ): Promise<{ score: number; feedback: string; qualityMet: boolean }> {\n let totalWeight = 0;\n let weightedSum = 0;\n const feedbackParts: string[] = [];\n\n for (const { evaluator, weight } of this.evaluators) {\n const result = await evaluator.evaluate(input, output, context);\n totalWeight += weight;\n weightedSum += weight * result.score;\n feedbackParts.push(result.feedback);\n }\n\n const score = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const feedback = feedbackParts.join(\"\\n\");\n\n return {\n score,\n feedback,\n qualityMet: score >= this.qualityThreshold,\n };\n }\n}\n","/**\n * ConversationLoop — Multi-turn conversation orchestration.\n *\n * Wraps the Conversation class, driving exchanges via external\n * inputFn/outputFn callbacks. Exits on exit phrase, max exchanges, or error.\n *\n * Ported from Python: workflows/loops/conversation.py\n */\n\nimport { Conversation } from \"../conversation/conversation.js\";\nimport type { ConversationStoreProtocol } from \"../conversation/store.js\";\nimport type { AgentLike } from \"../runner/agent-runner.js\";\nimport type { RunnerProtocol, ToolExecutor } from \"../runner/types.js\";\nimport type { PatternHooks, PatternResult } from \"./base.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ConversationExitReason = \"exit_phrase\" | \"max_exchanges\" | \"input_closed\" | \"error\";\n\nexport interface ConversationResult extends PatternResult {\n readonly exitReason: ConversationExitReason;\n readonly exchangeCount: number;\n readonly conversation: Conversation;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ConversationLoopOptions {\n readonly maxExchanges?: number;\n readonly exitPhrases?: readonly string[];\n readonly store?: ConversationStoreProtocol;\n readonly toolExecutor?: ToolExecutor;\n readonly hooks?: PatternHooks;\n}\n\nexport interface ConversationRunOptions {\n readonly runner: RunnerProtocol;\n readonly inputFn: () => string | null | Promise<string | null>;\n readonly outputFn?: (response: string) => void | Promise<void>;\n readonly hooks?: PatternHooks;\n}\n\n// ---------------------------------------------------------------------------\n// ConversationLoop\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_EXIT_PHRASES = [\"exit\", \"quit\", \"bye\"];\n\n/**\n * Multi-turn conversation loop with external I/O callbacks.\n *\n * Example:\n * const loop = new ConversationLoop(agent, { maxExchanges: 10 });\n * const result = await loop.run({\n * runner,\n * inputFn: () => readLine(),\n * outputFn: (r) => console.log(r),\n * });\n */\nexport class ConversationLoop {\n private readonly agent: AgentLike;\n private readonly maxExchanges: number;\n private readonly exitPhrases: readonly string[];\n private readonly store: ConversationStoreProtocol | undefined;\n private readonly toolExecutor: ToolExecutor | undefined;\n private readonly defaultHooks: PatternHooks | undefined;\n\n constructor(agent: AgentLike, options: ConversationLoopOptions = {}) {\n this.agent = agent;\n this.maxExchanges = options.maxExchanges ?? 100;\n this.exitPhrases = options.exitPhrases ?? DEFAULT_EXIT_PHRASES;\n this.store = options.store;\n this.toolExecutor = options.toolExecutor;\n this.defaultHooks = options.hooks;\n }\n\n async run(options: ConversationRunOptions): Promise<ConversationResult> {\n const { runner, inputFn, outputFn } = options;\n const hooks = options.hooks ?? this.defaultHooks;\n\n const conversation = new Conversation(this.agent, runner, {\n store: this.store,\n toolExecutor: this.toolExecutor,\n });\n\n await hooks?.onPatternStart?.({\n type: \"pattern.start\",\n patternName: \"ConversationLoop\",\n timestamp: new Date(),\n });\n\n let exitReason: ConversationExitReason = \"max_exchanges\";\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let finalContent = \"\";\n\n while (conversation.exchangeCount < this.maxExchanges) {\n await hooks?.onIterationStart?.({\n type: \"pattern.iteration.start\",\n iteration: conversation.exchangeCount,\n timestamp: new Date(),\n });\n\n // Get user input\n const userInput = await inputFn();\n\n if (userInput === null) {\n exitReason = \"input_closed\";\n break;\n }\n\n // Check exit phrases\n if (this.isExitPhrase(userInput)) {\n exitReason = \"exit_phrase\";\n break;\n }\n\n // Send message and get response\n const exchange = await conversation.send(userInput);\n totalInputTokens += exchange.inputTokens;\n totalOutputTokens += exchange.outputTokens;\n finalContent = exchange.assistant;\n\n // Output callback\n if (outputFn) {\n await outputFn(exchange.assistant);\n }\n\n await hooks?.onIterationComplete?.({\n type: \"pattern.iteration.complete\",\n iteration: conversation.exchangeCount - 1,\n timestamp: new Date(),\n });\n }\n\n const result: ConversationResult = Object.freeze({\n exitReason,\n exchangeCount: conversation.exchangeCount,\n conversation,\n totalInputTokens,\n totalOutputTokens,\n succeeded: true,\n finalContent,\n });\n\n await hooks?.onPatternComplete?.({\n type: \"pattern.complete\",\n patternName: \"ConversationLoop\",\n result,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n private isExitPhrase(input: string): boolean {\n const lower = input.toLowerCase().trim();\n return this.exitPhrases.some((phrase) => lower === phrase.toLowerCase());\n }\n}\n","/**\n * Admin Zod schemas for dashboard and observability.\n *\n * Defines validated data shapes for agent statistics,\n * token usage, conversations, and trace data.\n */\n\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Token usage\n// ---------------------------------------------------------------------------\n\nexport const TokenUsageRowSchema = z.object({\n timestamp: z.date(),\n inputTokens: z.number(),\n outputTokens: z.number(),\n totalTokens: z.number(),\n model: z.string(),\n agentName: z.string(),\n});\nexport type TokenUsageRow = z.infer<typeof TokenUsageRowSchema>;\n\n// ---------------------------------------------------------------------------\n// Tool statistics\n// ---------------------------------------------------------------------------\n\nexport const ToolStatsSchema = z.object({\n toolName: z.string(),\n callCount: z.number().int().nonnegative(),\n errorCount: z.number().int().nonnegative(),\n totalDurationMs: z.number().nonnegative(),\n avgDurationMs: z.number().nonnegative(),\n lastUsed: z.date().optional(),\n});\nexport type ToolStats = z.infer<typeof ToolStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Agent statistics\n// ---------------------------------------------------------------------------\n\nexport const AgentStatsSchema = z.object({\n agentName: z.string(),\n status: z.enum([\"idle\", \"running\", \"error\", \"completed\"]),\n totalIterations: z.number().int().nonnegative(),\n totalToolCalls: z.number().int().nonnegative(),\n totalInputTokens: z.number().int().nonnegative(),\n totalOutputTokens: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n startedAt: z.date().optional(),\n lastEventAt: z.date().optional(),\n toolStats: z.array(ToolStatsSchema),\n});\nexport type AgentStats = z.infer<typeof AgentStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Dashboard statistics\n// ---------------------------------------------------------------------------\n\nexport const DashboardStatsSchema = z.object({\n agents: z.array(AgentStatsSchema),\n activeAgentCount: z.number().int().nonnegative(),\n totalTokensUsed: z.number().int().nonnegative(),\n totalToolCalls: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n activeConversationCount: z.number().int().nonnegative(),\n uptimeMs: z.number().nonnegative(),\n});\nexport type DashboardStats = z.infer<typeof DashboardStatsSchema>;\n\n// ---------------------------------------------------------------------------\n// Conversation summary\n// ---------------------------------------------------------------------------\n\nexport const ConversationSummarySchema = z.object({\n conversationId: z.string(),\n agentName: z.string(),\n messageCount: z.number().int().nonnegative(),\n tokenCount: z.number().int().nonnegative(),\n startedAt: z.date(),\n lastMessageAt: z.date().optional(),\n status: z.enum([\"active\", \"completed\", \"error\"]),\n});\nexport type ConversationSummary = z.infer<typeof ConversationSummarySchema>;\n\n// ---------------------------------------------------------------------------\n// Trace events\n// ---------------------------------------------------------------------------\n\nexport const TraceEventSchema = z.object({\n type: z.string(),\n timestamp: z.date(),\n spanId: z.string(),\n parentSpanId: z.string().optional(),\n data: z.record(z.unknown()),\n});\nexport type TraceEvent = z.infer<typeof TraceEventSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace iteration\n// ---------------------------------------------------------------------------\n\nexport const TraceIterationSchema = z.object({\n iteration: z.number().int().nonnegative(),\n events: z.array(TraceEventSchema),\n toolCalls: z.number().int().nonnegative(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n});\nexport type TraceIteration = z.infer<typeof TraceIterationSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace response\n// ---------------------------------------------------------------------------\n\nexport const TraceResponseSchema = z.object({\n traceId: z.string(),\n agentName: z.string(),\n iterations: z.array(TraceIterationSchema),\n totalDurationMs: z.number().nonnegative(),\n status: z.enum([\"running\", \"completed\", \"error\"]),\n});\nexport type TraceResponse = z.infer<typeof TraceResponseSchema>;\n\n// ---------------------------------------------------------------------------\n// Trace summary\n// ---------------------------------------------------------------------------\n\nexport const TraceSummarySchema = z.object({\n traceId: z.string(),\n agentName: z.string(),\n startedAt: z.date(),\n durationMs: z.number().nonnegative().optional(),\n status: z.enum([\"running\", \"completed\", \"error\"]),\n iterationCount: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n});\nexport type TraceSummary = z.infer<typeof TraceSummarySchema>;\n\n// ---------------------------------------------------------------------------\n// Date filters\n// ---------------------------------------------------------------------------\n\nexport const DateFiltersSchema = z.object({\n from: z.date().optional(),\n to: z.date().optional(),\n});\nexport type DateFilters = z.infer<typeof DateFiltersSchema>;\n\n// ---------------------------------------------------------------------------\n// Tool analytics (cross-agent aggregation)\n// ---------------------------------------------------------------------------\n\nexport const ToolAnalyticsSchema = z.object({\n toolName: z.string(),\n totalCalls: z.number().int().nonnegative(),\n totalErrors: z.number().int().nonnegative(),\n totalDurationMs: z.number().nonnegative(),\n avgDurationMs: z.number().nonnegative(),\n agentBreakdown: z.array(\n z.object({\n agentName: z.string(),\n callCount: z.number().int().nonnegative(),\n }),\n ),\n});\nexport type ToolAnalytics = z.infer<typeof ToolAnalyticsSchema>;\n\n// ---------------------------------------------------------------------------\n// Token usage group (for groupBy queries)\n// ---------------------------------------------------------------------------\n\nexport const TokenUsageGroupSchema = z.object({\n key: z.string(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n conversationCount: z.number().int().nonnegative(),\n});\nexport type TokenUsageGroup = z.infer<typeof TokenUsageGroupSchema>;\n","/**\n * In-memory event collector for admin observability.\n *\n * Extends BaseExporter to subscribe to agent events and maintain\n * live statistics, ring-buffered recent events, and per-agent state.\n */\n\nimport { EventProfile } from \"../events/event-profiles.js\";\nimport type {\n AgentEvent,\n BaseEvent,\n ConversationEndEvent,\n ConversationStartEvent,\n ErrorEvent,\n IterationEndEvent,\n IterationStartEvent,\n LLMCallEndEvent,\n MessageCancelEvent,\n MessageCompleteEvent,\n MessageStartEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n} from \"../events/types.js\";\nimport { BaseExporter } from \"../exporters/base.js\";\nimport type {\n AgentStats,\n ConversationSummary,\n DashboardStats,\n DateFilters,\n TokenUsageGroup,\n ToolAnalytics,\n ToolStats,\n TraceEvent,\n TraceSummary,\n} from \"./schemas.js\";\n\n// ---------------------------------------------------------------------------\n// Ring buffer\n// ---------------------------------------------------------------------------\n\n/**\n * Fixed-capacity circular buffer with O(1) push and O(n) materialization.\n *\n * Uses a pre-allocated array with head index + length instead of Array.shift()\n * to avoid O(n) reindexing on every push at capacity.\n */\nclass RingBuffer<T> {\n private readonly _items: (T | undefined)[];\n private readonly _capacity: number;\n private _start = 0;\n private _length = 0;\n\n constructor(capacity: number) {\n this._capacity = capacity;\n this._items = new Array(capacity);\n }\n\n push(item: T): void {\n const end = (this._start + this._length) % this._capacity;\n this._items[end] = item;\n if (this._length < this._capacity) {\n this._length += 1;\n } else {\n this._start = (this._start + 1) % this._capacity;\n }\n }\n\n toArray(): T[] {\n const result: T[] = [];\n for (let i = 0; i < this._length; i++) {\n const item = this._items[(this._start + i) % this._capacity];\n if (item !== undefined) result.push(item);\n }\n return result;\n }\n\n get length(): number {\n return this._length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal mutable state\n// ---------------------------------------------------------------------------\n\ninterface MutableAgentStats {\n agentName: string;\n status: \"idle\" | \"running\" | \"error\" | \"completed\";\n totalIterations: number;\n totalToolCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalErrors: number;\n startedAt?: Date;\n lastEventAt?: Date;\n toolStats: Map<string, MutableToolStats>;\n}\n\ninterface MutableToolStats {\n toolName: string;\n callCount: number;\n errorCount: number;\n totalDurationMs: number;\n lastUsed?: Date;\n}\n\n/** Per-call log entry retained in a ring buffer for date-filtered queries. */\ninterface ToolCallLogEntry {\n readonly toolName: string;\n readonly agentName: string;\n readonly durationMs: number;\n readonly isError: boolean;\n readonly timestamp: Date;\n}\n\n// ---------------------------------------------------------------------------\n// InMemoryEventCollector\n// ---------------------------------------------------------------------------\n\n/**\n * Collects agent events in memory for admin dashboard queries.\n *\n * Subscribes to the UX event profile and maintains:\n * - Per-agent statistics (iterations, tokens, tool calls, errors)\n * - Per-tool statistics (call count, duration, errors)\n * - Ring buffer of recent trace events (capped at 1000)\n * - Trace summaries by traceId\n * - Token usage by model\n * - Active conversation tracking\n */\nexport class InMemoryEventCollector extends BaseExporter {\n override profile = EventProfile.UX;\n\n private _startedAt = new Date();\n private _agents = new Map<string, MutableAgentStats>();\n private _recentEvents = new RingBuffer<TraceEvent>(1000);\n /** Bounded log of individual tool calls, used for date-filtered analytics. */\n private _toolCallLog = new RingBuffer<ToolCallLogEntry>(10_000);\n private _traces = new Map<\n string,\n {\n agentName: string;\n startedAt: Date;\n iterationCount: number;\n totalTokens: number;\n status: \"running\" | \"completed\" | \"error\";\n }\n >();\n private _tokensByModel = new Map<\n string,\n { input: number; output: number; conversations: Set<string> }\n >();\n private _activeConversations = new Set<string>();\n\n // ---------------------------------------------------------------------------\n // Query methods\n // ---------------------------------------------------------------------------\n\n /** Get dashboard-level aggregate statistics. */\n getDashboardStats(): DashboardStats {\n const agents = this._getAgentStatsList();\n return {\n agents,\n activeAgentCount: agents.filter((a) => a.status === \"running\").length,\n activeConversationCount: this._activeConversations.size,\n totalTokensUsed: agents.reduce((sum, a) => sum + a.totalInputTokens + a.totalOutputTokens, 0),\n totalToolCalls: agents.reduce((sum, a) => sum + a.totalToolCalls, 0),\n totalErrors: agents.reduce((sum, a) => sum + a.totalErrors, 0),\n uptimeMs: Date.now() - this._startedAt.getTime(),\n };\n }\n\n /** Get statistics for a specific agent. */\n getAgentStats(agentName: string): AgentStats | undefined {\n const internal = this._agents.get(agentName);\n if (!internal) return undefined;\n return this._toAgentStats(internal);\n }\n\n /** Get all agent statistics. */\n getAllAgentStats(): AgentStats[] {\n return this._getAgentStatsList();\n }\n\n /** Get recent trace events from the ring buffer. */\n getRecentEvents(limit?: number): TraceEvent[] {\n const all = this._recentEvents.toArray();\n if (limit !== undefined && limit < all.length) {\n return all.slice(all.length - limit);\n }\n return all;\n }\n\n /** Get all trace summaries. */\n getTraceSummaries(): TraceSummary[] {\n const summaries: TraceSummary[] = [];\n for (const [traceId, trace] of this._traces) {\n summaries.push({\n traceId,\n agentName: trace.agentName,\n startedAt: trace.startedAt,\n durationMs: Date.now() - trace.startedAt.getTime(),\n status: trace.status,\n iterationCount: trace.iterationCount,\n totalTokens: trace.totalTokens,\n });\n }\n return summaries;\n }\n\n /** Get conversations (derived from traces). */\n getConversations(): ConversationSummary[] {\n const conversations: ConversationSummary[] = [];\n for (const [traceId, trace] of this._traces) {\n conversations.push({\n conversationId: traceId,\n agentName: trace.agentName,\n messageCount: trace.iterationCount,\n tokenCount: trace.totalTokens,\n startedAt: trace.startedAt,\n status: trace.status === \"running\" ? \"active\" : trace.status,\n });\n }\n return conversations;\n }\n\n /**\n * Get cross-agent tool analytics.\n *\n * When `filters` specify a date range, aggregation runs over the\n * per-call log (bounded to the most recent 10,000 calls). Without\n * filters, uses the lifetime aggregates on each agent.\n */\n getToolAnalytics(filters?: DateFilters): ToolAnalytics[] {\n if (filters && (filters.from || filters.to)) {\n return this._getToolAnalyticsFromLog(filters);\n }\n\n const toolMap = new Map<\n string,\n {\n totalCalls: number;\n totalErrors: number;\n totalDurationMs: number;\n agentBreakdown: Map<string, number>;\n }\n >();\n\n for (const agent of this._agents.values()) {\n for (const ts of agent.toolStats.values()) {\n let entry = toolMap.get(ts.toolName);\n if (!entry) {\n entry = {\n totalCalls: 0,\n totalErrors: 0,\n totalDurationMs: 0,\n agentBreakdown: new Map(),\n };\n toolMap.set(ts.toolName, entry);\n }\n entry.totalCalls += ts.callCount;\n entry.totalErrors += ts.errorCount;\n entry.totalDurationMs += ts.totalDurationMs;\n entry.agentBreakdown.set(\n agent.agentName,\n (entry.agentBreakdown.get(agent.agentName) ?? 0) + ts.callCount,\n );\n }\n }\n\n const result: ToolAnalytics[] = [];\n for (const [toolName, entry] of toolMap) {\n const agentBreakdown = Array.from(entry.agentBreakdown.entries()).map(\n ([agentName, callCount]) => ({ agentName, callCount }),\n );\n result.push({\n toolName,\n totalCalls: entry.totalCalls,\n totalErrors: entry.totalErrors,\n totalDurationMs: entry.totalDurationMs,\n avgDurationMs: entry.totalCalls > 0 ? entry.totalDurationMs / entry.totalCalls : 0,\n agentBreakdown,\n });\n }\n return result;\n }\n\n /** Get token usage grouped by agent or model. */\n getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): TokenUsageGroup[] {\n if (params.groupBy === \"agent\") {\n return this._getAgentStatsList().map((a) => ({\n key: a.agentName,\n inputTokens: a.totalInputTokens,\n outputTokens: a.totalOutputTokens,\n totalTokens: a.totalInputTokens + a.totalOutputTokens,\n conversationCount: 0,\n }));\n }\n\n // groupBy model\n const result: TokenUsageGroup[] = [];\n for (const [model, entry] of this._tokensByModel) {\n result.push({\n key: model,\n inputTokens: entry.input,\n outputTokens: entry.output,\n totalTokens: entry.input + entry.output,\n conversationCount: entry.conversations.size,\n });\n }\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // Event dispatch (overrides BaseExporter's dynamic _on* dispatch with an\n // explicit switch so the compiler catches new event types in AgentEvent\n // that do not yet have a handler.)\n // ---------------------------------------------------------------------------\n\n override async handleEvent(event: BaseEvent): Promise<void> {\n const typed = event as AgentEvent;\n switch (typed.type) {\n case \"agent.conversation.start\":\n await this._onConversationStart(typed);\n return;\n case \"agent.conversation.end\":\n await this._onConversationEnd(typed);\n return;\n case \"agent.message.start\":\n await this._onMessageStart(typed);\n return;\n case \"agent.message.complete\":\n await this._onMessageComplete(typed);\n return;\n case \"agent.message.cancel\":\n await this._onMessageCancel(typed);\n return;\n case \"agent.iteration.start\":\n await this._onIterationStart(typed);\n return;\n case \"agent.iteration.end\":\n await this._onIterationEnd(typed);\n return;\n case \"agent.tool.start\":\n await this._onToolStart(typed);\n return;\n case \"agent.tool.end\":\n await this._onToolEnd(typed);\n return;\n case \"agent.llm.end\":\n await this._onLlmEnd(typed);\n return;\n case \"agent.error\":\n await this._onError(typed);\n return;\n // Events on the UX profile we observe but do not aggregate. Recorded\n // into the ring buffer only. Listed explicitly so adding a new event\n // type to the profile forces a choice here.\n case \"agent.message.chunk\":\n case \"agent.reasoning\":\n case \"agent.thinking.start\":\n case \"agent.tool.intent\":\n case \"agent.tool.rejected\":\n case \"agent.tool.progress\":\n case \"agent.llm.start\":\n case \"claude_code.hook\":\n this._recordEvent(typed);\n return;\n default: {\n // Exhaustiveness check — adding a new case to AgentEvent will cause\n // this line to fail typechecking until a branch is added above.\n const _exhaustive: never = typed;\n void _exhaustive;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Event handlers\n // ---------------------------------------------------------------------------\n\n /** @internal */\n async _onConversationStart(event: ConversationStartEvent): Promise<void> {\n this._recordEvent(event);\n this._activeConversations.add(event.conversationId);\n }\n\n /** @internal */\n async _onConversationEnd(event: ConversationEndEvent): Promise<void> {\n this._recordEvent(event);\n this._activeConversations.delete(event.conversationId);\n // Update trace status if we can find it\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = event.reason === \"error\" ? \"error\" : \"completed\";\n }\n }\n\n /** @internal */\n async _onMessageStart(event: MessageStartEvent): Promise<void> {\n this._recordEvent(event);\n const agent = this._ensureAgent(event.agentName);\n agent.status = \"running\";\n if (!agent.startedAt) {\n agent.startedAt = event.timestamp;\n }\n agent.lastEventAt = event.timestamp;\n\n // Track trace\n if (!this._traces.has(event.traceId)) {\n this._traces.set(event.traceId, {\n agentName: event.agentName,\n startedAt: event.timestamp,\n iterationCount: 0,\n totalTokens: 0,\n status: \"running\",\n });\n }\n }\n\n /** @internal */\n async _onMessageComplete(event: MessageCompleteEvent): Promise<void> {\n this._recordEvent(event);\n // Find agent by traceId\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalInputTokens += event.inputTokens;\n agent.totalOutputTokens += event.outputTokens;\n agent.lastEventAt = event.timestamp;\n }\n trace.totalTokens += event.inputTokens + event.outputTokens;\n }\n }\n\n /** @internal */\n async _onMessageCancel(event: MessageCancelEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = \"completed\";\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onIterationStart(event: IterationStartEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onIterationEnd(event: IterationEndEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.iterationCount = event.iteration + 1;\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalIterations = Math.max(agent.totalIterations, event.iteration + 1);\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onToolStart(event: ToolCallStartEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n /** @internal */\n async _onToolEnd(event: ToolCallEndEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalToolCalls += 1;\n agent.lastEventAt = event.timestamp;\n\n // Update tool stats\n let toolStats = agent.toolStats.get(event.toolName);\n if (!toolStats) {\n toolStats = {\n toolName: event.toolName,\n callCount: 0,\n errorCount: 0,\n totalDurationMs: 0,\n };\n agent.toolStats.set(event.toolName, toolStats);\n }\n toolStats.callCount += 1;\n toolStats.totalDurationMs += event.durationMs;\n toolStats.lastUsed = event.timestamp;\n if (event.error) {\n toolStats.errorCount += 1;\n }\n\n // Append to per-call log so getToolAnalytics can apply date filters.\n this._toolCallLog.push({\n toolName: event.toolName,\n agentName: trace.agentName,\n durationMs: event.durationMs,\n isError: Boolean(event.error),\n timestamp: event.timestamp,\n });\n }\n }\n }\n\n /** @internal */\n async _onLlmEnd(event: LLMCallEndEvent): Promise<void> {\n this._recordEvent(event);\n\n // Track tokens by model\n let entry = this._tokensByModel.get(event.model);\n if (!entry) {\n entry = { input: 0, output: 0, conversations: new Set() };\n this._tokensByModel.set(event.model, entry);\n }\n entry.input += event.inputTokens;\n entry.output += event.outputTokens;\n const trace = this._traces.get(event.traceId);\n if (trace) {\n entry.conversations.add(event.traceId);\n }\n }\n\n /** @internal */\n async _onError(event: ErrorEvent): Promise<void> {\n this._recordEvent(event);\n const trace = this._traces.get(event.traceId);\n if (trace) {\n trace.status = \"error\";\n const agent = this._agents.get(trace.agentName);\n if (agent) {\n agent.totalErrors += 1;\n agent.status = \"error\";\n agent.lastEventAt = event.timestamp;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private _ensureAgent(agentName: string): MutableAgentStats {\n let agent = this._agents.get(agentName);\n if (!agent) {\n agent = {\n agentName,\n status: \"idle\",\n totalIterations: 0,\n totalToolCalls: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalErrors: 0,\n toolStats: new Map(),\n };\n this._agents.set(agentName, agent);\n }\n return agent;\n }\n\n private _recordEvent(event: BaseEvent): void {\n this._recentEvents.push({\n type: event.type,\n timestamp: event.timestamp,\n spanId: event.spanId,\n parentSpanId: event.parentSpanId,\n data: {},\n });\n }\n\n private _toAgentStats(internal: MutableAgentStats): AgentStats {\n const toolStats: ToolStats[] = [];\n for (const ts of internal.toolStats.values()) {\n toolStats.push({\n toolName: ts.toolName,\n callCount: ts.callCount,\n errorCount: ts.errorCount,\n totalDurationMs: ts.totalDurationMs,\n avgDurationMs: ts.callCount > 0 ? ts.totalDurationMs / ts.callCount : 0,\n lastUsed: ts.lastUsed,\n });\n }\n return {\n agentName: internal.agentName,\n status: internal.status,\n totalIterations: internal.totalIterations,\n totalToolCalls: internal.totalToolCalls,\n totalInputTokens: internal.totalInputTokens,\n totalOutputTokens: internal.totalOutputTokens,\n totalErrors: internal.totalErrors,\n startedAt: internal.startedAt,\n lastEventAt: internal.lastEventAt,\n toolStats,\n };\n }\n\n private _getAgentStatsList(): AgentStats[] {\n const result: AgentStats[] = [];\n for (const internal of this._agents.values()) {\n result.push(this._toAgentStats(internal));\n }\n return result;\n }\n\n private _getToolAnalyticsFromLog(filters: DateFilters): ToolAnalytics[] {\n const from = filters.from?.getTime();\n const to = filters.to?.getTime();\n const toolMap = new Map<\n string,\n {\n totalCalls: number;\n totalErrors: number;\n totalDurationMs: number;\n agentBreakdown: Map<string, number>;\n }\n >();\n\n for (const entry of this._toolCallLog.toArray()) {\n const ts = entry.timestamp.getTime();\n if (from !== undefined && ts < from) continue;\n if (to !== undefined && ts > to) continue;\n\n let agg = toolMap.get(entry.toolName);\n if (!agg) {\n agg = {\n totalCalls: 0,\n totalErrors: 0,\n totalDurationMs: 0,\n agentBreakdown: new Map(),\n };\n toolMap.set(entry.toolName, agg);\n }\n agg.totalCalls += 1;\n if (entry.isError) agg.totalErrors += 1;\n agg.totalDurationMs += entry.durationMs;\n agg.agentBreakdown.set(entry.agentName, (agg.agentBreakdown.get(entry.agentName) ?? 0) + 1);\n }\n\n const result: ToolAnalytics[] = [];\n for (const [toolName, agg] of toolMap) {\n const agentBreakdown = Array.from(agg.agentBreakdown.entries()).map(\n ([agentName, callCount]) => ({ agentName, callCount }),\n );\n result.push({\n toolName,\n totalCalls: agg.totalCalls,\n totalErrors: agg.totalErrors,\n totalDurationMs: agg.totalDurationMs,\n avgDurationMs: agg.totalCalls > 0 ? agg.totalDurationMs / agg.totalCalls : 0,\n agentBreakdown,\n });\n }\n return result;\n }\n}\n","/**\n * Admin service protocol and in-memory implementation.\n *\n * AdminServiceProtocol defines the async interface for admin queries.\n * InMemoryAdminService delegates to an InMemoryEventCollector.\n */\n\nimport type { InMemoryEventCollector } from \"./collector.js\";\nimport type {\n AgentStats,\n ConversationSummary,\n DashboardStats,\n DateFilters,\n TokenUsageGroup,\n ToolAnalytics,\n TraceEvent,\n TraceSummary,\n} from \"./schemas.js\";\n\n// ---------------------------------------------------------------------------\n// Protocol\n// ---------------------------------------------------------------------------\n\n/** Async interface for admin dashboard queries. */\nexport interface AdminServiceProtocol {\n getDashboardStats(): Promise<DashboardStats>;\n getAgentStats(agentName: string): Promise<AgentStats | undefined>;\n getAllAgentStats(): Promise<AgentStats[]>;\n getRecentEvents(limit?: number): Promise<TraceEvent[]>;\n getTraceSummaries(): Promise<TraceSummary[]>;\n getConversations(): Promise<ConversationSummary[]>;\n getToolAnalytics(filters?: DateFilters): Promise<ToolAnalytics[]>;\n getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): Promise<TokenUsageGroup[]>;\n}\n\n// ---------------------------------------------------------------------------\n// In-memory implementation\n// ---------------------------------------------------------------------------\n\n/**\n * In-memory admin service backed by an InMemoryEventCollector.\n *\n * All methods delegate directly to the collector's synchronous query\n * methods, wrapped in Promise resolution for protocol compliance.\n */\nexport class InMemoryAdminService implements AdminServiceProtocol {\n private _collector: InMemoryEventCollector;\n\n constructor(collector: InMemoryEventCollector) {\n this._collector = collector;\n }\n\n async getDashboardStats(): Promise<DashboardStats> {\n return this._collector.getDashboardStats();\n }\n\n async getAgentStats(agentName: string): Promise<AgentStats | undefined> {\n return this._collector.getAgentStats(agentName);\n }\n\n async getAllAgentStats(): Promise<AgentStats[]> {\n return this._collector.getAllAgentStats();\n }\n\n async getRecentEvents(limit?: number): Promise<TraceEvent[]> {\n return this._collector.getRecentEvents(limit);\n }\n\n async getTraceSummaries(): Promise<TraceSummary[]> {\n return this._collector.getTraceSummaries();\n }\n\n async getConversations(): Promise<ConversationSummary[]> {\n return this._collector.getConversations();\n }\n\n async getToolAnalytics(filters?: DateFilters): Promise<ToolAnalytics[]> {\n return this._collector.getToolAnalytics(filters);\n }\n\n async getTokenUsage(params: { groupBy: \"agent\" | \"model\" }): Promise<TokenUsageGroup[]> {\n return this._collector.getTokenUsage(params);\n }\n}\n","/**\n * StdioAdapter — JSON-RPC 2.0 over stdin/stdout for subprocess mode.\n *\n * Handles methods: listAgents, createConversation, sendMessage,\n * listConversations, getConversation. Uses SSEFormatter.extractPayload()\n * for event data in stream.event notifications.\n */\n\nimport * as readline from \"node:readline\";\nimport {\n type ConversationStoreProtocol,\n MemoryStore,\n type StoredConversation,\n} from \"../conversation/store.js\";\nimport type { AgentEvent } from \"../events/types.js\";\nimport type { AgentLike, RunnerProtocol } from \"../runner/types.js\";\nimport { SSEFormatter } from \"../transport/sse-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id?: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: number | string | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params: unknown;\n}\n\ntype NotificationCallback = (notification: JSONRPCNotification) => void;\n\n// ---------------------------------------------------------------------------\n// StdioAdapter\n// ---------------------------------------------------------------------------\n\nexport class StdioAdapter {\n private _agents: AgentLike[];\n private _agentMap: Map<string, AgentLike>;\n private _runner: RunnerProtocol;\n private _store: ConversationStoreProtocol;\n private _conversations = new Map<string, StoredConversation>();\n\n constructor(opts: {\n agents: AgentLike[];\n runner: RunnerProtocol;\n store?: ConversationStoreProtocol;\n }) {\n this._agents = opts.agents;\n this._agentMap = new Map(opts.agents.map((a) => [a.role.name, a]));\n this._runner = opts.runner;\n this._store = opts.store ?? new MemoryStore();\n }\n\n /** Start reading JSON-RPC from stdin, writing to stdout. */\n async start(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const request = JSON.parse(trimmed) as JSONRPCRequest;\n const response = await this.handleRequest(request, (notification) => {\n process.stdout.write(`${JSON.stringify(notification)}\\n`);\n });\n if (request.id !== undefined) {\n process.stdout.write(`${JSON.stringify(response)}\\n`);\n }\n } catch {\n const errorResponse: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n };\n process.stdout.write(`${JSON.stringify(errorResponse)}\\n`);\n }\n }\n }\n\n /** Handle a single JSON-RPC request. Testable without stdin/stdout. */\n async handleRequest(\n request: JSONRPCRequest,\n onNotification?: NotificationCallback,\n ): Promise<JSONRPCResponse> {\n const id = request.id ?? null;\n\n try {\n switch (request.method) {\n case \"listAgents\":\n return this._listAgents(id);\n case \"createConversation\":\n return await this._createConversation(id, request.params);\n case \"sendMessage\":\n return await this._sendMessage(id, request.params, onNotification);\n case \"listConversations\":\n return await this._listConversations(id);\n case \"getConversation\":\n return await this._getConversation(id, request.params);\n default:\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32601, message: `Method not found: ${request.method}` },\n };\n }\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32603, message: err.message },\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Method handlers\n // ---------------------------------------------------------------------------\n\n private _listAgents(id: number | string | null): JSONRPCResponse {\n const agents = this._agents.map((a) => ({\n name: a.role.name,\n model: a.getModel(),\n }));\n return { jsonrpc: \"2.0\", id, result: agents };\n }\n\n private async _createConversation(\n id: number | string | null,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCResponse> {\n const agentName = params?.agentName as string | undefined;\n if (!agentName || !this._agentMap.has(agentName)) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Unknown agent: ${agentName}` },\n };\n }\n\n const agent = this._agentMap.get(agentName)!;\n const conv = await this._store.createConversation(agentName, agent.getModel());\n this._conversations.set(conv.id, conv);\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: {\n conversationId: conv.id,\n agentName: conv.agentName,\n model: conv.model,\n },\n };\n }\n\n private async _sendMessage(\n id: number | string | null,\n params?: Record<string, unknown>,\n onNotification?: NotificationCallback,\n ): Promise<JSONRPCResponse> {\n const conversationId = params?.conversationId as string | undefined;\n const message = params?.message as string | undefined;\n\n if (!conversationId || !message) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: -32602,\n message: \"Missing conversationId or message\",\n },\n };\n }\n\n const conv = this._conversations.get(conversationId);\n if (!conv) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Conversation not found: ${conversationId}` },\n };\n }\n\n const agent = this._agentMap.get(conv.agentName);\n if (!agent) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32603, message: `Agent not found: ${conv.agentName}` },\n };\n }\n\n // Use stream if available, otherwise fall back to run\n if (this._runner.stream) {\n const gen = this._runner.stream(agent, message);\n for await (const event of gen) {\n if (onNotification) {\n const payload = SSEFormatter.extractPayload(event as AgentEvent);\n if (payload) {\n onNotification({\n jsonrpc: \"2.0\",\n method: \"stream.event\",\n params: {\n type: event.type,\n data: payload,\n },\n });\n }\n }\n }\n } else {\n await this._runner.run(agent, message);\n }\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: { status: \"completed\", conversationId },\n };\n }\n\n private async _listConversations(id: number | string | null): Promise<JSONRPCResponse> {\n const conversations: StoredConversation[] = [];\n // Get from store — iterate known conversation IDs\n for (const convId of this._conversations.keys()) {\n const conv = await this._store.getConversation(convId);\n if (conv) conversations.push(conv);\n }\n return { jsonrpc: \"2.0\", id, result: conversations };\n }\n\n private async _getConversation(\n id: number | string | null,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCResponse> {\n const conversationId = params?.conversationId as string | undefined;\n if (!conversationId) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: \"Missing conversationId\" },\n };\n }\n\n const conv = await this._store.getConversation(conversationId);\n if (!conv) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32602, message: `Conversation not found: ${conversationId}` },\n };\n }\n\n return { jsonrpc: \"2.0\", id, result: conv };\n }\n}\n"],"mappings":"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","names":["llmDuration","convEnd","iterEnd","import_claude_agent_sdk","import_ai","sdkTool","content","import_ai","import_node_child_process","import_claude_agent_sdk","MODEL_MAP","mapModel","sdkTool","import_core","_counter","generateId","_counter","_counter","generateId","toolNames","import_core","import_core","import_core","import_core","import_core","import_core","import_core","import_zod","import_core","import_zod","import_core","result","tasks","result","import_zod"]}
|