@standardagents/builder 0.9.3 → 0.9.4
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/built-in-routes.js +1 -1
- package/dist/built-in-routes.js.map +1 -1
- package/dist/client/assets/index.css +1 -1
- package/dist/client/assets/{json.worker-C21G4-GD.js → json.worker-B3O9ZXir.js} +1 -6
- package/dist/client/index.html +1 -1
- package/dist/client/index.js +19 -19
- package/dist/client/monaco.js +52 -504
- package/dist/client/vendor.js +12 -1
- package/dist/client/vue.js +1 -143
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.js +18 -0
- package/dist/plugin.js.map +1 -1
- package/dist/rou3.js +1 -1
- package/dist/rou3.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agents/types.ts","../src/agents/StreamManager.ts","../src/agents/providers/types.ts","../src/agents/providers/BaseProvider.ts","../src/agents/providers/OpenAIProvider.ts","../src/agents/providers/OpenRouterProvider.ts","../src/agents/providers/ProviderRegistry.ts","../src/agents/providers/index.ts","../src/agents/LLMRequest.ts","../src/agents/ToolExecutor.ts","../src/agents/FlowEngine.ts","../src/sdk/generateTypes.ts","../src/sdk/generators/generateModelFile.ts","../src/sdk/generators/jsonSchemaToZod.ts","../src/sdk/generators/generatePromptFile.ts","../src/sdk/generators/generateAgentFile.ts","../src/sdk/persistence/index.ts","../src/plugin.ts","../src/router/index.ts","../src/utils/auth.ts","../src/middleware/auth.ts","../src/tools/index.ts","../src/agents/defineHook.ts","../src/durable-objects/migrations/001_initial.ts","../src/durable-objects/migrations/002_add_prompt_and_tools_to_logs.ts","../src/durable-objects/migrations/003_add_log_context_and_parent.ts","../src/durable-objects/migrations/004_add_reasoning_tokens.ts","../src/durable-objects/migrations/005_add_reasoning_content.ts","../src/durable-objects/migrations/006_add_log_id_to_messages.ts","../src/durable-objects/migrations/007_add_errors_and_retry_tracking.ts","../src/durable-objects/migrations/008_add_tool_results.ts","../src/durable-objects/migrations/009_add_request_response_timestamps.ts","../src/durable-objects/migrations/010_add_alarm_queue.ts","../src/durable-objects/migrations/011_add_silent_messages.ts","../src/durable-objects/migrations/012_remove_message_history.ts","../src/durable-objects/migrations/013_add_tool_status.ts","../src/durable-objects/migrations/014_add_parent_id_and_depth.ts","../src/durable-objects/migrations/015_add_reasoning_to_messages.ts","../src/durable-objects/migrations/016_add_reasoning_details.ts","../src/durable-objects/migrations/index.ts","../src/durable-objects/DurableThread.ts","../src/durable-objects/utils/AlarmQueue.ts","../src/durable-objects/agentbuilder-migrations/0001_initial.ts","../src/durable-objects/agentbuilder-migrations/index.ts","../src/durable-objects/DurableAgentBuilder.ts","../src/sdk/defineModel.ts","../src/sdk/definePrompt.ts","../src/sdk/defineAgent.ts","../src/agents/utilities.ts","../src/agents/FlowStateSdk.ts","../src/github/GitHubClient.ts"],"names":["init_types","error","ProviderRegistry","result","FlowEngine","path","text","toolCalls","fs","escapeString","options","migration","data","message","messageId","migrations","LATEST_SCHEMA_VERSION","DurableObject"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { StreamManager } from \"./StreamManager\";\nimport type { z } from \"zod\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { defineTool } from \"../tools\";\nimport type { HookSignatures } from \"./defineHook\";\n\n/**\n * Agent configuration from D1 agents table\n */\nexport interface Agent {\n id: string;\n title: string;\n type: \"dual_ai\" | \"ai_human\";\n created_at: number;\n\n // Global configuration\n max_session_turns: number | null; // Total back-and-forth exchanges allowed (dual_ai only)\n\n // Side A configuration\n side_a_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_a_agent_prompt: string | null;\n side_a_stop_on_response: boolean;\n side_a_stop_tool: string | null;\n side_a_stop_tool_response_property: string | null;\n side_a_max_turns: number | null; // Per-side safety limit\n side_a_end_conversation_tool: string | null;\n\n // Side B configuration (null for ai_human type)\n side_b_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_b_agent_prompt: string | null;\n side_b_stop_on_response: boolean;\n side_b_stop_tool: string | null;\n side_b_stop_tool_response_property: string | null;\n side_b_max_turns: number | null; // Per-side safety limit\n side_b_end_conversation_tool: string | null;\n}\n\n/**\n * Message in OpenAI chat completion format\n */\nexport interface Message {\n id: string;\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n name?: string | null;\n tool_calls?: string | null; // JSON array of tool calls\n tool_call_id?: string | null;\n log_id?: string | null; // Log that produced this message\n created_at: number; // Microseconds since epoch\n\n // Request/Response timing\n request_sent_at?: number | null; // Microseconds - when LLM request was sent\n response_completed_at?: number | null; // Microseconds - when response was fully received\n status?: \"pending\" | \"completed\" | \"failed\"; // Message status\n silent?: boolean; // Whether this message is hidden from the LLM (UI-only)\n tool_status?: \"success\" | \"error\" | null; // Status of tool execution (for role='tool' messages only)\n\n // Reasoning content from models like o1 (stored for message history inclusion)\n reasoning_content?: string | null;\n\n // Reasoning details from OpenRouter (structured reasoning blocks)\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n // Contains array of reasoning detail objects (summary, encrypted, or text types)\n // Must be preserved exactly as returned for proper multi-turn reasoning continuity\n reasoning_details?: string | null; // JSON array of reasoning detail objects\n\n // Hierarchical tracking for sub-prompts\n parent_id?: string | null; // Parent message ID for sub-prompt messages (NULL for top-level)\n depth?: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n}\n\n/**\n * Tool call from OpenAI format\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n forceAllow?: boolean;\n}\n\n/**\n * Tool call detail stored in tool_calls table\n */\nexport interface ToolCallDetail {\n id: string;\n message_id: string;\n type: string;\n function_name: string;\n function_arguments: string;\n created_at: number;\n}\n\n/**\n * Thread metadata from DurableAgentBuilder\n * Note: agent_id is now the agent name (not UUID) since agents are in TypeScript\n */\nexport interface ThreadMetadata {\n id: string;\n agent_id: string; // Agent name from TypeScript config\n user_id: string | null;\n created_at: number;\n}\n\n/**\n * Hook registry type - transforms HookSignatures into lazy-loaded optional hooks\n */\nexport type HookRegistry = {\n [K in keyof HookSignatures]?: () => Promise<HookSignatures[K]>;\n};\n\n/**\n * Thread instance (forward reference to avoid circular dependency)\n */\nexport interface ThreadInstance {\n ctx: DurableObjectState;\n env: ThreadEnv;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{\n messages: Message[];\n total: number;\n hasMore: boolean;\n }>;\n getLogs(limit?: number, offset?: number, order?: \"asc\" | \"desc\"): Promise<LogData[]>;\n getThreadMeta(threadId: string): Promise<ThreadMetadata | null>;\n shouldStop(): Promise<boolean>; // Check if execution should be stopped (async - reads from SQLite)\n tools(): Record<string, () => Promise<ReturnType<typeof defineTool>>>;\n hooks(): HookRegistry;\n}\n\n/**\n * Tool call for internal flow management\n */\nexport type FlowToolCall = { tool: string; args: Record<string, unknown> };\n\n/**\n * Prompt call for internal flow management\n */\nexport type FlowPromptCall = { prompt: string; args: Record<string, unknown> };\n\n/**\n * Flow call (tool or prompt)\n */\nexport type FlowCall = FlowToolCall | FlowPromptCall;\n\n/**\n * Flow call with retry tracking\n */\nexport type FlowCallWithRetries = FlowCall & {\n retries: number;\n reasons: string[];\n};\n\n/**\n * Tool configuration for a prompt - defines options for when a tool is used\n */\nexport interface ToolConfig {\n name: string;\n initUserMessageProperty?: string; // Property to use as initial user message when tool is called\n includeTextResponse?: boolean; // Include LLM text response in tool result (default: true)\n includeToolCalls?: boolean; // Include tool call summaries in result (default: true)\n includeErrors?: boolean; // Include error details in result (default: true)\n}\n\n/**\n * Prompt configuration - now loaded from TypeScript virtual modules\n */\nexport interface PromptData {\n id: string;\n name: string;\n prompt: string | any[]; // Plain text prompt OR structured array of prompt parts\n system_prompt?: string; // System prompt text (alias for prompt)\n model: string; // Model name (was model_id with UUID)\n model_id?: string; // Deprecated: legacy model UUID\n tool_description: string;\n required_schema: string; // JSON schema (legacy)\n include_chat: boolean;\n include_past_tools: boolean;\n before_tool: string | null;\n after_tool: string | null;\n prompts: string; // JSON array (legacy)\n created_at: number;\n /** @deprecated All prompts are now automatically exposed as tools */\n expose_as_tool?: boolean;\n parallel_tool_calls: boolean;\n tool_choice: \"auto\" | \"none\" | \"required\" | \"function\";\n reasoning_effort: \"low\" | \"medium\" | \"high\" | null;\n reasoning_max_tokens: number | null;\n reasoning_exclude: boolean;\n include_reasoning: boolean;\n\n // New fields from TypeScript config\n _tools?: (string | ToolConfig)[]; // Tool names or configs from definePrompt\n _handoffAgents?: string[]; // Agent names that can be handed off to\n _requiredSchema?: any; // Zod schema for validation (replaces JSON schema)\n}\n\n/**\n * Central state object that flows through execution\n */\nexport interface FlowState {\n // Identity\n threadId: string;\n flowId: string;\n\n // Thread reference\n thread: {\n instance: ThreadInstance; // Reference to the DurableThread instance\n metadata: ThreadMetadata; // Thread metadata from D1\n };\n\n // Configuration\n agentConfig: Agent;\n currentSide: \"a\" | \"b\";\n\n // Prompt configuration (loaded once per execution)\n prompts: {\n sideA: PromptData;\n sideB: PromptData | null; // null for ai_human agents\n };\n prompt: PromptData; // Current active prompt (switches with side)\n\n // Execution tracking\n turnCount: number;\n sideATurnCount: number; // Per-side turn count for max_turns safety limit\n sideBTurnCount: number; // Per-side turn count for max_turns safety limit\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n forcedNextSide?: \"side_a\" | \"side_b\"; // Force a specific side to play next turn\n pendingForceTurn?: \"side_a\" | \"side_b\"; // Deferred force turn (applied after tool queue completes)\n abortController?: AbortController; // For user-initiated stop\n\n // Message context\n messageHistory: Message[];\n /**\n * Appends these messages\n */\n extraMessages: Message[];\n\n // Tool execution queue\n sequence: {\n queue: ToolCall[];\n isHandling: boolean;\n };\n\n // Tool execution state (for individual tool calls)\n active: FlowCallWithRetries; // Current tool/prompt being executed\n queue: FlowCall[]; // Queue of pending tool/prompt calls\n\n // Agent handoff tracking\n pendingHandoff?: {\n agentId: string;\n };\n\n // Streaming & telemetry\n stream: StreamManager;\n\n // Runtime context\n context: Record<string, unknown>;\n retryCount: number;\n retryReason?: string;\n\n // Storage\n storage: DurableObjectStorage;\n env: ThreadEnv;\n\n // Real-time broadcasting callbacks (for nested flows)\n emitLog?: (log: unknown) => void;\n emitMessage?: (message: unknown) => void;\n emitMessageChunk?: (messageId: string, chunk: string, depth?: number) => void;\n emitTelemetry?: (event: TelemetryEvent) => void;\n emitEvent?: (type: string, data: unknown) => void;\n\n // Hierarchical tracking\n rootState: FlowState // The root flow state object\n rootMessageId?: string | null; // Root message ID for FK relationships\n parentLogId?: string | null; // Parent log ID for nested prompts\n currentLogId?: string | null; // Current LLM request's log ID\n parentMessageId?: string; // Parent message ID for sub-prompts (used to determine one-shot behavior)\n depth: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n\n // Behavior flags\n pendingMessageId?: string; // Message currently being streamed\n\n // Tool restrictions\n allowedTools?: ToolDefinition[]; // Tools allowed for current prompt\n}\n\n/**\n * Request context for LLM calls\n */\nexport interface RequestContext {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n }>;\n model: string;\n tools?: ToolDefinition[]; // Available tools for this request\n stream?: boolean;\n promptName?: string; // Name of the prompt being executed (if any)\n systemPrompt?: string; // The actual system prompt text\n parentLogId?: string | null; // Parent log ID if this is a nested prompt call\n parallel_tool_calls?: boolean; // Allow parallel tool execution\n tool_choice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } }; // Tool calling strategy\n reasoning?: {\n effort?: \"low\" | \"medium\" | \"high\"; // Reasoning effort level (for OpenAI o-series, Grok)\n max_tokens?: number; // Max reasoning tokens (for Anthropic, Gemini, Qwen)\n exclude?: boolean; // Use reasoning internally but don't return it\n };\n}\n\n/**\n * Tool definition for LLM requests\n */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, any>; // JSON Schema format\n };\n}\n\n/**\n * LLM response\n */\nexport interface LLMResponse {\n id: string;\n model: string;\n content: string | null;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed as regular content)\n reasoning_details?: any[]; // OpenRouter structured reasoning blocks (summary, encrypted, text types)\n tool_calls?: ToolCall[];\n finish_reason: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n // @ts-ignore - OpenRouter non-standard cost field\n cost?: number;\n // @ts-ignore - OpenRouter non-standard provider field (actual provider that handled request)\n provider?: string;\n };\n}\n\n/**\n * LLM response with associated log ID\n * The logId allows tracking which log entry corresponds to this LLM request\n * Useful for linking tool execution errors back to the parent LLM request\n */\nexport interface LLMResponseWithLog {\n response: LLMResponse;\n logId: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n retryPrompt?: string;\n}\n\n/**\n * Tool result\n */\nexport interface ToolResult {\n status: \"success\" | \"error\";\n /**\n * Flattened text representation of the tool output.\n *\n * For tools that return structured MCP-style content (an array of\n * content parts), this will be derived by concatenating all text\n * parts. For legacy tools that returned a plain string `result`,\n * that value is used directly.\n */\n result?: string;\n error?: string;\n stack?: string; // Stack trace for errors\n}\n\n/**\n * Flow execution result\n */\nexport interface FlowResult {\n messages: Message[];\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n turnCount: number;\n stream: ReadableStream<Uint8Array>; // HTTP stream for content\n}\n\n/**\n * Log emitter callback for DurableObject real-time updates\n */\nexport type EmitLog = (log: Partial<LogData> & { id: string }) => void;\n\n/**\n * Model fallback from D1\n */\nexport interface ModelFallback {\n parent_model_id: string;\n fallback_model_id: string;\n idx: number;\n}\n\n/**\n * Telemetry event types\n */\nexport type TelemetryEvent =\n | { type: \"turn_started\"; turn: number; side: \"a\" | \"b\"; timestamp: number }\n | { type: \"turn_completed\"; turn: number; stopped: boolean; timestamp: number }\n | { type: \"llm_request\"; model: string; attempt: number; timestamp: number }\n | {\n type: \"llm_response\";\n tokens: number;\n latency: number;\n timestamp: number;\n }\n | { type: \"validation_failed\"; error: string; timestamp: number }\n | {\n type: \"fallback_triggered\";\n from: string;\n to: string;\n timestamp: number;\n }\n | { type: \"tool_started\"; tool: string; timestamp: number }\n | {\n type: \"tool_completed\";\n tool: string;\n status: string;\n timestamp: number;\n }\n | {\n type: \"stopped\";\n reason: string;\n side: \"a\" | \"b\";\n timestamp: number;\n }\n | {\n type: \"stopped_by_user\";\n timestamp: number;\n };\n\n/**\n * Log data for telemetry table\n */\nexport interface LogData {\n id: string;\n message_id: string;\n\n // Request details\n provider: string;\n model: string;\n model_name?: string; // Human-readable model name\n endpoint?: string;\n request_body?: string;\n request_headers?: string;\n\n // Response details\n response_body?: string;\n response_headers?: string;\n status_code?: number;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed)\n\n // Token usage\n input_tokens?: number;\n cached_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n total_tokens?: number;\n\n // Performance metrics\n latency_ms?: number;\n time_to_first_token_ms?: number;\n\n // Result metadata\n finish_reason?: string;\n error?: string;\n error_type?: string;\n\n // Cost tracking\n cost_input?: number;\n cost_output?: number;\n cost_total?: number;\n\n // Context\n message_history_length?: number;\n tools_available?: number;\n prompt_name?: string;\n tools_called?: string;\n\n // Enhanced context (migration 003)\n parent_log_id?: string | null; // Parent log ID for prompt chains\n tools_schema?: string | null; // JSON schema of tools available\n message_history?: string | null; // Snapshot of message history\n system_prompt?: string | null; // System prompt sent with request\n is_complete?: boolean; // Whether log has all data\n\n // Error and retry tracking (migration 007)\n errors?: string | null; // JSON array of errors [{message, type, timestamp}]\n retry_of_log_id?: string | null; // Log ID this is a retry of\n\n created_at: number;\n}\n\n/**\n * Tool type identifier\n */\nexport type ToolType = \"native\" | \"prompt\" | \"agent\";\n\n/**\n * Constants\n */\nexport const MAX_TURNS = 250;\nexport const MAX_RETRIES_PER_MODEL = 2;\nexport const TIMESTAMP_MULTIPLIER = 1000; // Convert ms to microseconds\nexport const STREAM_COOLDOWN = 200; // ms\nexport const BACKOFF_BASE = 1000; // ms\n","import { STREAM_COOLDOWN } from \"./types\";\n\n/**\n * Callback function to execute before stream closes\n */\nexport type BeforeClose = () => Promise<void> | void;\n\n/**\n * Stream channel\n */\ninterface Channel {\n id: number;\n label: string;\n active: boolean;\n}\n\n/**\n * Manages HTTP streaming of content chunks.\n * WebSocket telemetry is handled separately by DurableThread.\n * Inspired by bod.coach MultiplexedStream pattern.\n */\nexport class StreamManager {\n /**\n * HTTP ReadableStream controller for content\n */\n private httpController?: ReadableStreamDefaultController<Uint8Array>;\n\n /**\n * HTTP ReadableStream for content chunks\n */\n public httpStream: ReadableStream<Uint8Array>;\n\n /**\n * Active channels\n */\n public activeChannels: number = 0;\n\n /**\n * Before close hooks\n */\n private beforeCloseHooks: BeforeClose[] = [];\n\n /**\n * Prevent automatic close\n */\n public preventClose: boolean = false;\n\n /**\n * Text encoder for streams\n */\n private encoder: TextEncoder;\n\n /**\n * Promise that resolves when stream is completely finished\n */\n public then: Promise<void>;\n\n /**\n * Resolver for the then promise\n */\n private resolver: () => void = () => {};\n\n /**\n * Whether the stream has been closed\n */\n private closed: boolean = false;\n\n constructor(beforeClose: BeforeClose | BeforeClose[] = []) {\n this.encoder = new TextEncoder();\n\n // Create HTTP stream\n this.httpStream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n this.httpController = controller;\n },\n });\n\n // Setup before close hooks\n this.beforeCloseHooks = Array.isArray(beforeClose)\n ? beforeClose\n : [beforeClose];\n\n // Create promise for stream completion\n this.then = new Promise((resolve) => {\n this.resolver = resolve;\n });\n }\n\n /**\n * Send content chunk to HTTP stream\n */\n sendContent(chunk: string): void {\n if (!this.httpController || this.closed) {\n console.warn(\"Cannot send content: stream is closed or not initialized\");\n return;\n }\n\n try {\n this.httpController.enqueue(this.encoder.encode(chunk));\n } catch (error) {\n console.error(\"Error sending content chunk:\", error);\n }\n }\n\n /**\n * Add a before close hook\n */\n addBeforeClose(hook: BeforeClose | BeforeClose[]): void {\n this.beforeCloseHooks.push(...(Array.isArray(hook) ? hook : [hook]));\n }\n\n /**\n * Wait for a callback to complete before allowing stream to close\n */\n async waitFor(callback: () => Promise<void> | void): Promise<void> {\n this.activeChannels++;\n\n try {\n await callback();\n } catch (error) {\n console.error(\"Error in waitFor callback:\", error);\n throw error;\n } finally {\n this.closeChannel();\n }\n }\n\n /**\n * Close a channel (decrement active channel count)\n */\n closeChannel(): void {\n this.activeChannels--;\n\n if (this.activeChannels <= 0 && !this.preventClose && !this.closed) {\n // Small delay to allow any final operations\n setTimeout(async () => {\n if (this.activeChannels <= 0 && !this.closed) {\n await this.close();\n }\n }, STREAM_COOLDOWN);\n }\n }\n\n /**\n * Close all streams and connections\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n try {\n // Run before close hooks\n await Promise.all(\n this.beforeCloseHooks.map(async (hook) => {\n try {\n await hook();\n } catch (error) {\n console.error(\"Error in beforeClose hook:\", error);\n }\n })\n );\n\n // Close HTTP stream\n if (this.httpController) {\n try {\n this.httpController.close();\n } catch (error) {\n console.error(\"Error closing HTTP stream:\", error);\n }\n }\n\n // Resolve the completion promise\n this.resolver();\n } catch (error) {\n console.error(\"Error during stream close:\", error);\n this.resolver();\n }\n }\n\n /**\n * Force close the stream immediately\n */\n forceClose(): void {\n this.preventClose = false;\n this.activeChannels = 0;\n this.close();\n }\n}\n","import type { FlowState, ToolDefinition, LLMResponse, RequestContext } from \"../types\";\n\n/**\n * Provider configuration from database\n */\nexport interface ProviderConfig {\n name: string;\n sdk: string; // 'openai', 'anthropic', 'openrouter', 'custom'\n api_key: string;\n}\n\n/**\n * Model configuration from database\n */\nexport interface ModelConfig {\n id: string;\n name: string;\n provider_id: string;\n included_providers: string; // JSON array\n input_price: number | null;\n output_price: number | null;\n cached_price: number | null;\n}\n\n/**\n * Base interface that all providers must implement\n */\nexport interface LLMProvider {\n /**\n * Provider identifier (e.g., 'openai', 'openrouter', 'anthropic')\n */\n readonly name: string;\n\n /**\n * Make a chat completion request to the provider\n *\n * @param modelId - The model identifier\n * @param context - Request context with messages and tools\n * @param state - Current flow state for streaming\n * @param logId - Log ID for updating request body before API call\n * @param signal - Optional abort signal for cancelling in-flight requests\n * @param modelConfig - Optional model configuration with provider routing options\n * @returns LLM response with content, tool calls, and usage\n */\n chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n /**\n * Test if this provider can handle a given model\n *\n * @param modelId - The model identifier\n * @returns true if this provider supports the model\n */\n supportsModel(modelId: string): boolean;\n}\n\n/**\n * Factory function type for creating provider instances\n */\nexport type ProviderFactory = (config: ProviderConfig) => LLMProvider;\n\n/**\n * Registry of available providers\n */\nexport interface ProviderRegistry {\n /**\n * Register a new provider factory\n */\n register(sdk: string, factory: ProviderFactory): void;\n\n /**\n * Get a provider instance for a model\n * @param modelName - The model name (from TypeScript config or D1)\n * @param env - Environment bindings\n * @param thread - Optional thread instance for loading model from virtual modules\n */\n getProvider(\n modelName: string,\n env: Env,\n thread?: import(\"../types\").ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>;\n\n /**\n * Check if a provider is registered\n */\n hasProvider(sdk: string): boolean;\n}\n","import type { LLMProvider, ProviderConfig, ModelConfig } from \"./types\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\n\n/**\n * Base class for LLM providers with common functionality\n */\nexport abstract class BaseProvider implements LLMProvider {\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n }\n\n abstract get name(): string;\n\n abstract chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n abstract supportsModel(modelId: string): boolean;\n\n /**\n * Helper: Stream content chunks to the client\n */\n protected streamContent(chunk: string, state: FlowState): void {\n if (chunk) {\n state.stream.sendContent(chunk);\n }\n }\n\n /**\n * Helper: Broadcast content chunk via WebSocket for real-time UI updates\n * Does NOT write to database - only broadcasts to connected clients\n */\n protected streamContentChunk(chunk: string, state: FlowState): void {\n if (!chunk) return;\n\n const emitMessageChunk = (state as any).emitMessageChunk as\n ((messageId: string, chunk: string) => void) | undefined;\n const pendingMessageId = (state as any).pendingMessageId as string | undefined;\n\n if (emitMessageChunk && pendingMessageId) {\n emitMessageChunk(pendingMessageId, chunk);\n }\n }\n\n /**\n * Helper: Accumulate tool call deltas\n * OpenAI streams tool calls incrementally, need to accumulate\n */\n protected accumulateToolCall(\n toolCallsMap: Map<number, Partial<ToolCall>>,\n index: number,\n delta: any\n ): void {\n if (!toolCallsMap.has(index)) {\n toolCallsMap.set(index, {\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n\n const toolCall = toolCallsMap.get(index)!;\n\n if (delta.id) {\n toolCall.id = delta.id;\n }\n\n if (delta.type) {\n toolCall.type = delta.type as \"function\";\n }\n\n if (delta.function) {\n if (delta.function.name) {\n toolCall.function!.name += delta.function.name;\n }\n if (delta.function.arguments) {\n toolCall.function!.arguments += delta.function.arguments;\n }\n }\n }\n\n /**\n * Helper: Convert accumulated tool calls to final array\n */\n protected finalizeToolCalls(\n toolCallsMap: Map<number, Partial<ToolCall>>\n ): ToolCall[] {\n const toolCalls: ToolCall[] = [];\n\n for (const [_index, partialCall] of Array.from(toolCallsMap.entries()).sort(\n (a, b) => a[0] - b[0]\n )) {\n if (partialCall.id && partialCall.function?.name) {\n toolCalls.push(partialCall as ToolCall);\n }\n }\n\n return toolCalls;\n }\n\n /**\n * Helper: Update log with actual request body before making API call\n * This ensures we have the complete request even if the call fails\n */\n protected async logActualRequest(\n request: any,\n logId: string,\n state: FlowState\n ): Promise<void> {\n try {\n const requestBody = JSON.stringify(request);\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `UPDATE logs SET request_body = ?1 WHERE id = ?2`,\n requestBody,\n logId\n );\n });\n\n // Broadcast updated log to WebSocket\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: logId,\n data: {\n id: logId,\n request_body: requestBody,\n },\n });\n }\n } catch (error) {\n // Non-fatal - logging is best-effort\n console.error(`[${this.name}] Failed to log actual request:`, error);\n }\n }\n\n /**\n * Helper: Log provider errors\n */\n protected async logError(\n state: FlowState,\n error: Error | unknown,\n context: string\n ): Promise<void> {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n console.error(`[${this.name}] ${context}:`, errorMessage);\n\n try {\n const id = crypto.randomUUID();\n const log = {\n id,\n message_id: (state as any).rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.name,\n model: context,\n error: `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n error_type: \"provider_error\",\n created_at: Date.now() * 1000,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n log.id,\n log.message_id,\n log.provider,\n log.model,\n log.error,\n log.error_type,\n log.created_at\n );\n });\n\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: log.id,\n data: log,\n });\n }\n } catch (logError) {\n console.error(`[${this.name}] Failed to log error:`, logError);\n }\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\n\n/**\n * OpenAI provider implementation\n * Supports: gpt-4, gpt-4-turbo, gpt-3.5-turbo, o1, o3, etc.\n */\nexport class OpenAIProvider extends BaseProvider {\n get name(): string {\n return \"openai\";\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith(\"gpt-\") ||\n modelId.startsWith(\"o1-\") ||\n modelId.startsWith(\"o3-\")\n );\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import to avoid bundling if not used\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n });\n\n // Prepare request\n const request: any = {\n model: modelId,\n messages: context.messages,\n stream: true,\n };\n\n // Add tools if provided\n if (context.tools && context.tools.length > 0) {\n request.tools = context.tools;\n\n // Add parallel_tool_calls if specified\n if (context.parallel_tool_calls !== undefined) {\n request.parallel_tool_calls = context.parallel_tool_calls;\n }\n\n // Add tool_choice if specified\n if (context.tool_choice) {\n request.tool_choice = context.tool_choice;\n }\n }\n\n // Add reasoning configuration if present (implicit enable)\n // OpenAI o-series models use max_completion_tokens\n if (context.reasoning?.max_tokens) {\n request.max_completion_tokens = context.reasoning.max_tokens;\n }\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n const stream = await client.chat.completions.create(request, {\n signal,\n });\n\n // Process stream\n let content = \"\";\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture usage (only in last chunk)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n };\n }\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n tool_calls: toolCalls,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n };\n } catch (error) {\n await this.logError(state, error, `OpenAI chat completion: ${modelId}`);\n throw error;\n }\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\n\n/**\n * OpenRouter provider implementation\n * OpenRouter uses OpenAI-compatible API but routes to multiple providers\n */\nexport class OpenRouterProvider extends BaseProvider {\n get name(): string {\n return \"openrouter\";\n }\n\n supportsModel(modelId: string): boolean {\n // OpenRouter supports a wide variety of models\n // We identify by the provider SDK being 'openrouter'\n // Actual model support is determined by the database configuration\n return true;\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import OpenAI SDK (OpenRouter is compatible)\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n baseURL: \"https://openrouter.ai/api/v1\",\n });\n\n // Prepare request\n const request: any = {\n model: modelId,\n messages: context.messages,\n stream: true,\n // Enable usage accounting to get cost information\n // https://openrouter.ai/docs/use-cases/usage-accounting\n usage: {\n include: true,\n },\n };\n\n // Add provider routing if specified in model config\n // https://openrouter.ai/docs/features/provider-routing\n if (modelConfig?.included_providers) {\n try {\n const providers = JSON.parse(modelConfig.included_providers);\n if (Array.isArray(providers) && providers.length > 0) {\n // Use 'only' to exclusively use specified providers\n request.provider = {\n only: providers,\n };\n }\n } catch (error) {\n console.error(\"[OpenRouter] Failed to parse included_providers:\", error);\n }\n }\n\n // Add tools if provided\n if (context.tools && context.tools.length > 0) {\n request.tools = context.tools;\n\n // Add parallel_tool_calls if specified\n if (context.parallel_tool_calls !== undefined) {\n request.parallel_tool_calls = context.parallel_tool_calls;\n }\n\n // Add tool_choice if specified\n if (context.tool_choice) {\n request.tool_choice = context.tool_choice;\n }\n }\n\n // Add reasoning configuration if present (implicit enable)\n // OpenRouter uses unified reasoning parameter\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (context.reasoning) {\n request.reasoning = {};\n\n // Add effort level if specified (for OpenAI o-series, Grok)\n if (context.reasoning.effort) {\n request.reasoning.effort = context.reasoning.effort;\n }\n\n // Add max_tokens if specified (for Anthropic, Gemini, Qwen)\n if (context.reasoning.max_tokens) {\n request.reasoning.max_tokens = context.reasoning.max_tokens;\n }\n\n // Add exclude flag if specified\n if (context.reasoning.exclude) {\n request.reasoning.exclude = true;\n }\n }\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n const stream = await client.chat.completions.create(request, {\n signal,\n });\n\n // Process stream - aggregate all important information from chunks\n let content = \"\";\n let reasoning_content = \"\"; // Store reasoning separately\n let reasoning_details: any[] = []; // Store structured reasoning blocks\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n let cost: number | undefined;\n let actualProvider: string | undefined;\n const allChunks: any[] = []; // Store all chunks for aggregate response body\n\n try {\n for await (const chunk of stream) {\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n // Store chunk for aggregate response\n allChunks.push(chunk);\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate regular content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // GPT-5/o1 returns reasoning in a separate field - DON'T stream it or mix it with content\n if ((choice.delta as any)?.reasoning) {\n const reasoning = (choice.delta as any).reasoning;\n reasoning_content += reasoning;\n // DO NOT stream reasoning content to user\n }\n\n // Capture reasoning_details from OpenRouter\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if ((choice.delta as any)?.reasoning_details) {\n const details = (choice.delta as any).reasoning_details;\n // Separate text chunks from structured reasoning\n if (Array.isArray(details)) {\n for (const item of details) {\n if (item.type === \"reasoning.text\") {\n // Accumulate text directly into reasoning_content\n reasoning_content += item.text || \"\";\n } else {\n // Store non-text reasoning (summaries, encrypted, etc.)\n reasoning_details.push(item);\n }\n }\n }\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture actual provider from chunk root (OpenRouter-specific field)\n if ((chunk as any).provider !== undefined) {\n actualProvider = (chunk as any).provider;\n }\n\n // Capture usage from ANY chunk (can appear in any chunk, not just the last)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n completion_tokens_details: (chunk.usage as any).completion_tokens_details\n ? {\n reasoning_tokens:\n (chunk.usage as any).completion_tokens_details.reasoning_tokens || 0,\n }\n : undefined,\n };\n\n // Cost can appear in ANY chunk - capture it whenever we see it\n // For BYOK (Bring Your Own Key) models, cost is 0 but actual cost is in cost_details\n if ((chunk.usage as any).is_byok && (chunk.usage as any).cost_details?.upstream_inference_cost !== undefined) {\n cost = (chunk.usage as any).cost_details.upstream_inference_cost;\n } else if ((chunk.usage as any).cost !== undefined) {\n cost = (chunk.usage as any).cost;\n }\n }\n }\n } catch (streamError: any) {\n // Enhanced error logging for stream errors\n console.error(`[openrouter] Stream error for model ${modelId}:`, {\n error: streamError,\n code: streamError?.code,\n status: streamError?.status,\n message: streamError?.message,\n type: streamError?.type,\n });\n throw new Error(\n `Stream error: ${streamError?.message || 'Unknown error'} (code: ${streamError?.code || 'unknown'})`\n );\n }\n\n // Add captured cost and provider to usage\n if (usage && cost !== undefined) {\n (usage as any).cost = cost;\n }\n if (usage && actualProvider !== undefined) {\n (usage as any).provider = actualProvider;\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Build aggregate response body (similar to standard OpenAI response format)\n const aggregateResponse = {\n id: responseId,\n object: \"chat.completion\",\n created: allChunks[0]?.created || Math.floor(Date.now() / 1000),\n model: modelId,\n provider: allChunks.find((c: any) => c.provider)?.provider,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: content || null,\n tool_calls: toolCalls || undefined,\n },\n finish_reason: finishReason || \"stop\",\n },\n ],\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Include all chunks for debugging/auditing\n _raw_chunks: allChunks.length,\n };\n\n // Text reasoning is already accumulated in reasoning_content\n // Non-text reasoning (summaries, encrypted) is in reasoning_details\n let finalReasoningContent = reasoning_content || null;\n let finalReasoningDetails: any[] | undefined = reasoning_details.length > 0 ? reasoning_details : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n reasoning_content: finalReasoningContent,\n reasoning_details: finalReasoningDetails,\n tool_calls: toolCalls,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Store aggregate response for logging\n _aggregate_response: aggregateResponse,\n } as LLMResponse;\n } catch (error) {\n // Don't log here - LLMRequest handles error logging\n // to avoid duplicate log entries\n throw error;\n }\n }\n}\n","import type {\n LLMProvider,\n ProviderFactory,\n ProviderRegistry as IProviderRegistry,\n ProviderConfig,\n ModelConfig,\n} from \"./types\";\nimport type { ThreadInstance } from \"../types\";\nimport { OpenAIProvider } from \"./OpenAIProvider\";\nimport { OpenRouterProvider } from \"./OpenRouterProvider\";\n\n/**\n * Provider registry implementation\n * Manages provider factories and model-to-provider mapping\n *\n * Now loads model configs from TypeScript virtual modules and\n * provider API keys from DurableAgentBuilder.\n */\nclass ProviderRegistryImpl implements IProviderRegistry {\n private factories = new Map<string, ProviderFactory>();\n private providerCache = new Map<string, { provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>();\n\n constructor() {\n // Register built-in providers\n this.registerBuiltInProviders();\n }\n\n private registerBuiltInProviders(): void {\n // OpenAI provider\n this.register(\"openai\", (config) => new OpenAIProvider(config));\n\n // OpenRouter provider\n this.register(\"openrouter\", (config) => new OpenRouterProvider(config));\n }\n\n register(sdk: string, factory: ProviderFactory): void {\n this.factories.set(sdk.toLowerCase(), factory);\n }\n\n hasProvider(sdk: string): boolean {\n return this.factories.has(sdk.toLowerCase());\n }\n\n /**\n * Get provider for a model.\n *\n * @param modelName - The model name (from TypeScript config)\n * @param env - Environment bindings\n * @param thread - Thread instance for loading model from virtual modules\n */\n async getProvider(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }> {\n // Check cache first\n const cacheKey = `${modelName}`;\n const cachedData = this.providerCache.get(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n // Get model configuration from TypeScript virtual modules\n const modelConfig = await this.getModelConfig(modelName, env, thread);\n if (!modelConfig) {\n throw new Error(`Model not found: ${modelName}`);\n }\n\n // Get provider configuration from DurableAgentBuilder or environment\n const providerConfig = await this.getProviderConfig(\n modelConfig.provider_id,\n env\n );\n if (!providerConfig) {\n throw new Error(`Provider not found: ${modelConfig.provider_id}`);\n }\n\n // Get factory for this provider SDK\n const factory = this.factories.get(providerConfig.sdk.toLowerCase());\n if (!factory) {\n throw new Error(`No provider registered for SDK: ${providerConfig.sdk}`);\n }\n\n // Create provider instance\n const provider = factory(providerConfig);\n\n // Cache provider with model name and config\n const result = { provider, modelName: modelConfig.name, modelConfig };\n this.providerCache.set(cacheKey, result);\n\n return result;\n }\n\n /**\n * Get model configuration from TypeScript virtual modules\n */\n private async getModelConfig(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<ModelConfig | null> {\n if (!thread) {\n throw new Error(\"Thread instance required for model lookup\");\n }\n\n try {\n const modelDef = await thread.loadModel(modelName);\n if (!modelDef) {\n return null;\n }\n\n // Convert ModelDefinition to ModelConfig format\n return {\n id: modelName, // Use name as ID\n name: modelDef.model, // The actual model ID sent to provider\n provider_id: modelDef.provider, // Provider name\n included_providers: modelDef.includedProviders\n ? JSON.stringify(modelDef.includedProviders)\n : \"[]\",\n input_price: modelDef.inputPrice ?? null,\n output_price: modelDef.outputPrice ?? null,\n cached_price: modelDef.cachedPrice ?? null,\n };\n } catch (error) {\n console.error(\"Error loading model config:\", error);\n throw error;\n }\n }\n\n /**\n * Get provider configuration.\n *\n * Provider API keys come from environment variables.\n */\n private async getProviderConfig(\n providerName: string,\n env: Env\n ): Promise<ProviderConfig | null> {\n // Map provider name to API key environment variable\n const apiKeyEnvVarMap: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n };\n\n // Get API key from environment\n const envVar = apiKeyEnvVarMap[providerName.toLowerCase()];\n if (envVar && (env as any)[envVar]) {\n return {\n name: providerName,\n sdk: providerName, // SDK is same as provider name for built-in providers\n api_key: (env as any)[envVar],\n };\n }\n\n return null;\n }\n\n /**\n * Clear the provider cache\n * Useful for testing or when configurations change\n */\n clearCache(): void {\n this.providerCache.clear();\n }\n}\n\n/**\n * Singleton instance\n */\nexport const ProviderRegistry = new ProviderRegistryImpl();\n","/**\n * Provider system for LLM integrations\n *\n * This module provides a modular, extensible system for integrating\n * different LLM providers (OpenAI, OpenRouter, Anthropic, etc.)\n *\n * ## Architecture\n *\n * - **LLMProvider**: Base interface that all providers must implement\n * - **BaseProvider**: Abstract base class with common functionality\n * - **Concrete Providers**: OpenAIProvider, OpenRouterProvider, etc.\n * - **ProviderRegistry**: Singleton that manages provider instances\n *\n * ## Usage\n *\n * ```typescript\n * // Get provider for a model\n * const provider = await ProviderRegistry.getProvider(modelId, env);\n *\n * // Make a chat completion request\n * const response = await provider.chat(modelId, context, state);\n * ```\n *\n * ## Adding a New Provider\n *\n * 1. Create a new provider class extending BaseProvider\n * 2. Implement the `chat()` and `supportsModel()` methods\n * 3. Register it in ProviderRegistry constructor\n *\n * ```typescript\n * export class CustomProvider extends BaseProvider {\n * get name(): string {\n * return \"custom\";\n * }\n *\n * supportsModel(modelId: string): boolean {\n * return modelId.startsWith(\"custom-\");\n * }\n *\n * async chat(modelId, context, state): Promise<LLMResponse> {\n * // Implementation\n * }\n * }\n *\n * // In ProviderRegistry:\n * this.register(\"custom\", (config) => new CustomProvider(config));\n * ```\n */\n\nexport * from \"./types\";\nexport * from \"./BaseProvider\";\nexport * from \"./OpenAIProvider\";\nexport * from \"./OpenRouterProvider\";\nexport { ProviderRegistry } from \"./ProviderRegistry\";\n","import type {\n RequestContext,\n LLMResponse,\n LLMResponseWithLog,\n FlowState,\n ModelFallback,\n LogData,\n} from \"./types\";\nimport { MAX_RETRIES_PER_MODEL, BACKOFF_BASE, TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Executes LLM requests with smart retry and fallback logic\n */\nexport class LLMRequest {\n /**\n * Execute an LLM request with full retry/fallback logic\n *\n * Retry hierarchy:\n * 1. Try primary model (2x)\n * 2. Try each fallback model (2x each)\n * 3. If all fail, throw terminal error\n *\n * Error classification:\n * - Provider errors (from model call): Retriable with backoff + fallbacks\n * - Code errors (validation, setup): Thrown immediately without retry\n *\n * This applies to ALL prompts (top-level and sub-prompts)\n * Returns both the LLM response and the log ID for tracking\n */\n static async execute(\n context: RequestContext,\n state: FlowState\n ): Promise<LLMResponseWithLog> {\n const startTime = Date.now();\n let lastFailedLogId: string | undefined;\n\n // Try primary model\n try {\n return await this.tryModel(context, state, context.model, startTime, undefined);\n } catch (primaryError) {\n console.error(`Primary model ${context.model} failed:`, primaryError);\n\n // Get the log ID from the error (set by tryModel)\n lastFailedLogId = (primaryError as any)?._lastLogId;\n\n // Send fallback telemetry\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: \"fetching_fallbacks\",\n timestamp: Date.now(),\n });\n }\n\n // Try fallback models\n const fallbacks = await this.getFallbacks(context.model, state);\n\n for (const fallback of fallbacks) {\n try {\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: fallback.fallback_model_id,\n timestamp: Date.now(),\n });\n\n // Pass lastFailedLogId so fallback attempts are linked as retries\n return await this.tryModel(\n context,\n state,\n fallback.fallback_model_id,\n startTime,\n lastFailedLogId\n );\n } catch (fallbackError) {\n console.error(\n `Fallback model ${fallback.fallback_model_id} failed:`,\n fallbackError\n );\n\n // Get the log ID from this fallback attempt\n lastFailedLogId = (fallbackError as any)?._lastLogId;\n\n continue;\n }\n }\n\n // All retries exhausted\n const exhaustionError = new Error(\n `All retry attempts exhausted for model ${context.model} and ${fallbacks.length} fallbacks`\n );\n\n // Log final exhaustion (this is a new error so won't be deduplicated)\n await this.logError(\n state,\n exhaustionError,\n \"all_retries_exhausted\",\n context.model,\n startTime\n );\n\n throw exhaustionError;\n }\n\n /**\n * Try a specific model with retries and validation\n * @param initialParentLogId - Log ID from previous attempt (for linking fallbacks as retries)\n */\n private static async tryModel(\n context: RequestContext,\n state: FlowState,\n modelId: string,\n startTime: number,\n initialParentLogId?: string\n ): Promise<LLMResponseWithLog> {\n let attempts = 0;\n let logId: string | undefined;\n let previousLogId: string | undefined = initialParentLogId; // Track previous attempt for retry linking\n\n while (attempts < MAX_RETRIES_PER_MODEL) {\n attempts++;\n\n try {\n // Log request details (non-blocking) and get log ID\n // Pass previousLogId for retry tracking (includes fallback linking)\n logId = await this.logRequest(state, modelId, context, previousLogId);\n\n // Send telemetry for this attempt\n state.emitTelemetry?.({\n type: \"llm_request\",\n model: modelId,\n attempt: attempts,\n timestamp: Date.now(),\n });\n\n // Make the actual LLM call\n const response = await this.callModel(modelId, context, state, logId);\n\n // Success! Update log with response data\n await this.logSuccess(response, state, modelId, startTime, context, logId);\n\n state.emitTelemetry?.({\n type: \"llm_response\",\n tokens: response.usage.total_tokens,\n latency: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n return { response, logId };\n } catch (error) {\n console.error(\n `Error calling ${modelId} (attempt ${attempts}):`,\n error\n );\n\n // Log API error - attach to existing log if available\n await this.logError(\n state,\n error,\n \"api_error\",\n modelId,\n startTime,\n logId\n );\n\n // Network or API error - retry with backoff\n if (attempts < MAX_RETRIES_PER_MODEL) {\n const backoffMs = BACKOFF_BASE * Math.pow(2, attempts - 1);\n await this.sleep(backoffMs);\n // Save current logId as previous for retry tracking\n previousLogId = logId;\n logId = undefined;\n } else {\n // Last attempt failed, attach log ID to error for execute() to retrieve\n if (error && typeof error === 'object') {\n (error as any)._lastLogId = logId;\n }\n throw error;\n }\n }\n }\n\n const error = new Error(\n `Model ${modelId} failed validation after ${MAX_RETRIES_PER_MODEL} attempts`\n ) as any;\n error._lastLogId = logId;\n throw error;\n }\n\n /**\n * Log the outbound request details with full context\n * Returns the log ID for later updating\n */\n private static async logRequest(\n state: FlowState,\n modelId: string,\n context: RequestContext,\n retryOfLogId?: string\n ): Promise<string> {\n try {\n const id = crypto.randomUUID();\n\n // Get model name from TypeScript config\n let modelName: string | null = null;\n try {\n const modelDef = await state.thread.instance.loadModel(modelId);\n if (modelDef) {\n modelName = modelDef.model; // The actual model ID sent to provider\n }\n } catch (err) {\n console.error(\"Failed to fetch model name:\", err);\n }\n\n\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || crypto.randomUUID(),\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n model_name: modelName,\n endpoint: \"chat.completions\",\n request_body: JSON.stringify({\n model: modelName || modelId, // Use actual model name sent to API, fallback to ID\n messages: context.messages,\n tools: context.tools,\n stream: context.stream ?? true,\n }),\n tools_available: context.tools ? context.tools.length : 0,\n message_history_length: context.messages.length,\n prompt_name: context.promptName || null,\n parent_log_id: context.parentLogId || null,\n retry_of_log_id: retryOfLogId || null,\n tools_schema: context.tools ? JSON.stringify(context.tools) : null,\n system_prompt: context.systemPrompt || null,\n is_complete: false, // Incomplete until response received\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model, model_name, endpoint,\n request_body, tools_available, message_history_length, prompt_name,\n parent_log_id, retry_of_log_id, tools_schema, system_prompt, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.model_name,\n logData.endpoint,\n logData.request_body,\n logData.tools_available,\n logData.message_history_length,\n logData.prompt_name,\n logData.parent_log_id,\n logData.retry_of_log_id,\n logData.tools_schema,\n logData.system_prompt,\n logData.is_complete ? 1 : 0,\n logData.created_at\n );\n });\n\n // Broadcast partial log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n return id;\n } catch (err) {\n console.error(\"Failed to log request (non-fatal):\", err);\n return crypto.randomUUID(); // Return a dummy ID\n }\n }\n\n /**\n * Call the LLM model using the provider system\n */\n private static async callModel(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string\n ): Promise<LLMResponse> {\n // Import provider registry\n const { ProviderRegistry } = await import(\"./providers\");\n\n // Get provider, model name, and model config for this model\n // Pass thread instance for loading model from TypeScript virtual modules\n const { provider, modelName, modelConfig } = await ProviderRegistry.getProvider(\n modelId,\n state.env,\n state.thread.instance\n );\n\n // Make the chat completion request (use modelName, not modelId)\n // Pass modelConfig so provider can access routing options (e.g., included_providers for OpenRouter)\n // Wrap in waitFor() to hold a channel open during streaming\n // This prevents the stream from auto-closing while chunks are being received\n let response: LLMResponse | undefined;\n await (state.stream as any).waitFor(async () => {\n response = await provider.chat(\n modelName,\n context,\n state,\n logId,\n state.abortController?.signal,\n modelConfig\n );\n });\n\n if (!response) {\n throw new Error(\"Provider chat returned undefined\");\n }\n\n return response;\n }\n\n /**\n * Get fallback models from TypeScript model definition\n */\n private static async getFallbacks(\n modelName: string,\n state: FlowState\n ): Promise<ModelFallback[]> {\n try {\n const modelDef = await state.thread.instance.loadModel(modelName);\n if (modelDef && modelDef.fallbacks && modelDef.fallbacks.length > 0) {\n // Convert fallbacks array to ModelFallback format\n return modelDef.fallbacks.map((fallbackName: string, idx: number) => ({\n parent_model_id: modelName,\n fallback_model_id: fallbackName,\n idx,\n }));\n }\n return [];\n } catch (error) {\n console.error(\"Error fetching fallbacks:\", error);\n return [];\n }\n }\n\n /**\n * Update log with successful response data (best-effort, non-blocking)\n */\n private static async logSuccess(\n response: LLMResponse,\n state: FlowState,\n modelId: string,\n startTime: number,\n context: RequestContext | undefined,\n logId: string\n ): Promise<void> {\n try {\n // Extract tools called from response\n const toolsCalled = response.tool_calls\n ? JSON.stringify(response.tool_calls.map((tc) => tc.function.name))\n : null;\n\n // Get cost directly from provider (e.g., OpenRouter with usage accounting enabled)\n const cost_total: number | null = response.usage.cost\n ? parseFloat(response.usage.cost as any)\n : null;\n\n // Get actual provider from usage (e.g., OpenRouter returns the actual provider that handled the request)\n const actualProvider: string | null = (response.usage as any).provider || null;\n\n // Use aggregate response if available, otherwise use the standard response\n const responseBody = (response as any)._aggregate_response\n ? JSON.stringify((response as any)._aggregate_response)\n : JSON.stringify(response);\n\n const logData: Partial<LogData> & { id: string } = {\n id: logId,\n response_body: responseBody,\n input_tokens: response.usage.prompt_tokens,\n cached_tokens: response.usage.prompt_tokens_details?.cached_tokens || 0,\n output_tokens: response.usage.completion_tokens,\n reasoning_tokens: response.usage.completion_tokens_details?.reasoning_tokens || 0,\n total_tokens: response.usage.total_tokens,\n latency_ms: Date.now() - startTime,\n finish_reason: response.finish_reason,\n tools_called: toolsCalled,\n cost_total,\n provider: actualProvider, // Update provider with actual value if available\n is_complete: true, // Now complete\n reasoning_content: response.reasoning_content || null, // Store reasoning separately\n };\n\n // Update the existing log record\n await (state.stream as any).waitFor(async () => {\n // Build SQL conditionally based on whether we have a provider update\n if (actualProvider !== null) {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12,\n provider = ?13\n WHERE id = ?14\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n actualProvider,\n logId\n );\n } else {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12\n WHERE id = ?13\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n logId\n );\n }\n });\n\n // Broadcast updated log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n } catch (error) {\n console.error(\"Failed to update log with response (non-fatal):\", error);\n }\n }\n\n /**\n * Extract provider name from model ID\n */\n private static getProviderFromModel(modelId: string): string {\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\")) {\n return \"openai\";\n }\n if (modelId.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (modelId.startsWith(\"gemini-\")) {\n return \"google\";\n }\n return \"unknown\";\n }\n\n /**\n * Sleep utility for backoff\n */\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Attaches log ID to error object to prevent duplicate logging\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n modelId: string,\n startTime: number,\n existingLogId?: string\n ): Promise<string | undefined> {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Capture full error object including any metadata\n let errorDetails = \"\";\n const errorObj = error as any;\n\n // For OpenAI/OpenRouter errors, capture the complete error structure\n if (errorObj && typeof errorObj === \"object\") {\n // Check for common error structures\n const relevantFields = [\n \"error\", // OpenRouter wraps errors here\n \"code\", // Error code\n \"status\", // HTTP status\n \"metadata\", // OpenRouter metadata\n \"type\", // Error type\n \"param\", // Parameter that caused error\n \"user_id\", // User context\n \"response\", // Raw response\n ];\n\n const metadata: Record<string, any> = {};\n for (const field of relevantFields) {\n if (field in errorObj && errorObj[field] !== undefined) {\n metadata[field] = errorObj[field];\n }\n }\n\n if (Object.keys(metadata).length > 0) {\n errorDetails = `\\n\\nError Details:\\n${JSON.stringify(metadata, null, 2)}`;\n }\n }\n\n const fullError = `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}${errorDetails}`;\n\n // Check if this error has already been logged\n const trackedLogId = existingLogId || errorObj?._loggedId;\n\n if (trackedLogId) {\n // Update existing log entry - append error to errors array\n await (state.stream as any).waitFor(async () => {\n // First, get the current errors array\n const result = await state.storage.sql.exec<{ errors: string | null }>(\n `SELECT errors FROM logs WHERE id = ?1`,\n trackedLogId\n );\n const rows = result.toArray();\n const currentErrors = rows[0]?.errors;\n\n // Parse existing errors or create new array\n let errorsArray: Array<{message: string, type: string, timestamp: number}> = [];\n if (currentErrors) {\n try {\n errorsArray = JSON.parse(currentErrors);\n } catch (e) {\n console.error(\"Failed to parse existing errors array:\", e);\n }\n }\n\n // Append new error\n errorsArray.push({\n message: fullError,\n type: errorType,\n timestamp: Date.now(),\n });\n\n // Update the log with appended error\n await state.storage.sql.exec(\n `\n UPDATE logs SET\n error = ?1,\n error_type = ?2,\n errors = ?3,\n latency_ms = ?4,\n is_complete = ?5\n WHERE id = ?6\n `,\n fullError, // Keep last error in error field for backwards compatibility\n errorType, // Keep last error type\n JSON.stringify(errorsArray), // All errors in array\n Date.now() - startTime,\n 1, // is_complete = true\n trackedLogId\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: trackedLogId,\n data: {\n id: trackedLogId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n },\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = trackedLogId;\n }\n\n return trackedLogId;\n } else {\n // Create new standalone error log (fallback for errors before request log was created)\n const id = crypto.randomUUID();\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n } as any;\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, latency_ms, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.error,\n logData.error_type,\n logData.latency_ms,\n 1,\n logData.created_at\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = id;\n }\n\n return id;\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log LLM error to database:\", logError);\n }\n\n return undefined;\n }\n}\n","import { DurableThread } from \"../durable-objects/DurableThread\";\nimport type {\n FlowState,\n ToolCall,\n ToolResult,\n ToolType,\n Message,\n} from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Executes tools, prompts, and agents sequentially\n * Inspired by bod.coach runSequence pattern\n */\nexport class ToolExecutor {\n /**\n * Execute a sequence of tool calls sequentially\n * No parallel execution - tools run one after another\n */\n static async executeSequence(\n state: FlowState,\n toolCalls: ToolCall[]\n ): Promise<void> {\n // Add all tool calls to the queue\n state.sequence.queue.push(...toolCalls);\n state.sequence.isHandling = true;\n\n while (state.sequence.queue.length > 0) {\n // Check if execution should be stopped before processing each tool call\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n // Clear the queue and exit\n state.sequence.queue = [];\n state.sequence.isHandling = false;\n throw new Error(\"aborted\");\n }\n\n const call = state.sequence.queue.shift()!\n // Generate tool message ID upfront so sub-prompts can use it as parent_id\n const toolMessageId = crypto.randomUUID();\n\n try {\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_started\",\n tool: call.function.name,\n timestamp: Date.now(),\n });\n\n // Validate that this tool is in the allowed tools list\n const validationError = this.validateToolCall(call, state);\n if (validationError) {\n // Tool not allowed - treat as error and continue\n const result: ToolResult = {\n status: \"error\",\n error: validationError,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n\n continue; // Skip to next tool\n }\n\n // Execute the tool (pass toolMessageId for sub-prompts to use as parent_id)\n const result = await this.executeToolCall(call, state, toolMessageId);\n\n // If tool returned an error, log it to database\n if (result.status === \"error\") {\n const error = new Error(result.error || \"Tool execution failed\");\n // Preserve the stack trace from the result if available\n if (result.stack) {\n error.stack = result.stack;\n }\n await this.logError(state, error, call.function.name);\n }\n\n // Run the appropriate hook based on result status\n // Import FlowEngine dynamically to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n const hookResult = result.status === \"success\"\n ? await FlowEngine.runAfterToolCallSuccessHook(state, call, result)\n : await FlowEngine.runAfterToolCallFailureHook(state, call, result);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store tool result as a message (including handoff confirmations)\n // Use the potentially modified result from the hook\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: hookResult.status,\n timestamp: Date.now(),\n });\n } catch (error) {\n console.error(`Error executing tool ${call.function.name}:`, error);\n\n // Log error to database\n await this.logError(state, error, call.function.name);\n\n // Create error result for hook processing\n const errorResult: ToolResult = {\n status: \"error\",\n error: (error as Error).message,\n };\n\n // Run after_tool_call_failure hook\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n const hookResult = await FlowEngine.runAfterToolCallFailureHook(state, call, errorResult);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store error as tool result (use potentially modified result from hook)\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n }\n }\n\n state.sequence.isHandling = false;\n\n // Apply any pending force turn that was deferred during tool execution\n // This allows queueTool + forceTurn to work together properly\n if (state.pendingForceTurn) {\n state.forcedNextSide = state.pendingForceTurn;\n state.pendingForceTurn = undefined;\n }\n }\n\n /**\n * Execute a single tool call\n */\n private static async executeToolCall(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n const toolType = await this.identifyToolType(call, state);\n\n switch (toolType) {\n case \"native\":\n return await this.executeNativeTool(call, state);\n case \"prompt\":\n return await this.executePromptTool(call, state, toolMessageId);\n case \"agent\":\n return await this.executeAgentTool(call, state);\n default:\n throw new Error(`Unknown tool type for: ${call.function.name}`);\n }\n }\n\n /**\n * Validate that a tool call is allowed for the current prompt\n * Returns error message if invalid, null if valid\n */\n private static validateToolCall(\n call: ToolCall,\n state: FlowState\n ): string | null {\n // If no allowed tools list is set, allow all tools (backward compatibility)\n if (!state.allowedTools || call.forceAllow) {\n return null;\n }\n\n // Check if tool is in the allowed list\n const isAllowed = state.allowedTools.some(\n (tool) => tool.function.name === call.function.name\n );\n\n if (!isAllowed) {\n return `Tool \"${call.function.name}\" is not available for this prompt. You can only use tools that were explicitly configured for this prompt.`;\n }\n\n return null;\n }\n\n /**\n * Identify the type of tool (native, prompt, or agent)\n */\n private static async identifyToolType(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolType> {\n const toolName = call.function.name;\n // Check if it's a native tool\n const tools = state.thread.instance.tools();\n if (toolName in tools) {\n return \"native\";\n }\n\n // Check if it's a prompt (all prompts are exposed as tools)\n try {\n const promptDef = await state.thread.instance.loadPrompt(toolName);\n if (promptDef) {\n return \"prompt\";\n }\n } catch {\n // Prompt not found, continue checking\n }\n\n // Check if it's an agent (exposed or in handoff list)\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n // Check by title as well (agents are called by their title in tool calls)\n if (agentDef) {\n if (call.forceAllow) {\n // Just check that an agent by that name exists and is ai_human\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n // Only count exposed or handoff agents\n if (agentDef.exposeAsTool) {\n return \"agent\";\n }\n // Check if it's in current prompt's handoff list\n const handoffAgents = state.prompt._handoffAgents || [];\n if (handoffAgents.includes(toolName)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Agent not found by name, try by title\n }\n\n // Try finding agent by title (agents are often called by title in tool calls)\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n if (agentDef.title === toolName) {\n if (call.forceAllow) {\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n if (agentDef.exposeAsTool) {\n return \"agent\";\n }\n const handoffAgents = state.prompt._handoffAgents || [];\n if (handoffAgents.includes(name)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n /**\n * Execute a native tool from server/tools/\n */\n private static async executeNativeTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get tools from thread instance (user's extended Thread class)\n const tools = state.thread.instance.tools();\n\n // Load the tool\n const toolLoader = tools[call.function.name];\n if (!toolLoader) {\n throw new Error(`Native tool not found: ${call.function.name}`);\n }\n\n const toolModule = await toolLoader();\n const [description, argsSchema, toolFn] = toolModule;\n\n // Parse arguments\n const args: Record<string, any> = JSON.parse(call.function.arguments);\n\n // Validate arguments against tool schema\n if (argsSchema) {\n const validation = argsSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"root\";\n return `[${path}] ${issue.message}`;\n })\n .join(\"; \");\n\n return {\n status: \"error\",\n error: `Tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Update state.active to track current tool execution\n state.active = {\n tool: call.function.name,\n args,\n retries: 0,\n reasons: [],\n };\n\n // Execute the tool with the full FlowState\n const result = argsSchema\n ? await toolFn(state, args)\n : await toolFn(state, {});\n\n // Normalize tool result into internal ToolResult shape\n const status = result.status === \"error\" ? \"error\" : \"success\";\n\n let textResult: string | undefined;\n let errorText: string | undefined;\n\n // Prefer MCP-style content array if present\n const content = (result as any).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (part: any) =>\n part &&\n part.type === \"text\" &&\n typeof part.text === \"string\"\n )\n .map((part: any) => part.text as string);\n\n if (textParts.length > 0) {\n textResult = textParts.join(\"\\n\");\n }\n }\n\n // Fallback to legacy `result` field\n if (!textResult && (result as any).result !== undefined) {\n const raw = (result as any).result;\n textResult =\n typeof raw === \"string\" ? raw : JSON.stringify(raw, null, 2);\n }\n\n // Normalize error text\n if (typeof (result as any).error === \"string\") {\n errorText = (result as any).error;\n }\n\n if (status === \"error\" && !errorText) {\n // If tool marked as error but didn't provide an explicit error string,\n // fall back to the textual result (if any).\n errorText = textResult;\n }\n\n return {\n status,\n result: textResult,\n error: status === \"error\" ? errorText : undefined,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Execute a prompt tool (creates a sub-flow) with retry logic\n * This is essentially chaining another prompt\n * Creates an in-memory sub-flow that executes the prompt and returns the result\n * Note: LLM-level retries with model fallbacks are handled inside FlowEngine/LLMRequest\n */\n private static async executePromptTool(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n // Sub-prompts execute as one-shot calls - no retry logic\n // Errors are returned as tool results for the parent to handle\n return await this.executePromptToolInternal(call, state, toolMessageId);\n }\n\n /**\n * Internal method to execute a prompt tool\n */\n private static async executePromptToolInternal(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n try {\n // Get prompt configuration from TypeScript config\n const promptDef = await state.thread.instance.loadPrompt(call.function.name);\n\n if (!promptDef) {\n throw new Error(`Prompt tool not found: ${call.function.name}`);\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Validate arguments against required schema if present\n if (promptDef.requiredSchema) {\n const validation = promptDef.requiredSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue: any) => `[${issue.path.join('.')}] ${issue.message}`)\n .join('; ');\n return {\n status: \"error\",\n error: `Prompt tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Get parent prompt's tool config for initialization options\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n const initUserMessageProperty = typeof toolConfig === 'object'\n ? toolConfig.initUserMessageProperty\n : null;\n\n // Import FlowEngine dynamically to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine\");\n\n // Create a temporary agent configuration for the prompt\n // Store the prompt name in side_a_agent_prompt - FlowEngine will load and interpolate it\n // Use \"ai_human\" type to prevent side switching - prompts should only execute on side A\n const promptAgent: import(\"./types\").Agent = {\n id: promptDef.name,\n title: promptDef.name,\n type: \"ai_human\", // Prevent side switching - prompts execute only on side A\n created_at: Date.now(),\n\n // Global configuration\n max_session_turns: null,\n\n // Side A configuration (only side used for prompt tools)\n side_a_label: null,\n side_a_agent_prompt: promptDef.name, // Pass prompt name, FlowEngine will load it\n side_a_stop_on_response: true,\n side_a_stop_tool: null,\n side_a_stop_tool_response_property: null,\n side_a_max_turns: null,\n side_a_end_conversation_tool: null,\n\n // Side B configuration (unused for prompt tools)\n side_b_label: null,\n side_b_agent_prompt: null,\n side_b_stop_on_response: true,\n side_b_stop_tool: null,\n side_b_stop_tool_response_property: null,\n side_b_max_turns: null,\n side_b_end_conversation_tool: null,\n };\n\n // Build the user message content based on initialization options\n let userMessageContent: string | undefined;\n if (initUserMessageProperty && args[initUserMessageProperty] !== undefined) {\n // Use the specified property as the user message\n const propertyValue = args[initUserMessageProperty];\n userMessageContent = typeof propertyValue === 'string'\n ? propertyValue\n : JSON.stringify(propertyValue);\n }\n\n\n const extraMessages: Message[] = [...(state.extraMessages || [])];\n if (userMessageContent) {\n extraMessages.push({\n id: crypto.randomUUID(),\n role: \"user\",\n content: userMessageContent,\n created_at: Date.now() * 1000,\n });\n }\n\n // Execute the prompt as a sub-flow\n // IMPORTANT: Child prompt messages should NOT be stored in parent thread\n // Only the tool result should appear in the parent's messages\n // However, we DO want child logs to be stored with parent_log_id\n const parentLogId = state.currentLogId || null;\n const rootMessageIdForChild = state.pendingMessageId || state.rootMessageId || null;\n\n const result = await FlowEngine.execute({\n agentConfig: promptAgent,\n storage: state.storage,\n env: state.env,\n threadId: `${state.threadId}-prompt-${call.id}`,\n thread: state.thread, // Pass through parent thread instance and metadata\n context: {\n ...args, // Pass tool arguments for template interpolation\n // Pass parent tool config for response options\n __parentToolConfig: toolConfig,\n __parentToolName: call.function.name,\n },\n // Mark this as a sub-flow by providing a different flowId\n flowId: `prompt-${call.id}`,\n // Pass emit callbacks so child messages/logs are broadcast\n // This allows tools running in sub-prompts to use injectMessage()\n emitLog: state.emitLog,\n emitMessage: state.emitMessage,\n emitMessageChunk: state.emitMessageChunk,\n // Pass parent log ID for hierarchical log tracking\n parentLogId,\n // Pass root message ID so child logs link to parent's message\n rootMessageId: rootMessageIdForChild,\n // The root state is FlowState object for the root prompt\n rootState: state.rootState,\n // Mark as sub-prompt by providing parent message ID (tool message from parent)\n parentMessageId: toolMessageId,\n // Set depth one level deeper than parent\n depth: state.depth + 1,\n // Additional messages to inject\n extraMessages,\n }, true); // awaitCompletion: true - ensures all sub-prompt DB writes complete before parent continues\n\n // Get tool response options from parent prompt's tool config\n // toolConfig is already loaded above from state.prompt._tools\n let toolResponseOptions = {\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n };\n\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n toolResponseOptions = {\n include_text_response: toolConfig.includeTextResponse ?? true,\n include_tool_calls: toolConfig.includeToolCalls ?? true,\n include_errors: toolConfig.includeErrors ?? true,\n };\n }\n\n // Consume the stream to get the final content\n const reader = result.stream.getReader();\n const decoder = new TextDecoder();\n let textContent = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n textContent += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n // Query child tool messages from database to determine aggregate status\n const childToolMessagesResult = await state.storage.sql.exec(\n `SELECT id, content, tool_status, tool_call_id FROM messages WHERE parent_id = ? AND role = 'tool'`,\n toolMessageId\n );\n const childToolRows = childToolMessagesResult.toArray();\n\n // Determine overall status based on child tool results\n let overallStatus: \"success\" | \"error\" = \"success\";\n if (childToolRows.length > 0) {\n const statuses = childToolRows.map(row => row.tool_status as string);\n const hasError = statuses.some(s => s === \"error\");\n\n // If any child tool failed, the overall status is error\n if (hasError) {\n overallStatus = \"error\";\n }\n }\n\n // Build response based on tool response options\n const responseParts: string[] = [];\n\n // Include text response if enabled\n if (toolResponseOptions.include_text_response && textContent) {\n responseParts.push(textContent);\n }\n\n // Include tool calls and responses based on options\n if (toolResponseOptions.include_tool_calls || toolResponseOptions.include_errors) {\n // Query for child assistant messages (containing tool calls)\n const childAssistantMessagesResult = await state.storage.sql.exec(\n `SELECT id, tool_calls FROM messages WHERE parent_id = ? AND role = 'assistant' AND tool_calls IS NOT NULL`,\n toolMessageId\n );\n const childAssistantRows = childAssistantMessagesResult.toArray();\n\n const toolCallsSummary: string[] = [];\n\n // Add assistant messages with tool calls if enabled\n if (toolResponseOptions.include_tool_calls && childAssistantRows.length > 0) {\n for (const row of childAssistantRows) {\n const toolCalls = JSON.parse(row.tool_calls as string);\n for (const tc of toolCalls) {\n toolCallsSummary.push(\n `Tool Call: ${tc.function.name}(${tc.function.arguments})`\n );\n }\n }\n }\n\n // Add tool responses based on options\n for (const row of childToolRows) {\n const isError = (row.content as string)?.startsWith(\"Error: \");\n\n // Include based on options: errors if include_errors, successes if include_tool_calls\n if ((isError && toolResponseOptions.include_errors) ||\n (!isError && toolResponseOptions.include_tool_calls)) {\n toolCallsSummary.push(`Tool Response: ${row.content}`);\n }\n }\n\n if (toolCallsSummary.length > 0) {\n responseParts.push(\n \"Tool Executions:\\n\" + toolCallsSummary.join(\"\\n\")\n );\n }\n }\n\n const finalResponse = responseParts.length > 0\n ? responseParts.join(\"\\n\\n\")\n : \"Prompt executed successfully\";\n\n return {\n status: overallStatus,\n result: overallStatus === \"success\" ? finalResponse : undefined,\n error: overallStatus === \"error\" ? finalResponse : undefined,\n };\n } catch (error) {\n // Get tool response options from parent prompt's tool config\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n\n let includeErrors = true;\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n includeErrors = toolConfig.includeErrors ?? true;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n\n // Prefix error message with \"Error: \" when include_errors is true\n const formattedError = includeErrors\n ? `Error: ${errorMessage}`\n : \"Error: Tool execution failed\";\n\n return {\n status: \"error\",\n error: formattedError,\n stack: includeErrors ? stackTrace : undefined,\n };\n }\n }\n\n /**\n * Execute an agent tool (creates a new thread OR buffers handoff)\n * - For ai_human agents: buffer handoff for later execution\n * - For dual_ai agents (subagents): throw exception (not yet implemented)\n */\n private static async executeAgentTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get agent configuration from TypeScript config\n // First try to find by name, then by title\n let agentDef: any = null;\n let agentName = call.function.name;\n\n try {\n agentDef = await state.thread.instance.loadAgent(call.function.name);\n } catch {\n // Not found by name, try by title\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const def = await state.thread.instance.loadAgent(name);\n if (def.title === call.function.name) {\n agentDef = def;\n agentName = name;\n break;\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n\n if (!agentDef) {\n throw new Error(`Agent tool not found: ${call.function.name}`);\n }\n\n const agentType = agentDef.type as \"dual_ai\" | \"ai_human\";\n\n // Handle AI + Human agent handoff (buffer for later execution)\n if (agentType === \"ai_human\") {\n // Buffer the handoff - will be executed at turn completion\n // Use agent name (not title) as the identifier\n state.pendingHandoff = {\n agentId: agentName,\n };\n const text = \"Handoff complete\";\n\n // Return handoff confirmation message - will be stored as tool result\n return {\n status: \"success\",\n result: text,\n };\n }\n\n // Handle AI + AI subagent (not yet implemented)\n if (agentType === \"dual_ai\") {\n throw new Error(\n `AI + AI subagents are not yet implemented. Agent \"${call.function.name}\" cannot be called as a subagent.`\n );\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Create a new child thread (new DurableObject)\n const childThreadId = crypto.randomUUID();\n\n // Register child thread in DurableAgentBuilder\n const agentBuilderId = state.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = state.env.AGENT_BUILDER.get(agentBuilderId) as any;\n await agentBuilder.createThread(childThreadId, agentName, null); // No user_id for agent-spawned threads\n\n // Get DurableObject instance for the child thread\n const durableId = state.env.AGENT_BUILDER_THREAD.idFromName(childThreadId);\n const stub = state.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as DurableThread;\n\n // Create initial message with the agent's input\n const initialMessages: Message[] = [\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: typeof args === \"string\" ? args : JSON.stringify(args),\n created_at: Date.now() * 1000,\n },\n ];\n\n // Execute the agent in the new thread via RPC\n const response = await stub.execute(\n childThreadId,\n agentName, // Use agent name instead of UUID\n initialMessages,\n {}\n );\n\n if (!response.ok) {\n throw new Error(\n `Agent execution failed with status ${response.status}: ${await response.text()}`\n );\n }\n\n // Consume the stream to get the final content\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body from agent execution\");\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n content += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n const text = content || \"Agent executed successfully\";\n\n return {\n status: \"success\",\n result: text,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Store tool result as a message in the database\n */\n private static async storeToolResult(\n call: ToolCall,\n result: ToolResult,\n state: FlowState,\n toolMessageId: string\n ): Promise<void> {\n try {\n // Import FlowEngine to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n // Run before_store_tool_result hook to allow modification of the result\n const processedResult = await FlowEngine.runBeforeStoreToolResultHook(\n state,\n call,\n result\n );\n\n // Use pre-generated message ID (generated before tool execution)\n const messageId = toolMessageId;\n\n // Normalize tool result into a string for storage in the messages table.\n // At this point, executeRuntimeTool has already flattened any structured\n // tool output (e.g. MCP content parts) into processedResult.result.\n let content: string;\n if (processedResult.status === \"success\") {\n content =\n processedResult.result?.trim() ||\n \"Tool executed successfully\";\n } else {\n const baseError =\n processedResult.error?.trim() ||\n \"Tool execution failed\";\n content = `Failed to execute tool: ${baseError}`;\n }\n\n // If this is a sub-prompt and the tool failed, check if parent wants errors prefixed\n if (state.parentMessageId !== undefined && processedResult.status === \"error\") {\n // Get parent tool config from context (passed when executing prompt tool)\n const parentToolConfig = state.context.__parentToolConfig;\n\n // Check include_errors from parent tool config\n let includeErrors = true;\n if (typeof parentToolConfig === 'object' && parentToolConfig !== null) {\n includeErrors = parentToolConfig.includeErrors ?? true;\n }\n\n // If include_errors is true and content doesn't already start with \"Error: \", prefix it\n if (includeErrors && !content.startsWith(\"Error: \")) {\n content = `Error: ${content}`;\n }\n }\n\n // Determine tool_status based on result status\n const toolStatus = processedResult.status === \"success\" ? \"success\" : \"error\";\n\n let message: Message = {\n id: messageId,\n role: \"tool\",\n content,\n tool_call_id: call.id,\n created_at: 0, // Placeholder - will be set just before INSERT\n tool_status: toolStatus,\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n };\n\n // Run before_create_message hook\n message = await FlowEngine.runBeforeCreateMessageHook(state, message) as Message;\n\n // Set timestamp just before INSERT to ensure accurate ordering\n message.created_at = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Insert message (now includes tool messages from sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, tool_call_id, created_at, tool_status, parent_id, depth)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_call_id,\n message.created_at,\n message.tool_status,\n message.parent_id,\n message.depth\n );\n\n // Run after_create_message hook\n await FlowEngine.runAfterCreateMessageHook(state, message);\n\n // Update the parent log's tool_results field\n const parentLogId = state.currentLogId || null;\n if (parentLogId) {\n try {\n // Get current tool_results\n const result = await state.storage.sql.exec(\n `SELECT tool_results FROM logs WHERE id = ?1`,\n parentLogId\n );\n const rows = result.toArray();\n const currentToolResults = rows[0]?.tool_results;\n\n // Parse existing tool_results or create new array\n let toolResultsArray: Array<{\n tool_call_id: string;\n tool_name: string;\n content: string;\n status: string;\n timestamp: number;\n }> = [];\n\n if (currentToolResults) {\n try {\n toolResultsArray = JSON.parse(currentToolResults as string);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Add new tool result\n toolResultsArray.push({\n tool_call_id: call.id,\n tool_name: call.function.name,\n content: String(message.content ?? \"\"),\n status: processedResult.status,\n timestamp: Date.now(),\n });\n\n // Update log with new tool_results\n await state.storage.sql.exec(\n `UPDATE logs SET tool_results = ?1 WHERE id = ?2`,\n JSON.stringify(toolResultsArray),\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n tool_results: JSON.stringify(toolResultsArray),\n },\n });\n }\n } catch (logError) {\n // Best-effort - don't fail if log update fails\n console.error(\"Failed to update log with tool result:\", logError);\n }\n }\n\n // Broadcast message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n // Stream content if successful\n if (processedResult.status === \"success\" && processedResult.result) {\n state.stream.sendContent(`\\n[Tool: ${call.function.name}] ${processedResult.result}\\n`);\n }\n\n // Add to message history (always do this, even for child prompts - they need their own history)\n state.messageHistory.push(message);\n } catch (error) {\n console.error(\"Error storing tool result:\", error);\n // Log storage error to database\n await this.logError(state, error, `storeToolResult:${call.function.name}`);\n }\n }\n\n /**\n * Store tool error as a message in the database\n */\n private static async storeToolError(\n call: ToolCall,\n error: Error,\n state: FlowState\n ): Promise<void> {\n const toolMessageId = crypto.randomUUID();\n\n const result: ToolResult = {\n status: \"error\",\n error: error.message,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n }\n\n /**\n * Log tool execution error by updating the parent log (best-effort)\n * Instead of creating a new log entry, updates the parent LLM request log with the error\n */\n private static async logError(\n state: FlowState,\n error: unknown,\n toolName: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Get parent log ID from state if available\n const parentLogId = state.currentLogId || null;\n\n if (!parentLogId) {\n // No parent log to update, log to console only\n console.error(`Tool error (${toolName}):`, errorMessage);\n return;\n }\n\n // Format error with stack trace\n const fullError = `Tool \"${toolName}\" failed: ${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`;\n\n // Update the parent log with the error information\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n error = ?1,\n error_type = ?2\n WHERE id = ?3\n `,\n fullError,\n \"tool_execution_error\",\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n error: fullError,\n error_type: \"tool_execution_error\",\n },\n });\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to update parent log with tool error:\", logError);\n }\n }\n\n /**\n * Validate arguments against a JSON Schema\n * Returns error message if invalid, null if valid\n */\n private static validateJsonSchema(\n data: any,\n schema: Record<string, any>\n ): string | null {\n // Basic JSON Schema validation\n // This is a simple implementation - for production, use a proper JSON Schema validator\n\n if (schema.type === \"object\" && schema.properties) {\n // Check required fields\n if (schema.required && Array.isArray(schema.required)) {\n for (const field of schema.required) {\n if (!(field in data)) {\n return `Missing required field: ${field}`;\n }\n }\n }\n\n // Validate each property\n for (const [key, propSchema] of Object.entries(\n schema.properties as Record<string, any>\n )) {\n if (key in data) {\n const value = data[key];\n const expectedType = propSchema.type;\n\n // Type checking\n if (expectedType === \"string\" && typeof value !== \"string\") {\n return `Field ${key} must be a string`;\n }\n if (expectedType === \"number\" && typeof value !== \"number\") {\n return `Field ${key} must be a number`;\n }\n if (expectedType === \"boolean\" && typeof value !== \"boolean\") {\n return `Field ${key} must be a boolean`;\n }\n if (expectedType === \"array\" && !Array.isArray(value)) {\n return `Field ${key} must be an array`;\n }\n if (\n expectedType === \"object\" &&\n (typeof value !== \"object\" || value === null)\n ) {\n return `Field ${key} must be an object`;\n }\n }\n }\n }\n\n return null; // Valid\n }\n\n /**\n * Interpolate prompt segments with arguments\n * Replaces variable segments with their values from args\n * Converts segments array to final string prompt\n */\n private static async interpolatePrompt(\n promptJson: string,\n args: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n try {\n const segments = JSON.parse(promptJson) as Array<{\n type: string;\n value?: string;\n id?: string;\n label?: string;\n }>;\n\n const results: string[] = [];\n\n for (const segment of segments) {\n if (segment.type === \"string\") {\n // Regular string segment - add as-is\n results.push(segment.value || \"\");\n } else if (segment.type === \"variable\") {\n // Variable segment - replace with value from args\n const variableValue = args[segment.value || \"\"];\n if (variableValue !== undefined) {\n results.push(\n typeof variableValue === \"string\"\n ? variableValue\n : JSON.stringify(variableValue)\n );\n } else {\n // Variable not provided in args - keep placeholder or skip\n results.push(`{{${segment.value}}}`);\n }\n } else if (segment.type === \"prompt\") {\n // Load and interpolate referenced prompt from TypeScript config\n try {\n const promptName = segment.id;\n const promptDef = await state.thread.instance.loadPrompt(promptName!);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n results.push(`[Prompt not found: ${segment.label || promptName}]`);\n } else {\n // For TypeScript-defined prompts, the prompt is a plain string\n // (not JSON segments like the old D1 format)\n // Recursively interpolate variables in the prompt string\n let promptText = promptDef.prompt;\n\n // Replace {{variable}} patterns with args values\n promptText = promptText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, varName: string) => {\n const value = args[varName];\n if (value !== undefined) {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n return match; // Keep placeholder if not in args\n });\n\n results.push(promptText);\n }\n } catch (error) {\n console.error(`Error loading prompt ${segment.id}:`, error);\n results.push(`[Error loading prompt: ${segment.label || segment.id}]`);\n }\n }\n }\n\n return results.join(\"\");\n } catch (error) {\n // If parsing fails, treat as plain string\n console.error(\"Error parsing prompt segments:\", error);\n return promptJson;\n }\n }\n\n /**\n * Remove a tool call from message history and database\n * This is called when a hook returns null to completely remove the tool call\n */\n private static async removeToolCallFromHistory(\n call: ToolCall,\n state: FlowState\n ): Promise<void> {\n try {\n // Find the message containing this tool call in the message history\n const messageIndex = state.messageHistory.findIndex(\n (msg) => {\n if (!msg.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n return toolCalls.some((tc: ToolCall) => tc.id === call.id);\n } catch {\n return false;\n }\n }\n );\n\n if (messageIndex === -1) {\n console.warn(`[ToolExecutor] Could not find message containing tool call ${call.id}`);\n return;\n }\n\n const message = state.messageHistory[messageIndex];\n const toolCalls = JSON.parse(message.tool_calls!);\n\n // If this message has only one tool call, delete the entire message\n if (toolCalls.length === 1) {\n // Remove from message history\n state.messageHistory.splice(messageIndex, 1);\n\n // Remove from database (now includes sub-prompts)\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n message.id\n );\n\n } else {\n // If multiple tool calls, just remove this one from the tool_calls array\n const updatedToolCalls = toolCalls.filter((tc: ToolCall) => tc.id !== call.id);\n message.tool_calls = JSON.stringify(updatedToolCalls);\n\n // Update in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `UPDATE messages SET tool_calls = ? WHERE id = ?`,\n message.tool_calls,\n message.id\n );\n\n }\n } catch (error) {\n console.error(`[ToolExecutor] Error removing tool call from history:`, error);\n }\n }\n}\n","import type {\n Agent,\n FlowState,\n FlowResult,\n Message,\n RequestContext,\n EmitLog,\n LogData,\n ThreadInstance,\n ThreadMetadata,\n ToolCall,\n ToolResult,\n} from \"./types\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { MAX_TURNS, TIMESTAMP_MULTIPLIER } from \"./types\";\nimport { StreamManager } from \"./StreamManager\";\nimport { LLMRequest } from \"./LLMRequest\";\nimport { ToolExecutor } from \"./ToolExecutor\";\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Core orchestration engine for agent execution\n * Manages the main agentic loop with turn-based execution\n */\nexport class FlowEngine {\n /**\n * Main execution entry point\n * Executes an agent conversation until stopped or max turns reached\n *\n * By default, returns immediately with the stream while execution continues in background.\n * Set awaitCompletion: true to wait for all turns and database writes to complete (required for sub-prompts).\n *\n * @param stateInput - Partial FlowState object with required fields\n * @param awaitCompletion - If true, awaits full execution completion before returning (default: false)\n */\n static async execute(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n },\n awaitCompletion: boolean = false\n ): Promise<FlowResult> {\n // Initialize state from partial input\n // All optional properties (emitLog, parentLogId, etc.) are now in FlowState interface\n const state = await this.initializeState(stateInput);\n\n if (awaitCompletion) {\n // Wait for execution to complete (for sub-prompts to ensure serial execution)\n try {\n await this.executeAsync(state, state.threadId);\n } catch (error) {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n throw error; // Re-throw for caller to handle\n }\n } else {\n // Start execution in background (default behavior for top-level execution)\n this.executeAsync(state, state.threadId).catch(async (error) => {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n });\n }\n\n // Return immediately with the stream\n return {\n messages: state.messageHistory,\n stopped: state.stopped,\n stoppedBy: state.stoppedBy,\n turnCount: state.turnCount,\n stream: state.stream.httpStream,\n };\n }\n\n /**\n * Execute the agentic loop asynchronously\n * This runs in the background while the stream is being consumed\n */\n private static async executeAsync(\n state: FlowState,\n threadId: string\n ): Promise<void> {\n // Main agentic loop\n while (state.turnCount < MAX_TURNS && !state.stopped && !state.abortController?.signal.aborted) {\n\n try {\n // Check if abort was requested\n if (state.abortController?.signal.aborted) {\n // Create a system message to indicate interruption\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Run before hook\n let interruptionMessage: Message = {\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n };\n\n interruptionMessage = await this.runBeforeCreateMessageHook(state, interruptionMessage) as Message;\n\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status) VALUES (?, ?, ?, ?, ?)`,\n interruptionMessage.id,\n interruptionMessage.role,\n interruptionMessage.content,\n interruptionMessage.created_at,\n interruptionMessage.status\n );\n\n // Run after hook\n await this.runAfterCreateMessageHook(state, interruptionMessage);\n\n // Broadcast the interruption message\n if (state.emitMessage) {\n state.emitMessage({\n id: interruptionMessage.id,\n role: interruptionMessage.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: interruptionMessage.content,\n created_at: interruptionMessage.created_at,\n status: interruptionMessage.status,\n });\n }\n\n state.emitTelemetry?.({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n state.stopped = true;\n break;\n }\n\n await this.executeTurn(state);\n state.turnCount++;\n\n\n // Sub-prompts execute as one-shot: make one LLM request, execute tools, return\n // Don't play multiple turns even if tools fail\n // Check if this is a sub-prompt by presence of parentMessageId\n if (state.parentMessageId !== undefined) {\n state.stopped = true;\n break;\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof Error &&\n (error.name === \"AbortError\" || error.message.includes(\"aborted\"));\n\n if (isAbortError) {\n // Interruption message already created by stop() method\n state.stopped = true;\n break;\n }\n\n // Handle other errors\n console.error(`Error in turn ${state.turnCount}:`, error);\n\n // Log error to database\n await this.logError(\n state,\n error,\n \"turn_execution_error\",\n `Turn ${state.turnCount}, Side ${state.currentSide}`\n );\n\n // Send error message to HTTP stream\n const errorMessage = error instanceof Error ? error.message : String(error);\n state.stream.sendContent(`\\n\\n[ERROR] ${errorMessage}\\n`);\n\n // Send error telemetry\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Error: ${errorMessage}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n // Stop execution on fatal error\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n break;\n }\n }\n\n // Check if we hit max turns\n if (state.turnCount >= MAX_TURNS && !state.stopped) {\n console.warn(`Thread ${threadId} reached maximum turns (${MAX_TURNS})`);\n\n // Log to database\n await this.logError(\n state,\n new Error(`Thread reached maximum turns (${MAX_TURNS})`),\n \"max_turns_reached\",\n `Thread ${threadId}`\n );\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Maximum turns reached\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Close streams\n await state.stream.close();\n }\n\n /**\n * Load prompts from TypeScript configs via virtual modules.\n *\n * Agent config is already loaded by DurableThread, so we just need to\n * load the referenced prompts.\n */\n private static async loadAgentAndPrompts(\n agentConfig: Agent,\n thread: { instance: ThreadInstance; metadata: ThreadMetadata }\n ): Promise<{\n agentConfig: Agent;\n sideAPrompt: import(\"./types\").PromptData;\n sideBPrompt: import(\"./types\").PromptData | null;\n }> {\n // Load side A prompt (always required)\n const sideAPromptName = agentConfig.side_a_agent_prompt;\n if (!sideAPromptName) {\n throw new Error(`Agent ${agentConfig.title} missing side_a_agent_prompt`);\n }\n\n const sideAPromptDef = await thread.instance.loadPrompt(sideAPromptName);\n\n // Convert PromptDefinition to PromptData format expected by runtime\n const sideAPrompt: import(\"./types\").PromptData = {\n id: sideAPromptName,\n name: sideAPromptDef.name,\n tool_description: sideAPromptDef.toolDescription,\n prompt: sideAPromptDef.prompt,\n model: sideAPromptDef.model,\n include_chat: sideAPromptDef.includeChat ?? false,\n include_past_tools: sideAPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideAPromptDef.parallelToolCalls ?? false,\n tool_choice: sideAPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideAPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideAPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideAPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideAPromptDef.reasoning?.include ?? false,\n before_tool: sideAPromptDef.beforeTool ?? null,\n after_tool: sideAPromptDef.afterTool ?? null,\n _tools: sideAPromptDef.tools ?? [],\n _handoffAgents: sideAPromptDef.handoffAgents ?? [],\n _requiredSchema: sideAPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n\n // Load side B prompt (only for dual_ai agents)\n let sideBPrompt: import(\"./types\").PromptData | null = null;\n const sideBPromptName = agentConfig.side_b_agent_prompt;\n if (sideBPromptName) {\n const sideBPromptDef = await thread.instance.loadPrompt(sideBPromptName);\n\n sideBPrompt = {\n id: sideBPromptName,\n name: sideBPromptDef.name,\n tool_description: sideBPromptDef.toolDescription,\n prompt: sideBPromptDef.prompt,\n model: sideBPromptDef.model,\n include_chat: sideBPromptDef.includeChat ?? false,\n include_past_tools: sideBPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideBPromptDef.parallelToolCalls ?? false,\n tool_choice: sideBPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideBPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideBPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideBPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideBPromptDef.reasoning?.include ?? false,\n before_tool: sideBPromptDef.beforeTool ?? null,\n after_tool: sideBPromptDef.afterTool ?? null,\n _tools: sideBPromptDef.tools ?? [],\n _handoffAgents: sideBPromptDef.handoffAgents ?? [],\n _requiredSchema: sideBPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n }\n\n return { agentConfig, sideAPrompt, sideBPrompt };\n }\n\n /**\n * Initialize the flow state from partial input\n * Merges provided fields with defaults and loaded data\n */\n private static async initializeState(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n }\n ): Promise<FlowState> {\n // Load prompts for the provided agent config via virtual modules\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n stateInput.agentConfig,\n stateInput.thread\n );\n\n // Create stream manager if not provided\n const stream = stateInput.stream || new StreamManager();\n\n // Build complete state with defaults\n const state: Omit<FlowState, 'rootState'> & { rootState?: FlowState } = {\n threadId: stateInput.threadId,\n flowId: stateInput.flowId || crypto.randomUUID(),\n thread: stateInput.thread,\n agentConfig: stateInput.agentConfig,\n currentSide: stateInput.currentSide || \"a\",\n prompts: {\n sideA: sideAPrompt,\n sideB: sideBPrompt,\n },\n prompt: (stateInput.currentSide || \"a\") === \"a\" ? sideAPrompt : (sideBPrompt || sideAPrompt),\n turnCount: stateInput.turnCount || 0,\n sideATurnCount: stateInput.sideATurnCount || 0,\n sideBTurnCount: stateInput.sideBTurnCount || 0,\n stopped: stateInput.stopped || false,\n stoppedBy: stateInput.stoppedBy,\n messageHistory: [],\n sequence: stateInput.sequence || {\n queue: [],\n isHandling: false,\n },\n active: stateInput.active || {\n tool: \"\",\n args: {},\n retries: 0,\n reasons: [],\n },\n queue: stateInput.queue || [],\n stream,\n context: stateInput.context || {},\n retryCount: stateInput.retryCount || 0,\n retryReason: stateInput.retryReason,\n storage: stateInput.storage,\n env: stateInput.env,\n // Preserve runtime properties for nested execution and telemetry\n emitLog: stateInput.emitLog,\n emitMessage: stateInput.emitMessage,\n emitMessageChunk: stateInput.emitMessageChunk,\n emitTelemetry: stateInput.emitTelemetry,\n emitEvent: stateInput.emitEvent,\n rootMessageId: stateInput.rootMessageId,\n parentLogId: stateInput.parentLogId,\n currentLogId: stateInput.currentLogId,\n parentMessageId: stateInput.parentMessageId,\n depth: stateInput.depth ?? 0, // Default to 0 for top-level prompts\n pendingMessageId: stateInput.pendingMessageId,\n abortController: stateInput.abortController,\n allowedTools: stateInput.allowedTools,\n extraMessages: stateInput.extraMessages || [],\n };\n if (stateInput.rootState) {\n state.rootState = stateInput.rootState;\n } else {\n state.rootState = state as unknown as FlowState;\n }\n return state as FlowState;\n }\n\n /**\n * Execute a single turn\n */\n private static async executeTurn(state: FlowState): Promise<void> {\n // Check the persistent stop flag from DurableThread (most reliable)\n if (await state.thread.instance.shouldStop()) {\n throw new Error(\"aborted\");\n }\n\n // Check abort signal before starting turn\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // Check per-side max turns before executing\n const maxTurns = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_turns\n : state.agentConfig.side_b_max_turns;\n\n const currentSideTurnCount = state.currentSide === \"a\"\n ? state.sideATurnCount\n : state.sideBTurnCount;\n\n if (maxTurns !== null && currentSideTurnCount >= maxTurns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Side ${state.currentSide} reached max turns (${maxTurns})`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check max_session_turns for dual_ai agents (global exchange limit)\n if (\n state.agentConfig.type === \"dual_ai\" &&\n state.agentConfig.max_session_turns !== null\n ) {\n // Calculate completed exchanges (both sides must have spoken for a complete exchange)\n const completedExchanges = Math.min(state.sideATurnCount, state.sideBTurnCount);\n\n if (completedExchanges >= state.agentConfig.max_session_turns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Reached max session turns (${state.agentConfig.max_session_turns} exchanges)`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n }\n\n // Increment per-side turn count\n if (state.currentSide === \"a\") {\n state.sideATurnCount++;\n } else {\n state.sideBTurnCount++;\n }\n\n // Send turn started telemetry\n state.emitTelemetry?.({\n type: \"turn_started\",\n turn: state.turnCount,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n state.messageHistory = await this.loadMessageHistory(state);\n\n // 1. Assemble context for this turn\n const context = await this.assembleContext(state);\n\n // Store allowed tools in state for validation during tool execution\n state.allowedTools = context.tools;\n\n // 1.25. Run prefilter hook on messages (if it exists)\n // This allows developers to modify the message history before sending to LLM\n // The filtered messages will be logged, so devs can see what was actually sent\n context.messages = await this.runPrefilterLLMHistoryHook(state, context.messages);\n\n // 1.5. Create pending message BEFORE LLM request\n const pendingMessageId = await this.createPendingMessage(state);\n\n // Store pending message ID for streaming chunk broadcasts\n state.pendingMessageId = pendingMessageId;\n\n // 2. Execute LLM request with retry/fallback logic\n let responseStatus: \"completed\" | \"failed\" = \"completed\";\n let response: { content: string | null; tool_calls?: any[] };\n let logId: string;\n\n try {\n const result = await LLMRequest.execute(context, state);\n response = result.response;\n logId = result.logId;\n } catch (error) {\n // LLM request failed - update pending message to failed status\n responseStatus = \"failed\";\n await this.updateMessageStatus(pendingMessageId, \"failed\", state);\n throw error; // Re-throw to be handled by executeAsync\n }\n\n // Check stop flag BEFORE storing response - discard if stopped\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n\n // Delete the pending message - don't store the response\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n pendingMessageId\n );\n\n // Mark log as interrupted\n await state.storage.sql.exec(\n `UPDATE logs SET error = ?, error_type = ? WHERE id = ?`,\n \"Interrupted by user\",\n \"user_interrupted\",\n logId\n );\n\n throw new Error(\"aborted\");\n }\n\n // Store the log ID for tool error tracking\n state.currentLogId = logId;\n\n // 2.5. Check for stop-tool with response parameter and extract it as content\n this.extractStopToolResponse(state, response);\n\n // 3. Update pending message with response\n await this.updateMessage(pendingMessageId, response, responseStatus, state);\n\n // 4. Execute tools if present\n if (response.tool_calls && response.tool_calls.length > 0) {\n await ToolExecutor.executeSequence(state, response.tool_calls);\n }\n\n // Check stop flag and abort signal after tool execution\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 5. Check stop condition\n this.checkStopCondition(state, response);\n\n // Clear the log ID and pending message ID after turn is complete\n state.currentLogId = null;\n state.pendingMessageId = undefined;\n\n // 5.25. Handle pending agent handoff (if any)\n // IMPORTANT: Check handoff BEFORE forcedNextSide because:\n // - Agent handoffs change the entire agent context\n // - forceTurn after a handoff should apply to the NEW agent\n // - If we check forcedNextSide first, the handoff is skipped due to early return\n if (state.pendingHandoff) {\n // If there's also a pending force turn, preserve it for after the handoff\n // The forcedNextSide will be applied in the next iteration after the new agent loads\n await this.executeHandoff(state);\n // After handoff, continue loop - new agent will execute immediately\n // Do NOT switch sides or increment turn count - handoff doesn't count as a turn\n return;\n }\n\n // 5.5. Handle forced turn if set\n if (state.forcedNextSide) {\n const forcedSide = state.forcedNextSide.substring(5) as 'a' | 'b';\n\n // Special case: forcing side_b in ai_human agent means wait for human input\n if (state.agentConfig.type === \"ai_human\" && forcedSide === \"b\") {\n state.stopped = true;\n state.stoppedBy = \"a\"; // AI stopped to let human respond\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Forced turn to human (side_b)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n // Force current side to continue (override stop condition)\n else if (forcedSide === state.currentSide) {\n state.stopped = false; // Clear any stop flag\n state.stoppedBy = undefined;\n }\n // Force switch to other side\n else {\n state.currentSide = forcedSide; // Override normal switching\n state.stopped = false; // Ensure we continue execution\n\n // Update prompt reference to match forced side\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n // Clear the forced turn flag after applying it\n state.forcedNextSide = undefined;\n\n // Return early to skip normal side switching logic\n return;\n }\n\n // Check abort signal before switching sides (critical to prevent next turn)\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 6. Switch sides if dual_ai and not stopped\n if (state.agentConfig.type === \"dual_ai\" && !state.stopped) {\n this.switchSides(state);\n }\n\n // Send turn completed telemetry\n state.emitTelemetry?.({\n type: \"turn_completed\",\n turn: state.turnCount,\n stopped: state.stopped,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Execute agent handoff - switch to a new AI + Human agent\n * Updates the thread's agent_name and loads the new agent config\n */\n private static async executeHandoff(state: FlowState): Promise<void> {\n if (!state.pendingHandoff) {\n return;\n }\n\n const newAgentName = state.pendingHandoff.agentId; // Now contains agent name\n\n try {\n // Load new agent definition from TypeScript config\n const newAgentDef = await state.thread.instance.loadAgent(newAgentName);\n\n // Convert AgentDefinition to Agent type expected by runtime\n const agentConfig: Agent = {\n id: newAgentName,\n title: newAgentDef.title || newAgentName,\n type: newAgentDef.type,\n max_session_turns: newAgentDef.maxSessionTurns,\n side_a_label: newAgentDef.sideA?.label,\n side_a_agent_prompt: newAgentDef.sideA?.prompt,\n side_a_stop_on_response: newAgentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: newAgentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: newAgentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: newAgentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: newAgentDef.sideA?.endConversationTool,\n side_b_label: newAgentDef.sideB?.label,\n side_b_agent_prompt: newAgentDef.sideB?.prompt,\n side_b_stop_on_response: newAgentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: newAgentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: newAgentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: newAgentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: newAgentDef.sideB?.endConversationTool,\n };\n\n // Load prompts for new agent\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n agentConfig,\n state.thread\n );\n\n // Persist the agent change to the threads table in DurableAgentBuilder\n try {\n const agentBuilderStub = state.env.AGENT_BUILDER.get(\n state.env.AGENT_BUILDER.idFromName(\"singleton\")\n );\n await agentBuilderStub.updateThreadAgent(state.threadId, newAgentName);\n } catch (persistError) {\n console.error(\"Error persisting handoff to threads table:\", persistError);\n // Continue with handoff even if persistence fails - the in-memory state is correct\n }\n\n // Update state with new agent config and prompts\n state.agentConfig = agentConfig;\n state.prompts.sideA = sideAPrompt;\n state.prompts.sideB = sideBPrompt;\n state.extraMessages = [];\n\n // Reset to Side A and update current prompt reference\n state.currentSide = \"a\";\n state.prompt = state.prompts.sideA;\n\n // Clear pending handoff\n state.pendingHandoff = undefined;\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"agent_handoff\",\n new_agent_id: newAgentName,\n new_agent_title: state.agentConfig.title,\n timestamp: Date.now(),\n } as any); // Cast to any since agent_handoff is not in TelemetryEvent type yet\n } catch (error) {\n console.error(\"Error executing handoff:\", error);\n await this.logError(state, error, \"handoff_execution_error\", `Handoff to agent ${newAgentName}`);\n throw error;\n }\n }\n\n /**\n * Assemble context for LLM request\n */\n private static async assembleContext(\n state: FlowState\n ): Promise<RequestContext> {\n const messages: RequestContext[\"messages\"] = [];\n\n // Use pre-loaded prompt configuration from state\n const model = state.prompt.model;\n const promptName = state.prompt.name;\n const parallelToolCalls = state.prompt.parallel_tool_calls;\n const toolChoice = state.prompt.tool_choice;\n const reasoningEffort = state.prompt.reasoning_effort;\n const reasoningMaxTokens = state.prompt.reasoning_max_tokens;\n const reasoningExclude = state.prompt.reasoning_exclude;\n const includeReasoning = state.prompt.include_reasoning;\n const includePastTools = state.prompt.include_past_tools ?? true;\n\n // Add agent prompt content to messages\n const promptContent = await this.interpolatePrompt(\n state.prompt.prompt,\n state.context || {},\n state\n );\n\n const systemPromptText = promptContent; // Store for logging\n\n messages.push({\n role: \"system\",\n content: promptContent,\n });\n\n // Filter out pending messages - they should NEVER be sent to the LLM\n const completedMessages = state.messageHistory.filter(\n msg => msg.status !== \"pending\"\n );\n\n // First pass: collect all tool_call_ids that have responses\n const toolCallsWithResponses = new Set<string>();\n for (const msg of completedMessages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolCallsWithResponses.add(msg.tool_call_id);\n }\n }\n\n // Second pass: add messages and inject error responses for missing tool results\n // For dual_ai agents: Transform roles based on perspective\n // - Current side's messages should be labeled \"assistant\"\n // - Opposing side's messages should be labeled \"user\"\n // - System messages remain unchanged\n // - Tool messages are filtered by side (only show current side's tool calls)\n for (const msg of completedMessages) {\n // IMPORTANT: Roles encode side information\n // - role=\"assistant\" = Side A messages\n // - role=\"user\" = Side B messages\n // This allows us to filter tool calls without a separate \"side\" column\n\n // Skip ALL tool messages when includePastTools is false\n if (!includePastTools && msg.role === \"tool\") {\n continue;\n }\n\n // Filter tool messages by side - each AI should only see its own tool calls\n if (state.agentConfig.type === \"dual_ai\" && msg.role === \"tool\" && msg.tool_call_id) {\n // Find the parent message that made this tool call\n const parentMsg = completedMessages.find(m => {\n if (!m.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(m.tool_calls);\n return toolCalls.some((tc: any) => tc.id === msg.tool_call_id);\n } catch {\n return false;\n }\n });\n\n if (parentMsg) {\n // Determine which side made this tool call based on parent message role\n // role=\"assistant\" means Side A made the call\n // role=\"user\" means Side B made the call\n const toolCallSide = parentMsg.role === \"assistant\" ? \"a\" : \"b\";\n\n // Skip tool calls from the opposing side\n if (toolCallSide !== state.currentSide) {\n continue; // Don't include this tool message\n }\n }\n }\n\n let role = msg.role;\n\n // Transform role based on perspective for dual_ai agents\n if (state.agentConfig.type === \"dual_ai\") {\n if (msg.role === \"assistant\") {\n // Message is from side A - keep as \"assistant\" if current side is A, else \"user\"\n role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n } else if (msg.role === \"user\") {\n // Message is from side B - keep as \"user\" if current side is A, else \"assistant\"\n role = state.currentSide === \"a\" ? \"user\" : \"assistant\";\n }\n // system and tool roles remain unchanged\n }\n\n // Prepare message content\n const messageContent = msg.content || undefined;\n\n // When includePastTools is false, strip tool_calls from messages\n const messageToAdd: any = {\n role,\n content: messageContent,\n tool_calls: includePastTools && msg.tool_calls ? JSON.parse(msg.tool_calls) : undefined,\n tool_call_id: includePastTools && msg.tool_call_id ? msg.tool_call_id : undefined,\n name: msg.name || undefined,\n };\n\n // Add reasoning if present and includeReasoning is enabled\n // Convert reasoning_content to synthetic detail, combine with structured reasoning\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (includeReasoning) {\n const reasoningDetailsArray: any[] = [];\n\n // If we have reasoning_content (accumulated text), add it as a single text detail\n if (msg.reasoning_content) {\n reasoningDetailsArray.push({\n type: \"reasoning.text\",\n text: msg.reasoning_content\n });\n }\n\n // Add any non-text reasoning_details (summaries, encrypted, etc.)\n if (msg.reasoning_details) {\n try {\n const parsedDetails = JSON.parse(msg.reasoning_details);\n reasoningDetailsArray.push(...parsedDetails);\n } catch (e) {\n console.error(`[FlowEngine] Failed to parse reasoning_details for message ${msg.id}:`, e);\n }\n }\n\n // Only add reasoning_details if we have any\n if (reasoningDetailsArray.length > 0) {\n messageToAdd.reasoning_details = reasoningDetailsArray;\n }\n }\n\n // If this is an assistant message with tool_calls, filter out ones without responses\n // Use the ORIGINAL role from storage to identify tool calls\n // Skip this logic if includePastTools is false (tool_calls already stripped)\n if (includePastTools && msg.role === \"assistant\" && msg.tool_calls) {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((toolCall: any) =>\n toolCallsWithResponses.has(toolCall.id)\n );\n\n // Only include the message if it has content or matched tool calls\n if (msg.content || matchedToolCalls.length > 0) {\n // Update the message with filtered tool_calls\n if (matchedToolCalls.length === 0) {\n // Remove tool_calls field if no matches\n delete messageToAdd.tool_calls;\n } else if (matchedToolCalls.length !== toolCalls.length) {\n // Update with filtered list if some were removed\n messageToAdd.tool_calls = matchedToolCalls;\n }\n // else: all tool calls have responses, keep as-is\n\n messages.push(messageToAdd);\n } else {\n // Skip message entirely if it has no content and no matched tool calls\n console.warn(`[FlowEngine] Skipping assistant message ${msg.id} - no content and no tool calls with responses`);\n }\n } else {\n // Not an assistant message with tool_calls (or includePastTools is false), include as-is\n messages.push(messageToAdd);\n }\n }\n\n // Inject turn budget awareness system message at the bottom to preserve prompt cache\n const maxTurns = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_turns\n : state.agentConfig.side_b_max_turns;\n\n if (maxTurns !== null) {\n const currentSideTurnCount = state.currentSide === \"a\"\n ? state.sideATurnCount\n : state.sideBTurnCount;\n\n const turnsRemaining = maxTurns - currentSideTurnCount;\n\n // Note: currentSideTurnCount has already been incremented in executeTurn(), so we don't add 1\n let budgetMessage: string;\n\n if (turnsRemaining === 0) {\n budgetMessage = '[TURN BUDGET] ⚠️ CRITICAL: You must complete your task NOW or an error will be thrown. This is your final turn.';\n } else if (turnsRemaining === 1) {\n budgetMessage = '[TURN BUDGET] ⚠️ CRITICAL: Only 1 turn available after this before an error will be thrown. Reach completion immediately.';\n } else if (turnsRemaining <= 3) {\n budgetMessage = `[TURN BUDGET] ⚠️ WARNING: Only ${turnsRemaining} turns available before an error will be thrown. Reach completion as soon as possible.`;\n } else {\n budgetMessage = `[TURN BUDGET] ${turnsRemaining} turns available before an error will be thrown. Work efficiently toward completion.`;\n }\n\n messages.push({\n role: \"system\",\n content: budgetMessage,\n });\n }\n\n // Get tools attached to this specific prompt (not all available tools)\n const tools = await this.getToolsForPrompt(state, state.prompt);\n\n // Handle tool_choice: convert \"function\" to object format if needed\n let finalToolChoice: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } } | undefined;\n if (toolChoice === \"function\" && tools.length === 1) {\n // Convert \"function\" to object format with the single tool's name\n finalToolChoice = {\n type: \"function\",\n function: {\n name: tools[0].function.name\n }\n };\n } else if (toolChoice && toolChoice !== \"function\") {\n // Use string value for auto/none/required\n finalToolChoice = toolChoice;\n }\n\n // Build reasoning configuration if either field is set (implicit enable)\n let reasoning: RequestContext[\"reasoning\"] | undefined;\n if (reasoningEffort || reasoningMaxTokens) {\n reasoning = {\n effort: reasoningEffort ?? undefined, // Convert null to undefined\n max_tokens: reasoningMaxTokens ?? undefined,\n exclude: reasoningExclude,\n };\n }\n\n return {\n messages,\n model,\n tools,\n stream: true,\n systemPrompt: systemPromptText,\n promptName: promptName,\n // Use parentLogId from state if this is a chained prompt, otherwise use currentLogId for nested tool calls\n parentLogId: state.parentLogId || state.currentLogId || null,\n // Retries now apply to all prompts (top-level and sub-prompts), only for provider errors\n parallel_tool_calls: parallelToolCalls,\n tool_choice: finalToolChoice,\n reasoning: reasoning,\n };\n }\n\n /**\n * Interpolate prompt template with context data\n * Prompts can be:\n * 1. Plain strings - returned as-is (with legacy {{var}} interpolation)\n * 2. StructuredPrompt arrays - array of {type, value/id} objects\n * 3. JSON string of a StructuredPrompt array - legacy format, parsed first\n */\n private static async interpolatePrompt(\n promptTemplate: string | any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n // If already an array (StructuredPrompt), process it directly\n if (Array.isArray(promptTemplate)) {\n return this.processPromptParts(promptTemplate, context, state);\n }\n\n // If it's a string, check if it's JSON (legacy format) or plain text\n if (typeof promptTemplate === \"string\") {\n // Try to parse as JSON array (legacy format)\n try {\n const parsed = JSON.parse(promptTemplate);\n if (Array.isArray(parsed)) {\n return this.processPromptParts(parsed, context, state);\n }\n // If parsed but not an array, treat as plain string\n return promptTemplate;\n } catch {\n // Not JSON, return as plain string\n return promptTemplate;\n }\n }\n\n // Fallback for unexpected types\n return String(promptTemplate);\n }\n\n /**\n * Process an array of prompt parts into a final string.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt'/'variable')\n */\n private static async processPromptParts(\n parts: any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n const results = await Promise.all(\n parts.map(async (part: any) => {\n // New format: { type: 'text', content: '...' }\n if (part.type === \"text\") {\n return part.content || \"\";\n }\n // New format: { type: 'include', prompt: '...' }\n else if (part.type === \"include\") {\n const promptName = part.prompt;\n return await this.loadAndInterpolatePrompt(promptName, context, state);\n }\n // Legacy format: { type: 'string', value: '...' }\n else if (part.type === \"string\") {\n return part.value || \"\";\n }\n // Legacy format: { type: 'variable', value: '...' }\n else if (part.type === \"variable\") {\n const value = context[part.value];\n if (value === undefined) {\n console.warn(`Missing variable in context: ${part.value}`);\n return `{{${part.value}}}`;\n }\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n // Legacy format: { type: 'prompt', id: '...' }\n else if (part.type === \"prompt\") {\n const promptName = part.id;\n return await this.loadAndInterpolatePrompt(promptName, context, state, part.label);\n }\n return \"\";\n })\n );\n\n return results.join(\"\");\n }\n\n /**\n * Load a referenced prompt and interpolate it\n */\n private static async loadAndInterpolatePrompt(\n promptName: string,\n context: Record<string, any>,\n state: FlowState,\n label?: string\n ): Promise<string> {\n try {\n const promptDef = await state.thread.instance.loadPrompt(promptName);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n return `[Prompt not found: ${label || promptName}]`;\n }\n\n // Recursively interpolate the referenced prompt\n return await this.interpolatePrompt(\n promptDef.prompt,\n context,\n state\n );\n } catch (error) {\n console.error(`Error loading prompt ${promptName}:`, error);\n return `[Error loading prompt: ${label || promptName}]`;\n }\n }\n\n /**\n * Get tools attached to a specific prompt from PromptData._tools\n * Returns only the tools that are actually configured for this prompt\n * Also includes handoff agents from PromptData._handoffAgents\n */\n private static async getToolsForPrompt(\n state: FlowState,\n promptData: import(\"./types\").PromptData\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tool names from the prompt definition\n const toolConfigs = promptData._tools || [];\n const toolNames = toolConfigs.map((t: any) =>\n typeof t === 'string' ? t : t.name\n );\n\n if (toolNames.length > 0) {\n // Load all available tools (native + prompts + agents)\n const allTools = await this.getAvailableTools(state);\n\n // Filter to only include tools that are in the tools list\n const selectedTools = allTools.filter((tool) =>\n toolNames.includes(tool.function.name)\n );\n\n tools.push(...selectedTools);\n }\n\n // Get handoff agents from the prompt definition\n const handoffAgentNames = promptData._handoffAgents || [];\n\n if (handoffAgentNames.length > 0) {\n // Load each handoff agent from TypeScript config\n for (const agentName of handoffAgentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(agentName);\n\n if (agentDef) {\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || agentName,\n description: agentDef.toolDescription || `Hand off conversation to ${agentDef.title || agentName} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch (error) {\n console.warn(`Failed to load handoff agent ${agentName}:`, error);\n }\n }\n }\n\n return tools;\n } catch (error) {\n console.error(\"Error loading tools for prompt:\", error);\n await this.logError(\n state,\n error,\n \"tool_loading_error\",\n `FlowEngine.getToolsForPrompt (prompt: ${promptData.name})`\n );\n return tools;\n }\n }\n\n /**\n * Get available tools for the current agent\n * Returns tool definitions in OpenAI format\n */\n private static async getAvailableTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // 1. Load native tools from toolsDir\n const nativeTools = await this.loadNativeTools(state);\n tools.push(...nativeTools);\n\n // 2. Load exposed prompts from D1\n const promptTools = await this.loadPromptTools(state);\n tools.push(...promptTools);\n\n // 3. Load exposed agents from D1\n const agentTools = await this.loadAgentTools(state);\n tools.push(...agentTools);\n\n // 4. Check for duplicate tool names and warn\n const toolNameSources = new Map<string, Set<string>>();\n\n // Track sources for each tool name\n for (const tool of nativeTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('native tool');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of promptTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('prompt');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of agentTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('agent');\n toolNameSources.set(tool.function.name, sources);\n }\n\n // Warn about duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n console.warn(\n `[AgentBuilder] Duplicate tool name \"${name}\" detected (sources: ${[...sources].join(', ')}). ` +\n `This may cause unexpected behavior. Consider renaming one of them.`\n );\n }\n }\n } catch (error) {\n console.error(\"Error loading tools:\", error);\n await this.logError(\n state,\n error,\n \"tool_discovery_error\",\n \"FlowEngine.getAvailableTools\"\n );\n }\n\n return tools;\n }\n\n /**\n * Load native tools from toolsDir directory\n */\n private static async loadNativeTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tools from thread instance (user's extended Thread class)\n const toolRegistry = state.thread.instance.tools();\n const { z } = await import(\"zod\");\n\n for (const [toolName, toolLoader] of Object.entries(toolRegistry)) {\n try {\n const [description, argsSchema, _fn] = await toolLoader();\n\n // Convert Zod schema to JSON Schema if present using Zod 4's native toJSONSchema\n let parameters: Record<string, any> | undefined;\n\n if (argsSchema) {\n // Use Zod 4's native toJSONSchema (defaults to draft-2020-12)\n const jsonSchema = z.toJSONSchema(argsSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description,\n parameters,\n },\n });\n } catch (toolError) {\n console.error(`Error loading native tool ${toolName}:`, toolError);\n }\n }\n } catch (error) {\n console.error(\"Error loading native tools registry:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed prompts as tools from TypeScript configs\n */\n private static async loadPromptTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all prompt names - all prompts are exposed as tools\n const promptNames = state.thread.instance.getPromptNames();\n const { z } = await import(\"zod\");\n\n for (const name of promptNames) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(name);\n\n // Build parameters from requiredSchema if present\n let parameters: Record<string, any> | undefined;\n\n if (promptDef.requiredSchema) {\n try {\n // Use Zod 4's native toJSONSchema function\n const jsonSchema = z.toJSONSchema(promptDef.requiredSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n } catch (parseError) {\n console.error(\n `Error converting schema for prompt ${name}:`,\n parseError\n );\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: promptDef.name,\n description: promptDef.toolDescription,\n parameters,\n },\n });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading prompt tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed agents as tools from TypeScript configs\n */\n private static async loadAgentTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all agent names and check which have exposeAsTool\n const agentNames = state.thread.instance.getAgentNames();\n\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n\n if (agentDef.exposeAsTool) {\n // Agent tools accept arbitrary arguments (no strict schema for now)\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || name,\n description: agentDef.toolDescription || `Execute the ${agentDef.title || name} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading agent tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Run the prefilter_llm_history hook if it exists\n * This hook allows developers to modify the message history before sending to LLM\n *\n * @param state - Flow state with execution context\n * @param messages - Messages to prefilter before sending to LLM\n * @returns Processed messages (or original if hook doesn't exist/fails)\n */\n private static async runPrefilterLLMHistoryHook(\n state: FlowState,\n messages: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = state.thread.instance.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['prefilter_llm_history']) {\n return messages; // No hook - return original messages\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['prefilter_llm_history'];\n const hook = await hookLoader();\n\n if (!hook) {\n return messages; // Hook failed to load - return original messages\n }\n\n // Run the hook\n const processedMessages = await hook(state, messages);\n return processedMessages;\n } catch (error) {\n // If the hook throws an error, log it but return the original messages\n console.error('[Hooks] ✗ Error running prefilter_llm_history hook:', error);\n return messages;\n }\n }\n\n /**\n * Run the before_create_message hook if it exists\n * This hook allows developers to modify a message before it's created\n *\n * @param state - Flow state with execution context\n * @param message - Message object to be created\n * @returns Processed message (or original if hook doesn't exist/fails)\n */\n public static async runBeforeCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_create_message']) {\n return message;\n }\n\n const hookLoader = hooksRegistry['before_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return message;\n }\n\n const processedMessage = await hook(state, message);\n return processedMessage;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_create_message hook:', error);\n return message;\n }\n }\n\n /**\n * Run the after_create_message hook if it exists\n * This hook runs after a message is created in the database\n *\n * @param state - Flow state with execution context\n * @param message - The created message object\n */\n public static async runAfterCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_create_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n await hook(state, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_create_message hook:', error);\n }\n }\n\n /**\n * Run the before_update_message hook if it exists\n * This hook allows developers to modify a message before it's updated\n *\n * Generic type preserves the exact shape of the updates object for type safety\n *\n * @param state - Flow state with execution context\n * @param messageId - ID of the message being updated\n * @param updates - Object with fields to update\n * @returns Processed updates (or original if hook doesn't exist/fails)\n */\n public static async runBeforeUpdateMessageHook<T extends Record<string, any>>(\n state: FlowState,\n messageId: string,\n updates: T\n ): Promise<T> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_update_message']) {\n return updates;\n }\n\n const hookLoader = hooksRegistry['before_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return updates;\n }\n\n const processedUpdates = await hook(state, messageId, updates);\n return processedUpdates as T;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_update_message hook:', error);\n return updates;\n }\n }\n\n /**\n * Run the after_update_message hook if it exists\n * This hook runs after a message is updated in the database\n *\n * @param state - Flow state with execution context\n * @param message - Full message object with updated fields\n */\n public static async runAfterUpdateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_update_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n await hook(state, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_update_message hook:', error);\n }\n }\n\n /**\n * Run the before_store_tool_result hook if it exists\n * This hook allows developers to modify tool results before they're stored\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The tool result object to be stored\n * @returns Processed tool result (or original if hook doesn't exist/fails)\n */\n public static async runBeforeStoreToolResultHook(\n state: FlowState,\n toolCall: Record<string, any>,\n toolResult: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_store_tool_result']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['before_store_tool_result'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_store_tool_result hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_success hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The successful tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallSuccessHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_success']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_success'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_success hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_failure hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The failed tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallFailureHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_failure']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_failure'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_failure hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Create a pending message before LLM request\n * Returns the message ID for later updates\n */\n private static async createPendingMessage(state: FlowState): Promise<string> {\n const messageId = crypto.randomUUID();\n\n // Determine role based on current side\n const role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n\n let message: Message = {\n id: messageId,\n role,\n content: null, // No content yet\n tool_calls: null,\n log_id: null,\n created_at: 0, // Placeholder - will be set just before INSERT\n request_sent_at: 0, // Placeholder - will be set just before INSERT\n response_completed_at: null,\n status: \"pending\",\n };\n\n // Run before_create_message hook\n message = await this.runBeforeCreateMessageHook(state, message) as Message;\n\n // Add hierarchical tracking fields\n message.parent_id = state.parentMessageId || null;\n message.depth = state.depth;\n\n // Set timestamps just before INSERT to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n message.created_at = now;\n message.request_sent_at = now;\n\n // Insert pending message into database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, tool_calls, log_id, created_at,\n request_sent_at, response_completed_at, status, parent_id, depth, reasoning_content\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_calls,\n message.log_id,\n message.created_at,\n message.request_sent_at,\n message.response_completed_at,\n message.status,\n message.parent_id,\n message.depth,\n null // reasoning_content - will be set when message is updated with LLM response\n );\n\n // Run after_create_message hook\n await this.runAfterCreateMessageHook(state, message);\n\n // Add to message history\n state.messageHistory.push(message);\n\n // Broadcast pending message via WebSocket (already skipped for child prompts via emitMessage not being passed)\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n return messageId;\n }\n\n /**\n * Update pending message status (for failures)\n */\n private static async updateMessageStatus(\n messageId: string,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Prepare updates object with explicit type\n let updates: {\n status: \"completed\" | \"failed\";\n response_completed_at: number;\n } = {\n status,\n response_completed_at: now,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET status = ?1, response_completed_at = ?2\n WHERE id = ?3\n `,\n updates.status,\n updates.response_completed_at,\n messageId\n );\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.status = updates.status;\n message.response_completed_at = updates.response_completed_at;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n }\n\n /**\n * Update pending message with LLM response\n */\n private static async updateMessage(\n messageId: string,\n response: { content: string | null; tool_calls?: any[]; reasoning_content?: string | null; reasoning_details?: any[] },\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n // Get the log_id from state (set by LLMRequest.execute)\n const logId = state.currentLogId || null;\n\n // Prepare message data\n let content = response.content;\n const toolCallsJson = response.tool_calls ? JSON.stringify(response.tool_calls) : null;\n const reasoningContent = response.reasoning_content || null;\n const reasoningDetailsJson = response.reasoning_details ? JSON.stringify(response.reasoning_details) : null;\n\n // Run post-process hook if available (trims whitespace, applies custom logic)\n let messageForHook: Message = {\n id: messageId,\n role: state.currentSide === \"a\" ? \"assistant\" : \"user\",\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n created_at: 0, // Will be preserved from original\n request_sent_at: 0, // Will be preserved from original\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n };\n\n // Run before_create_message hook (again, now with actual content)\n // This allows hooks to modify the content before it's stored\n messageForHook = await this.runBeforeCreateMessageHook(state, messageForHook) as Message;\n content = messageForHook.content;\n\n // Prepare updates object with explicit type\n let updates: {\n content: string | null;\n tool_calls: string | null;\n log_id: string | null;\n response_completed_at: number;\n status: \"completed\" | \"failed\";\n reasoning_content: string | null;\n reasoning_details: string | null;\n } = {\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n reasoning_details: reasoningDetailsJson,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Set timestamp just before UPDATE to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n updates.response_completed_at = now;\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET content = ?1, tool_calls = ?2, log_id = ?3,\n response_completed_at = ?4, status = ?5, reasoning_content = ?6,\n reasoning_details = ?7\n WHERE id = ?8\n `,\n updates.content,\n updates.tool_calls,\n updates.log_id,\n updates.response_completed_at,\n updates.status,\n updates.reasoning_content,\n updates.reasoning_details,\n messageId\n );\n\n // Store tool calls in detail table\n if (response.tool_calls) {\n for (const toolCall of response.tool_calls) {\n await state.storage.sql.exec(\n `\n INSERT INTO tool_calls (\n id, message_id, type, function_name, function_arguments, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n `,\n toolCall.id,\n messageId,\n toolCall.type || \"function\",\n toolCall.function.name,\n toolCall.function.arguments,\n now\n );\n }\n }\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.content = content;\n message.tool_calls = toolCallsJson;\n message.log_id = logId;\n message.response_completed_at = now;\n message.status = status;\n message.reasoning_content = reasoningContent;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n\n // Note: Content was already streamed during provider execution (OpenAIProvider.chat, etc.)\n // No need to send it again here - that causes duplicate stream writes and \"stream is closed\" warnings\n }\n\n /**\n * Extract stop-tool response parameter and use as message content\n * This handles the special case where a stop-tool includes a response parameter\n * that should be treated as the message content\n */\n private static extractStopToolResponse(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n if (!response.tool_calls || response.tool_calls.length === 0) {\n return;\n }\n\n // Check if any tool call is a stop-tool with response parameter\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Only process if both stop-tool and response property are configured\n if (!stopTool || !stopToolResponseProperty) {\n return;\n }\n\n // Find the stop-tool call\n const stopToolCall = response.tool_calls.find(\n (call) => call.function.name === stopTool\n );\n\n if (!stopToolCall) {\n return;\n }\n\n // Extract the response parameter value\n try {\n const args = JSON.parse(stopToolCall.function.arguments);\n const extractedResponse = args[stopToolResponseProperty];\n\n if (extractedResponse && typeof extractedResponse === \"string\") {\n // Replace the response content with the extracted value\n response.content = extractedResponse;\n\n // Broadcast as chunks for real-time UI update\n if (state.emitMessageChunk && state.pendingMessageId) {\n // Broadcast the extracted response as a single chunk\n // (it's already complete at this point, not streaming from provider)\n state.emitMessageChunk(state.pendingMessageId, extractedResponse);\n }\n\n // Store for potential later use\n // Store final response for stop tool extraction\n (state as any).finalResponse = extractedResponse; // Note: finalResponse not in FlowState type yet\n }\n } catch (error) {\n console.error(\n `Failed to extract response property '${stopToolResponseProperty}' from stop-tool '${stopTool}':`,\n error\n );\n }\n }\n\n /**\n * Check if stop condition is met\n */\n private static checkStopCondition(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n // Check end conversation tool first (ends entire conversation)\n const endConversationTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_end_conversation_tool\n : state.agentConfig.side_b_end_conversation_tool;\n\n if (\n endConversationTool &&\n response.tool_calls?.some((call) => call.function.name === endConversationTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `End conversation tool called: ${endConversationTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check stop conditions (OR logic - stop on either condition)\n const stopOnResponse =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_on_response\n : state.agentConfig.side_b_stop_on_response;\n\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Stop on response condition\n if (stopOnResponse && response.content && !response.tool_calls) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Returns content (no tool calls)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Stop on specific tool call\n if (\n stopTool &&\n response.tool_calls?.some((call) => call.function.name === stopTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n // Note: Response parameter extraction is handled earlier in extractStopToolResponse()\n // which is called before updateMessage to ensure the content is set correctly\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Stop tool called: ${stopTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Switch to the other side (for dual_ai agents)\n */\n static switchSides(state: FlowState): void {\n state.currentSide = state.currentSide === \"a\" ? \"b\" : \"a\";\n\n // Update current prompt reference to match new side\n // For ai_human agents, keep using sideA prompt even when switching to side B (human)\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n /**\n * Filter out orphaned tool calls and tool results\n * Removes:\n * 1. Assistant messages with tool_calls that have no matching tool result messages\n * 2. Tool result messages that have no matching tool_call in assistant messages\n *\n * This prevents API errors from OpenAI when tool_calls and results don't match\n */\n private static filterOrphanedToolCalls(messages: Message[]): Message[] {\n // First pass: collect all valid tool_call_ids from tool result messages\n const toolResultIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolResultIds.add(msg.tool_call_id);\n }\n }\n\n // Second pass: collect all tool_call_ids from assistant messages with tool_calls\n const assistantToolCallIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n for (const call of toolCalls) {\n if (call.id) {\n assistantToolCallIds.add(call.id);\n }\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n }\n\n // Third pass: filter messages\n const filtered: Message[] = [];\n for (const msg of messages) {\n // Filter tool result messages - only keep if their tool_call_id has a matching assistant message\n if (msg.role === \"tool\" && msg.tool_call_id) {\n if (!assistantToolCallIds.has(msg.tool_call_id)) {\n console.warn(`[FlowEngine] Filtering orphaned tool result message ${msg.id} - no matching tool_call_id ${msg.tool_call_id}`);\n continue; // Skip this message\n }\n }\n\n // Filter assistant messages with tool_calls - remove tool_calls that have no matching results\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((call: any) =>\n toolResultIds.has(call.id)\n );\n\n // If no tool calls have results, check if message has content\n if (matchedToolCalls.length === 0 && toolCalls.length > 0) {\n if (msg.content) {\n // Has content - keep message but remove tool_calls field\n console.warn(`[FlowEngine] Filtering tool_calls from message ${msg.id} - no matching tool results`);\n filtered.push({\n ...msg,\n tool_calls: null\n });\n continue;\n } else {\n // No content and no valid tool calls - skip entire message\n console.warn(`[FlowEngine] Filtering assistant message ${msg.id} - no content and no tool calls with results`);\n continue;\n }\n }\n\n // Some tool calls have results - update with filtered list if needed\n if (matchedToolCalls.length !== toolCalls.length) {\n console.warn(`[FlowEngine] Filtering ${toolCalls.length - matchedToolCalls.length} orphaned tool_calls from message ${msg.id}`);\n filtered.push({\n ...msg,\n tool_calls: JSON.stringify(matchedToolCalls)\n });\n continue;\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n\n // Keep all other messages as-is\n filtered.push(msg);\n }\n\n const removedCount = messages.length - filtered.length;\n if (removedCount > 0) {\n console.warn(`[FlowEngine] Filtered ${removedCount} orphaned tool call/result messages`);\n }\n\n return filtered;\n }\n\n /**\n * Load message history from DurableObject storage\n * Public to allow FlowStateSdk to reload history when needed\n *\n * @param storage - DurableObject storage instance\n * @param thread - Thread instance and metadata\n * @param stateInput - Partial state containing extraMessages and other context\n * @param includeParentHistory - Whether to load messages from DB (default: true). If false, only extraMessages are returned\n */\n public static async loadMessageHistory(\n state: FlowState,\n ): Promise<Message[]> {\n const storage = state.storage;\n const thread = state.thread;\n const includeParentHistory = state.prompt.include_chat ?? true;\n const includeToolCalls = state.prompt.include_past_tools ?? true;\n\n try {\n let rows: any[] = [];\n\n // Only load parent message history from DB if includeParentHistory is true\n if (includeParentHistory) {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: 1) Use for...of loop, OR 2) Call .toArray() for array methods\n // DO NOT try to access cursor.rows - it doesn't exist!\n // CRITICAL: Only load top-level messages (parent_id IS NULL) for LLM context\n // Sub-prompt messages are stored for observability but never sent to parent's LLM\n\n // Select columns conditionally based on includeToolCalls\n const columns = [\n \"id\", \"role\", \"content\", \"name\",\n ...(includeToolCalls ? [\"tool_calls\", \"tool_call_id\", \"tool_status\"] : []),\n \"log_id\", \"created_at\", \"request_sent_at\", \"response_completed_at\",\n \"status\", \"silent\", \"parent_id\", \"depth\",\n \"reasoning_content\", \"reasoning_details\"\n ];\n\n const query = `\n SELECT\n ${columns.join(\", \")}\n FROM messages\n WHERE parent_id IS NULL\n ORDER BY created_at ASC\n `;\n\n const cursor = await storage.sql.exec<Message & Record<string, any>>(query);\n\n rows = cursor.toArray(); // Convert iterator to array for .map()\n }\n\n // Always append extraMessages if provided, regardless of includeParentHistory setting\n if (state.extraMessages && state.extraMessages.length > 0) {\n rows.push(...state.extraMessages);\n rows.sort((a, b) => a.created_at - b.created_at);\n }\n\n // Rows are objects with column names as properties, NOT arrays!\n const messages = rows.map((row: any) => ({\n id: row.id as string,\n role: row.role as Message[\"role\"],\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n reasoning_content: row.reasoning_content as string | null,\n reasoning_details: row.reasoning_details as string | null,\n }));\n\n // Filter out orphaned tool calls and tool results BEFORE running hooks\n // This prevents API errors from mismatched tool_call/result pairs\n return this.runFilterMessagesHook(thread.instance, state, this.filterOrphanedToolCalls(messages));\n } catch (error) {\n console.error(\"Error loading message history:\", error);\n return [];\n }\n }\n\n /**\n * Run the filter_messages hook if it exists\n * This hook allows developers to modify SQL row data before transformation\n *\n * @param thread - Thread instance with hooks registry\n * @param stateInput - Partial state for hook context\n * @param rows - SQL rows from messages table\n * @returns Processed rows (or original if hook doesn't exist/fails)\n */\n private static async runFilterMessagesHook(\n thread: ThreadInstance,\n state: FlowState,\n rows: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = thread.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['filter_messages']) {\n return rows; // No hook - return original rows\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['filter_messages'];\n const hook = await hookLoader();\n\n if (!hook) {\n return rows; // Hook failed to load - return original rows\n }\n\n // Run the hook\n const processedRows = await hook(state, rows);\n return processedRows;\n } catch (error) {\n // If the hook throws an error, log it but return the original rows\n console.error('[Hooks] ✗ Error running filter_messages hook:', error);\n return rows;\n }\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Creates a log entry with error details but no associated message_id\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n context?: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)\n `,\n crypto.randomUUID(),\n \"00000000-0000-0000-0000-000000000000\", // Placeholder for errors without message\n \"system\",\n context || \"unknown\",\n `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n errorType,\n Date.now() * TIMESTAMP_MULTIPLIER\n );\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log error to database:\", logError);\n }\n }\n}\n","/**\n * Type generation module for AgentBuilder.\n *\n * Generates TypeScript declaration files that provide compile-time\n * type safety for model, prompt, agent, and tool references.\n *\n * @module\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Configuration for directory scanning.\n */\nexport interface DirectoryConfig {\n modelsDir: string;\n promptsDir: string;\n agentsDir: string;\n toolsDir: string;\n outputDir: string;\n}\n\n/**\n * Content of the generated tsconfig.json for the .agents directory.\n */\nconst TSCONFIG_CONTENT = `{\n \"compilerOptions\": {\n \"composite\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"moduleResolution\": \"bundler\",\n \"module\": \"ESNext\",\n \"target\": \"ESNext\"\n },\n \"include\": [\"types.d.ts\", \"virtual-module.d.ts\"]\n}\n`;\n\n/**\n * Scan a directory for TypeScript files and extract the definition names.\n *\n * This function reads each .ts file and extracts the `name` property from\n * the defineX() call. It uses a simple regex pattern to avoid full parsing.\n *\n * @param dir - Directory to scan\n * @param useFilename - If true, use filename as the name (for tools that don't have name property)\n * @returns Array of definition names found\n */\nexport function scanForNames(dir: string, useFilename: boolean = false): string[] {\n const names: string[] = [];\n\n if (!fs.existsSync(dir)) {\n return names;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (useFilename) {\n // For tools: use the filename (without extension) as the tool name\n // Convert underscores to match convention (e.g., my_tool.ts -> my_tool)\n const toolName = entry.name.replace(/\\.ts$/, '');\n // Verify the file actually exports a tool (contains defineTool)\n if (content.includes('defineTool')) {\n names.push(toolName);\n }\n } else {\n // Extract name from defineX({ name: 'xxx', ... })\n // Matches: name: 'xxx' or name: \"xxx\"\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n names.push(nameMatch[1]);\n }\n }\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dir}:`, error);\n }\n\n return names;\n}\n\n/**\n * Generate interface properties from an array of string names.\n * Each name becomes a property with value `true`.\n *\n * @param names - Array of string names\n * @returns TypeScript interface properties string\n */\nfunction generateRegistryProperties(names: string[]): string {\n if (names.length === 0) {\n return '';\n }\n\n return names.map((n) => `'${n}': true;`).join('\\n ');\n}\n\n/**\n * Generate the types.d.ts content for the .agents directory.\n *\n * This generates a namespace augmentation that overrides the default `string`\n * types in the AgentBuilder namespace with specific union types based on\n * the user's defined models, prompts, agents, and tools.\n *\n * @param config - Directory configuration\n * @returns The generated TypeScript declaration content\n */\nexport function generateTypesContent(config: DirectoryConfig): string {\n const models = scanForNames(config.modelsDir);\n const prompts = scanForNames(config.promptsDir);\n const agents = scanForNames(config.agentsDir);\n // Tools use filename as name since defineTool doesn't have a name property\n const tools = scanForNames(config.toolsDir, true);\n\n // Generate the callables union from all three sources\n const callables = [...prompts, ...agents, ...tools];\n\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n// Generated at: ${new Date().toISOString()}\n//\n// This file augments the AgentBuilder namespace declared in @standardagents/builder\n// to provide type-safe references for your models, prompts, agents, and tools.\n\n/**\n * Augment the global AgentBuilder namespace with your project's specific types.\n * This provides autocomplete and type checking for model, prompt, agent, and tool references.\n *\n * Uses interface declaration merging with property keys to create union types.\n * Example: interface ModelRegistry { 'gpt-4o': true; } gives type Models = 'gpt-4o'\n */\ndeclare global {\n namespace AgentBuilder {\n /** Model names from agents/models/ */\n interface ModelRegistry {\n ${generateRegistryProperties(models)}\n }\n\n /** Prompt names from agents/prompts/ */\n interface PromptRegistry {\n ${generateRegistryProperties(prompts)}\n }\n\n /** Agent names from agents/agents/ */\n interface AgentRegistry {\n ${generateRegistryProperties(agents)}\n }\n\n /** Tool names from agents/tools/ */\n interface ToolRegistry {\n ${generateRegistryProperties(tools)}\n }\n\n /** All callable items (prompts, agents, tools) that can be used as tools */\n interface CallableRegistry {\n ${generateRegistryProperties(callables)}\n }\n }\n}\n\n// This export is required for TypeScript to treat this as a module\n// and allow the declare global to work properly\nexport {};\n`;\n}\n\n/**\n * Generate the virtual-module.d.ts content for the .agents directory.\n *\n * This provides type declarations for the virtual:@standardagents/builder module.\n * It must be in a separate file (without export {}) to work as an ambient module declaration.\n *\n * @returns The generated TypeScript declaration content\n */\nexport function generateVirtualModuleContent(): string {\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n//\n// Type declarations for the virtual:@standardagents/builder module.\n// This file must NOT have any exports to work as an ambient module declaration.\n\n/**\n * Type declarations for the consolidated virtual module.\n * This module provides DurableThread and DurableAgentBuilder classes\n * with all virtual module methods (tools, hooks, models, prompts, agents)\n * already implemented, plus the router function.\n */\ndeclare module 'virtual:@standardagents/builder' {\n import type { DurableThread as BaseDurableThread } from '@standardagents/builder/runtime';\n import type { DurableAgentBuilder as BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n // ============================================================\n // Message Types\n // ============================================================\n\n export interface ThreadMessage {\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: 'success' | 'error' | null;\n log_id: string | null;\n created_at: number;\n silent: boolean;\n parent_id: string | null;\n depth: number;\n status: 'pending' | 'completed' | 'failed' | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }\n\n export interface GetMessagesResult {\n messages: ThreadMessage[];\n total: number;\n hasMore: boolean;\n }\n\n // ============================================================\n // Log Types\n // ============================================================\n\n export interface ThreadLog {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: boolean;\n created_at: number;\n request_body: string | null;\n }\n\n export interface GetLogsResult {\n logs: ThreadLog[];\n total: number;\n hasMore: boolean;\n }\n\n export interface ThreadLogDetails extends ThreadLog {\n endpoint: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n tools_schema: string | null;\n message_history: string | null;\n system_prompt: string | null;\n errors: string | null;\n tool_results: string | null;\n }\n\n // ============================================================\n // Thread Metadata Types\n // ============================================================\n\n export interface ThreadMetaResult {\n thread: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n agent: {\n id: string;\n title: string;\n type: string;\n side_a_label?: string;\n side_b_label?: string;\n } | null;\n stats: {\n message_count: number;\n log_count: number;\n };\n }\n\n // ============================================================\n // DurableThread Class\n // ============================================================\n\n /**\n * DurableThread with all virtual module methods pre-implemented.\n * Extend this class in your agents/Thread.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * \\`\\`\\`\n */\n export class DurableThread extends BaseDurableThread {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Execution methods\n execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response>;\n sendMessage(\n threadId: string,\n content: string,\n role?: string\n ): Promise<Response>;\n stop(): Promise<Response>;\n shouldStop(): Promise<boolean>;\n\n // Message methods\n getMessages(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC',\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<GetMessagesResult>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }): Promise<{ success: boolean; count?: number; error?: string }>;\n\n // Log methods\n getLogs(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC'\n ): Promise<GetLogsResult>;\n getLogDetails(logId: string): Promise<ThreadLogDetails>;\n\n // Thread management methods\n getThreadMeta(threadId: string): Promise<ThreadMetaResult>;\n updateThreadMeta(\n threadId: string,\n params: UpdateThreadParams\n ): Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n deleteThread(): Promise<{ success: boolean; message: string }>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // DurableAgentBuilder Types\n // ============================================================\n\n export interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n }\n\n export interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n\n export interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }\n\n export interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n }\n\n // ============================================================\n // DurableAgentBuilder Class\n // ============================================================\n\n /**\n * DurableAgentBuilder with all virtual module methods pre-implemented.\n * Extend this class in your agents/AgentBuilder.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n *\n * export class AgentBuilder extends DurableAgentBuilder {}\n * \\`\\`\\`\n */\n export class DurableAgentBuilder extends BaseDurableAgentBuilder {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Thread registry methods\n createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry>;\n getThread(id: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(id: string): Promise<boolean>;\n updateThreadAgent(id: string, agent_name: string): Promise<boolean>;\n updateThread(id: string, params: UpdateThreadParams): Promise<ThreadRegistryEntry | null>;\n getThreadStub(threadId: string): DurableObjectStub;\n\n // Provider methods\n getProvider(name: string): Promise<Provider | null>;\n setProvider(provider: Provider): Promise<void>;\n listProviders(): Promise<Provider[]>;\n deleteProvider(name: string): Promise<boolean>;\n\n // User methods\n getUserByUsername(username: string): Promise<User | null>;\n getUserById(id: string): Promise<User | null>;\n createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User>;\n hasUsers(): Promise<boolean>;\n listUsers(): Promise<Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>>;\n updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null>;\n deleteUser(id: string): Promise<boolean>;\n\n // Session methods\n createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string>;\n validateSession(tokenHash: string): Promise<{ user_id: string; expires_at: number } | null>;\n cleanupSessions(): Promise<number>;\n deleteSession(tokenHash: string): Promise<void>;\n\n // API key methods\n createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string>;\n validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null>;\n listApiKeys(userId: string): Promise<Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>>;\n deleteApiKey(id: string, userId: string): Promise<boolean>;\n\n // OAuth methods\n linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void>;\n findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null>;\n\n // Edit lock methods (for GitHub integration)\n acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean>;\n releaseEditLock(lockedBy: string): Promise<boolean>;\n getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>;\n setPendingChanges(changes: string): Promise<void>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // Router Function\n // ============================================================\n\n /**\n * Main router function for handling incoming requests.\n * Routes requests to the appropriate API endpoint or serves the UI.\n *\n * @example\n * \\`\\`\\`typescript\n * import { router } from 'virtual:@standardagents/builder'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const response = await router(request, env);\n * return response ?? new Response('Not Found', { status: 404 });\n * }\n * }\n * \\`\\`\\`\n */\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n}\n\n/**\n * Legacy alias for the router module.\n * @deprecated Use \\`import { router } from 'virtual:@standardagents/builder'\\` instead.\n */\ndeclare module 'virtual:@standardagents/router' {\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n\n export { DurableThread } from 'virtual:@standardagents/builder';\n}\n`;\n}\n\n/**\n * Ensure a directory exists, creating it if necessary.\n *\n * @param dir - Directory path to ensure exists\n */\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Generate the .agents directory with type declarations.\n *\n * Creates or updates:\n * - .agents/types.d.ts - Type declarations for all definitions (with export {})\n * - .agents/virtual-module.d.ts - Virtual module declarations (ambient, no export)\n * - .agents/tsconfig.json - TypeScript configuration\n * - .agents/.gitignore - Ignore all generated files\n *\n * @param config - Directory configuration\n */\nexport function generateTypes(config: DirectoryConfig): void {\n ensureDir(config.outputDir);\n\n // Generate types.d.ts (global namespace augmentation - needs export {})\n const typesContent = generateTypesContent(config);\n fs.writeFileSync(path.join(config.outputDir, 'types.d.ts'), typesContent);\n\n // Generate virtual-module.d.ts (ambient module declaration - no export)\n const virtualModuleContent = generateVirtualModuleContent();\n fs.writeFileSync(path.join(config.outputDir, 'virtual-module.d.ts'), virtualModuleContent);\n\n // Generate tsconfig.json\n fs.writeFileSync(path.join(config.outputDir, 'tsconfig.json'), TSCONFIG_CONTENT);\n\n // Generate .gitignore to ignore all generated files\n fs.writeFileSync(path.join(config.outputDir, '.gitignore'), '*\\n');\n}\n\n/**\n * Check if type generation is needed based on file modification times.\n *\n * @param config - Directory configuration\n * @returns True if types need regeneration\n */\nexport function needsRegeneration(config: DirectoryConfig): boolean {\n const typesPath = path.join(config.outputDir, 'types.d.ts');\n\n // If types file doesn't exist, we need to generate\n if (!fs.existsSync(typesPath)) {\n return true;\n }\n\n const typesMtime = fs.statSync(typesPath).mtime;\n\n // Check if any source directory has newer files\n const dirs = [config.modelsDir, config.promptsDir, config.agentsDir, config.toolsDir];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) {\n continue;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const fileMtime = fs.statSync(filePath).mtime;\n if (fileMtime > typesMtime) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get default directory configuration based on a base directory.\n *\n * @param baseDir - Base directory (usually process.cwd())\n * @param options - Optional overrides for directory paths\n * @returns Complete directory configuration\n */\nexport function getDefaultConfig(\n baseDir: string,\n options: Partial<DirectoryConfig> = {}\n): DirectoryConfig {\n return {\n modelsDir: options.modelsDir ?? path.join(baseDir, 'agents/models'),\n promptsDir: options.promptsDir ?? path.join(baseDir, 'agents/prompts'),\n agentsDir: options.agentsDir ?? path.join(baseDir, 'agents/agents'),\n toolsDir: options.toolsDir ?? path.join(baseDir, 'agents/tools'),\n outputDir: options.outputDir ?? path.join(baseDir, '.agents'),\n };\n}\n","import type { ModelDefinition } from '../defineModel.js';\n\n/**\n * Generate a TypeScript file for a model definition.\n */\nexport function generateModelFile(data: ModelDefinition): string {\n const lines = [\n `import { defineModel } from '@standardagents/builder';`,\n '',\n `export default defineModel({`,\n ` name: '${escapeString(data.name)}',`,\n ` provider: '${escapeString(data.provider)}',`,\n ` model: '${escapeString(data.model)}',`,\n ];\n\n if (data.includedProviders && data.includedProviders.length > 0) {\n lines.push(` includedProviders: ${JSON.stringify(data.includedProviders)},`);\n }\n\n if (data.fallbacks && data.fallbacks.length > 0) {\n lines.push(` fallbacks: ${JSON.stringify(data.fallbacks)},`);\n }\n\n if (data.inputPrice !== undefined) {\n lines.push(` inputPrice: ${data.inputPrice},`);\n }\n\n if (data.outputPrice !== undefined) {\n lines.push(` outputPrice: ${data.outputPrice},`);\n }\n\n if (data.cachedPrice !== undefined) {\n lines.push(` cachedPrice: ${data.cachedPrice},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * Converts JSON Schema to Zod code string.\n *\n * This is used when saving prompts from the UI - the form editor works with\n * JSON Schema, but we need to generate Zod code for the TypeScript file.\n */\n\nexport interface JSONSchema {\n type?: string;\n description?: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n items?: JSONSchema;\n enum?: (string | number | boolean)[];\n anyOf?: JSONSchema[];\n oneOf?: JSONSchema[];\n allOf?: JSONSchema[];\n const?: any;\n default?: any;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n additionalProperties?: boolean | JSONSchema;\n nullable?: boolean;\n}\n\n/**\n * Convert a JSON Schema to Zod code string.\n *\n * @param schema - The JSON Schema to convert\n * @param indent - Current indentation level (for pretty printing)\n * @returns Zod code as a string\n *\n * @example\n * ```typescript\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', description: 'User name' },\n * age: { type: 'number' }\n * },\n * required: ['name']\n * };\n *\n * jsonSchemaToZod(schema);\n * // Returns: z.object({ name: z.string().describe('User name'), age: z.number().optional() })\n * ```\n */\nexport function jsonSchemaToZod(schema: JSONSchema, indent = 0): string {\n if (!schema || Object.keys(schema).length === 0) {\n return 'z.any()';\n }\n\n // Handle anyOf (union types)\n if (schema.anyOf && schema.anyOf.length > 0) {\n const types = schema.anyOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle oneOf (similar to anyOf for our purposes)\n if (schema.oneOf && schema.oneOf.length > 0) {\n const types = schema.oneOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle allOf (intersection types - merge objects)\n if (schema.allOf && schema.allOf.length > 0) {\n const types = schema.allOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n // For allOf, we use .and() to intersect\n return types.reduce((acc, t) => `${acc}.and(${t})`);\n }\n\n // Handle const\n if (schema.const !== undefined) {\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v) => JSON.stringify(v));\n if (values.length === 1) {\n return `z.literal(${values[0]})`;\n }\n return `z.enum([${values.join(', ')}])`;\n }\n\n // Handle by type\n switch (schema.type) {\n case 'string':\n return buildStringSchema(schema);\n\n case 'number':\n case 'integer':\n return buildNumberSchema(schema);\n\n case 'boolean':\n return addDescription('z.boolean()', schema.description);\n\n case 'null':\n return addDescription('z.null()', schema.description);\n\n case 'array':\n return buildArraySchema(schema, indent);\n\n case 'object':\n return buildObjectSchema(schema, indent);\n\n default:\n // No type specified - use any\n return 'z.any()';\n }\n}\n\nfunction buildStringSchema(schema: JSONSchema): string {\n let code = 'z.string()';\n\n // Add constraints\n if (schema.minLength !== undefined) {\n code += `.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n code += `.max(${schema.maxLength})`;\n }\n if (schema.pattern) {\n code += `.regex(/${escapeRegex(schema.pattern)}/)`;\n }\n\n // Handle format (common JSON Schema formats)\n if (schema.format) {\n switch (schema.format) {\n case 'email':\n code += '.email()';\n break;\n case 'uri':\n case 'url':\n code += '.url()';\n break;\n case 'uuid':\n code += '.uuid()';\n break;\n case 'date-time':\n code += '.datetime()';\n break;\n case 'date':\n code += '.date()';\n break;\n case 'time':\n code += '.time()';\n break;\n case 'ipv4':\n code += '.ip({ version: \"v4\" })';\n break;\n case 'ipv6':\n code += '.ip({ version: \"v6\" })';\n break;\n // Other formats are ignored\n }\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildNumberSchema(schema: JSONSchema): string {\n let code = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if (schema.minimum !== undefined) {\n code += `.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n code += `.max(${schema.maximum})`;\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildArraySchema(schema: JSONSchema, indent: number): string {\n const itemsSchema = schema.items ? jsonSchemaToZod(schema.items, indent) : 'z.any()';\n let code = `z.array(${itemsSchema})`;\n\n return addDescription(code, schema.description);\n}\n\nfunction buildObjectSchema(schema: JSONSchema, indent: number): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or object with any properties\n if (schema.additionalProperties === false) {\n return addDescription('z.object({})', schema.description);\n }\n return addDescription('z.record(z.any())', schema.description);\n }\n\n const required = new Set(schema.required || []);\n const spaces = ' '.repeat(indent + 1);\n const closingSpaces = ' '.repeat(indent);\n\n const props = Object.entries(schema.properties).map(([key, propSchema]) => {\n let propCode = jsonSchemaToZod(propSchema, indent + 1);\n\n // Handle nullable\n if (propSchema.nullable) {\n propCode += '.nullable()';\n }\n\n // Add optional() if not in required array\n if (!required.has(key)) {\n propCode += '.optional()';\n }\n\n // Handle default values\n if (propSchema.default !== undefined) {\n propCode += `.default(${JSON.stringify(propSchema.default)})`;\n }\n\n return `${spaces}${safePropertyKey(key)}: ${propCode}`;\n });\n\n const propsStr = props.join(',\\n');\n let code = `z.object({\\n${propsStr}\\n${closingSpaces}})`;\n\n // Handle additionalProperties\n if (schema.additionalProperties === false) {\n code += '.strict()';\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction addDescription(code: string, description?: string): string {\n if (description) {\n return `${code}.describe(${JSON.stringify(description)})`;\n }\n return code;\n}\n\nfunction escapeRegex(pattern: string): string {\n // Escape forward slashes for regex literal\n return pattern.replace(/\\//g, '\\\\/');\n}\n\nfunction safePropertyKey(key: string): string {\n // Check if key is a valid JS identifier\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n // Otherwise quote it\n return JSON.stringify(key);\n}\n\n/**\n * Check if a JSON Schema is empty or trivial (no meaningful constraints).\n */\nexport function isEmptySchema(schema: JSONSchema | null | undefined): boolean {\n if (!schema) return true;\n if (Object.keys(schema).length === 0) return true;\n\n // A schema with only type: object and empty properties is considered empty\n if (\n schema.type === 'object' &&\n (!schema.properties || Object.keys(schema.properties).length === 0) &&\n (!schema.required || schema.required.length === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import type { PromptDefinition, PromptPart, StructuredPrompt } from '../definePrompt.js';\nimport { jsonSchemaToZod, isEmptySchema, type JSONSchema } from './jsonSchemaToZod.js';\n\n/**\n * Tool configuration from UI (snake_case).\n */\ninterface ToolConfigInput {\n name: string;\n include_text_response?: boolean;\n include_tool_calls?: boolean;\n include_errors?: boolean;\n init_user_message_property?: string | null;\n}\n\n/**\n * Prompt part as it comes from the UI/API.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt')\n */\ninterface PromptPartInput {\n // New format\n type: 'text' | 'include' | 'string' | 'prompt' | 'variable';\n content?: string; // For type: 'text'\n prompt?: string; // For type: 'include'\n // Legacy format\n value?: string; // For legacy type: 'string' or 'variable'\n id?: string; // For legacy type: 'prompt'\n label?: string; // Legacy UI field\n schema?: any; // Legacy field from UI, ignored\n}\n\n/**\n * Input data for generating a prompt file.\n * This can include JSON Schema for requiredSchema which will be converted to Zod.\n */\nexport interface PromptFileData {\n name: string;\n toolDescription?: string;\n /**\n * Prompt content can be:\n * - A plain string\n * - A structured array of prompt parts\n * - A JSON string of a structured array (legacy format from UI)\n */\n prompt?: string | PromptPartInput[];\n model: string;\n includeChat?: boolean;\n includePastTools?: boolean;\n parallelToolCalls?: boolean;\n toolChoice?: 'auto' | 'none' | 'required';\n tools?: (string | ToolConfigInput)[];\n handoffAgents?: string[];\n beforeTool?: string;\n afterTool?: string;\n reasoning?: {\n effort?: 'low' | 'medium' | 'high';\n maxTokens?: number;\n exclude?: boolean;\n include?: boolean;\n };\n /**\n * Required schema as JSON Schema (from the UI).\n * Will be converted to Zod code.\n */\n requiredSchema?: JSONSchema;\n}\n\n/**\n * Generate a TypeScript file for a prompt definition.\n *\n * @param data - Prompt data including JSON Schema for requiredSchema\n * @returns TypeScript code as a string\n */\nexport function generatePromptFile(data: PromptFileData): string {\n const hasSchema = data.requiredSchema && !isEmptySchema(data.requiredSchema);\n\n const lines = [`import { definePrompt } from '@standardagents/builder';`];\n\n // Add zod import if there's a requiredSchema with actual content\n if (hasSchema) {\n lines.push(`import { z } from 'zod';`);\n }\n\n lines.push('');\n lines.push(`export default definePrompt({`);\n lines.push(` name: '${escapeString(data.name)}',`);\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n // Prompt content - either plain string or structured array\n if (data.prompt !== undefined) {\n const promptCode = formatPromptContent(data.prompt);\n lines.push(` prompt: ${promptCode},`);\n }\n\n lines.push(` model: '${escapeString(data.model)}',`);\n\n // Note: exposeAsTool removed - all prompts are exposed as tools by default\n\n if (data.includeChat !== undefined) {\n lines.push(` includeChat: ${data.includeChat},`);\n }\n\n if (data.includePastTools !== undefined) {\n lines.push(` includePastTools: ${data.includePastTools},`);\n }\n\n if (data.parallelToolCalls !== undefined) {\n lines.push(` parallelToolCalls: ${data.parallelToolCalls},`);\n }\n\n if (data.toolChoice && data.toolChoice !== 'auto') {\n lines.push(` toolChoice: '${data.toolChoice}',`);\n }\n\n // Tools - can be strings or ToolConfig objects\n if (data.tools && data.tools.length > 0) {\n const toolsCode = formatToolsArray(data.tools);\n lines.push(` tools: ${toolsCode},`);\n }\n\n // Handoff agents - output as TypeScript array\n if (data.handoffAgents && data.handoffAgents.length > 0) {\n const agentsStr = data.handoffAgents.map(a => `'${escapeString(a)}'`).join(', ');\n lines.push(` handoffAgents: [${agentsStr}],`);\n }\n\n // Before/after tools\n if (data.beforeTool) {\n lines.push(` beforeTool: '${escapeString(data.beforeTool)}',`);\n }\n\n if (data.afterTool) {\n lines.push(` afterTool: '${escapeString(data.afterTool)}',`);\n }\n\n // Reasoning config - output as TypeScript object (no quoted keys)\n if (data.reasoning && hasNonNullProperties(data.reasoning)) {\n const reasoningCode = formatReasoningConfig(data.reasoning);\n lines.push(` reasoning: ${reasoningCode},`);\n }\n\n // RequiredSchema - convert JSON Schema to Zod code\n if (hasSchema) {\n const zodCode = jsonSchemaToZod(data.requiredSchema!, 1);\n lines.push(` requiredSchema: ${zodCode},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if an object has any non-null/non-undefined properties.\n */\nfunction hasNonNullProperties(obj: Record<string, any>): boolean {\n return Object.values(obj).some(v => v !== null && v !== undefined);\n}\n\n/**\n * Format the tools array as TypeScript code (not JSON).\n * Transforms snake_case properties from UI to camelCase for TypeScript.\n */\nfunction formatToolsArray(tools: (string | ToolConfigInput)[]): string {\n const formatted = tools.map(tool => {\n if (typeof tool === 'string') {\n return `'${escapeString(tool)}'`;\n }\n // Tool config object - transform to camelCase and format as TypeScript\n return formatToolConfig(tool);\n });\n\n if (formatted.length === 1) {\n return `[${formatted[0]}]`;\n }\n\n // Multi-line format for multiple tools\n const indented = formatted.map(t => ` ${t}`).join(',\\n');\n return `[\\n${indented}\\n ]`;\n}\n\n/**\n * Format a tool config object as TypeScript code.\n * Transforms snake_case to camelCase and omits null/default values.\n */\nfunction formatToolConfig(config: ToolConfigInput): string {\n const parts: string[] = [];\n\n parts.push(`name: '${escapeString(config.name)}'`);\n\n // Transform snake_case to camelCase and only include non-default values\n if (config.include_text_response !== undefined && config.include_text_response !== true) {\n parts.push(`includeTextResponse: ${config.include_text_response}`);\n }\n\n if (config.include_tool_calls !== undefined && config.include_tool_calls !== true) {\n parts.push(`includeToolCalls: ${config.include_tool_calls}`);\n }\n\n if (config.include_errors !== undefined && config.include_errors !== true) {\n parts.push(`includeErrors: ${config.include_errors}`);\n }\n\n if (config.init_user_message_property !== undefined && config.init_user_message_property !== null) {\n parts.push(`initUserMessageProperty: '${escapeString(config.init_user_message_property)}'`);\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\n/**\n * Format reasoning config as TypeScript code (not JSON).\n */\nfunction formatReasoningConfig(reasoning: PromptFileData['reasoning']): string {\n if (!reasoning) return '{}';\n\n const parts: string[] = [];\n\n if (reasoning.effort !== undefined && reasoning.effort !== null) {\n parts.push(`effort: '${reasoning.effort}'`);\n }\n\n if (reasoning.maxTokens !== undefined && reasoning.maxTokens !== null) {\n parts.push(`maxTokens: ${reasoning.maxTokens}`);\n }\n\n if (reasoning.exclude !== undefined && reasoning.exclude !== null) {\n parts.push(`exclude: ${reasoning.exclude}`);\n }\n\n if (reasoning.include !== undefined && reasoning.include !== null) {\n parts.push(`include: ${reasoning.include}`);\n }\n\n if (parts.length === 0) {\n return '{}';\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\${/g, '\\\\${');\n}\n\n/**\n * Parse prompt content into an array of parts.\n * Returns null if it's a plain string, or the array of parts if structured.\n */\nfunction parsePromptContent(prompt: string | PromptPartInput[] | undefined): PromptPartInput[] | null {\n if (!prompt) return null;\n\n // Already an array\n if (Array.isArray(prompt)) {\n return prompt;\n }\n\n // Try to parse as JSON array (legacy format from UI)\n if (typeof prompt === 'string') {\n try {\n const parsed = JSON.parse(prompt);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, it's a plain string\n }\n }\n\n return null;\n}\n\n/**\n * Format prompt content as TypeScript code.\n * Plain strings use template literals, structured prompts use helper functions.\n */\nfunction formatPromptContent(prompt: string | PromptPartInput[] | undefined): string {\n if (!prompt) return \"''\";\n\n // Parse the prompt content\n const parts = parsePromptContent(prompt);\n\n // If it's a structured prompt (array), format it using helper functions\n if (parts !== null) {\n return formatStructuredPrompt(parts);\n }\n\n // Plain string - use template literal for multi-line\n if (typeof prompt === 'string') {\n if (prompt.includes('\\n')) {\n return `\\`${escapeTemplateLiteral(prompt)}\\``;\n }\n return `'${escapeString(prompt)}'`;\n }\n\n return \"''\";\n}\n\n/**\n * Format a structured prompt array as TypeScript code using discriminated union objects.\n */\nfunction formatStructuredPrompt(parts: PromptPartInput[]): string {\n if (parts.length === 0) {\n return '[]';\n }\n\n // Normalize parts to the new format\n const normalizedParts = parts.map(normalizePart);\n\n // Check if it's simple enough to be on one line (single short text part)\n if (normalizedParts.length === 1 && normalizedParts[0].type === 'text') {\n const content = normalizedParts[0].content || '';\n if (!content.includes('\\n') && content.length < 50) {\n return `[{ type: 'text', content: '${escapeString(content)}' }]`;\n }\n }\n\n // Multi-line format\n const formattedParts = normalizedParts.map(part => {\n if (part.type === 'text') {\n const content = part.content || '';\n // Use template literal for multi-line strings\n if (content.includes('\\n')) {\n return ` { type: 'text', content: \\`${escapeTemplateLiteral(content)}\\` }`;\n }\n return ` { type: 'text', content: '${escapeString(content)}' }`;\n } else if (part.type === 'include') {\n const promptName = part.prompt || '';\n return ` { type: 'include', prompt: '${escapeString(promptName)}' }`;\n }\n return ` // Unknown part type: ${(part as any).type}`;\n });\n\n return `[\\n${formattedParts.join(',\\n')},\\n ]`;\n}\n\n/**\n * Normalize a prompt part from legacy format to new format.\n * Legacy: { type: 'string', value: '...' } or { type: 'prompt', id: '...' }\n * New: { type: 'text', content: '...' } or { type: 'include', prompt: '...' }\n */\nfunction normalizePart(part: PromptPartInput): { type: 'text'; content: string } | { type: 'include'; prompt: string } {\n // Handle new format\n if (part.type === 'text') {\n return { type: 'text', content: part.content || '' };\n }\n if (part.type === 'include') {\n return { type: 'include', prompt: part.prompt || '' };\n }\n\n // Handle legacy format\n if (part.type === 'string') {\n return { type: 'text', content: part.value || '' };\n }\n if (part.type === 'prompt') {\n return { type: 'include', prompt: part.id || '' };\n }\n if (part.type === 'variable') {\n // Variables are converted to text with placeholder syntax\n return { type: 'text', content: `{{${part.value || ''}}}` };\n }\n\n // Fallback for unknown types\n return { type: 'text', content: '' };\n}\n","import type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Generate a TypeScript file for an agent definition.\n */\nexport function generateAgentFile(data: AgentDefinition): string {\n const lines = [\n `import { defineAgent } from '@standardagents/builder';`,\n '',\n `export default defineAgent({`,\n ` name: '${escapeString(data.name)}',`,\n ];\n\n // Only include title if explicitly provided (deprecated field)\n if (data.title) {\n lines.push(` title: '${escapeString(data.title)}',`);\n }\n\n if (data.type && data.type !== 'ai_human') {\n lines.push(` type: '${data.type}',`);\n }\n\n if (data.maxSessionTurns !== undefined) {\n lines.push(` maxSessionTurns: ${data.maxSessionTurns},`);\n }\n\n // Side A config\n lines.push(` sideA: ${formatSideConfig(data.sideA)},`);\n\n // Side B config (optional)\n if (data.sideB) {\n lines.push(` sideB: ${formatSideConfig(data.sideB)},`);\n }\n\n if (data.exposeAsTool !== undefined) {\n lines.push(` exposeAsTool: ${data.exposeAsTool},`);\n }\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n if (data.tags && data.tags.length > 0) {\n lines.push(` tags: ${JSON.stringify(data.tags)},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatSideConfig(config: AgentDefinition['sideA']): string {\n const parts: string[] = ['{'];\n\n if (config.label) {\n parts.push(` label: '${escapeString(config.label)}',`);\n }\n\n parts.push(` prompt: '${escapeString(config.prompt)}',`);\n\n if (config.stopOnResponse !== undefined) {\n parts.push(` stopOnResponse: ${config.stopOnResponse},`);\n }\n\n if (config.stopTool) {\n parts.push(` stopTool: '${escapeString(config.stopTool)}',`);\n }\n\n if (config.stopToolResponseProperty) {\n parts.push(` stopToolResponseProperty: '${escapeString(config.stopToolResponseProperty)}',`);\n }\n\n if (config.maxTurns !== undefined) {\n parts.push(` maxTurns: ${config.maxTurns},`);\n }\n\n if (config.endConversationTool) {\n parts.push(` endConversationTool: '${escapeString(config.endConversationTool)}',`);\n }\n\n if (config.manualStopCondition !== undefined) {\n parts.push(` manualStopCondition: ${config.manualStopCondition},`);\n }\n\n parts.push(' }');\n return parts.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * File persistence service for dev mode.\n *\n * This module provides filesystem operations for creating, updating, and deleting\n * model, prompt, and agent definition files. It runs in the Vite plugin context\n * (Node.js) where filesystem access is available.\n *\n * In production (Cloudflare Workers), these operations would be handled by\n * a different mechanism (e.g., GitHub API commits).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { generateModelFile } from '../generators/generateModelFile.js';\nimport { generatePromptFile, type PromptFileData } from '../generators/generatePromptFile.js';\nimport { generateAgentFile } from '../generators/generateAgentFile.js';\nimport type { ModelDefinition } from '../defineModel.js';\nimport type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Convert a model/prompt/agent name to a safe filename.\n * Handles characters that are invalid in filesystem paths:\n * - Replaces `/` and `\\` with `__` (path separators)\n * - Replaces `:` with `_` (invalid on Windows, used in model IDs like `:free`)\n * - Replaces `-` with `_` for consistency with existing conventions\n * - Replaces other problematic characters (`*`, `?`, `\"`, `<`, `>`, `|`) with `_`\n */\nexport function nameToFilename(name: string): string {\n return name\n .replace(/[/\\\\]/g, '__') // Path separators become double underscore\n .replace(/[:*?\"<>|]/g, '_') // Invalid filesystem characters become underscore\n .replace(/-/g, '_'); // Hyphens become underscore for consistency\n}\n\n/**\n * Get the file path for a model definition.\n */\nexport function getModelFilePath(modelsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(modelsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a model file already exists.\n */\nexport function modelExists(modelsDir: string, name: string): boolean {\n const filePath = getModelFilePath(modelsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Result of a persistence operation.\n */\nexport interface PersistenceResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\n/**\n * Save a model definition to a TypeScript file.\n *\n * @param modelsDir - The directory where models are stored\n * @param data - The model definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveModel(\n modelsDir: string,\n data: ModelDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure models directory exists\n if (!fs.existsSync(modelsDir)) {\n fs.mkdirSync(modelsDir, { recursive: true });\n }\n\n const filePath = getModelFilePath(modelsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file already exists: ${filePath}. Use update to modify existing models.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateModelFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save model',\n };\n }\n}\n\n/**\n * Delete a model definition file.\n *\n * @param modelsDir - The directory where models are stored\n * @param name - The model name\n * @returns Result of the operation\n */\nexport async function deleteModel(\n modelsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getModelFilePath(modelsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete model',\n };\n }\n}\n\n/**\n * Transform snake_case model data from the UI to camelCase for internal use.\n * The UI sends field names like `included_providers`, etc.\n * but the backend expects `includedProviders`, etc.\n *\n * Also strips price fields for OpenRouter models since those are returned\n * per-request by the OpenRouter API.\n */\nexport function transformModelData(data: any): any {\n const transformed: any = {};\n const isOpenRouter = data.provider === 'openrouter';\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n included_providers: 'includedProviders',\n input_price: 'inputPrice',\n output_price: 'outputPrice',\n cached_price: 'cachedPrice',\n };\n\n // Fields to skip for OpenRouter models (prices come from API per-request)\n const openRouterSkipFields = ['inputPrice', 'outputPrice', 'cachedPrice', 'input_price', 'output_price', 'cached_price'];\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Skip price fields for OpenRouter models\n if (isOpenRouter && openRouterSkipFields.includes(key)) continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n const transformedKey = fieldMappings[key];\n // Skip price fields for OpenRouter even after transformation\n if (isOpenRouter && openRouterSkipFields.includes(transformedKey)) continue;\n transformed[transformedKey] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'model', 'provider', etc.)\n transformed[key] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Validate model data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateModelData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Model name is required and must be a string';\n }\n\n if (!data.provider || typeof data.provider !== 'string') {\n return 'Model provider is required and must be a string';\n }\n\n const validProviders = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(data.provider)) {\n return `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(', ')}`;\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Model ID is required and must be a string';\n }\n\n // Validate optional numeric fields\n if (data.inputPrice !== undefined && typeof data.inputPrice !== 'number') {\n return 'inputPrice must be a number';\n }\n\n if (data.outputPrice !== undefined && typeof data.outputPrice !== 'number') {\n return 'outputPrice must be a number';\n }\n\n if (data.cachedPrice !== undefined && typeof data.cachedPrice !== 'number') {\n return 'cachedPrice must be a number';\n }\n\n // Validate fallbacks is an array of strings\n if (data.fallbacks !== undefined) {\n if (!Array.isArray(data.fallbacks)) {\n return 'fallbacks must be an array';\n }\n for (const fallback of data.fallbacks) {\n if (typeof fallback !== 'string') {\n return 'Each fallback must be a string (model name)';\n }\n }\n }\n\n // Validate includedProviders is an array of strings\n if (data.includedProviders !== undefined) {\n if (!Array.isArray(data.includedProviders)) {\n return 'includedProviders must be an array';\n }\n for (const provider of data.includedProviders) {\n if (typeof provider !== 'string') {\n return 'Each includedProvider must be a string';\n }\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Prompt Persistence\n// ============================================================================\n\n/**\n * Transform snake_case prompt data from the UI to camelCase for internal use.\n * The UI sends field names like `model_id`, `tool_description`, etc.\n * but the backend expects `model`, `toolDescription`, etc.\n */\nexport function transformPromptData(data: any): any {\n const transformed: any = {};\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n model_id: 'model',\n tool_description: 'toolDescription',\n expose_as_tool: 'exposeAsTool',\n required_schema: 'requiredSchema',\n include_chat: 'includeChat',\n include_past_tools: 'includePastTools',\n before_tool: 'beforeTool',\n after_tool: 'afterTool',\n parallel_tool_calls: 'parallelToolCalls',\n tool_choice: 'toolChoice',\n handoff_agents: 'handoffAgents',\n reasoning_effort: 'reasoningEffort',\n reasoning_max_tokens: 'reasoningMaxTokens',\n reasoning_exclude: 'reasoningExclude',\n include_reasoning: 'includeReasoning',\n };\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n transformed[fieldMappings[key]] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'prompt', 'tools', etc.)\n transformed[key] = value;\n }\n }\n\n // Build reasoning config if any reasoning fields are present\n if (\n transformed.reasoningEffort !== undefined ||\n transformed.reasoningMaxTokens !== undefined ||\n transformed.reasoningExclude !== undefined ||\n transformed.includeReasoning !== undefined\n ) {\n transformed.reasoning = {};\n if (transformed.reasoningEffort) {\n transformed.reasoning.effort = transformed.reasoningEffort;\n }\n if (transformed.reasoningMaxTokens) {\n transformed.reasoning.maxTokens = transformed.reasoningMaxTokens;\n }\n if (transformed.reasoningExclude !== undefined) {\n transformed.reasoning.exclude = transformed.reasoningExclude;\n }\n if (transformed.includeReasoning !== undefined) {\n transformed.reasoning.include = transformed.includeReasoning;\n }\n // Clean up the flat fields\n delete transformed.reasoningEffort;\n delete transformed.reasoningMaxTokens;\n delete transformed.reasoningExclude;\n delete transformed.includeReasoning;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for a prompt definition.\n */\nexport function getPromptFilePath(promptsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(promptsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a prompt file already exists.\n */\nexport function promptExists(promptsDir: string, name: string): boolean {\n const filePath = getPromptFilePath(promptsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save a prompt definition to a TypeScript file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param data - The prompt definition data (with JSON Schema for requiredSchema)\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function savePrompt(\n promptsDir: string,\n data: PromptFileData,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure prompts directory exists\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n const filePath = getPromptFilePath(promptsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${filePath}. Use update to modify existing prompts.`,\n };\n }\n\n // Generate the TypeScript file content (converts JSON Schema to Zod)\n const content = generatePromptFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save prompt',\n };\n }\n}\n\n/**\n * Delete a prompt definition file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param name - The prompt name\n * @returns Result of the operation\n */\nexport async function deletePrompt(\n promptsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getPromptFilePath(promptsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete prompt',\n };\n }\n}\n\n/**\n * Rename a prompt definition file and update its name property.\n * Since prompts contain Zod schemas that can't be easily regenerated from JSON Schema,\n * this function reads the file and updates the name property in place.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldName - The current prompt name\n * @param newName - The new prompt name\n * @returns Result of the operation\n */\nexport async function renamePrompt(\n promptsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getPromptFilePath(promptsDir, oldName);\n const newFilePath = getPromptFilePath(promptsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename prompt',\n };\n }\n}\n\n/**\n * Validate prompt data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validatePromptData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Prompt name is required and must be a string';\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Prompt model is required and must be a string';\n }\n\n // toolDescription is optional but should be string if provided\n if (data.toolDescription !== undefined && typeof data.toolDescription !== 'string') {\n return 'toolDescription must be a string';\n }\n\n // prompt content is optional but should be string if provided\n if (data.prompt !== undefined && typeof data.prompt !== 'string') {\n return 'prompt must be a string';\n }\n\n // Validate boolean fields (exposeAsTool removed - all prompts exposed by default)\n const booleanFields = ['includeChat', 'includePastTools', 'parallelToolCalls'];\n for (const field of booleanFields) {\n if (data[field] !== undefined && typeof data[field] !== 'boolean') {\n return `${field} must be a boolean`;\n }\n }\n\n // Validate toolChoice\n if (data.toolChoice !== undefined) {\n const validChoices = ['auto', 'none', 'required'];\n if (!validChoices.includes(data.toolChoice)) {\n return `Invalid toolChoice '${data.toolChoice}'. Must be one of: ${validChoices.join(', ')}`;\n }\n }\n\n // Validate tools is an array\n if (data.tools !== undefined && !Array.isArray(data.tools)) {\n return 'tools must be an array';\n }\n\n // Validate handoffAgents is an array\n if (data.handoffAgents !== undefined && !Array.isArray(data.handoffAgents)) {\n return 'handoffAgents must be an array';\n }\n\n // Validate reasoning config\n if (data.reasoning !== undefined) {\n if (typeof data.reasoning !== 'object') {\n return 'reasoning must be an object';\n }\n if (data.reasoning.effort !== undefined) {\n const validEfforts = ['low', 'medium', 'high'];\n if (!validEfforts.includes(data.reasoning.effort)) {\n return `Invalid reasoning.effort '${data.reasoning.effort}'. Must be one of: ${validEfforts.join(', ')}`;\n }\n }\n if (data.reasoning.maxTokens !== undefined && typeof data.reasoning.maxTokens !== 'number') {\n return 'reasoning.maxTokens must be a number';\n }\n }\n\n // requiredSchema is validated by the generatePromptFile function\n // (it handles JSON Schema to Zod conversion)\n\n return null;\n}\n\n// ============================================================================\n// Agent Persistence\n// ============================================================================\n\n/**\n * Transform snake_case agent data from the UI to camelCase for internal use.\n * The UI sends field names like `side_a_label`, `side_a_agent_prompt`, etc.\n * but the backend expects nested structures like `sideA.label`, `sideA.prompt`, etc.\n */\nexport function transformAgentData(data: any): any {\n const transformed: any = {\n name: data.name,\n };\n\n // title is deprecated but include if provided for backward compatibility\n if (data.title) {\n transformed.title = data.title;\n }\n\n // Type\n if (data.type) {\n transformed.type = data.type;\n }\n\n // Max session turns\n if (data.max_session_turns !== undefined) {\n transformed.maxSessionTurns = data.max_session_turns;\n }\n\n // Side A configuration\n transformed.sideA = {\n prompt: data.side_a_agent_prompt,\n };\n if (data.side_a_label) {\n transformed.sideA.label = data.side_a_label;\n }\n if (data.side_a_stop_on_response !== undefined) {\n transformed.sideA.stopOnResponse = data.side_a_stop_on_response;\n }\n if (data.side_a_stop_tool) {\n transformed.sideA.stopTool = data.side_a_stop_tool;\n }\n if (data.side_a_stop_tool_response_property) {\n transformed.sideA.stopToolResponseProperty = data.side_a_stop_tool_response_property;\n }\n if (data.side_a_max_turns !== undefined) {\n transformed.sideA.maxTurns = data.side_a_max_turns;\n }\n if (data.side_a_end_conversation_tool) {\n transformed.sideA.endConversationTool = data.side_a_end_conversation_tool;\n }\n if (data.side_a_manual_stop_condition !== undefined) {\n transformed.sideA.manualStopCondition = data.side_a_manual_stop_condition;\n }\n\n // Side B configuration (optional, for dual_ai)\n if (data.side_b_agent_prompt) {\n transformed.sideB = {\n prompt: data.side_b_agent_prompt,\n };\n if (data.side_b_label) {\n transformed.sideB.label = data.side_b_label;\n }\n if (data.side_b_stop_on_response !== undefined) {\n transformed.sideB.stopOnResponse = data.side_b_stop_on_response;\n }\n if (data.side_b_stop_tool) {\n transformed.sideB.stopTool = data.side_b_stop_tool;\n }\n if (data.side_b_stop_tool_response_property) {\n transformed.sideB.stopToolResponseProperty = data.side_b_stop_tool_response_property;\n }\n if (data.side_b_max_turns !== undefined) {\n transformed.sideB.maxTurns = data.side_b_max_turns;\n }\n if (data.side_b_end_conversation_tool) {\n transformed.sideB.endConversationTool = data.side_b_end_conversation_tool;\n }\n if (data.side_b_manual_stop_condition !== undefined) {\n transformed.sideB.manualStopCondition = data.side_b_manual_stop_condition;\n }\n }\n\n // Tool exposure\n if (data.expose_as_tool !== undefined) {\n transformed.exposeAsTool = data.expose_as_tool;\n }\n if (data.tool_description) {\n transformed.toolDescription = data.tool_description;\n }\n\n // Tags\n if (data.tags) {\n transformed.tags = data.tags;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for an agent definition.\n */\nexport function getAgentFilePath(agentsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(agentsDir, `${filename}.ts`);\n}\n\n/**\n * Check if an agent file already exists.\n */\nexport function agentExists(agentsDir: string, name: string): boolean {\n const filePath = getAgentFilePath(agentsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save an agent definition to a TypeScript file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param data - The agent definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveAgent(\n agentsDir: string,\n data: AgentDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure agents directory exists\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n const filePath = getAgentFilePath(agentsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${filePath}. Use update to modify existing agents.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateAgentFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save agent',\n };\n }\n}\n\n/**\n * Delete an agent definition file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param name - The agent name\n * @returns Result of the operation\n */\nexport async function deleteAgent(\n agentsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getAgentFilePath(agentsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete agent',\n };\n }\n}\n\n/**\n * Rename an agent definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldName - The current agent name\n * @param newName - The new agent name\n * @returns Result of the operation\n */\nexport async function renameAgent(\n agentsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getAgentFilePath(agentsDir, oldName);\n const newFilePath = getAgentFilePath(agentsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Agent file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename agent',\n };\n }\n}\n\n/**\n * Rename a model definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param modelsDir - The directory where models are stored\n * @param oldName - The current model name\n * @param newName - The new model name\n * @returns Result of the operation\n */\nexport async function renameModel(\n modelsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getModelFilePath(modelsDir, oldName);\n const newFilePath = getModelFilePath(modelsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Model file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Model file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename model',\n };\n }\n}\n\n// ============================================================================\n// Cascade Update Functions\n// ============================================================================\n\n/**\n * Update model references in all prompt files when a model is renamed.\n * Prompts reference models via the `model` field.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldModelName - The old model name\n * @param newModelName - The new model name\n * @returns Array of updated file paths\n */\nexport async function updateModelReferencesInPrompts(\n promptsDir: string,\n oldModelName: string,\n newModelName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match model: 'old_name' or model: \"old_name\"\n const modelRegex = new RegExp(`model:\\\\s*['\"]${escapeRegExp(oldModelName)}['\"]`, 'g');\n\n if (modelRegex.test(content)) {\n content = content.replace(modelRegex, `model: '${newModelName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in other prompt files when a prompt is renamed.\n * Prompts reference other prompts via the `tools` array (prompts exposed as tools).\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInPrompts(\n promptsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n let modified = false;\n\n // Match prompt references in tools array: 'old_name' or \"old_name\"\n // This is a simple string replacement within the tools array context\n const toolsArrayRegex = /tools:\\s*\\[([^\\]]*)\\]/gs;\n const newContent = content.replace(toolsArrayRegex, (match) => {\n const oldMatch = match;\n // Replace the prompt name within the tools array\n const promptRefRegex = new RegExp(`['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n const replaced = match.replace(promptRefRegex, `'${newPromptName}'`);\n if (replaced !== oldMatch) {\n modified = true;\n }\n return replaced;\n });\n\n if (modified) {\n await fs.promises.writeFile(filePath, newContent, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in agent files when a prompt is renamed.\n * Agents reference prompts via sideA.prompt and sideB.prompt fields.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInAgents(\n agentsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(agentsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match prompt: 'old_name' or prompt: \"old_name\" in sideA/sideB objects\n const promptRegex = new RegExp(`prompt:\\\\s*['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n\n if (promptRegex.test(content)) {\n content = content.replace(promptRegex, `prompt: '${newPromptName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Validate agent data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateAgentData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Agent name is required and must be a string';\n }\n\n // title is deprecated and optional - validate if provided\n if (data.title !== undefined && typeof data.title !== 'string') {\n return 'Agent title must be a string if provided';\n }\n\n // Validate type\n if (data.type !== undefined) {\n const validTypes = ['ai_human', 'dual_ai'];\n if (!validTypes.includes(data.type)) {\n return `Invalid type '${data.type}'. Must be one of: ${validTypes.join(', ')}`;\n }\n }\n\n // Validate sideA\n if (!data.sideA || typeof data.sideA !== 'object') {\n return 'sideA configuration is required';\n }\n\n if (!data.sideA.prompt || typeof data.sideA.prompt !== 'string') {\n return 'sideA.prompt is required and must be a string';\n }\n\n // Validate sideA optional fields\n if (data.sideA.label !== undefined && typeof data.sideA.label !== 'string') {\n return 'sideA.label must be a string';\n }\n\n if (data.sideA.stopOnResponse !== undefined && typeof data.sideA.stopOnResponse !== 'boolean') {\n return 'sideA.stopOnResponse must be a boolean';\n }\n\n if (data.sideA.stopTool !== undefined && typeof data.sideA.stopTool !== 'string') {\n return 'sideA.stopTool must be a string';\n }\n\n if (data.sideA.stopTool && !data.sideA.stopToolResponseProperty) {\n return 'sideA.stopToolResponseProperty is required when sideA.stopTool is set';\n }\n\n if (data.sideA.maxTurns !== undefined) {\n if (typeof data.sideA.maxTurns !== 'number' || data.sideA.maxTurns <= 0) {\n return 'sideA.maxTurns must be a positive number';\n }\n }\n\n // Validate dual_ai requires sideB\n if (data.type === 'dual_ai') {\n if (!data.sideB || typeof data.sideB !== 'object') {\n return 'sideB configuration is required for dual_ai type';\n }\n\n if (!data.sideB.prompt || typeof data.sideB.prompt !== 'string') {\n return 'sideB.prompt is required for dual_ai type';\n }\n\n // Validate sideB optional fields\n if (data.sideB.stopTool && !data.sideB.stopToolResponseProperty) {\n return 'sideB.stopToolResponseProperty is required when sideB.stopTool is set';\n }\n\n if (data.sideB.maxTurns !== undefined) {\n if (typeof data.sideB.maxTurns !== 'number' || data.sideB.maxTurns <= 0) {\n return 'sideB.maxTurns must be a positive number';\n }\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (data.exposeAsTool && !data.toolDescription) {\n return 'toolDescription is required when exposeAsTool is true';\n }\n\n // Validate maxSessionTurns\n if (data.maxSessionTurns !== undefined) {\n if (typeof data.maxSessionTurns !== 'number' || data.maxSessionTurns <= 0) {\n return 'maxSessionTurns must be a positive number';\n }\n }\n\n // Validate tags\n if (data.tags !== undefined) {\n if (!Array.isArray(data.tags)) {\n return 'tags must be an array';\n }\n for (const tag of data.tags) {\n if (typeof tag !== 'string') {\n return 'Each tag must be a string';\n }\n }\n }\n\n return null;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Plugin, ViteDevServer } from \"vite\";\nimport { generateTypes, getDefaultConfig, needsRegeneration } from \"./sdk/generateTypes.js\";\nimport {\n saveModel,\n deleteModel,\n renameModel,\n validateModelData,\n modelExists,\n transformModelData,\n savePrompt,\n deletePrompt,\n renamePrompt,\n validatePromptData,\n promptExists,\n transformPromptData,\n saveAgent,\n deleteAgent,\n validateAgentData,\n agentExists,\n transformAgentData,\n updateModelReferencesInPrompts,\n updatePromptReferencesInPrompts,\n updatePromptReferencesInAgents,\n} from \"./sdk/persistence/index.js\";\n\nconst VIRTUAL_TOOLS_ID = \"virtual:@standardagents-tools\";\nconst RESOLVED_VIRTUAL_TOOLS_ID = \"\\0\" + VIRTUAL_TOOLS_ID;\n\nconst VIRTUAL_ROUTES_ID = \"virtual:@standardagents-routes\";\nconst RESOLVED_VIRTUAL_ROUTES_ID = \"\\0\" + VIRTUAL_ROUTES_ID;\n\n// Legacy alias for backward compatibility\nconst VIRTUAL_ROUTER_ID = \"virtual:@standardagents/router\";\nconst RESOLVED_VIRTUAL_ROUTER_ID = \"\\0\" + VIRTUAL_ROUTER_ID;\n\nconst VIRTUAL_HOOKS_ID = \"virtual:@standardagents-hooks\";\nconst RESOLVED_VIRTUAL_HOOKS_ID = \"\\0\" + VIRTUAL_HOOKS_ID;\n\nconst VIRTUAL_CONFIG_ID = \"virtual:@standardagents-config\";\nconst RESOLVED_VIRTUAL_CONFIG_ID = \"\\0\" + VIRTUAL_CONFIG_ID;\n\nconst VIRTUAL_THREAD_API_ID = \"virtual:@standardagents-thread-api\";\nconst RESOLVED_VIRTUAL_THREAD_API_ID = \"\\0\" + VIRTUAL_THREAD_API_ID;\n\n// Virtual modules for models, prompts, and agents\nconst VIRTUAL_MODELS_ID = \"virtual:@standardagents-models\";\nconst RESOLVED_VIRTUAL_MODELS_ID = \"\\0\" + VIRTUAL_MODELS_ID;\n\nconst VIRTUAL_PROMPTS_ID = \"virtual:@standardagents-prompts\";\nconst RESOLVED_VIRTUAL_PROMPTS_ID = \"\\0\" + VIRTUAL_PROMPTS_ID;\n\nconst VIRTUAL_AGENTS_ID = \"virtual:@standardagents-agents\";\nconst RESOLVED_VIRTUAL_AGENTS_ID = \"\\0\" + VIRTUAL_AGENTS_ID;\n\n// Consolidated virtual module that provides DurableThread and DurableAgentBuilder\n// with methods already implemented (tools, hooks, models, prompts, agents)\nconst VIRTUAL_BUILDER_ID = \"virtual:@standardagents/builder\";\nconst RESOLVED_VIRTUAL_BUILDER_ID = \"\\0\" + VIRTUAL_BUILDER_ID;\n\n// API Routes functionality\nfunction scanApiDirectory(\n dir: string,\n baseRoute = \"\"\n): Array<{\n method: string;\n route: string;\n importPath: string;\n}> {\n const routes: Array<{ method: string; route: string; importPath: string }> =\n [];\n\n if (!fs.existsSync(dir)) {\n return routes;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Convert [param] to :param for rou3 dynamic routes in directory names\n const convertedDirName = entry.name.replace(/\\[([^\\]]+)\\]/g, ':$1');\n const subRoute = baseRoute + \"/\" + convertedDirName;\n routes.push(...scanApiDirectory(fullPath, subRoute));\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(/\\.ts$/, \"\");\n let method = \"GET\";\n let routePath = baseRoute;\n\n if (fileName.includes(\".\")) {\n const parts = fileName.split(\".\");\n const methodPart = parts[parts.length - 1].toUpperCase();\n if ([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(methodPart)) {\n method = methodPart;\n const pathPart = parts.slice(0, -1).join(\".\");\n if (pathPart !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = pathPart.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n\n const importPath =\n \"./\" + path.relative(process.cwd(), fullPath).replace(/\\\\/g, \"/\");\n\n routes.push({\n method,\n route: routePath || \"/\",\n importPath,\n });\n }\n }\n\n return routes;\n } catch (error) {\n console.error(`Error scanning API directory ${dir}:`, error);\n return [];\n }\n}\n\n// Tools functionality\nfunction isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*[a-z0-9]$/.test(str) || /^[a-z]$/.test(str);\n}\n\nfunction validateToolFile(filePath: string, fileName: string): string | null {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const hasDefaultExport = /export\\s+default\\s+defineTool/.test(content);\n\n if (!hasDefaultExport) {\n return `Tool file '${fileName}.ts' must have a default export using defineTool()`;\n }\n\n return null;\n } catch (error) {\n return `Failed to read tool file '${fileName}.ts'`;\n }\n}\n\nasync function scanToolsDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const tools: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return tools;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n let toolError: string | undefined;\n\n const validationError = validateToolFile(filePath, fileName);\n\n if (validationError) {\n toolError = validationError;\n console.error(`\\n❌ Tool validation error: ${validationError}`);\n }\n\n if (!isSnakeCase(fileName)) {\n const warning = `Tool name should be in snake_case format (e.g., 'log_name', 'send_email')`;\n if (toolError) {\n toolError += ` | ${warning}`;\n } else {\n toolError = warning;\n }\n console.warn(\n `\\n⚠️ Tool naming warning: '${fileName}' should be in snake_case format (e.g., 'log_name', 'send_email')`\n );\n }\n\n tools.push({ name: fileName, importPath, error: toolError });\n }\n }\n\n return tools;\n}\n\nasync function scanHooksDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string }>> {\n const hooks: Array<{ name: string; importPath: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return hooks;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n\n // Skip index.ts - it's a utility module, not a hook\n if (fileName === \"index\") {\n continue;\n }\n\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n hooks.push({ name: fileName, importPath });\n }\n }\n\n return hooks;\n}\n\n/**\n * Scan a directory for config definitions (models, prompts, or agents).\n * Extracts the name from the defineX() call in each file.\n */\nasync function scanConfigDirectory(\n dir: string,\n definePattern: RegExp\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const items: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return items;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n // Check for default export with define function\n const hasDefaultExport = definePattern.test(content);\n if (!hasDefaultExport) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `File must have a default export using the define function`,\n });\n continue;\n }\n\n // Extract name from defineX({ name: 'xxx', ... })\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n items.push({ name: nameMatch[1], importPath });\n } else {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Could not extract name from definition`,\n });\n }\n } catch (error) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Failed to read file: ${error}`,\n });\n }\n }\n }\n\n return items;\n}\n\nasync function scanModelsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineModel/);\n}\n\nasync function scanPromptsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+definePrompt/);\n}\n\nasync function scanAgentsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineAgent/);\n}\n\n/**\n * Parse JSON body from an incoming HTTP request (Node.js IncomingMessage).\n * Used by dev-mode API handlers that intercept requests before they reach workerd.\n */\nfunction parseRequestBody(req: import('http').IncomingMessage): Promise<any> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch (e) {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\nexport interface AgentPluginOptions {\n mountPoint?: string;\n toolsDir?: string;\n hooksDir?: string;\n apiDir?: string;\n modelsDir?: string;\n promptsDir?: string;\n agentsDir?: string;\n}\n\nexport function agentbuilder(options: AgentPluginOptions = {}): Plugin {\n // Normalize mount point: ensure leading slash, no trailing slash\n let mountPoint = options.mountPoint || \"/agents\";\n if (!mountPoint.startsWith(\"/\")) {\n mountPoint = \"/\" + mountPoint;\n }\n if (mountPoint.endsWith(\"/\") && mountPoint.length > 1) {\n mountPoint = mountPoint.slice(0, -1);\n }\n\n const toolsDir = options.toolsDir\n ? path.resolve(process.cwd(), options.toolsDir)\n : path.resolve(process.cwd(), \"agents/tools\");\n const hooksDir = options.hooksDir\n ? path.resolve(process.cwd(), options.hooksDir)\n : path.resolve(process.cwd(), \"agents/hooks\");\n const threadApiDir = options.apiDir\n ? path.resolve(process.cwd(), options.apiDir)\n : path.resolve(process.cwd(), \"agents/api\");\n const modelsDir = options.modelsDir\n ? path.resolve(process.cwd(), options.modelsDir)\n : path.resolve(process.cwd(), \"agents/models\");\n const promptsDir = options.promptsDir\n ? path.resolve(process.cwd(), options.promptsDir)\n : path.resolve(process.cwd(), \"agents/prompts\");\n const agentsDir = options.agentsDir\n ? path.resolve(process.cwd(), options.agentsDir)\n : path.resolve(process.cwd(), \"agents/agents\");\n const outputDir = path.resolve(process.cwd(), \".agents\");\n\n // Type generation configuration\n const typeGenConfig = {\n modelsDir,\n promptsDir,\n agentsDir,\n toolsDir,\n outputDir,\n };\n\n // Helper to regenerate types\n function regenerateTypes() {\n if (needsRegeneration(typeGenConfig)) {\n generateTypes(typeGenConfig);\n }\n }\n\n // Read and prepare rou3 code for inlining\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const rou3Path = path.join(__dirname, '../dist/rou3.js');\n let rou3Code = '';\n try {\n rou3Code = fs.readFileSync(rou3Path, 'utf-8')\n // Remove export statement\n .replace(/^export \\{[^}]+\\};?\\s*$/gm, '')\n // Remove sourcemap comments\n .replace(/\\/\\/# sourceMappingURL=.+$/gm, '')\n .trim();\n } catch (err) {\n console.warn('[vite-plugin-agent] Could not read rou3.js for inlining:', err);\n }\n\n let routesVersion = Math.random().toString(36).substring(7);\n\n // Helper to dynamically find the worker environment (non-client environment)\n // The actual environment name comes from the user's wrangler.jsonc 'name' property\n // and is transformed to snake_case by the Cloudflare Vite plugin\n function getWorkerEnvironment(server: ViteDevServer) {\n const envNames = Object.keys(server.environments);\n // Find the first environment that's not 'client' (the default client environment)\n const workerEnvName = envNames.find(name => name !== 'client');\n\n if (!workerEnvName) {\n console.warn('[vite-plugin-agent] Could not find worker environment');\n return null;\n }\n\n return server.environments[workerEnvName];\n }\n\n // Helper functions for module reloading\n function reloadToolsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const toolsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_TOOLS_ID\n );\n if (toolsModule) {\n workerEnv.reloadModule(toolsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:tools-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadRoutesModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routesModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTES_ID\n );\n if (routesModule) {\n routesVersion = Math.random().toString(36).substring(7);\n workerEnv.reloadModule(routesModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:routes-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadHooksModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const hooksModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_HOOKS_ID\n );\n if (hooksModule) {\n workerEnv.reloadModule(hooksModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:hooks-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadModelsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const modelsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODELS_ID\n );\n if (modelsModule) {\n await workerEnv.reloadModule(modelsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:models-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadPromptsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const promptsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_PROMPTS_ID\n );\n if (promptsModule) {\n await workerEnv.reloadModule(promptsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:prompts-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadAgentsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const agentsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_AGENTS_ID\n );\n if (agentsModule) {\n await workerEnv.reloadModule(agentsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:agents-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadRouterModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routerModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTER_ID\n );\n if (routerModule) {\n await workerEnv.reloadModule(routerModule);\n return true;\n }\n return false;\n }\n\n function handleFileChange(\n file: string,\n server: ViteDevServer\n ) {\n const isToolFile = file.startsWith(toolsDir) && file.endsWith(\".ts\");\n const isThreadApiFile = file.startsWith(threadApiDir) && file.endsWith(\".ts\");\n const isHookFile = file.startsWith(hooksDir) && file.endsWith(\".ts\");\n const isModelFile = file.startsWith(modelsDir) && file.endsWith(\".ts\");\n const isPromptFile = file.startsWith(promptsDir) && file.endsWith(\".ts\");\n const isAgentFile = file.startsWith(agentsDir) && file.endsWith(\".ts\");\n\n const isConfigFile = isModelFile || isPromptFile || isAgentFile;\n\n if (!isToolFile && !isThreadApiFile && !isHookFile && !isConfigFile) return;\n\n // Regenerate types when config files change\n if (isConfigFile || isToolFile) {\n regenerateTypes();\n }\n\n if (isToolFile) {\n reloadToolsModule(server);\n }\n\n if (isModelFile) {\n reloadModelsModule(server);\n }\n\n if (isPromptFile) {\n reloadPromptsModule(server);\n }\n\n if (isAgentFile) {\n reloadAgentsModule(server);\n }\n\n if (isThreadApiFile) {\n reloadRoutesModule(server);\n }\n\n if (isHookFile) {\n reloadHooksModule(server);\n }\n }\n\n return {\n name: \"vite-plugin-agent\",\n\n config() {\n return {\n optimizeDeps: {\n // Pre-bundle these deps to prevent reload during startup\n include: ['openai', 'zod'],\n // Exclude workspace packages from pre-bundling to prevent \"new version of pre-bundle\" errors\n // during first startup when node_modules/.vite cache is empty\n exclude: [\n '@standardagents/builder/mcp',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ],\n },\n ssr: {\n // Mark as external for SSR/worker builds to prevent bundling\n // Note: @standardagents/builder, @standardagents/builder/runtime, built-in-routes, and rou3\n // are NOT external - they must be bundled into the worker for Cloudflare Workers runtime\n external: [\n '@standardagents/builder/mcp',\n ],\n },\n build: {\n rollupOptions: {\n // Also mark as external for Rollup/build (used by Cloudflare Workers plugin)\n // Note: @standardagents/builder, @standardagents/builder/runtime, built-in-routes, and rou3\n // are NOT external - they must be bundled into the worker for Cloudflare Workers runtime\n external: [\n '@standardagents/builder/mcp',\n ],\n },\n },\n };\n },\n\n resolveId(id) {\n if (id === VIRTUAL_TOOLS_ID) {\n return RESOLVED_VIRTUAL_TOOLS_ID;\n }\n if (id === VIRTUAL_ROUTES_ID || id === VIRTUAL_ROUTER_ID) {\n return RESOLVED_VIRTUAL_ROUTES_ID;\n }\n if (id === VIRTUAL_HOOKS_ID) {\n return RESOLVED_VIRTUAL_HOOKS_ID;\n }\n if (id === VIRTUAL_CONFIG_ID) {\n return RESOLVED_VIRTUAL_CONFIG_ID;\n }\n if (id === VIRTUAL_THREAD_API_ID) {\n return RESOLVED_VIRTUAL_THREAD_API_ID;\n }\n if (id === VIRTUAL_MODELS_ID) {\n return RESOLVED_VIRTUAL_MODELS_ID;\n }\n if (id === VIRTUAL_PROMPTS_ID) {\n return RESOLVED_VIRTUAL_PROMPTS_ID;\n }\n if (id === VIRTUAL_AGENTS_ID) {\n return RESOLVED_VIRTUAL_AGENTS_ID;\n }\n if (id === VIRTUAL_BUILDER_ID) {\n return RESOLVED_VIRTUAL_BUILDER_ID;\n }\n },\n\n async load(id) {\n\n if (id === RESOLVED_VIRTUAL_TOOLS_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n const moduleCode = `// Virtual agent tools module\nexport const tools = {\n${toolsCode}\n};`;\n return moduleCode;\n }\n\n if (id === RESOLVED_VIRTUAL_ROUTES_ID) {\n // Scan user thread API directory\n const threadRoutes = scanApiDirectory(threadApiDir);\n\n // Generate user thread route registration code\n const threadRouteCode = threadRoutes\n .map(({ method, route, importPath }) => {\n const apiRoute = `/api/threads/:id${route}`;\n return ` addRoute(\n router,\n \"${method}\",\n \"${apiRoute}\",\n /* v${routesVersion} */ async () => (await import(\"${importPath}\")).default\n );`;\n })\n .join('\\n');\n\n return `// Inline rou3 router code (no external imports)\n${rou3Code}\n\nimport { registerBuiltInRoutes } from \"@standardagents/builder/built-in-routes\";\nimport { config } from \"virtual:@standardagents-config\";\nimport { tools } from \"virtual:@standardagents-tools\";\nimport { hooks } from \"virtual:@standardagents-hooks\";\nimport { models, modelNames } from \"virtual:@standardagents-models\";\nimport { prompts, promptNames } from \"virtual:@standardagents-prompts\";\nimport { agents, agentNames } from \"virtual:@standardagents-agents\";\nimport { requireAuth } from \"@standardagents/builder/runtime\";\n\nconst MOUNT_POINT = \"${mountPoint}\";\n\n// Routes that don't require authentication\nconst PUBLIC_ROUTES = [\n '/api/auth/login',\n '/api/auth/config',\n '/api/auth/oauth/github',\n '/api/auth/oauth/google',\n '/api/auth/oauth/github/callback',\n '/api/auth/oauth/google/callback'\n];\n\n// Check if a route is public (no auth required)\nfunction isPublicRoute(routePath) {\n // Exact match for auth routes\n if (PUBLIC_ROUTES.includes(routePath)) {\n return true;\n }\n\n // Thread routes are always public\n if (routePath.startsWith('/api/threads/') || routePath === '/api/threads') {\n return true;\n }\n\n return false;\n}\n\nexport async function router(request, env) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Check if request is under mount point\n if (!pathname.startsWith(MOUNT_POINT)) {\n return null;\n }\n\n // Strip mount point prefix for route matching, ensuring we keep the leading slash\n let routePath = pathname.slice(MOUNT_POINT.length) || \"/\";\n if (!routePath.startsWith('/')) {\n routePath = '/' + routePath;\n }\n\n // Handle API routes\n const router = createRouter();\n\n // Register built-in API routes with runtime data\n registerBuiltInRoutes(router, { config, tools, models, modelNames, prompts, promptNames, agents, agentNames });\n\n // Register user thread API routes\n${threadRouteCode}\n\n const routeMatch = findRoute(\n router,\n request.method.toUpperCase(),\n routePath\n );\n\n if (routeMatch) {\n // Check if authentication is required for this route\n const publicRoute = isPublicRoute(routePath);\n const isApiRoute = routePath.startsWith('/api/');\n\n let authContext = null;\n\n // Require authentication for all API routes except public ones\n if (isApiRoute && !publicRoute) {\n const authResult = await requireAuth(request, env);\n\n // If requireAuth returns a Response, it's an error (401)\n if (authResult instanceof Response) {\n return authResult;\n }\n\n authContext = authResult;\n }\n\n const controller = await routeMatch.data();\n const context = {\n req: request,\n params: routeMatch.params || {},\n env: env,\n url: url,\n config,\n tools,\n auth: authContext, // Add auth context to controller context\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // Serve UI for all other routes (SPA fallback)\n return serveUI(routePath, env);\n}\n\nasync function serveUI(pathname, env) {\n try {\n // Use Cloudflare Workers Assets binding (automatically created from wrangler assets config)\n if (env.ASSETS) {\n try {\n // Create a proper request for the asset path\n // Use a dummy origin since we only care about the path\n // Re-add mount point since pathname was stripped by router\n const assetUrl = \\`http://localhost\\${MOUNT_POINT}\\${pathname}\\`;\n let response = await env.ASSETS.fetch(assetUrl);\n\n // If not found, fall back to index.html for SPA routing\n const isIndexHtml = response.status === 404 || pathname === \"/\" || !pathname.includes(\".\");\n if (isIndexHtml) {\n response = await env.ASSETS.fetch(\\`http://localhost\\${MOUNT_POINT}/index.html\\`);\n\n // Transform HTML to use configured mount point\n if (response.status === 200) {\n const html = await response.text();\n // Replace default /agents/ paths with configured mount point\n const modifiedHtml = html.replace(/\\\\/agents\\\\//g, \\`\\${MOUNT_POINT}/\\`);\n return new Response(modifiedHtml, {\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n },\n });\n }\n }\n\n return response;\n } catch (assetError) {\n console.error(\"Error fetching from ASSETS:\", assetError);\n }\n }\n\n // Fallback: proxy to UI dev server if explicitly configured\n if (env.UI_DEV_SERVER) {\n const assetPath = pathname === \"/\" ? \"/index.html\" : pathname;\n const response = await fetch(\\`\\${env.UI_DEV_SERVER}\\${assetPath}\\`);\n return response;\n }\n\n // In production/dev, assets should be served by Cloudflare Workers automatically\n // This function only handles fallback cases\n return null;\n } catch (error) {\n console.error(\"Error serving UI:\", error);\n return null;\n }\n}\n\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_HOOKS_ID) {\n const hooks = await scanHooksDirectory(hooksDir);\n\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n return `// Virtual agent hooks module\nexport const hooks = {\n${hooksCode}\n};`;\n }\n\n if (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n // Get relative paths from cwd\n const relativeToolsDir = path.relative(process.cwd(), toolsDir).replace(/\\\\/g, \"/\");\n const relativeHooksDir = path.relative(process.cwd(), hooksDir).replace(/\\\\/g, \"/\");\n const relativeApiDir = path.relative(process.cwd(), threadApiDir).replace(/\\\\/g, \"/\");\n const relativeModelsDir = path.relative(process.cwd(), modelsDir).replace(/\\\\/g, \"/\");\n const relativePromptsDir = path.relative(process.cwd(), promptsDir).replace(/\\\\/g, \"/\");\n const relativeAgentsDir = path.relative(process.cwd(), agentsDir).replace(/\\\\/g, \"/\");\n\n return `// Virtual agent config module\nexport const config = {\n toolsDir: \"${relativeToolsDir}\",\n hooksDir: \"${relativeHooksDir}\",\n apiDir: \"${relativeApiDir}\",\n modelsDir: \"${relativeModelsDir}\",\n promptsDir: \"${relativePromptsDir}\",\n agentsDir: \"${relativeAgentsDir}\",\n mountPoint: \"${mountPoint}\",\n};`;\n }\n\n // Virtual modules for models, prompts, and agents\n if (id === RESOLVED_VIRTUAL_MODELS_ID) {\n const models = await scanModelsDirectory(modelsDir);\n\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent models module\nexport const models = {\n${modelsCode}\n};\n\nexport const modelNames = ${JSON.stringify(models.filter(m => !m.error).map(m => m.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_PROMPTS_ID) {\n const prompts = await scanPromptsDirectory(promptsDir);\n\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent prompts module\nexport const prompts = {\n${promptsCode}\n};\n\nexport const promptNames = ${JSON.stringify(prompts.filter(p => !p.error).map(p => p.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_AGENTS_ID) {\n const agents = await scanAgentsDirectory(agentsDir);\n\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent agents module\nexport const agents = {\n${agentsCode}\n};\n\nexport const agentNames = ${JSON.stringify(agents.filter(a => !a.error).map(a => a.name))};\n`;\n }\n\n // Consolidated virtual module: virtual:@standardagents/builder\n // Exports DurableThread and DurableAgentBuilder classes with methods already implemented\n if (id === RESOLVED_VIRTUAL_BUILDER_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n const hooks = await scanHooksDirectory(hooksDir);\n const models = await scanModelsDirectory(modelsDir);\n const prompts = await scanPromptsDirectory(promptsDir);\n const agents = await scanAgentsDirectory(agentsDir);\n\n // Helper to convert relative paths to absolute paths\n // Virtual modules need absolute paths since relative paths are resolved against the virtual module location\n const toAbsolutePath = (relativePath: string) => {\n if (relativePath.startsWith('./')) {\n return path.resolve(process.cwd(), relativePath).replace(/\\\\/g, '/');\n }\n return relativePath;\n };\n\n // Generate tools code\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate hooks code\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n const absPath = toAbsolutePath(importPath);\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n // Generate models code\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate prompts code\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate agents code\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Consolidated virtual module: virtual:@standardagents/builder\n// Provides DurableThread, DurableAgentBuilder, and router\nimport { DurableThread as _BaseDurableThread } from '@standardagents/builder/runtime';\nimport { DurableAgentBuilder as _BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n\n// Re-export router from virtual:@standardagents-routes\nexport { router } from 'virtual:@standardagents-routes';\n\n// Registry objects\nconst _tools = {\n${toolsCode}\n};\n\nconst _hooks = {\n${hooksCode}\n};\n\nconst _models = {\n${modelsCode}\n};\n\nconst _prompts = {\n${promptsCode}\n};\n\nconst _agents = {\n${agentsCode}\n};\n\n/**\n * DurableThread with all virtual module methods already implemented.\n * Simply extend this class in your agents/Thread.ts file.\n */\nexport class DurableThread extends _BaseDurableThread {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n\n/**\n * DurableAgentBuilder with all virtual module methods already implemented.\n * Simply extend this class in your agents/AgentBuilder.ts file.\n */\nexport class DurableAgentBuilder extends _BaseDurableAgentBuilder {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n`;\n }\n },\n\n buildStart() {\n // Generate types on startup\n regenerateTypes();\n\n // Watch all directories\n this.addWatchFile(toolsDir);\n this.addWatchFile(threadApiDir);\n this.addWatchFile(hooksDir);\n this.addWatchFile(modelsDir);\n this.addWatchFile(promptsDir);\n this.addWatchFile(agentsDir);\n },\n\n configureServer(server) {\n // Watch for new files being added\n server.watcher.on(\"add\", async (file) => {\n handleFileChange(file, server);\n });\n\n // Watch for files being deleted\n server.watcher.on(\"unlink\", (file) => {\n handleFileChange(file, server);\n });\n\n // Add middleware to serve AgentBuilder UI\n // This emulates how Cloudflare Workers Assets binding works in production\n server.middlewares.use(async (req, res, next) => {\n const url = req.url;\n\n // Check if request is under mount point\n if (!url || !url.startsWith(mountPoint)) {\n next();\n return;\n }\n\n // Strip mount point prefix, ensuring we keep the leading slash\n let pathWithoutMount = url.slice(mountPoint.length) || '/';\n if (!pathWithoutMount.startsWith('/')) {\n pathWithoutMount = '/' + pathWithoutMount;\n }\n\n // Handle dev-only API routes that require filesystem access\n // These endpoints write to the filesystem and must be handled in Node.js\n const method = req.method?.toUpperCase();\n\n // GET /api/models - List all models (handled here to read fresh from filesystem)\n if (pathWithoutMount === '/api/models' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const modelList = files.map((file: string) => {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getProvider = (c: string) => c.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getInputPrice = (c: string) => {\n const match = c.match(/inputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getOutputPrice = (c: string) => {\n const match = c.match(/outputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getCachedPrice = (c: string) => {\n const match = c.match(/cachedPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getIncludedProviders = (c: string) => {\n const match = c.match(/includedProviders:\\s*\\[([^\\]]*)\\]/);\n if (!match) return undefined;\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getFallbacks = (c: string) => {\n const match = c.match(/fallbacks:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const fallbacks = getFallbacks(content);\n const fallbackObjects = fallbacks.map((fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n }));\n\n return {\n id: name,\n name: name,\n provider: getProvider(content),\n model: getModel(content),\n input_price: getInputPrice(content),\n output_price: getOutputPrice(content),\n cached_price: getCachedPrice(content),\n included_providers: getIncludedProviders(content),\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading model ${file}:`, error);\n return null;\n }\n });\n\n const validModels = modelList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ models: validModels }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list models' }));\n return;\n }\n }\n\n // POST /api/models - Create a new model\n if (pathWithoutMount === '/api/models' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n const validationError = validateModelData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if model already exists\n if (modelExists(modelsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveModel(modelsDir, body, false);\n\n if (result.success) {\n // Reload the models virtual module to reflect the new model\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create model' }));\n return;\n }\n }\n\n // PUT /api/models/:name - Update an existing model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelPutMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelPutMatch && method === 'PUT') {\n try {\n const urlModelName = decodeURIComponent(modelPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlModelName;\n\n const validationError = validateModelData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n\n if (isNameChange) {\n // Rename the model file first\n const renameResult = await renameModel(modelsDir, urlModelName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update model references in all prompts\n updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);\n }\n\n // Save the updated model data\n const result = await saveModel(modelsDir, body, true);\n\n if (result.success) {\n // Reload the models virtual module to reflect the changes\n await reloadModelsModule(server);\n\n // If prompts were updated due to cascade, reload prompts module too\n if (updatedPrompts.length > 0) {\n await reloadPromptsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n // Small delay to ensure filesystem operations are fully flushed\n await new Promise(resolve => setTimeout(resolve, 100));\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlModelName, to: newName }, updatedPrompts }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update model' }));\n return;\n }\n }\n\n // DELETE /api/models/:name - Delete a model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelDeleteMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelDeleteMatch && method === 'DELETE') {\n try {\n const modelName = decodeURIComponent(modelDeleteMatch[1]);\n const result = await deleteModel(modelsDir, modelName);\n\n if (result.success) {\n // Reload the models virtual module to reflect the deletion\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: modelName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete model' }));\n return;\n }\n }\n\n // POST /api/prompts - Create a new prompt\n if (pathWithoutMount === '/api/prompts' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n const validationError = validatePromptData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if prompt already exists\n if (promptExists(promptsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Prompt '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await savePrompt(promptsDir, body, false);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the new prompt\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create prompt' }));\n return;\n }\n }\n\n // PUT /api/prompts/:name - Update an existing prompt\n const promptPutMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptPutMatch && method === 'PUT') {\n try {\n const urlPromptName = decodeURIComponent(promptPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlPromptName;\n\n const validationError = validatePromptData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n let updatedAgents: string[] = [];\n\n if (isNameChange) {\n // Rename the prompt file first\n const renameResult = await renamePrompt(promptsDir, urlPromptName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update prompt references in other prompts (tools array)\n updatedPrompts = await updatePromptReferencesInPrompts(promptsDir, urlPromptName, newName);\n\n // Cascade update: update prompt references in agents (defaultPrompt field)\n updatedAgents = await updatePromptReferencesInAgents(agentsDir, urlPromptName, newName);\n }\n\n // Save the updated prompt data (will overwrite the renamed file)\n const result = await savePrompt(promptsDir, body, true);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the changes\n await reloadPromptsModule(server);\n\n // If agents were updated due to cascade, reload agents module too\n if (updatedAgents.length > 0) {\n await reloadAgentsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlPromptName, to: newName }, updatedPrompts, updatedAgents }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update prompt' }));\n return;\n }\n }\n\n // DELETE /api/prompts/:name - Delete a prompt\n const promptDeleteMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptDeleteMatch && method === 'DELETE') {\n try {\n const promptName = decodeURIComponent(promptDeleteMatch[1]);\n const result = await deletePrompt(promptsDir, promptName);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the deletion\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: promptName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete prompt' }));\n return;\n }\n }\n\n // POST /api/agents - Create a new agent\n if (pathWithoutMount === '/api/agents' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n const validationError = validateAgentData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if agent already exists\n if (agentExists(agentsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Agent '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveAgent(agentsDir, body, false);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the new agent\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create agent' }));\n return;\n }\n }\n\n // PUT /api/agents/:name - Update an existing agent\n const agentPutMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentPutMatch && method === 'PUT') {\n try {\n const agentName = decodeURIComponent(agentPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n\n // Ensure the name in the body matches the URL (or use URL name)\n body.name = agentName;\n\n const validationError = validateAgentData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // For updates, the agent should exist (but we allow overwrite)\n const result = await saveAgent(agentsDir, body, true);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the changes\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update agent' }));\n return;\n }\n }\n\n // DELETE /api/agents/:name - Delete an agent\n const agentDeleteMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentDeleteMatch && method === 'DELETE') {\n try {\n const agentName = decodeURIComponent(agentDeleteMatch[1]);\n const result = await deleteAgent(agentsDir, agentName);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the deletion\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: agentName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete agent' }));\n return;\n }\n }\n\n // Let other API routes pass through to the worker\n if (pathWithoutMount.startsWith('/api/')) {\n next();\n return;\n }\n\n // Check if this is a static asset request\n const isStaticAsset = pathWithoutMount.startsWith('/assets/') ||\n pathWithoutMount.startsWith('/vendor.js') ||\n pathWithoutMount.startsWith('/vue.js') ||\n pathWithoutMount.startsWith('/monaco.js') ||\n pathWithoutMount.startsWith('/index.js') ||\n pathWithoutMount.startsWith('/index.css') ||\n pathWithoutMount.match(/\\.(js|css|png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/);\n\n // For static assets, serve the actual file\n // For all other routes (including SPA routes like /login, /threads, etc.), serve index.html\n const shouldServeUI = true;\n\n if (shouldServeUI) {\n // Serve from the built client directory\n // Client is always at dist/client relative to package root\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n let filePath: string;\n if (isStaticAsset) {\n // For static assets, serve the actual file\n const cleanUrl = pathWithoutMount.split('?')[0];\n filePath = path.join(clientDir, cleanUrl);\n } else {\n // For all other routes (SPA routes), serve index.html\n filePath = path.join(clientDir, 'index.html');\n }\n\n try {\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath);\n\n // Inject mount point config into HTML\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n // Set appropriate MIME type\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.ttf': 'font/ttf',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n };\n\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n res.setHeader('Content-Type', contentType);\n res.end(content);\n return;\n }\n } catch (error) {\n console.error('Error serving AgentBuilder UI:', error);\n }\n }\n\n next();\n });\n },\n\n handleHotUpdate({ file, server }) {\n handleFileChange(file, server);\n },\n\n writeBundle(options, bundle) {\n // In production build, copy client files to user's dist directory\n // Files go to dist/client/{mountPath} to match ASSETS binding expectations\n const outDir = options.dir || 'dist';\n // Put client files in a 'client' subdirectory, preserving mountPath structure\n // This ensures ASSETS can find files at the expected paths (e.g., /agentbuilder/index.html)\n const mountPath = mountPoint.slice(1); // \"agentbuilder\" or \"\"\n const mountDir = mountPath\n ? path.join(outDir, '../client', mountPath) // dist/client/agentbuilder\n : path.join(outDir, '../client'); // dist/client\n\n // Locate the client directory\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n if (!fs.existsSync(clientDir)) {\n console.warn(`[agentbuilder] Client directory not found at ${clientDir}`);\n return;\n }\n\n // Create mount directory\n fs.mkdirSync(mountDir, { recursive: true });\n\n // Copy all client files recursively\n function copyRecursive(src: string, dest: string) {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyRecursive(srcPath, destPath);\n } else {\n let content = fs.readFileSync(srcPath);\n\n // Inject mount point config into index.html\n if (entry.name === 'index.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n fs.writeFileSync(destPath, content);\n }\n }\n }\n\n copyRecursive(clientDir, mountDir);\n },\n };\n}\n","import { createRouter, findRoute } from \"rou3\";\nimport type { ThreadInstance, ThreadMetadata } from \"../agents/types.js\";\n\n/**\n * Minimum required environment bindings for thread endpoints.\n * User's Env interface should extend this.\n *\n * Uses Rpc.DurableObjectBranded to allow users to specify their own\n * Durable Object types that extend DurableThread/DurableAgentBuilder.\n */\nexport interface ThreadEnv {\n AGENT_BUILDER_THREAD: DurableObjectNamespace<Rpc.DurableObjectBranded>;\n AGENT_BUILDER: DurableObjectNamespace<Rpc.DurableObjectBranded>; // Root DO for thread/config lookups\n}\n\nexport interface ControllerContext<Env = any> {\n req: Request;\n params: Record<string, string>;\n env: Env;\n url: URL;\n}\n\nexport type Controller<Env = any> = (\n context: ControllerContext<Env>\n) =>\n | string\n | Promise<string>\n | Response\n | Promise<Response>\n | ReadableStream\n | Promise<ReadableStream>\n | null\n | Promise<null>\n | void\n | Promise<void>\n | Promise<object>\n | object;\n\nexport interface ThreadEndpointContext {\n req: Request;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n}\n\nexport async function route<Env = any>(\n url: URL,\n request: Request,\n env: Env\n): Promise<Response | null> {\n const router = createRouter<() => Promise<Controller>>();\n // @ts-ignore-next-line\n const routesLoader = await import(\"virtual:@standardagents-routes\");\n routesLoader.default(router);\n\n // Check for API routes first\n const route = findRoute<() => Promise<Controller>>(\n router,\n request.method.toUpperCase(),\n url.pathname\n );\n\n if (route) {\n const controller = await route.data();\n const context: ControllerContext = {\n req: request,\n params: route.params || {},\n env: env,\n url: url,\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // No API route found - not handled by this router\n // Static assets and SPA routing are handled by Cloudflare Workers Assets binding\n // configured in wrangler.jsonc\n return null;\n}\n\nexport function defineController<Env = any>(controller: Controller<Env>): Controller<Env> {\n return controller;\n}\n\n/**\n * Define a thread-specific endpoint that has access to the thread's DurableObject instance and metadata.\n * This wraps defineController and automatically looks up the thread by ID from the URL params.\n *\n * @param handler - Function that receives the request and thread context\n * @returns A Controller that can be used with the router\n *\n * @example\n * // agentbuilder/api/status.ts\n * export default defineThreadEndpoint(async (req, { thread }) => {\n * const messages = await thread.instance.getMessages();\n * return Response.json({ status: \"ok\", messageCount: messages.length });\n * });\n */\nexport function defineThreadEndpoint<Env extends ThreadEnv = ThreadEnv>(\n handler: (\n req: Request,\n context: ThreadEndpointContext[\"thread\"]\n ) => Response | Promise<Response>\n): Controller<Env> {\n return defineController<Env>(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Create ThreadInstance reference\n // Note: We can't access ctx and env directly, but we can call RPC methods\n const instance = stub as unknown as ThreadInstance;\n\n // Call handler with thread context\n return await handler(req, {\n instance,\n metadata,\n });\n } catch (error: any) {\n console.error(`Error in thread endpoint for ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Internal server error\" },\n { status: 500 }\n );\n }\n });\n}\n","/**\n * Authentication utilities for user sessions, API keys, and password hashing\n */\n\n/**\n * Generate a cryptographically secure random string\n */\nexport function generateSecureToken(length: number = 32): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate a user session token with prefix\n */\nexport function generateUserToken(): string {\n return `agtuser_${generateSecureToken(32)}`;\n}\n\n/**\n * Generate an API key with prefix\n */\nexport function generateApiKey(): string {\n return `agtbldr_${generateSecureToken(32)}`;\n}\n\n/**\n * Hash a password using PBKDF2\n */\nexport async function hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Generate a random salt\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using PBKDF2\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n // Combine salt and hash\n const hashArray = new Uint8Array(derivedBits);\n const combined = new Uint8Array(salt.length + hashArray.length);\n combined.set(salt);\n combined.set(hashArray, salt.length);\n\n // Return as base64\n return bufferToBase64(combined);\n}\n\n/**\n * Verify a password against its hash\n */\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n try {\n const combined = base64ToBuffer(hash);\n\n // Extract salt and hash\n const salt = combined.slice(0, 16);\n const storedHash = combined.slice(16);\n\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using the same salt\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n const derivedHash = new Uint8Array(derivedBits);\n\n // Compare hashes\n if (derivedHash.length !== storedHash.length) {\n return false;\n }\n\n let matches = true;\n for (let i = 0; i < derivedHash.length; i++) {\n if (derivedHash[i] !== storedHash[i]) {\n matches = false;\n }\n }\n\n return matches;\n } catch (error) {\n console.error('Error verifying password:', error);\n return false;\n }\n}\n\n/**\n * Hash a token or API key using SHA-256\n */\nexport async function hashToken(token: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(token);\n\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n\n return Array.from(hashArray, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Extract the last N characters from a string\n */\nexport function getLastChars(str: string, count: number = 5): string {\n return str.slice(-count);\n}\n\n/**\n * Extract the prefix from a token (e.g., \"agtuser_\" or \"agtbldr_\")\n */\nexport function getTokenPrefix(token: string): string {\n const match = token.match(/^([^_]+_)/);\n return match ? match[1] : '';\n}\n\n/**\n * Validate token format\n */\nexport function isValidUserToken(token: string): boolean {\n return token.startsWith('agtuser_') && token.length > 10;\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n return key.startsWith('agtbldr_') && key.length > 10;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Sign a token payload using HMAC-SHA256 with the encryption key\n * Returns a signed token in the format: base64(payload).base64(signature)\n */\nexport async function signToken(payload: string, encryptionKey: string): Promise<string> {\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign the payload\n const payloadData = encoder.encode(payload);\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, payloadData);\n\n // Convert to base64\n const payloadB64 = bufferToBase64(new Uint8Array(payloadData));\n const signatureB64 = bufferToBase64(new Uint8Array(signature));\n\n return `${payloadB64}.${signatureB64}`;\n}\n\n/**\n * Verify a signed token and extract its payload\n * Returns the payload if valid, null if invalid\n */\nexport async function verifySignedToken(signedToken: string, encryptionKey: string): Promise<string | null> {\n try {\n const parts = signedToken.split('.');\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadB64, signatureB64] = parts;\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n // Decode the payload and signature\n const payloadData = base64ToBuffer(payloadB64);\n const signature = base64ToBuffer(signatureB64);\n\n // Verify the signature\n const isValid = await crypto.subtle.verify('HMAC', cryptoKey, signature, payloadData);\n\n if (!isValid) {\n return null;\n }\n\n // Decode payload to string\n const decoder = new TextDecoder();\n return decoder.decode(payloadData);\n } catch (error) {\n console.error('Error verifying signed token:', error);\n return null;\n }\n}\n\n/**\n * Generate a signed super admin token\n * Payload format: super_admin:timestamp:nonce\n */\nexport async function generateSuperAdminToken(encryptionKey: string): Promise<string> {\n const timestamp = Date.now();\n const nonce = generateSecureToken(16);\n const payload = `super_admin:${timestamp}:${nonce}`;\n return await signToken(payload, encryptionKey);\n}\n\n/**\n * Verify a super admin token\n * Returns true if valid, false otherwise\n */\nexport async function verifySuperAdminToken(token: string, encryptionKey: string): Promise<boolean> {\n const payload = await verifySignedToken(token, encryptionKey);\n if (!payload) {\n return false;\n }\n\n // Check payload format\n const parts = payload.split(':');\n if (parts.length !== 3 || parts[0] !== 'super_admin') {\n return false;\n }\n\n // Optionally check timestamp for expiration (30 days)\n const timestamp = parseInt(parts[1], 10);\n const age = Date.now() - timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n if (age > maxAge) {\n return false;\n }\n\n return true;\n}\n\n// Helper functions\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Authentication middleware for protecting API routes\n *\n * Supports multiple authentication types:\n * - Super admin token (signed with ENCRYPTION_KEY)\n * - User session token (validated against DurableAgentBuilder)\n * - API key (validated against DurableAgentBuilder)\n */\n\nimport {\n verifySuperAdminToken,\n hashToken,\n isValidUserToken,\n isValidApiKey,\n} from '../utils/auth.js';\n\nexport interface AuthUser {\n id: string;\n username: string;\n role: string;\n}\n\nexport interface AuthContext {\n user: AuthUser;\n authType: 'super_admin' | 'session' | 'api_key';\n}\n\n/**\n * Extract bearer token from Authorization header or query parameter (for WebSockets)\n */\nfunction extractBearerToken(request: Request): string | null {\n // First try Authorization header\n const authHeader = request.headers.get('Authorization');\n if (authHeader && authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // For WebSocket upgrade requests, check query parameter\n const isWebSocket =\n request.headers.get('upgrade')?.toLowerCase() === 'websocket';\n if (isWebSocket) {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get('token');\n if (token) {\n return token;\n }\n } catch (err) {\n // Invalid URL, continue\n }\n }\n\n return null;\n}\n\n/**\n * Get DurableAgentBuilder singleton stub\n */\nfunction getAgentBuilder(env: any): any {\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId);\n}\n\n/**\n * Authenticate a request using various token types\n */\nexport async function authenticate(\n request: Request,\n env: any\n): Promise<AuthContext | null> {\n const token = extractBearerToken(request);\n\n if (!token) {\n return null;\n }\n\n // Check if it's a signed super admin token (if super admin is configured)\n if (env.SUPER_ADMIN_PASSWORD && env.ENCRYPTION_KEY) {\n // Token contains a dot, might be a signed token\n if (token.includes('.')) {\n const isValidSuperAdmin = await verifySuperAdminToken(\n token,\n env.ENCRYPTION_KEY\n );\n if (isValidSuperAdmin) {\n return {\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n authType: 'super_admin',\n };\n }\n }\n }\n\n // Check if it's a user session token\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const session = await agentBuilder.validateSession(tokenHash);\n if (session) {\n // Get user details\n const user = await agentBuilder.getUserById(session.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'session',\n };\n }\n }\n }\n\n // Check if it's an API key\n if (isValidApiKey(token)) {\n const keyHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const apiKey = await agentBuilder.validateApiKey(keyHash);\n if (apiKey) {\n // Get user details\n const user = await agentBuilder.getUserById(apiKey.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'api_key',\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Middleware to require authentication\n * Returns 401 if not authenticated\n */\nexport async function requireAuth(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const authContext = await authenticate(request, env);\n\n if (!authContext) {\n return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return authContext;\n}\n\n/**\n * Middleware to require admin role\n * Returns 401 if not authenticated, 403 if not admin\n */\nexport async function requireAdmin(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const result = await requireAuth(request, env);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result.user.role !== 'admin') {\n return new Response(\n JSON.stringify({ error: 'Forbidden: Admin access required' }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n return result;\n}\n","import { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n ZodString,\n ZodNumber,\n ZodBoolean,\n ZodEnum,\n ZodArray,\n ZodObject,\n ZodOptional,\n ZodNullable,\n ZodUnion,\n ZodRecord,\n ZodNull,\n ZodLiteral,\n ZodDefault,\n} from \"zod\";\nimport { z } from \"zod\";\nimport { z as zv3 } from \"zod/v3\";\nimport type { FlowState } from \"../agents/types.js\";\n\n/** Decrement helper to stop recursion at depth 0 */\ntype Dec<N extends number> = N extends 10\n ? 9\n : N extends 9\n ? 8\n : N extends 8\n ? 7\n : N extends 7\n ? 6\n : N extends 6\n ? 5\n : N extends 5\n ? 4\n : N extends 4\n ? 3\n : N extends 3\n ? 2\n : N extends 2\n ? 1\n : N extends 1\n ? 0\n : 0;\n\n/**\n * Allowed Zod node for tool arguments.\n * Tweak this union as your single source of truth for what’s allowed.\n * Increase the default depth if you need crazier nesting.\n */\nexport type ToolArgsNode<D extends number = 7> =\n // primitives & literals\n | ZodString\n | ZodNumber\n | ZodBoolean\n | ZodNull\n | ZodLiteral<string | number | boolean | null>\n\n // enums\n | ZodEnum<Record<string, string>>\n\n // wrappers\n | (D extends 0 ? never : ZodOptional<ToolArgsNode<Dec<D>>>)\n | (D extends 0 ? never : ZodNullable<ToolArgsNode<Dec<D>>>)\n | (D extends 0 ? never : ZodDefault<ToolArgsNode<Dec<D>>>)\n\n // arrays\n | (D extends 0 ? never : ZodArray<ToolArgsNode<Dec<D>>>)\n\n // objects (fixed keys) and records (dynamic keys)\n | (D extends 0 ? never : ZodObject<Record<string, ToolArgsNode<Dec<D>>>>)\n | (D extends 0 ? never : ZodRecord<ZodString, ToolArgsNode<Dec<D>>>)\n\n // unions (JSON Schema oneOf)\n | (D extends 0\n ? never\n : ZodUnion<\n [\n ToolArgsNode<Dec<D>>,\n ToolArgsNode<Dec<D>>,\n ...ToolArgsNode<Dec<D>>[]\n ]\n >);\n// discriminated unions:\n// | (D extends 0 ? never : z.ZodDiscriminatedUnion<string, any>) // if you want to allow these\n\n// tuples (JSON Schema tuple form):\n// | (D extends 0 ? never : z.ZodTuple<[...ToolArgsNode<Dec<D>>[]]>)\n\n/**\n * Raw shape for an object whose values are ToolArgsNode.\n * This is what users write inside z.object({ ... }).\n */\nexport type ToolArgsRawShape<D extends number = 7> = Record<\n string,\n ToolArgsNode<D>\n>;\n\n/** The top-level schema must be an object for OpenAI tools. */\nexport type ToolArgs<D extends number = 7> = z.ZodObject<ToolArgsRawShape<D>>;\n\nexport type StructuredToolReturn = ToolArgs;\n\n/**\n * Defines a tool function. Tools accept the current flow state as well as the arguments being passed to them.\n */\nexport type Tool<Args extends ToolArgs | null = null> = Args extends ToolArgs\n ? (flow: FlowState, args: z.infer<Args>) => Promise<CallToolResult>\n : (flow: FlowState) => Promise<CallToolResult>;\n\n/**\n * @param toolDescription - Description of what the tool does.\n * @param args - The arguments for the tool.\n * @param tool - The tool function.\n * @returns A tuple containing the description, arguments and the tool function.\n */\nexport function defineTool<Args extends ToolArgs>(\n toolDescription: string,\n args: Args,\n tool: Tool<Args>\n): [string, Args, Tool<Args>, null];\nexport function defineTool(\n toolDescription: string,\n tool: Tool<null>\n): [string, null, Tool<null>, null];\nexport function defineTool<\n Args extends ToolArgs,\n RetValue extends StructuredToolReturn\n>(\n toolDescription: string,\n args: Args,\n tool: Tool<Args>,\n returnSchema: RetValue\n): [string, Args, Tool<Args>, RetValue];\nexport function defineTool<\n Args extends ToolArgs,\n RetValue extends StructuredToolReturn\n>(\n toolDescription: string,\n argsOrTool: Args | Tool,\n maybeTool?: Tool<Args>,\n returnSchema?: RetValue\n): [string, Args | null, Tool<Args> | Tool, RetValue | null] {\n if (maybeTool) {\n return [\n toolDescription,\n argsOrTool as Args,\n maybeTool,\n returnSchema ?? null,\n ];\n }\n return [toolDescription, null, argsOrTool as Tool, returnSchema ?? null];\n}\n","import type { FlowState, Message, ToolCall, ToolResult } from \"./types\";\n\n/**\n * Hook signatures for all available hooks\n */\nexport interface HookSignatures {\n /**\n * Called before messages are filtered and sent to the LLM\n * Receives SQL row data with all columns before transformation\n * Return value is transformed into chat completion format\n */\n filter_messages: (state: FlowState, rows: Message[]) => Promise<Message[]>;\n\n /**\n * Called after message history is loaded and before sending to LLM\n * Receives messages in chat completion format (already transformed)\n */\n prefilter_llm_history: (\n state: FlowState,\n messages: Array<{\n role: string;\n content: string | null;\n tool_calls?: any;\n tool_call_id?: string;\n name?: string;\n }>\n ) => Promise<\n Array<{\n role: string;\n content: string | null;\n tool_calls?: any;\n tool_call_id?: string;\n name?: string;\n }>\n >;\n\n /**\n * Called before a message is created in the database\n */\n before_create_message: (\n state: FlowState,\n message: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a message is created in the database\n */\n after_create_message: (\n state: FlowState,\n message: Record<string, any>\n ) => Promise<void>;\n\n /**\n * Called before a message is updated in the database\n */\n before_update_message: (\n state: FlowState,\n messageId: string,\n updates: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a message is updated in the database\n */\n after_update_message: (\n state: FlowState,\n message: Message\n ) => Promise<void>;\n\n /**\n * Called before a tool result is stored in the database\n */\n before_store_tool_result: (\n state: FlowState,\n toolCall: Record<string, any>,\n toolResult: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a successful tool call\n */\n after_tool_call_success: (\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ) => Promise<ToolResult | null>;\n\n /**\n * Called after a failed tool call\n */\n after_tool_call_failure: (\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ) => Promise<ToolResult | null>;\n}\n\n/**\n * Define a hook with strict typing based on hook name\n *\n * @example\n * ```typescript\n * export default defineHook('filter_messages', async (state, rows) => {\n * // Only include messages from last 10 turns\n * return rows.slice(-10);\n * });\n * ```\n */\nexport function defineHook<K extends keyof HookSignatures>(\n hookName: K,\n implementation: HookSignatures[K]\n): HookSignatures[K] {\n return implementation;\n}\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 1,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Metadata table for tracking schema version\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n await sql.exec(`\n INSERT OR IGNORE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n\n // Messages table - OpenAI chat completion format\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n role TEXT NOT NULL CHECK(role IN ('system', 'user', 'assistant', 'tool')),\n content TEXT,\n name TEXT,\n tool_calls TEXT,\n tool_call_id TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)\n `);\n\n // Tool calls table - detailed breakdown of function calls\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS tool_calls (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n type TEXT NOT NULL DEFAULT 'function',\n function_name TEXT NOT NULL,\n function_arguments TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_tool_calls_message_id ON tool_calls(message_id)\n `);\n\n // Logs table - pure telemetry, ephemeral, can be truncated anytime\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS logs (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n\n -- Request details\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n endpoint TEXT,\n request_body TEXT,\n request_headers TEXT,\n\n -- Response details\n response_body TEXT,\n response_headers TEXT,\n status_code INTEGER,\n\n -- Token usage\n input_tokens INTEGER,\n cached_tokens INTEGER,\n output_tokens INTEGER,\n total_tokens INTEGER,\n\n -- Performance metrics\n latency_ms INTEGER,\n time_to_first_token_ms INTEGER,\n\n -- Result metadata\n finish_reason TEXT,\n error TEXT,\n error_type TEXT,\n\n -- Cost tracking\n cost_input REAL,\n cost_output REAL,\n cost_total REAL,\n\n -- Context\n message_history_length INTEGER,\n tools_available INTEGER,\n\n created_at INTEGER NOT NULL,\n\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_message_id ON logs(message_id)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_created_at ON logs(created_at)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_provider ON logs(provider)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_model ON logs(model)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_error ON logs(error) WHERE error IS NOT NULL\n `);\n\n // Execution state table - stores runtime state for thread execution\n // Used to track turn count, current side, stopped status, etc.\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS execution_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n // Initialize execution state with default values\n await sql.exec(`\n INSERT OR IGNORE INTO execution_state (key, value) VALUES\n ('turn_count', '0'),\n ('current_side', 'a'),\n ('stopped', 'false'),\n ('stopped_by', '')\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 2,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add prompt_name and tools_called columns to logs table\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN prompt_name TEXT\n `);\n\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_called TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '2' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 3,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_log_id for tracking prompt call chains\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN parent_log_id TEXT\n `);\n\n // Add index for parent_log_id lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_parent_log_id ON logs(parent_log_id)\n `);\n\n // Add model_name (human-readable name from models table)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN model_name TEXT\n `);\n\n // Add tools_schema (JSON of tools available during request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_schema TEXT\n `);\n\n // Add message_history (snapshot of history sent with request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN message_history TEXT\n `);\n\n // Add system_prompt (actual system prompt sent)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN system_prompt TEXT\n `);\n\n // Add is_complete flag for incremental loading\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN is_complete INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '3' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 4,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_tokens for tracking GPT-5 and other model reasoning tokens\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_tokens INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '4' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 5,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to store reasoning output separately from regular content\n // This is for models like o1 that generate reasoning that should not be displayed\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '5' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 6,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add log_id column to messages table to track which log produced the message\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN log_id TEXT\n `);\n\n // Create index for efficient lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_log_id ON messages(log_id) WHERE log_id IS NOT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '6' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 7,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add errors column to track multiple errors on a single log\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN errors TEXT\n `);\n\n // Add retry_of_log_id to track retry relationships\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN retry_of_log_id TEXT\n `);\n\n // Add index for retry lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_retry_of ON logs(retry_of_log_id) WHERE retry_of_log_id IS NOT NULL\n `);\n\n // Migrate existing error data to new errors array format\n await sql.exec(`\n UPDATE logs\n SET errors = json_array(json_object(\n 'message', error,\n 'type', error_type,\n 'timestamp', created_at\n ))\n WHERE error IS NOT NULL AND errors IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '7' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_results column to track tool execution results\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tool_results TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add request_sent_at: When the LLM request was initiated\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN request_sent_at INTEGER\n `);\n\n // Add response_completed_at: When the response was fully received\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN response_completed_at INTEGER\n `);\n\n // Add status to track message state (pending, completed, failed)\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN status TEXT DEFAULT 'completed'\n CHECK(status IN ('pending', 'completed', 'failed'))\n `);\n\n // Backfill existing messages with completed status and set timestamps equal to created_at\n await sql.exec(`\n UPDATE messages\n SET\n status = 'completed',\n request_sent_at = created_at,\n response_completed_at = created_at\n WHERE status IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 10,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Alarm queue table - manages scheduled method invocations\n // Only one alarm can be active per Durable Object, so this queue\n // ensures sequential processing of all pending invocations\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS alarm_queue (\n id TEXT PRIMARY KEY,\n method TEXT NOT NULL,\n args TEXT NOT NULL,\n scheduled_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'processing', 'completed', 'failed')),\n attempts INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n completed_at INTEGER\n )\n `);\n\n // Index for finding the next item to process\n // Partial index only on pending items for better performance\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_next\n ON alarm_queue(scheduled_at, status)\n WHERE status = 'pending'\n `);\n\n // Index for cleanup of old failed items\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_cleanup\n ON alarm_queue(completed_at)\n WHERE status = 'failed'\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '10' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 11,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add silent column to messages table\n // Silent messages are not sent to the LLM but are visible in the UI\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN silent INTEGER NOT NULL DEFAULT 0\n CHECK(silent IN (0, 1))\n `);\n\n // Backfill existing messages as non-silent\n await sql.exec(`\n UPDATE messages SET silent = 0 WHERE silent IS NULL\n `);\n\n // Create index for filtering silent messages\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_silent ON messages(silent)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '11' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 12,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Drop message_history column - it's redundant with request_body.messages\n // This reduces row size and prevents SQLITE_TOOBIG errors\n await sql.exec(`\n ALTER TABLE logs DROP COLUMN message_history\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '12' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 13,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_status column to messages table\n // tool_status indicates success or error for tool execution results (role='tool' messages only)\n // Defaults to 'success' for new tool messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN tool_status TEXT\n CHECK(tool_status IS NULL OR tool_status IN ('success', 'error'))\n `);\n\n // Backfill existing tool messages:\n // - Messages with content starting with \"Error: \" are marked as 'error'\n // - All other tool messages are marked as 'success'\n // - Non-tool messages remain NULL\n await sql.exec(`\n UPDATE messages\n SET tool_status = CASE\n WHEN role = 'tool' AND content LIKE 'Error: %' THEN 'error'\n WHEN role = 'tool' THEN 'success'\n ELSE NULL\n END\n WHERE role = 'tool'\n `);\n\n // Create index for filtering by tool_status\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_tool_status ON messages(tool_status)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '13' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 14,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_id column to messages table\n // parent_id links sub-prompt messages to their parent tool execution message\n // NULL for top-level messages, set to message.id for sub-messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN parent_id TEXT\n `);\n\n // Add depth column to messages table\n // depth indicates nesting level: 0 for top-level, 1 for first-level sub-prompts, etc.\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN depth INTEGER NOT NULL DEFAULT 0\n `);\n\n // Create index for querying message hierarchies\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_parent_id ON messages(parent_id)\n `);\n\n // Create index for depth-based filtering (WebSocket and API queries)\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_depth ON messages(depth)\n `);\n\n // Backfill existing messages:\n // All existing messages are top-level (no parent), so depth=0 and parent_id=NULL\n // The DEFAULT 0 on depth handles this automatically\n // parent_id defaults to NULL (no ALTER needed)\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '14' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 15,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to messages table to store reasoning output\n // This allows us to include reasoning in message history when needed\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '15' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 16,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_details column to messages table to store structured reasoning\n // This is the OpenRouter reasoning_details array format (not just text content)\n // Contains objects with type: \"reasoning.summary\" | \"reasoning.encrypted\" | \"reasoning.text\"\n // Required for proper reasoning preservation in multi-turn conversations\n // See: https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_details TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '16' WHERE key = 'schema_version'\n `);\n },\n};\n","import { migration as m001 } from \"./001_initial\";\nimport { migration as m002 } from \"./002_add_prompt_and_tools_to_logs\";\nimport { migration as m003 } from \"./003_add_log_context_and_parent\";\nimport { migration as m004 } from \"./004_add_reasoning_tokens\";\nimport { migration as m005 } from \"./005_add_reasoning_content\";\nimport { migration as m006 } from \"./006_add_log_id_to_messages\";\nimport { migration as m007 } from \"./007_add_errors_and_retry_tracking\";\nimport { migration as m008 } from \"./008_add_tool_results\";\nimport { migration as m009 } from \"./009_add_request_response_timestamps\";\nimport { migration as m010 } from \"./010_add_alarm_queue\";\nimport { migration as m011 } from \"./011_add_silent_messages\";\nimport { migration as m012 } from \"./012_remove_message_history\";\nimport { migration as m013 } from \"./013_add_tool_status\";\nimport { migration as m014 } from \"./014_add_parent_id_and_depth\";\nimport { migration as m015 } from \"./015_add_reasoning_to_messages\";\nimport { migration as m016 } from \"./016_add_reasoning_details\";\n\nexport const migrations = [m001, m002, m003, m004, m005, m006, m007, m008, m009, m010, m011, m012, m013, m014, m015, m016];\n\nexport const LATEST_SCHEMA_VERSION = migrations.length;\n","import { DurableObject } from \"cloudflare:workers\";\nimport { migrations, LATEST_SCHEMA_VERSION } from \"./migrations/index.js\";\nimport type { Agent, Message } from \"../types/index.js\";\nimport { TIMESTAMP_MULTIPLIER, type TelemetryEvent } from \"../agents/types.js\";\nimport { AlarmQueue } from \"./utils/AlarmQueue.js\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { StreamManager } from \"../agents/StreamManager.js\";\n\nexport class DurableThread<Env extends ThreadEnv = ThreadEnv> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private logSockets: Set<WebSocket> = new Set();\n private messageSockets: Set<WebSocket> = new Set();\n private alarmQueue: AlarmQueue;\n private currentAbortController: AbortController | null = null;\n private isExecuting = false;\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Initialize alarm queue\n this.alarmQueue = new AlarmQueue(ctx);\n\n // Set up the executor to dispatch queued methods\n this.alarmQueue.setExecutor(\n async (method: string, args: Record<string, any>) => {\n switch (method) {\n case \"executeFlow\":\n await this.executeFlow(\n args.threadId,\n args.agentId,\n args.initial_messages,\n args.data\n );\n break;\n case \"processMessage\":\n await this.processMessage(args.threadId, args.content, args.role);\n break;\n case \"testOperation\":\n await this.testOperation(args.id, args.label, args.expectedOrder);\n break;\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n );\n\n // Restore WebSocket connections after hibernation\n // This is called whenever the Durable Object wakes up from hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.type === \"log\") {\n this.logSockets.add(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.add(ws);\n }\n }\n }\n\n /**\n * Returns the tools registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of tool name to tool loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.tools() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the hooks registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of hook name to hook loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.hooks() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of model name to model loader function\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.models() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of prompt name to prompt loader function\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.prompts() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of agent name to agent loader function\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.agents() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n // ============================================================\n // Lookup Methods (for use by FlowEngine/ToolExecutor)\n // ============================================================\n\n /**\n * Load a model definition by name.\n */\n async loadModel(name: string): Promise<any> {\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n /**\n * Load a prompt definition by name.\n */\n async loadPrompt(name: string): Promise<any> {\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n /**\n * Load an agent definition by name.\n */\n async loadAgent(name: string): Promise<any> {\n const registry = this.agents();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n /**\n * Ensures the database schema is up to date.\n * This method is called on the first request to the Durable Object.\n * It checks the schema version and runs any pending migrations.\n *\n * Performance:\n * - Already migrated to latest: ~0.1ms (single SELECT + integer comparison)\n * - Needs migration: Runs once per Durable Object lifetime per schema version\n * - Detects new migrations after code deployment\n */\n private async ensureMigrated(): Promise<void> {\n // Check if we've already migrated to the latest version in this instance\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n // Cache the version we've migrated to\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n }\n\n /**\n * Gets the current schema version from the database.\n * Returns 0 if the metadata table doesn't exist (brand new database).\n */\n private async getCurrentVersion(): Promise<number> {\n try {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: Use for...of loop OR call .toArray() - but NEVER access .rows property!\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray(); // Convert iterator to array\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === \"number\" ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n // Table doesn't exist yet\n return 0;\n }\n }\n\n /**\n * Runs all pending migrations sequentially.\n * Each migration is run in order, starting from the current version + 1.\n */\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n /**\n * Legacy fetch handler for WebSocket upgrades only\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get(\"Upgrade\");\n if (upgradeHeader?.toLowerCase() === \"websocket\") {\n // Determine connection type from URL path\n const url = new URL(request.url);\n if (url.pathname.includes(\"/stream\")) {\n return this.handleMessagesWebSocketUpgrade(request);\n } else {\n // Default to logs WebSocket for backwards compatibility\n return this.handleLogsWebSocketUpgrade(request);\n }\n }\n\n return new Response(\"Use RPC methods instead of fetch\", { status: 400 });\n }\n\n /**\n * Execute thread with initial messages (RPC method)\n * Enqueues the execution to be processed by the alarm handler\n */\n async execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Enqueue the execution with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"executeFlow\",\n {\n threadId,\n agentId,\n initial_messages,\n data,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n // Return 202 Accepted - execution will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message:\n \"Execution queued. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in execute:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue execution\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Send a new message to the thread (RPC method)\n * Enqueues the message processing to be handled by the alarm handler\n */\n async sendMessage(\n threadId: string,\n content: string,\n role: string = \"user\"\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Enqueue the message processing with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"processMessage\",\n {\n threadId,\n content,\n role,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n // Return 202 Accepted - processing will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message:\n \"Message queued for processing. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in sendMessage:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue message\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Check if execution should be stopped (called by FlowEngine)\n * Reads from SQLite for persistence across hibernation\n */\n async shouldStop(): Promise<boolean> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'stopped'`\n );\n const rows = cursor.toArray();\n return rows.length > 0 && rows[0].value === 'true';\n } catch (error) {\n console.error('[DurableThread.shouldStop] Error reading stopped flag:', error);\n return false;\n }\n }\n\n /**\n * Stop the currently executing thread (RPC method)\n * Simple \"off\" switch - stops turns, only cleared by user messages\n */\n async stop(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Set the persistent stop flag in SQLite (prevents new turns from starting)\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'true' WHERE key = 'stopped'`\n );\n\n // Abort any in-flight request\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n // Mark all pending messages as failed\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n const updateCursor = await this.ctx.storage.sql.exec(\n `UPDATE messages SET status = 'failed', response_completed_at = ? WHERE status = 'pending'`,\n now\n );\n \n // Broadcast updates for all pending messages\n const cursor = await this.ctx.storage.sql.exec(\n `SELECT id, role, content, tool_calls, tool_call_id, tool_status, created_at, log_id, status, request_sent_at, response_completed_at FROM messages WHERE response_completed_at = ?`,\n now\n );\n for (const row of cursor) {\n this.broadcastMessage({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n created_at: row.created_at as number,\n log_id: row.log_id as string | null,\n status: \"failed\",\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n });\n }\n\n // Find all tool calls that don't have responses yet and create error responses\n const messagesWithToolsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, tool_calls, depth FROM messages WHERE tool_calls IS NOT NULL AND tool_calls != 'null' AND (depth IS NULL OR depth = 0)`\n );\n\n for (const msgRow of messagesWithToolsCursor) {\n try {\n const toolCalls = JSON.parse(msgRow.tool_calls as string);\n if (Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n // Check if this tool call already has a response\n const responseExists = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE tool_call_id = ? AND role = 'tool'`,\n tc.id\n );\n const responses = responseExists.toArray();\n\n if (responses.length === 0) {\n // Create error response for this tool call\n const toolResponseId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_call_id, tool_status, created_at, status) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n toolResponseId,\n 'tool',\n 'Execution stopped by user',\n tc.id,\n 'error',\n now,\n 'completed'\n );\n\n // Broadcast the error tool response\n this.broadcastMessage({\n id: toolResponseId,\n role: 'tool',\n content: 'Execution stopped by user',\n tool_call_id: tc.id,\n tool_status: 'error',\n created_at: now,\n status: 'completed',\n });\n\n }\n }\n }\n } catch (e) {\n console.error('[DurableThread.stop] Error processing tool calls:', e);\n }\n }\n\n // Create and broadcast interruption message immediately\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status) VALUES (?, ?, ?, ?, ?)`,\n interruptionMessageId,\n \"system\",\n \"Execution stopped by user\",\n timestamp,\n \"completed\"\n );\n\n // Broadcast the interruption message to WebSocket clients\n this.broadcastMessage({\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n });\n\n // Mark all incomplete logs as complete\n await this.ctx.storage.sql.exec(\n `UPDATE logs SET is_complete = 1 WHERE is_complete = 0`\n );\n \n // Query and broadcast all logs that were just marked complete\n // Include all fields required by LogListItem interface in UI\n const logsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, message_id, provider, model, model_name, prompt_name, tools_called,\n parent_log_id, retry_of_log_id, error, cost_total, is_complete, created_at\n FROM logs WHERE is_complete = 1 ORDER BY created_at DESC LIMIT 50`\n );\n for (const logRow of logsCursor) {\n this.broadcastLog({\n type: 'log_data',\n log_id: logRow.id as string,\n data: {\n id: logRow.id as string,\n message_id: logRow.message_id as string,\n provider: logRow.provider as string,\n model: logRow.model as string,\n model_name: logRow.model_name as string | null,\n prompt_name: logRow.prompt_name as string | null,\n tools_called: logRow.tools_called as string | null,\n parent_log_id: logRow.parent_log_id as string | null,\n retry_of_log_id: logRow.retry_of_log_id as string | null,\n error: logRow.error as string | null,\n cost_total: logRow.cost_total as number | null,\n is_complete: true,\n created_at: logRow.created_at as number,\n }\n });\n }\n\n // Broadcast stop event to WebSocket clients\n this.broadcastLog({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n\n return Response.json(\n { status: \"stopped\", message: \"Thread execution stopped\" },\n { status: 200 }\n );\n } catch (error: any) {\n console.error(\"Error in stop:\", error);\n return Response.json(\n { error: error.message || \"Failed to stop thread\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Get message history (RPC method)\n *\n * By default, returns the newest messages (when truncating), but in chronological\n * order (oldest first in the array). This is ideal for chat UIs where messages\n * should be appended and scrolled to the bottom.\n *\n * The offset parameter allows \"scrolling up\" to view older messages.\n *\n * Example:\n * - getMessages(10, 0) -> newest 10 messages, oldest first in array\n * - getMessages(10, 10) -> next 10 older messages, oldest first in array\n *\n * @param limit Number of messages to return (default: 100)\n * @param offset Number of newest messages to skip (default: 0)\n * @param order Internal query order - \"DESC\" (default) fetches newest first then reverses\n * @param includeSilent Include silent messages (UI-only messages)\n * @param maxDepth Maximum depth to include (default: 0 for top-level only)\n */\n async getMessages(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"DESC\",\n includeSilent: boolean = false,\n maxDepth: number = 0\n ) {\n await this.ensureMigrated();\n try {\n // Build WHERE clause for silent messages and depth\n const whereClauses = [];\n if (!includeSilent) {\n whereClauses.push(\"silent = 0\");\n }\n whereClauses.push(`(depth <= ${maxDepth} OR depth IS NULL)`);\n const whereClause =\n whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\";\n\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) as total FROM messages ${whereClause}`\n );\n const total = countResult.one().total;\n\n // Fetch messages in DESC order (newest first) to handle truncation correctly\n // Then reverse the array to return chronological order (oldest first)\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: string | null;\n log_id: string | null;\n created_at: number;\n silent: number;\n parent_id: string | null;\n depth: number;\n status: string | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }>(\n `\n SELECT id, role, content, name, tool_calls, tool_call_id, tool_status, log_id, created_at, silent, parent_id, depth, status, reasoning_content, reasoning_details\n FROM messages\n ${whereClause}\n ORDER BY created_at ${order === \"ASC\" ? \"ASC\" : \"DESC\"}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n let messages = result.toArray().map((row) => ({\n id: row.id,\n role: row.role,\n content: row.content,\n name: row.name,\n tool_calls: row.tool_calls,\n tool_call_id: row.tool_call_id,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n log_id: row.log_id,\n created_at: row.created_at,\n silent: row.silent === 1,\n parent_id: row.parent_id,\n depth: row.depth,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | null,\n reasoning_content: row.reasoning_content,\n reasoning_details: row.reasoning_details,\n }));\n\n // Reverse to chronological order (oldest first) when using DESC\n // This ensures newest messages are at the end of the array (natural chat order)\n if (order === \"DESC\") {\n messages = messages.reverse();\n }\n\n const hasMore = offset + messages.length < total;\n\n return { messages, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getMessages:\", error);\n throw error;\n }\n }\n\n /**\n * Delete a message (RPC method)\n */\n async deleteMessage(messageId: string) {\n await this.ensureMigrated();\n\n try {\n // Check if message exists\n const checkResult = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE id = ?`,\n messageId\n );\n\n const messageExists = checkResult.toArray().length > 0;\n\n if (!messageExists) {\n return { success: false, error: \"Message not found\" };\n }\n\n // Delete the message (tool_calls should cascade delete due to foreign key)\n await this.ctx.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n messageId\n );\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in deleteMessage:\", error);\n return {\n success: false,\n error: error.message || \"Failed to delete message\",\n };\n }\n }\n\n /**\n * Seed messages directly into the database (RPC method - for testing)\n * This bypasses the normal message processing flow\n */\n async seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }) {\n await this.ensureMigrated();\n\n try {\n for (const msg of args.messages) {\n await this.ctx.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, created_at)\n VALUES (?, ?, ?, ?)\n `,\n msg.id,\n msg.role,\n msg.content,\n msg.created_at\n );\n }\n\n return {\n success: true,\n count: args.messages.length,\n };\n } catch (error: any) {\n console.error(\"Error in seedMessages:\", error);\n return {\n success: false,\n error: error.message || \"Failed to seed messages\",\n };\n }\n }\n\n /**\n * Get logs (RPC method)\n */\n async getLogs(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"ASC\"\n ) {\n await this.ensureMigrated();\n\n try {\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) as total FROM logs`\n );\n const total = countResult.one().total || 0;\n\n // Get logs - only fields needed for list view\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n }>(\n `\n SELECT\n id, message_id, provider, model, model_name, prompt_name,\n tools_called, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n ORDER BY created_at ${order}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n const logs = result.toArray().map((row) => ({\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n model: row.model,\n model_name: row.model_name,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n parent_log_id: row.parent_log_id,\n retry_of_log_id: row.retry_of_log_id,\n error: row.error,\n cost_total: row.cost_total,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n request_body: row.request_body,\n }));\n\n const hasMore = offset + logs.length < total;\n\n return { logs, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getLogs:\", error);\n throw error;\n }\n }\n\n /**\n * Get detailed information for a single log (RPC method)\n * This includes all fields including large ones like request/response bodies\n */\n async getLogDetails(logId: string) {\n await this.ensureMigrated();\n\n try {\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n endpoint: string | null;\n request_body: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n cost_total: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n tools_schema: string | null;\n system_prompt: string | null;\n errors: string | null;\n retry_of_log_id: string | null;\n tool_results: string | null;\n is_complete: number;\n created_at: number;\n }>(\n `\n SELECT\n id, message_id, provider, model, model_name, endpoint,\n request_body, request_headers, response_body, response_headers,\n status_code, reasoning_content, input_tokens, cached_tokens, output_tokens,\n reasoning_tokens, total_tokens, latency_ms, time_to_first_token_ms,\n finish_reason, error, error_type, cost_input, cost_output, cost_total,\n message_history_length, tools_available, prompt_name, tools_called,\n parent_log_id, tools_schema, system_prompt,\n errors, retry_of_log_id, tool_results, is_complete, created_at\n FROM logs\n WHERE id = ?\n `,\n logId\n );\n\n const row = result.one();\n if (!row) {\n throw new Error(`Log not found: ${logId}`);\n }\n\n // Extract message_history from request_body for backward compatibility\n let messageHistory: string | null = null;\n if (row.request_body) {\n try {\n const requestBody = JSON.parse(row.request_body);\n if (requestBody.messages) {\n messageHistory = JSON.stringify(requestBody.messages);\n }\n } catch (e) {\n console.error(\"Failed to parse request_body to extract message_history:\", e);\n }\n }\n\n return {\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n model: row.model,\n model_name: row.model_name,\n endpoint: row.endpoint,\n request_body: row.request_body,\n request_headers: row.request_headers,\n response_body: row.response_body,\n response_headers: row.response_headers,\n status_code: row.status_code,\n reasoning_content: row.reasoning_content,\n input_tokens: row.input_tokens,\n cached_tokens: row.cached_tokens,\n output_tokens: row.output_tokens,\n reasoning_tokens: row.reasoning_tokens,\n total_tokens: row.total_tokens,\n latency_ms: row.latency_ms,\n time_to_first_token_ms: row.time_to_first_token_ms,\n finish_reason: row.finish_reason,\n error: row.error,\n error_type: row.error_type,\n cost_input: row.cost_input,\n cost_output: row.cost_output,\n cost_total: row.cost_total,\n message_history_length: row.message_history_length,\n tools_available: row.tools_available,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n parent_log_id: row.parent_log_id,\n tools_schema: row.tools_schema,\n message_history: messageHistory, // Extracted from request_body\n system_prompt: row.system_prompt,\n errors: row.errors,\n retry_of_log_id: row.retry_of_log_id,\n tool_results: row.tool_results,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n };\n } catch (error: any) {\n console.error(\"Error in getLogDetails:\", error);\n throw error;\n }\n }\n\n /**\n * Get thread metadata (RPC method)\n */\n async getThreadMeta(threadId: string) {\n await this.ensureMigrated();\n\n try {\n // Get thread info from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Load agent info from TypeScript config\n let agentInfo = null;\n try {\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n agentInfo = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n side_a_label: agentDef.sideA?.label,\n side_b_label: agentDef.sideB?.label,\n };\n } catch (e) {\n // Agent might not exist in config anymore\n console.warn(`Agent ${threadMetadata.agent_name} not found in config`);\n }\n\n // Get message count from Durable Object\n const messageCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM messages`\n );\n\n // Get log count from Durable Object\n const logCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM logs`\n );\n\n return {\n thread: {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n tags: threadMetadata.tags || [],\n created_at: threadMetadata.created_at,\n },\n agent: agentInfo,\n stats: {\n message_count: messageCount.one().count || 0,\n log_count: logCount.one().count || 0,\n },\n };\n } catch (error: any) {\n console.error(\"Error in getThreadMeta:\", error);\n throw error;\n }\n }\n\n /**\n * Update thread metadata (RPC method)\n * Calls the DurableAgentBuilder to update the thread registry\n */\n async updateThreadMeta(\n threadId: string,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const updated = await agentBuilder.updateThread(threadId, params);\n\n if (!updated) {\n return { success: false, error: `Thread not found: ${threadId}` };\n }\n\n return {\n success: true,\n thread: {\n id: updated.id,\n agent_id: updated.agent_name,\n user_id: updated.user_id,\n tags: updated.tags || [],\n created_at: updated.created_at,\n },\n };\n } catch (error: any) {\n console.error(\"Error in updateThreadMeta:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Delete thread data completely (RPC method)\n * This will permanently delete the Durable Object instance\n */\n async deleteThread() {\n await this.ensureMigrated();\n\n try {\n // Close all WebSocket connections before deletion\n for (const ws of this.logSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n for (const ws of this.messageSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n this.logSockets.clear();\n this.messageSockets.clear();\n\n // Delete alarm if configured (currently not used, but safe to call)\n await this.ctx.storage.deleteAlarm();\n\n // Delete all storage - this will permanently delete the Durable Object\n // and ensure no billing for storage\n await this.ctx.storage.deleteAll();\n\n // Reset migration version for next instantiation\n this.migratedToVersion = null;\n\n return { success: true, message: \"Thread completely deleted\" };\n } catch (error: any) {\n console.error(\"Error in deleteThread:\", error);\n throw error;\n }\n }\n\n /**\n * Handle WebSocket upgrade for real-time log streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleLogsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n server.serializeAttachment({ type: \"log\" });\n\n // Track this socket for broadcasting log updates\n this.logSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Handle WebSocket upgrade for real-time message streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleMessagesWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Parse parameters from URL\n const url = new URL(request.url);\n const includeSilent = url.searchParams.get(\"includeSilent\") === \"true\";\n const depthParam = url.searchParams.get(\"depth\");\n const maxDepth = depthParam !== null ? parseInt(depthParam, 10) : 0; // Default to 0 (top-level only)\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // Store includeSilent and maxDepth preferences in attachment\n server.serializeAttachment({ type: \"message\", includeSilent, maxDepth });\n\n // Track this socket for broadcasting message updates\n this.messageSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast a log record to all connected WebSocket clients\n */\n private broadcastLog(log: Record<string, any>): void {\n const payload = JSON.stringify(log);\n for (const ws of Array.from(this.logSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.logSockets.delete(ws);\n }\n } catch (err) {\n this.logSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a message record to all connected message WebSocket clients\n * Filters silent messages based on each socket's includeSilent preference\n */\n private broadcastMessage(message: Record<string, any>): void {\n // Get message depth (default to 0 for backward compatibility)\n const messageDepth = message.depth ?? 0;\n\n const payload = JSON.stringify({\n type: \"message_data\",\n message_id: message.id,\n depth: messageDepth,\n data: message,\n });\n\n // Check if message is silent\n const isSilent = message.silent === true || message.silent === 1;\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's preferences from attachment\n const attachment = ws.deserializeAttachment() as {\n type: string;\n includeSilent?: boolean;\n maxDepth?: number;\n };\n const includeSilent = attachment?.includeSilent ?? false;\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by silent preference\n if (isSilent && !includeSilent) {\n continue;\n }\n\n // Filter by depth preference\n if (messageDepth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a content chunk for real-time streaming\n * Does NOT update database - only broadcasts to connected clients\n */\n private broadcastMessageChunk(messageId: string, chunk: string, depth: number = 0): void {\n const payload = JSON.stringify({\n type: \"message_chunk\",\n message_id: messageId,\n depth: depth,\n chunk: chunk,\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's maxDepth preference\n const attachment = ws.deserializeAttachment() as {\n type: string;\n maxDepth?: number;\n };\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by depth preference\n if (depth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message chunk to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a telemetry event to all connected message WebSocket clients\n * Used for execution status updates (turn_started, tool_started, etc.)\n */\n private broadcastTelemetry(event: TelemetryEvent): void {\n const payload = JSON.stringify(event);\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send telemetry to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a custom event to all connected message WebSocket clients\n * Used by tools via emitThreadEvent() to send user-defined events\n */\n private broadcastEvent(type: string, data: unknown): void {\n const payload = JSON.stringify({\n type: \"event\",\n eventType: type,\n data,\n timestamp: Date.now(),\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send event to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === \"string\" && message === \"ping\") {\n ws.send(\"pong\");\n return;\n }\n } catch (error) {\n console.error(\"[DurableThread] Error handling WebSocket message:\", error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n\n // Close the WebSocket\n ws.close(code, reason);\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableThread] WebSocket error (type: ${attachment?.type}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n }\n\n /**\n * Alarm handler - called by Cloudflare when a scheduled alarm fires\n * Processes the next item in the alarm queue\n *\n * Important: This method must NEVER throw an exception, as that would break\n * the alarm chain. All errors are caught and logged.\n */\n async alarm(): Promise<void> {\n await this.ensureMigrated();\n\n try {\n await this.alarmQueue.processNext();\n } catch (error) {\n // Log but don't throw - Cloudflare will retry automatically\n // We've already logged the error in AlarmQueue, but log again for visibility\n console.error(\"[DurableThread] Alarm handler failed:\", error);\n }\n }\n\n /**\n * Internal method: Execute a flow (called by alarm queue)\n * This is the actual execution logic, separate from the public execute() RPC method\n */\n private async executeFlow(\n threadId: string,\n agentName: string,\n initial_messages?: any[],\n data?: any\n ): Promise<void> {\n // NOTE: We do NOT clear the stop flag here - it should only be cleared by user messages\n // This ensures that if execution was stopped, it stays stopped until the user explicitly\n // sends a new message\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(agentName);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: agentName,\n title: agentDef.title || agentName,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: agentDef.sideA?.prompt,\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: agentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: agentDef.sideA?.endConversationTool,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: agentDef.sideB?.prompt,\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: agentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: agentDef.sideB?.endConversationTool,\n };\n\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n created_at: threadMetadata.created_at,\n };\n\n // Import FlowEngine dynamically\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n\n // Store initial messages with proper timestamps (if provided)\n let rootMessageId: string | undefined;\n if (\n initial_messages &&\n Array.isArray(initial_messages) &&\n initial_messages.length > 0\n ) {\n const messagesToStore = initial_messages.map((msg: any) => ({\n ...msg,\n id: msg.id || crypto.randomUUID(),\n created_at: msg.created_at || Date.now() * 1000,\n }));\n\n for (const msg of messagesToStore) {\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_calls, tool_call_id, created_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n msg.id,\n msg.role,\n msg.content || null,\n msg.name || null,\n msg.tool_calls ? JSON.stringify(msg.tool_calls) : null,\n msg.tool_call_id || null,\n msg.created_at\n );\n if (msg.role === \"user\") {\n rootMessageId = msg.id;\n }\n }\n }\n\n // Ensure we always have a root message id for FK on logs\n if (!rootMessageId) {\n rootMessageId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at) VALUES (?1, ?2, ?3, ?4)`,\n rootMessageId,\n \"system\",\n null,\n Date.now() * 1000\n );\n }\n\n // Execute the flow\n await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) =>\n this.broadcastMessage(message as Record<string, any>),\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n rootMessageId,\n abortController: this.currentAbortController,\n });\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * Internal method: Process a message (called by alarm queue)\n * This is the actual message processing logic, separate from the public sendMessage() RPC method\n */\n private async processMessage(\n threadId: string,\n content: string,\n role: string = \"user\"\n ): Promise<void> {\n // ONLY clear the stop flag when a USER message is sent\n if (role === \"user\") {\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'false' WHERE key = 'stopped'`\n );\n }\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n created_at: threadMetadata.created_at,\n };\n\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: agentDef.sideA?.prompt,\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: agentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: agentDef.sideA?.endConversationTool,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: agentDef.sideB?.prompt,\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: agentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: agentDef.sideB?.endConversationTool,\n };\n\n // Prepare the message object\n const messageId = crypto.randomUUID();\n const timestamp = Date.now() * 1000;\n\n let message: any = {\n id: messageId,\n role,\n content,\n created_at: timestamp,\n };\n\n // Create minimal state for hook execution\n const state = {\n threadId,\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n thread: {\n instance: this as any,\n metadata: thread,\n },\n };\n\n // Run before_create_message hook\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n message = await FlowEngine.runBeforeCreateMessageHook(state as any, message);\n\n // Store the message (possibly modified by hook)\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at) VALUES (?, ?, ?, ?)`,\n message.id,\n message.role,\n message.content,\n message.created_at\n );\n\n // Broadcast the newly created message to WebSocket clients immediately\n this.broadcastMessage({\n id: message.id,\n role: message.role,\n content: message.content,\n created_at: message.created_at,\n });\n\n // Execute the flow (continuing from existing messages)\n // FlowEngine already imported above for hook call\n\n // Determine which side should execute next based on the message that was just sent\n // If message is from side A (assistant), next execution should be side B\n // If message is from side B (user), next execution should be side A\n const nextSide = role === \"assistant\" ? \"b\" : \"a\";\n\n // Create StreamManager for HTTP streaming (WebSocket telemetry is handled separately)\n const stream = new StreamManager();\n\n await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n rootMessageId: message.id,\n currentSide: nextSide,\n stream,\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) =>\n this.broadcastMessage(message as Record<string, any>),\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n abortController: this.currentAbortController,\n });\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * TEST METHOD: Queue a test operation\n * Used for testing alarm queue ordering and timing\n */\n async queueTestOperation(\n id: string,\n label: string,\n expectedOrder: number,\n delayMs: number\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const queueId = await this.alarmQueue.enqueue(\n \"testOperation\",\n { id, label, expectedOrder },\n delayMs\n );\n\n return Response.json({ status: \"queued\", queueId });\n } catch (error: any) {\n console.error(\"Error queuing test operation:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue test operation\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get queue state\n */\n async getQueueState(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const state = await this.alarmQueue.getQueueState();\n return Response.json(state);\n } catch (error: any) {\n console.error(\"Error getting queue state:\", error);\n return Response.json(\n { error: error.message || \"Failed to get queue state\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get test execution logs\n */\n async getTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n label: string;\n expected_order: number;\n executed_at: number;\n }>(`\n SELECT id, label, expected_order, executed_at\n FROM test_operations\n ORDER BY executed_at ASC\n `);\n\n const logs = cursor.toArray();\n return Response.json({ logs });\n } catch (error: any) {\n // Table might not exist yet\n return Response.json({ logs: [] });\n }\n }\n\n /**\n * TEST METHOD: Clear test logs\n */\n async clearTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Clear existing logs\n await this.ctx.storage.sql.exec(`DELETE FROM test_operations`);\n\n return Response.json({ status: \"cleared\" });\n } catch (error: any) {\n console.error(\"Error clearing test logs:\", error);\n return Response.json(\n { error: error.message || \"Failed to clear test logs\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Insert a malformed message with orphaned tool calls\n * This allows testing the tool call filtering logic\n */\n async insertOrphanedToolCall(params: {\n content?: string;\n toolCallId: string;\n toolName: string;\n toolArgs: string;\n }): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const messageId = crypto.randomUUID();\n const toolCalls = JSON.stringify([\n {\n id: params.toolCallId,\n type: \"function\",\n function: {\n name: params.toolName,\n arguments: params.toolArgs,\n },\n },\n ]);\n\n // Insert assistant message with tool_calls but no corresponding tool result\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_calls, created_at)\n VALUES (?, 'assistant', ?, ?, ?)`,\n messageId,\n params.content || null,\n toolCalls,\n Date.now() * 1000\n );\n\n return Response.json({\n status: \"inserted\",\n messageId,\n toolCallId: params.toolCallId,\n });\n } catch (error: any) {\n console.error(\"Error inserting orphaned tool call:\", error);\n return Response.json(\n { error: error.message || \"Failed to insert orphaned tool call\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Execute a test operation\n * Internal method called by alarm queue\n */\n private async testOperation(\n id: string,\n label: string,\n expectedOrder: number\n ): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Log the execution\n await this.ctx.storage.sql.exec(\n `INSERT INTO test_operations (id, label, expected_order, executed_at) VALUES (?, ?, ?, ?)`,\n id,\n label,\n expectedOrder,\n now\n );\n }\n}\n","import type { DurableObjectState } from \"cloudflare:workers\";\n\n/**\n * AlarmQueue - Manages a queue of scheduled method invocations for a Durable Object\n *\n * Since Cloudflare Durable Objects can only have one active alarm at a time,\n * this class maintains a queue in SQLite and processes items sequentially.\n *\n * Key Features:\n * - Atomic queue operations\n * - Automatic cleanup of completed items\n * - 24-hour retention of failed items for debugging\n * - Precise timing control (millisecond accuracy)\n * - Leverages Cloudflare's automatic retry mechanism (up to 6 retries)\n */\nexport class AlarmQueue {\n private ctx: DurableObjectState;\n private sql: DurableObjectState[\"storage\"][\"sql\"];\n\n constructor(ctx: DurableObjectState) {\n this.ctx = ctx;\n this.sql = ctx.storage.sql;\n }\n\n /**\n * Enqueue a method invocation to be executed after a delay\n *\n * @param method - Name of the method to invoke\n * @param args - Arguments to pass to the method (will be JSON serialized)\n * @param delayMs - Delay in milliseconds before execution\n * @returns The ID of the queued item\n */\n async enqueue(\n method: string,\n args: Record<string, any>,\n delayMs: number = 0\n ): Promise<string> {\n const id = crypto.randomUUID();\n const now = Date.now();\n const scheduledAt = now + delayMs;\n\n // Store timestamps in microseconds for consistency with other tables\n const nowMicros = now * 1000;\n const scheduledAtMicros = scheduledAt * 1000;\n\n // Insert into queue\n await this.sql.exec(\n `\n INSERT INTO alarm_queue (\n id, method, args, scheduled_at, created_at, status, attempts\n ) VALUES (?1, ?2, ?3, ?4, ?5, 'pending', 0)\n `,\n id,\n method,\n JSON.stringify(args),\n scheduledAtMicros,\n nowMicros\n );\n\n // Schedule or reschedule the alarm for the earliest pending item\n await this.rescheduleAlarm();\n\n return id;\n }\n\n /**\n * Process the next pending item in the queue\n * Called by the alarm() handler\n *\n * @param alarmInfo - Information about the alarm invocation from Cloudflare\n */\n async processNext(alarmInfo?: { retryCount: number; isRetry: boolean }): Promise<void> {\n // Clean up old failed items first\n await this.cleanupOldFailures();\n\n // Get the next pending item that's due to execute\n const now = Date.now() * 1000; // Convert to microseconds\n\n const cursor = await this.sql.exec<{\n id: string;\n method: string;\n args: string;\n attempts: number;\n }>(\n `\n SELECT id, method, args, attempts\n FROM alarm_queue\n WHERE status = 'pending' AND scheduled_at <= ?\n ORDER BY scheduled_at ASC\n LIMIT 1\n `,\n now\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, reschedule for next item if any\n await this.rescheduleAlarm();\n return;\n }\n\n const item = rows[0];\n\n // Mark as processing\n await this.sql.exec(\n `UPDATE alarm_queue SET status = 'processing', attempts = attempts + 1 WHERE id = ?`,\n item.id\n );\n\n try {\n // Parse arguments\n const args = JSON.parse(item.args);\n\n // Execute the method\n await this.executeMethod(item.method, args);\n\n // Mark as completed and delete immediately\n await this.complete(item.id);\n } catch (error) {\n // Mark as failed and keep for debugging\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.fail(item.id, errorMessage);\n\n // Log the error but don't throw - we want to continue processing the queue\n console.error(`[AlarmQueue] Failed to process item ${item.id}:`, error);\n }\n\n // Always reschedule for the next item, even if this one failed\n await this.rescheduleAlarm();\n }\n\n /**\n * Execute a queued method\n * This method should be overridden or extended by the Durable Object\n *\n * @param method - Name of the method to execute\n * @param args - Arguments to pass to the method\n */\n private async executeMethod(method: string, args: Record<string, any>): Promise<void> {\n // This will be implemented in DurableThread to dispatch to the appropriate method\n throw new Error(`Method execution not implemented: ${method}`);\n }\n\n /**\n * Set the executor function that will be called to execute queued methods\n *\n * @param executor - Function that takes method name and args, executes the method\n */\n setExecutor(executor: (method: string, args: Record<string, any>) => Promise<void>): void {\n this.executeMethod = executor;\n }\n\n /**\n * Mark an item as completed and delete it immediately\n *\n * @param id - ID of the completed item\n */\n private async complete(id: string): Promise<void> {\n await this.sql.exec(`DELETE FROM alarm_queue WHERE id = ?`, id);\n }\n\n /**\n * Mark an item as failed but keep it for 24 hours for debugging\n *\n * @param id - ID of the failed item\n * @param error - Error message\n */\n private async fail(id: string, error: string): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET status = 'failed', error = ?, completed_at = ?\n WHERE id = ?\n `,\n error,\n now,\n id\n );\n }\n\n /**\n * Clean up failed items older than 24 hours\n */\n private async cleanupOldFailures(): Promise<void> {\n const cutoff = (Date.now() - 24 * 60 * 60 * 1000) * 1000; // 24 hours ago in microseconds\n await this.sql.exec(\n `DELETE FROM alarm_queue WHERE status = 'failed' AND completed_at < ?`,\n cutoff\n );\n }\n\n /**\n * Schedule the alarm for the next pending item\n * If no pending items, clear the alarm\n */\n private async rescheduleAlarm(): Promise<void> {\n // Get the earliest pending item\n const cursor = await this.sql.exec<{ scheduled_at: number }>(\n `\n SELECT scheduled_at\n FROM alarm_queue\n WHERE status = 'pending'\n ORDER BY scheduled_at ASC\n LIMIT 1\n `\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, delete the alarm\n await this.ctx.storage.deleteAlarm();\n return;\n }\n\n const nextScheduledAt = rows[0].scheduled_at;\n // Convert from microseconds to milliseconds for setAlarm\n const nextScheduledAtMs = Math.floor(nextScheduledAt / 1000);\n\n // Set the alarm\n // Note: setAlarm accepts Date or number (milliseconds since epoch)\n await this.ctx.storage.setAlarm(nextScheduledAtMs);\n }\n\n /**\n * Get the current state of the queue for debugging\n */\n async getQueueState(): Promise<{\n pending: number;\n processing: number;\n failed: number;\n nextScheduledAt: number | null;\n }> {\n // Count by status\n const countCursor = await this.sql.exec<{ status: string; count: number }>(\n `SELECT status, COUNT(*) as count FROM alarm_queue GROUP BY status`\n );\n\n const counts = countCursor.toArray();\n const pending = counts.find((c) => c.status === \"pending\")?.count || 0;\n const processing = counts.find((c) => c.status === \"processing\")?.count || 0;\n const failed = counts.find((c) => c.status === \"failed\")?.count || 0;\n\n // Get next scheduled time\n const nextCursor = await this.sql.exec<{ scheduled_at: number }>(\n `SELECT scheduled_at FROM alarm_queue WHERE status = 'pending' ORDER BY scheduled_at ASC LIMIT 1`\n );\n const nextRows = nextCursor.toArray();\n const nextScheduledAt = nextRows.length > 0 ? nextRows[0].scheduled_at : null;\n\n return {\n pending,\n processing,\n failed,\n nextScheduledAt,\n };\n }\n}\n","import type { SqlStorage } from 'cloudflare:workers';\n\n/**\n * Initial schema for DurableAgentBuilder.\n *\n * This creates the core tables for:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication\n * - API keys\n * - Sessions\n * - OAuth accounts\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state (for GitHub integration)\n */\nexport const migration = {\n version: 1,\n async up(sql: SqlStorage) {\n // Metadata table for schema versioning\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n )\n `);\n\n // Thread registry - maps thread IDs to agent names\n // agent_name references the name from TypeScript config files\n sql.exec(`\n CREATE TABLE threads (\n id TEXT PRIMARY KEY NOT NULL,\n agent_name TEXT NOT NULL,\n user_id TEXT,\n tags TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_threads_agent_name ON threads(agent_name)`);\n sql.exec(`CREATE INDEX idx_threads_user_id ON threads(user_id)`);\n sql.exec(`CREATE INDEX idx_threads_created_at ON threads(created_at)`);\n\n // Users table for authentication\n sql.exec(`\n CREATE TABLE users (\n id TEXT PRIMARY KEY NOT NULL,\n username TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'admin' CHECK (role IN ('admin')),\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_users_username ON users(username)`);\n sql.exec(`CREATE INDEX idx_users_role ON users(role)`);\n\n // OAuth accounts table for linking OAuth providers to users\n sql.exec(`\n CREATE TABLE oauth_accounts (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n provider TEXT NOT NULL CHECK (provider IN ('github', 'google')),\n provider_user_id TEXT NOT NULL,\n provider_username TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE UNIQUE INDEX idx_oauth_accounts_provider ON oauth_accounts(provider, provider_user_id)`);\n sql.exec(`CREATE INDEX idx_oauth_accounts_user_id ON oauth_accounts(user_id)`);\n\n // API Keys table for programmatic access\n sql.exec(`\n CREATE TABLE api_keys (\n id TEXT PRIMARY KEY NOT NULL,\n name TEXT NOT NULL,\n key_hash TEXT NOT NULL,\n key_prefix TEXT NOT NULL,\n last_five TEXT NOT NULL,\n user_id TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n last_used_at INTEGER,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_api_keys_key_hash ON api_keys(key_hash)`);\n sql.exec(`CREATE INDEX idx_api_keys_user_id ON api_keys(user_id)`);\n sql.exec(`CREATE INDEX idx_api_keys_key_prefix ON api_keys(key_prefix)`);\n\n // Sessions table for user sessions\n sql.exec(`\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n expires_at INTEGER NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_sessions_token_hash ON sessions(token_hash)`);\n sql.exec(`CREATE INDEX idx_sessions_user_id ON sessions(user_id)`);\n sql.exec(`CREATE INDEX idx_sessions_expires_at ON sessions(expires_at)`);\n\n // Provider credentials (API keys for LLM providers)\n sql.exec(`\n CREATE TABLE providers (\n name TEXT PRIMARY KEY NOT NULL,\n sdk TEXT NOT NULL,\n api_key TEXT NOT NULL\n )\n `);\n\n // Edit lock state for GitHub integration\n // Prevents concurrent edits when committing to GitHub\n sql.exec(`\n CREATE TABLE edit_lock (\n id TEXT PRIMARY KEY DEFAULT 'singleton' CHECK (id = 'singleton'),\n locked_by TEXT,\n locked_at INTEGER,\n lock_reason TEXT,\n pending_changes TEXT\n )\n `);\n sql.exec(`INSERT INTO edit_lock (id) VALUES ('singleton')`);\n\n // Set schema version\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n },\n};\n","import { migration as m0001 } from './0001_initial.js';\n\nexport const migrations = [m0001];\n\nexport const LATEST_SCHEMA_VERSION = 1;\n","import { DurableObject } from 'cloudflare:workers';\nimport {\n migrations,\n LATEST_SCHEMA_VERSION,\n} from './agentbuilder-migrations/index.js';\n\n/**\n * Environment type for DurableAgentBuilder.\n * Users extend this with their own bindings.\n */\nexport interface AgentBuilderEnv {\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilder>;\n AGENT_BUILDER_THREAD: DurableObjectNamespace;\n // GitHub integration (optional)\n GITHUB_TOKEN?: string;\n GITHUB_REPO?: string;\n GITHUB_BRANCH?: string;\n}\n\n/**\n * Thread metadata stored in the registry.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n}\n\n/**\n * Parameters for updating a thread.\n */\nexport interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n}\n\n/**\n * User record.\n */\nexport interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n}\n\n/**\n * Provider credentials.\n */\nexport interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n}\n\n/**\n * DurableAgentBuilder - The root Durable Object for AgentBuilder.\n *\n * This is a singleton DO that stores:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication data\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state for GitHub integration\n *\n * ## Usage\n *\n * Users must extend this class to provide virtual module access:\n *\n * ```typescript\n * import { DurableAgentBuilder } from '@standardagents/builder/runtime';\n * import { models } from 'virtual:@standardagents-models';\n * import { prompts } from 'virtual:@standardagents-prompts';\n * import { agents } from 'virtual:@standardagents-agents';\n *\n * export class AgentBuilder extends DurableAgentBuilder {\n * models() { return models; }\n * prompts() { return prompts; }\n * agents() { return agents; }\n * }\n * ```\n */\n/**\n * Event types that can be emitted via WebSocket\n */\nexport type AgentBuilderEvent =\n | { type: 'thread_created'; thread: ThreadRegistryEntry }\n | { type: 'thread_deleted'; threadId: string };\n\nexport class DurableAgentBuilder<\n Env extends AgentBuilderEnv = AgentBuilderEnv,\n> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private eventSockets: Set<WebSocket> = new Set();\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Restore WebSocket connections after hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.channel === 'events') {\n this.eventSockets.add(ws);\n }\n }\n }\n\n /**\n * Returns the tools registry for lazy-loading tool definitions.\n * Must be overridden in a subclass.\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.tools() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the hooks registry for lazy-loading hook definitions.\n * Must be overridden in a subclass.\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.hooks() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * Must be overridden in a subclass.\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.models() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * Must be overridden in a subclass.\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.prompts() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * Must be overridden in a subclass.\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.agents() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n // ============================================================\n // Migration Methods\n // ============================================================\n\n private async ensureMigrated(): Promise<void> {\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n }\n\n private async getCurrentVersion(): Promise<number> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray();\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === 'number' ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n return 0;\n }\n }\n\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n // ============================================================\n // Thread Registry Methods\n // ============================================================\n\n /**\n * Create a new thread and add it to the registry.\n */\n async createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO threads (id, agent_name, user_id, tags, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n id,\n params.agent_name,\n params.user_id || null,\n params.tags ? JSON.stringify(params.tags) : null,\n now\n );\n\n const thread: ThreadRegistryEntry = {\n id,\n agent_name: params.agent_name,\n user_id: params.user_id || null,\n tags: params.tags || null,\n created_at: now,\n };\n\n // Broadcast thread_created event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_created', thread });\n\n return thread;\n }\n\n /**\n * Get a thread by ID.\n */\n async getThread(id: string): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n created_at: number;\n }>(`SELECT id, agent_name, user_id, tags, created_at FROM threads WHERE id = ?`, id);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n const row = rows[0];\n return {\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n created_at: row.created_at,\n };\n }\n\n /**\n * List threads with optional filtering.\n */\n async listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }> {\n await this.ensureMigrated();\n\n const whereClauses: string[] = [];\n const args: any[] = [];\n\n if (params?.agent_name) {\n whereClauses.push('agent_name = ?');\n args.push(params.agent_name);\n }\n\n if (params?.user_id) {\n whereClauses.push('user_id = ?');\n args.push(params.user_id);\n }\n\n const whereClause = whereClauses.length > 0\n ? `WHERE ${whereClauses.join(' AND ')}`\n : '';\n\n // Get total count\n const countCursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM threads ${whereClause}`,\n ...args\n );\n const total = countCursor.one().count;\n\n // Get threads\n const limit = params?.limit ?? 100;\n const offset = params?.offset ?? 0;\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n created_at: number;\n }>(\n `SELECT id, agent_name, user_id, tags, created_at FROM threads\n ${whereClause}\n ORDER BY created_at DESC\n LIMIT ? OFFSET ?`,\n ...args,\n limit,\n offset\n );\n\n const threads = cursor.toArray().map((row) => ({\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n created_at: row.created_at,\n }));\n\n return { threads, total };\n }\n\n /**\n * Delete a thread from the registry.\n */\n async deleteThread(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM threads WHERE id = ?`, id);\n\n // Broadcast thread_deleted event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_deleted', threadId: id });\n\n return true;\n }\n\n /**\n * Update a thread's agent_name (used during agent handoff).\n */\n async updateThreadAgent(id: string, agent_name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET agent_name = ? WHERE id = ?`,\n agent_name,\n id\n );\n return true;\n }\n\n /**\n * Update a thread's metadata.\n */\n async updateThread(\n id: string,\n params: UpdateThreadParams\n ): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n // Check thread exists\n const existing = await this.getThread(id);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: any[] = [];\n\n if (params.agent_name !== undefined) {\n updates.push('agent_name = ?');\n values.push(params.agent_name);\n }\n if (params.user_id !== undefined) {\n updates.push('user_id = ?');\n values.push(params.user_id);\n }\n if (params.tags !== undefined) {\n updates.push('tags = ?');\n values.push(params.tags ? JSON.stringify(params.tags) : null);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n return this.getThread(id);\n }\n\n // ============================================================\n // Model Lookup Methods\n // ============================================================\n\n /**\n * Load a model definition by name.\n */\n async loadModel(name: string): Promise<any> {\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n // ============================================================\n // Prompt Lookup Methods\n // ============================================================\n\n /**\n * Load a prompt definition by name.\n */\n async loadPrompt(name: string): Promise<any> {\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n // ============================================================\n // Agent Lookup Methods\n // ============================================================\n\n /**\n * Load an agent definition by name.\n */\n async loadAgent(name: string): Promise<any> {\n const registry = this.agents();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n // ============================================================\n // Provider Methods\n // ============================================================\n\n /**\n * Get a provider's credentials.\n */\n async getProvider(name: string): Promise<Provider | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers WHERE name = ?`, name);\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Set a provider's credentials.\n */\n async setProvider(provider: Provider): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `INSERT OR REPLACE INTO providers (name, sdk, api_key) VALUES (?, ?, ?)`,\n provider.name,\n provider.sdk,\n provider.api_key\n );\n }\n\n /**\n * List all providers.\n */\n async listProviders(): Promise<Provider[]> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers`);\n\n return cursor.toArray();\n }\n\n /**\n * Delete a provider.\n */\n async deleteProvider(name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM providers WHERE name = ?`, name);\n return true;\n }\n\n // ============================================================\n // User Authentication Methods\n // ============================================================\n\n /**\n * Get a user by username.\n */\n async getUserByUsername(username: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE username = ?`,\n username\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Get a user by ID.\n */\n async getUserById(id: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE id = ?`,\n id\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Create a new user.\n */\n async createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO users (id, username, password_hash, role, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.username,\n params.password_hash,\n params.role || 'admin',\n now,\n now\n );\n\n return {\n id,\n username: params.username,\n password_hash: params.password_hash,\n role: params.role || 'admin',\n created_at: now,\n updated_at: now,\n };\n }\n\n /**\n * Check if any users exist (for first-time setup).\n */\n async hasUsers(): Promise<boolean> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM users`\n );\n\n return cursor.one().count > 0;\n }\n\n /**\n * List all users (excludes password hash).\n */\n async listUsers(): Promise<\n Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(`SELECT id, username, role, created_at, updated_at FROM users ORDER BY created_at DESC`);\n\n return cursor.toArray().map((row) => ({\n id: row.id,\n username: row.username,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n }\n\n /**\n * Update a user.\n */\n async updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n // Check user exists\n const existing = await this.getUserById(id);\n if (!existing) return null;\n\n const now = Math.floor(Date.now() / 1000);\n const updates: string[] = [];\n const values: any[] = [];\n\n if (params.username !== undefined) {\n updates.push('username = ?');\n values.push(params.username);\n }\n if (params.password_hash !== undefined) {\n updates.push('password_hash = ?');\n values.push(params.password_hash);\n }\n if (params.role !== undefined) {\n updates.push('role = ?');\n values.push(params.role);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n updates.push('updated_at = ?');\n values.push(now);\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE users SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n return this.getUserById(id);\n }\n\n /**\n * Delete a user.\n */\n async deleteUser(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // First delete any sessions for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE user_id = ?`,\n id\n );\n\n // Then delete any API keys for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE user_id = ?`,\n id\n );\n\n // Finally delete the user\n await this.ctx.storage.sql.exec(`DELETE FROM users WHERE id = ?`, id);\n return true;\n }\n\n // ============================================================\n // Session Methods\n // ============================================================\n\n /**\n * Create a new session.\n */\n async createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO sessions (id, user_id, token_hash, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.token_hash,\n params.expires_at,\n now\n );\n\n return id;\n }\n\n /**\n * Validate a session token.\n */\n async validateSession(\n tokenHash: string\n ): Promise<{ user_id: string; expires_at: number } | null> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n\n const cursor = await this.ctx.storage.sql.exec<{\n user_id: string;\n expires_at: number;\n }>(\n `SELECT user_id, expires_at FROM sessions\n WHERE token_hash = ? AND expires_at > ?`,\n tokenHash,\n now\n );\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Delete expired sessions.\n */\n async cleanupSessions(): Promise<number> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE expires_at <= ?`,\n now\n );\n\n return 0; // SQLite in DO doesn't return affected rows easily\n }\n\n /**\n * Delete a session.\n */\n async deleteSession(tokenHash: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE token_hash = ?`,\n tokenHash\n );\n }\n\n // ============================================================\n // API Key Methods\n // ============================================================\n\n /**\n * Create an API key.\n */\n async createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO api_keys (id, name, key_hash, key_prefix, last_five, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n id,\n params.name,\n params.key_hash,\n params.key_prefix,\n params.last_five,\n params.user_id,\n now\n );\n\n return id;\n }\n\n /**\n * Validate an API key.\n */\n async validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n user_id: string;\n }>(`SELECT id, user_id FROM api_keys WHERE key_hash = ?`, keyHash);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n // Update last_used_at\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE api_keys SET last_used_at = ? WHERE key_hash = ?`,\n now,\n keyHash\n );\n\n return rows[0];\n }\n\n /**\n * List API keys for a user.\n */\n async listApiKeys(\n userId: string\n ): Promise<\n Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>(\n `SELECT id, name, key_prefix, last_five, created_at, last_used_at\n FROM api_keys WHERE user_id = ? ORDER BY created_at DESC`,\n userId\n );\n\n return cursor.toArray();\n }\n\n /**\n * Delete an API key.\n */\n async deleteApiKey(id: string, userId: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE id = ? AND user_id = ?`,\n id,\n userId\n );\n return true;\n }\n\n // ============================================================\n // OAuth Methods\n // ============================================================\n\n /**\n * Link an OAuth account to a user.\n */\n async linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO oauth_accounts (id, user_id, provider, provider_user_id, provider_username, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.provider,\n params.provider_user_id,\n params.provider_username || null,\n now\n );\n }\n\n /**\n * Find user by OAuth account.\n */\n async findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ user_id: string }>(\n `SELECT user_id FROM oauth_accounts WHERE provider = ? AND provider_user_id = ?`,\n provider,\n providerUserId\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n return this.getUserById(rows[0].user_id);\n }\n\n // ============================================================\n // Edit Lock Methods (for GitHub integration)\n // ============================================================\n\n /**\n * Acquire edit lock for GitHub commits.\n */\n async acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean> {\n await this.ensureMigrated();\n\n // Check if already locked\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n }>(`SELECT locked_by, locked_at FROM edit_lock WHERE id = 'singleton'`);\n\n const row = cursor.one();\n if (row.locked_by) {\n return false; // Already locked\n }\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = ?, locked_at = ?, lock_reason = ? WHERE id = 'singleton'`,\n params.locked_by,\n now,\n params.lock_reason\n );\n\n return true;\n }\n\n /**\n * Release edit lock.\n */\n async releaseEditLock(lockedBy: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // Only release if we hold the lock\n const cursor = await this.ctx.storage.sql.exec<{ locked_by: string | null }>(\n `SELECT locked_by FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n if (row.locked_by !== lockedBy) {\n return false;\n }\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = NULL, locked_at = NULL, lock_reason = NULL, pending_changes = NULL WHERE id = 'singleton'`\n );\n\n return true;\n }\n\n /**\n * Get current lock state.\n */\n async getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>(\n `SELECT locked_by, locked_at, lock_reason, pending_changes FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n return {\n locked: !!row.locked_by,\n locked_by: row.locked_by,\n locked_at: row.locked_at,\n lock_reason: row.lock_reason,\n pending_changes: row.pending_changes,\n };\n }\n\n /**\n * Store pending changes for commit.\n */\n async setPendingChanges(changes: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET pending_changes = ? WHERE id = 'singleton'`,\n changes\n );\n }\n\n // ============================================================\n // Utility Methods\n // ============================================================\n\n /**\n * Get the Durable Object stub for a thread.\n */\n getThreadStub(threadId: string): DurableObjectStub {\n const doId = this.env.AGENT_BUILDER_THREAD.idFromName(threadId);\n return this.env.AGENT_BUILDER_THREAD.get(doId);\n }\n\n // ============================================================\n // WebSocket Methods\n // ============================================================\n\n /**\n * Handle fetch requests - used for WebSocket upgrades\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get('Upgrade');\n if (upgradeHeader?.toLowerCase() === 'websocket') {\n return this.handleEventsWebSocketUpgrade(request);\n }\n\n return new Response('Use RPC methods instead of fetch', { status: 400 });\n }\n\n /**\n * Handle WebSocket upgrade for events channel\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleEventsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // The channel field allows for future expansion to other channels\n server.serializeAttachment({ channel: 'events' });\n\n // Track this socket for broadcasting events\n this.eventSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast an event to all connected WebSocket clients\n */\n private broadcastEvent(event: AgentBuilderEvent): void {\n const payload = JSON.stringify(event);\n for (const ws of Array.from(this.eventSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.eventSockets.delete(ws);\n }\n } catch (err) {\n this.eventSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === 'string' && message === 'ping') {\n ws.send('pong');\n return;\n }\n } catch (error) {\n console.error('[DurableAgentBuilder] Error handling WebSocket message:', error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n\n // Close the WebSocket\n ws.close(code, reason);\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableAgentBuilder] WebSocket error (channel: ${attachment?.channel}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n }\n}\n","/**\n * Model definition module for AgentBuilder.\n *\n * Models define LLM configurations including provider, model ID, pricing,\n * and fallback chains. Models are referenced by name from prompts.\n *\n * @module\n */\n\n/**\n * Supported LLM provider types.\n * Each provider requires a corresponding API key environment variable:\n * - `openai` → `OPENAI_API_KEY`\n * - `openrouter` → `OPENROUTER_API_KEY`\n * - `anthropic` → `ANTHROPIC_API_KEY`\n * - `google` → `GOOGLE_API_KEY`\n */\nexport type ModelProvider = 'openai' | 'openrouter' | 'anthropic' | 'google';\n\n/**\n * Model definition configuration.\n *\n * @template N - The model name as a string literal type for type inference\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: 'openai',\n * model: 'gpt-4o',\n * fallbacks: ['gpt-4-turbo', 'gpt-3.5-turbo'],\n * inputPrice: 2.5,\n * outputPrice: 10,\n * });\n * ```\n */\nexport interface ModelDefinition<N extends string = string> {\n /**\n * Unique name for this model definition.\n * Used as the identifier when referencing from prompts.\n * Should be descriptive and consistent (e.g., 'gpt-4o', 'claude-3-opus').\n */\n name: N;\n\n /**\n * The LLM provider to use for API calls.\n * The corresponding API key environment variable must be set.\n */\n provider: ModelProvider;\n\n /**\n * The actual model identifier sent to the provider API.\n *\n * For OpenAI: 'gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo', etc.\n * For OpenRouter: 'openai/gpt-4o', 'anthropic/claude-3-opus', etc.\n * For Anthropic: 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', etc.\n * For Google: 'gemini-1.5-pro', 'gemini-1.5-flash', etc.\n */\n model: string;\n\n /**\n * Optional list of additional provider prefixes for OpenRouter.\n * Allows routing through specific providers when using OpenRouter.\n *\n * @example ['anthropic', 'google'] - prefer Anthropic, fallback to Google\n */\n includedProviders?: string[];\n\n /**\n * Fallback models to try if this model fails.\n * Referenced by model name (must be defined in agentbuilder/models/).\n * Tried in order after primary model exhausts retries.\n *\n * @example ['gpt-4', 'gpt-3.5-turbo']\n */\n fallbacks?: AgentBuilder.Models[];\n\n /**\n * Cost per 1 million input tokens in USD.\n * Used for cost tracking and reporting in logs.\n */\n inputPrice?: number;\n\n /**\n * Cost per 1 million output tokens in USD.\n * Used for cost tracking and reporting in logs.\n */\n outputPrice?: number;\n\n /**\n * Cost per 1 million cached input tokens in USD.\n * Some providers offer reduced pricing for cached/repeated prompts.\n */\n cachedPrice?: number;\n}\n\n/**\n * Defines an LLM model configuration.\n *\n * Models are the foundation of the agent system - they specify which\n * AI model to use and how to connect to it. Models can have fallbacks\n * for reliability and include pricing for cost tracking.\n *\n * @template N - The model name as a string literal type\n * @param options - Model configuration options\n * @returns The model definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/models/gpt_4o.ts\n * import { defineModel } from '@standardagents/builder';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: 'openai',\n * model: 'gpt-4o',\n * fallbacks: ['gpt-4-turbo'],\n * inputPrice: 2.5,\n * outputPrice: 10,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using OpenRouter with provider preferences\n * export default defineModel({\n * name: 'claude-3-opus',\n * provider: 'openrouter',\n * model: 'anthropic/claude-3-opus',\n * includedProviders: ['anthropic'],\n * });\n * ```\n */\nexport function defineModel<N extends string>(\n options: ModelDefinition<N>\n): ModelDefinition<N> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Model name is required');\n }\n if (!options.provider) {\n throw new Error('Model provider is required');\n }\n if (!options.model) {\n throw new Error('Model ID is required');\n }\n\n // Validate provider is a known type\n const validProviders: ModelProvider[] = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(options.provider)) {\n throw new Error(\n `Invalid provider '${options.provider}'. Must be one of: ${validProviders.join(', ')}`\n );\n }\n\n // Validate pricing is non-negative if provided\n if (options.inputPrice !== undefined && options.inputPrice < 0) {\n throw new Error('inputPrice must be non-negative');\n }\n if (options.outputPrice !== undefined && options.outputPrice < 0) {\n throw new Error('outputPrice must be non-negative');\n }\n if (options.cachedPrice !== undefined && options.cachedPrice < 0) {\n throw new Error('cachedPrice must be non-negative');\n }\n\n return options;\n}\n","/**\n * Prompt definition module for AgentBuilder.\n *\n * Prompts define LLM interaction configurations including the system prompt,\n * model selection, available tools, and various behavioral options.\n *\n * @module\n */\n\nimport type { z } from 'zod';\n\n// ============================================================================\n// Structured Prompt Types (Discriminated Union)\n// ============================================================================\n\n/**\n * A text part of a prompt - static text content.\n *\n * @example\n * ```typescript\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' }\n * ```\n */\nexport interface PromptTextPart {\n type: 'text';\n /** The text content */\n content: string;\n}\n\n/**\n * A prompt inclusion part - includes another prompt's content.\n * Uses AgentBuilder.Prompts for type-safe autocomplete of prompt names.\n *\n * @example\n * ```typescript\n * { type: 'include', prompt: 'responder_rules' }\n * ```\n */\nexport interface PromptIncludePart {\n type: 'include';\n /** The name of the prompt to include (type-safe with autocomplete) */\n prompt: AgentBuilder.Prompts;\n}\n\n/**\n * A single part of a structured prompt.\n * Discriminated union on `type` field for TypeScript narrowing.\n */\nexport type PromptPart = PromptTextPart | PromptIncludePart;\n\n/**\n * A structured prompt is an array of prompt parts.\n * Provides type-safe composition with other prompts via autocomplete.\n *\n * @example\n * ```typescript\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' },\n * { type: 'text', content: '\\n\\nBe concise.' },\n * ]\n * ```\n */\nexport type StructuredPrompt = PromptPart[];\n\n/**\n * The prompt content can be either a plain string or a structured array.\n *\n * @example\n * ```typescript\n * // Simple string prompt:\n * prompt: 'You are a helpful assistant.'\n *\n * // Structured prompt with includes:\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' },\n * ]\n * ```\n */\nexport type PromptContent = string | StructuredPrompt;\n\n// ============================================================================\n// Tool Configuration\n// ============================================================================\n\n/**\n * Tool configuration for including a tool in a prompt.\n *\n * @template T - The tool name type (for type-safe tool references)\n */\nexport interface ToolConfig<T extends string = AgentBuilder.Callables> {\n /**\n * Name of the tool to include.\n * Must be a tool, prompt, or agent defined in agentbuilder/.\n */\n name: T;\n\n /**\n * Include text response content from sub-prompt execution in the tool result.\n * @default true\n */\n includeTextResponse?: boolean;\n\n /**\n * Include tool call details from sub-prompt execution in the tool result.\n * @default true\n */\n includeToolCalls?: boolean;\n\n /**\n * Include error details from sub-prompt execution in the tool result.\n * @default true\n */\n includeErrors?: boolean;\n\n /**\n * Property from the tool call arguments to use as the initial user message\n * when this tool triggers a sub-prompt execution.\n *\n * @example\n * If the tool is called with `{ query: \"search term\", limit: 10 }` and\n * `initUserMessageProperty: 'query'`, the sub-prompt will receive\n * \"search term\" as the initial user message.\n */\n initUserMessageProperty?: string;\n}\n\n/**\n * Reasoning configuration for models that support extended thinking.\n * Applies to models like OpenAI o1, Anthropic Claude with extended thinking,\n * Google Gemini with thinking, and Qwen with reasoning.\n */\nexport interface ReasoningConfig {\n /**\n * Effort level for reasoning models.\n * Higher effort = more thinking tokens = potentially better results.\n *\n * - `low`: Minimal reasoning, faster responses\n * - `medium`: Balanced reasoning and speed\n * - `high`: Maximum reasoning, slower but more thorough\n *\n * @default undefined (use model defaults)\n */\n effort?: 'low' | 'medium' | 'high';\n\n /**\n * Maximum tokens to allocate for reasoning.\n * Applies to models that support token limits on reasoning\n * (Anthropic, Gemini, Qwen).\n */\n maxTokens?: number;\n\n /**\n * Use reasoning internally but exclude from the response.\n * Model thinks through the problem but only returns the final answer.\n * Useful for cleaner outputs while maintaining reasoning quality.\n */\n exclude?: boolean;\n\n /**\n * Include reasoning content in the message history for multi-turn context.\n * When true, reasoning is preserved and visible to subsequent turns.\n * @default false\n */\n include?: boolean;\n}\n\n/**\n * Prompt definition configuration.\n *\n * @template N - The prompt name as a string literal type\n * @template S - The Zod schema type for requiredSchema (inferred automatically)\n *\n * @example\n * ```typescript\n * import { definePrompt } from '@standardagents/builder';\n * import { z } from 'zod';\n *\n * export default definePrompt({\n * name: 'customer_support',\n * toolDescription: 'Handle customer support inquiries',\n * model: 'gpt-4o',\n * // Simple string prompt:\n * prompt: `You are a helpful customer support agent.\n * Always be polite and try to resolve issues quickly.`,\n * // Or structured prompt with type-safe includes:\n * // prompt: [\n * // { type: 'text', content: 'You are a helpful customer support agent.\\n\\n' },\n * // { type: 'include', prompt: 'common_rules' },\n * // ],\n * tools: ['search_knowledge_base', 'create_ticket'],\n * requiredSchema: z.object({\n * query: z.string().describe('The customer inquiry'),\n * }),\n * });\n * ```\n */\nexport interface PromptDefinition<\n N extends string = string,\n S extends z.ZodTypeAny = z.ZodTypeAny\n> {\n /**\n * Unique name for this prompt.\n * Used as the identifier when referencing from agents or as a tool.\n * Should be snake_case (e.g., 'customer_support', 'data_analyst').\n */\n name: N;\n\n /**\n * Description shown when this prompt is exposed as a tool.\n * Should clearly describe what this prompt does for LLM tool selection.\n */\n toolDescription: string;\n\n /**\n * The system prompt content sent to the LLM.\n *\n * Can be either:\n * 1. A plain string - simple prompt text\n * 2. A structured array - for composing prompts with type-safe includes\n *\n * @example\n * ```typescript\n * // Simple string prompt:\n * prompt: 'You are a helpful assistant.'\n *\n * // Structured prompt with type-safe includes:\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' }, // autocomplete for prompt names!\n * { type: 'text', content: '\\n\\nBe concise.' },\n * ]\n * ```\n */\n prompt: PromptContent;\n\n /**\n * Model to use for this prompt.\n * Must reference a model defined in agentbuilder/models/.\n * Provides autocomplete when types are generated.\n */\n model: AgentBuilder.Models;\n\n /**\n * @deprecated All prompts are now automatically exposed as tools.\n * This property is ignored and will be removed in a future version.\n */\n exposeAsTool?: boolean;\n\n /**\n * Include full chat history in the LLM context.\n * When true, all previous messages in the conversation are included.\n * @default false\n */\n includeChat?: boolean;\n\n /**\n * Include results from past tool calls in the LLM context.\n * When true, previous tool call results are visible to the LLM.\n * @default false\n */\n includePastTools?: boolean;\n\n /**\n * Allow parallel execution of multiple tool calls.\n * When true, if the LLM requests multiple tools, they execute concurrently.\n * @default false\n */\n parallelToolCalls?: boolean;\n\n /**\n * Tool calling strategy for the LLM.\n *\n * - `auto`: Model decides when to call tools (default)\n * - `none`: Disable tool calling entirely\n * - `required`: Force the model to call at least one tool\n *\n * @default 'auto'\n */\n toolChoice?: 'auto' | 'none' | 'required';\n\n /**\n * Zod schema for validating inputs when this prompt is called as a tool.\n *\n * The schema provides:\n * - Runtime validation of tool call arguments\n * - Type inference for the prompt's input type\n * - Auto-generated JSON Schema for LLM tool definitions\n *\n * Use `.describe()` on schema fields to provide descriptions for the LLM.\n *\n * @example\n * ```typescript\n * requiredSchema: z.object({\n * query: z.string().describe('The search query'),\n * limit: z.number().optional().default(10).describe('Max results'),\n * })\n * ```\n */\n requiredSchema?: S;\n\n /**\n * Tools available to this prompt.\n * Can be simple tool names or detailed configurations.\n *\n * Tools can be:\n * - Custom tools defined in agentbuilder/tools/\n * - Other prompts with exposeAsTool: true\n * - Agents with exposeAsTool: true\n *\n * @example\n * ```typescript\n * tools: [\n * 'search_docs', // Simple reference\n * { name: 'create_ticket', includeErrors: false }, // With config\n * ]\n * ```\n */\n tools?: (AgentBuilder.Callables | ToolConfig)[];\n\n /**\n * Agents that can receive handoffs from this prompt.\n * Enables multi-agent workflows where this prompt can transfer\n * the conversation to a specialized agent.\n */\n handoffAgents?: AgentBuilder.Agents[];\n\n /**\n * Tool to execute before the LLM request.\n * Useful for data fetching, context preparation, or preprocessing.\n * The tool result is available in the prompt context.\n */\n beforeTool?: AgentBuilder.Callables;\n\n /**\n * Tool to execute after the LLM response.\n * Useful for post-processing, logging, or side effects.\n */\n afterTool?: AgentBuilder.Callables;\n\n /**\n * Reasoning configuration for models that support extended thinking.\n * Configure effort level, token limits, and visibility of reasoning.\n */\n reasoning?: ReasoningConfig;\n}\n\n/**\n * Helper type to extract the inferred input type from a prompt's Zod schema.\n *\n * @template T - The prompt definition type\n *\n * @example\n * ```typescript\n * const searchPrompt = definePrompt({\n * name: 'search',\n * requiredSchema: z.object({ query: z.string(), limit: z.number() }),\n * // ...\n * });\n *\n * type SearchInput = PromptInput<typeof searchPrompt>;\n * // { query: string; limit: number }\n * ```\n */\nexport type PromptInput<T extends PromptDefinition<any, any>> =\n T['requiredSchema'] extends z.ZodTypeAny ? z.infer<T['requiredSchema']> : never;\n\n/**\n * Defines a prompt configuration for LLM interactions.\n *\n * Prompts are the primary way to configure how agents interact with LLMs.\n * They specify the system prompt, available tools, input validation,\n * and various behavioral options.\n *\n * @template N - The prompt name as a string literal type\n * @template S - The Zod schema type for requiredSchema\n * @param options - Prompt configuration options\n * @returns The prompt definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/prompts/customer_support.ts\n * import { definePrompt } from '@standardagents/builder';\n * import { z } from 'zod';\n *\n * export default definePrompt({\n * name: 'customer_support',\n * toolDescription: 'Handle customer support inquiries',\n * model: 'gpt-4o',\n * prompt: `You are a helpful customer support agent.\n * Always be polite and try to resolve issues quickly.\n * If you cannot help, offer to escalate to a human.`,\n * tools: ['search_knowledge_base', 'create_ticket'],\n * handoffAgents: ['escalation_agent'],\n * includeChat: true,\n * exposeAsTool: true,\n * requiredSchema: z.object({\n * query: z.string().describe('The customer inquiry'),\n * }),\n * });\n * ```\n */\nexport function definePrompt<N extends string, S extends z.ZodTypeAny = never>(\n options: PromptDefinition<N, S>\n): PromptDefinition<N, S> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Prompt name is required');\n }\n if (!options.toolDescription) {\n throw new Error('Prompt toolDescription is required');\n }\n if (!options.model) {\n throw new Error('Prompt model is required');\n }\n if (!options.prompt) {\n throw new Error('Prompt content is required');\n }\n\n // Validate toolChoice is a known value\n if (options.toolChoice && !['auto', 'none', 'required'].includes(options.toolChoice)) {\n throw new Error(\n `Invalid toolChoice '${options.toolChoice}'. Must be one of: auto, none, required`\n );\n }\n\n // Validate reasoning effort is a known value\n if (options.reasoning?.effort && !['low', 'medium', 'high'].includes(options.reasoning.effort)) {\n throw new Error(\n `Invalid reasoning.effort '${options.reasoning.effort}'. Must be one of: low, medium, high`\n );\n }\n\n return options;\n}\n","/**\n * Agent definition module for AgentBuilder.\n *\n * Agents orchestrate conversations between AI models (dual_ai) or between\n * AI and human users (ai_human). They define the prompts, stop conditions,\n * and behavioral rules for each side of the conversation.\n *\n * @module\n */\n\n/**\n * Agent conversation type.\n *\n * - `ai_human`: AI conversing with a human user (most common)\n * - `dual_ai`: Two AI participants conversing with each other\n */\nexport type AgentType = 'ai_human' | 'dual_ai';\n\n/**\n * Configuration for one side of an agent conversation.\n *\n * Each side has a prompt, stop conditions, and turn limits.\n * For `ai_human` agents, only sideA (the AI) needs configuration.\n * For `dual_ai` agents, both sides need configuration.\n */\nexport interface SideConfig {\n /**\n * Custom label for this side of the conversation.\n * Used in UI and logs for clarity.\n *\n * @example 'Support Agent', 'Customer', 'ATC', 'Pilot'\n */\n label?: string;\n\n /**\n * The prompt to use for this side.\n * Must reference a prompt defined in agentbuilder/prompts/.\n */\n prompt: AgentBuilder.Prompts;\n\n /**\n * Stop this side's turn when it returns a text response (no tool calls).\n * When true, the side's turn ends after producing a message without tools.\n * @default true\n */\n stopOnResponse?: boolean;\n\n /**\n * Stop this side's turn when a specific tool is called.\n * Overrides stopOnResponse when the named tool is invoked.\n * Requires stopToolResponseProperty to extract the result.\n */\n stopTool?: AgentBuilder.Callables;\n\n /**\n * Property to extract from the stop tool's result.\n * Required when stopTool is set.\n * The extracted value is used to determine the conversation outcome.\n */\n stopToolResponseProperty?: string;\n\n /**\n * Maximum turns for this side before forcing a stop.\n * Safety limit to prevent runaway conversations.\n * A turn is one complete request/response cycle.\n */\n maxTurns?: number;\n\n /**\n * Tool that ends the entire conversation when called.\n * Different from stopTool - this ends the conversation for both sides,\n * not just this side's turn.\n */\n endConversationTool?: AgentBuilder.Callables;\n\n /**\n * Enable manual stop condition handling via hooks.\n * When true, stop conditions are evaluated by custom hook logic\n * instead of the built-in rules.\n * @default false\n */\n manualStopCondition?: boolean;\n}\n\n/**\n * Agent definition configuration.\n *\n * @template N - The agent name as a string literal type\n *\n * @example\n * ```typescript\n * import { defineAgent } from '@standardagents/builder';\n *\n * export default defineAgent({\n * name: 'support_agent',\n * title: 'Customer Support Agent',\n * type: 'ai_human',\n * sideA: {\n * label: 'Support',\n * prompt: 'customer_support',\n * stopOnResponse: true,\n * },\n * tags: ['support', 'tier-1'],\n * });\n * ```\n */\nexport interface AgentDefinition<N extends string = string> {\n /**\n * Unique name for this agent.\n * Used as the identifier for thread creation and handoffs.\n * Should be snake_case (e.g., 'support_agent', 'research_flow').\n */\n name: N;\n\n /**\n * Human-readable title for the agent.\n * Optional - if not provided, the name will be used.\n * @deprecated Use name instead. Title will be removed in a future version.\n */\n title?: string;\n\n /**\n * Agent conversation type.\n *\n * - `ai_human`: AI conversing with a human user (default)\n * - `dual_ai`: Two AI participants conversing\n *\n * @default 'ai_human'\n */\n type?: AgentType;\n\n /**\n * Maximum total turns across both sides.\n * Only applies to `dual_ai` agents.\n * Prevents infinite loops in AI-to-AI conversations.\n */\n maxSessionTurns?: number;\n\n /**\n * Configuration for Side A.\n * For `ai_human`: This is the AI side.\n * For `dual_ai`: This is the first AI participant.\n */\n sideA: SideConfig;\n\n /**\n * Configuration for Side B.\n * For `ai_human`: Optional, the human side doesn't need config.\n * For `dual_ai`: Required, the second AI participant.\n */\n sideB?: SideConfig;\n\n /**\n * Expose this agent as a tool for other prompts.\n * Enables agent composition and handoffs.\n * When true, other prompts can invoke this agent as a tool.\n * @default false\n */\n exposeAsTool?: boolean;\n\n /**\n * Description shown when agent is used as a tool.\n * Required if exposeAsTool is true.\n * Should clearly describe what this agent does.\n */\n toolDescription?: string;\n\n /**\n * Tags for categorization and filtering.\n * Useful for organizing agents in the UI and filtering in queries.\n *\n * @example ['customer-service', 'tier-1', 'english']\n */\n tags?: string[];\n}\n\n/**\n * Defines an agent configuration.\n *\n * Agents orchestrate conversations between AI models, or between AI and\n * human users. They use prompts to configure each side of the conversation\n * and define stop conditions to control conversation flow.\n *\n * @template N - The agent name as a string literal type\n * @param options - Agent configuration options\n * @returns The agent definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/agents/support_agent.ts\n * import { defineAgent } from '@standardagents/builder';\n *\n * export default defineAgent({\n * name: 'support_agent',\n * title: 'Customer Support Agent',\n * type: 'ai_human',\n * sideA: {\n * label: 'Support',\n * prompt: 'customer_support',\n * stopOnResponse: true,\n * endConversationTool: 'close_ticket',\n * },\n * exposeAsTool: true,\n * toolDescription: 'Hand off to customer support',\n * tags: ['support', 'tier-1'],\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Dual AI agent (two AIs conversing)\n * export default defineAgent({\n * name: 'debate_agent',\n * title: 'AI Debate',\n * type: 'dual_ai',\n * maxSessionTurns: 10,\n * sideA: {\n * label: 'Pro',\n * prompt: 'debate_pro',\n * stopOnResponse: true,\n * },\n * sideB: {\n * label: 'Con',\n * prompt: 'debate_con',\n * stopOnResponse: true,\n * endConversationTool: 'conclude_debate',\n * },\n * });\n * ```\n */\nexport function defineAgent<N extends string>(\n options: AgentDefinition<N>\n): AgentDefinition<N> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Agent name is required');\n }\n if (!options.sideA) {\n throw new Error('Agent sideA configuration is required');\n }\n if (!options.sideA.prompt) {\n throw new Error('Agent sideA.prompt is required');\n }\n\n // Set default type\n const type = options.type ?? 'ai_human';\n\n // Validate dual_ai requires sideB\n if (type === 'dual_ai') {\n if (!options.sideB) {\n throw new Error('Agent sideB configuration is required for dual_ai type');\n }\n if (!options.sideB.prompt) {\n throw new Error('Agent sideB.prompt is required for dual_ai type');\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (options.exposeAsTool && !options.toolDescription) {\n throw new Error('toolDescription is required when exposeAsTool is true');\n }\n\n // Validate stopTool requires stopToolResponseProperty\n if (options.sideA.stopTool && !options.sideA.stopToolResponseProperty) {\n throw new Error('sideA.stopToolResponseProperty is required when sideA.stopTool is set');\n }\n if (options.sideB?.stopTool && !options.sideB.stopToolResponseProperty) {\n throw new Error('sideB.stopToolResponseProperty is required when sideB.stopTool is set');\n }\n\n // Validate maxTurns is positive\n if (options.sideA.maxTurns !== undefined && options.sideA.maxTurns <= 0) {\n throw new Error('sideA.maxTurns must be a positive number');\n }\n if (options.sideB?.maxTurns !== undefined && options.sideB.maxTurns <= 0) {\n throw new Error('sideB.maxTurns must be a positive number');\n }\n if (options.maxSessionTurns !== undefined && options.maxSessionTurns <= 0) {\n throw new Error('maxSessionTurns must be a positive number');\n }\n\n // Validate type is a known value\n if (!['ai_human', 'dual_ai'].includes(type)) {\n throw new Error(`Invalid type '${type}'. Must be one of: ai_human, dual_ai`);\n }\n\n return {\n ...options,\n type,\n };\n}\n","import type { FlowState, Message, ToolCall } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * import { queueTool } from '@standardagents/builder';\n *\n * queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\nexport function queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true\n };\n\n flow.sequence.queue.push(toolCall);\n}\n\n/**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * import { injectMessage } from '@standardagents/builder';\n *\n * // Append a system message\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\nexport async function injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n forceTurn(flow, options.forceTurn);\n }\n\n return message;\n}\n\n/**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * import { getMessages } from '@standardagents/builder';\n *\n * // Get last 10 messages\n * const messages = await getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await getMessages(flow, 10, 0, \"desc\");\n * ```\n */\nexport async function getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth\n FROM messages\n ORDER BY created_at ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n });\n }\n\n return messages;\n}\n\n/**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * import { injectMessage, reloadHistory } from '@standardagents/builder';\n *\n * // Reload history after injecting a silent message\n * await injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await reloadHistory(flow);\n * ```\n */\nexport async function reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n}\n\n/**\n * Emit a custom event to WebSocket clients via the stream\n *\n * Sends a custom event to all connected WebSocket clients on the stream channel.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard message events.\n *\n * @param flow - The current FlowState\n * @param type - The event type name (e.g., \"progress\", \"notification\")\n * @param data - The event payload (any serializable data)\n *\n * @example\n * ```typescript\n * import { emitThreadEvent } from '@standardagents/builder';\n *\n * // Emit a progress update\n * emitThreadEvent(flow, \"progress\", { step: 3, total: 10, message: \"Processing data...\" });\n *\n * // Emit a custom notification\n * emitThreadEvent(flow, \"notification\", { level: \"info\", message: \"User authenticated\" });\n *\n * // Emit metadata\n * emitThreadEvent(flow, \"metadata\", { userId: \"123\", sessionId: \"abc\" });\n * ```\n */\nexport function emitThreadEvent(\n flow: FlowState,\n type: string,\n data: unknown\n): void {\n if (!flow.emitEvent) {\n console.warn(\"Cannot emit event: emitEvent callback is not available\");\n return;\n }\n\n // Send event via the callback to DurableThread\n flow.emitEvent(type, data);\n}\n\n/**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * import { queueTool, forceTurn } from '@standardagents/builder';\n *\n * queueTool(flow, 'myTool', {});\n * forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * import { forceTurn } from '@standardagents/builder';\n *\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\nexport function forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n}\n\n/**\n * Thread context from defineThreadEndpoint\n */\ninterface ThreadContext {\n instance: {\n updateThreadMeta: (\n threadId: string,\n params: { agent_name?: string; user_id?: string | null; tags?: string[] | null }\n ) => Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n };\n metadata: {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n };\n}\n\n/**\n * Update a thread's metadata in the DurableAgentBuilder registry\n *\n * This allows updating the agent_name, user_id, and tags for an existing thread.\n * Uses the thread instance from defineThreadEndpoint context.\n *\n * @param thread - The thread context from defineThreadEndpoint ({ instance, metadata })\n * @param params - The fields to update (agent_name, user_id, tags)\n * @returns The updated thread info, or null if update failed\n *\n * @example\n * ```typescript\n * import { defineThreadEndpoint, updateThread } from '@standardagents/builder';\n *\n * export default defineThreadEndpoint(async (req, thread) => {\n * // Update thread's user_id\n * await updateThread(thread, { user_id: 'user-123' });\n *\n * // Update thread's tags\n * await updateThread(thread, { tags: ['support', 'urgent'] });\n *\n * // Update multiple fields\n * const result = await updateThread(thread, {\n * agent_name: 'new-agent',\n * user_id: 'user-456',\n * tags: ['sales']\n * });\n *\n * return Response.json(result);\n * });\n * ```\n */\nexport async function updateThread(\n thread: ThreadContext,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n): Promise<{\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n} | null> {\n const result = await thread.instance.updateThreadMeta(thread.metadata.id, params);\n if (!result.success || !result.thread) {\n return null;\n }\n return result.thread;\n}\n","import type { FlowState, Message, ToolCall } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Options for broadcasting custom data\n */\nexport interface BroadcastOptions {\n /** The type of the broadcast message */\n type: string;\n /** The value/payload of the broadcast message */\n value: unknown;\n}\n\n/**\n * FlowState SDK - Utility methods for working with FlowState\n *\n * These methods extend the FlowState object with helpful utilities for:\n * - Queuing tool calls\n * - Injecting messages\n * - Retrieving message history\n * - Broadcasting custom data via WebSocket\n */\nexport class FlowStateSdk {\n /**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * FlowStateSdk.queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\n static queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n ): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true\n };\n\n flow.sequence.queue.push(toolCall);\n }\n\n /**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * // Append a system message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\n static async injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n ): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n FlowStateSdk.forceTurn(flow, options.forceTurn);\n }\n\n return message;\n }\n\n /**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * // Get last 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await FlowStateSdk.getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10, 0, \"desc\");\n * ```\n */\n static async getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n ): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth\n FROM messages\n ORDER BY created_at ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n });\n }\n\n return messages;\n }\n\n /**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * // Reload history after injecting a silent message\n * await FlowStateSdk.injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n * ```\n */\n static async reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n }\n\n /**\n * Broadcast custom data to WebSocket clients\n *\n * Sends a custom message to all connected WebSocket clients.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard telemetry events.\n *\n * The message is sent with the structure: { type: string, value: unknown }\n *\n * @param flow - The current FlowState\n * @param options - Broadcast options\n *\n * @example\n * ```typescript\n * // Broadcast a progress update\n * FlowStateSdk.broadcast(flow, {\n * type: \"progress\",\n * value: { step: 3, total: 10, message: \"Processing data...\" }\n * });\n *\n * // Broadcast a custom notification\n * FlowStateSdk.broadcast(flow, {\n * type: \"notification\",\n * value: { level: \"info\", message: \"User authenticated successfully\" }\n * });\n *\n * // Broadcast metadata\n * FlowStateSdk.broadcast(flow, {\n * type: \"metadata\",\n * value: { userId: \"123\", sessionId: \"abc\", timestamp: Date.now() }\n * });\n * ```\n */\n static broadcast(flow: FlowState, options: BroadcastOptions): void {\n if (!flow.stream) {\n console.warn(\"Cannot broadcast: stream is not available\");\n return;\n }\n\n // Send custom message via WebSocket using the telemetry infrastructure\n // We send it as a special telemetry event with type \"custom\"\n const message = {\n type: \"custom\" as const,\n customType: options.type,\n value: options.value,\n timestamp: Date.now(),\n };\n\n // Use the existing WebSocket infrastructure\n const wsMessage = JSON.stringify(message);\n for (const ws of (flow.stream as any).wsConnections || []) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(wsMessage);\n }\n } catch (error) {\n console.error(\"Error broadcasting custom message:\", error);\n }\n }\n }\n\n /**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * FlowStateSdk.queueTool(flow, 'myTool', {});\n * FlowStateSdk.forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * FlowStateSdk.forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * FlowStateSdk.forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * FlowStateSdk.forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\n static forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n }\n}\n\n/**\n * Convenience methods added to FlowState (optional - can be used via static methods above)\n *\n * These are helper methods that can be added to FlowState instances for convenience.\n * They delegate to the static methods above.\n */\nexport interface FlowStateWithSdk extends FlowState {\n queueTool: (toolName: string, args?: Record<string, unknown>) => void;\n injectMessage: (options: InjectMessageOptions) => Promise<Message>;\n getMessages: (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => Promise<Message[]>;\n reloadHistory: () => Promise<Message[]>;\n broadcast: (options: BroadcastOptions) => void;\n forceTurn: (side: 'side_a' | 'side_b') => void;\n}\n\n/**\n * Enhance a FlowState object with SDK methods\n *\n * This adds convenience methods to a FlowState instance that delegate to\n * the static FlowStateSdk methods.\n *\n * @param flow - The FlowState to enhance\n * @returns The enhanced FlowState with SDK methods\n *\n * @example\n * ```typescript\n * const enhancedFlow = enhanceFlowState(flow);\n *\n * // Now you can use methods directly on the flow object\n * enhancedFlow.queueTool(\"search_user\", { email: \"user@example.com\" });\n * await enhancedFlow.injectMessage({ role: \"system\", content: \"Context updated\" });\n * const messages = await enhancedFlow.getMessages(10);\n * flow.messageHistory = await enhancedFlow.reloadHistory();\n * enhancedFlow.broadcast({ type: \"progress\", value: { step: 1 } });\n * enhancedFlow.forceTurn('side_b'); // Force side_b to play next turn\n * ```\n */\nexport function enhanceFlowState(flow: FlowState): FlowStateWithSdk {\n const enhanced = flow as FlowStateWithSdk;\n\n enhanced.queueTool = (toolName: string, args?: Record<string, unknown>) => {\n FlowStateSdk.queueTool(flow, toolName, args);\n };\n\n enhanced.injectMessage = (options: InjectMessageOptions) => {\n return FlowStateSdk.injectMessage(flow, options);\n };\n\n enhanced.getMessages = (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => {\n return FlowStateSdk.getMessages(flow, limit, offset, order);\n };\n\n enhanced.reloadHistory = () => {\n return FlowStateSdk.reloadHistory(flow);\n };\n\n enhanced.broadcast = (options: BroadcastOptions) => {\n FlowStateSdk.broadcast(flow, options);\n };\n\n enhanced.forceTurn = (side: 'side_a' | 'side_b') => {\n FlowStateSdk.forceTurn(flow, side);\n };\n\n return enhanced;\n}\n","/**\n * GitHub REST API client for committing file changes.\n *\n * This client is used in production to commit configuration changes\n * (prompts, models, agents) to the repository via GitHub's REST API.\n *\n * The flow for creating a commit:\n * 1. Get the current branch ref to find HEAD commit SHA\n * 2. Get the tree SHA from the HEAD commit\n * 3. Create blobs for each file to be added/modified\n * 4. Create a new tree with the file changes\n * 5. Create a commit pointing to the new tree\n * 6. Update the branch ref to point to the new commit\n */\n\nimport type {\n GitHubConfig,\n GitHubFileChange,\n GitHubCommitResult,\n GitHubRef,\n GitHubTree,\n GitHubBlob,\n GitHubCommit,\n} from './types.js';\n\nconst GITHUB_API_BASE = 'https://api.github.com';\n\nexport class GitHubClient {\n private config: GitHubConfig;\n\n constructor(config: GitHubConfig) {\n this.config = config;\n }\n\n /**\n * Create a GitHubClient from environment variables.\n * Returns null if required env vars are missing.\n */\n static fromEnv(env: {\n GITHUB_TOKEN?: string;\n GITHUB_REPO?: string;\n GITHUB_BRANCH?: string;\n }): GitHubClient | null {\n const token = env.GITHUB_TOKEN;\n const repo = env.GITHUB_REPO;\n const branch = env.GITHUB_BRANCH || 'main';\n\n if (!token || !repo) {\n return null;\n }\n\n // Parse owner/repo from GITHUB_REPO\n const parts = repo.split('/');\n if (parts.length !== 2) {\n console.error('GITHUB_REPO must be in format \"owner/repo\"');\n return null;\n }\n\n return new GitHubClient({\n token,\n owner: parts[0],\n repo: parts[1],\n branch,\n });\n }\n\n /**\n * Check if GitHub integration is properly configured.\n */\n isConfigured(): boolean {\n return !!(\n this.config.token &&\n this.config.owner &&\n this.config.repo &&\n this.config.branch\n );\n }\n\n /**\n * Make an authenticated request to GitHub API.\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${GITHUB_API_BASE}${path}`;\n\n const response = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.config.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n 'User-Agent': 'AgentBuilder/1.0',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: 'Unknown error' })) as { message?: string };\n throw new GitHubApiError(\n errorData.message || `GitHub API error: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n return response.json();\n }\n\n /**\n * Get the current branch reference.\n */\n async getBranchRef(): Promise<GitHubRef> {\n return this.request<GitHubRef>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/ref/heads/${this.config.branch}`\n );\n }\n\n /**\n * Get a commit by SHA.\n */\n async getCommit(sha: string): Promise<GitHubCommit> {\n return this.request<GitHubCommit>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/commits/${sha}`\n );\n }\n\n /**\n * Get a tree by SHA.\n */\n async getTree(sha: string): Promise<GitHubTree> {\n return this.request<GitHubTree>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees/${sha}`\n );\n }\n\n /**\n * Create a blob (file content).\n */\n async createBlob(content: string): Promise<GitHubBlob> {\n return this.request<GitHubBlob>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/blobs`,\n {\n content: btoa(content), // Base64 encode\n encoding: 'base64',\n }\n );\n }\n\n /**\n * Create a tree with file changes.\n */\n async createTree(\n baseTreeSha: string,\n files: Array<{ path: string; sha: string; mode: string }>\n ): Promise<GitHubTree> {\n return this.request<GitHubTree>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees`,\n {\n base_tree: baseTreeSha,\n tree: files.map((f) => ({\n path: f.path,\n mode: f.mode,\n type: 'blob',\n sha: f.sha,\n })),\n }\n );\n }\n\n /**\n * Create a commit.\n */\n async createCommit(\n message: string,\n treeSha: string,\n parentSha: string\n ): Promise<GitHubCommit> {\n return this.request<GitHubCommit>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/commits`,\n {\n message,\n tree: treeSha,\n parents: [parentSha],\n }\n );\n }\n\n /**\n * Update a branch reference to point to a new commit.\n */\n async updateRef(sha: string): Promise<GitHubRef> {\n return this.request<GitHubRef>(\n 'PATCH',\n `/repos/${this.config.owner}/${this.config.repo}/git/refs/heads/${this.config.branch}`,\n {\n sha,\n force: false,\n }\n );\n }\n\n /**\n * Commit multiple file changes atomically.\n *\n * @param message - Commit message\n * @param files - Array of files to add/modify\n * @returns The commit result with SHA\n */\n async commitFiles(\n message: string,\n files: GitHubFileChange[]\n ): Promise<GitHubCommitResult> {\n if (files.length === 0) {\n throw new Error('No files to commit');\n }\n\n // Step 1: Get current branch ref\n const branchRef = await this.getBranchRef();\n const headSha = branchRef.object.sha;\n\n // Step 2: Get the commit to find tree SHA\n const headCommit = await this.getCommit(headSha);\n const baseTreeSha = headCommit.tree.sha;\n\n // Step 3: Create blobs for each file\n const blobPromises = files.map(async (file) => {\n const blob = await this.createBlob(file.content);\n return {\n path: file.path,\n sha: blob.sha,\n mode: file.mode || '100644',\n };\n });\n const blobs = await Promise.all(blobPromises);\n\n // Step 4: Create new tree with changes\n const newTree = await this.createTree(baseTreeSha, blobs);\n\n // Step 5: Create commit\n const commit = await this.createCommit(message, newTree.sha, headSha);\n\n // Step 6: Update branch ref\n await this.updateRef(commit.sha);\n\n return {\n sha: commit.sha,\n url: commit.html_url,\n message: commit.message,\n };\n }\n\n /**\n * Delete files from the repository.\n *\n * @param message - Commit message\n * @param paths - Array of file paths to delete\n * @returns The commit result with SHA\n */\n async deleteFiles(\n message: string,\n paths: string[]\n ): Promise<GitHubCommitResult> {\n if (paths.length === 0) {\n throw new Error('No files to delete');\n }\n\n // Step 1: Get current branch ref\n const branchRef = await this.getBranchRef();\n const headSha = branchRef.object.sha;\n\n // Step 2: Get the commit to find tree SHA\n const headCommit = await this.getCommit(headSha);\n const baseTreeSha = headCommit.tree.sha;\n\n // Step 3: Create tree with deletions (sha: null removes the file)\n const tree = paths.map((path) => ({\n path,\n mode: '100644' as const,\n type: 'blob' as const,\n sha: null,\n }));\n\n const newTree = await this.request<GitHubTree>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees`,\n {\n base_tree: baseTreeSha,\n tree,\n }\n );\n\n // Step 4: Create commit\n const commit = await this.createCommit(message, newTree.sha, headSha);\n\n // Step 5: Update branch ref\n await this.updateRef(commit.sha);\n\n return {\n sha: commit.sha,\n url: commit.html_url,\n message: commit.message,\n };\n }\n\n /**\n * Get the current HEAD commit SHA.\n */\n async getHeadSha(): Promise<string> {\n const ref = await this.getBranchRef();\n return ref.object.sha;\n }\n}\n\n/**\n * Custom error for GitHub API errors.\n */\nexport class GitHubApiError extends Error {\n status: number;\n details: unknown;\n\n constructor(message: string, status: number, details?: unknown) {\n super(message);\n this.name = 'GitHubApiError';\n this.status = status;\n this.details = details;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/agents/types.ts","../src/agents/StreamManager.ts","../src/agents/providers/types.ts","../src/agents/providers/BaseProvider.ts","../src/agents/providers/OpenAIProvider.ts","../src/agents/providers/OpenRouterProvider.ts","../src/agents/providers/ProviderRegistry.ts","../src/agents/providers/index.ts","../src/agents/LLMRequest.ts","../src/agents/ToolExecutor.ts","../src/agents/FlowEngine.ts","../src/sdk/generateTypes.ts","../src/sdk/generators/generateModelFile.ts","../src/sdk/generators/jsonSchemaToZod.ts","../src/sdk/generators/generatePromptFile.ts","../src/sdk/generators/generateAgentFile.ts","../src/sdk/persistence/index.ts","../src/plugin.ts","../src/router/index.ts","../src/utils/auth.ts","../src/middleware/auth.ts","../src/tools/index.ts","../src/agents/defineHook.ts","../src/durable-objects/migrations/001_initial.ts","../src/durable-objects/migrations/002_add_prompt_and_tools_to_logs.ts","../src/durable-objects/migrations/003_add_log_context_and_parent.ts","../src/durable-objects/migrations/004_add_reasoning_tokens.ts","../src/durable-objects/migrations/005_add_reasoning_content.ts","../src/durable-objects/migrations/006_add_log_id_to_messages.ts","../src/durable-objects/migrations/007_add_errors_and_retry_tracking.ts","../src/durable-objects/migrations/008_add_tool_results.ts","../src/durable-objects/migrations/009_add_request_response_timestamps.ts","../src/durable-objects/migrations/010_add_alarm_queue.ts","../src/durable-objects/migrations/011_add_silent_messages.ts","../src/durable-objects/migrations/012_remove_message_history.ts","../src/durable-objects/migrations/013_add_tool_status.ts","../src/durable-objects/migrations/014_add_parent_id_and_depth.ts","../src/durable-objects/migrations/015_add_reasoning_to_messages.ts","../src/durable-objects/migrations/016_add_reasoning_details.ts","../src/durable-objects/migrations/index.ts","../src/durable-objects/DurableThread.ts","../src/durable-objects/utils/AlarmQueue.ts","../src/durable-objects/agentbuilder-migrations/0001_initial.ts","../src/durable-objects/agentbuilder-migrations/index.ts","../src/durable-objects/DurableAgentBuilder.ts","../src/sdk/defineModel.ts","../src/sdk/definePrompt.ts","../src/sdk/defineAgent.ts","../src/agents/utilities.ts","../src/agents/FlowStateSdk.ts","../src/github/GitHubClient.ts"],"names":["init_types","error","ProviderRegistry","result","FlowEngine","path","text","toolCalls","fs","escapeString","options","migration","data","message","messageId","migrations","LATEST_SCHEMA_VERSION","DurableObject"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { StreamManager } from \"./StreamManager\";\nimport type { z } from \"zod\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { defineTool } from \"../tools\";\nimport type { HookSignatures } from \"./defineHook\";\n\n/**\n * Agent configuration from D1 agents table\n */\nexport interface Agent {\n id: string;\n title: string;\n type: \"dual_ai\" | \"ai_human\";\n created_at: number;\n\n // Global configuration\n max_session_turns: number | null; // Total back-and-forth exchanges allowed (dual_ai only)\n\n // Side A configuration\n side_a_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_a_agent_prompt: string | null;\n side_a_stop_on_response: boolean;\n side_a_stop_tool: string | null;\n side_a_stop_tool_response_property: string | null;\n side_a_max_turns: number | null; // Per-side safety limit\n side_a_end_conversation_tool: string | null;\n\n // Side B configuration (null for ai_human type)\n side_b_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_b_agent_prompt: string | null;\n side_b_stop_on_response: boolean;\n side_b_stop_tool: string | null;\n side_b_stop_tool_response_property: string | null;\n side_b_max_turns: number | null; // Per-side safety limit\n side_b_end_conversation_tool: string | null;\n}\n\n/**\n * Message in OpenAI chat completion format\n */\nexport interface Message {\n id: string;\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n name?: string | null;\n tool_calls?: string | null; // JSON array of tool calls\n tool_call_id?: string | null;\n log_id?: string | null; // Log that produced this message\n created_at: number; // Microseconds since epoch\n\n // Request/Response timing\n request_sent_at?: number | null; // Microseconds - when LLM request was sent\n response_completed_at?: number | null; // Microseconds - when response was fully received\n status?: \"pending\" | \"completed\" | \"failed\"; // Message status\n silent?: boolean; // Whether this message is hidden from the LLM (UI-only)\n tool_status?: \"success\" | \"error\" | null; // Status of tool execution (for role='tool' messages only)\n\n // Reasoning content from models like o1 (stored for message history inclusion)\n reasoning_content?: string | null;\n\n // Reasoning details from OpenRouter (structured reasoning blocks)\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n // Contains array of reasoning detail objects (summary, encrypted, or text types)\n // Must be preserved exactly as returned for proper multi-turn reasoning continuity\n reasoning_details?: string | null; // JSON array of reasoning detail objects\n\n // Hierarchical tracking for sub-prompts\n parent_id?: string | null; // Parent message ID for sub-prompt messages (NULL for top-level)\n depth?: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n}\n\n/**\n * Tool call from OpenAI format\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n forceAllow?: boolean;\n}\n\n/**\n * Tool call detail stored in tool_calls table\n */\nexport interface ToolCallDetail {\n id: string;\n message_id: string;\n type: string;\n function_name: string;\n function_arguments: string;\n created_at: number;\n}\n\n/**\n * Thread metadata from DurableAgentBuilder\n * Note: agent_id is now the agent name (not UUID) since agents are in TypeScript\n */\nexport interface ThreadMetadata {\n id: string;\n agent_id: string; // Agent name from TypeScript config\n user_id: string | null;\n created_at: number;\n}\n\n/**\n * Hook registry type - transforms HookSignatures into lazy-loaded optional hooks\n */\nexport type HookRegistry = {\n [K in keyof HookSignatures]?: () => Promise<HookSignatures[K]>;\n};\n\n/**\n * Thread instance (forward reference to avoid circular dependency)\n */\nexport interface ThreadInstance {\n ctx: DurableObjectState;\n env: ThreadEnv;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{\n messages: Message[];\n total: number;\n hasMore: boolean;\n }>;\n getLogs(limit?: number, offset?: number, order?: \"asc\" | \"desc\"): Promise<LogData[]>;\n getThreadMeta(threadId: string): Promise<ThreadMetadata | null>;\n shouldStop(): Promise<boolean>; // Check if execution should be stopped (async - reads from SQLite)\n tools(): Record<string, () => Promise<ReturnType<typeof defineTool>>>;\n hooks(): HookRegistry;\n}\n\n/**\n * Tool call for internal flow management\n */\nexport type FlowToolCall = { tool: string; args: Record<string, unknown> };\n\n/**\n * Prompt call for internal flow management\n */\nexport type FlowPromptCall = { prompt: string; args: Record<string, unknown> };\n\n/**\n * Flow call (tool or prompt)\n */\nexport type FlowCall = FlowToolCall | FlowPromptCall;\n\n/**\n * Flow call with retry tracking\n */\nexport type FlowCallWithRetries = FlowCall & {\n retries: number;\n reasons: string[];\n};\n\n/**\n * Tool configuration for a prompt - defines options for when a tool is used\n */\nexport interface ToolConfig {\n name: string;\n initUserMessageProperty?: string; // Property to use as initial user message when tool is called\n includeTextResponse?: boolean; // Include LLM text response in tool result (default: true)\n includeToolCalls?: boolean; // Include tool call summaries in result (default: true)\n includeErrors?: boolean; // Include error details in result (default: true)\n}\n\n/**\n * Prompt configuration - now loaded from TypeScript virtual modules\n */\nexport interface PromptData {\n id: string;\n name: string;\n prompt: string | any[]; // Plain text prompt OR structured array of prompt parts\n system_prompt?: string; // System prompt text (alias for prompt)\n model: string; // Model name (was model_id with UUID)\n model_id?: string; // Deprecated: legacy model UUID\n tool_description: string;\n required_schema: string; // JSON schema (legacy)\n include_chat: boolean;\n include_past_tools: boolean;\n before_tool: string | null;\n after_tool: string | null;\n prompts: string; // JSON array (legacy)\n created_at: number;\n /** @deprecated All prompts are now automatically exposed as tools */\n expose_as_tool?: boolean;\n parallel_tool_calls: boolean;\n tool_choice: \"auto\" | \"none\" | \"required\" | \"function\";\n reasoning_effort: \"low\" | \"medium\" | \"high\" | null;\n reasoning_max_tokens: number | null;\n reasoning_exclude: boolean;\n include_reasoning: boolean;\n\n // New fields from TypeScript config\n _tools?: (string | ToolConfig)[]; // Tool names or configs from definePrompt\n _handoffAgents?: string[]; // Agent names that can be handed off to\n _requiredSchema?: any; // Zod schema for validation (replaces JSON schema)\n}\n\n/**\n * Central state object that flows through execution\n */\nexport interface FlowState {\n // Identity\n threadId: string;\n flowId: string;\n\n // Thread reference\n thread: {\n instance: ThreadInstance; // Reference to the DurableThread instance\n metadata: ThreadMetadata; // Thread metadata from D1\n };\n\n // Configuration\n agentConfig: Agent;\n currentSide: \"a\" | \"b\";\n\n // Prompt configuration (loaded once per execution)\n prompts: {\n sideA: PromptData;\n sideB: PromptData | null; // null for ai_human agents\n };\n prompt: PromptData; // Current active prompt (switches with side)\n\n // Execution tracking\n turnCount: number;\n sideATurnCount: number; // Per-side turn count for max_turns safety limit\n sideBTurnCount: number; // Per-side turn count for max_turns safety limit\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n forcedNextSide?: \"side_a\" | \"side_b\"; // Force a specific side to play next turn\n pendingForceTurn?: \"side_a\" | \"side_b\"; // Deferred force turn (applied after tool queue completes)\n abortController?: AbortController; // For user-initiated stop\n\n // Message context\n messageHistory: Message[];\n /**\n * Appends these messages\n */\n extraMessages: Message[];\n\n // Tool execution queue\n sequence: {\n queue: ToolCall[];\n isHandling: boolean;\n };\n\n // Tool execution state (for individual tool calls)\n active: FlowCallWithRetries; // Current tool/prompt being executed\n queue: FlowCall[]; // Queue of pending tool/prompt calls\n\n // Agent handoff tracking\n pendingHandoff?: {\n agentId: string;\n };\n\n // Streaming & telemetry\n stream: StreamManager;\n\n // Runtime context\n context: Record<string, unknown>;\n retryCount: number;\n retryReason?: string;\n\n // Storage\n storage: DurableObjectStorage;\n env: ThreadEnv;\n\n // Real-time broadcasting callbacks (for nested flows)\n emitLog?: (log: unknown) => void;\n emitMessage?: (message: unknown) => void;\n emitMessageChunk?: (messageId: string, chunk: string, depth?: number) => void;\n emitTelemetry?: (event: TelemetryEvent) => void;\n emitEvent?: (type: string, data: unknown) => void;\n\n // Hierarchical tracking\n rootState: FlowState // The root flow state object\n rootMessageId?: string | null; // Root message ID for FK relationships\n parentLogId?: string | null; // Parent log ID for nested prompts\n currentLogId?: string | null; // Current LLM request's log ID\n parentMessageId?: string; // Parent message ID for sub-prompts (used to determine one-shot behavior)\n depth: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n\n // Behavior flags\n pendingMessageId?: string; // Message currently being streamed\n\n // Tool restrictions\n allowedTools?: ToolDefinition[]; // Tools allowed for current prompt\n}\n\n/**\n * Request context for LLM calls\n */\nexport interface RequestContext {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n }>;\n model: string;\n tools?: ToolDefinition[]; // Available tools for this request\n stream?: boolean;\n promptName?: string; // Name of the prompt being executed (if any)\n systemPrompt?: string; // The actual system prompt text\n parentLogId?: string | null; // Parent log ID if this is a nested prompt call\n parallel_tool_calls?: boolean; // Allow parallel tool execution\n tool_choice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } }; // Tool calling strategy\n reasoning?: {\n effort?: \"low\" | \"medium\" | \"high\"; // Reasoning effort level (for OpenAI o-series, Grok)\n max_tokens?: number; // Max reasoning tokens (for Anthropic, Gemini, Qwen)\n exclude?: boolean; // Use reasoning internally but don't return it\n };\n}\n\n/**\n * Tool definition for LLM requests\n */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, any>; // JSON Schema format\n };\n}\n\n/**\n * LLM response\n */\nexport interface LLMResponse {\n id: string;\n model: string;\n content: string | null;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed as regular content)\n reasoning_details?: any[]; // OpenRouter structured reasoning blocks (summary, encrypted, text types)\n tool_calls?: ToolCall[];\n finish_reason: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n // @ts-ignore - OpenRouter non-standard cost field\n cost?: number;\n // @ts-ignore - OpenRouter non-standard provider field (actual provider that handled request)\n provider?: string;\n };\n}\n\n/**\n * LLM response with associated log ID\n * The logId allows tracking which log entry corresponds to this LLM request\n * Useful for linking tool execution errors back to the parent LLM request\n */\nexport interface LLMResponseWithLog {\n response: LLMResponse;\n logId: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n retryPrompt?: string;\n}\n\n/**\n * Tool result\n */\nexport interface ToolResult {\n status: \"success\" | \"error\";\n /**\n * Flattened text representation of the tool output.\n *\n * For tools that return structured MCP-style content (an array of\n * content parts), this will be derived by concatenating all text\n * parts. For legacy tools that returned a plain string `result`,\n * that value is used directly.\n */\n result?: string;\n error?: string;\n stack?: string; // Stack trace for errors\n}\n\n/**\n * Flow execution result\n */\nexport interface FlowResult {\n messages: Message[];\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n turnCount: number;\n stream: ReadableStream<Uint8Array>; // HTTP stream for content\n}\n\n/**\n * Log emitter callback for DurableObject real-time updates\n */\nexport type EmitLog = (log: Partial<LogData> & { id: string }) => void;\n\n/**\n * Model fallback from D1\n */\nexport interface ModelFallback {\n parent_model_id: string;\n fallback_model_id: string;\n idx: number;\n}\n\n/**\n * Telemetry event types\n */\nexport type TelemetryEvent =\n | { type: \"turn_started\"; turn: number; side: \"a\" | \"b\"; timestamp: number }\n | { type: \"turn_completed\"; turn: number; stopped: boolean; timestamp: number }\n | { type: \"llm_request\"; model: string; attempt: number; timestamp: number }\n | {\n type: \"llm_response\";\n tokens: number;\n latency: number;\n timestamp: number;\n }\n | { type: \"validation_failed\"; error: string; timestamp: number }\n | {\n type: \"fallback_triggered\";\n from: string;\n to: string;\n timestamp: number;\n }\n | { type: \"tool_started\"; tool: string; timestamp: number }\n | {\n type: \"tool_completed\";\n tool: string;\n status: string;\n timestamp: number;\n }\n | {\n type: \"stopped\";\n reason: string;\n side: \"a\" | \"b\";\n timestamp: number;\n }\n | {\n type: \"stopped_by_user\";\n timestamp: number;\n };\n\n/**\n * Log data for telemetry table\n */\nexport interface LogData {\n id: string;\n message_id: string;\n\n // Request details\n provider: string;\n model: string;\n model_name?: string; // Human-readable model name\n endpoint?: string;\n request_body?: string;\n request_headers?: string;\n\n // Response details\n response_body?: string;\n response_headers?: string;\n status_code?: number;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed)\n\n // Token usage\n input_tokens?: number;\n cached_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n total_tokens?: number;\n\n // Performance metrics\n latency_ms?: number;\n time_to_first_token_ms?: number;\n\n // Result metadata\n finish_reason?: string;\n error?: string;\n error_type?: string;\n\n // Cost tracking\n cost_input?: number;\n cost_output?: number;\n cost_total?: number;\n\n // Context\n message_history_length?: number;\n tools_available?: number;\n prompt_name?: string;\n tools_called?: string;\n\n // Enhanced context (migration 003)\n parent_log_id?: string | null; // Parent log ID for prompt chains\n tools_schema?: string | null; // JSON schema of tools available\n message_history?: string | null; // Snapshot of message history\n system_prompt?: string | null; // System prompt sent with request\n is_complete?: boolean; // Whether log has all data\n\n // Error and retry tracking (migration 007)\n errors?: string | null; // JSON array of errors [{message, type, timestamp}]\n retry_of_log_id?: string | null; // Log ID this is a retry of\n\n created_at: number;\n}\n\n/**\n * Tool type identifier\n */\nexport type ToolType = \"native\" | \"prompt\" | \"agent\";\n\n/**\n * Constants\n */\nexport const MAX_TURNS = 250;\nexport const MAX_RETRIES_PER_MODEL = 2;\nexport const TIMESTAMP_MULTIPLIER = 1000; // Convert ms to microseconds\nexport const STREAM_COOLDOWN = 200; // ms\nexport const BACKOFF_BASE = 1000; // ms\n","import { STREAM_COOLDOWN } from \"./types\";\n\n/**\n * Callback function to execute before stream closes\n */\nexport type BeforeClose = () => Promise<void> | void;\n\n/**\n * Stream channel\n */\ninterface Channel {\n id: number;\n label: string;\n active: boolean;\n}\n\n/**\n * Manages HTTP streaming of content chunks.\n * WebSocket telemetry is handled separately by DurableThread.\n * Inspired by bod.coach MultiplexedStream pattern.\n */\nexport class StreamManager {\n /**\n * HTTP ReadableStream controller for content\n */\n private httpController?: ReadableStreamDefaultController<Uint8Array>;\n\n /**\n * HTTP ReadableStream for content chunks\n */\n public httpStream: ReadableStream<Uint8Array>;\n\n /**\n * Active channels\n */\n public activeChannels: number = 0;\n\n /**\n * Before close hooks\n */\n private beforeCloseHooks: BeforeClose[] = [];\n\n /**\n * Prevent automatic close\n */\n public preventClose: boolean = false;\n\n /**\n * Text encoder for streams\n */\n private encoder: TextEncoder;\n\n /**\n * Promise that resolves when stream is completely finished\n */\n public then: Promise<void>;\n\n /**\n * Resolver for the then promise\n */\n private resolver: () => void = () => {};\n\n /**\n * Whether the stream has been closed\n */\n private closed: boolean = false;\n\n constructor(beforeClose: BeforeClose | BeforeClose[] = []) {\n this.encoder = new TextEncoder();\n\n // Create HTTP stream\n this.httpStream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n this.httpController = controller;\n },\n });\n\n // Setup before close hooks\n this.beforeCloseHooks = Array.isArray(beforeClose)\n ? beforeClose\n : [beforeClose];\n\n // Create promise for stream completion\n this.then = new Promise((resolve) => {\n this.resolver = resolve;\n });\n }\n\n /**\n * Send content chunk to HTTP stream\n */\n sendContent(chunk: string): void {\n if (!this.httpController || this.closed) {\n console.warn(\"Cannot send content: stream is closed or not initialized\");\n return;\n }\n\n try {\n this.httpController.enqueue(this.encoder.encode(chunk));\n } catch (error) {\n console.error(\"Error sending content chunk:\", error);\n }\n }\n\n /**\n * Add a before close hook\n */\n addBeforeClose(hook: BeforeClose | BeforeClose[]): void {\n this.beforeCloseHooks.push(...(Array.isArray(hook) ? hook : [hook]));\n }\n\n /**\n * Wait for a callback to complete before allowing stream to close\n */\n async waitFor(callback: () => Promise<void> | void): Promise<void> {\n this.activeChannels++;\n\n try {\n await callback();\n } catch (error) {\n console.error(\"Error in waitFor callback:\", error);\n throw error;\n } finally {\n this.closeChannel();\n }\n }\n\n /**\n * Close a channel (decrement active channel count)\n */\n closeChannel(): void {\n this.activeChannels--;\n\n if (this.activeChannels <= 0 && !this.preventClose && !this.closed) {\n // Small delay to allow any final operations\n setTimeout(async () => {\n if (this.activeChannels <= 0 && !this.closed) {\n await this.close();\n }\n }, STREAM_COOLDOWN);\n }\n }\n\n /**\n * Close all streams and connections\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n try {\n // Run before close hooks\n await Promise.all(\n this.beforeCloseHooks.map(async (hook) => {\n try {\n await hook();\n } catch (error) {\n console.error(\"Error in beforeClose hook:\", error);\n }\n })\n );\n\n // Close HTTP stream\n if (this.httpController) {\n try {\n this.httpController.close();\n } catch (error) {\n console.error(\"Error closing HTTP stream:\", error);\n }\n }\n\n // Resolve the completion promise\n this.resolver();\n } catch (error) {\n console.error(\"Error during stream close:\", error);\n this.resolver();\n }\n }\n\n /**\n * Force close the stream immediately\n */\n forceClose(): void {\n this.preventClose = false;\n this.activeChannels = 0;\n this.close();\n }\n}\n","import type { FlowState, ToolDefinition, LLMResponse, RequestContext } from \"../types\";\n\n/**\n * Provider configuration from database\n */\nexport interface ProviderConfig {\n name: string;\n sdk: string; // 'openai', 'anthropic', 'openrouter', 'custom'\n api_key: string;\n}\n\n/**\n * Model configuration from database\n */\nexport interface ModelConfig {\n id: string;\n name: string;\n provider_id: string;\n included_providers: string; // JSON array\n input_price: number | null;\n output_price: number | null;\n cached_price: number | null;\n}\n\n/**\n * Base interface that all providers must implement\n */\nexport interface LLMProvider {\n /**\n * Provider identifier (e.g., 'openai', 'openrouter', 'anthropic')\n */\n readonly name: string;\n\n /**\n * Make a chat completion request to the provider\n *\n * @param modelId - The model identifier\n * @param context - Request context with messages and tools\n * @param state - Current flow state for streaming\n * @param logId - Log ID for updating request body before API call\n * @param signal - Optional abort signal for cancelling in-flight requests\n * @param modelConfig - Optional model configuration with provider routing options\n * @returns LLM response with content, tool calls, and usage\n */\n chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n /**\n * Test if this provider can handle a given model\n *\n * @param modelId - The model identifier\n * @returns true if this provider supports the model\n */\n supportsModel(modelId: string): boolean;\n}\n\n/**\n * Factory function type for creating provider instances\n */\nexport type ProviderFactory = (config: ProviderConfig) => LLMProvider;\n\n/**\n * Registry of available providers\n */\nexport interface ProviderRegistry {\n /**\n * Register a new provider factory\n */\n register(sdk: string, factory: ProviderFactory): void;\n\n /**\n * Get a provider instance for a model\n * @param modelName - The model name (from TypeScript config or D1)\n * @param env - Environment bindings\n * @param thread - Optional thread instance for loading model from virtual modules\n */\n getProvider(\n modelName: string,\n env: Env,\n thread?: import(\"../types\").ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>;\n\n /**\n * Check if a provider is registered\n */\n hasProvider(sdk: string): boolean;\n}\n","import type { LLMProvider, ProviderConfig, ModelConfig } from \"./types\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\n\n/**\n * Base class for LLM providers with common functionality\n */\nexport abstract class BaseProvider implements LLMProvider {\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n }\n\n abstract get name(): string;\n\n abstract chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n abstract supportsModel(modelId: string): boolean;\n\n /**\n * Helper: Stream content chunks to the client\n */\n protected streamContent(chunk: string, state: FlowState): void {\n if (chunk) {\n state.stream.sendContent(chunk);\n }\n }\n\n /**\n * Helper: Broadcast content chunk via WebSocket for real-time UI updates\n * Does NOT write to database - only broadcasts to connected clients\n */\n protected streamContentChunk(chunk: string, state: FlowState): void {\n if (!chunk) return;\n\n const emitMessageChunk = (state as any).emitMessageChunk as\n ((messageId: string, chunk: string) => void) | undefined;\n const pendingMessageId = (state as any).pendingMessageId as string | undefined;\n\n if (emitMessageChunk && pendingMessageId) {\n emitMessageChunk(pendingMessageId, chunk);\n }\n }\n\n /**\n * Helper: Accumulate tool call deltas\n * OpenAI streams tool calls incrementally, need to accumulate\n */\n protected accumulateToolCall(\n toolCallsMap: Map<number, Partial<ToolCall>>,\n index: number,\n delta: any\n ): void {\n if (!toolCallsMap.has(index)) {\n toolCallsMap.set(index, {\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n\n const toolCall = toolCallsMap.get(index)!;\n\n if (delta.id) {\n toolCall.id = delta.id;\n }\n\n if (delta.type) {\n toolCall.type = delta.type as \"function\";\n }\n\n if (delta.function) {\n if (delta.function.name) {\n toolCall.function!.name += delta.function.name;\n }\n if (delta.function.arguments) {\n toolCall.function!.arguments += delta.function.arguments;\n }\n }\n }\n\n /**\n * Helper: Convert accumulated tool calls to final array\n */\n protected finalizeToolCalls(\n toolCallsMap: Map<number, Partial<ToolCall>>\n ): ToolCall[] {\n const toolCalls: ToolCall[] = [];\n\n for (const [_index, partialCall] of Array.from(toolCallsMap.entries()).sort(\n (a, b) => a[0] - b[0]\n )) {\n if (partialCall.id && partialCall.function?.name) {\n toolCalls.push(partialCall as ToolCall);\n }\n }\n\n return toolCalls;\n }\n\n /**\n * Helper: Update log with actual request body before making API call\n * This ensures we have the complete request even if the call fails\n */\n protected async logActualRequest(\n request: any,\n logId: string,\n state: FlowState\n ): Promise<void> {\n try {\n const requestBody = JSON.stringify(request);\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `UPDATE logs SET request_body = ?1 WHERE id = ?2`,\n requestBody,\n logId\n );\n });\n\n // Broadcast updated log to WebSocket\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: logId,\n data: {\n id: logId,\n request_body: requestBody,\n },\n });\n }\n } catch (error) {\n // Non-fatal - logging is best-effort\n console.error(`[${this.name}] Failed to log actual request:`, error);\n }\n }\n\n /**\n * Helper: Log provider errors\n */\n protected async logError(\n state: FlowState,\n error: Error | unknown,\n context: string\n ): Promise<void> {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n console.error(`[${this.name}] ${context}:`, errorMessage);\n\n try {\n const id = crypto.randomUUID();\n const log = {\n id,\n message_id: (state as any).rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.name,\n model: context,\n error: `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n error_type: \"provider_error\",\n created_at: Date.now() * 1000,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n log.id,\n log.message_id,\n log.provider,\n log.model,\n log.error,\n log.error_type,\n log.created_at\n );\n });\n\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: log.id,\n data: log,\n });\n }\n } catch (logError) {\n console.error(`[${this.name}] Failed to log error:`, logError);\n }\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\n\n/**\n * OpenAI provider implementation\n * Supports: gpt-4, gpt-4-turbo, gpt-3.5-turbo, o1, o3, etc.\n */\nexport class OpenAIProvider extends BaseProvider {\n get name(): string {\n return \"openai\";\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith(\"gpt-\") ||\n modelId.startsWith(\"o1-\") ||\n modelId.startsWith(\"o3-\")\n );\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import to avoid bundling if not used\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n });\n\n // Prepare request\n const request: any = {\n model: modelId,\n messages: context.messages,\n stream: true,\n };\n\n // Add tools if provided\n if (context.tools && context.tools.length > 0) {\n request.tools = context.tools;\n\n // Add parallel_tool_calls if specified\n if (context.parallel_tool_calls !== undefined) {\n request.parallel_tool_calls = context.parallel_tool_calls;\n }\n\n // Add tool_choice if specified\n if (context.tool_choice) {\n request.tool_choice = context.tool_choice;\n }\n }\n\n // Add reasoning configuration if present (implicit enable)\n // OpenAI o-series models use max_completion_tokens\n if (context.reasoning?.max_tokens) {\n request.max_completion_tokens = context.reasoning.max_tokens;\n }\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n const stream = await client.chat.completions.create(request, {\n signal,\n });\n\n // Process stream\n let content = \"\";\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture usage (only in last chunk)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n };\n }\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n tool_calls: toolCalls,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n };\n } catch (error) {\n await this.logError(state, error, `OpenAI chat completion: ${modelId}`);\n throw error;\n }\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\n\n/**\n * OpenRouter provider implementation\n * OpenRouter uses OpenAI-compatible API but routes to multiple providers\n */\nexport class OpenRouterProvider extends BaseProvider {\n get name(): string {\n return \"openrouter\";\n }\n\n supportsModel(modelId: string): boolean {\n // OpenRouter supports a wide variety of models\n // We identify by the provider SDK being 'openrouter'\n // Actual model support is determined by the database configuration\n return true;\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import OpenAI SDK (OpenRouter is compatible)\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n baseURL: \"https://openrouter.ai/api/v1\",\n });\n\n // Prepare request\n const request: any = {\n model: modelId,\n messages: context.messages,\n stream: true,\n // Enable usage accounting to get cost information\n // https://openrouter.ai/docs/use-cases/usage-accounting\n usage: {\n include: true,\n },\n };\n\n // Add provider routing if specified in model config\n // https://openrouter.ai/docs/features/provider-routing\n if (modelConfig?.included_providers) {\n try {\n const providers = JSON.parse(modelConfig.included_providers);\n if (Array.isArray(providers) && providers.length > 0) {\n // Use 'only' to exclusively use specified providers\n request.provider = {\n only: providers,\n };\n }\n } catch (error) {\n console.error(\"[OpenRouter] Failed to parse included_providers:\", error);\n }\n }\n\n // Add tools if provided\n if (context.tools && context.tools.length > 0) {\n request.tools = context.tools;\n\n // Add parallel_tool_calls if specified\n if (context.parallel_tool_calls !== undefined) {\n request.parallel_tool_calls = context.parallel_tool_calls;\n }\n\n // Add tool_choice if specified\n if (context.tool_choice) {\n request.tool_choice = context.tool_choice;\n }\n }\n\n // Add reasoning configuration if present (implicit enable)\n // OpenRouter uses unified reasoning parameter\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (context.reasoning) {\n request.reasoning = {};\n\n // Add effort level if specified (for OpenAI o-series, Grok)\n if (context.reasoning.effort) {\n request.reasoning.effort = context.reasoning.effort;\n }\n\n // Add max_tokens if specified (for Anthropic, Gemini, Qwen)\n if (context.reasoning.max_tokens) {\n request.reasoning.max_tokens = context.reasoning.max_tokens;\n }\n\n // Add exclude flag if specified\n if (context.reasoning.exclude) {\n request.reasoning.exclude = true;\n }\n }\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n const stream = await client.chat.completions.create(request, {\n signal,\n });\n\n // Process stream - aggregate all important information from chunks\n let content = \"\";\n let reasoning_content = \"\"; // Store reasoning separately\n let reasoning_details: any[] = []; // Store structured reasoning blocks\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n let cost: number | undefined;\n let actualProvider: string | undefined;\n const allChunks: any[] = []; // Store all chunks for aggregate response body\n\n try {\n for await (const chunk of stream) {\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n // Store chunk for aggregate response\n allChunks.push(chunk);\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate regular content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // GPT-5/o1 returns reasoning in a separate field - DON'T stream it or mix it with content\n if ((choice.delta as any)?.reasoning) {\n const reasoning = (choice.delta as any).reasoning;\n reasoning_content += reasoning;\n // DO NOT stream reasoning content to user\n }\n\n // Capture reasoning_details from OpenRouter\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if ((choice.delta as any)?.reasoning_details) {\n const details = (choice.delta as any).reasoning_details;\n // Separate text chunks from structured reasoning\n if (Array.isArray(details)) {\n for (const item of details) {\n if (item.type === \"reasoning.text\") {\n // Accumulate text directly into reasoning_content\n reasoning_content += item.text || \"\";\n } else {\n // Store non-text reasoning (summaries, encrypted, etc.)\n reasoning_details.push(item);\n }\n }\n }\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture actual provider from chunk root (OpenRouter-specific field)\n if ((chunk as any).provider !== undefined) {\n actualProvider = (chunk as any).provider;\n }\n\n // Capture usage from ANY chunk (can appear in any chunk, not just the last)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n completion_tokens_details: (chunk.usage as any).completion_tokens_details\n ? {\n reasoning_tokens:\n (chunk.usage as any).completion_tokens_details.reasoning_tokens || 0,\n }\n : undefined,\n };\n\n // Cost can appear in ANY chunk - capture it whenever we see it\n // For BYOK (Bring Your Own Key) models, cost is 0 but actual cost is in cost_details\n if ((chunk.usage as any).is_byok && (chunk.usage as any).cost_details?.upstream_inference_cost !== undefined) {\n cost = (chunk.usage as any).cost_details.upstream_inference_cost;\n } else if ((chunk.usage as any).cost !== undefined) {\n cost = (chunk.usage as any).cost;\n }\n }\n }\n } catch (streamError: any) {\n // Enhanced error logging for stream errors\n console.error(`[openrouter] Stream error for model ${modelId}:`, {\n error: streamError,\n code: streamError?.code,\n status: streamError?.status,\n message: streamError?.message,\n type: streamError?.type,\n });\n throw new Error(\n `Stream error: ${streamError?.message || 'Unknown error'} (code: ${streamError?.code || 'unknown'})`\n );\n }\n\n // Add captured cost and provider to usage\n if (usage && cost !== undefined) {\n (usage as any).cost = cost;\n }\n if (usage && actualProvider !== undefined) {\n (usage as any).provider = actualProvider;\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Build aggregate response body (similar to standard OpenAI response format)\n const aggregateResponse = {\n id: responseId,\n object: \"chat.completion\",\n created: allChunks[0]?.created || Math.floor(Date.now() / 1000),\n model: modelId,\n provider: allChunks.find((c: any) => c.provider)?.provider,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: content || null,\n tool_calls: toolCalls || undefined,\n },\n finish_reason: finishReason || \"stop\",\n },\n ],\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Include all chunks for debugging/auditing\n _raw_chunks: allChunks.length,\n };\n\n // Text reasoning is already accumulated in reasoning_content\n // Non-text reasoning (summaries, encrypted) is in reasoning_details\n let finalReasoningContent = reasoning_content || null;\n let finalReasoningDetails: any[] | undefined = reasoning_details.length > 0 ? reasoning_details : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n reasoning_content: finalReasoningContent,\n reasoning_details: finalReasoningDetails,\n tool_calls: toolCalls,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Store aggregate response for logging\n _aggregate_response: aggregateResponse,\n } as LLMResponse;\n } catch (error) {\n // Don't log here - LLMRequest handles error logging\n // to avoid duplicate log entries\n throw error;\n }\n }\n}\n","import type {\n LLMProvider,\n ProviderFactory,\n ProviderRegistry as IProviderRegistry,\n ProviderConfig,\n ModelConfig,\n} from \"./types\";\nimport type { ThreadInstance } from \"../types\";\nimport { OpenAIProvider } from \"./OpenAIProvider\";\nimport { OpenRouterProvider } from \"./OpenRouterProvider\";\n\n/**\n * Provider registry implementation\n * Manages provider factories and model-to-provider mapping\n *\n * Now loads model configs from TypeScript virtual modules and\n * provider API keys from DurableAgentBuilder.\n */\nclass ProviderRegistryImpl implements IProviderRegistry {\n private factories = new Map<string, ProviderFactory>();\n private providerCache = new Map<string, { provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>();\n\n constructor() {\n // Register built-in providers\n this.registerBuiltInProviders();\n }\n\n private registerBuiltInProviders(): void {\n // OpenAI provider\n this.register(\"openai\", (config) => new OpenAIProvider(config));\n\n // OpenRouter provider\n this.register(\"openrouter\", (config) => new OpenRouterProvider(config));\n }\n\n register(sdk: string, factory: ProviderFactory): void {\n this.factories.set(sdk.toLowerCase(), factory);\n }\n\n hasProvider(sdk: string): boolean {\n return this.factories.has(sdk.toLowerCase());\n }\n\n /**\n * Get provider for a model.\n *\n * @param modelName - The model name (from TypeScript config)\n * @param env - Environment bindings\n * @param thread - Thread instance for loading model from virtual modules\n */\n async getProvider(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }> {\n // Check cache first\n const cacheKey = `${modelName}`;\n const cachedData = this.providerCache.get(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n // Get model configuration from TypeScript virtual modules\n const modelConfig = await this.getModelConfig(modelName, env, thread);\n if (!modelConfig) {\n throw new Error(`Model not found: ${modelName}`);\n }\n\n // Get provider configuration from DurableAgentBuilder or environment\n const providerConfig = await this.getProviderConfig(\n modelConfig.provider_id,\n env\n );\n if (!providerConfig) {\n throw new Error(`Provider not found: ${modelConfig.provider_id}`);\n }\n\n // Get factory for this provider SDK\n const factory = this.factories.get(providerConfig.sdk.toLowerCase());\n if (!factory) {\n throw new Error(`No provider registered for SDK: ${providerConfig.sdk}`);\n }\n\n // Create provider instance\n const provider = factory(providerConfig);\n\n // Cache provider with model name and config\n const result = { provider, modelName: modelConfig.name, modelConfig };\n this.providerCache.set(cacheKey, result);\n\n return result;\n }\n\n /**\n * Get model configuration from TypeScript virtual modules\n */\n private async getModelConfig(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<ModelConfig | null> {\n if (!thread) {\n throw new Error(\"Thread instance required for model lookup\");\n }\n\n try {\n const modelDef = await thread.loadModel(modelName);\n if (!modelDef) {\n return null;\n }\n\n // Convert ModelDefinition to ModelConfig format\n return {\n id: modelName, // Use name as ID\n name: modelDef.model, // The actual model ID sent to provider\n provider_id: modelDef.provider, // Provider name\n included_providers: modelDef.includedProviders\n ? JSON.stringify(modelDef.includedProviders)\n : \"[]\",\n input_price: modelDef.inputPrice ?? null,\n output_price: modelDef.outputPrice ?? null,\n cached_price: modelDef.cachedPrice ?? null,\n };\n } catch (error) {\n console.error(\"Error loading model config:\", error);\n throw error;\n }\n }\n\n /**\n * Get provider configuration.\n *\n * Provider API keys come from environment variables.\n */\n private async getProviderConfig(\n providerName: string,\n env: Env\n ): Promise<ProviderConfig | null> {\n // Map provider name to API key environment variable\n const apiKeyEnvVarMap: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n };\n\n // Get API key from environment\n const envVar = apiKeyEnvVarMap[providerName.toLowerCase()];\n if (envVar && (env as any)[envVar]) {\n return {\n name: providerName,\n sdk: providerName, // SDK is same as provider name for built-in providers\n api_key: (env as any)[envVar],\n };\n }\n\n return null;\n }\n\n /**\n * Clear the provider cache\n * Useful for testing or when configurations change\n */\n clearCache(): void {\n this.providerCache.clear();\n }\n}\n\n/**\n * Singleton instance\n */\nexport const ProviderRegistry = new ProviderRegistryImpl();\n","/**\n * Provider system for LLM integrations\n *\n * This module provides a modular, extensible system for integrating\n * different LLM providers (OpenAI, OpenRouter, Anthropic, etc.)\n *\n * ## Architecture\n *\n * - **LLMProvider**: Base interface that all providers must implement\n * - **BaseProvider**: Abstract base class with common functionality\n * - **Concrete Providers**: OpenAIProvider, OpenRouterProvider, etc.\n * - **ProviderRegistry**: Singleton that manages provider instances\n *\n * ## Usage\n *\n * ```typescript\n * // Get provider for a model\n * const provider = await ProviderRegistry.getProvider(modelId, env);\n *\n * // Make a chat completion request\n * const response = await provider.chat(modelId, context, state);\n * ```\n *\n * ## Adding a New Provider\n *\n * 1. Create a new provider class extending BaseProvider\n * 2. Implement the `chat()` and `supportsModel()` methods\n * 3. Register it in ProviderRegistry constructor\n *\n * ```typescript\n * export class CustomProvider extends BaseProvider {\n * get name(): string {\n * return \"custom\";\n * }\n *\n * supportsModel(modelId: string): boolean {\n * return modelId.startsWith(\"custom-\");\n * }\n *\n * async chat(modelId, context, state): Promise<LLMResponse> {\n * // Implementation\n * }\n * }\n *\n * // In ProviderRegistry:\n * this.register(\"custom\", (config) => new CustomProvider(config));\n * ```\n */\n\nexport * from \"./types\";\nexport * from \"./BaseProvider\";\nexport * from \"./OpenAIProvider\";\nexport * from \"./OpenRouterProvider\";\nexport { ProviderRegistry } from \"./ProviderRegistry\";\n","import type {\n RequestContext,\n LLMResponse,\n LLMResponseWithLog,\n FlowState,\n ModelFallback,\n LogData,\n} from \"./types\";\nimport { MAX_RETRIES_PER_MODEL, BACKOFF_BASE, TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Executes LLM requests with smart retry and fallback logic\n */\nexport class LLMRequest {\n /**\n * Execute an LLM request with full retry/fallback logic\n *\n * Retry hierarchy:\n * 1. Try primary model (2x)\n * 2. Try each fallback model (2x each)\n * 3. If all fail, throw terminal error\n *\n * Error classification:\n * - Provider errors (from model call): Retriable with backoff + fallbacks\n * - Code errors (validation, setup): Thrown immediately without retry\n *\n * This applies to ALL prompts (top-level and sub-prompts)\n * Returns both the LLM response and the log ID for tracking\n */\n static async execute(\n context: RequestContext,\n state: FlowState\n ): Promise<LLMResponseWithLog> {\n const startTime = Date.now();\n let lastFailedLogId: string | undefined;\n\n // Try primary model\n try {\n return await this.tryModel(context, state, context.model, startTime, undefined);\n } catch (primaryError) {\n console.error(`Primary model ${context.model} failed:`, primaryError);\n\n // Get the log ID from the error (set by tryModel)\n lastFailedLogId = (primaryError as any)?._lastLogId;\n\n // Send fallback telemetry\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: \"fetching_fallbacks\",\n timestamp: Date.now(),\n });\n }\n\n // Try fallback models\n const fallbacks = await this.getFallbacks(context.model, state);\n\n for (const fallback of fallbacks) {\n try {\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: fallback.fallback_model_id,\n timestamp: Date.now(),\n });\n\n // Pass lastFailedLogId so fallback attempts are linked as retries\n return await this.tryModel(\n context,\n state,\n fallback.fallback_model_id,\n startTime,\n lastFailedLogId\n );\n } catch (fallbackError) {\n console.error(\n `Fallback model ${fallback.fallback_model_id} failed:`,\n fallbackError\n );\n\n // Get the log ID from this fallback attempt\n lastFailedLogId = (fallbackError as any)?._lastLogId;\n\n continue;\n }\n }\n\n // All retries exhausted\n const exhaustionError = new Error(\n `All retry attempts exhausted for model ${context.model} and ${fallbacks.length} fallbacks`\n );\n\n // Log final exhaustion (this is a new error so won't be deduplicated)\n await this.logError(\n state,\n exhaustionError,\n \"all_retries_exhausted\",\n context.model,\n startTime\n );\n\n throw exhaustionError;\n }\n\n /**\n * Try a specific model with retries and validation\n * @param initialParentLogId - Log ID from previous attempt (for linking fallbacks as retries)\n */\n private static async tryModel(\n context: RequestContext,\n state: FlowState,\n modelId: string,\n startTime: number,\n initialParentLogId?: string\n ): Promise<LLMResponseWithLog> {\n let attempts = 0;\n let logId: string | undefined;\n let previousLogId: string | undefined = initialParentLogId; // Track previous attempt for retry linking\n\n while (attempts < MAX_RETRIES_PER_MODEL) {\n attempts++;\n\n try {\n // Log request details (non-blocking) and get log ID\n // Pass previousLogId for retry tracking (includes fallback linking)\n logId = await this.logRequest(state, modelId, context, previousLogId);\n\n // Send telemetry for this attempt\n state.emitTelemetry?.({\n type: \"llm_request\",\n model: modelId,\n attempt: attempts,\n timestamp: Date.now(),\n });\n\n // Make the actual LLM call\n const response = await this.callModel(modelId, context, state, logId);\n\n // Success! Update log with response data\n await this.logSuccess(response, state, modelId, startTime, context, logId);\n\n state.emitTelemetry?.({\n type: \"llm_response\",\n tokens: response.usage.total_tokens,\n latency: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n return { response, logId };\n } catch (error) {\n console.error(\n `Error calling ${modelId} (attempt ${attempts}):`,\n error\n );\n\n // Log API error - attach to existing log if available\n await this.logError(\n state,\n error,\n \"api_error\",\n modelId,\n startTime,\n logId\n );\n\n // Network or API error - retry with backoff\n if (attempts < MAX_RETRIES_PER_MODEL) {\n const backoffMs = BACKOFF_BASE * Math.pow(2, attempts - 1);\n await this.sleep(backoffMs);\n // Save current logId as previous for retry tracking\n previousLogId = logId;\n logId = undefined;\n } else {\n // Last attempt failed, attach log ID to error for execute() to retrieve\n if (error && typeof error === 'object') {\n (error as any)._lastLogId = logId;\n }\n throw error;\n }\n }\n }\n\n const error = new Error(\n `Model ${modelId} failed validation after ${MAX_RETRIES_PER_MODEL} attempts`\n ) as any;\n error._lastLogId = logId;\n throw error;\n }\n\n /**\n * Log the outbound request details with full context\n * Returns the log ID for later updating\n */\n private static async logRequest(\n state: FlowState,\n modelId: string,\n context: RequestContext,\n retryOfLogId?: string\n ): Promise<string> {\n try {\n const id = crypto.randomUUID();\n\n // Get model name from TypeScript config\n let modelName: string | null = null;\n try {\n const modelDef = await state.thread.instance.loadModel(modelId);\n if (modelDef) {\n modelName = modelDef.model; // The actual model ID sent to provider\n }\n } catch (err) {\n console.error(\"Failed to fetch model name:\", err);\n }\n\n\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || crypto.randomUUID(),\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n model_name: modelName,\n endpoint: \"chat.completions\",\n request_body: JSON.stringify({\n model: modelName || modelId, // Use actual model name sent to API, fallback to ID\n messages: context.messages,\n tools: context.tools,\n stream: context.stream ?? true,\n }),\n tools_available: context.tools ? context.tools.length : 0,\n message_history_length: context.messages.length,\n prompt_name: context.promptName || null,\n parent_log_id: context.parentLogId || null,\n retry_of_log_id: retryOfLogId || null,\n tools_schema: context.tools ? JSON.stringify(context.tools) : null,\n system_prompt: context.systemPrompt || null,\n is_complete: false, // Incomplete until response received\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model, model_name, endpoint,\n request_body, tools_available, message_history_length, prompt_name,\n parent_log_id, retry_of_log_id, tools_schema, system_prompt, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.model_name,\n logData.endpoint,\n logData.request_body,\n logData.tools_available,\n logData.message_history_length,\n logData.prompt_name,\n logData.parent_log_id,\n logData.retry_of_log_id,\n logData.tools_schema,\n logData.system_prompt,\n logData.is_complete ? 1 : 0,\n logData.created_at\n );\n });\n\n // Broadcast partial log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n return id;\n } catch (err) {\n console.error(\"Failed to log request (non-fatal):\", err);\n return crypto.randomUUID(); // Return a dummy ID\n }\n }\n\n /**\n * Call the LLM model using the provider system\n */\n private static async callModel(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string\n ): Promise<LLMResponse> {\n // Import provider registry\n const { ProviderRegistry } = await import(\"./providers\");\n\n // Get provider, model name, and model config for this model\n // Pass thread instance for loading model from TypeScript virtual modules\n const { provider, modelName, modelConfig } = await ProviderRegistry.getProvider(\n modelId,\n state.env,\n state.thread.instance\n );\n\n // Make the chat completion request (use modelName, not modelId)\n // Pass modelConfig so provider can access routing options (e.g., included_providers for OpenRouter)\n // Wrap in waitFor() to hold a channel open during streaming\n // This prevents the stream from auto-closing while chunks are being received\n let response: LLMResponse | undefined;\n await (state.stream as any).waitFor(async () => {\n response = await provider.chat(\n modelName,\n context,\n state,\n logId,\n state.abortController?.signal,\n modelConfig\n );\n });\n\n if (!response) {\n throw new Error(\"Provider chat returned undefined\");\n }\n\n return response;\n }\n\n /**\n * Get fallback models from TypeScript model definition\n */\n private static async getFallbacks(\n modelName: string,\n state: FlowState\n ): Promise<ModelFallback[]> {\n try {\n const modelDef = await state.thread.instance.loadModel(modelName);\n if (modelDef && modelDef.fallbacks && modelDef.fallbacks.length > 0) {\n // Convert fallbacks array to ModelFallback format\n return modelDef.fallbacks.map((fallbackName: string, idx: number) => ({\n parent_model_id: modelName,\n fallback_model_id: fallbackName,\n idx,\n }));\n }\n return [];\n } catch (error) {\n console.error(\"Error fetching fallbacks:\", error);\n return [];\n }\n }\n\n /**\n * Update log with successful response data (best-effort, non-blocking)\n */\n private static async logSuccess(\n response: LLMResponse,\n state: FlowState,\n modelId: string,\n startTime: number,\n context: RequestContext | undefined,\n logId: string\n ): Promise<void> {\n try {\n // Extract tools called from response\n const toolsCalled = response.tool_calls\n ? JSON.stringify(response.tool_calls.map((tc) => tc.function.name))\n : null;\n\n // Get cost directly from provider (e.g., OpenRouter with usage accounting enabled)\n const cost_total: number | null = response.usage.cost\n ? parseFloat(response.usage.cost as any)\n : null;\n\n // Get actual provider from usage (e.g., OpenRouter returns the actual provider that handled the request)\n const actualProvider: string | null = (response.usage as any).provider || null;\n\n // Use aggregate response if available, otherwise use the standard response\n const responseBody = (response as any)._aggregate_response\n ? JSON.stringify((response as any)._aggregate_response)\n : JSON.stringify(response);\n\n const logData: Partial<LogData> & { id: string } = {\n id: logId,\n response_body: responseBody,\n input_tokens: response.usage.prompt_tokens,\n cached_tokens: response.usage.prompt_tokens_details?.cached_tokens || 0,\n output_tokens: response.usage.completion_tokens,\n reasoning_tokens: response.usage.completion_tokens_details?.reasoning_tokens || 0,\n total_tokens: response.usage.total_tokens,\n latency_ms: Date.now() - startTime,\n finish_reason: response.finish_reason,\n tools_called: toolsCalled,\n cost_total,\n provider: actualProvider, // Update provider with actual value if available\n is_complete: true, // Now complete\n reasoning_content: response.reasoning_content || null, // Store reasoning separately\n };\n\n // Update the existing log record\n await (state.stream as any).waitFor(async () => {\n // Build SQL conditionally based on whether we have a provider update\n if (actualProvider !== null) {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12,\n provider = ?13\n WHERE id = ?14\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n actualProvider,\n logId\n );\n } else {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12\n WHERE id = ?13\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n logId\n );\n }\n });\n\n // Broadcast updated log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n } catch (error) {\n console.error(\"Failed to update log with response (non-fatal):\", error);\n }\n }\n\n /**\n * Extract provider name from model ID\n */\n private static getProviderFromModel(modelId: string): string {\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\")) {\n return \"openai\";\n }\n if (modelId.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (modelId.startsWith(\"gemini-\")) {\n return \"google\";\n }\n return \"unknown\";\n }\n\n /**\n * Sleep utility for backoff\n */\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Attaches log ID to error object to prevent duplicate logging\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n modelId: string,\n startTime: number,\n existingLogId?: string\n ): Promise<string | undefined> {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Capture full error object including any metadata\n let errorDetails = \"\";\n const errorObj = error as any;\n\n // For OpenAI/OpenRouter errors, capture the complete error structure\n if (errorObj && typeof errorObj === \"object\") {\n // Check for common error structures\n const relevantFields = [\n \"error\", // OpenRouter wraps errors here\n \"code\", // Error code\n \"status\", // HTTP status\n \"metadata\", // OpenRouter metadata\n \"type\", // Error type\n \"param\", // Parameter that caused error\n \"user_id\", // User context\n \"response\", // Raw response\n ];\n\n const metadata: Record<string, any> = {};\n for (const field of relevantFields) {\n if (field in errorObj && errorObj[field] !== undefined) {\n metadata[field] = errorObj[field];\n }\n }\n\n if (Object.keys(metadata).length > 0) {\n errorDetails = `\\n\\nError Details:\\n${JSON.stringify(metadata, null, 2)}`;\n }\n }\n\n const fullError = `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}${errorDetails}`;\n\n // Check if this error has already been logged\n const trackedLogId = existingLogId || errorObj?._loggedId;\n\n if (trackedLogId) {\n // Update existing log entry - append error to errors array\n await (state.stream as any).waitFor(async () => {\n // First, get the current errors array\n const result = await state.storage.sql.exec<{ errors: string | null }>(\n `SELECT errors FROM logs WHERE id = ?1`,\n trackedLogId\n );\n const rows = result.toArray();\n const currentErrors = rows[0]?.errors;\n\n // Parse existing errors or create new array\n let errorsArray: Array<{message: string, type: string, timestamp: number}> = [];\n if (currentErrors) {\n try {\n errorsArray = JSON.parse(currentErrors);\n } catch (e) {\n console.error(\"Failed to parse existing errors array:\", e);\n }\n }\n\n // Append new error\n errorsArray.push({\n message: fullError,\n type: errorType,\n timestamp: Date.now(),\n });\n\n // Update the log with appended error\n await state.storage.sql.exec(\n `\n UPDATE logs SET\n error = ?1,\n error_type = ?2,\n errors = ?3,\n latency_ms = ?4,\n is_complete = ?5\n WHERE id = ?6\n `,\n fullError, // Keep last error in error field for backwards compatibility\n errorType, // Keep last error type\n JSON.stringify(errorsArray), // All errors in array\n Date.now() - startTime,\n 1, // is_complete = true\n trackedLogId\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: trackedLogId,\n data: {\n id: trackedLogId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n },\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = trackedLogId;\n }\n\n return trackedLogId;\n } else {\n // Create new standalone error log (fallback for errors before request log was created)\n const id = crypto.randomUUID();\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n } as any;\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, latency_ms, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.error,\n logData.error_type,\n logData.latency_ms,\n 1,\n logData.created_at\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = id;\n }\n\n return id;\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log LLM error to database:\", logError);\n }\n\n return undefined;\n }\n}\n","import { DurableThread } from \"../durable-objects/DurableThread\";\nimport type {\n FlowState,\n ToolCall,\n ToolResult,\n ToolType,\n Message,\n} from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Executes tools, prompts, and agents sequentially\n * Inspired by bod.coach runSequence pattern\n */\nexport class ToolExecutor {\n /**\n * Execute a sequence of tool calls sequentially\n * No parallel execution - tools run one after another\n */\n static async executeSequence(\n state: FlowState,\n toolCalls: ToolCall[]\n ): Promise<void> {\n // Add all tool calls to the queue\n state.sequence.queue.push(...toolCalls);\n state.sequence.isHandling = true;\n\n while (state.sequence.queue.length > 0) {\n // Check if execution should be stopped before processing each tool call\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n // Clear the queue and exit\n state.sequence.queue = [];\n state.sequence.isHandling = false;\n throw new Error(\"aborted\");\n }\n\n const call = state.sequence.queue.shift()!\n // Generate tool message ID upfront so sub-prompts can use it as parent_id\n const toolMessageId = crypto.randomUUID();\n\n try {\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_started\",\n tool: call.function.name,\n timestamp: Date.now(),\n });\n\n // Validate that this tool is in the allowed tools list\n const validationError = this.validateToolCall(call, state);\n if (validationError) {\n // Tool not allowed - treat as error and continue\n const result: ToolResult = {\n status: \"error\",\n error: validationError,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n\n continue; // Skip to next tool\n }\n\n // Execute the tool (pass toolMessageId for sub-prompts to use as parent_id)\n const result = await this.executeToolCall(call, state, toolMessageId);\n\n // If tool returned an error, log it to database\n if (result.status === \"error\") {\n const error = new Error(result.error || \"Tool execution failed\");\n // Preserve the stack trace from the result if available\n if (result.stack) {\n error.stack = result.stack;\n }\n await this.logError(state, error, call.function.name);\n }\n\n // Run the appropriate hook based on result status\n // Import FlowEngine dynamically to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n const hookResult = result.status === \"success\"\n ? await FlowEngine.runAfterToolCallSuccessHook(state, call, result)\n : await FlowEngine.runAfterToolCallFailureHook(state, call, result);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store tool result as a message (including handoff confirmations)\n // Use the potentially modified result from the hook\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: hookResult.status,\n timestamp: Date.now(),\n });\n } catch (error) {\n console.error(`Error executing tool ${call.function.name}:`, error);\n\n // Log error to database\n await this.logError(state, error, call.function.name);\n\n // Create error result for hook processing\n const errorResult: ToolResult = {\n status: \"error\",\n error: (error as Error).message,\n };\n\n // Run after_tool_call_failure hook\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n const hookResult = await FlowEngine.runAfterToolCallFailureHook(state, call, errorResult);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store error as tool result (use potentially modified result from hook)\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n }\n }\n\n state.sequence.isHandling = false;\n\n // Apply any pending force turn that was deferred during tool execution\n // This allows queueTool + forceTurn to work together properly\n if (state.pendingForceTurn) {\n state.forcedNextSide = state.pendingForceTurn;\n state.pendingForceTurn = undefined;\n }\n }\n\n /**\n * Execute a single tool call\n */\n private static async executeToolCall(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n const toolType = await this.identifyToolType(call, state);\n\n switch (toolType) {\n case \"native\":\n return await this.executeNativeTool(call, state);\n case \"prompt\":\n return await this.executePromptTool(call, state, toolMessageId);\n case \"agent\":\n return await this.executeAgentTool(call, state);\n default:\n throw new Error(`Unknown tool type for: ${call.function.name}`);\n }\n }\n\n /**\n * Validate that a tool call is allowed for the current prompt\n * Returns error message if invalid, null if valid\n */\n private static validateToolCall(\n call: ToolCall,\n state: FlowState\n ): string | null {\n // If no allowed tools list is set, allow all tools (backward compatibility)\n if (!state.allowedTools || call.forceAllow) {\n return null;\n }\n\n // Check if tool is in the allowed list\n const isAllowed = state.allowedTools.some(\n (tool) => tool.function.name === call.function.name\n );\n\n if (!isAllowed) {\n return `Tool \"${call.function.name}\" is not available for this prompt. You can only use tools that were explicitly configured for this prompt.`;\n }\n\n return null;\n }\n\n /**\n * Identify the type of tool (native, prompt, or agent)\n */\n private static async identifyToolType(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolType> {\n const toolName = call.function.name;\n // Check if it's a native tool\n const tools = state.thread.instance.tools();\n if (toolName in tools) {\n return \"native\";\n }\n\n // Check if it's a prompt (all prompts are exposed as tools)\n try {\n const promptDef = await state.thread.instance.loadPrompt(toolName);\n if (promptDef) {\n return \"prompt\";\n }\n } catch {\n // Prompt not found, continue checking\n }\n\n // Check if it's an agent (exposed or in handoff list)\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n // Check by title as well (agents are called by their title in tool calls)\n if (agentDef) {\n if (call.forceAllow) {\n // Just check that an agent by that name exists and is ai_human\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n // Only count exposed or handoff agents\n if (agentDef.exposeAsTool) {\n return \"agent\";\n }\n // Check if it's in current prompt's handoff list\n const handoffAgents = state.prompt._handoffAgents || [];\n if (handoffAgents.includes(toolName)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Agent not found by name, try by title\n }\n\n // Try finding agent by title (agents are often called by title in tool calls)\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n if (agentDef.title === toolName) {\n if (call.forceAllow) {\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n if (agentDef.exposeAsTool) {\n return \"agent\";\n }\n const handoffAgents = state.prompt._handoffAgents || [];\n if (handoffAgents.includes(name)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n /**\n * Execute a native tool from server/tools/\n */\n private static async executeNativeTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get tools from thread instance (user's extended Thread class)\n const tools = state.thread.instance.tools();\n\n // Load the tool\n const toolLoader = tools[call.function.name];\n if (!toolLoader) {\n throw new Error(`Native tool not found: ${call.function.name}`);\n }\n\n const toolModule = await toolLoader();\n const [description, argsSchema, toolFn] = toolModule;\n\n // Parse arguments\n const args: Record<string, any> = JSON.parse(call.function.arguments);\n\n // Validate arguments against tool schema\n if (argsSchema) {\n const validation = argsSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"root\";\n return `[${path}] ${issue.message}`;\n })\n .join(\"; \");\n\n return {\n status: \"error\",\n error: `Tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Update state.active to track current tool execution\n state.active = {\n tool: call.function.name,\n args,\n retries: 0,\n reasons: [],\n };\n\n // Execute the tool with the full FlowState\n const result = argsSchema\n ? await toolFn(state, args)\n : await toolFn(state, {});\n\n // Normalize tool result into internal ToolResult shape\n const status = result.status === \"error\" ? \"error\" : \"success\";\n\n let textResult: string | undefined;\n let errorText: string | undefined;\n\n // Prefer MCP-style content array if present\n const content = (result as any).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (part: any) =>\n part &&\n part.type === \"text\" &&\n typeof part.text === \"string\"\n )\n .map((part: any) => part.text as string);\n\n if (textParts.length > 0) {\n textResult = textParts.join(\"\\n\");\n }\n }\n\n // Fallback to legacy `result` field\n if (!textResult && (result as any).result !== undefined) {\n const raw = (result as any).result;\n textResult =\n typeof raw === \"string\" ? raw : JSON.stringify(raw, null, 2);\n }\n\n // Normalize error text\n if (typeof (result as any).error === \"string\") {\n errorText = (result as any).error;\n }\n\n if (status === \"error\" && !errorText) {\n // If tool marked as error but didn't provide an explicit error string,\n // fall back to the textual result (if any).\n errorText = textResult;\n }\n\n return {\n status,\n result: textResult,\n error: status === \"error\" ? errorText : undefined,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Execute a prompt tool (creates a sub-flow) with retry logic\n * This is essentially chaining another prompt\n * Creates an in-memory sub-flow that executes the prompt and returns the result\n * Note: LLM-level retries with model fallbacks are handled inside FlowEngine/LLMRequest\n */\n private static async executePromptTool(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n // Sub-prompts execute as one-shot calls - no retry logic\n // Errors are returned as tool results for the parent to handle\n return await this.executePromptToolInternal(call, state, toolMessageId);\n }\n\n /**\n * Internal method to execute a prompt tool\n */\n private static async executePromptToolInternal(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n try {\n // Get prompt configuration from TypeScript config\n const promptDef = await state.thread.instance.loadPrompt(call.function.name);\n\n if (!promptDef) {\n throw new Error(`Prompt tool not found: ${call.function.name}`);\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Validate arguments against required schema if present\n if (promptDef.requiredSchema) {\n const validation = promptDef.requiredSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue: any) => `[${issue.path.join('.')}] ${issue.message}`)\n .join('; ');\n return {\n status: \"error\",\n error: `Prompt tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Get parent prompt's tool config for initialization options\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n const initUserMessageProperty = typeof toolConfig === 'object'\n ? toolConfig.initUserMessageProperty\n : null;\n\n // Import FlowEngine dynamically to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine\");\n\n // Create a temporary agent configuration for the prompt\n // Store the prompt name in side_a_agent_prompt - FlowEngine will load and interpolate it\n // Use \"ai_human\" type to prevent side switching - prompts should only execute on side A\n const promptAgent: import(\"./types\").Agent = {\n id: promptDef.name,\n title: promptDef.name,\n type: \"ai_human\", // Prevent side switching - prompts execute only on side A\n created_at: Date.now(),\n\n // Global configuration\n max_session_turns: null,\n\n // Side A configuration (only side used for prompt tools)\n side_a_label: null,\n side_a_agent_prompt: promptDef.name, // Pass prompt name, FlowEngine will load it\n side_a_stop_on_response: true,\n side_a_stop_tool: null,\n side_a_stop_tool_response_property: null,\n side_a_max_turns: null,\n side_a_end_conversation_tool: null,\n\n // Side B configuration (unused for prompt tools)\n side_b_label: null,\n side_b_agent_prompt: null,\n side_b_stop_on_response: true,\n side_b_stop_tool: null,\n side_b_stop_tool_response_property: null,\n side_b_max_turns: null,\n side_b_end_conversation_tool: null,\n };\n\n // Build the user message content based on initialization options\n let userMessageContent: string | undefined;\n if (initUserMessageProperty && args[initUserMessageProperty] !== undefined) {\n // Use the specified property as the user message\n const propertyValue = args[initUserMessageProperty];\n userMessageContent = typeof propertyValue === 'string'\n ? propertyValue\n : JSON.stringify(propertyValue);\n }\n\n\n const extraMessages: Message[] = [...(state.extraMessages || [])];\n if (userMessageContent) {\n extraMessages.push({\n id: crypto.randomUUID(),\n role: \"user\",\n content: userMessageContent,\n created_at: Date.now() * 1000,\n });\n }\n\n // Execute the prompt as a sub-flow\n // IMPORTANT: Child prompt messages should NOT be stored in parent thread\n // Only the tool result should appear in the parent's messages\n // However, we DO want child logs to be stored with parent_log_id\n const parentLogId = state.currentLogId || null;\n const rootMessageIdForChild = state.pendingMessageId || state.rootMessageId || null;\n\n const result = await FlowEngine.execute({\n agentConfig: promptAgent,\n storage: state.storage,\n env: state.env,\n threadId: `${state.threadId}-prompt-${call.id}`,\n thread: state.thread, // Pass through parent thread instance and metadata\n context: {\n ...args, // Pass tool arguments for template interpolation\n // Pass parent tool config for response options\n __parentToolConfig: toolConfig,\n __parentToolName: call.function.name,\n },\n // Mark this as a sub-flow by providing a different flowId\n flowId: `prompt-${call.id}`,\n // Pass emit callbacks so child messages/logs are broadcast\n // This allows tools running in sub-prompts to use injectMessage()\n emitLog: state.emitLog,\n emitMessage: state.emitMessage,\n emitMessageChunk: state.emitMessageChunk,\n // Pass parent log ID for hierarchical log tracking\n parentLogId,\n // Pass root message ID so child logs link to parent's message\n rootMessageId: rootMessageIdForChild,\n // The root state is FlowState object for the root prompt\n rootState: state.rootState,\n // Mark as sub-prompt by providing parent message ID (tool message from parent)\n parentMessageId: toolMessageId,\n // Set depth one level deeper than parent\n depth: state.depth + 1,\n // Additional messages to inject\n extraMessages,\n }, true); // awaitCompletion: true - ensures all sub-prompt DB writes complete before parent continues\n\n // Get tool response options from parent prompt's tool config\n // toolConfig is already loaded above from state.prompt._tools\n let toolResponseOptions = {\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n };\n\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n toolResponseOptions = {\n include_text_response: toolConfig.includeTextResponse ?? true,\n include_tool_calls: toolConfig.includeToolCalls ?? true,\n include_errors: toolConfig.includeErrors ?? true,\n };\n }\n\n // Consume the stream to get the final content\n const reader = result.stream.getReader();\n const decoder = new TextDecoder();\n let textContent = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n textContent += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n // Query child tool messages from database to determine aggregate status\n const childToolMessagesResult = await state.storage.sql.exec(\n `SELECT id, content, tool_status, tool_call_id FROM messages WHERE parent_id = ? AND role = 'tool'`,\n toolMessageId\n );\n const childToolRows = childToolMessagesResult.toArray();\n\n // Determine overall status based on child tool results\n let overallStatus: \"success\" | \"error\" = \"success\";\n if (childToolRows.length > 0) {\n const statuses = childToolRows.map(row => row.tool_status as string);\n const hasError = statuses.some(s => s === \"error\");\n\n // If any child tool failed, the overall status is error\n if (hasError) {\n overallStatus = \"error\";\n }\n }\n\n // Build response based on tool response options\n const responseParts: string[] = [];\n\n // Include text response if enabled\n if (toolResponseOptions.include_text_response && textContent) {\n responseParts.push(textContent);\n }\n\n // Include tool calls and responses based on options\n if (toolResponseOptions.include_tool_calls || toolResponseOptions.include_errors) {\n // Query for child assistant messages (containing tool calls)\n const childAssistantMessagesResult = await state.storage.sql.exec(\n `SELECT id, tool_calls FROM messages WHERE parent_id = ? AND role = 'assistant' AND tool_calls IS NOT NULL`,\n toolMessageId\n );\n const childAssistantRows = childAssistantMessagesResult.toArray();\n\n const toolCallsSummary: string[] = [];\n\n // Add assistant messages with tool calls if enabled\n if (toolResponseOptions.include_tool_calls && childAssistantRows.length > 0) {\n for (const row of childAssistantRows) {\n const toolCalls = JSON.parse(row.tool_calls as string);\n for (const tc of toolCalls) {\n toolCallsSummary.push(\n `Tool Call: ${tc.function.name}(${tc.function.arguments})`\n );\n }\n }\n }\n\n // Add tool responses based on options\n for (const row of childToolRows) {\n const isError = (row.content as string)?.startsWith(\"Error: \");\n\n // Include based on options: errors if include_errors, successes if include_tool_calls\n if ((isError && toolResponseOptions.include_errors) ||\n (!isError && toolResponseOptions.include_tool_calls)) {\n toolCallsSummary.push(`Tool Response: ${row.content}`);\n }\n }\n\n if (toolCallsSummary.length > 0) {\n responseParts.push(\n \"Tool Executions:\\n\" + toolCallsSummary.join(\"\\n\")\n );\n }\n }\n\n const finalResponse = responseParts.length > 0\n ? responseParts.join(\"\\n\\n\")\n : \"Prompt executed successfully\";\n\n return {\n status: overallStatus,\n result: overallStatus === \"success\" ? finalResponse : undefined,\n error: overallStatus === \"error\" ? finalResponse : undefined,\n };\n } catch (error) {\n // Get tool response options from parent prompt's tool config\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n\n let includeErrors = true;\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n includeErrors = toolConfig.includeErrors ?? true;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n\n // Prefix error message with \"Error: \" when include_errors is true\n const formattedError = includeErrors\n ? `Error: ${errorMessage}`\n : \"Error: Tool execution failed\";\n\n return {\n status: \"error\",\n error: formattedError,\n stack: includeErrors ? stackTrace : undefined,\n };\n }\n }\n\n /**\n * Execute an agent tool (creates a new thread OR buffers handoff)\n * - For ai_human agents: buffer handoff for later execution\n * - For dual_ai agents (subagents): throw exception (not yet implemented)\n */\n private static async executeAgentTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get agent configuration from TypeScript config\n // First try to find by name, then by title\n let agentDef: any = null;\n let agentName = call.function.name;\n\n try {\n agentDef = await state.thread.instance.loadAgent(call.function.name);\n } catch {\n // Not found by name, try by title\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const def = await state.thread.instance.loadAgent(name);\n if (def.title === call.function.name) {\n agentDef = def;\n agentName = name;\n break;\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n\n if (!agentDef) {\n throw new Error(`Agent tool not found: ${call.function.name}`);\n }\n\n const agentType = agentDef.type as \"dual_ai\" | \"ai_human\";\n\n // Handle AI + Human agent handoff (buffer for later execution)\n if (agentType === \"ai_human\") {\n // Buffer the handoff - will be executed at turn completion\n // Use agent name (not title) as the identifier\n state.pendingHandoff = {\n agentId: agentName,\n };\n const text = \"Handoff complete\";\n\n // Return handoff confirmation message - will be stored as tool result\n return {\n status: \"success\",\n result: text,\n };\n }\n\n // Handle AI + AI subagent (not yet implemented)\n if (agentType === \"dual_ai\") {\n throw new Error(\n `AI + AI subagents are not yet implemented. Agent \"${call.function.name}\" cannot be called as a subagent.`\n );\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Create a new child thread (new DurableObject)\n const childThreadId = crypto.randomUUID();\n\n // Register child thread in DurableAgentBuilder\n const agentBuilderId = state.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = state.env.AGENT_BUILDER.get(agentBuilderId) as any;\n await agentBuilder.createThread(childThreadId, agentName, null); // No user_id for agent-spawned threads\n\n // Get DurableObject instance for the child thread\n const durableId = state.env.AGENT_BUILDER_THREAD.idFromName(childThreadId);\n const stub = state.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as DurableThread;\n\n // Create initial message with the agent's input\n const initialMessages: Message[] = [\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: typeof args === \"string\" ? args : JSON.stringify(args),\n created_at: Date.now() * 1000,\n },\n ];\n\n // Execute the agent in the new thread via RPC\n const response = await stub.execute(\n childThreadId,\n agentName, // Use agent name instead of UUID\n initialMessages,\n {}\n );\n\n if (!response.ok) {\n throw new Error(\n `Agent execution failed with status ${response.status}: ${await response.text()}`\n );\n }\n\n // Consume the stream to get the final content\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body from agent execution\");\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n content += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n const text = content || \"Agent executed successfully\";\n\n return {\n status: \"success\",\n result: text,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Store tool result as a message in the database\n */\n private static async storeToolResult(\n call: ToolCall,\n result: ToolResult,\n state: FlowState,\n toolMessageId: string\n ): Promise<void> {\n try {\n // Import FlowEngine to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n // Run before_store_tool_result hook to allow modification of the result\n const processedResult = await FlowEngine.runBeforeStoreToolResultHook(\n state,\n call,\n result\n );\n\n // Use pre-generated message ID (generated before tool execution)\n const messageId = toolMessageId;\n\n // Normalize tool result into a string for storage in the messages table.\n // At this point, executeRuntimeTool has already flattened any structured\n // tool output (e.g. MCP content parts) into processedResult.result.\n let content: string;\n if (processedResult.status === \"success\") {\n content =\n processedResult.result?.trim() ||\n \"Tool executed successfully\";\n } else {\n const baseError =\n processedResult.error?.trim() ||\n \"Tool execution failed\";\n content = `Failed to execute tool: ${baseError}`;\n }\n\n // If this is a sub-prompt and the tool failed, check if parent wants errors prefixed\n if (state.parentMessageId !== undefined && processedResult.status === \"error\") {\n // Get parent tool config from context (passed when executing prompt tool)\n const parentToolConfig = state.context.__parentToolConfig;\n\n // Check include_errors from parent tool config\n let includeErrors = true;\n if (typeof parentToolConfig === 'object' && parentToolConfig !== null) {\n includeErrors = parentToolConfig.includeErrors ?? true;\n }\n\n // If include_errors is true and content doesn't already start with \"Error: \", prefix it\n if (includeErrors && !content.startsWith(\"Error: \")) {\n content = `Error: ${content}`;\n }\n }\n\n // Determine tool_status based on result status\n const toolStatus = processedResult.status === \"success\" ? \"success\" : \"error\";\n\n let message: Message = {\n id: messageId,\n role: \"tool\",\n content,\n tool_call_id: call.id,\n created_at: 0, // Placeholder - will be set just before INSERT\n tool_status: toolStatus,\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n };\n\n // Run before_create_message hook\n message = await FlowEngine.runBeforeCreateMessageHook(state, message) as Message;\n\n // Set timestamp just before INSERT to ensure accurate ordering\n message.created_at = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Insert message (now includes tool messages from sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, tool_call_id, created_at, tool_status, parent_id, depth)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_call_id,\n message.created_at,\n message.tool_status,\n message.parent_id,\n message.depth\n );\n\n // Run after_create_message hook\n await FlowEngine.runAfterCreateMessageHook(state, message);\n\n // Update the parent log's tool_results field\n const parentLogId = state.currentLogId || null;\n if (parentLogId) {\n try {\n // Get current tool_results\n const result = await state.storage.sql.exec(\n `SELECT tool_results FROM logs WHERE id = ?1`,\n parentLogId\n );\n const rows = result.toArray();\n const currentToolResults = rows[0]?.tool_results;\n\n // Parse existing tool_results or create new array\n let toolResultsArray: Array<{\n tool_call_id: string;\n tool_name: string;\n content: string;\n status: string;\n timestamp: number;\n }> = [];\n\n if (currentToolResults) {\n try {\n toolResultsArray = JSON.parse(currentToolResults as string);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Add new tool result\n toolResultsArray.push({\n tool_call_id: call.id,\n tool_name: call.function.name,\n content: String(message.content ?? \"\"),\n status: processedResult.status,\n timestamp: Date.now(),\n });\n\n // Update log with new tool_results\n await state.storage.sql.exec(\n `UPDATE logs SET tool_results = ?1 WHERE id = ?2`,\n JSON.stringify(toolResultsArray),\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n tool_results: JSON.stringify(toolResultsArray),\n },\n });\n }\n } catch (logError) {\n // Best-effort - don't fail if log update fails\n console.error(\"Failed to update log with tool result:\", logError);\n }\n }\n\n // Broadcast message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n // Stream content if successful\n if (processedResult.status === \"success\" && processedResult.result) {\n state.stream.sendContent(`\\n[Tool: ${call.function.name}] ${processedResult.result}\\n`);\n }\n\n // Add to message history (always do this, even for child prompts - they need their own history)\n state.messageHistory.push(message);\n } catch (error) {\n console.error(\"Error storing tool result:\", error);\n // Log storage error to database\n await this.logError(state, error, `storeToolResult:${call.function.name}`);\n }\n }\n\n /**\n * Store tool error as a message in the database\n */\n private static async storeToolError(\n call: ToolCall,\n error: Error,\n state: FlowState\n ): Promise<void> {\n const toolMessageId = crypto.randomUUID();\n\n const result: ToolResult = {\n status: \"error\",\n error: error.message,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n }\n\n /**\n * Log tool execution error by updating the parent log (best-effort)\n * Instead of creating a new log entry, updates the parent LLM request log with the error\n */\n private static async logError(\n state: FlowState,\n error: unknown,\n toolName: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Get parent log ID from state if available\n const parentLogId = state.currentLogId || null;\n\n if (!parentLogId) {\n // No parent log to update, log to console only\n console.error(`Tool error (${toolName}):`, errorMessage);\n return;\n }\n\n // Format error with stack trace\n const fullError = `Tool \"${toolName}\" failed: ${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`;\n\n // Update the parent log with the error information\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n error = ?1,\n error_type = ?2\n WHERE id = ?3\n `,\n fullError,\n \"tool_execution_error\",\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n error: fullError,\n error_type: \"tool_execution_error\",\n },\n });\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to update parent log with tool error:\", logError);\n }\n }\n\n /**\n * Validate arguments against a JSON Schema\n * Returns error message if invalid, null if valid\n */\n private static validateJsonSchema(\n data: any,\n schema: Record<string, any>\n ): string | null {\n // Basic JSON Schema validation\n // This is a simple implementation - for production, use a proper JSON Schema validator\n\n if (schema.type === \"object\" && schema.properties) {\n // Check required fields\n if (schema.required && Array.isArray(schema.required)) {\n for (const field of schema.required) {\n if (!(field in data)) {\n return `Missing required field: ${field}`;\n }\n }\n }\n\n // Validate each property\n for (const [key, propSchema] of Object.entries(\n schema.properties as Record<string, any>\n )) {\n if (key in data) {\n const value = data[key];\n const expectedType = propSchema.type;\n\n // Type checking\n if (expectedType === \"string\" && typeof value !== \"string\") {\n return `Field ${key} must be a string`;\n }\n if (expectedType === \"number\" && typeof value !== \"number\") {\n return `Field ${key} must be a number`;\n }\n if (expectedType === \"boolean\" && typeof value !== \"boolean\") {\n return `Field ${key} must be a boolean`;\n }\n if (expectedType === \"array\" && !Array.isArray(value)) {\n return `Field ${key} must be an array`;\n }\n if (\n expectedType === \"object\" &&\n (typeof value !== \"object\" || value === null)\n ) {\n return `Field ${key} must be an object`;\n }\n }\n }\n }\n\n return null; // Valid\n }\n\n /**\n * Interpolate prompt segments with arguments\n * Replaces variable segments with their values from args\n * Converts segments array to final string prompt\n */\n private static async interpolatePrompt(\n promptJson: string,\n args: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n try {\n const segments = JSON.parse(promptJson) as Array<{\n type: string;\n value?: string;\n id?: string;\n label?: string;\n }>;\n\n const results: string[] = [];\n\n for (const segment of segments) {\n if (segment.type === \"string\") {\n // Regular string segment - add as-is\n results.push(segment.value || \"\");\n } else if (segment.type === \"variable\") {\n // Variable segment - replace with value from args\n const variableValue = args[segment.value || \"\"];\n if (variableValue !== undefined) {\n results.push(\n typeof variableValue === \"string\"\n ? variableValue\n : JSON.stringify(variableValue)\n );\n } else {\n // Variable not provided in args - keep placeholder or skip\n results.push(`{{${segment.value}}}`);\n }\n } else if (segment.type === \"prompt\") {\n // Load and interpolate referenced prompt from TypeScript config\n try {\n const promptName = segment.id;\n const promptDef = await state.thread.instance.loadPrompt(promptName!);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n results.push(`[Prompt not found: ${segment.label || promptName}]`);\n } else {\n // For TypeScript-defined prompts, the prompt is a plain string\n // (not JSON segments like the old D1 format)\n // Recursively interpolate variables in the prompt string\n let promptText = promptDef.prompt;\n\n // Replace {{variable}} patterns with args values\n promptText = promptText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, varName: string) => {\n const value = args[varName];\n if (value !== undefined) {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n return match; // Keep placeholder if not in args\n });\n\n results.push(promptText);\n }\n } catch (error) {\n console.error(`Error loading prompt ${segment.id}:`, error);\n results.push(`[Error loading prompt: ${segment.label || segment.id}]`);\n }\n }\n }\n\n return results.join(\"\");\n } catch (error) {\n // If parsing fails, treat as plain string\n console.error(\"Error parsing prompt segments:\", error);\n return promptJson;\n }\n }\n\n /**\n * Remove a tool call from message history and database\n * This is called when a hook returns null to completely remove the tool call\n */\n private static async removeToolCallFromHistory(\n call: ToolCall,\n state: FlowState\n ): Promise<void> {\n try {\n // Find the message containing this tool call in the message history\n const messageIndex = state.messageHistory.findIndex(\n (msg) => {\n if (!msg.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n return toolCalls.some((tc: ToolCall) => tc.id === call.id);\n } catch {\n return false;\n }\n }\n );\n\n if (messageIndex === -1) {\n console.warn(`[ToolExecutor] Could not find message containing tool call ${call.id}`);\n return;\n }\n\n const message = state.messageHistory[messageIndex];\n const toolCalls = JSON.parse(message.tool_calls!);\n\n // If this message has only one tool call, delete the entire message\n if (toolCalls.length === 1) {\n // Remove from message history\n state.messageHistory.splice(messageIndex, 1);\n\n // Remove from database (now includes sub-prompts)\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n message.id\n );\n\n } else {\n // If multiple tool calls, just remove this one from the tool_calls array\n const updatedToolCalls = toolCalls.filter((tc: ToolCall) => tc.id !== call.id);\n message.tool_calls = JSON.stringify(updatedToolCalls);\n\n // Update in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `UPDATE messages SET tool_calls = ? WHERE id = ?`,\n message.tool_calls,\n message.id\n );\n\n }\n } catch (error) {\n console.error(`[ToolExecutor] Error removing tool call from history:`, error);\n }\n }\n}\n","import type {\n Agent,\n FlowState,\n FlowResult,\n Message,\n RequestContext,\n EmitLog,\n LogData,\n ThreadInstance,\n ThreadMetadata,\n ToolCall,\n ToolResult,\n} from \"./types\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { MAX_TURNS, TIMESTAMP_MULTIPLIER } from \"./types\";\nimport { StreamManager } from \"./StreamManager\";\nimport { LLMRequest } from \"./LLMRequest\";\nimport { ToolExecutor } from \"./ToolExecutor\";\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Core orchestration engine for agent execution\n * Manages the main agentic loop with turn-based execution\n */\nexport class FlowEngine {\n /**\n * Main execution entry point\n * Executes an agent conversation until stopped or max turns reached\n *\n * By default, returns immediately with the stream while execution continues in background.\n * Set awaitCompletion: true to wait for all turns and database writes to complete (required for sub-prompts).\n *\n * @param stateInput - Partial FlowState object with required fields\n * @param awaitCompletion - If true, awaits full execution completion before returning (default: false)\n */\n static async execute(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n },\n awaitCompletion: boolean = false\n ): Promise<FlowResult> {\n // Initialize state from partial input\n // All optional properties (emitLog, parentLogId, etc.) are now in FlowState interface\n const state = await this.initializeState(stateInput);\n\n if (awaitCompletion) {\n // Wait for execution to complete (for sub-prompts to ensure serial execution)\n try {\n await this.executeAsync(state, state.threadId);\n } catch (error) {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n throw error; // Re-throw for caller to handle\n }\n } else {\n // Start execution in background (default behavior for top-level execution)\n this.executeAsync(state, state.threadId).catch(async (error) => {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n });\n }\n\n // Return immediately with the stream\n return {\n messages: state.messageHistory,\n stopped: state.stopped,\n stoppedBy: state.stoppedBy,\n turnCount: state.turnCount,\n stream: state.stream.httpStream,\n };\n }\n\n /**\n * Execute the agentic loop asynchronously\n * This runs in the background while the stream is being consumed\n */\n private static async executeAsync(\n state: FlowState,\n threadId: string\n ): Promise<void> {\n // Main agentic loop\n while (state.turnCount < MAX_TURNS && !state.stopped && !state.abortController?.signal.aborted) {\n\n try {\n // Check if abort was requested\n if (state.abortController?.signal.aborted) {\n // Create a system message to indicate interruption\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Run before hook\n let interruptionMessage: Message = {\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n };\n\n interruptionMessage = await this.runBeforeCreateMessageHook(state, interruptionMessage) as Message;\n\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status) VALUES (?, ?, ?, ?, ?)`,\n interruptionMessage.id,\n interruptionMessage.role,\n interruptionMessage.content,\n interruptionMessage.created_at,\n interruptionMessage.status\n );\n\n // Run after hook\n await this.runAfterCreateMessageHook(state, interruptionMessage);\n\n // Broadcast the interruption message\n if (state.emitMessage) {\n state.emitMessage({\n id: interruptionMessage.id,\n role: interruptionMessage.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: interruptionMessage.content,\n created_at: interruptionMessage.created_at,\n status: interruptionMessage.status,\n });\n }\n\n state.emitTelemetry?.({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n state.stopped = true;\n break;\n }\n\n await this.executeTurn(state);\n state.turnCount++;\n\n\n // Sub-prompts execute as one-shot: make one LLM request, execute tools, return\n // Don't play multiple turns even if tools fail\n // Check if this is a sub-prompt by presence of parentMessageId\n if (state.parentMessageId !== undefined) {\n state.stopped = true;\n break;\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof Error &&\n (error.name === \"AbortError\" || error.message.includes(\"aborted\"));\n\n if (isAbortError) {\n // Interruption message already created by stop() method\n state.stopped = true;\n break;\n }\n\n // Handle other errors\n console.error(`Error in turn ${state.turnCount}:`, error);\n\n // Log error to database\n await this.logError(\n state,\n error,\n \"turn_execution_error\",\n `Turn ${state.turnCount}, Side ${state.currentSide}`\n );\n\n // Send error message to HTTP stream\n const errorMessage = error instanceof Error ? error.message : String(error);\n state.stream.sendContent(`\\n\\n[ERROR] ${errorMessage}\\n`);\n\n // Send error telemetry\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Error: ${errorMessage}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n // Stop execution on fatal error\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n break;\n }\n }\n\n // Check if we hit max turns\n if (state.turnCount >= MAX_TURNS && !state.stopped) {\n console.warn(`Thread ${threadId} reached maximum turns (${MAX_TURNS})`);\n\n // Log to database\n await this.logError(\n state,\n new Error(`Thread reached maximum turns (${MAX_TURNS})`),\n \"max_turns_reached\",\n `Thread ${threadId}`\n );\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Maximum turns reached\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Close streams\n await state.stream.close();\n }\n\n /**\n * Load prompts from TypeScript configs via virtual modules.\n *\n * Agent config is already loaded by DurableThread, so we just need to\n * load the referenced prompts.\n */\n private static async loadAgentAndPrompts(\n agentConfig: Agent,\n thread: { instance: ThreadInstance; metadata: ThreadMetadata }\n ): Promise<{\n agentConfig: Agent;\n sideAPrompt: import(\"./types\").PromptData;\n sideBPrompt: import(\"./types\").PromptData | null;\n }> {\n // Load side A prompt (always required)\n const sideAPromptName = agentConfig.side_a_agent_prompt;\n if (!sideAPromptName) {\n throw new Error(`Agent ${agentConfig.title} missing side_a_agent_prompt`);\n }\n\n const sideAPromptDef = await thread.instance.loadPrompt(sideAPromptName);\n\n // Convert PromptDefinition to PromptData format expected by runtime\n const sideAPrompt: import(\"./types\").PromptData = {\n id: sideAPromptName,\n name: sideAPromptDef.name,\n tool_description: sideAPromptDef.toolDescription,\n prompt: sideAPromptDef.prompt,\n model: sideAPromptDef.model,\n include_chat: sideAPromptDef.includeChat ?? false,\n include_past_tools: sideAPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideAPromptDef.parallelToolCalls ?? false,\n tool_choice: sideAPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideAPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideAPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideAPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideAPromptDef.reasoning?.include ?? false,\n before_tool: sideAPromptDef.beforeTool ?? null,\n after_tool: sideAPromptDef.afterTool ?? null,\n _tools: sideAPromptDef.tools ?? [],\n _handoffAgents: sideAPromptDef.handoffAgents ?? [],\n _requiredSchema: sideAPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n\n // Load side B prompt (only for dual_ai agents)\n let sideBPrompt: import(\"./types\").PromptData | null = null;\n const sideBPromptName = agentConfig.side_b_agent_prompt;\n if (sideBPromptName) {\n const sideBPromptDef = await thread.instance.loadPrompt(sideBPromptName);\n\n sideBPrompt = {\n id: sideBPromptName,\n name: sideBPromptDef.name,\n tool_description: sideBPromptDef.toolDescription,\n prompt: sideBPromptDef.prompt,\n model: sideBPromptDef.model,\n include_chat: sideBPromptDef.includeChat ?? false,\n include_past_tools: sideBPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideBPromptDef.parallelToolCalls ?? false,\n tool_choice: sideBPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideBPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideBPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideBPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideBPromptDef.reasoning?.include ?? false,\n before_tool: sideBPromptDef.beforeTool ?? null,\n after_tool: sideBPromptDef.afterTool ?? null,\n _tools: sideBPromptDef.tools ?? [],\n _handoffAgents: sideBPromptDef.handoffAgents ?? [],\n _requiredSchema: sideBPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n }\n\n return { agentConfig, sideAPrompt, sideBPrompt };\n }\n\n /**\n * Initialize the flow state from partial input\n * Merges provided fields with defaults and loaded data\n */\n private static async initializeState(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n }\n ): Promise<FlowState> {\n // Load prompts for the provided agent config via virtual modules\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n stateInput.agentConfig,\n stateInput.thread\n );\n\n // Create stream manager if not provided\n const stream = stateInput.stream || new StreamManager();\n\n // Build complete state with defaults\n const state: Omit<FlowState, 'rootState'> & { rootState?: FlowState } = {\n threadId: stateInput.threadId,\n flowId: stateInput.flowId || crypto.randomUUID(),\n thread: stateInput.thread,\n agentConfig: stateInput.agentConfig,\n currentSide: stateInput.currentSide || \"a\",\n prompts: {\n sideA: sideAPrompt,\n sideB: sideBPrompt,\n },\n prompt: (stateInput.currentSide || \"a\") === \"a\" ? sideAPrompt : (sideBPrompt || sideAPrompt),\n turnCount: stateInput.turnCount || 0,\n sideATurnCount: stateInput.sideATurnCount || 0,\n sideBTurnCount: stateInput.sideBTurnCount || 0,\n stopped: stateInput.stopped || false,\n stoppedBy: stateInput.stoppedBy,\n messageHistory: [],\n sequence: stateInput.sequence || {\n queue: [],\n isHandling: false,\n },\n active: stateInput.active || {\n tool: \"\",\n args: {},\n retries: 0,\n reasons: [],\n },\n queue: stateInput.queue || [],\n stream,\n context: stateInput.context || {},\n retryCount: stateInput.retryCount || 0,\n retryReason: stateInput.retryReason,\n storage: stateInput.storage,\n env: stateInput.env,\n // Preserve runtime properties for nested execution and telemetry\n emitLog: stateInput.emitLog,\n emitMessage: stateInput.emitMessage,\n emitMessageChunk: stateInput.emitMessageChunk,\n emitTelemetry: stateInput.emitTelemetry,\n emitEvent: stateInput.emitEvent,\n rootMessageId: stateInput.rootMessageId,\n parentLogId: stateInput.parentLogId,\n currentLogId: stateInput.currentLogId,\n parentMessageId: stateInput.parentMessageId,\n depth: stateInput.depth ?? 0, // Default to 0 for top-level prompts\n pendingMessageId: stateInput.pendingMessageId,\n abortController: stateInput.abortController,\n allowedTools: stateInput.allowedTools,\n extraMessages: stateInput.extraMessages || [],\n };\n if (stateInput.rootState) {\n state.rootState = stateInput.rootState;\n } else {\n state.rootState = state as unknown as FlowState;\n }\n return state as FlowState;\n }\n\n /**\n * Execute a single turn\n */\n private static async executeTurn(state: FlowState): Promise<void> {\n // Check the persistent stop flag from DurableThread (most reliable)\n if (await state.thread.instance.shouldStop()) {\n throw new Error(\"aborted\");\n }\n\n // Check abort signal before starting turn\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // Check per-side max turns before executing\n const maxTurns = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_turns\n : state.agentConfig.side_b_max_turns;\n\n const currentSideTurnCount = state.currentSide === \"a\"\n ? state.sideATurnCount\n : state.sideBTurnCount;\n\n if (maxTurns !== null && currentSideTurnCount >= maxTurns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Side ${state.currentSide} reached max turns (${maxTurns})`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check max_session_turns for dual_ai agents (global exchange limit)\n if (\n state.agentConfig.type === \"dual_ai\" &&\n state.agentConfig.max_session_turns !== null\n ) {\n // Calculate completed exchanges (both sides must have spoken for a complete exchange)\n const completedExchanges = Math.min(state.sideATurnCount, state.sideBTurnCount);\n\n if (completedExchanges >= state.agentConfig.max_session_turns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Reached max session turns (${state.agentConfig.max_session_turns} exchanges)`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n }\n\n // Increment per-side turn count\n if (state.currentSide === \"a\") {\n state.sideATurnCount++;\n } else {\n state.sideBTurnCount++;\n }\n\n // Send turn started telemetry\n state.emitTelemetry?.({\n type: \"turn_started\",\n turn: state.turnCount,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n state.messageHistory = await this.loadMessageHistory(state);\n\n // 1. Assemble context for this turn\n const context = await this.assembleContext(state);\n\n // Store allowed tools in state for validation during tool execution\n state.allowedTools = context.tools;\n\n // 1.25. Run prefilter hook on messages (if it exists)\n // This allows developers to modify the message history before sending to LLM\n // The filtered messages will be logged, so devs can see what was actually sent\n context.messages = await this.runPrefilterLLMHistoryHook(state, context.messages);\n\n // 1.5. Create pending message BEFORE LLM request\n const pendingMessageId = await this.createPendingMessage(state);\n\n // Store pending message ID for streaming chunk broadcasts\n state.pendingMessageId = pendingMessageId;\n\n // 2. Execute LLM request with retry/fallback logic\n let responseStatus: \"completed\" | \"failed\" = \"completed\";\n let response: { content: string | null; tool_calls?: any[] };\n let logId: string;\n\n try {\n const result = await LLMRequest.execute(context, state);\n response = result.response;\n logId = result.logId;\n } catch (error) {\n // LLM request failed - update pending message to failed status\n responseStatus = \"failed\";\n await this.updateMessageStatus(pendingMessageId, \"failed\", state);\n throw error; // Re-throw to be handled by executeAsync\n }\n\n // Check stop flag BEFORE storing response - discard if stopped\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n\n // Delete the pending message - don't store the response\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n pendingMessageId\n );\n\n // Mark log as interrupted\n await state.storage.sql.exec(\n `UPDATE logs SET error = ?, error_type = ? WHERE id = ?`,\n \"Interrupted by user\",\n \"user_interrupted\",\n logId\n );\n\n throw new Error(\"aborted\");\n }\n\n // Store the log ID for tool error tracking\n state.currentLogId = logId;\n\n // 2.5. Check for stop-tool with response parameter and extract it as content\n this.extractStopToolResponse(state, response);\n\n // 3. Update pending message with response\n await this.updateMessage(pendingMessageId, response, responseStatus, state);\n\n // 4. Execute tools if present\n if (response.tool_calls && response.tool_calls.length > 0) {\n await ToolExecutor.executeSequence(state, response.tool_calls);\n }\n\n // Check stop flag and abort signal after tool execution\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 5. Check stop condition\n this.checkStopCondition(state, response);\n\n // Clear the log ID and pending message ID after turn is complete\n state.currentLogId = null;\n state.pendingMessageId = undefined;\n\n // 5.25. Handle pending agent handoff (if any)\n // IMPORTANT: Check handoff BEFORE forcedNextSide because:\n // - Agent handoffs change the entire agent context\n // - forceTurn after a handoff should apply to the NEW agent\n // - If we check forcedNextSide first, the handoff is skipped due to early return\n if (state.pendingHandoff) {\n // If there's also a pending force turn, preserve it for after the handoff\n // The forcedNextSide will be applied in the next iteration after the new agent loads\n await this.executeHandoff(state);\n // After handoff, continue loop - new agent will execute immediately\n // Do NOT switch sides or increment turn count - handoff doesn't count as a turn\n return;\n }\n\n // 5.5. Handle forced turn if set\n if (state.forcedNextSide) {\n const forcedSide = state.forcedNextSide.substring(5) as 'a' | 'b';\n\n // Special case: forcing side_b in ai_human agent means wait for human input\n if (state.agentConfig.type === \"ai_human\" && forcedSide === \"b\") {\n state.stopped = true;\n state.stoppedBy = \"a\"; // AI stopped to let human respond\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Forced turn to human (side_b)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n // Force current side to continue (override stop condition)\n else if (forcedSide === state.currentSide) {\n state.stopped = false; // Clear any stop flag\n state.stoppedBy = undefined;\n }\n // Force switch to other side\n else {\n state.currentSide = forcedSide; // Override normal switching\n state.stopped = false; // Ensure we continue execution\n\n // Update prompt reference to match forced side\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n // Clear the forced turn flag after applying it\n state.forcedNextSide = undefined;\n\n // Return early to skip normal side switching logic\n return;\n }\n\n // Check abort signal before switching sides (critical to prevent next turn)\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 6. Switch sides if dual_ai and not stopped\n if (state.agentConfig.type === \"dual_ai\" && !state.stopped) {\n this.switchSides(state);\n }\n\n // Send turn completed telemetry\n state.emitTelemetry?.({\n type: \"turn_completed\",\n turn: state.turnCount,\n stopped: state.stopped,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Execute agent handoff - switch to a new AI + Human agent\n * Updates the thread's agent_name and loads the new agent config\n */\n private static async executeHandoff(state: FlowState): Promise<void> {\n if (!state.pendingHandoff) {\n return;\n }\n\n const newAgentName = state.pendingHandoff.agentId; // Now contains agent name\n\n try {\n // Load new agent definition from TypeScript config\n const newAgentDef = await state.thread.instance.loadAgent(newAgentName);\n\n // Convert AgentDefinition to Agent type expected by runtime\n const agentConfig: Agent = {\n id: newAgentName,\n title: newAgentDef.title || newAgentName,\n type: newAgentDef.type,\n max_session_turns: newAgentDef.maxSessionTurns,\n side_a_label: newAgentDef.sideA?.label,\n side_a_agent_prompt: newAgentDef.sideA?.prompt,\n side_a_stop_on_response: newAgentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: newAgentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: newAgentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: newAgentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: newAgentDef.sideA?.endConversationTool,\n side_b_label: newAgentDef.sideB?.label,\n side_b_agent_prompt: newAgentDef.sideB?.prompt,\n side_b_stop_on_response: newAgentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: newAgentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: newAgentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: newAgentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: newAgentDef.sideB?.endConversationTool,\n };\n\n // Load prompts for new agent\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n agentConfig,\n state.thread\n );\n\n // Persist the agent change to the threads table in DurableAgentBuilder\n try {\n const agentBuilderStub = state.env.AGENT_BUILDER.get(\n state.env.AGENT_BUILDER.idFromName(\"singleton\")\n );\n await agentBuilderStub.updateThreadAgent(state.threadId, newAgentName);\n } catch (persistError) {\n console.error(\"Error persisting handoff to threads table:\", persistError);\n // Continue with handoff even if persistence fails - the in-memory state is correct\n }\n\n // Update state with new agent config and prompts\n state.agentConfig = agentConfig;\n state.prompts.sideA = sideAPrompt;\n state.prompts.sideB = sideBPrompt;\n state.extraMessages = [];\n\n // Reset to Side A and update current prompt reference\n state.currentSide = \"a\";\n state.prompt = state.prompts.sideA;\n\n // Clear pending handoff\n state.pendingHandoff = undefined;\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"agent_handoff\",\n new_agent_id: newAgentName,\n new_agent_title: state.agentConfig.title,\n timestamp: Date.now(),\n } as any); // Cast to any since agent_handoff is not in TelemetryEvent type yet\n } catch (error) {\n console.error(\"Error executing handoff:\", error);\n await this.logError(state, error, \"handoff_execution_error\", `Handoff to agent ${newAgentName}`);\n throw error;\n }\n }\n\n /**\n * Assemble context for LLM request\n */\n private static async assembleContext(\n state: FlowState\n ): Promise<RequestContext> {\n const messages: RequestContext[\"messages\"] = [];\n\n // Use pre-loaded prompt configuration from state\n const model = state.prompt.model;\n const promptName = state.prompt.name;\n const parallelToolCalls = state.prompt.parallel_tool_calls;\n const toolChoice = state.prompt.tool_choice;\n const reasoningEffort = state.prompt.reasoning_effort;\n const reasoningMaxTokens = state.prompt.reasoning_max_tokens;\n const reasoningExclude = state.prompt.reasoning_exclude;\n const includeReasoning = state.prompt.include_reasoning;\n const includePastTools = state.prompt.include_past_tools ?? true;\n\n // Add agent prompt content to messages\n const promptContent = await this.interpolatePrompt(\n state.prompt.prompt,\n state.context || {},\n state\n );\n\n const systemPromptText = promptContent; // Store for logging\n\n messages.push({\n role: \"system\",\n content: promptContent,\n });\n\n // Filter out pending messages - they should NEVER be sent to the LLM\n const completedMessages = state.messageHistory.filter(\n msg => msg.status !== \"pending\"\n );\n\n // First pass: collect all tool_call_ids that have responses\n const toolCallsWithResponses = new Set<string>();\n for (const msg of completedMessages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolCallsWithResponses.add(msg.tool_call_id);\n }\n }\n\n // Second pass: add messages and inject error responses for missing tool results\n // For dual_ai agents: Transform roles based on perspective\n // - Current side's messages should be labeled \"assistant\"\n // - Opposing side's messages should be labeled \"user\"\n // - System messages remain unchanged\n // - Tool messages are filtered by side (only show current side's tool calls)\n for (const msg of completedMessages) {\n // IMPORTANT: Roles encode side information\n // - role=\"assistant\" = Side A messages\n // - role=\"user\" = Side B messages\n // This allows us to filter tool calls without a separate \"side\" column\n\n // Skip ALL tool messages when includePastTools is false\n if (!includePastTools && msg.role === \"tool\") {\n continue;\n }\n\n // Filter tool messages by side - each AI should only see its own tool calls\n if (state.agentConfig.type === \"dual_ai\" && msg.role === \"tool\" && msg.tool_call_id) {\n // Find the parent message that made this tool call\n const parentMsg = completedMessages.find(m => {\n if (!m.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(m.tool_calls);\n return toolCalls.some((tc: any) => tc.id === msg.tool_call_id);\n } catch {\n return false;\n }\n });\n\n if (parentMsg) {\n // Determine which side made this tool call based on parent message role\n // role=\"assistant\" means Side A made the call\n // role=\"user\" means Side B made the call\n const toolCallSide = parentMsg.role === \"assistant\" ? \"a\" : \"b\";\n\n // Skip tool calls from the opposing side\n if (toolCallSide !== state.currentSide) {\n continue; // Don't include this tool message\n }\n }\n }\n\n let role = msg.role;\n\n // Transform role based on perspective for dual_ai agents\n if (state.agentConfig.type === \"dual_ai\") {\n if (msg.role === \"assistant\") {\n // Message is from side A - keep as \"assistant\" if current side is A, else \"user\"\n role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n } else if (msg.role === \"user\") {\n // Message is from side B - keep as \"user\" if current side is A, else \"assistant\"\n role = state.currentSide === \"a\" ? \"user\" : \"assistant\";\n }\n // system and tool roles remain unchanged\n }\n\n // Prepare message content\n const messageContent = msg.content || undefined;\n\n // When includePastTools is false, strip tool_calls from messages\n const messageToAdd: any = {\n role,\n content: messageContent,\n tool_calls: includePastTools && msg.tool_calls ? JSON.parse(msg.tool_calls) : undefined,\n tool_call_id: includePastTools && msg.tool_call_id ? msg.tool_call_id : undefined,\n name: msg.name || undefined,\n };\n\n // Add reasoning if present and includeReasoning is enabled\n // Convert reasoning_content to synthetic detail, combine with structured reasoning\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (includeReasoning) {\n const reasoningDetailsArray: any[] = [];\n\n // If we have reasoning_content (accumulated text), add it as a single text detail\n if (msg.reasoning_content) {\n reasoningDetailsArray.push({\n type: \"reasoning.text\",\n text: msg.reasoning_content\n });\n }\n\n // Add any non-text reasoning_details (summaries, encrypted, etc.)\n if (msg.reasoning_details) {\n try {\n const parsedDetails = JSON.parse(msg.reasoning_details);\n reasoningDetailsArray.push(...parsedDetails);\n } catch (e) {\n console.error(`[FlowEngine] Failed to parse reasoning_details for message ${msg.id}:`, e);\n }\n }\n\n // Only add reasoning_details if we have any\n if (reasoningDetailsArray.length > 0) {\n messageToAdd.reasoning_details = reasoningDetailsArray;\n }\n }\n\n // If this is an assistant message with tool_calls, filter out ones without responses\n // Use the ORIGINAL role from storage to identify tool calls\n // Skip this logic if includePastTools is false (tool_calls already stripped)\n if (includePastTools && msg.role === \"assistant\" && msg.tool_calls) {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((toolCall: any) =>\n toolCallsWithResponses.has(toolCall.id)\n );\n\n // Only include the message if it has content or matched tool calls\n if (msg.content || matchedToolCalls.length > 0) {\n // Update the message with filtered tool_calls\n if (matchedToolCalls.length === 0) {\n // Remove tool_calls field if no matches\n delete messageToAdd.tool_calls;\n } else if (matchedToolCalls.length !== toolCalls.length) {\n // Update with filtered list if some were removed\n messageToAdd.tool_calls = matchedToolCalls;\n }\n // else: all tool calls have responses, keep as-is\n\n messages.push(messageToAdd);\n } else {\n // Skip message entirely if it has no content and no matched tool calls\n console.warn(`[FlowEngine] Skipping assistant message ${msg.id} - no content and no tool calls with responses`);\n }\n } else {\n // Not an assistant message with tool_calls (or includePastTools is false), include as-is\n messages.push(messageToAdd);\n }\n }\n\n // Inject turn budget awareness system message at the bottom to preserve prompt cache\n const maxTurns = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_turns\n : state.agentConfig.side_b_max_turns;\n\n if (maxTurns !== null) {\n const currentSideTurnCount = state.currentSide === \"a\"\n ? state.sideATurnCount\n : state.sideBTurnCount;\n\n const turnsRemaining = maxTurns - currentSideTurnCount;\n\n // Note: currentSideTurnCount has already been incremented in executeTurn(), so we don't add 1\n let budgetMessage: string;\n\n if (turnsRemaining === 0) {\n budgetMessage = '[TURN BUDGET] ⚠️ CRITICAL: You must complete your task NOW or an error will be thrown. This is your final turn.';\n } else if (turnsRemaining === 1) {\n budgetMessage = '[TURN BUDGET] ⚠️ CRITICAL: Only 1 turn available after this before an error will be thrown. Reach completion immediately.';\n } else if (turnsRemaining <= 3) {\n budgetMessage = `[TURN BUDGET] ⚠️ WARNING: Only ${turnsRemaining} turns available before an error will be thrown. Reach completion as soon as possible.`;\n } else {\n budgetMessage = `[TURN BUDGET] ${turnsRemaining} turns available before an error will be thrown. Work efficiently toward completion.`;\n }\n\n messages.push({\n role: \"system\",\n content: budgetMessage,\n });\n }\n\n // Get tools attached to this specific prompt (not all available tools)\n const tools = await this.getToolsForPrompt(state, state.prompt);\n\n // Handle tool_choice: convert \"function\" to object format if needed\n let finalToolChoice: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } } | undefined;\n if (toolChoice === \"function\" && tools.length === 1) {\n // Convert \"function\" to object format with the single tool's name\n finalToolChoice = {\n type: \"function\",\n function: {\n name: tools[0].function.name\n }\n };\n } else if (toolChoice && toolChoice !== \"function\") {\n // Use string value for auto/none/required\n finalToolChoice = toolChoice;\n }\n\n // Build reasoning configuration if either field is set (implicit enable)\n let reasoning: RequestContext[\"reasoning\"] | undefined;\n if (reasoningEffort || reasoningMaxTokens) {\n reasoning = {\n effort: reasoningEffort ?? undefined, // Convert null to undefined\n max_tokens: reasoningMaxTokens ?? undefined,\n exclude: reasoningExclude,\n };\n }\n\n return {\n messages,\n model,\n tools,\n stream: true,\n systemPrompt: systemPromptText,\n promptName: promptName,\n // Use parentLogId from state if this is a chained prompt, otherwise use currentLogId for nested tool calls\n parentLogId: state.parentLogId || state.currentLogId || null,\n // Retries now apply to all prompts (top-level and sub-prompts), only for provider errors\n parallel_tool_calls: parallelToolCalls,\n tool_choice: finalToolChoice,\n reasoning: reasoning,\n };\n }\n\n /**\n * Interpolate prompt template with context data\n * Prompts can be:\n * 1. Plain strings - returned as-is (with legacy {{var}} interpolation)\n * 2. StructuredPrompt arrays - array of {type, value/id} objects\n * 3. JSON string of a StructuredPrompt array - legacy format, parsed first\n */\n private static async interpolatePrompt(\n promptTemplate: string | any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n // If already an array (StructuredPrompt), process it directly\n if (Array.isArray(promptTemplate)) {\n return this.processPromptParts(promptTemplate, context, state);\n }\n\n // If it's a string, check if it's JSON (legacy format) or plain text\n if (typeof promptTemplate === \"string\") {\n // Try to parse as JSON array (legacy format)\n try {\n const parsed = JSON.parse(promptTemplate);\n if (Array.isArray(parsed)) {\n return this.processPromptParts(parsed, context, state);\n }\n // If parsed but not an array, treat as plain string\n return promptTemplate;\n } catch {\n // Not JSON, return as plain string\n return promptTemplate;\n }\n }\n\n // Fallback for unexpected types\n return String(promptTemplate);\n }\n\n /**\n * Process an array of prompt parts into a final string.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt'/'variable')\n */\n private static async processPromptParts(\n parts: any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n const results = await Promise.all(\n parts.map(async (part: any) => {\n // New format: { type: 'text', content: '...' }\n if (part.type === \"text\") {\n return part.content || \"\";\n }\n // New format: { type: 'include', prompt: '...' }\n else if (part.type === \"include\") {\n const promptName = part.prompt;\n return await this.loadAndInterpolatePrompt(promptName, context, state);\n }\n // Legacy format: { type: 'string', value: '...' }\n else if (part.type === \"string\") {\n return part.value || \"\";\n }\n // Legacy format: { type: 'variable', value: '...' }\n else if (part.type === \"variable\") {\n const value = context[part.value];\n if (value === undefined) {\n console.warn(`Missing variable in context: ${part.value}`);\n return `{{${part.value}}}`;\n }\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n // Legacy format: { type: 'prompt', id: '...' }\n else if (part.type === \"prompt\") {\n const promptName = part.id;\n return await this.loadAndInterpolatePrompt(promptName, context, state, part.label);\n }\n return \"\";\n })\n );\n\n return results.join(\"\");\n }\n\n /**\n * Load a referenced prompt and interpolate it\n */\n private static async loadAndInterpolatePrompt(\n promptName: string,\n context: Record<string, any>,\n state: FlowState,\n label?: string\n ): Promise<string> {\n try {\n const promptDef = await state.thread.instance.loadPrompt(promptName);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n return `[Prompt not found: ${label || promptName}]`;\n }\n\n // Recursively interpolate the referenced prompt\n return await this.interpolatePrompt(\n promptDef.prompt,\n context,\n state\n );\n } catch (error) {\n console.error(`Error loading prompt ${promptName}:`, error);\n return `[Error loading prompt: ${label || promptName}]`;\n }\n }\n\n /**\n * Get tools attached to a specific prompt from PromptData._tools\n * Returns only the tools that are actually configured for this prompt\n * Also includes handoff agents from PromptData._handoffAgents\n */\n private static async getToolsForPrompt(\n state: FlowState,\n promptData: import(\"./types\").PromptData\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tool names from the prompt definition\n const toolConfigs = promptData._tools || [];\n const toolNames = toolConfigs.map((t: any) =>\n typeof t === 'string' ? t : t.name\n );\n\n if (toolNames.length > 0) {\n // Load all available tools (native + prompts + agents)\n const allTools = await this.getAvailableTools(state);\n\n // Filter to only include tools that are in the tools list\n const selectedTools = allTools.filter((tool) =>\n toolNames.includes(tool.function.name)\n );\n\n tools.push(...selectedTools);\n }\n\n // Get handoff agents from the prompt definition\n const handoffAgentNames = promptData._handoffAgents || [];\n\n if (handoffAgentNames.length > 0) {\n // Load each handoff agent from TypeScript config\n for (const agentName of handoffAgentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(agentName);\n\n if (agentDef) {\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || agentName,\n description: agentDef.toolDescription || `Hand off conversation to ${agentDef.title || agentName} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch (error) {\n console.warn(`Failed to load handoff agent ${agentName}:`, error);\n }\n }\n }\n\n return tools;\n } catch (error) {\n console.error(\"Error loading tools for prompt:\", error);\n await this.logError(\n state,\n error,\n \"tool_loading_error\",\n `FlowEngine.getToolsForPrompt (prompt: ${promptData.name})`\n );\n return tools;\n }\n }\n\n /**\n * Get available tools for the current agent\n * Returns tool definitions in OpenAI format\n */\n private static async getAvailableTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // 1. Load native tools from toolsDir\n const nativeTools = await this.loadNativeTools(state);\n tools.push(...nativeTools);\n\n // 2. Load exposed prompts from D1\n const promptTools = await this.loadPromptTools(state);\n tools.push(...promptTools);\n\n // 3. Load exposed agents from D1\n const agentTools = await this.loadAgentTools(state);\n tools.push(...agentTools);\n\n // 4. Check for duplicate tool names and warn\n const toolNameSources = new Map<string, Set<string>>();\n\n // Track sources for each tool name\n for (const tool of nativeTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('native tool');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of promptTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('prompt');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of agentTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('agent');\n toolNameSources.set(tool.function.name, sources);\n }\n\n // Warn about duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n console.warn(\n `[AgentBuilder] Duplicate tool name \"${name}\" detected (sources: ${[...sources].join(', ')}). ` +\n `This may cause unexpected behavior. Consider renaming one of them.`\n );\n }\n }\n } catch (error) {\n console.error(\"Error loading tools:\", error);\n await this.logError(\n state,\n error,\n \"tool_discovery_error\",\n \"FlowEngine.getAvailableTools\"\n );\n }\n\n return tools;\n }\n\n /**\n * Load native tools from toolsDir directory\n */\n private static async loadNativeTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tools from thread instance (user's extended Thread class)\n const toolRegistry = state.thread.instance.tools();\n const { z } = await import(\"zod\");\n\n for (const [toolName, toolLoader] of Object.entries(toolRegistry)) {\n try {\n const [description, argsSchema, _fn] = await toolLoader();\n\n // Convert Zod schema to JSON Schema if present using Zod 4's native toJSONSchema\n let parameters: Record<string, any> | undefined;\n\n if (argsSchema) {\n // Use Zod 4's native toJSONSchema (defaults to draft-2020-12)\n const jsonSchema = z.toJSONSchema(argsSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description,\n parameters,\n },\n });\n } catch (toolError) {\n console.error(`Error loading native tool ${toolName}:`, toolError);\n }\n }\n } catch (error) {\n console.error(\"Error loading native tools registry:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed prompts as tools from TypeScript configs\n */\n private static async loadPromptTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all prompt names - all prompts are exposed as tools\n const promptNames = state.thread.instance.getPromptNames();\n const { z } = await import(\"zod\");\n\n for (const name of promptNames) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(name);\n\n // Build parameters from requiredSchema if present\n let parameters: Record<string, any> | undefined;\n\n if (promptDef.requiredSchema) {\n try {\n // Use Zod 4's native toJSONSchema function\n const jsonSchema = z.toJSONSchema(promptDef.requiredSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n } catch (parseError) {\n console.error(\n `Error converting schema for prompt ${name}:`,\n parseError\n );\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: promptDef.name,\n description: promptDef.toolDescription,\n parameters,\n },\n });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading prompt tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed agents as tools from TypeScript configs\n */\n private static async loadAgentTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all agent names and check which have exposeAsTool\n const agentNames = state.thread.instance.getAgentNames();\n\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n\n if (agentDef.exposeAsTool) {\n // Agent tools accept arbitrary arguments (no strict schema for now)\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || name,\n description: agentDef.toolDescription || `Execute the ${agentDef.title || name} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading agent tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Run the prefilter_llm_history hook if it exists\n * This hook allows developers to modify the message history before sending to LLM\n *\n * @param state - Flow state with execution context\n * @param messages - Messages to prefilter before sending to LLM\n * @returns Processed messages (or original if hook doesn't exist/fails)\n */\n private static async runPrefilterLLMHistoryHook(\n state: FlowState,\n messages: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = state.thread.instance.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['prefilter_llm_history']) {\n return messages; // No hook - return original messages\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['prefilter_llm_history'];\n const hook = await hookLoader();\n\n if (!hook) {\n return messages; // Hook failed to load - return original messages\n }\n\n // Run the hook\n const processedMessages = await hook(state, messages);\n return processedMessages;\n } catch (error) {\n // If the hook throws an error, log it but return the original messages\n console.error('[Hooks] ✗ Error running prefilter_llm_history hook:', error);\n return messages;\n }\n }\n\n /**\n * Run the before_create_message hook if it exists\n * This hook allows developers to modify a message before it's created\n *\n * @param state - Flow state with execution context\n * @param message - Message object to be created\n * @returns Processed message (or original if hook doesn't exist/fails)\n */\n public static async runBeforeCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_create_message']) {\n return message;\n }\n\n const hookLoader = hooksRegistry['before_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return message;\n }\n\n const processedMessage = await hook(state, message);\n return processedMessage;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_create_message hook:', error);\n return message;\n }\n }\n\n /**\n * Run the after_create_message hook if it exists\n * This hook runs after a message is created in the database\n *\n * @param state - Flow state with execution context\n * @param message - The created message object\n */\n public static async runAfterCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_create_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n await hook(state, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_create_message hook:', error);\n }\n }\n\n /**\n * Run the before_update_message hook if it exists\n * This hook allows developers to modify a message before it's updated\n *\n * Generic type preserves the exact shape of the updates object for type safety\n *\n * @param state - Flow state with execution context\n * @param messageId - ID of the message being updated\n * @param updates - Object with fields to update\n * @returns Processed updates (or original if hook doesn't exist/fails)\n */\n public static async runBeforeUpdateMessageHook<T extends Record<string, any>>(\n state: FlowState,\n messageId: string,\n updates: T\n ): Promise<T> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_update_message']) {\n return updates;\n }\n\n const hookLoader = hooksRegistry['before_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return updates;\n }\n\n const processedUpdates = await hook(state, messageId, updates);\n return processedUpdates as T;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_update_message hook:', error);\n return updates;\n }\n }\n\n /**\n * Run the after_update_message hook if it exists\n * This hook runs after a message is updated in the database\n *\n * @param state - Flow state with execution context\n * @param message - Full message object with updated fields\n */\n public static async runAfterUpdateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_update_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n await hook(state, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_update_message hook:', error);\n }\n }\n\n /**\n * Run the before_store_tool_result hook if it exists\n * This hook allows developers to modify tool results before they're stored\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The tool result object to be stored\n * @returns Processed tool result (or original if hook doesn't exist/fails)\n */\n public static async runBeforeStoreToolResultHook(\n state: FlowState,\n toolCall: Record<string, any>,\n toolResult: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_store_tool_result']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['before_store_tool_result'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_store_tool_result hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_success hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The successful tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallSuccessHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_success']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_success'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_success hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_failure hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The failed tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallFailureHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_failure']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_failure'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const processedResult = await hook(state, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_failure hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Create a pending message before LLM request\n * Returns the message ID for later updates\n */\n private static async createPendingMessage(state: FlowState): Promise<string> {\n const messageId = crypto.randomUUID();\n\n // Determine role based on current side\n const role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n\n let message: Message = {\n id: messageId,\n role,\n content: null, // No content yet\n tool_calls: null,\n log_id: null,\n created_at: 0, // Placeholder - will be set just before INSERT\n request_sent_at: 0, // Placeholder - will be set just before INSERT\n response_completed_at: null,\n status: \"pending\",\n };\n\n // Run before_create_message hook\n message = await this.runBeforeCreateMessageHook(state, message) as Message;\n\n // Add hierarchical tracking fields\n message.parent_id = state.parentMessageId || null;\n message.depth = state.depth;\n\n // Set timestamps just before INSERT to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n message.created_at = now;\n message.request_sent_at = now;\n\n // Insert pending message into database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, tool_calls, log_id, created_at,\n request_sent_at, response_completed_at, status, parent_id, depth, reasoning_content\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_calls,\n message.log_id,\n message.created_at,\n message.request_sent_at,\n message.response_completed_at,\n message.status,\n message.parent_id,\n message.depth,\n null // reasoning_content - will be set when message is updated with LLM response\n );\n\n // Run after_create_message hook\n await this.runAfterCreateMessageHook(state, message);\n\n // Add to message history\n state.messageHistory.push(message);\n\n // Broadcast pending message via WebSocket (already skipped for child prompts via emitMessage not being passed)\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n return messageId;\n }\n\n /**\n * Update pending message status (for failures)\n */\n private static async updateMessageStatus(\n messageId: string,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Prepare updates object with explicit type\n let updates: {\n status: \"completed\" | \"failed\";\n response_completed_at: number;\n } = {\n status,\n response_completed_at: now,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET status = ?1, response_completed_at = ?2\n WHERE id = ?3\n `,\n updates.status,\n updates.response_completed_at,\n messageId\n );\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.status = updates.status;\n message.response_completed_at = updates.response_completed_at;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n }\n\n /**\n * Update pending message with LLM response\n */\n private static async updateMessage(\n messageId: string,\n response: { content: string | null; tool_calls?: any[]; reasoning_content?: string | null; reasoning_details?: any[] },\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n // Get the log_id from state (set by LLMRequest.execute)\n const logId = state.currentLogId || null;\n\n // Prepare message data\n let content = response.content;\n const toolCallsJson = response.tool_calls ? JSON.stringify(response.tool_calls) : null;\n const reasoningContent = response.reasoning_content || null;\n const reasoningDetailsJson = response.reasoning_details ? JSON.stringify(response.reasoning_details) : null;\n\n // Run post-process hook if available (trims whitespace, applies custom logic)\n let messageForHook: Message = {\n id: messageId,\n role: state.currentSide === \"a\" ? \"assistant\" : \"user\",\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n created_at: 0, // Will be preserved from original\n request_sent_at: 0, // Will be preserved from original\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n };\n\n // Run before_create_message hook (again, now with actual content)\n // This allows hooks to modify the content before it's stored\n messageForHook = await this.runBeforeCreateMessageHook(state, messageForHook) as Message;\n content = messageForHook.content;\n\n // Prepare updates object with explicit type\n let updates: {\n content: string | null;\n tool_calls: string | null;\n log_id: string | null;\n response_completed_at: number;\n status: \"completed\" | \"failed\";\n reasoning_content: string | null;\n reasoning_details: string | null;\n } = {\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n reasoning_details: reasoningDetailsJson,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Set timestamp just before UPDATE to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n updates.response_completed_at = now;\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET content = ?1, tool_calls = ?2, log_id = ?3,\n response_completed_at = ?4, status = ?5, reasoning_content = ?6,\n reasoning_details = ?7\n WHERE id = ?8\n `,\n updates.content,\n updates.tool_calls,\n updates.log_id,\n updates.response_completed_at,\n updates.status,\n updates.reasoning_content,\n updates.reasoning_details,\n messageId\n );\n\n // Store tool calls in detail table\n if (response.tool_calls) {\n for (const toolCall of response.tool_calls) {\n await state.storage.sql.exec(\n `\n INSERT INTO tool_calls (\n id, message_id, type, function_name, function_arguments, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n `,\n toolCall.id,\n messageId,\n toolCall.type || \"function\",\n toolCall.function.name,\n toolCall.function.arguments,\n now\n );\n }\n }\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.content = content;\n message.tool_calls = toolCallsJson;\n message.log_id = logId;\n message.response_completed_at = now;\n message.status = status;\n message.reasoning_content = reasoningContent;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n\n // Note: Content was already streamed during provider execution (OpenAIProvider.chat, etc.)\n // No need to send it again here - that causes duplicate stream writes and \"stream is closed\" warnings\n }\n\n /**\n * Extract stop-tool response parameter and use as message content\n * This handles the special case where a stop-tool includes a response parameter\n * that should be treated as the message content\n */\n private static extractStopToolResponse(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n if (!response.tool_calls || response.tool_calls.length === 0) {\n return;\n }\n\n // Check if any tool call is a stop-tool with response parameter\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Only process if both stop-tool and response property are configured\n if (!stopTool || !stopToolResponseProperty) {\n return;\n }\n\n // Find the stop-tool call\n const stopToolCall = response.tool_calls.find(\n (call) => call.function.name === stopTool\n );\n\n if (!stopToolCall) {\n return;\n }\n\n // Extract the response parameter value\n try {\n const args = JSON.parse(stopToolCall.function.arguments);\n const extractedResponse = args[stopToolResponseProperty];\n\n if (extractedResponse && typeof extractedResponse === \"string\") {\n // Replace the response content with the extracted value\n response.content = extractedResponse;\n\n // Broadcast as chunks for real-time UI update\n if (state.emitMessageChunk && state.pendingMessageId) {\n // Broadcast the extracted response as a single chunk\n // (it's already complete at this point, not streaming from provider)\n state.emitMessageChunk(state.pendingMessageId, extractedResponse);\n }\n\n // Store for potential later use\n // Store final response for stop tool extraction\n (state as any).finalResponse = extractedResponse; // Note: finalResponse not in FlowState type yet\n }\n } catch (error) {\n console.error(\n `Failed to extract response property '${stopToolResponseProperty}' from stop-tool '${stopTool}':`,\n error\n );\n }\n }\n\n /**\n * Check if stop condition is met\n */\n private static checkStopCondition(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n // Check end conversation tool first (ends entire conversation)\n const endConversationTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_end_conversation_tool\n : state.agentConfig.side_b_end_conversation_tool;\n\n if (\n endConversationTool &&\n response.tool_calls?.some((call) => call.function.name === endConversationTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `End conversation tool called: ${endConversationTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check stop conditions (OR logic - stop on either condition)\n const stopOnResponse =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_on_response\n : state.agentConfig.side_b_stop_on_response;\n\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Stop on response condition\n if (stopOnResponse && response.content && !response.tool_calls) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Returns content (no tool calls)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Stop on specific tool call\n if (\n stopTool &&\n response.tool_calls?.some((call) => call.function.name === stopTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n // Note: Response parameter extraction is handled earlier in extractStopToolResponse()\n // which is called before updateMessage to ensure the content is set correctly\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Stop tool called: ${stopTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Switch to the other side (for dual_ai agents)\n */\n static switchSides(state: FlowState): void {\n state.currentSide = state.currentSide === \"a\" ? \"b\" : \"a\";\n\n // Update current prompt reference to match new side\n // For ai_human agents, keep using sideA prompt even when switching to side B (human)\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n /**\n * Filter out orphaned tool calls and tool results\n * Removes:\n * 1. Assistant messages with tool_calls that have no matching tool result messages\n * 2. Tool result messages that have no matching tool_call in assistant messages\n *\n * This prevents API errors from OpenAI when tool_calls and results don't match\n */\n private static filterOrphanedToolCalls(messages: Message[]): Message[] {\n // First pass: collect all valid tool_call_ids from tool result messages\n const toolResultIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolResultIds.add(msg.tool_call_id);\n }\n }\n\n // Second pass: collect all tool_call_ids from assistant messages with tool_calls\n const assistantToolCallIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n for (const call of toolCalls) {\n if (call.id) {\n assistantToolCallIds.add(call.id);\n }\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n }\n\n // Third pass: filter messages\n const filtered: Message[] = [];\n for (const msg of messages) {\n // Filter tool result messages - only keep if their tool_call_id has a matching assistant message\n if (msg.role === \"tool\" && msg.tool_call_id) {\n if (!assistantToolCallIds.has(msg.tool_call_id)) {\n console.warn(`[FlowEngine] Filtering orphaned tool result message ${msg.id} - no matching tool_call_id ${msg.tool_call_id}`);\n continue; // Skip this message\n }\n }\n\n // Filter assistant messages with tool_calls - remove tool_calls that have no matching results\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((call: any) =>\n toolResultIds.has(call.id)\n );\n\n // If no tool calls have results, check if message has content\n if (matchedToolCalls.length === 0 && toolCalls.length > 0) {\n if (msg.content) {\n // Has content - keep message but remove tool_calls field\n console.warn(`[FlowEngine] Filtering tool_calls from message ${msg.id} - no matching tool results`);\n filtered.push({\n ...msg,\n tool_calls: null\n });\n continue;\n } else {\n // No content and no valid tool calls - skip entire message\n console.warn(`[FlowEngine] Filtering assistant message ${msg.id} - no content and no tool calls with results`);\n continue;\n }\n }\n\n // Some tool calls have results - update with filtered list if needed\n if (matchedToolCalls.length !== toolCalls.length) {\n console.warn(`[FlowEngine] Filtering ${toolCalls.length - matchedToolCalls.length} orphaned tool_calls from message ${msg.id}`);\n filtered.push({\n ...msg,\n tool_calls: JSON.stringify(matchedToolCalls)\n });\n continue;\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n\n // Keep all other messages as-is\n filtered.push(msg);\n }\n\n const removedCount = messages.length - filtered.length;\n if (removedCount > 0) {\n console.warn(`[FlowEngine] Filtered ${removedCount} orphaned tool call/result messages`);\n }\n\n return filtered;\n }\n\n /**\n * Load message history from DurableObject storage\n * Public to allow FlowStateSdk to reload history when needed\n *\n * @param storage - DurableObject storage instance\n * @param thread - Thread instance and metadata\n * @param stateInput - Partial state containing extraMessages and other context\n * @param includeParentHistory - Whether to load messages from DB (default: true). If false, only extraMessages are returned\n */\n public static async loadMessageHistory(\n state: FlowState,\n ): Promise<Message[]> {\n const storage = state.storage;\n const thread = state.thread;\n const includeParentHistory = state.prompt.include_chat ?? true;\n const includeToolCalls = state.prompt.include_past_tools ?? true;\n\n try {\n let rows: any[] = [];\n\n // Only load parent message history from DB if includeParentHistory is true\n if (includeParentHistory) {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: 1) Use for...of loop, OR 2) Call .toArray() for array methods\n // DO NOT try to access cursor.rows - it doesn't exist!\n // CRITICAL: Only load top-level messages (parent_id IS NULL) for LLM context\n // Sub-prompt messages are stored for observability but never sent to parent's LLM\n\n // Select columns conditionally based on includeToolCalls\n const columns = [\n \"id\", \"role\", \"content\", \"name\",\n ...(includeToolCalls ? [\"tool_calls\", \"tool_call_id\", \"tool_status\"] : []),\n \"log_id\", \"created_at\", \"request_sent_at\", \"response_completed_at\",\n \"status\", \"silent\", \"parent_id\", \"depth\",\n \"reasoning_content\", \"reasoning_details\"\n ];\n\n const query = `\n SELECT\n ${columns.join(\", \")}\n FROM messages\n WHERE parent_id IS NULL\n ORDER BY created_at ASC\n `;\n\n const cursor = await storage.sql.exec<Message & Record<string, any>>(query);\n\n rows = cursor.toArray(); // Convert iterator to array for .map()\n }\n\n // Always append extraMessages if provided, regardless of includeParentHistory setting\n if (state.extraMessages && state.extraMessages.length > 0) {\n rows.push(...state.extraMessages);\n rows.sort((a, b) => a.created_at - b.created_at);\n }\n\n // Rows are objects with column names as properties, NOT arrays!\n const messages = rows.map((row: any) => ({\n id: row.id as string,\n role: row.role as Message[\"role\"],\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n reasoning_content: row.reasoning_content as string | null,\n reasoning_details: row.reasoning_details as string | null,\n }));\n\n // Filter out orphaned tool calls and tool results BEFORE running hooks\n // This prevents API errors from mismatched tool_call/result pairs\n return this.runFilterMessagesHook(thread.instance, state, this.filterOrphanedToolCalls(messages));\n } catch (error) {\n console.error(\"Error loading message history:\", error);\n return [];\n }\n }\n\n /**\n * Run the filter_messages hook if it exists\n * This hook allows developers to modify SQL row data before transformation\n *\n * @param thread - Thread instance with hooks registry\n * @param stateInput - Partial state for hook context\n * @param rows - SQL rows from messages table\n * @returns Processed rows (or original if hook doesn't exist/fails)\n */\n private static async runFilterMessagesHook(\n thread: ThreadInstance,\n state: FlowState,\n rows: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = thread.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['filter_messages']) {\n return rows; // No hook - return original rows\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['filter_messages'];\n const hook = await hookLoader();\n\n if (!hook) {\n return rows; // Hook failed to load - return original rows\n }\n\n // Run the hook\n const processedRows = await hook(state, rows);\n return processedRows;\n } catch (error) {\n // If the hook throws an error, log it but return the original rows\n console.error('[Hooks] ✗ Error running filter_messages hook:', error);\n return rows;\n }\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Creates a log entry with error details but no associated message_id\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n context?: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)\n `,\n crypto.randomUUID(),\n \"00000000-0000-0000-0000-000000000000\", // Placeholder for errors without message\n \"system\",\n context || \"unknown\",\n `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n errorType,\n Date.now() * TIMESTAMP_MULTIPLIER\n );\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log error to database:\", logError);\n }\n }\n}\n","/**\n * Type generation module for AgentBuilder.\n *\n * Generates TypeScript declaration files that provide compile-time\n * type safety for model, prompt, agent, and tool references.\n *\n * @module\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Configuration for directory scanning.\n */\nexport interface DirectoryConfig {\n modelsDir: string;\n promptsDir: string;\n agentsDir: string;\n toolsDir: string;\n outputDir: string;\n}\n\n/**\n * Content of the generated tsconfig.json for the .agents directory.\n */\nconst TSCONFIG_CONTENT = `{\n \"compilerOptions\": {\n \"composite\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"moduleResolution\": \"bundler\",\n \"module\": \"ESNext\",\n \"target\": \"ESNext\"\n },\n \"include\": [\"types.d.ts\", \"virtual-module.d.ts\"]\n}\n`;\n\n/**\n * Scan a directory for TypeScript files and extract the definition names.\n *\n * This function reads each .ts file and extracts the `name` property from\n * the defineX() call. It uses a simple regex pattern to avoid full parsing.\n *\n * @param dir - Directory to scan\n * @param useFilename - If true, use filename as the name (for tools that don't have name property)\n * @returns Array of definition names found\n */\nexport function scanForNames(dir: string, useFilename: boolean = false): string[] {\n const names: string[] = [];\n\n if (!fs.existsSync(dir)) {\n return names;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (useFilename) {\n // For tools: use the filename (without extension) as the tool name\n // Convert underscores to match convention (e.g., my_tool.ts -> my_tool)\n const toolName = entry.name.replace(/\\.ts$/, '');\n // Verify the file actually exports a tool (contains defineTool)\n if (content.includes('defineTool')) {\n names.push(toolName);\n }\n } else {\n // Extract name from defineX({ name: 'xxx', ... })\n // Matches: name: 'xxx' or name: \"xxx\"\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n names.push(nameMatch[1]);\n }\n }\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dir}:`, error);\n }\n\n return names;\n}\n\n/**\n * Generate interface properties from an array of string names.\n * Each name becomes a property with value `true`.\n *\n * @param names - Array of string names\n * @returns TypeScript interface properties string\n */\nfunction generateRegistryProperties(names: string[]): string {\n if (names.length === 0) {\n return '';\n }\n\n return names.map((n) => `'${n}': true;`).join('\\n ');\n}\n\n/**\n * Generate the types.d.ts content for the .agents directory.\n *\n * This generates a namespace augmentation that overrides the default `string`\n * types in the AgentBuilder namespace with specific union types based on\n * the user's defined models, prompts, agents, and tools.\n *\n * @param config - Directory configuration\n * @returns The generated TypeScript declaration content\n */\nexport function generateTypesContent(config: DirectoryConfig): string {\n const models = scanForNames(config.modelsDir);\n const prompts = scanForNames(config.promptsDir);\n const agents = scanForNames(config.agentsDir);\n // Tools use filename as name since defineTool doesn't have a name property\n const tools = scanForNames(config.toolsDir, true);\n\n // Generate the callables union from all three sources\n const callables = [...prompts, ...agents, ...tools];\n\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n// Generated at: ${new Date().toISOString()}\n//\n// This file augments the AgentBuilder namespace declared in @standardagents/builder\n// to provide type-safe references for your models, prompts, agents, and tools.\n\n/**\n * Augment the global AgentBuilder namespace with your project's specific types.\n * This provides autocomplete and type checking for model, prompt, agent, and tool references.\n *\n * Uses interface declaration merging with property keys to create union types.\n * Example: interface ModelRegistry { 'gpt-4o': true; } gives type Models = 'gpt-4o'\n */\ndeclare global {\n namespace AgentBuilder {\n /** Model names from agents/models/ */\n interface ModelRegistry {\n ${generateRegistryProperties(models)}\n }\n\n /** Prompt names from agents/prompts/ */\n interface PromptRegistry {\n ${generateRegistryProperties(prompts)}\n }\n\n /** Agent names from agents/agents/ */\n interface AgentRegistry {\n ${generateRegistryProperties(agents)}\n }\n\n /** Tool names from agents/tools/ */\n interface ToolRegistry {\n ${generateRegistryProperties(tools)}\n }\n\n /** All callable items (prompts, agents, tools) that can be used as tools */\n interface CallableRegistry {\n ${generateRegistryProperties(callables)}\n }\n }\n}\n\n// This export is required for TypeScript to treat this as a module\n// and allow the declare global to work properly\nexport {};\n`;\n}\n\n/**\n * Generate the virtual-module.d.ts content for the .agents directory.\n *\n * This provides type declarations for the virtual:@standardagents/builder module.\n * It must be in a separate file (without export {}) to work as an ambient module declaration.\n *\n * @returns The generated TypeScript declaration content\n */\nexport function generateVirtualModuleContent(): string {\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n//\n// Type declarations for the virtual:@standardagents/builder module.\n// This file must NOT have any exports to work as an ambient module declaration.\n\n/**\n * Type declarations for the consolidated virtual module.\n * This module provides DurableThread and DurableAgentBuilder classes\n * with all virtual module methods (tools, hooks, models, prompts, agents)\n * already implemented, plus the router function.\n */\ndeclare module 'virtual:@standardagents/builder' {\n import type { DurableThread as BaseDurableThread } from '@standardagents/builder/runtime';\n import type { DurableAgentBuilder as BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n // ============================================================\n // Message Types\n // ============================================================\n\n export interface ThreadMessage {\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: 'success' | 'error' | null;\n log_id: string | null;\n created_at: number;\n silent: boolean;\n parent_id: string | null;\n depth: number;\n status: 'pending' | 'completed' | 'failed' | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }\n\n export interface GetMessagesResult {\n messages: ThreadMessage[];\n total: number;\n hasMore: boolean;\n }\n\n // ============================================================\n // Log Types\n // ============================================================\n\n export interface ThreadLog {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: boolean;\n created_at: number;\n request_body: string | null;\n }\n\n export interface GetLogsResult {\n logs: ThreadLog[];\n total: number;\n hasMore: boolean;\n }\n\n export interface ThreadLogDetails extends ThreadLog {\n endpoint: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n tools_schema: string | null;\n message_history: string | null;\n system_prompt: string | null;\n errors: string | null;\n tool_results: string | null;\n }\n\n // ============================================================\n // Thread Metadata Types\n // ============================================================\n\n export interface ThreadMetaResult {\n thread: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n agent: {\n id: string;\n title: string;\n type: string;\n side_a_label?: string;\n side_b_label?: string;\n } | null;\n stats: {\n message_count: number;\n log_count: number;\n };\n }\n\n // ============================================================\n // DurableThread Class\n // ============================================================\n\n /**\n * DurableThread with all virtual module methods pre-implemented.\n * Extend this class in your agents/Thread.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * \\`\\`\\`\n */\n export class DurableThread extends BaseDurableThread {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Execution methods\n execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response>;\n sendMessage(\n threadId: string,\n content: string,\n role?: string\n ): Promise<Response>;\n stop(): Promise<Response>;\n shouldStop(): Promise<boolean>;\n\n // Message methods\n getMessages(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC',\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<GetMessagesResult>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }): Promise<{ success: boolean; count?: number; error?: string }>;\n\n // Log methods\n getLogs(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC'\n ): Promise<GetLogsResult>;\n getLogDetails(logId: string): Promise<ThreadLogDetails>;\n\n // Thread management methods\n getThreadMeta(threadId: string): Promise<ThreadMetaResult>;\n updateThreadMeta(\n threadId: string,\n params: UpdateThreadParams\n ): Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n deleteThread(): Promise<{ success: boolean; message: string }>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // DurableAgentBuilder Types\n // ============================================================\n\n export interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n }\n\n export interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n\n export interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }\n\n export interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n }\n\n // ============================================================\n // DurableAgentBuilder Class\n // ============================================================\n\n /**\n * DurableAgentBuilder with all virtual module methods pre-implemented.\n * Extend this class in your agents/AgentBuilder.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n *\n * export class AgentBuilder extends DurableAgentBuilder {}\n * \\`\\`\\`\n */\n export class DurableAgentBuilder extends BaseDurableAgentBuilder {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Thread registry methods\n createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry>;\n getThread(id: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(id: string): Promise<boolean>;\n updateThreadAgent(id: string, agent_name: string): Promise<boolean>;\n updateThread(id: string, params: UpdateThreadParams): Promise<ThreadRegistryEntry | null>;\n getThreadStub(threadId: string): DurableObjectStub;\n\n // Provider methods\n getProvider(name: string): Promise<Provider | null>;\n setProvider(provider: Provider): Promise<void>;\n listProviders(): Promise<Provider[]>;\n deleteProvider(name: string): Promise<boolean>;\n\n // User methods\n getUserByUsername(username: string): Promise<User | null>;\n getUserById(id: string): Promise<User | null>;\n createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User>;\n hasUsers(): Promise<boolean>;\n listUsers(): Promise<Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>>;\n updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null>;\n deleteUser(id: string): Promise<boolean>;\n\n // Session methods\n createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string>;\n validateSession(tokenHash: string): Promise<{ user_id: string; expires_at: number } | null>;\n cleanupSessions(): Promise<number>;\n deleteSession(tokenHash: string): Promise<void>;\n\n // API key methods\n createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string>;\n validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null>;\n listApiKeys(userId: string): Promise<Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>>;\n deleteApiKey(id: string, userId: string): Promise<boolean>;\n\n // OAuth methods\n linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void>;\n findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null>;\n\n // Edit lock methods (for GitHub integration)\n acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean>;\n releaseEditLock(lockedBy: string): Promise<boolean>;\n getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>;\n setPendingChanges(changes: string): Promise<void>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // Router Function\n // ============================================================\n\n /**\n * Main router function for handling incoming requests.\n * Routes requests to the appropriate API endpoint or serves the UI.\n *\n * @example\n * \\`\\`\\`typescript\n * import { router } from 'virtual:@standardagents/builder'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const response = await router(request, env);\n * return response ?? new Response('Not Found', { status: 404 });\n * }\n * }\n * \\`\\`\\`\n */\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n}\n\n/**\n * Legacy alias for the router module.\n * @deprecated Use \\`import { router } from 'virtual:@standardagents/builder'\\` instead.\n */\ndeclare module 'virtual:@standardagents/router' {\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n\n export { DurableThread } from 'virtual:@standardagents/builder';\n}\n`;\n}\n\n/**\n * Ensure a directory exists, creating it if necessary.\n *\n * @param dir - Directory path to ensure exists\n */\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Generate the .agents directory with type declarations.\n *\n * Creates or updates:\n * - .agents/types.d.ts - Type declarations for all definitions (with export {})\n * - .agents/virtual-module.d.ts - Virtual module declarations (ambient, no export)\n * - .agents/tsconfig.json - TypeScript configuration\n * - .agents/.gitignore - Ignore all generated files\n *\n * @param config - Directory configuration\n */\nexport function generateTypes(config: DirectoryConfig): void {\n ensureDir(config.outputDir);\n\n // Generate types.d.ts (global namespace augmentation - needs export {})\n const typesContent = generateTypesContent(config);\n fs.writeFileSync(path.join(config.outputDir, 'types.d.ts'), typesContent);\n\n // Generate virtual-module.d.ts (ambient module declaration - no export)\n const virtualModuleContent = generateVirtualModuleContent();\n fs.writeFileSync(path.join(config.outputDir, 'virtual-module.d.ts'), virtualModuleContent);\n\n // Generate tsconfig.json\n fs.writeFileSync(path.join(config.outputDir, 'tsconfig.json'), TSCONFIG_CONTENT);\n\n // Generate .gitignore to ignore all generated files\n fs.writeFileSync(path.join(config.outputDir, '.gitignore'), '*\\n');\n}\n\n/**\n * Check if type generation is needed based on file modification times.\n *\n * @param config - Directory configuration\n * @returns True if types need regeneration\n */\nexport function needsRegeneration(config: DirectoryConfig): boolean {\n const typesPath = path.join(config.outputDir, 'types.d.ts');\n\n // If types file doesn't exist, we need to generate\n if (!fs.existsSync(typesPath)) {\n return true;\n }\n\n const typesMtime = fs.statSync(typesPath).mtime;\n\n // Check if any source directory has newer files\n const dirs = [config.modelsDir, config.promptsDir, config.agentsDir, config.toolsDir];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) {\n continue;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const fileMtime = fs.statSync(filePath).mtime;\n if (fileMtime > typesMtime) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get default directory configuration based on a base directory.\n *\n * @param baseDir - Base directory (usually process.cwd())\n * @param options - Optional overrides for directory paths\n * @returns Complete directory configuration\n */\nexport function getDefaultConfig(\n baseDir: string,\n options: Partial<DirectoryConfig> = {}\n): DirectoryConfig {\n return {\n modelsDir: options.modelsDir ?? path.join(baseDir, 'agents/models'),\n promptsDir: options.promptsDir ?? path.join(baseDir, 'agents/prompts'),\n agentsDir: options.agentsDir ?? path.join(baseDir, 'agents/agents'),\n toolsDir: options.toolsDir ?? path.join(baseDir, 'agents/tools'),\n outputDir: options.outputDir ?? path.join(baseDir, '.agents'),\n };\n}\n","import type { ModelDefinition } from '../defineModel.js';\n\n/**\n * Generate a TypeScript file for a model definition.\n */\nexport function generateModelFile(data: ModelDefinition): string {\n const lines = [\n `import { defineModel } from '@standardagents/builder';`,\n '',\n `export default defineModel({`,\n ` name: '${escapeString(data.name)}',`,\n ` provider: '${escapeString(data.provider)}',`,\n ` model: '${escapeString(data.model)}',`,\n ];\n\n if (data.includedProviders && data.includedProviders.length > 0) {\n lines.push(` includedProviders: ${JSON.stringify(data.includedProviders)},`);\n }\n\n if (data.fallbacks && data.fallbacks.length > 0) {\n lines.push(` fallbacks: ${JSON.stringify(data.fallbacks)},`);\n }\n\n if (data.inputPrice !== undefined) {\n lines.push(` inputPrice: ${data.inputPrice},`);\n }\n\n if (data.outputPrice !== undefined) {\n lines.push(` outputPrice: ${data.outputPrice},`);\n }\n\n if (data.cachedPrice !== undefined) {\n lines.push(` cachedPrice: ${data.cachedPrice},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * Converts JSON Schema to Zod code string.\n *\n * This is used when saving prompts from the UI - the form editor works with\n * JSON Schema, but we need to generate Zod code for the TypeScript file.\n */\n\nexport interface JSONSchema {\n type?: string;\n description?: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n items?: JSONSchema;\n enum?: (string | number | boolean)[];\n anyOf?: JSONSchema[];\n oneOf?: JSONSchema[];\n allOf?: JSONSchema[];\n const?: any;\n default?: any;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n additionalProperties?: boolean | JSONSchema;\n nullable?: boolean;\n}\n\n/**\n * Convert a JSON Schema to Zod code string.\n *\n * @param schema - The JSON Schema to convert\n * @param indent - Current indentation level (for pretty printing)\n * @returns Zod code as a string\n *\n * @example\n * ```typescript\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', description: 'User name' },\n * age: { type: 'number' }\n * },\n * required: ['name']\n * };\n *\n * jsonSchemaToZod(schema);\n * // Returns: z.object({ name: z.string().describe('User name'), age: z.number().optional() })\n * ```\n */\nexport function jsonSchemaToZod(schema: JSONSchema, indent = 0): string {\n if (!schema || Object.keys(schema).length === 0) {\n return 'z.any()';\n }\n\n // Handle anyOf (union types)\n if (schema.anyOf && schema.anyOf.length > 0) {\n const types = schema.anyOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle oneOf (similar to anyOf for our purposes)\n if (schema.oneOf && schema.oneOf.length > 0) {\n const types = schema.oneOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle allOf (intersection types - merge objects)\n if (schema.allOf && schema.allOf.length > 0) {\n const types = schema.allOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n // For allOf, we use .and() to intersect\n return types.reduce((acc, t) => `${acc}.and(${t})`);\n }\n\n // Handle const\n if (schema.const !== undefined) {\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v) => JSON.stringify(v));\n if (values.length === 1) {\n return `z.literal(${values[0]})`;\n }\n return `z.enum([${values.join(', ')}])`;\n }\n\n // Handle by type\n switch (schema.type) {\n case 'string':\n return buildStringSchema(schema);\n\n case 'number':\n case 'integer':\n return buildNumberSchema(schema);\n\n case 'boolean':\n return addDescription('z.boolean()', schema.description);\n\n case 'null':\n return addDescription('z.null()', schema.description);\n\n case 'array':\n return buildArraySchema(schema, indent);\n\n case 'object':\n return buildObjectSchema(schema, indent);\n\n default:\n // No type specified - use any\n return 'z.any()';\n }\n}\n\nfunction buildStringSchema(schema: JSONSchema): string {\n let code = 'z.string()';\n\n // Add constraints\n if (schema.minLength !== undefined) {\n code += `.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n code += `.max(${schema.maxLength})`;\n }\n if (schema.pattern) {\n code += `.regex(/${escapeRegex(schema.pattern)}/)`;\n }\n\n // Handle format (common JSON Schema formats)\n if (schema.format) {\n switch (schema.format) {\n case 'email':\n code += '.email()';\n break;\n case 'uri':\n case 'url':\n code += '.url()';\n break;\n case 'uuid':\n code += '.uuid()';\n break;\n case 'date-time':\n code += '.datetime()';\n break;\n case 'date':\n code += '.date()';\n break;\n case 'time':\n code += '.time()';\n break;\n case 'ipv4':\n code += '.ip({ version: \"v4\" })';\n break;\n case 'ipv6':\n code += '.ip({ version: \"v6\" })';\n break;\n // Other formats are ignored\n }\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildNumberSchema(schema: JSONSchema): string {\n let code = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if (schema.minimum !== undefined) {\n code += `.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n code += `.max(${schema.maximum})`;\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildArraySchema(schema: JSONSchema, indent: number): string {\n const itemsSchema = schema.items ? jsonSchemaToZod(schema.items, indent) : 'z.any()';\n let code = `z.array(${itemsSchema})`;\n\n return addDescription(code, schema.description);\n}\n\nfunction buildObjectSchema(schema: JSONSchema, indent: number): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or object with any properties\n if (schema.additionalProperties === false) {\n return addDescription('z.object({})', schema.description);\n }\n return addDescription('z.record(z.any())', schema.description);\n }\n\n const required = new Set(schema.required || []);\n const spaces = ' '.repeat(indent + 1);\n const closingSpaces = ' '.repeat(indent);\n\n const props = Object.entries(schema.properties).map(([key, propSchema]) => {\n let propCode = jsonSchemaToZod(propSchema, indent + 1);\n\n // Handle nullable\n if (propSchema.nullable) {\n propCode += '.nullable()';\n }\n\n // Add optional() if not in required array\n if (!required.has(key)) {\n propCode += '.optional()';\n }\n\n // Handle default values\n if (propSchema.default !== undefined) {\n propCode += `.default(${JSON.stringify(propSchema.default)})`;\n }\n\n return `${spaces}${safePropertyKey(key)}: ${propCode}`;\n });\n\n const propsStr = props.join(',\\n');\n let code = `z.object({\\n${propsStr}\\n${closingSpaces}})`;\n\n // Handle additionalProperties\n if (schema.additionalProperties === false) {\n code += '.strict()';\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction addDescription(code: string, description?: string): string {\n if (description) {\n return `${code}.describe(${JSON.stringify(description)})`;\n }\n return code;\n}\n\nfunction escapeRegex(pattern: string): string {\n // Escape forward slashes for regex literal\n return pattern.replace(/\\//g, '\\\\/');\n}\n\nfunction safePropertyKey(key: string): string {\n // Check if key is a valid JS identifier\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n // Otherwise quote it\n return JSON.stringify(key);\n}\n\n/**\n * Check if a JSON Schema is empty or trivial (no meaningful constraints).\n */\nexport function isEmptySchema(schema: JSONSchema | null | undefined): boolean {\n if (!schema) return true;\n if (Object.keys(schema).length === 0) return true;\n\n // A schema with only type: object and empty properties is considered empty\n if (\n schema.type === 'object' &&\n (!schema.properties || Object.keys(schema.properties).length === 0) &&\n (!schema.required || schema.required.length === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import type { PromptDefinition, PromptPart, StructuredPrompt } from '../definePrompt.js';\nimport { jsonSchemaToZod, isEmptySchema, type JSONSchema } from './jsonSchemaToZod.js';\n\n/**\n * Tool configuration from UI (snake_case).\n */\ninterface ToolConfigInput {\n name: string;\n include_text_response?: boolean;\n include_tool_calls?: boolean;\n include_errors?: boolean;\n init_user_message_property?: string | null;\n}\n\n/**\n * Prompt part as it comes from the UI/API.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt')\n */\ninterface PromptPartInput {\n // New format\n type: 'text' | 'include' | 'string' | 'prompt' | 'variable';\n content?: string; // For type: 'text'\n prompt?: string; // For type: 'include'\n // Legacy format\n value?: string; // For legacy type: 'string' or 'variable'\n id?: string; // For legacy type: 'prompt'\n label?: string; // Legacy UI field\n schema?: any; // Legacy field from UI, ignored\n}\n\n/**\n * Input data for generating a prompt file.\n * This can include JSON Schema for requiredSchema which will be converted to Zod.\n */\nexport interface PromptFileData {\n name: string;\n toolDescription?: string;\n /**\n * Prompt content can be:\n * - A plain string\n * - A structured array of prompt parts\n * - A JSON string of a structured array (legacy format from UI)\n */\n prompt?: string | PromptPartInput[];\n model: string;\n includeChat?: boolean;\n includePastTools?: boolean;\n parallelToolCalls?: boolean;\n toolChoice?: 'auto' | 'none' | 'required';\n tools?: (string | ToolConfigInput)[];\n handoffAgents?: string[];\n beforeTool?: string;\n afterTool?: string;\n reasoning?: {\n effort?: 'low' | 'medium' | 'high';\n maxTokens?: number;\n exclude?: boolean;\n include?: boolean;\n };\n /**\n * Required schema as JSON Schema (from the UI).\n * Will be converted to Zod code.\n */\n requiredSchema?: JSONSchema;\n}\n\n/**\n * Generate a TypeScript file for a prompt definition.\n *\n * @param data - Prompt data including JSON Schema for requiredSchema\n * @returns TypeScript code as a string\n */\nexport function generatePromptFile(data: PromptFileData): string {\n const hasSchema = data.requiredSchema && !isEmptySchema(data.requiredSchema);\n\n const lines = [`import { definePrompt } from '@standardagents/builder';`];\n\n // Add zod import if there's a requiredSchema with actual content\n if (hasSchema) {\n lines.push(`import { z } from 'zod';`);\n }\n\n lines.push('');\n lines.push(`export default definePrompt({`);\n lines.push(` name: '${escapeString(data.name)}',`);\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n // Prompt content - either plain string or structured array\n if (data.prompt !== undefined) {\n const promptCode = formatPromptContent(data.prompt);\n lines.push(` prompt: ${promptCode},`);\n }\n\n lines.push(` model: '${escapeString(data.model)}',`);\n\n // Note: exposeAsTool removed - all prompts are exposed as tools by default\n\n if (data.includeChat !== undefined) {\n lines.push(` includeChat: ${data.includeChat},`);\n }\n\n if (data.includePastTools !== undefined) {\n lines.push(` includePastTools: ${data.includePastTools},`);\n }\n\n if (data.parallelToolCalls !== undefined) {\n lines.push(` parallelToolCalls: ${data.parallelToolCalls},`);\n }\n\n if (data.toolChoice && data.toolChoice !== 'auto') {\n lines.push(` toolChoice: '${data.toolChoice}',`);\n }\n\n // Tools - can be strings or ToolConfig objects\n if (data.tools && data.tools.length > 0) {\n const toolsCode = formatToolsArray(data.tools);\n lines.push(` tools: ${toolsCode},`);\n }\n\n // Handoff agents - output as TypeScript array\n if (data.handoffAgents && data.handoffAgents.length > 0) {\n const agentsStr = data.handoffAgents.map(a => `'${escapeString(a)}'`).join(', ');\n lines.push(` handoffAgents: [${agentsStr}],`);\n }\n\n // Before/after tools\n if (data.beforeTool) {\n lines.push(` beforeTool: '${escapeString(data.beforeTool)}',`);\n }\n\n if (data.afterTool) {\n lines.push(` afterTool: '${escapeString(data.afterTool)}',`);\n }\n\n // Reasoning config - output as TypeScript object (no quoted keys)\n if (data.reasoning && hasNonNullProperties(data.reasoning)) {\n const reasoningCode = formatReasoningConfig(data.reasoning);\n lines.push(` reasoning: ${reasoningCode},`);\n }\n\n // RequiredSchema - convert JSON Schema to Zod code\n if (hasSchema) {\n const zodCode = jsonSchemaToZod(data.requiredSchema!, 1);\n lines.push(` requiredSchema: ${zodCode},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if an object has any non-null/non-undefined properties.\n */\nfunction hasNonNullProperties(obj: Record<string, any>): boolean {\n return Object.values(obj).some(v => v !== null && v !== undefined);\n}\n\n/**\n * Format the tools array as TypeScript code (not JSON).\n * Transforms snake_case properties from UI to camelCase for TypeScript.\n */\nfunction formatToolsArray(tools: (string | ToolConfigInput)[]): string {\n const formatted = tools.map(tool => {\n if (typeof tool === 'string') {\n return `'${escapeString(tool)}'`;\n }\n // Tool config object - transform to camelCase and format as TypeScript\n return formatToolConfig(tool);\n });\n\n if (formatted.length === 1) {\n return `[${formatted[0]}]`;\n }\n\n // Multi-line format for multiple tools\n const indented = formatted.map(t => ` ${t}`).join(',\\n');\n return `[\\n${indented}\\n ]`;\n}\n\n/**\n * Format a tool config object as TypeScript code.\n * Transforms snake_case to camelCase and omits null/default values.\n */\nfunction formatToolConfig(config: ToolConfigInput): string {\n const parts: string[] = [];\n\n parts.push(`name: '${escapeString(config.name)}'`);\n\n // Transform snake_case to camelCase and only include non-default values\n if (config.include_text_response !== undefined && config.include_text_response !== true) {\n parts.push(`includeTextResponse: ${config.include_text_response}`);\n }\n\n if (config.include_tool_calls !== undefined && config.include_tool_calls !== true) {\n parts.push(`includeToolCalls: ${config.include_tool_calls}`);\n }\n\n if (config.include_errors !== undefined && config.include_errors !== true) {\n parts.push(`includeErrors: ${config.include_errors}`);\n }\n\n if (config.init_user_message_property !== undefined && config.init_user_message_property !== null) {\n parts.push(`initUserMessageProperty: '${escapeString(config.init_user_message_property)}'`);\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\n/**\n * Format reasoning config as TypeScript code (not JSON).\n */\nfunction formatReasoningConfig(reasoning: PromptFileData['reasoning']): string {\n if (!reasoning) return '{}';\n\n const parts: string[] = [];\n\n if (reasoning.effort !== undefined && reasoning.effort !== null) {\n parts.push(`effort: '${reasoning.effort}'`);\n }\n\n if (reasoning.maxTokens !== undefined && reasoning.maxTokens !== null) {\n parts.push(`maxTokens: ${reasoning.maxTokens}`);\n }\n\n if (reasoning.exclude !== undefined && reasoning.exclude !== null) {\n parts.push(`exclude: ${reasoning.exclude}`);\n }\n\n if (reasoning.include !== undefined && reasoning.include !== null) {\n parts.push(`include: ${reasoning.include}`);\n }\n\n if (parts.length === 0) {\n return '{}';\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\${/g, '\\\\${');\n}\n\n/**\n * Parse prompt content into an array of parts.\n * Returns null if it's a plain string, or the array of parts if structured.\n */\nfunction parsePromptContent(prompt: string | PromptPartInput[] | undefined): PromptPartInput[] | null {\n if (!prompt) return null;\n\n // Already an array\n if (Array.isArray(prompt)) {\n return prompt;\n }\n\n // Try to parse as JSON array (legacy format from UI)\n if (typeof prompt === 'string') {\n try {\n const parsed = JSON.parse(prompt);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, it's a plain string\n }\n }\n\n return null;\n}\n\n/**\n * Format prompt content as TypeScript code.\n * Plain strings use template literals, structured prompts use helper functions.\n */\nfunction formatPromptContent(prompt: string | PromptPartInput[] | undefined): string {\n if (!prompt) return \"''\";\n\n // Parse the prompt content\n const parts = parsePromptContent(prompt);\n\n // If it's a structured prompt (array), format it using helper functions\n if (parts !== null) {\n return formatStructuredPrompt(parts);\n }\n\n // Plain string - use template literal for multi-line\n if (typeof prompt === 'string') {\n if (prompt.includes('\\n')) {\n return `\\`${escapeTemplateLiteral(prompt)}\\``;\n }\n return `'${escapeString(prompt)}'`;\n }\n\n return \"''\";\n}\n\n/**\n * Format a structured prompt array as TypeScript code using discriminated union objects.\n */\nfunction formatStructuredPrompt(parts: PromptPartInput[]): string {\n if (parts.length === 0) {\n return '[]';\n }\n\n // Normalize parts to the new format\n const normalizedParts = parts.map(normalizePart);\n\n // Check if it's simple enough to be on one line (single short text part)\n if (normalizedParts.length === 1 && normalizedParts[0].type === 'text') {\n const content = normalizedParts[0].content || '';\n if (!content.includes('\\n') && content.length < 50) {\n return `[{ type: 'text', content: '${escapeString(content)}' }]`;\n }\n }\n\n // Multi-line format\n const formattedParts = normalizedParts.map(part => {\n if (part.type === 'text') {\n const content = part.content || '';\n // Use template literal for multi-line strings\n if (content.includes('\\n')) {\n return ` { type: 'text', content: \\`${escapeTemplateLiteral(content)}\\` }`;\n }\n return ` { type: 'text', content: '${escapeString(content)}' }`;\n } else if (part.type === 'include') {\n const promptName = part.prompt || '';\n return ` { type: 'include', prompt: '${escapeString(promptName)}' }`;\n }\n return ` // Unknown part type: ${(part as any).type}`;\n });\n\n return `[\\n${formattedParts.join(',\\n')},\\n ]`;\n}\n\n/**\n * Normalize a prompt part from legacy format to new format.\n * Legacy: { type: 'string', value: '...' } or { type: 'prompt', id: '...' }\n * New: { type: 'text', content: '...' } or { type: 'include', prompt: '...' }\n */\nfunction normalizePart(part: PromptPartInput): { type: 'text'; content: string } | { type: 'include'; prompt: string } {\n // Handle new format\n if (part.type === 'text') {\n return { type: 'text', content: part.content || '' };\n }\n if (part.type === 'include') {\n return { type: 'include', prompt: part.prompt || '' };\n }\n\n // Handle legacy format\n if (part.type === 'string') {\n return { type: 'text', content: part.value || '' };\n }\n if (part.type === 'prompt') {\n return { type: 'include', prompt: part.id || '' };\n }\n if (part.type === 'variable') {\n // Variables are converted to text with placeholder syntax\n return { type: 'text', content: `{{${part.value || ''}}}` };\n }\n\n // Fallback for unknown types\n return { type: 'text', content: '' };\n}\n","import type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Generate a TypeScript file for an agent definition.\n */\nexport function generateAgentFile(data: AgentDefinition): string {\n const lines = [\n `import { defineAgent } from '@standardagents/builder';`,\n '',\n `export default defineAgent({`,\n ` name: '${escapeString(data.name)}',`,\n ];\n\n // Only include title if explicitly provided (deprecated field)\n if (data.title) {\n lines.push(` title: '${escapeString(data.title)}',`);\n }\n\n if (data.type && data.type !== 'ai_human') {\n lines.push(` type: '${data.type}',`);\n }\n\n if (data.maxSessionTurns !== undefined) {\n lines.push(` maxSessionTurns: ${data.maxSessionTurns},`);\n }\n\n // Side A config\n lines.push(` sideA: ${formatSideConfig(data.sideA)},`);\n\n // Side B config (optional)\n if (data.sideB) {\n lines.push(` sideB: ${formatSideConfig(data.sideB)},`);\n }\n\n if (data.exposeAsTool !== undefined) {\n lines.push(` exposeAsTool: ${data.exposeAsTool},`);\n }\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n if (data.tags && data.tags.length > 0) {\n lines.push(` tags: ${JSON.stringify(data.tags)},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatSideConfig(config: AgentDefinition['sideA']): string {\n const parts: string[] = ['{'];\n\n if (config.label) {\n parts.push(` label: '${escapeString(config.label)}',`);\n }\n\n parts.push(` prompt: '${escapeString(config.prompt)}',`);\n\n if (config.stopOnResponse !== undefined) {\n parts.push(` stopOnResponse: ${config.stopOnResponse},`);\n }\n\n if (config.stopTool) {\n parts.push(` stopTool: '${escapeString(config.stopTool)}',`);\n }\n\n if (config.stopToolResponseProperty) {\n parts.push(` stopToolResponseProperty: '${escapeString(config.stopToolResponseProperty)}',`);\n }\n\n if (config.maxTurns !== undefined) {\n parts.push(` maxTurns: ${config.maxTurns},`);\n }\n\n if (config.endConversationTool) {\n parts.push(` endConversationTool: '${escapeString(config.endConversationTool)}',`);\n }\n\n if (config.manualStopCondition !== undefined) {\n parts.push(` manualStopCondition: ${config.manualStopCondition},`);\n }\n\n parts.push(' }');\n return parts.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * File persistence service for dev mode.\n *\n * This module provides filesystem operations for creating, updating, and deleting\n * model, prompt, and agent definition files. It runs in the Vite plugin context\n * (Node.js) where filesystem access is available.\n *\n * In production (Cloudflare Workers), these operations would be handled by\n * a different mechanism (e.g., GitHub API commits).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { generateModelFile } from '../generators/generateModelFile.js';\nimport { generatePromptFile, type PromptFileData } from '../generators/generatePromptFile.js';\nimport { generateAgentFile } from '../generators/generateAgentFile.js';\nimport type { ModelDefinition } from '../defineModel.js';\nimport type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Convert a model/prompt/agent name to a safe filename.\n * Handles characters that are invalid in filesystem paths:\n * - Replaces `/` and `\\` with `__` (path separators)\n * - Replaces `:` with `_` (invalid on Windows, used in model IDs like `:free`)\n * - Replaces `-` with `_` for consistency with existing conventions\n * - Replaces other problematic characters (`*`, `?`, `\"`, `<`, `>`, `|`) with `_`\n */\nexport function nameToFilename(name: string): string {\n return name\n .replace(/[/\\\\]/g, '__') // Path separators become double underscore\n .replace(/[:*?\"<>|]/g, '_') // Invalid filesystem characters become underscore\n .replace(/-/g, '_'); // Hyphens become underscore for consistency\n}\n\n/**\n * Get the file path for a model definition.\n */\nexport function getModelFilePath(modelsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(modelsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a model file already exists.\n */\nexport function modelExists(modelsDir: string, name: string): boolean {\n const filePath = getModelFilePath(modelsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Result of a persistence operation.\n */\nexport interface PersistenceResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\n/**\n * Save a model definition to a TypeScript file.\n *\n * @param modelsDir - The directory where models are stored\n * @param data - The model definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveModel(\n modelsDir: string,\n data: ModelDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure models directory exists\n if (!fs.existsSync(modelsDir)) {\n fs.mkdirSync(modelsDir, { recursive: true });\n }\n\n const filePath = getModelFilePath(modelsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file already exists: ${filePath}. Use update to modify existing models.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateModelFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save model',\n };\n }\n}\n\n/**\n * Delete a model definition file.\n *\n * @param modelsDir - The directory where models are stored\n * @param name - The model name\n * @returns Result of the operation\n */\nexport async function deleteModel(\n modelsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getModelFilePath(modelsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete model',\n };\n }\n}\n\n/**\n * Transform snake_case model data from the UI to camelCase for internal use.\n * The UI sends field names like `included_providers`, etc.\n * but the backend expects `includedProviders`, etc.\n *\n * Also strips price fields for OpenRouter models since those are returned\n * per-request by the OpenRouter API.\n */\nexport function transformModelData(data: any): any {\n const transformed: any = {};\n const isOpenRouter = data.provider === 'openrouter';\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n included_providers: 'includedProviders',\n input_price: 'inputPrice',\n output_price: 'outputPrice',\n cached_price: 'cachedPrice',\n };\n\n // Fields to skip for OpenRouter models (prices come from API per-request)\n const openRouterSkipFields = ['inputPrice', 'outputPrice', 'cachedPrice', 'input_price', 'output_price', 'cached_price'];\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Skip price fields for OpenRouter models\n if (isOpenRouter && openRouterSkipFields.includes(key)) continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n const transformedKey = fieldMappings[key];\n // Skip price fields for OpenRouter even after transformation\n if (isOpenRouter && openRouterSkipFields.includes(transformedKey)) continue;\n transformed[transformedKey] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'model', 'provider', etc.)\n transformed[key] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Validate model data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateModelData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Model name is required and must be a string';\n }\n\n if (!data.provider || typeof data.provider !== 'string') {\n return 'Model provider is required and must be a string';\n }\n\n const validProviders = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(data.provider)) {\n return `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(', ')}`;\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Model ID is required and must be a string';\n }\n\n // Validate optional numeric fields\n if (data.inputPrice !== undefined && typeof data.inputPrice !== 'number') {\n return 'inputPrice must be a number';\n }\n\n if (data.outputPrice !== undefined && typeof data.outputPrice !== 'number') {\n return 'outputPrice must be a number';\n }\n\n if (data.cachedPrice !== undefined && typeof data.cachedPrice !== 'number') {\n return 'cachedPrice must be a number';\n }\n\n // Validate fallbacks is an array of strings\n if (data.fallbacks !== undefined) {\n if (!Array.isArray(data.fallbacks)) {\n return 'fallbacks must be an array';\n }\n for (const fallback of data.fallbacks) {\n if (typeof fallback !== 'string') {\n return 'Each fallback must be a string (model name)';\n }\n }\n }\n\n // Validate includedProviders is an array of strings\n if (data.includedProviders !== undefined) {\n if (!Array.isArray(data.includedProviders)) {\n return 'includedProviders must be an array';\n }\n for (const provider of data.includedProviders) {\n if (typeof provider !== 'string') {\n return 'Each includedProvider must be a string';\n }\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Prompt Persistence\n// ============================================================================\n\n/**\n * Transform snake_case prompt data from the UI to camelCase for internal use.\n * The UI sends field names like `model_id`, `tool_description`, etc.\n * but the backend expects `model`, `toolDescription`, etc.\n */\nexport function transformPromptData(data: any): any {\n const transformed: any = {};\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n model_id: 'model',\n tool_description: 'toolDescription',\n expose_as_tool: 'exposeAsTool',\n required_schema: 'requiredSchema',\n include_chat: 'includeChat',\n include_past_tools: 'includePastTools',\n before_tool: 'beforeTool',\n after_tool: 'afterTool',\n parallel_tool_calls: 'parallelToolCalls',\n tool_choice: 'toolChoice',\n handoff_agents: 'handoffAgents',\n reasoning_effort: 'reasoningEffort',\n reasoning_max_tokens: 'reasoningMaxTokens',\n reasoning_exclude: 'reasoningExclude',\n include_reasoning: 'includeReasoning',\n };\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n transformed[fieldMappings[key]] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'prompt', 'tools', etc.)\n transformed[key] = value;\n }\n }\n\n // Build reasoning config if any reasoning fields are present\n if (\n transformed.reasoningEffort !== undefined ||\n transformed.reasoningMaxTokens !== undefined ||\n transformed.reasoningExclude !== undefined ||\n transformed.includeReasoning !== undefined\n ) {\n transformed.reasoning = {};\n if (transformed.reasoningEffort) {\n transformed.reasoning.effort = transformed.reasoningEffort;\n }\n if (transformed.reasoningMaxTokens) {\n transformed.reasoning.maxTokens = transformed.reasoningMaxTokens;\n }\n if (transformed.reasoningExclude !== undefined) {\n transformed.reasoning.exclude = transformed.reasoningExclude;\n }\n if (transformed.includeReasoning !== undefined) {\n transformed.reasoning.include = transformed.includeReasoning;\n }\n // Clean up the flat fields\n delete transformed.reasoningEffort;\n delete transformed.reasoningMaxTokens;\n delete transformed.reasoningExclude;\n delete transformed.includeReasoning;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for a prompt definition.\n */\nexport function getPromptFilePath(promptsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(promptsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a prompt file already exists.\n */\nexport function promptExists(promptsDir: string, name: string): boolean {\n const filePath = getPromptFilePath(promptsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save a prompt definition to a TypeScript file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param data - The prompt definition data (with JSON Schema for requiredSchema)\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function savePrompt(\n promptsDir: string,\n data: PromptFileData,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure prompts directory exists\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n const filePath = getPromptFilePath(promptsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${filePath}. Use update to modify existing prompts.`,\n };\n }\n\n // Generate the TypeScript file content (converts JSON Schema to Zod)\n const content = generatePromptFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save prompt',\n };\n }\n}\n\n/**\n * Delete a prompt definition file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param name - The prompt name\n * @returns Result of the operation\n */\nexport async function deletePrompt(\n promptsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getPromptFilePath(promptsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete prompt',\n };\n }\n}\n\n/**\n * Rename a prompt definition file and update its name property.\n * Since prompts contain Zod schemas that can't be easily regenerated from JSON Schema,\n * this function reads the file and updates the name property in place.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldName - The current prompt name\n * @param newName - The new prompt name\n * @returns Result of the operation\n */\nexport async function renamePrompt(\n promptsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getPromptFilePath(promptsDir, oldName);\n const newFilePath = getPromptFilePath(promptsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename prompt',\n };\n }\n}\n\n/**\n * Validate prompt data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validatePromptData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Prompt name is required and must be a string';\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Prompt model is required and must be a string';\n }\n\n // toolDescription is optional but should be string if provided\n if (data.toolDescription !== undefined && typeof data.toolDescription !== 'string') {\n return 'toolDescription must be a string';\n }\n\n // prompt content is optional but should be string if provided\n if (data.prompt !== undefined && typeof data.prompt !== 'string') {\n return 'prompt must be a string';\n }\n\n // Validate boolean fields (exposeAsTool removed - all prompts exposed by default)\n const booleanFields = ['includeChat', 'includePastTools', 'parallelToolCalls'];\n for (const field of booleanFields) {\n if (data[field] !== undefined && typeof data[field] !== 'boolean') {\n return `${field} must be a boolean`;\n }\n }\n\n // Validate toolChoice\n if (data.toolChoice !== undefined) {\n const validChoices = ['auto', 'none', 'required'];\n if (!validChoices.includes(data.toolChoice)) {\n return `Invalid toolChoice '${data.toolChoice}'. Must be one of: ${validChoices.join(', ')}`;\n }\n }\n\n // Validate tools is an array\n if (data.tools !== undefined && !Array.isArray(data.tools)) {\n return 'tools must be an array';\n }\n\n // Validate handoffAgents is an array\n if (data.handoffAgents !== undefined && !Array.isArray(data.handoffAgents)) {\n return 'handoffAgents must be an array';\n }\n\n // Validate reasoning config\n if (data.reasoning !== undefined) {\n if (typeof data.reasoning !== 'object') {\n return 'reasoning must be an object';\n }\n if (data.reasoning.effort !== undefined) {\n const validEfforts = ['low', 'medium', 'high'];\n if (!validEfforts.includes(data.reasoning.effort)) {\n return `Invalid reasoning.effort '${data.reasoning.effort}'. Must be one of: ${validEfforts.join(', ')}`;\n }\n }\n if (data.reasoning.maxTokens !== undefined && typeof data.reasoning.maxTokens !== 'number') {\n return 'reasoning.maxTokens must be a number';\n }\n }\n\n // requiredSchema is validated by the generatePromptFile function\n // (it handles JSON Schema to Zod conversion)\n\n return null;\n}\n\n// ============================================================================\n// Agent Persistence\n// ============================================================================\n\n/**\n * Transform snake_case agent data from the UI to camelCase for internal use.\n * The UI sends field names like `side_a_label`, `side_a_agent_prompt`, etc.\n * but the backend expects nested structures like `sideA.label`, `sideA.prompt`, etc.\n */\nexport function transformAgentData(data: any): any {\n const transformed: any = {\n name: data.name,\n };\n\n // title is deprecated but include if provided for backward compatibility\n if (data.title) {\n transformed.title = data.title;\n }\n\n // Type\n if (data.type) {\n transformed.type = data.type;\n }\n\n // Max session turns\n if (data.max_session_turns !== undefined) {\n transformed.maxSessionTurns = data.max_session_turns;\n }\n\n // Side A configuration\n transformed.sideA = {\n prompt: data.side_a_agent_prompt,\n };\n if (data.side_a_label) {\n transformed.sideA.label = data.side_a_label;\n }\n if (data.side_a_stop_on_response !== undefined) {\n transformed.sideA.stopOnResponse = data.side_a_stop_on_response;\n }\n if (data.side_a_stop_tool) {\n transformed.sideA.stopTool = data.side_a_stop_tool;\n }\n if (data.side_a_stop_tool_response_property) {\n transformed.sideA.stopToolResponseProperty = data.side_a_stop_tool_response_property;\n }\n if (data.side_a_max_turns !== undefined) {\n transformed.sideA.maxTurns = data.side_a_max_turns;\n }\n if (data.side_a_end_conversation_tool) {\n transformed.sideA.endConversationTool = data.side_a_end_conversation_tool;\n }\n if (data.side_a_manual_stop_condition !== undefined) {\n transformed.sideA.manualStopCondition = data.side_a_manual_stop_condition;\n }\n\n // Side B configuration (optional, for dual_ai)\n if (data.side_b_agent_prompt) {\n transformed.sideB = {\n prompt: data.side_b_agent_prompt,\n };\n if (data.side_b_label) {\n transformed.sideB.label = data.side_b_label;\n }\n if (data.side_b_stop_on_response !== undefined) {\n transformed.sideB.stopOnResponse = data.side_b_stop_on_response;\n }\n if (data.side_b_stop_tool) {\n transformed.sideB.stopTool = data.side_b_stop_tool;\n }\n if (data.side_b_stop_tool_response_property) {\n transformed.sideB.stopToolResponseProperty = data.side_b_stop_tool_response_property;\n }\n if (data.side_b_max_turns !== undefined) {\n transformed.sideB.maxTurns = data.side_b_max_turns;\n }\n if (data.side_b_end_conversation_tool) {\n transformed.sideB.endConversationTool = data.side_b_end_conversation_tool;\n }\n if (data.side_b_manual_stop_condition !== undefined) {\n transformed.sideB.manualStopCondition = data.side_b_manual_stop_condition;\n }\n }\n\n // Tool exposure\n if (data.expose_as_tool !== undefined) {\n transformed.exposeAsTool = data.expose_as_tool;\n }\n if (data.tool_description) {\n transformed.toolDescription = data.tool_description;\n }\n\n // Tags\n if (data.tags) {\n transformed.tags = data.tags;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for an agent definition.\n */\nexport function getAgentFilePath(agentsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(agentsDir, `${filename}.ts`);\n}\n\n/**\n * Check if an agent file already exists.\n */\nexport function agentExists(agentsDir: string, name: string): boolean {\n const filePath = getAgentFilePath(agentsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save an agent definition to a TypeScript file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param data - The agent definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveAgent(\n agentsDir: string,\n data: AgentDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure agents directory exists\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n const filePath = getAgentFilePath(agentsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${filePath}. Use update to modify existing agents.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateAgentFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save agent',\n };\n }\n}\n\n/**\n * Delete an agent definition file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param name - The agent name\n * @returns Result of the operation\n */\nexport async function deleteAgent(\n agentsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getAgentFilePath(agentsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete agent',\n };\n }\n}\n\n/**\n * Rename an agent definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldName - The current agent name\n * @param newName - The new agent name\n * @returns Result of the operation\n */\nexport async function renameAgent(\n agentsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getAgentFilePath(agentsDir, oldName);\n const newFilePath = getAgentFilePath(agentsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Agent file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename agent',\n };\n }\n}\n\n/**\n * Rename a model definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param modelsDir - The directory where models are stored\n * @param oldName - The current model name\n * @param newName - The new model name\n * @returns Result of the operation\n */\nexport async function renameModel(\n modelsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getModelFilePath(modelsDir, oldName);\n const newFilePath = getModelFilePath(modelsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Model file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Model file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename model',\n };\n }\n}\n\n// ============================================================================\n// Cascade Update Functions\n// ============================================================================\n\n/**\n * Update model references in all prompt files when a model is renamed.\n * Prompts reference models via the `model` field.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldModelName - The old model name\n * @param newModelName - The new model name\n * @returns Array of updated file paths\n */\nexport async function updateModelReferencesInPrompts(\n promptsDir: string,\n oldModelName: string,\n newModelName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match model: 'old_name' or model: \"old_name\"\n const modelRegex = new RegExp(`model:\\\\s*['\"]${escapeRegExp(oldModelName)}['\"]`, 'g');\n\n if (modelRegex.test(content)) {\n content = content.replace(modelRegex, `model: '${newModelName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in other prompt files when a prompt is renamed.\n * Prompts reference other prompts via the `tools` array (prompts exposed as tools).\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInPrompts(\n promptsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n let modified = false;\n\n // Match prompt references in tools array: 'old_name' or \"old_name\"\n // This is a simple string replacement within the tools array context\n const toolsArrayRegex = /tools:\\s*\\[([^\\]]*)\\]/gs;\n const newContent = content.replace(toolsArrayRegex, (match) => {\n const oldMatch = match;\n // Replace the prompt name within the tools array\n const promptRefRegex = new RegExp(`['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n const replaced = match.replace(promptRefRegex, `'${newPromptName}'`);\n if (replaced !== oldMatch) {\n modified = true;\n }\n return replaced;\n });\n\n if (modified) {\n await fs.promises.writeFile(filePath, newContent, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in agent files when a prompt is renamed.\n * Agents reference prompts via sideA.prompt and sideB.prompt fields.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInAgents(\n agentsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(agentsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match prompt: 'old_name' or prompt: \"old_name\" in sideA/sideB objects\n const promptRegex = new RegExp(`prompt:\\\\s*['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n\n if (promptRegex.test(content)) {\n content = content.replace(promptRegex, `prompt: '${newPromptName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Validate agent data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateAgentData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Agent name is required and must be a string';\n }\n\n // title is deprecated and optional - validate if provided\n if (data.title !== undefined && typeof data.title !== 'string') {\n return 'Agent title must be a string if provided';\n }\n\n // Validate type\n if (data.type !== undefined) {\n const validTypes = ['ai_human', 'dual_ai'];\n if (!validTypes.includes(data.type)) {\n return `Invalid type '${data.type}'. Must be one of: ${validTypes.join(', ')}`;\n }\n }\n\n // Validate sideA\n if (!data.sideA || typeof data.sideA !== 'object') {\n return 'sideA configuration is required';\n }\n\n if (!data.sideA.prompt || typeof data.sideA.prompt !== 'string') {\n return 'sideA.prompt is required and must be a string';\n }\n\n // Validate sideA optional fields\n if (data.sideA.label !== undefined && typeof data.sideA.label !== 'string') {\n return 'sideA.label must be a string';\n }\n\n if (data.sideA.stopOnResponse !== undefined && typeof data.sideA.stopOnResponse !== 'boolean') {\n return 'sideA.stopOnResponse must be a boolean';\n }\n\n if (data.sideA.stopTool !== undefined && typeof data.sideA.stopTool !== 'string') {\n return 'sideA.stopTool must be a string';\n }\n\n if (data.sideA.stopTool && !data.sideA.stopToolResponseProperty) {\n return 'sideA.stopToolResponseProperty is required when sideA.stopTool is set';\n }\n\n if (data.sideA.maxTurns !== undefined) {\n if (typeof data.sideA.maxTurns !== 'number' || data.sideA.maxTurns <= 0) {\n return 'sideA.maxTurns must be a positive number';\n }\n }\n\n // Validate dual_ai requires sideB\n if (data.type === 'dual_ai') {\n if (!data.sideB || typeof data.sideB !== 'object') {\n return 'sideB configuration is required for dual_ai type';\n }\n\n if (!data.sideB.prompt || typeof data.sideB.prompt !== 'string') {\n return 'sideB.prompt is required for dual_ai type';\n }\n\n // Validate sideB optional fields\n if (data.sideB.stopTool && !data.sideB.stopToolResponseProperty) {\n return 'sideB.stopToolResponseProperty is required when sideB.stopTool is set';\n }\n\n if (data.sideB.maxTurns !== undefined) {\n if (typeof data.sideB.maxTurns !== 'number' || data.sideB.maxTurns <= 0) {\n return 'sideB.maxTurns must be a positive number';\n }\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (data.exposeAsTool && !data.toolDescription) {\n return 'toolDescription is required when exposeAsTool is true';\n }\n\n // Validate maxSessionTurns\n if (data.maxSessionTurns !== undefined) {\n if (typeof data.maxSessionTurns !== 'number' || data.maxSessionTurns <= 0) {\n return 'maxSessionTurns must be a positive number';\n }\n }\n\n // Validate tags\n if (data.tags !== undefined) {\n if (!Array.isArray(data.tags)) {\n return 'tags must be an array';\n }\n for (const tag of data.tags) {\n if (typeof tag !== 'string') {\n return 'Each tag must be a string';\n }\n }\n }\n\n return null;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Plugin, ViteDevServer } from \"vite\";\nimport { generateTypes, getDefaultConfig, needsRegeneration } from \"./sdk/generateTypes.js\";\nimport {\n saveModel,\n deleteModel,\n renameModel,\n validateModelData,\n modelExists,\n transformModelData,\n savePrompt,\n deletePrompt,\n renamePrompt,\n validatePromptData,\n promptExists,\n transformPromptData,\n saveAgent,\n deleteAgent,\n validateAgentData,\n agentExists,\n transformAgentData,\n updateModelReferencesInPrompts,\n updatePromptReferencesInPrompts,\n updatePromptReferencesInAgents,\n} from \"./sdk/persistence/index.js\";\n\nconst VIRTUAL_TOOLS_ID = \"virtual:@standardagents-tools\";\nconst RESOLVED_VIRTUAL_TOOLS_ID = \"\\0\" + VIRTUAL_TOOLS_ID;\n\nconst VIRTUAL_ROUTES_ID = \"virtual:@standardagents-routes\";\nconst RESOLVED_VIRTUAL_ROUTES_ID = \"\\0\" + VIRTUAL_ROUTES_ID;\n\n// Legacy alias for backward compatibility\nconst VIRTUAL_ROUTER_ID = \"virtual:@standardagents/router\";\nconst RESOLVED_VIRTUAL_ROUTER_ID = \"\\0\" + VIRTUAL_ROUTER_ID;\n\nconst VIRTUAL_HOOKS_ID = \"virtual:@standardagents-hooks\";\nconst RESOLVED_VIRTUAL_HOOKS_ID = \"\\0\" + VIRTUAL_HOOKS_ID;\n\nconst VIRTUAL_CONFIG_ID = \"virtual:@standardagents-config\";\nconst RESOLVED_VIRTUAL_CONFIG_ID = \"\\0\" + VIRTUAL_CONFIG_ID;\n\nconst VIRTUAL_THREAD_API_ID = \"virtual:@standardagents-thread-api\";\nconst RESOLVED_VIRTUAL_THREAD_API_ID = \"\\0\" + VIRTUAL_THREAD_API_ID;\n\n// Virtual modules for models, prompts, and agents\nconst VIRTUAL_MODELS_ID = \"virtual:@standardagents-models\";\nconst RESOLVED_VIRTUAL_MODELS_ID = \"\\0\" + VIRTUAL_MODELS_ID;\n\nconst VIRTUAL_PROMPTS_ID = \"virtual:@standardagents-prompts\";\nconst RESOLVED_VIRTUAL_PROMPTS_ID = \"\\0\" + VIRTUAL_PROMPTS_ID;\n\nconst VIRTUAL_AGENTS_ID = \"virtual:@standardagents-agents\";\nconst RESOLVED_VIRTUAL_AGENTS_ID = \"\\0\" + VIRTUAL_AGENTS_ID;\n\n// Consolidated virtual module that provides DurableThread and DurableAgentBuilder\n// with methods already implemented (tools, hooks, models, prompts, agents)\nconst VIRTUAL_BUILDER_ID = \"virtual:@standardagents/builder\";\nconst RESOLVED_VIRTUAL_BUILDER_ID = \"\\0\" + VIRTUAL_BUILDER_ID;\n\n// API Routes functionality\nfunction scanApiDirectory(\n dir: string,\n baseRoute = \"\"\n): Array<{\n method: string;\n route: string;\n importPath: string;\n}> {\n const routes: Array<{ method: string; route: string; importPath: string }> =\n [];\n\n if (!fs.existsSync(dir)) {\n return routes;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Convert [param] to :param for rou3 dynamic routes in directory names\n const convertedDirName = entry.name.replace(/\\[([^\\]]+)\\]/g, ':$1');\n const subRoute = baseRoute + \"/\" + convertedDirName;\n routes.push(...scanApiDirectory(fullPath, subRoute));\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(/\\.ts$/, \"\");\n let method = \"GET\";\n let routePath = baseRoute;\n\n if (fileName.includes(\".\")) {\n const parts = fileName.split(\".\");\n const methodPart = parts[parts.length - 1].toUpperCase();\n if ([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(methodPart)) {\n method = methodPart;\n const pathPart = parts.slice(0, -1).join(\".\");\n if (pathPart !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = pathPart.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n\n const importPath =\n \"./\" + path.relative(process.cwd(), fullPath).replace(/\\\\/g, \"/\");\n\n routes.push({\n method,\n route: routePath || \"/\",\n importPath,\n });\n }\n }\n\n return routes;\n } catch (error) {\n console.error(`Error scanning API directory ${dir}:`, error);\n return [];\n }\n}\n\n// Tools functionality\nfunction isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*[a-z0-9]$/.test(str) || /^[a-z]$/.test(str);\n}\n\nfunction validateToolFile(filePath: string, fileName: string): string | null {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const hasDefaultExport = /export\\s+default\\s+defineTool/.test(content);\n\n if (!hasDefaultExport) {\n return `Tool file '${fileName}.ts' must have a default export using defineTool()`;\n }\n\n return null;\n } catch (error) {\n return `Failed to read tool file '${fileName}.ts'`;\n }\n}\n\nasync function scanToolsDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const tools: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return tools;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n let toolError: string | undefined;\n\n const validationError = validateToolFile(filePath, fileName);\n\n if (validationError) {\n toolError = validationError;\n console.error(`\\n❌ Tool validation error: ${validationError}`);\n }\n\n if (!isSnakeCase(fileName)) {\n const warning = `Tool name should be in snake_case format (e.g., 'log_name', 'send_email')`;\n if (toolError) {\n toolError += ` | ${warning}`;\n } else {\n toolError = warning;\n }\n console.warn(\n `\\n⚠️ Tool naming warning: '${fileName}' should be in snake_case format (e.g., 'log_name', 'send_email')`\n );\n }\n\n tools.push({ name: fileName, importPath, error: toolError });\n }\n }\n\n return tools;\n}\n\nasync function scanHooksDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string }>> {\n const hooks: Array<{ name: string; importPath: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return hooks;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n\n // Skip index.ts - it's a utility module, not a hook\n if (fileName === \"index\") {\n continue;\n }\n\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n hooks.push({ name: fileName, importPath });\n }\n }\n\n return hooks;\n}\n\n/**\n * Scan a directory for config definitions (models, prompts, or agents).\n * Extracts the name from the defineX() call in each file.\n */\nasync function scanConfigDirectory(\n dir: string,\n definePattern: RegExp\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const items: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return items;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n // Check for default export with define function\n const hasDefaultExport = definePattern.test(content);\n if (!hasDefaultExport) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `File must have a default export using the define function`,\n });\n continue;\n }\n\n // Extract name from defineX({ name: 'xxx', ... })\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n items.push({ name: nameMatch[1], importPath });\n } else {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Could not extract name from definition`,\n });\n }\n } catch (error) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Failed to read file: ${error}`,\n });\n }\n }\n }\n\n return items;\n}\n\nasync function scanModelsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineModel/);\n}\n\nasync function scanPromptsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+definePrompt/);\n}\n\nasync function scanAgentsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineAgent/);\n}\n\n/**\n * Parse JSON body from an incoming HTTP request (Node.js IncomingMessage).\n * Used by dev-mode API handlers that intercept requests before they reach workerd.\n */\nfunction parseRequestBody(req: import('http').IncomingMessage): Promise<any> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch (e) {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\nexport interface AgentPluginOptions {\n mountPoint?: string;\n toolsDir?: string;\n hooksDir?: string;\n apiDir?: string;\n modelsDir?: string;\n promptsDir?: string;\n agentsDir?: string;\n}\n\nexport function agentbuilder(options: AgentPluginOptions = {}): Plugin {\n // Normalize mount point: ensure leading slash, no trailing slash\n let mountPoint = options.mountPoint || \"/agents\";\n if (!mountPoint.startsWith(\"/\")) {\n mountPoint = \"/\" + mountPoint;\n }\n if (mountPoint.endsWith(\"/\") && mountPoint.length > 1) {\n mountPoint = mountPoint.slice(0, -1);\n }\n\n const toolsDir = options.toolsDir\n ? path.resolve(process.cwd(), options.toolsDir)\n : path.resolve(process.cwd(), \"agents/tools\");\n const hooksDir = options.hooksDir\n ? path.resolve(process.cwd(), options.hooksDir)\n : path.resolve(process.cwd(), \"agents/hooks\");\n const threadApiDir = options.apiDir\n ? path.resolve(process.cwd(), options.apiDir)\n : path.resolve(process.cwd(), \"agents/api\");\n const modelsDir = options.modelsDir\n ? path.resolve(process.cwd(), options.modelsDir)\n : path.resolve(process.cwd(), \"agents/models\");\n const promptsDir = options.promptsDir\n ? path.resolve(process.cwd(), options.promptsDir)\n : path.resolve(process.cwd(), \"agents/prompts\");\n const agentsDir = options.agentsDir\n ? path.resolve(process.cwd(), options.agentsDir)\n : path.resolve(process.cwd(), \"agents/agents\");\n const outputDir = path.resolve(process.cwd(), \".agents\");\n\n // Type generation configuration\n const typeGenConfig = {\n modelsDir,\n promptsDir,\n agentsDir,\n toolsDir,\n outputDir,\n };\n\n // Helper to regenerate types\n function regenerateTypes() {\n if (needsRegeneration(typeGenConfig)) {\n generateTypes(typeGenConfig);\n }\n }\n\n // Read and prepare rou3 code for inlining\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const rou3Path = path.join(__dirname, '../dist/rou3.js');\n let rou3Code = '';\n try {\n rou3Code = fs.readFileSync(rou3Path, 'utf-8')\n // Remove export statement\n .replace(/^export \\{[^}]+\\};?\\s*$/gm, '')\n // Remove sourcemap comments\n .replace(/\\/\\/# sourceMappingURL=.+$/gm, '')\n .trim();\n } catch (err) {\n console.warn('[vite-plugin-agent] Could not read rou3.js for inlining:', err);\n }\n\n let routesVersion = Math.random().toString(36).substring(7);\n\n // Helper to dynamically find the worker environment (non-client environment)\n // The actual environment name comes from the user's wrangler.jsonc 'name' property\n // and is transformed to snake_case by the Cloudflare Vite plugin\n function getWorkerEnvironment(server: ViteDevServer) {\n const envNames = Object.keys(server.environments);\n // Find the first environment that's not 'client' (the default client environment)\n const workerEnvName = envNames.find(name => name !== 'client');\n\n if (!workerEnvName) {\n console.warn('[vite-plugin-agent] Could not find worker environment');\n return null;\n }\n\n return server.environments[workerEnvName];\n }\n\n // Helper functions for module reloading\n function reloadToolsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const toolsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_TOOLS_ID\n );\n if (toolsModule) {\n workerEnv.reloadModule(toolsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:tools-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadRoutesModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routesModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTES_ID\n );\n if (routesModule) {\n routesVersion = Math.random().toString(36).substring(7);\n workerEnv.reloadModule(routesModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:routes-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadHooksModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const hooksModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_HOOKS_ID\n );\n if (hooksModule) {\n workerEnv.reloadModule(hooksModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:hooks-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadModelsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const modelsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODELS_ID\n );\n if (modelsModule) {\n await workerEnv.reloadModule(modelsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:models-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadPromptsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const promptsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_PROMPTS_ID\n );\n if (promptsModule) {\n await workerEnv.reloadModule(promptsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:prompts-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadAgentsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const agentsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_AGENTS_ID\n );\n if (agentsModule) {\n await workerEnv.reloadModule(agentsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:agents-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadRouterModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routerModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTER_ID\n );\n if (routerModule) {\n await workerEnv.reloadModule(routerModule);\n return true;\n }\n return false;\n }\n\n function handleFileChange(\n file: string,\n server: ViteDevServer\n ) {\n const isToolFile = file.startsWith(toolsDir) && file.endsWith(\".ts\");\n const isThreadApiFile = file.startsWith(threadApiDir) && file.endsWith(\".ts\");\n const isHookFile = file.startsWith(hooksDir) && file.endsWith(\".ts\");\n const isModelFile = file.startsWith(modelsDir) && file.endsWith(\".ts\");\n const isPromptFile = file.startsWith(promptsDir) && file.endsWith(\".ts\");\n const isAgentFile = file.startsWith(agentsDir) && file.endsWith(\".ts\");\n\n const isConfigFile = isModelFile || isPromptFile || isAgentFile;\n\n if (!isToolFile && !isThreadApiFile && !isHookFile && !isConfigFile) return;\n\n // Regenerate types when config files change\n if (isConfigFile || isToolFile) {\n regenerateTypes();\n }\n\n if (isToolFile) {\n reloadToolsModule(server);\n }\n\n if (isModelFile) {\n reloadModelsModule(server);\n }\n\n if (isPromptFile) {\n reloadPromptsModule(server);\n }\n\n if (isAgentFile) {\n reloadAgentsModule(server);\n }\n\n if (isThreadApiFile) {\n reloadRoutesModule(server);\n }\n\n if (isHookFile) {\n reloadHooksModule(server);\n }\n }\n\n return {\n name: \"vite-plugin-agent\",\n\n config() {\n return {\n optimizeDeps: {\n // Pre-bundle these deps to prevent reload during startup\n include: ['openai', 'zod'],\n // Exclude workspace packages from pre-bundling to prevent \"new version of pre-bundle\" errors\n // during first startup when node_modules/.vite cache is empty\n exclude: [\n '@standardagents/builder/mcp',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ],\n },\n ssr: {\n // Mark as external for SSR/worker builds to prevent bundling\n // Note: @standardagents/builder, @standardagents/builder/runtime, built-in-routes, and rou3\n // are NOT external - they must be bundled into the worker for Cloudflare Workers runtime\n external: [\n '@standardagents/builder/mcp',\n ],\n },\n build: {\n rollupOptions: {\n // Also mark as external for Rollup/build (used by Cloudflare Workers plugin)\n // Note: @standardagents/builder, @standardagents/builder/runtime, built-in-routes, and rou3\n // are NOT external - they must be bundled into the worker for Cloudflare Workers runtime\n external: [\n '@standardagents/builder/mcp',\n ],\n },\n },\n };\n },\n\n resolveId(id) {\n if (id === VIRTUAL_TOOLS_ID) {\n return RESOLVED_VIRTUAL_TOOLS_ID;\n }\n if (id === VIRTUAL_ROUTES_ID || id === VIRTUAL_ROUTER_ID) {\n return RESOLVED_VIRTUAL_ROUTES_ID;\n }\n if (id === VIRTUAL_HOOKS_ID) {\n return RESOLVED_VIRTUAL_HOOKS_ID;\n }\n if (id === VIRTUAL_CONFIG_ID) {\n return RESOLVED_VIRTUAL_CONFIG_ID;\n }\n if (id === VIRTUAL_THREAD_API_ID) {\n return RESOLVED_VIRTUAL_THREAD_API_ID;\n }\n if (id === VIRTUAL_MODELS_ID) {\n return RESOLVED_VIRTUAL_MODELS_ID;\n }\n if (id === VIRTUAL_PROMPTS_ID) {\n return RESOLVED_VIRTUAL_PROMPTS_ID;\n }\n if (id === VIRTUAL_AGENTS_ID) {\n return RESOLVED_VIRTUAL_AGENTS_ID;\n }\n if (id === VIRTUAL_BUILDER_ID) {\n return RESOLVED_VIRTUAL_BUILDER_ID;\n }\n },\n\n async load(id) {\n\n if (id === RESOLVED_VIRTUAL_TOOLS_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n const moduleCode = `// Virtual agent tools module\nexport const tools = {\n${toolsCode}\n};`;\n return moduleCode;\n }\n\n if (id === RESOLVED_VIRTUAL_ROUTES_ID) {\n // Scan user thread API directory\n const threadRoutes = scanApiDirectory(threadApiDir);\n\n // Generate user thread route registration code\n const threadRouteCode = threadRoutes\n .map(({ method, route, importPath }) => {\n const apiRoute = `/api/threads/:id${route}`;\n return ` addRoute(\n router,\n \"${method}\",\n \"${apiRoute}\",\n /* v${routesVersion} */ async () => (await import(\"${importPath}\")).default\n );`;\n })\n .join('\\n');\n\n return `// Inline rou3 router code (no external imports)\n${rou3Code}\n\nimport { registerBuiltInRoutes } from \"@standardagents/builder/built-in-routes\";\nimport { config } from \"virtual:@standardagents-config\";\nimport { tools } from \"virtual:@standardagents-tools\";\nimport { hooks } from \"virtual:@standardagents-hooks\";\nimport { models, modelNames } from \"virtual:@standardagents-models\";\nimport { prompts, promptNames } from \"virtual:@standardagents-prompts\";\nimport { agents, agentNames } from \"virtual:@standardagents-agents\";\nimport { requireAuth } from \"@standardagents/builder/runtime\";\n\nconst MOUNT_POINT = \"${mountPoint}\";\n\n// Routes that don't require authentication\nconst PUBLIC_ROUTES = [\n '/api/auth/login',\n '/api/auth/config',\n '/api/auth/oauth/github',\n '/api/auth/oauth/google',\n '/api/auth/oauth/github/callback',\n '/api/auth/oauth/google/callback'\n];\n\n// Check if a route is public (no auth required)\nfunction isPublicRoute(routePath) {\n // Exact match for auth routes\n if (PUBLIC_ROUTES.includes(routePath)) {\n return true;\n }\n\n // Thread routes are always public\n if (routePath.startsWith('/api/threads/') || routePath === '/api/threads') {\n return true;\n }\n\n return false;\n}\n\nexport async function router(request, env) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Check if request is under mount point\n if (!pathname.startsWith(MOUNT_POINT)) {\n return null;\n }\n\n // Strip mount point prefix for route matching, ensuring we keep the leading slash\n let routePath = pathname.slice(MOUNT_POINT.length) || \"/\";\n if (!routePath.startsWith('/')) {\n routePath = '/' + routePath;\n }\n\n // Handle API routes\n const router = createRouter();\n\n // Register built-in API routes with runtime data\n registerBuiltInRoutes(router, { config, tools, models, modelNames, prompts, promptNames, agents, agentNames });\n\n // Register user thread API routes\n${threadRouteCode}\n\n const routeMatch = findRoute(\n router,\n request.method.toUpperCase(),\n routePath\n );\n\n if (routeMatch) {\n // Check if authentication is required for this route\n const publicRoute = isPublicRoute(routePath);\n const isApiRoute = routePath.startsWith('/api/');\n\n let authContext = null;\n\n // Require authentication for all API routes except public ones\n if (isApiRoute && !publicRoute) {\n const authResult = await requireAuth(request, env);\n\n // If requireAuth returns a Response, it's an error (401)\n if (authResult instanceof Response) {\n return authResult;\n }\n\n authContext = authResult;\n }\n\n const controller = await routeMatch.data();\n const context = {\n req: request,\n params: routeMatch.params || {},\n env: env,\n url: url,\n config,\n tools,\n auth: authContext, // Add auth context to controller context\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // Serve UI for all other routes (SPA fallback)\n return serveUI(routePath, env);\n}\n\nasync function serveUI(pathname, env) {\n try {\n // Use Cloudflare Workers Assets binding (automatically created from wrangler assets config)\n if (env.ASSETS) {\n try {\n // Create a proper request for the asset path\n // Use a dummy origin since we only care about the path\n // Re-add mount point since pathname was stripped by router\n const assetUrl = \\`http://localhost\\${MOUNT_POINT}\\${pathname}\\`;\n let response = await env.ASSETS.fetch(assetUrl);\n\n // If not found, fall back to index.html for SPA routing\n const isIndexHtml = response.status === 404 || pathname === \"/\" || !pathname.includes(\".\");\n if (isIndexHtml) {\n response = await env.ASSETS.fetch(\\`http://localhost\\${MOUNT_POINT}/index.html\\`);\n\n // Transform HTML to use configured mount point\n if (response.status === 200) {\n const html = await response.text();\n // Replace default /agents/ paths with configured mount point\n const modifiedHtml = html.replace(/\\\\/agents\\\\//g, \\`\\${MOUNT_POINT}/\\`);\n return new Response(modifiedHtml, {\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n },\n });\n }\n }\n\n return response;\n } catch (assetError) {\n console.error(\"Error fetching from ASSETS:\", assetError);\n }\n }\n\n // Fallback: proxy to UI dev server if explicitly configured\n if (env.UI_DEV_SERVER) {\n const assetPath = pathname === \"/\" ? \"/index.html\" : pathname;\n const response = await fetch(\\`\\${env.UI_DEV_SERVER}\\${assetPath}\\`);\n return response;\n }\n\n // In production/dev, assets should be served by Cloudflare Workers automatically\n // This function only handles fallback cases\n return null;\n } catch (error) {\n console.error(\"Error serving UI:\", error);\n return null;\n }\n}\n\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_HOOKS_ID) {\n const hooks = await scanHooksDirectory(hooksDir);\n\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n return `// Virtual agent hooks module\nexport const hooks = {\n${hooksCode}\n};`;\n }\n\n if (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n // Get relative paths from cwd\n const relativeToolsDir = path.relative(process.cwd(), toolsDir).replace(/\\\\/g, \"/\");\n const relativeHooksDir = path.relative(process.cwd(), hooksDir).replace(/\\\\/g, \"/\");\n const relativeApiDir = path.relative(process.cwd(), threadApiDir).replace(/\\\\/g, \"/\");\n const relativeModelsDir = path.relative(process.cwd(), modelsDir).replace(/\\\\/g, \"/\");\n const relativePromptsDir = path.relative(process.cwd(), promptsDir).replace(/\\\\/g, \"/\");\n const relativeAgentsDir = path.relative(process.cwd(), agentsDir).replace(/\\\\/g, \"/\");\n\n return `// Virtual agent config module\nexport const config = {\n toolsDir: \"${relativeToolsDir}\",\n hooksDir: \"${relativeHooksDir}\",\n apiDir: \"${relativeApiDir}\",\n modelsDir: \"${relativeModelsDir}\",\n promptsDir: \"${relativePromptsDir}\",\n agentsDir: \"${relativeAgentsDir}\",\n mountPoint: \"${mountPoint}\",\n};`;\n }\n\n // Virtual modules for models, prompts, and agents\n if (id === RESOLVED_VIRTUAL_MODELS_ID) {\n const models = await scanModelsDirectory(modelsDir);\n\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent models module\nexport const models = {\n${modelsCode}\n};\n\nexport const modelNames = ${JSON.stringify(models.filter(m => !m.error).map(m => m.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_PROMPTS_ID) {\n const prompts = await scanPromptsDirectory(promptsDir);\n\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent prompts module\nexport const prompts = {\n${promptsCode}\n};\n\nexport const promptNames = ${JSON.stringify(prompts.filter(p => !p.error).map(p => p.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_AGENTS_ID) {\n const agents = await scanAgentsDirectory(agentsDir);\n\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent agents module\nexport const agents = {\n${agentsCode}\n};\n\nexport const agentNames = ${JSON.stringify(agents.filter(a => !a.error).map(a => a.name))};\n`;\n }\n\n // Consolidated virtual module: virtual:@standardagents/builder\n // Exports DurableThread and DurableAgentBuilder classes with methods already implemented\n if (id === RESOLVED_VIRTUAL_BUILDER_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n const hooks = await scanHooksDirectory(hooksDir);\n const models = await scanModelsDirectory(modelsDir);\n const prompts = await scanPromptsDirectory(promptsDir);\n const agents = await scanAgentsDirectory(agentsDir);\n\n // Helper to convert relative paths to absolute paths\n // Virtual modules need absolute paths since relative paths are resolved against the virtual module location\n const toAbsolutePath = (relativePath: string) => {\n if (relativePath.startsWith('./')) {\n return path.resolve(process.cwd(), relativePath).replace(/\\\\/g, '/');\n }\n return relativePath;\n };\n\n // Generate tools code\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate hooks code\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n const absPath = toAbsolutePath(importPath);\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n // Generate models code\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate prompts code\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate agents code\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Consolidated virtual module: virtual:@standardagents/builder\n// Provides DurableThread, DurableAgentBuilder, and router\nimport { DurableThread as _BaseDurableThread } from '@standardagents/builder/runtime';\nimport { DurableAgentBuilder as _BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n\n// Re-export router from virtual:@standardagents-routes\nexport { router } from 'virtual:@standardagents-routes';\n\n// Registry objects\nconst _tools = {\n${toolsCode}\n};\n\nconst _hooks = {\n${hooksCode}\n};\n\nconst _models = {\n${modelsCode}\n};\n\nconst _prompts = {\n${promptsCode}\n};\n\nconst _agents = {\n${agentsCode}\n};\n\n/**\n * DurableThread with all virtual module methods already implemented.\n * Simply extend this class in your agents/Thread.ts file.\n */\nexport class DurableThread extends _BaseDurableThread {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n\n/**\n * DurableAgentBuilder with all virtual module methods already implemented.\n * Simply extend this class in your agents/AgentBuilder.ts file.\n */\nexport class DurableAgentBuilder extends _BaseDurableAgentBuilder {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n`;\n }\n },\n\n buildStart() {\n // Generate types on startup\n regenerateTypes();\n\n // Watch all directories\n this.addWatchFile(toolsDir);\n this.addWatchFile(threadApiDir);\n this.addWatchFile(hooksDir);\n this.addWatchFile(modelsDir);\n this.addWatchFile(promptsDir);\n this.addWatchFile(agentsDir);\n },\n\n configureServer(server) {\n // Watch for new files being added\n server.watcher.on(\"add\", async (file) => {\n handleFileChange(file, server);\n });\n\n // Watch for files being deleted\n server.watcher.on(\"unlink\", (file) => {\n handleFileChange(file, server);\n });\n\n // Add middleware to serve AgentBuilder UI\n // This emulates how Cloudflare Workers Assets binding works in production\n server.middlewares.use(async (req, res, next) => {\n const url = req.url;\n\n // Check if request is under mount point\n if (!url || !url.startsWith(mountPoint)) {\n next();\n return;\n }\n\n // Strip mount point prefix, ensuring we keep the leading slash\n let pathWithoutMount = url.slice(mountPoint.length) || '/';\n if (!pathWithoutMount.startsWith('/')) {\n pathWithoutMount = '/' + pathWithoutMount;\n }\n\n // Handle dev-only API routes that require filesystem access\n // These endpoints write to the filesystem and must be handled in Node.js\n const method = req.method?.toUpperCase();\n\n // GET /api/models - List all models (handled here to read fresh from filesystem)\n if (pathWithoutMount === '/api/models' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const modelList = files.map((file: string) => {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getProvider = (c: string) => c.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getInputPrice = (c: string) => {\n const match = c.match(/inputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getOutputPrice = (c: string) => {\n const match = c.match(/outputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getCachedPrice = (c: string) => {\n const match = c.match(/cachedPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getIncludedProviders = (c: string) => {\n const match = c.match(/includedProviders:\\s*\\[([^\\]]*)\\]/);\n if (!match) return undefined;\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getFallbacks = (c: string) => {\n const match = c.match(/fallbacks:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const fallbacks = getFallbacks(content);\n const fallbackObjects = fallbacks.map((fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n }));\n\n return {\n id: name,\n name: name,\n provider: getProvider(content),\n model: getModel(content),\n input_price: getInputPrice(content),\n output_price: getOutputPrice(content),\n cached_price: getCachedPrice(content),\n included_providers: getIncludedProviders(content),\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading model ${file}:`, error);\n return null;\n }\n });\n\n const validModels = modelList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ models: validModels }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list models' }));\n return;\n }\n }\n\n // POST /api/models - Create a new model\n if (pathWithoutMount === '/api/models' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n const validationError = validateModelData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if model already exists\n if (modelExists(modelsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveModel(modelsDir, body, false);\n\n if (result.success) {\n // Reload the models virtual module to reflect the new model\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create model' }));\n return;\n }\n }\n\n // PUT /api/models/:name - Update an existing model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelPutMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelPutMatch && method === 'PUT') {\n try {\n const urlModelName = decodeURIComponent(modelPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlModelName;\n\n const validationError = validateModelData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n\n if (isNameChange) {\n // Rename the model file first\n const renameResult = await renameModel(modelsDir, urlModelName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update model references in all prompts\n updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);\n }\n\n // Save the updated model data\n const result = await saveModel(modelsDir, body, true);\n\n if (result.success) {\n // Reload the models virtual module to reflect the changes\n await reloadModelsModule(server);\n\n // If prompts were updated due to cascade, reload prompts module too\n if (updatedPrompts.length > 0) {\n await reloadPromptsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n // Small delay to ensure filesystem operations are fully flushed\n await new Promise(resolve => setTimeout(resolve, 100));\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlModelName, to: newName }, updatedPrompts }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update model' }));\n return;\n }\n }\n\n // DELETE /api/models/:name - Delete a model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelDeleteMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelDeleteMatch && method === 'DELETE') {\n try {\n const modelName = decodeURIComponent(modelDeleteMatch[1]);\n const result = await deleteModel(modelsDir, modelName);\n\n if (result.success) {\n // Reload the models virtual module to reflect the deletion\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: modelName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete model' }));\n return;\n }\n }\n\n // POST /api/prompts - Create a new prompt\n if (pathWithoutMount === '/api/prompts' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n const validationError = validatePromptData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if prompt already exists\n if (promptExists(promptsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Prompt '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await savePrompt(promptsDir, body, false);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the new prompt\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create prompt' }));\n return;\n }\n }\n\n // PUT /api/prompts/:name - Update an existing prompt\n const promptPutMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptPutMatch && method === 'PUT') {\n try {\n const urlPromptName = decodeURIComponent(promptPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlPromptName;\n\n const validationError = validatePromptData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n let updatedAgents: string[] = [];\n\n if (isNameChange) {\n // Rename the prompt file first\n const renameResult = await renamePrompt(promptsDir, urlPromptName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update prompt references in other prompts (tools array)\n updatedPrompts = await updatePromptReferencesInPrompts(promptsDir, urlPromptName, newName);\n\n // Cascade update: update prompt references in agents (defaultPrompt field)\n updatedAgents = await updatePromptReferencesInAgents(agentsDir, urlPromptName, newName);\n }\n\n // Save the updated prompt data (will overwrite the renamed file)\n const result = await savePrompt(promptsDir, body, true);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the changes\n await reloadPromptsModule(server);\n\n // If agents were updated due to cascade, reload agents module too\n if (updatedAgents.length > 0) {\n await reloadAgentsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlPromptName, to: newName }, updatedPrompts, updatedAgents }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update prompt' }));\n return;\n }\n }\n\n // DELETE /api/prompts/:name - Delete a prompt\n const promptDeleteMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptDeleteMatch && method === 'DELETE') {\n try {\n const promptName = decodeURIComponent(promptDeleteMatch[1]);\n const result = await deletePrompt(promptsDir, promptName);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the deletion\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: promptName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete prompt' }));\n return;\n }\n }\n\n // POST /api/agents - Create a new agent\n if (pathWithoutMount === '/api/agents' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n const validationError = validateAgentData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if agent already exists\n if (agentExists(agentsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Agent '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveAgent(agentsDir, body, false);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the new agent\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create agent' }));\n return;\n }\n }\n\n // PUT /api/agents/:name - Update an existing agent\n const agentPutMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentPutMatch && method === 'PUT') {\n try {\n const agentName = decodeURIComponent(agentPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n\n // Ensure the name in the body matches the URL (or use URL name)\n body.name = agentName;\n\n const validationError = validateAgentData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // For updates, the agent should exist (but we allow overwrite)\n const result = await saveAgent(agentsDir, body, true);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the changes\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update agent' }));\n return;\n }\n }\n\n // DELETE /api/agents/:name - Delete an agent\n const agentDeleteMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentDeleteMatch && method === 'DELETE') {\n try {\n const agentName = decodeURIComponent(agentDeleteMatch[1]);\n const result = await deleteAgent(agentsDir, agentName);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the deletion\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: agentName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete agent' }));\n return;\n }\n }\n\n // Let other API routes pass through to the worker\n if (pathWithoutMount.startsWith('/api/')) {\n next();\n return;\n }\n\n // Check for UI dev server proxy mode (for HMR during development)\n // Only proxy non-API routes (UI assets, SPA routes)\n const uiDevServer = process.env.UI_DEV_SERVER;\n if (uiDevServer && !pathWithoutMount.startsWith('/api/')) {\n // In HMR mode, proxy UI requests to the Vite dev server\n // pathWithoutMount already has leading slash (e.g., '/index.html')\n // UI dev server runs with VITE_BASE matching our mountPoint\n const targetUrl = `${uiDevServer}${pathWithoutMount}`;\n try {\n const proxyRes = await fetch(targetUrl);\n res.statusCode = proxyRes.status;\n\n // Forward response headers (except those that shouldn't be forwarded)\n proxyRes.headers.forEach((value, key) => {\n if (!['content-encoding', 'transfer-encoding'].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n const body = await proxyRes.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n } catch (error) {\n console.error('[agentbuilder] Failed to proxy to UI dev server:', error);\n // Fall through to static file serving as fallback\n }\n }\n\n // Check if this is a static asset request\n const isStaticAsset = pathWithoutMount.startsWith('/assets/') ||\n pathWithoutMount.startsWith('/vendor.js') ||\n pathWithoutMount.startsWith('/vue.js') ||\n pathWithoutMount.startsWith('/monaco.js') ||\n pathWithoutMount.startsWith('/index.js') ||\n pathWithoutMount.startsWith('/index.css') ||\n pathWithoutMount.match(/\\.(js|css|png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/);\n\n // For static assets, serve the actual file\n // For all other routes (including SPA routes like /login, /threads, etc.), serve index.html\n const shouldServeUI = true;\n\n if (shouldServeUI) {\n // Serve from the built client directory\n // Client is always at dist/client relative to package root\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n let filePath: string;\n if (isStaticAsset) {\n // For static assets, serve the actual file\n const cleanUrl = pathWithoutMount.split('?')[0];\n filePath = path.join(clientDir, cleanUrl);\n } else {\n // For all other routes (SPA routes), serve index.html\n filePath = path.join(clientDir, 'index.html');\n }\n\n try {\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath);\n\n // Inject mount point config into HTML\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n // Set appropriate MIME type\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.ttf': 'font/ttf',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n };\n\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n res.setHeader('Content-Type', contentType);\n res.end(content);\n return;\n }\n } catch (error) {\n console.error('Error serving AgentBuilder UI:', error);\n }\n }\n\n next();\n });\n },\n\n handleHotUpdate({ file, server }) {\n handleFileChange(file, server);\n },\n\n writeBundle(options, bundle) {\n // In production build, copy client files to user's dist directory\n // Files go to dist/client/{mountPath} to match ASSETS binding expectations\n const outDir = options.dir || 'dist';\n // Put client files in a 'client' subdirectory, preserving mountPath structure\n // This ensures ASSETS can find files at the expected paths (e.g., /agentbuilder/index.html)\n const mountPath = mountPoint.slice(1); // \"agentbuilder\" or \"\"\n const mountDir = mountPath\n ? path.join(outDir, '../client', mountPath) // dist/client/agentbuilder\n : path.join(outDir, '../client'); // dist/client\n\n // Locate the client directory\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n if (!fs.existsSync(clientDir)) {\n console.warn(`[agentbuilder] Client directory not found at ${clientDir}`);\n return;\n }\n\n // Create mount directory\n fs.mkdirSync(mountDir, { recursive: true });\n\n // Copy all client files recursively\n function copyRecursive(src: string, dest: string) {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyRecursive(srcPath, destPath);\n } else {\n let content = fs.readFileSync(srcPath);\n\n // Inject mount point config into index.html\n if (entry.name === 'index.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n fs.writeFileSync(destPath, content);\n }\n }\n }\n\n copyRecursive(clientDir, mountDir);\n },\n };\n}\n","import { createRouter, findRoute } from \"rou3\";\nimport type { ThreadInstance, ThreadMetadata } from \"../agents/types.js\";\n\n/**\n * Minimum required environment bindings for thread endpoints.\n * User's Env interface should extend this.\n *\n * Uses Rpc.DurableObjectBranded to allow users to specify their own\n * Durable Object types that extend DurableThread/DurableAgentBuilder.\n */\nexport interface ThreadEnv {\n AGENT_BUILDER_THREAD: DurableObjectNamespace<Rpc.DurableObjectBranded>;\n AGENT_BUILDER: DurableObjectNamespace<Rpc.DurableObjectBranded>; // Root DO for thread/config lookups\n}\n\nexport interface ControllerContext<Env = any> {\n req: Request;\n params: Record<string, string>;\n env: Env;\n url: URL;\n}\n\nexport type Controller<Env = any> = (\n context: ControllerContext<Env>\n) =>\n | string\n | Promise<string>\n | Response\n | Promise<Response>\n | ReadableStream\n | Promise<ReadableStream>\n | null\n | Promise<null>\n | void\n | Promise<void>\n | Promise<object>\n | object;\n\nexport interface ThreadEndpointContext {\n req: Request;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n}\n\nexport async function route<Env = any>(\n url: URL,\n request: Request,\n env: Env\n): Promise<Response | null> {\n const router = createRouter<() => Promise<Controller>>();\n // @ts-ignore-next-line\n const routesLoader = await import(\"virtual:@standardagents-routes\");\n routesLoader.default(router);\n\n // Check for API routes first\n const route = findRoute<() => Promise<Controller>>(\n router,\n request.method.toUpperCase(),\n url.pathname\n );\n\n if (route) {\n const controller = await route.data();\n const context: ControllerContext = {\n req: request,\n params: route.params || {},\n env: env,\n url: url,\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // No API route found - not handled by this router\n // Static assets and SPA routing are handled by Cloudflare Workers Assets binding\n // configured in wrangler.jsonc\n return null;\n}\n\nexport function defineController<Env = any>(controller: Controller<Env>): Controller<Env> {\n return controller;\n}\n\n/**\n * Define a thread-specific endpoint that has access to the thread's DurableObject instance and metadata.\n * This wraps defineController and automatically looks up the thread by ID from the URL params.\n *\n * @param handler - Function that receives the request and thread context\n * @returns A Controller that can be used with the router\n *\n * @example\n * // agentbuilder/api/status.ts\n * export default defineThreadEndpoint(async (req, { thread }) => {\n * const messages = await thread.instance.getMessages();\n * return Response.json({ status: \"ok\", messageCount: messages.length });\n * });\n */\nexport function defineThreadEndpoint<Env extends ThreadEnv = ThreadEnv>(\n handler: (\n req: Request,\n context: ThreadEndpointContext[\"thread\"]\n ) => Response | Promise<Response>\n): Controller<Env> {\n return defineController<Env>(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Create ThreadInstance reference\n // Note: We can't access ctx and env directly, but we can call RPC methods\n const instance = stub as unknown as ThreadInstance;\n\n // Call handler with thread context\n return await handler(req, {\n instance,\n metadata,\n });\n } catch (error: any) {\n console.error(`Error in thread endpoint for ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Internal server error\" },\n { status: 500 }\n );\n }\n });\n}\n","/**\n * Authentication utilities for user sessions, API keys, and password hashing\n */\n\n/**\n * Generate a cryptographically secure random string\n */\nexport function generateSecureToken(length: number = 32): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate a user session token with prefix\n */\nexport function generateUserToken(): string {\n return `agtuser_${generateSecureToken(32)}`;\n}\n\n/**\n * Generate an API key with prefix\n */\nexport function generateApiKey(): string {\n return `agtbldr_${generateSecureToken(32)}`;\n}\n\n/**\n * Hash a password using PBKDF2\n */\nexport async function hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Generate a random salt\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using PBKDF2\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n // Combine salt and hash\n const hashArray = new Uint8Array(derivedBits);\n const combined = new Uint8Array(salt.length + hashArray.length);\n combined.set(salt);\n combined.set(hashArray, salt.length);\n\n // Return as base64\n return bufferToBase64(combined);\n}\n\n/**\n * Verify a password against its hash\n */\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n try {\n const combined = base64ToBuffer(hash);\n\n // Extract salt and hash\n const salt = combined.slice(0, 16);\n const storedHash = combined.slice(16);\n\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using the same salt\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n const derivedHash = new Uint8Array(derivedBits);\n\n // Compare hashes\n if (derivedHash.length !== storedHash.length) {\n return false;\n }\n\n let matches = true;\n for (let i = 0; i < derivedHash.length; i++) {\n if (derivedHash[i] !== storedHash[i]) {\n matches = false;\n }\n }\n\n return matches;\n } catch (error) {\n console.error('Error verifying password:', error);\n return false;\n }\n}\n\n/**\n * Hash a token or API key using SHA-256\n */\nexport async function hashToken(token: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(token);\n\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n\n return Array.from(hashArray, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Extract the last N characters from a string\n */\nexport function getLastChars(str: string, count: number = 5): string {\n return str.slice(-count);\n}\n\n/**\n * Extract the prefix from a token (e.g., \"agtuser_\" or \"agtbldr_\")\n */\nexport function getTokenPrefix(token: string): string {\n const match = token.match(/^([^_]+_)/);\n return match ? match[1] : '';\n}\n\n/**\n * Validate token format\n */\nexport function isValidUserToken(token: string): boolean {\n return token.startsWith('agtuser_') && token.length > 10;\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n return key.startsWith('agtbldr_') && key.length > 10;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Sign a token payload using HMAC-SHA256 with the encryption key\n * Returns a signed token in the format: base64(payload).base64(signature)\n */\nexport async function signToken(payload: string, encryptionKey: string): Promise<string> {\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign the payload\n const payloadData = encoder.encode(payload);\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, payloadData);\n\n // Convert to base64\n const payloadB64 = bufferToBase64(new Uint8Array(payloadData));\n const signatureB64 = bufferToBase64(new Uint8Array(signature));\n\n return `${payloadB64}.${signatureB64}`;\n}\n\n/**\n * Verify a signed token and extract its payload\n * Returns the payload if valid, null if invalid\n */\nexport async function verifySignedToken(signedToken: string, encryptionKey: string): Promise<string | null> {\n try {\n const parts = signedToken.split('.');\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadB64, signatureB64] = parts;\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n // Decode the payload and signature\n const payloadData = base64ToBuffer(payloadB64);\n const signature = base64ToBuffer(signatureB64);\n\n // Verify the signature\n const isValid = await crypto.subtle.verify('HMAC', cryptoKey, signature, payloadData);\n\n if (!isValid) {\n return null;\n }\n\n // Decode payload to string\n const decoder = new TextDecoder();\n return decoder.decode(payloadData);\n } catch (error) {\n console.error('Error verifying signed token:', error);\n return null;\n }\n}\n\n/**\n * Generate a signed super admin token\n * Payload format: super_admin:timestamp:nonce\n */\nexport async function generateSuperAdminToken(encryptionKey: string): Promise<string> {\n const timestamp = Date.now();\n const nonce = generateSecureToken(16);\n const payload = `super_admin:${timestamp}:${nonce}`;\n return await signToken(payload, encryptionKey);\n}\n\n/**\n * Verify a super admin token\n * Returns true if valid, false otherwise\n */\nexport async function verifySuperAdminToken(token: string, encryptionKey: string): Promise<boolean> {\n const payload = await verifySignedToken(token, encryptionKey);\n if (!payload) {\n return false;\n }\n\n // Check payload format\n const parts = payload.split(':');\n if (parts.length !== 3 || parts[0] !== 'super_admin') {\n return false;\n }\n\n // Optionally check timestamp for expiration (30 days)\n const timestamp = parseInt(parts[1], 10);\n const age = Date.now() - timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n if (age > maxAge) {\n return false;\n }\n\n return true;\n}\n\n// Helper functions\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Authentication middleware for protecting API routes\n *\n * Supports multiple authentication types:\n * - Super admin token (signed with ENCRYPTION_KEY)\n * - User session token (validated against DurableAgentBuilder)\n * - API key (validated against DurableAgentBuilder)\n */\n\nimport {\n verifySuperAdminToken,\n hashToken,\n isValidUserToken,\n isValidApiKey,\n} from '../utils/auth.js';\n\nexport interface AuthUser {\n id: string;\n username: string;\n role: string;\n}\n\nexport interface AuthContext {\n user: AuthUser;\n authType: 'super_admin' | 'session' | 'api_key';\n}\n\n/**\n * Extract bearer token from Authorization header or query parameter (for WebSockets)\n */\nfunction extractBearerToken(request: Request): string | null {\n // First try Authorization header\n const authHeader = request.headers.get('Authorization');\n if (authHeader && authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // For WebSocket upgrade requests, check query parameter\n const isWebSocket =\n request.headers.get('upgrade')?.toLowerCase() === 'websocket';\n if (isWebSocket) {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get('token');\n if (token) {\n return token;\n }\n } catch (err) {\n // Invalid URL, continue\n }\n }\n\n return null;\n}\n\n/**\n * Get DurableAgentBuilder singleton stub\n */\nfunction getAgentBuilder(env: any): any {\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId);\n}\n\n/**\n * Authenticate a request using various token types\n */\nexport async function authenticate(\n request: Request,\n env: any\n): Promise<AuthContext | null> {\n const token = extractBearerToken(request);\n\n if (!token) {\n return null;\n }\n\n // Check if it's a signed super admin token (if super admin is configured)\n if (env.SUPER_ADMIN_PASSWORD && env.ENCRYPTION_KEY) {\n // Token contains a dot, might be a signed token\n if (token.includes('.')) {\n const isValidSuperAdmin = await verifySuperAdminToken(\n token,\n env.ENCRYPTION_KEY\n );\n if (isValidSuperAdmin) {\n return {\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n authType: 'super_admin',\n };\n }\n }\n }\n\n // Check if it's a user session token\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const session = await agentBuilder.validateSession(tokenHash);\n if (session) {\n // Get user details\n const user = await agentBuilder.getUserById(session.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'session',\n };\n }\n }\n }\n\n // Check if it's an API key\n if (isValidApiKey(token)) {\n const keyHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const apiKey = await agentBuilder.validateApiKey(keyHash);\n if (apiKey) {\n // Get user details\n const user = await agentBuilder.getUserById(apiKey.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'api_key',\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Middleware to require authentication\n * Returns 401 if not authenticated\n */\nexport async function requireAuth(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const authContext = await authenticate(request, env);\n\n if (!authContext) {\n return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return authContext;\n}\n\n/**\n * Middleware to require admin role\n * Returns 401 if not authenticated, 403 if not admin\n */\nexport async function requireAdmin(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const result = await requireAuth(request, env);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result.user.role !== 'admin') {\n return new Response(\n JSON.stringify({ error: 'Forbidden: Admin access required' }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n return result;\n}\n","import { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n ZodString,\n ZodNumber,\n ZodBoolean,\n ZodEnum,\n ZodArray,\n ZodObject,\n ZodOptional,\n ZodNullable,\n ZodUnion,\n ZodRecord,\n ZodNull,\n ZodLiteral,\n ZodDefault,\n} from \"zod\";\nimport { z } from \"zod\";\nimport { z as zv3 } from \"zod/v3\";\nimport type { FlowState } from \"../agents/types.js\";\n\n/** Decrement helper to stop recursion at depth 0 */\ntype Dec<N extends number> = N extends 10\n ? 9\n : N extends 9\n ? 8\n : N extends 8\n ? 7\n : N extends 7\n ? 6\n : N extends 6\n ? 5\n : N extends 5\n ? 4\n : N extends 4\n ? 3\n : N extends 3\n ? 2\n : N extends 2\n ? 1\n : N extends 1\n ? 0\n : 0;\n\n/**\n * Allowed Zod node for tool arguments.\n * Tweak this union as your single source of truth for what’s allowed.\n * Increase the default depth if you need crazier nesting.\n */\nexport type ToolArgsNode<D extends number = 7> =\n // primitives & literals\n | ZodString\n | ZodNumber\n | ZodBoolean\n | ZodNull\n | ZodLiteral<string | number | boolean | null>\n\n // enums\n | ZodEnum<Record<string, string>>\n\n // wrappers\n | (D extends 0 ? never : ZodOptional<ToolArgsNode<Dec<D>>>)\n | (D extends 0 ? never : ZodNullable<ToolArgsNode<Dec<D>>>)\n | (D extends 0 ? never : ZodDefault<ToolArgsNode<Dec<D>>>)\n\n // arrays\n | (D extends 0 ? never : ZodArray<ToolArgsNode<Dec<D>>>)\n\n // objects (fixed keys) and records (dynamic keys)\n | (D extends 0 ? never : ZodObject<Record<string, ToolArgsNode<Dec<D>>>>)\n | (D extends 0 ? never : ZodRecord<ZodString, ToolArgsNode<Dec<D>>>)\n\n // unions (JSON Schema oneOf)\n | (D extends 0\n ? never\n : ZodUnion<\n [\n ToolArgsNode<Dec<D>>,\n ToolArgsNode<Dec<D>>,\n ...ToolArgsNode<Dec<D>>[]\n ]\n >);\n// discriminated unions:\n// | (D extends 0 ? never : z.ZodDiscriminatedUnion<string, any>) // if you want to allow these\n\n// tuples (JSON Schema tuple form):\n// | (D extends 0 ? never : z.ZodTuple<[...ToolArgsNode<Dec<D>>[]]>)\n\n/**\n * Raw shape for an object whose values are ToolArgsNode.\n * This is what users write inside z.object({ ... }).\n */\nexport type ToolArgsRawShape<D extends number = 7> = Record<\n string,\n ToolArgsNode<D>\n>;\n\n/** The top-level schema must be an object for OpenAI tools. */\nexport type ToolArgs<D extends number = 7> = z.ZodObject<ToolArgsRawShape<D>>;\n\nexport type StructuredToolReturn = ToolArgs;\n\n/**\n * Defines a tool function. Tools accept the current flow state as well as the arguments being passed to them.\n */\nexport type Tool<Args extends ToolArgs | null = null> = Args extends ToolArgs\n ? (flow: FlowState, args: z.infer<Args>) => Promise<CallToolResult>\n : (flow: FlowState) => Promise<CallToolResult>;\n\n/**\n * @param toolDescription - Description of what the tool does.\n * @param args - The arguments for the tool.\n * @param tool - The tool function.\n * @returns A tuple containing the description, arguments and the tool function.\n */\nexport function defineTool<Args extends ToolArgs>(\n toolDescription: string,\n args: Args,\n tool: Tool<Args>\n): [string, Args, Tool<Args>, null];\nexport function defineTool(\n toolDescription: string,\n tool: Tool<null>\n): [string, null, Tool<null>, null];\nexport function defineTool<\n Args extends ToolArgs,\n RetValue extends StructuredToolReturn\n>(\n toolDescription: string,\n args: Args,\n tool: Tool<Args>,\n returnSchema: RetValue\n): [string, Args, Tool<Args>, RetValue];\nexport function defineTool<\n Args extends ToolArgs,\n RetValue extends StructuredToolReturn\n>(\n toolDescription: string,\n argsOrTool: Args | Tool,\n maybeTool?: Tool<Args>,\n returnSchema?: RetValue\n): [string, Args | null, Tool<Args> | Tool, RetValue | null] {\n if (maybeTool) {\n return [\n toolDescription,\n argsOrTool as Args,\n maybeTool,\n returnSchema ?? null,\n ];\n }\n return [toolDescription, null, argsOrTool as Tool, returnSchema ?? null];\n}\n","import type { FlowState, Message, ToolCall, ToolResult } from \"./types\";\n\n/**\n * Hook signatures for all available hooks\n */\nexport interface HookSignatures {\n /**\n * Called before messages are filtered and sent to the LLM\n * Receives SQL row data with all columns before transformation\n * Return value is transformed into chat completion format\n */\n filter_messages: (state: FlowState, rows: Message[]) => Promise<Message[]>;\n\n /**\n * Called after message history is loaded and before sending to LLM\n * Receives messages in chat completion format (already transformed)\n */\n prefilter_llm_history: (\n state: FlowState,\n messages: Array<{\n role: string;\n content: string | null;\n tool_calls?: any;\n tool_call_id?: string;\n name?: string;\n }>\n ) => Promise<\n Array<{\n role: string;\n content: string | null;\n tool_calls?: any;\n tool_call_id?: string;\n name?: string;\n }>\n >;\n\n /**\n * Called before a message is created in the database\n */\n before_create_message: (\n state: FlowState,\n message: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a message is created in the database\n */\n after_create_message: (\n state: FlowState,\n message: Record<string, any>\n ) => Promise<void>;\n\n /**\n * Called before a message is updated in the database\n */\n before_update_message: (\n state: FlowState,\n messageId: string,\n updates: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a message is updated in the database\n */\n after_update_message: (\n state: FlowState,\n message: Message\n ) => Promise<void>;\n\n /**\n * Called before a tool result is stored in the database\n */\n before_store_tool_result: (\n state: FlowState,\n toolCall: Record<string, any>,\n toolResult: Record<string, any>\n ) => Promise<Record<string, any>>;\n\n /**\n * Called after a successful tool call\n */\n after_tool_call_success: (\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ) => Promise<ToolResult | null>;\n\n /**\n * Called after a failed tool call\n */\n after_tool_call_failure: (\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ) => Promise<ToolResult | null>;\n}\n\n/**\n * Define a hook with strict typing based on hook name\n *\n * @example\n * ```typescript\n * export default defineHook('filter_messages', async (state, rows) => {\n * // Only include messages from last 10 turns\n * return rows.slice(-10);\n * });\n * ```\n */\nexport function defineHook<K extends keyof HookSignatures>(\n hookName: K,\n implementation: HookSignatures[K]\n): HookSignatures[K] {\n return implementation;\n}\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 1,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Metadata table for tracking schema version\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n await sql.exec(`\n INSERT OR IGNORE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n\n // Messages table - OpenAI chat completion format\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n role TEXT NOT NULL CHECK(role IN ('system', 'user', 'assistant', 'tool')),\n content TEXT,\n name TEXT,\n tool_calls TEXT,\n tool_call_id TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)\n `);\n\n // Tool calls table - detailed breakdown of function calls\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS tool_calls (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n type TEXT NOT NULL DEFAULT 'function',\n function_name TEXT NOT NULL,\n function_arguments TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_tool_calls_message_id ON tool_calls(message_id)\n `);\n\n // Logs table - pure telemetry, ephemeral, can be truncated anytime\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS logs (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n\n -- Request details\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n endpoint TEXT,\n request_body TEXT,\n request_headers TEXT,\n\n -- Response details\n response_body TEXT,\n response_headers TEXT,\n status_code INTEGER,\n\n -- Token usage\n input_tokens INTEGER,\n cached_tokens INTEGER,\n output_tokens INTEGER,\n total_tokens INTEGER,\n\n -- Performance metrics\n latency_ms INTEGER,\n time_to_first_token_ms INTEGER,\n\n -- Result metadata\n finish_reason TEXT,\n error TEXT,\n error_type TEXT,\n\n -- Cost tracking\n cost_input REAL,\n cost_output REAL,\n cost_total REAL,\n\n -- Context\n message_history_length INTEGER,\n tools_available INTEGER,\n\n created_at INTEGER NOT NULL,\n\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_message_id ON logs(message_id)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_created_at ON logs(created_at)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_provider ON logs(provider)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_model ON logs(model)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_error ON logs(error) WHERE error IS NOT NULL\n `);\n\n // Execution state table - stores runtime state for thread execution\n // Used to track turn count, current side, stopped status, etc.\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS execution_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n // Initialize execution state with default values\n await sql.exec(`\n INSERT OR IGNORE INTO execution_state (key, value) VALUES\n ('turn_count', '0'),\n ('current_side', 'a'),\n ('stopped', 'false'),\n ('stopped_by', '')\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 2,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add prompt_name and tools_called columns to logs table\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN prompt_name TEXT\n `);\n\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_called TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '2' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 3,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_log_id for tracking prompt call chains\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN parent_log_id TEXT\n `);\n\n // Add index for parent_log_id lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_parent_log_id ON logs(parent_log_id)\n `);\n\n // Add model_name (human-readable name from models table)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN model_name TEXT\n `);\n\n // Add tools_schema (JSON of tools available during request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_schema TEXT\n `);\n\n // Add message_history (snapshot of history sent with request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN message_history TEXT\n `);\n\n // Add system_prompt (actual system prompt sent)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN system_prompt TEXT\n `);\n\n // Add is_complete flag for incremental loading\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN is_complete INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '3' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 4,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_tokens for tracking GPT-5 and other model reasoning tokens\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_tokens INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '4' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 5,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to store reasoning output separately from regular content\n // This is for models like o1 that generate reasoning that should not be displayed\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '5' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 6,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add log_id column to messages table to track which log produced the message\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN log_id TEXT\n `);\n\n // Create index for efficient lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_log_id ON messages(log_id) WHERE log_id IS NOT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '6' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 7,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add errors column to track multiple errors on a single log\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN errors TEXT\n `);\n\n // Add retry_of_log_id to track retry relationships\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN retry_of_log_id TEXT\n `);\n\n // Add index for retry lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_retry_of ON logs(retry_of_log_id) WHERE retry_of_log_id IS NOT NULL\n `);\n\n // Migrate existing error data to new errors array format\n await sql.exec(`\n UPDATE logs\n SET errors = json_array(json_object(\n 'message', error,\n 'type', error_type,\n 'timestamp', created_at\n ))\n WHERE error IS NOT NULL AND errors IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '7' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_results column to track tool execution results\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tool_results TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add request_sent_at: When the LLM request was initiated\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN request_sent_at INTEGER\n `);\n\n // Add response_completed_at: When the response was fully received\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN response_completed_at INTEGER\n `);\n\n // Add status to track message state (pending, completed, failed)\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN status TEXT DEFAULT 'completed'\n CHECK(status IN ('pending', 'completed', 'failed'))\n `);\n\n // Backfill existing messages with completed status and set timestamps equal to created_at\n await sql.exec(`\n UPDATE messages\n SET\n status = 'completed',\n request_sent_at = created_at,\n response_completed_at = created_at\n WHERE status IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 10,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Alarm queue table - manages scheduled method invocations\n // Only one alarm can be active per Durable Object, so this queue\n // ensures sequential processing of all pending invocations\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS alarm_queue (\n id TEXT PRIMARY KEY,\n method TEXT NOT NULL,\n args TEXT NOT NULL,\n scheduled_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'processing', 'completed', 'failed')),\n attempts INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n completed_at INTEGER\n )\n `);\n\n // Index for finding the next item to process\n // Partial index only on pending items for better performance\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_next\n ON alarm_queue(scheduled_at, status)\n WHERE status = 'pending'\n `);\n\n // Index for cleanup of old failed items\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_cleanup\n ON alarm_queue(completed_at)\n WHERE status = 'failed'\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '10' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 11,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add silent column to messages table\n // Silent messages are not sent to the LLM but are visible in the UI\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN silent INTEGER NOT NULL DEFAULT 0\n CHECK(silent IN (0, 1))\n `);\n\n // Backfill existing messages as non-silent\n await sql.exec(`\n UPDATE messages SET silent = 0 WHERE silent IS NULL\n `);\n\n // Create index for filtering silent messages\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_silent ON messages(silent)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '11' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 12,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Drop message_history column - it's redundant with request_body.messages\n // This reduces row size and prevents SQLITE_TOOBIG errors\n await sql.exec(`\n ALTER TABLE logs DROP COLUMN message_history\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '12' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 13,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_status column to messages table\n // tool_status indicates success or error for tool execution results (role='tool' messages only)\n // Defaults to 'success' for new tool messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN tool_status TEXT\n CHECK(tool_status IS NULL OR tool_status IN ('success', 'error'))\n `);\n\n // Backfill existing tool messages:\n // - Messages with content starting with \"Error: \" are marked as 'error'\n // - All other tool messages are marked as 'success'\n // - Non-tool messages remain NULL\n await sql.exec(`\n UPDATE messages\n SET tool_status = CASE\n WHEN role = 'tool' AND content LIKE 'Error: %' THEN 'error'\n WHEN role = 'tool' THEN 'success'\n ELSE NULL\n END\n WHERE role = 'tool'\n `);\n\n // Create index for filtering by tool_status\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_tool_status ON messages(tool_status)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '13' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 14,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_id column to messages table\n // parent_id links sub-prompt messages to their parent tool execution message\n // NULL for top-level messages, set to message.id for sub-messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN parent_id TEXT\n `);\n\n // Add depth column to messages table\n // depth indicates nesting level: 0 for top-level, 1 for first-level sub-prompts, etc.\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN depth INTEGER NOT NULL DEFAULT 0\n `);\n\n // Create index for querying message hierarchies\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_parent_id ON messages(parent_id)\n `);\n\n // Create index for depth-based filtering (WebSocket and API queries)\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_depth ON messages(depth)\n `);\n\n // Backfill existing messages:\n // All existing messages are top-level (no parent), so depth=0 and parent_id=NULL\n // The DEFAULT 0 on depth handles this automatically\n // parent_id defaults to NULL (no ALTER needed)\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '14' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 15,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to messages table to store reasoning output\n // This allows us to include reasoning in message history when needed\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '15' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 16,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_details column to messages table to store structured reasoning\n // This is the OpenRouter reasoning_details array format (not just text content)\n // Contains objects with type: \"reasoning.summary\" | \"reasoning.encrypted\" | \"reasoning.text\"\n // Required for proper reasoning preservation in multi-turn conversations\n // See: https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_details TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '16' WHERE key = 'schema_version'\n `);\n },\n};\n","import { migration as m001 } from \"./001_initial\";\nimport { migration as m002 } from \"./002_add_prompt_and_tools_to_logs\";\nimport { migration as m003 } from \"./003_add_log_context_and_parent\";\nimport { migration as m004 } from \"./004_add_reasoning_tokens\";\nimport { migration as m005 } from \"./005_add_reasoning_content\";\nimport { migration as m006 } from \"./006_add_log_id_to_messages\";\nimport { migration as m007 } from \"./007_add_errors_and_retry_tracking\";\nimport { migration as m008 } from \"./008_add_tool_results\";\nimport { migration as m009 } from \"./009_add_request_response_timestamps\";\nimport { migration as m010 } from \"./010_add_alarm_queue\";\nimport { migration as m011 } from \"./011_add_silent_messages\";\nimport { migration as m012 } from \"./012_remove_message_history\";\nimport { migration as m013 } from \"./013_add_tool_status\";\nimport { migration as m014 } from \"./014_add_parent_id_and_depth\";\nimport { migration as m015 } from \"./015_add_reasoning_to_messages\";\nimport { migration as m016 } from \"./016_add_reasoning_details\";\n\nexport const migrations = [m001, m002, m003, m004, m005, m006, m007, m008, m009, m010, m011, m012, m013, m014, m015, m016];\n\nexport const LATEST_SCHEMA_VERSION = migrations.length;\n","import { DurableObject } from \"cloudflare:workers\";\nimport { migrations, LATEST_SCHEMA_VERSION } from \"./migrations/index.js\";\nimport type { Agent, Message } from \"../types/index.js\";\nimport { TIMESTAMP_MULTIPLIER, type TelemetryEvent } from \"../agents/types.js\";\nimport { AlarmQueue } from \"./utils/AlarmQueue.js\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { StreamManager } from \"../agents/StreamManager.js\";\n\nexport class DurableThread<Env extends ThreadEnv = ThreadEnv> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private logSockets: Set<WebSocket> = new Set();\n private messageSockets: Set<WebSocket> = new Set();\n private alarmQueue: AlarmQueue;\n private currentAbortController: AbortController | null = null;\n private isExecuting = false;\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Initialize alarm queue\n this.alarmQueue = new AlarmQueue(ctx);\n\n // Set up the executor to dispatch queued methods\n this.alarmQueue.setExecutor(\n async (method: string, args: Record<string, any>) => {\n switch (method) {\n case \"executeFlow\":\n await this.executeFlow(\n args.threadId,\n args.agentId,\n args.initial_messages,\n args.data\n );\n break;\n case \"processMessage\":\n await this.processMessage(args.threadId, args.content, args.role);\n break;\n case \"testOperation\":\n await this.testOperation(args.id, args.label, args.expectedOrder);\n break;\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n );\n\n // Restore WebSocket connections after hibernation\n // This is called whenever the Durable Object wakes up from hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.type === \"log\") {\n this.logSockets.add(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.add(ws);\n }\n }\n }\n\n /**\n * Returns the tools registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of tool name to tool loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.tools() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the hooks registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of hook name to hook loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.hooks() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of model name to model loader function\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.models() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of prompt name to prompt loader function\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.prompts() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of agent name to agent loader function\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.agents() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n // ============================================================\n // Lookup Methods (for use by FlowEngine/ToolExecutor)\n // ============================================================\n\n /**\n * Load a model definition by name.\n */\n async loadModel(name: string): Promise<any> {\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n /**\n * Load a prompt definition by name.\n */\n async loadPrompt(name: string): Promise<any> {\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n /**\n * Load an agent definition by name.\n */\n async loadAgent(name: string): Promise<any> {\n const registry = this.agents();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n /**\n * Ensures the database schema is up to date.\n * This method is called on the first request to the Durable Object.\n * It checks the schema version and runs any pending migrations.\n *\n * Performance:\n * - Already migrated to latest: ~0.1ms (single SELECT + integer comparison)\n * - Needs migration: Runs once per Durable Object lifetime per schema version\n * - Detects new migrations after code deployment\n */\n private async ensureMigrated(): Promise<void> {\n // Check if we've already migrated to the latest version in this instance\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n // Cache the version we've migrated to\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n }\n\n /**\n * Gets the current schema version from the database.\n * Returns 0 if the metadata table doesn't exist (brand new database).\n */\n private async getCurrentVersion(): Promise<number> {\n try {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: Use for...of loop OR call .toArray() - but NEVER access .rows property!\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray(); // Convert iterator to array\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === \"number\" ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n // Table doesn't exist yet\n return 0;\n }\n }\n\n /**\n * Runs all pending migrations sequentially.\n * Each migration is run in order, starting from the current version + 1.\n */\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n /**\n * Legacy fetch handler for WebSocket upgrades only\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get(\"Upgrade\");\n if (upgradeHeader?.toLowerCase() === \"websocket\") {\n // Determine connection type from URL path\n const url = new URL(request.url);\n if (url.pathname.includes(\"/stream\")) {\n return this.handleMessagesWebSocketUpgrade(request);\n } else {\n // Default to logs WebSocket for backwards compatibility\n return this.handleLogsWebSocketUpgrade(request);\n }\n }\n\n return new Response(\"Use RPC methods instead of fetch\", { status: 400 });\n }\n\n /**\n * Execute thread with initial messages (RPC method)\n * Enqueues the execution to be processed by the alarm handler\n */\n async execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Enqueue the execution with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"executeFlow\",\n {\n threadId,\n agentId,\n initial_messages,\n data,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n // Return 202 Accepted - execution will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message:\n \"Execution queued. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in execute:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue execution\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Send a new message to the thread (RPC method)\n * Enqueues the message processing to be handled by the alarm handler\n */\n async sendMessage(\n threadId: string,\n content: string,\n role: string = \"user\"\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Enqueue the message processing with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"processMessage\",\n {\n threadId,\n content,\n role,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n // Return 202 Accepted - processing will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message:\n \"Message queued for processing. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in sendMessage:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue message\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Check if execution should be stopped (called by FlowEngine)\n * Reads from SQLite for persistence across hibernation\n */\n async shouldStop(): Promise<boolean> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'stopped'`\n );\n const rows = cursor.toArray();\n return rows.length > 0 && rows[0].value === 'true';\n } catch (error) {\n console.error('[DurableThread.shouldStop] Error reading stopped flag:', error);\n return false;\n }\n }\n\n /**\n * Stop the currently executing thread (RPC method)\n * Simple \"off\" switch - stops turns, only cleared by user messages\n */\n async stop(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Set the persistent stop flag in SQLite (prevents new turns from starting)\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'true' WHERE key = 'stopped'`\n );\n\n // Abort any in-flight request\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n // Mark all pending messages as failed\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n const updateCursor = await this.ctx.storage.sql.exec(\n `UPDATE messages SET status = 'failed', response_completed_at = ? WHERE status = 'pending'`,\n now\n );\n \n // Broadcast updates for all pending messages\n const cursor = await this.ctx.storage.sql.exec(\n `SELECT id, role, content, tool_calls, tool_call_id, tool_status, created_at, log_id, status, request_sent_at, response_completed_at FROM messages WHERE response_completed_at = ?`,\n now\n );\n for (const row of cursor) {\n this.broadcastMessage({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n created_at: row.created_at as number,\n log_id: row.log_id as string | null,\n status: \"failed\",\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n });\n }\n\n // Find all tool calls that don't have responses yet and create error responses\n const messagesWithToolsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, tool_calls, depth FROM messages WHERE tool_calls IS NOT NULL AND tool_calls != 'null' AND (depth IS NULL OR depth = 0)`\n );\n\n for (const msgRow of messagesWithToolsCursor) {\n try {\n const toolCalls = JSON.parse(msgRow.tool_calls as string);\n if (Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n // Check if this tool call already has a response\n const responseExists = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE tool_call_id = ? AND role = 'tool'`,\n tc.id\n );\n const responses = responseExists.toArray();\n\n if (responses.length === 0) {\n // Create error response for this tool call\n const toolResponseId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_call_id, tool_status, created_at, status) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n toolResponseId,\n 'tool',\n 'Execution stopped by user',\n tc.id,\n 'error',\n now,\n 'completed'\n );\n\n // Broadcast the error tool response\n this.broadcastMessage({\n id: toolResponseId,\n role: 'tool',\n content: 'Execution stopped by user',\n tool_call_id: tc.id,\n tool_status: 'error',\n created_at: now,\n status: 'completed',\n });\n\n }\n }\n }\n } catch (e) {\n console.error('[DurableThread.stop] Error processing tool calls:', e);\n }\n }\n\n // Create and broadcast interruption message immediately\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status) VALUES (?, ?, ?, ?, ?)`,\n interruptionMessageId,\n \"system\",\n \"Execution stopped by user\",\n timestamp,\n \"completed\"\n );\n\n // Broadcast the interruption message to WebSocket clients\n this.broadcastMessage({\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n });\n\n // Mark all incomplete logs as complete\n await this.ctx.storage.sql.exec(\n `UPDATE logs SET is_complete = 1 WHERE is_complete = 0`\n );\n \n // Query and broadcast all logs that were just marked complete\n // Include all fields required by LogListItem interface in UI\n const logsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, message_id, provider, model, model_name, prompt_name, tools_called,\n parent_log_id, retry_of_log_id, error, cost_total, is_complete, created_at\n FROM logs WHERE is_complete = 1 ORDER BY created_at DESC LIMIT 50`\n );\n for (const logRow of logsCursor) {\n this.broadcastLog({\n type: 'log_data',\n log_id: logRow.id as string,\n data: {\n id: logRow.id as string,\n message_id: logRow.message_id as string,\n provider: logRow.provider as string,\n model: logRow.model as string,\n model_name: logRow.model_name as string | null,\n prompt_name: logRow.prompt_name as string | null,\n tools_called: logRow.tools_called as string | null,\n parent_log_id: logRow.parent_log_id as string | null,\n retry_of_log_id: logRow.retry_of_log_id as string | null,\n error: logRow.error as string | null,\n cost_total: logRow.cost_total as number | null,\n is_complete: true,\n created_at: logRow.created_at as number,\n }\n });\n }\n\n // Broadcast stop event to WebSocket clients\n this.broadcastLog({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n\n return Response.json(\n { status: \"stopped\", message: \"Thread execution stopped\" },\n { status: 200 }\n );\n } catch (error: any) {\n console.error(\"Error in stop:\", error);\n return Response.json(\n { error: error.message || \"Failed to stop thread\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Get message history (RPC method)\n *\n * By default, returns the newest messages (when truncating), but in chronological\n * order (oldest first in the array). This is ideal for chat UIs where messages\n * should be appended and scrolled to the bottom.\n *\n * The offset parameter allows \"scrolling up\" to view older messages.\n *\n * Example:\n * - getMessages(10, 0) -> newest 10 messages, oldest first in array\n * - getMessages(10, 10) -> next 10 older messages, oldest first in array\n *\n * @param limit Number of messages to return (default: 100)\n * @param offset Number of newest messages to skip (default: 0)\n * @param order Internal query order - \"DESC\" (default) fetches newest first then reverses\n * @param includeSilent Include silent messages (UI-only messages)\n * @param maxDepth Maximum depth to include (default: 0 for top-level only)\n */\n async getMessages(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"DESC\",\n includeSilent: boolean = false,\n maxDepth: number = 0\n ) {\n await this.ensureMigrated();\n try {\n // Build WHERE clause for silent messages and depth\n const whereClauses = [];\n if (!includeSilent) {\n whereClauses.push(\"silent = 0\");\n }\n whereClauses.push(`(depth <= ${maxDepth} OR depth IS NULL)`);\n const whereClause =\n whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\";\n\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) as total FROM messages ${whereClause}`\n );\n const total = countResult.one().total;\n\n // Fetch messages in DESC order (newest first) to handle truncation correctly\n // Then reverse the array to return chronological order (oldest first)\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: string | null;\n log_id: string | null;\n created_at: number;\n silent: number;\n parent_id: string | null;\n depth: number;\n status: string | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }>(\n `\n SELECT id, role, content, name, tool_calls, tool_call_id, tool_status, log_id, created_at, silent, parent_id, depth, status, reasoning_content, reasoning_details\n FROM messages\n ${whereClause}\n ORDER BY created_at ${order === \"ASC\" ? \"ASC\" : \"DESC\"}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n let messages = result.toArray().map((row) => ({\n id: row.id,\n role: row.role,\n content: row.content,\n name: row.name,\n tool_calls: row.tool_calls,\n tool_call_id: row.tool_call_id,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n log_id: row.log_id,\n created_at: row.created_at,\n silent: row.silent === 1,\n parent_id: row.parent_id,\n depth: row.depth,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | null,\n reasoning_content: row.reasoning_content,\n reasoning_details: row.reasoning_details,\n }));\n\n // Reverse to chronological order (oldest first) when using DESC\n // This ensures newest messages are at the end of the array (natural chat order)\n if (order === \"DESC\") {\n messages = messages.reverse();\n }\n\n const hasMore = offset + messages.length < total;\n\n return { messages, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getMessages:\", error);\n throw error;\n }\n }\n\n /**\n * Delete a message (RPC method)\n */\n async deleteMessage(messageId: string) {\n await this.ensureMigrated();\n\n try {\n // Check if message exists\n const checkResult = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE id = ?`,\n messageId\n );\n\n const messageExists = checkResult.toArray().length > 0;\n\n if (!messageExists) {\n return { success: false, error: \"Message not found\" };\n }\n\n // Delete the message (tool_calls should cascade delete due to foreign key)\n await this.ctx.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n messageId\n );\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in deleteMessage:\", error);\n return {\n success: false,\n error: error.message || \"Failed to delete message\",\n };\n }\n }\n\n /**\n * Seed messages directly into the database (RPC method - for testing)\n * This bypasses the normal message processing flow\n */\n async seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }) {\n await this.ensureMigrated();\n\n try {\n for (const msg of args.messages) {\n await this.ctx.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, created_at)\n VALUES (?, ?, ?, ?)\n `,\n msg.id,\n msg.role,\n msg.content,\n msg.created_at\n );\n }\n\n return {\n success: true,\n count: args.messages.length,\n };\n } catch (error: any) {\n console.error(\"Error in seedMessages:\", error);\n return {\n success: false,\n error: error.message || \"Failed to seed messages\",\n };\n }\n }\n\n /**\n * Get logs (RPC method)\n */\n async getLogs(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"ASC\"\n ) {\n await this.ensureMigrated();\n\n try {\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) as total FROM logs`\n );\n const total = countResult.one().total || 0;\n\n // Get logs - only fields needed for list view\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n }>(\n `\n SELECT\n id, message_id, provider, model, model_name, prompt_name,\n tools_called, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n ORDER BY created_at ${order}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n const logs = result.toArray().map((row) => ({\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n model: row.model,\n model_name: row.model_name,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n parent_log_id: row.parent_log_id,\n retry_of_log_id: row.retry_of_log_id,\n error: row.error,\n cost_total: row.cost_total,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n request_body: row.request_body,\n }));\n\n const hasMore = offset + logs.length < total;\n\n return { logs, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getLogs:\", error);\n throw error;\n }\n }\n\n /**\n * Get detailed information for a single log (RPC method)\n * This includes all fields including large ones like request/response bodies\n */\n async getLogDetails(logId: string) {\n await this.ensureMigrated();\n\n try {\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n endpoint: string | null;\n request_body: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n cost_total: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n tools_schema: string | null;\n system_prompt: string | null;\n errors: string | null;\n retry_of_log_id: string | null;\n tool_results: string | null;\n is_complete: number;\n created_at: number;\n }>(\n `\n SELECT\n id, message_id, provider, model, model_name, endpoint,\n request_body, request_headers, response_body, response_headers,\n status_code, reasoning_content, input_tokens, cached_tokens, output_tokens,\n reasoning_tokens, total_tokens, latency_ms, time_to_first_token_ms,\n finish_reason, error, error_type, cost_input, cost_output, cost_total,\n message_history_length, tools_available, prompt_name, tools_called,\n parent_log_id, tools_schema, system_prompt,\n errors, retry_of_log_id, tool_results, is_complete, created_at\n FROM logs\n WHERE id = ?\n `,\n logId\n );\n\n const row = result.one();\n if (!row) {\n throw new Error(`Log not found: ${logId}`);\n }\n\n // Extract message_history from request_body for backward compatibility\n let messageHistory: string | null = null;\n if (row.request_body) {\n try {\n const requestBody = JSON.parse(row.request_body);\n if (requestBody.messages) {\n messageHistory = JSON.stringify(requestBody.messages);\n }\n } catch (e) {\n console.error(\"Failed to parse request_body to extract message_history:\", e);\n }\n }\n\n return {\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n model: row.model,\n model_name: row.model_name,\n endpoint: row.endpoint,\n request_body: row.request_body,\n request_headers: row.request_headers,\n response_body: row.response_body,\n response_headers: row.response_headers,\n status_code: row.status_code,\n reasoning_content: row.reasoning_content,\n input_tokens: row.input_tokens,\n cached_tokens: row.cached_tokens,\n output_tokens: row.output_tokens,\n reasoning_tokens: row.reasoning_tokens,\n total_tokens: row.total_tokens,\n latency_ms: row.latency_ms,\n time_to_first_token_ms: row.time_to_first_token_ms,\n finish_reason: row.finish_reason,\n error: row.error,\n error_type: row.error_type,\n cost_input: row.cost_input,\n cost_output: row.cost_output,\n cost_total: row.cost_total,\n message_history_length: row.message_history_length,\n tools_available: row.tools_available,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n parent_log_id: row.parent_log_id,\n tools_schema: row.tools_schema,\n message_history: messageHistory, // Extracted from request_body\n system_prompt: row.system_prompt,\n errors: row.errors,\n retry_of_log_id: row.retry_of_log_id,\n tool_results: row.tool_results,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n };\n } catch (error: any) {\n console.error(\"Error in getLogDetails:\", error);\n throw error;\n }\n }\n\n /**\n * Get thread metadata (RPC method)\n */\n async getThreadMeta(threadId: string) {\n await this.ensureMigrated();\n\n try {\n // Get thread info from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Load agent info from TypeScript config\n let agentInfo = null;\n try {\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n agentInfo = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n side_a_label: agentDef.sideA?.label,\n side_b_label: agentDef.sideB?.label,\n };\n } catch (e) {\n // Agent might not exist in config anymore\n console.warn(`Agent ${threadMetadata.agent_name} not found in config`);\n }\n\n // Get message count from Durable Object\n const messageCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM messages`\n );\n\n // Get log count from Durable Object\n const logCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM logs`\n );\n\n return {\n thread: {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n tags: threadMetadata.tags || [],\n created_at: threadMetadata.created_at,\n },\n agent: agentInfo,\n stats: {\n message_count: messageCount.one().count || 0,\n log_count: logCount.one().count || 0,\n },\n };\n } catch (error: any) {\n console.error(\"Error in getThreadMeta:\", error);\n throw error;\n }\n }\n\n /**\n * Update thread metadata (RPC method)\n * Calls the DurableAgentBuilder to update the thread registry\n */\n async updateThreadMeta(\n threadId: string,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const updated = await agentBuilder.updateThread(threadId, params);\n\n if (!updated) {\n return { success: false, error: `Thread not found: ${threadId}` };\n }\n\n return {\n success: true,\n thread: {\n id: updated.id,\n agent_id: updated.agent_name,\n user_id: updated.user_id,\n tags: updated.tags || [],\n created_at: updated.created_at,\n },\n };\n } catch (error: any) {\n console.error(\"Error in updateThreadMeta:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Delete thread data completely (RPC method)\n * This will permanently delete the Durable Object instance\n */\n async deleteThread() {\n await this.ensureMigrated();\n\n try {\n // Close all WebSocket connections before deletion\n for (const ws of this.logSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n for (const ws of this.messageSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n this.logSockets.clear();\n this.messageSockets.clear();\n\n // Delete alarm if configured (currently not used, but safe to call)\n await this.ctx.storage.deleteAlarm();\n\n // Delete all storage - this will permanently delete the Durable Object\n // and ensure no billing for storage\n await this.ctx.storage.deleteAll();\n\n // Reset migration version for next instantiation\n this.migratedToVersion = null;\n\n return { success: true, message: \"Thread completely deleted\" };\n } catch (error: any) {\n console.error(\"Error in deleteThread:\", error);\n throw error;\n }\n }\n\n /**\n * Handle WebSocket upgrade for real-time log streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleLogsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n server.serializeAttachment({ type: \"log\" });\n\n // Track this socket for broadcasting log updates\n this.logSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Handle WebSocket upgrade for real-time message streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleMessagesWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Parse parameters from URL\n const url = new URL(request.url);\n const includeSilent = url.searchParams.get(\"includeSilent\") === \"true\";\n const depthParam = url.searchParams.get(\"depth\");\n const maxDepth = depthParam !== null ? parseInt(depthParam, 10) : 0; // Default to 0 (top-level only)\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // Store includeSilent and maxDepth preferences in attachment\n server.serializeAttachment({ type: \"message\", includeSilent, maxDepth });\n\n // Track this socket for broadcasting message updates\n this.messageSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast a log record to all connected WebSocket clients\n */\n private broadcastLog(log: Record<string, any>): void {\n const payload = JSON.stringify(log);\n for (const ws of Array.from(this.logSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.logSockets.delete(ws);\n }\n } catch (err) {\n this.logSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a message record to all connected message WebSocket clients\n * Filters silent messages based on each socket's includeSilent preference\n */\n private broadcastMessage(message: Record<string, any>): void {\n // Get message depth (default to 0 for backward compatibility)\n const messageDepth = message.depth ?? 0;\n\n const payload = JSON.stringify({\n type: \"message_data\",\n message_id: message.id,\n depth: messageDepth,\n data: message,\n });\n\n // Check if message is silent\n const isSilent = message.silent === true || message.silent === 1;\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's preferences from attachment\n const attachment = ws.deserializeAttachment() as {\n type: string;\n includeSilent?: boolean;\n maxDepth?: number;\n };\n const includeSilent = attachment?.includeSilent ?? false;\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by silent preference\n if (isSilent && !includeSilent) {\n continue;\n }\n\n // Filter by depth preference\n if (messageDepth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a content chunk for real-time streaming\n * Does NOT update database - only broadcasts to connected clients\n */\n private broadcastMessageChunk(messageId: string, chunk: string, depth: number = 0): void {\n const payload = JSON.stringify({\n type: \"message_chunk\",\n message_id: messageId,\n depth: depth,\n chunk: chunk,\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's maxDepth preference\n const attachment = ws.deserializeAttachment() as {\n type: string;\n maxDepth?: number;\n };\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by depth preference\n if (depth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message chunk to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a telemetry event to all connected message WebSocket clients\n * Used for execution status updates (turn_started, tool_started, etc.)\n */\n private broadcastTelemetry(event: TelemetryEvent): void {\n const payload = JSON.stringify(event);\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send telemetry to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a custom event to all connected message WebSocket clients\n * Used by tools via emitThreadEvent() to send user-defined events\n */\n private broadcastEvent(type: string, data: unknown): void {\n const payload = JSON.stringify({\n type: \"event\",\n eventType: type,\n data,\n timestamp: Date.now(),\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send event to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === \"string\" && message === \"ping\") {\n ws.send(\"pong\");\n return;\n }\n } catch (error) {\n console.error(\"[DurableThread] Error handling WebSocket message:\", error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n\n // Close the WebSocket\n ws.close(code, reason);\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableThread] WebSocket error (type: ${attachment?.type}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n }\n\n /**\n * Alarm handler - called by Cloudflare when a scheduled alarm fires\n * Processes the next item in the alarm queue\n *\n * Important: This method must NEVER throw an exception, as that would break\n * the alarm chain. All errors are caught and logged.\n */\n async alarm(): Promise<void> {\n await this.ensureMigrated();\n\n try {\n await this.alarmQueue.processNext();\n } catch (error) {\n // Log but don't throw - Cloudflare will retry automatically\n // We've already logged the error in AlarmQueue, but log again for visibility\n console.error(\"[DurableThread] Alarm handler failed:\", error);\n }\n }\n\n /**\n * Internal method: Execute a flow (called by alarm queue)\n * This is the actual execution logic, separate from the public execute() RPC method\n */\n private async executeFlow(\n threadId: string,\n agentName: string,\n initial_messages?: any[],\n data?: any\n ): Promise<void> {\n // NOTE: We do NOT clear the stop flag here - it should only be cleared by user messages\n // This ensures that if execution was stopped, it stays stopped until the user explicitly\n // sends a new message\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(agentName);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: agentName,\n title: agentDef.title || agentName,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: agentDef.sideA?.prompt,\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: agentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: agentDef.sideA?.endConversationTool,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: agentDef.sideB?.prompt,\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: agentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: agentDef.sideB?.endConversationTool,\n };\n\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n created_at: threadMetadata.created_at,\n };\n\n // Import FlowEngine dynamically\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n\n // Store initial messages with proper timestamps (if provided)\n let rootMessageId: string | undefined;\n if (\n initial_messages &&\n Array.isArray(initial_messages) &&\n initial_messages.length > 0\n ) {\n const messagesToStore = initial_messages.map((msg: any) => ({\n ...msg,\n id: msg.id || crypto.randomUUID(),\n created_at: msg.created_at || Date.now() * 1000,\n }));\n\n for (const msg of messagesToStore) {\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_calls, tool_call_id, created_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n msg.id,\n msg.role,\n msg.content || null,\n msg.name || null,\n msg.tool_calls ? JSON.stringify(msg.tool_calls) : null,\n msg.tool_call_id || null,\n msg.created_at\n );\n if (msg.role === \"user\") {\n rootMessageId = msg.id;\n }\n }\n }\n\n // Ensure we always have a root message id for FK on logs\n if (!rootMessageId) {\n rootMessageId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at) VALUES (?1, ?2, ?3, ?4)`,\n rootMessageId,\n \"system\",\n null,\n Date.now() * 1000\n );\n }\n\n // Execute the flow\n await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) =>\n this.broadcastMessage(message as Record<string, any>),\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n rootMessageId,\n abortController: this.currentAbortController,\n });\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * Internal method: Process a message (called by alarm queue)\n * This is the actual message processing logic, separate from the public sendMessage() RPC method\n */\n private async processMessage(\n threadId: string,\n content: string,\n role: string = \"user\"\n ): Promise<void> {\n // ONLY clear the stop flag when a USER message is sent\n if (role === \"user\") {\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'false' WHERE key = 'stopped'`\n );\n }\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n created_at: threadMetadata.created_at,\n };\n\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: agentDef.sideA?.prompt,\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_turns: agentDef.sideA?.maxTurns,\n side_a_end_conversation_tool: agentDef.sideA?.endConversationTool,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: agentDef.sideB?.prompt,\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_turns: agentDef.sideB?.maxTurns,\n side_b_end_conversation_tool: agentDef.sideB?.endConversationTool,\n };\n\n // Prepare the message object\n const messageId = crypto.randomUUID();\n const timestamp = Date.now() * 1000;\n\n let message: any = {\n id: messageId,\n role,\n content,\n created_at: timestamp,\n };\n\n // Create minimal state for hook execution\n const state = {\n threadId,\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n thread: {\n instance: this as any,\n metadata: thread,\n },\n };\n\n // Run before_create_message hook\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n message = await FlowEngine.runBeforeCreateMessageHook(state as any, message);\n\n // Store the message (possibly modified by hook)\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at) VALUES (?, ?, ?, ?)`,\n message.id,\n message.role,\n message.content,\n message.created_at\n );\n\n // Broadcast the newly created message to WebSocket clients immediately\n this.broadcastMessage({\n id: message.id,\n role: message.role,\n content: message.content,\n created_at: message.created_at,\n });\n\n // Execute the flow (continuing from existing messages)\n // FlowEngine already imported above for hook call\n\n // Determine which side should execute next based on the message that was just sent\n // If message is from side A (assistant), next execution should be side B\n // If message is from side B (user), next execution should be side A\n const nextSide = role === \"assistant\" ? \"b\" : \"a\";\n\n // Create StreamManager for HTTP streaming (WebSocket telemetry is handled separately)\n const stream = new StreamManager();\n\n await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n rootMessageId: message.id,\n currentSide: nextSide,\n stream,\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) =>\n this.broadcastMessage(message as Record<string, any>),\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n abortController: this.currentAbortController,\n });\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * TEST METHOD: Queue a test operation\n * Used for testing alarm queue ordering and timing\n */\n async queueTestOperation(\n id: string,\n label: string,\n expectedOrder: number,\n delayMs: number\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const queueId = await this.alarmQueue.enqueue(\n \"testOperation\",\n { id, label, expectedOrder },\n delayMs\n );\n\n return Response.json({ status: \"queued\", queueId });\n } catch (error: any) {\n console.error(\"Error queuing test operation:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue test operation\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get queue state\n */\n async getQueueState(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const state = await this.alarmQueue.getQueueState();\n return Response.json(state);\n } catch (error: any) {\n console.error(\"Error getting queue state:\", error);\n return Response.json(\n { error: error.message || \"Failed to get queue state\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get test execution logs\n */\n async getTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n label: string;\n expected_order: number;\n executed_at: number;\n }>(`\n SELECT id, label, expected_order, executed_at\n FROM test_operations\n ORDER BY executed_at ASC\n `);\n\n const logs = cursor.toArray();\n return Response.json({ logs });\n } catch (error: any) {\n // Table might not exist yet\n return Response.json({ logs: [] });\n }\n }\n\n /**\n * TEST METHOD: Clear test logs\n */\n async clearTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Clear existing logs\n await this.ctx.storage.sql.exec(`DELETE FROM test_operations`);\n\n return Response.json({ status: \"cleared\" });\n } catch (error: any) {\n console.error(\"Error clearing test logs:\", error);\n return Response.json(\n { error: error.message || \"Failed to clear test logs\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Insert a malformed message with orphaned tool calls\n * This allows testing the tool call filtering logic\n */\n async insertOrphanedToolCall(params: {\n content?: string;\n toolCallId: string;\n toolName: string;\n toolArgs: string;\n }): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const messageId = crypto.randomUUID();\n const toolCalls = JSON.stringify([\n {\n id: params.toolCallId,\n type: \"function\",\n function: {\n name: params.toolName,\n arguments: params.toolArgs,\n },\n },\n ]);\n\n // Insert assistant message with tool_calls but no corresponding tool result\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_calls, created_at)\n VALUES (?, 'assistant', ?, ?, ?)`,\n messageId,\n params.content || null,\n toolCalls,\n Date.now() * 1000\n );\n\n return Response.json({\n status: \"inserted\",\n messageId,\n toolCallId: params.toolCallId,\n });\n } catch (error: any) {\n console.error(\"Error inserting orphaned tool call:\", error);\n return Response.json(\n { error: error.message || \"Failed to insert orphaned tool call\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Execute a test operation\n * Internal method called by alarm queue\n */\n private async testOperation(\n id: string,\n label: string,\n expectedOrder: number\n ): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Log the execution\n await this.ctx.storage.sql.exec(\n `INSERT INTO test_operations (id, label, expected_order, executed_at) VALUES (?, ?, ?, ?)`,\n id,\n label,\n expectedOrder,\n now\n );\n }\n}\n","import type { DurableObjectState } from \"cloudflare:workers\";\n\n/**\n * AlarmQueue - Manages a queue of scheduled method invocations for a Durable Object\n *\n * Since Cloudflare Durable Objects can only have one active alarm at a time,\n * this class maintains a queue in SQLite and processes items sequentially.\n *\n * Key Features:\n * - Atomic queue operations\n * - Automatic cleanup of completed items\n * - 24-hour retention of failed items for debugging\n * - Precise timing control (millisecond accuracy)\n * - Leverages Cloudflare's automatic retry mechanism (up to 6 retries)\n */\nexport class AlarmQueue {\n private ctx: DurableObjectState;\n private sql: DurableObjectState[\"storage\"][\"sql\"];\n\n constructor(ctx: DurableObjectState) {\n this.ctx = ctx;\n this.sql = ctx.storage.sql;\n }\n\n /**\n * Enqueue a method invocation to be executed after a delay\n *\n * @param method - Name of the method to invoke\n * @param args - Arguments to pass to the method (will be JSON serialized)\n * @param delayMs - Delay in milliseconds before execution\n * @returns The ID of the queued item\n */\n async enqueue(\n method: string,\n args: Record<string, any>,\n delayMs: number = 0\n ): Promise<string> {\n const id = crypto.randomUUID();\n const now = Date.now();\n const scheduledAt = now + delayMs;\n\n // Store timestamps in microseconds for consistency with other tables\n const nowMicros = now * 1000;\n const scheduledAtMicros = scheduledAt * 1000;\n\n // Insert into queue\n await this.sql.exec(\n `\n INSERT INTO alarm_queue (\n id, method, args, scheduled_at, created_at, status, attempts\n ) VALUES (?1, ?2, ?3, ?4, ?5, 'pending', 0)\n `,\n id,\n method,\n JSON.stringify(args),\n scheduledAtMicros,\n nowMicros\n );\n\n // Schedule or reschedule the alarm for the earliest pending item\n await this.rescheduleAlarm();\n\n return id;\n }\n\n /**\n * Process the next pending item in the queue\n * Called by the alarm() handler\n *\n * @param alarmInfo - Information about the alarm invocation from Cloudflare\n */\n async processNext(alarmInfo?: { retryCount: number; isRetry: boolean }): Promise<void> {\n // Clean up old failed items first\n await this.cleanupOldFailures();\n\n // Get the next pending item that's due to execute\n const now = Date.now() * 1000; // Convert to microseconds\n\n const cursor = await this.sql.exec<{\n id: string;\n method: string;\n args: string;\n attempts: number;\n }>(\n `\n SELECT id, method, args, attempts\n FROM alarm_queue\n WHERE status = 'pending' AND scheduled_at <= ?\n ORDER BY scheduled_at ASC\n LIMIT 1\n `,\n now\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, reschedule for next item if any\n await this.rescheduleAlarm();\n return;\n }\n\n const item = rows[0];\n\n // Mark as processing\n await this.sql.exec(\n `UPDATE alarm_queue SET status = 'processing', attempts = attempts + 1 WHERE id = ?`,\n item.id\n );\n\n try {\n // Parse arguments\n const args = JSON.parse(item.args);\n\n // Execute the method\n await this.executeMethod(item.method, args);\n\n // Mark as completed and delete immediately\n await this.complete(item.id);\n } catch (error) {\n // Mark as failed and keep for debugging\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.fail(item.id, errorMessage);\n\n // Log the error but don't throw - we want to continue processing the queue\n console.error(`[AlarmQueue] Failed to process item ${item.id}:`, error);\n }\n\n // Always reschedule for the next item, even if this one failed\n await this.rescheduleAlarm();\n }\n\n /**\n * Execute a queued method\n * This method should be overridden or extended by the Durable Object\n *\n * @param method - Name of the method to execute\n * @param args - Arguments to pass to the method\n */\n private async executeMethod(method: string, args: Record<string, any>): Promise<void> {\n // This will be implemented in DurableThread to dispatch to the appropriate method\n throw new Error(`Method execution not implemented: ${method}`);\n }\n\n /**\n * Set the executor function that will be called to execute queued methods\n *\n * @param executor - Function that takes method name and args, executes the method\n */\n setExecutor(executor: (method: string, args: Record<string, any>) => Promise<void>): void {\n this.executeMethod = executor;\n }\n\n /**\n * Mark an item as completed and delete it immediately\n *\n * @param id - ID of the completed item\n */\n private async complete(id: string): Promise<void> {\n await this.sql.exec(`DELETE FROM alarm_queue WHERE id = ?`, id);\n }\n\n /**\n * Mark an item as failed but keep it for 24 hours for debugging\n *\n * @param id - ID of the failed item\n * @param error - Error message\n */\n private async fail(id: string, error: string): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET status = 'failed', error = ?, completed_at = ?\n WHERE id = ?\n `,\n error,\n now,\n id\n );\n }\n\n /**\n * Clean up failed items older than 24 hours\n */\n private async cleanupOldFailures(): Promise<void> {\n const cutoff = (Date.now() - 24 * 60 * 60 * 1000) * 1000; // 24 hours ago in microseconds\n await this.sql.exec(\n `DELETE FROM alarm_queue WHERE status = 'failed' AND completed_at < ?`,\n cutoff\n );\n }\n\n /**\n * Schedule the alarm for the next pending item\n * If no pending items, clear the alarm\n */\n private async rescheduleAlarm(): Promise<void> {\n // Get the earliest pending item\n const cursor = await this.sql.exec<{ scheduled_at: number }>(\n `\n SELECT scheduled_at\n FROM alarm_queue\n WHERE status = 'pending'\n ORDER BY scheduled_at ASC\n LIMIT 1\n `\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, delete the alarm\n await this.ctx.storage.deleteAlarm();\n return;\n }\n\n const nextScheduledAt = rows[0].scheduled_at;\n // Convert from microseconds to milliseconds for setAlarm\n const nextScheduledAtMs = Math.floor(nextScheduledAt / 1000);\n\n // Set the alarm\n // Note: setAlarm accepts Date or number (milliseconds since epoch)\n await this.ctx.storage.setAlarm(nextScheduledAtMs);\n }\n\n /**\n * Get the current state of the queue for debugging\n */\n async getQueueState(): Promise<{\n pending: number;\n processing: number;\n failed: number;\n nextScheduledAt: number | null;\n }> {\n // Count by status\n const countCursor = await this.sql.exec<{ status: string; count: number }>(\n `SELECT status, COUNT(*) as count FROM alarm_queue GROUP BY status`\n );\n\n const counts = countCursor.toArray();\n const pending = counts.find((c) => c.status === \"pending\")?.count || 0;\n const processing = counts.find((c) => c.status === \"processing\")?.count || 0;\n const failed = counts.find((c) => c.status === \"failed\")?.count || 0;\n\n // Get next scheduled time\n const nextCursor = await this.sql.exec<{ scheduled_at: number }>(\n `SELECT scheduled_at FROM alarm_queue WHERE status = 'pending' ORDER BY scheduled_at ASC LIMIT 1`\n );\n const nextRows = nextCursor.toArray();\n const nextScheduledAt = nextRows.length > 0 ? nextRows[0].scheduled_at : null;\n\n return {\n pending,\n processing,\n failed,\n nextScheduledAt,\n };\n }\n}\n","import type { SqlStorage } from 'cloudflare:workers';\n\n/**\n * Initial schema for DurableAgentBuilder.\n *\n * This creates the core tables for:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication\n * - API keys\n * - Sessions\n * - OAuth accounts\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state (for GitHub integration)\n */\nexport const migration = {\n version: 1,\n async up(sql: SqlStorage) {\n // Metadata table for schema versioning\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n )\n `);\n\n // Thread registry - maps thread IDs to agent names\n // agent_name references the name from TypeScript config files\n sql.exec(`\n CREATE TABLE threads (\n id TEXT PRIMARY KEY NOT NULL,\n agent_name TEXT NOT NULL,\n user_id TEXT,\n tags TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_threads_agent_name ON threads(agent_name)`);\n sql.exec(`CREATE INDEX idx_threads_user_id ON threads(user_id)`);\n sql.exec(`CREATE INDEX idx_threads_created_at ON threads(created_at)`);\n\n // Users table for authentication\n sql.exec(`\n CREATE TABLE users (\n id TEXT PRIMARY KEY NOT NULL,\n username TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'admin' CHECK (role IN ('admin')),\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_users_username ON users(username)`);\n sql.exec(`CREATE INDEX idx_users_role ON users(role)`);\n\n // OAuth accounts table for linking OAuth providers to users\n sql.exec(`\n CREATE TABLE oauth_accounts (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n provider TEXT NOT NULL CHECK (provider IN ('github', 'google')),\n provider_user_id TEXT NOT NULL,\n provider_username TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE UNIQUE INDEX idx_oauth_accounts_provider ON oauth_accounts(provider, provider_user_id)`);\n sql.exec(`CREATE INDEX idx_oauth_accounts_user_id ON oauth_accounts(user_id)`);\n\n // API Keys table for programmatic access\n sql.exec(`\n CREATE TABLE api_keys (\n id TEXT PRIMARY KEY NOT NULL,\n name TEXT NOT NULL,\n key_hash TEXT NOT NULL,\n key_prefix TEXT NOT NULL,\n last_five TEXT NOT NULL,\n user_id TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n last_used_at INTEGER,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_api_keys_key_hash ON api_keys(key_hash)`);\n sql.exec(`CREATE INDEX idx_api_keys_user_id ON api_keys(user_id)`);\n sql.exec(`CREATE INDEX idx_api_keys_key_prefix ON api_keys(key_prefix)`);\n\n // Sessions table for user sessions\n sql.exec(`\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n expires_at INTEGER NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_sessions_token_hash ON sessions(token_hash)`);\n sql.exec(`CREATE INDEX idx_sessions_user_id ON sessions(user_id)`);\n sql.exec(`CREATE INDEX idx_sessions_expires_at ON sessions(expires_at)`);\n\n // Provider credentials (API keys for LLM providers)\n sql.exec(`\n CREATE TABLE providers (\n name TEXT PRIMARY KEY NOT NULL,\n sdk TEXT NOT NULL,\n api_key TEXT NOT NULL\n )\n `);\n\n // Edit lock state for GitHub integration\n // Prevents concurrent edits when committing to GitHub\n sql.exec(`\n CREATE TABLE edit_lock (\n id TEXT PRIMARY KEY DEFAULT 'singleton' CHECK (id = 'singleton'),\n locked_by TEXT,\n locked_at INTEGER,\n lock_reason TEXT,\n pending_changes TEXT\n )\n `);\n sql.exec(`INSERT INTO edit_lock (id) VALUES ('singleton')`);\n\n // Set schema version\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n },\n};\n","import { migration as m0001 } from './0001_initial.js';\n\nexport const migrations = [m0001];\n\nexport const LATEST_SCHEMA_VERSION = 1;\n","import { DurableObject } from 'cloudflare:workers';\nimport {\n migrations,\n LATEST_SCHEMA_VERSION,\n} from './agentbuilder-migrations/index.js';\n\n/**\n * Environment type for DurableAgentBuilder.\n * Users extend this with their own bindings.\n */\nexport interface AgentBuilderEnv {\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilder>;\n AGENT_BUILDER_THREAD: DurableObjectNamespace;\n // GitHub integration (optional)\n GITHUB_TOKEN?: string;\n GITHUB_REPO?: string;\n GITHUB_BRANCH?: string;\n}\n\n/**\n * Thread metadata stored in the registry.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n}\n\n/**\n * Parameters for updating a thread.\n */\nexport interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n}\n\n/**\n * User record.\n */\nexport interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n}\n\n/**\n * Provider credentials.\n */\nexport interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n}\n\n/**\n * DurableAgentBuilder - The root Durable Object for AgentBuilder.\n *\n * This is a singleton DO that stores:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication data\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state for GitHub integration\n *\n * ## Usage\n *\n * Users must extend this class to provide virtual module access:\n *\n * ```typescript\n * import { DurableAgentBuilder } from '@standardagents/builder/runtime';\n * import { models } from 'virtual:@standardagents-models';\n * import { prompts } from 'virtual:@standardagents-prompts';\n * import { agents } from 'virtual:@standardagents-agents';\n *\n * export class AgentBuilder extends DurableAgentBuilder {\n * models() { return models; }\n * prompts() { return prompts; }\n * agents() { return agents; }\n * }\n * ```\n */\n/**\n * Event types that can be emitted via WebSocket\n */\nexport type AgentBuilderEvent =\n | { type: 'thread_created'; thread: ThreadRegistryEntry }\n | { type: 'thread_deleted'; threadId: string };\n\nexport class DurableAgentBuilder<\n Env extends AgentBuilderEnv = AgentBuilderEnv,\n> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private eventSockets: Set<WebSocket> = new Set();\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Restore WebSocket connections after hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.channel === 'events') {\n this.eventSockets.add(ws);\n }\n }\n }\n\n /**\n * Returns the tools registry for lazy-loading tool definitions.\n * Must be overridden in a subclass.\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.tools() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the hooks registry for lazy-loading hook definitions.\n * Must be overridden in a subclass.\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.hooks() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * Must be overridden in a subclass.\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.models() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * Must be overridden in a subclass.\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.prompts() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * Must be overridden in a subclass.\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.agents() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n // ============================================================\n // Migration Methods\n // ============================================================\n\n private async ensureMigrated(): Promise<void> {\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n }\n\n private async getCurrentVersion(): Promise<number> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray();\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === 'number' ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n return 0;\n }\n }\n\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n // ============================================================\n // Thread Registry Methods\n // ============================================================\n\n /**\n * Create a new thread and add it to the registry.\n */\n async createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO threads (id, agent_name, user_id, tags, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n id,\n params.agent_name,\n params.user_id || null,\n params.tags ? JSON.stringify(params.tags) : null,\n now\n );\n\n const thread: ThreadRegistryEntry = {\n id,\n agent_name: params.agent_name,\n user_id: params.user_id || null,\n tags: params.tags || null,\n created_at: now,\n };\n\n // Broadcast thread_created event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_created', thread });\n\n return thread;\n }\n\n /**\n * Get a thread by ID.\n */\n async getThread(id: string): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n created_at: number;\n }>(`SELECT id, agent_name, user_id, tags, created_at FROM threads WHERE id = ?`, id);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n const row = rows[0];\n return {\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n created_at: row.created_at,\n };\n }\n\n /**\n * List threads with optional filtering.\n */\n async listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }> {\n await this.ensureMigrated();\n\n const whereClauses: string[] = [];\n const args: any[] = [];\n\n if (params?.agent_name) {\n whereClauses.push('agent_name = ?');\n args.push(params.agent_name);\n }\n\n if (params?.user_id) {\n whereClauses.push('user_id = ?');\n args.push(params.user_id);\n }\n\n const whereClause = whereClauses.length > 0\n ? `WHERE ${whereClauses.join(' AND ')}`\n : '';\n\n // Get total count\n const countCursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM threads ${whereClause}`,\n ...args\n );\n const total = countCursor.one().count;\n\n // Get threads\n const limit = params?.limit ?? 100;\n const offset = params?.offset ?? 0;\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n created_at: number;\n }>(\n `SELECT id, agent_name, user_id, tags, created_at FROM threads\n ${whereClause}\n ORDER BY created_at DESC\n LIMIT ? OFFSET ?`,\n ...args,\n limit,\n offset\n );\n\n const threads = cursor.toArray().map((row) => ({\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n created_at: row.created_at,\n }));\n\n return { threads, total };\n }\n\n /**\n * Delete a thread from the registry.\n */\n async deleteThread(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM threads WHERE id = ?`, id);\n\n // Broadcast thread_deleted event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_deleted', threadId: id });\n\n return true;\n }\n\n /**\n * Update a thread's agent_name (used during agent handoff).\n */\n async updateThreadAgent(id: string, agent_name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET agent_name = ? WHERE id = ?`,\n agent_name,\n id\n );\n return true;\n }\n\n /**\n * Update a thread's metadata.\n */\n async updateThread(\n id: string,\n params: UpdateThreadParams\n ): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n // Check thread exists\n const existing = await this.getThread(id);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: any[] = [];\n\n if (params.agent_name !== undefined) {\n updates.push('agent_name = ?');\n values.push(params.agent_name);\n }\n if (params.user_id !== undefined) {\n updates.push('user_id = ?');\n values.push(params.user_id);\n }\n if (params.tags !== undefined) {\n updates.push('tags = ?');\n values.push(params.tags ? JSON.stringify(params.tags) : null);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n return this.getThread(id);\n }\n\n // ============================================================\n // Model Lookup Methods\n // ============================================================\n\n /**\n * Load a model definition by name.\n */\n async loadModel(name: string): Promise<any> {\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n // ============================================================\n // Prompt Lookup Methods\n // ============================================================\n\n /**\n * Load a prompt definition by name.\n */\n async loadPrompt(name: string): Promise<any> {\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n // ============================================================\n // Agent Lookup Methods\n // ============================================================\n\n /**\n * Load an agent definition by name.\n */\n async loadAgent(name: string): Promise<any> {\n const registry = this.agents();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n // ============================================================\n // Provider Methods\n // ============================================================\n\n /**\n * Get a provider's credentials.\n */\n async getProvider(name: string): Promise<Provider | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers WHERE name = ?`, name);\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Set a provider's credentials.\n */\n async setProvider(provider: Provider): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `INSERT OR REPLACE INTO providers (name, sdk, api_key) VALUES (?, ?, ?)`,\n provider.name,\n provider.sdk,\n provider.api_key\n );\n }\n\n /**\n * List all providers.\n */\n async listProviders(): Promise<Provider[]> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers`);\n\n return cursor.toArray();\n }\n\n /**\n * Delete a provider.\n */\n async deleteProvider(name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM providers WHERE name = ?`, name);\n return true;\n }\n\n // ============================================================\n // User Authentication Methods\n // ============================================================\n\n /**\n * Get a user by username.\n */\n async getUserByUsername(username: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE username = ?`,\n username\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Get a user by ID.\n */\n async getUserById(id: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE id = ?`,\n id\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Create a new user.\n */\n async createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO users (id, username, password_hash, role, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.username,\n params.password_hash,\n params.role || 'admin',\n now,\n now\n );\n\n return {\n id,\n username: params.username,\n password_hash: params.password_hash,\n role: params.role || 'admin',\n created_at: now,\n updated_at: now,\n };\n }\n\n /**\n * Check if any users exist (for first-time setup).\n */\n async hasUsers(): Promise<boolean> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM users`\n );\n\n return cursor.one().count > 0;\n }\n\n /**\n * List all users (excludes password hash).\n */\n async listUsers(): Promise<\n Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(`SELECT id, username, role, created_at, updated_at FROM users ORDER BY created_at DESC`);\n\n return cursor.toArray().map((row) => ({\n id: row.id,\n username: row.username,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n }\n\n /**\n * Update a user.\n */\n async updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n // Check user exists\n const existing = await this.getUserById(id);\n if (!existing) return null;\n\n const now = Math.floor(Date.now() / 1000);\n const updates: string[] = [];\n const values: any[] = [];\n\n if (params.username !== undefined) {\n updates.push('username = ?');\n values.push(params.username);\n }\n if (params.password_hash !== undefined) {\n updates.push('password_hash = ?');\n values.push(params.password_hash);\n }\n if (params.role !== undefined) {\n updates.push('role = ?');\n values.push(params.role);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n updates.push('updated_at = ?');\n values.push(now);\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE users SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n return this.getUserById(id);\n }\n\n /**\n * Delete a user.\n */\n async deleteUser(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // First delete any sessions for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE user_id = ?`,\n id\n );\n\n // Then delete any API keys for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE user_id = ?`,\n id\n );\n\n // Finally delete the user\n await this.ctx.storage.sql.exec(`DELETE FROM users WHERE id = ?`, id);\n return true;\n }\n\n // ============================================================\n // Session Methods\n // ============================================================\n\n /**\n * Create a new session.\n */\n async createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO sessions (id, user_id, token_hash, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.token_hash,\n params.expires_at,\n now\n );\n\n return id;\n }\n\n /**\n * Validate a session token.\n */\n async validateSession(\n tokenHash: string\n ): Promise<{ user_id: string; expires_at: number } | null> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n\n const cursor = await this.ctx.storage.sql.exec<{\n user_id: string;\n expires_at: number;\n }>(\n `SELECT user_id, expires_at FROM sessions\n WHERE token_hash = ? AND expires_at > ?`,\n tokenHash,\n now\n );\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Delete expired sessions.\n */\n async cleanupSessions(): Promise<number> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE expires_at <= ?`,\n now\n );\n\n return 0; // SQLite in DO doesn't return affected rows easily\n }\n\n /**\n * Delete a session.\n */\n async deleteSession(tokenHash: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE token_hash = ?`,\n tokenHash\n );\n }\n\n // ============================================================\n // API Key Methods\n // ============================================================\n\n /**\n * Create an API key.\n */\n async createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO api_keys (id, name, key_hash, key_prefix, last_five, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n id,\n params.name,\n params.key_hash,\n params.key_prefix,\n params.last_five,\n params.user_id,\n now\n );\n\n return id;\n }\n\n /**\n * Validate an API key.\n */\n async validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n user_id: string;\n }>(`SELECT id, user_id FROM api_keys WHERE key_hash = ?`, keyHash);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n // Update last_used_at\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE api_keys SET last_used_at = ? WHERE key_hash = ?`,\n now,\n keyHash\n );\n\n return rows[0];\n }\n\n /**\n * List API keys for a user.\n */\n async listApiKeys(\n userId: string\n ): Promise<\n Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>(\n `SELECT id, name, key_prefix, last_five, created_at, last_used_at\n FROM api_keys WHERE user_id = ? ORDER BY created_at DESC`,\n userId\n );\n\n return cursor.toArray();\n }\n\n /**\n * Delete an API key.\n */\n async deleteApiKey(id: string, userId: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE id = ? AND user_id = ?`,\n id,\n userId\n );\n return true;\n }\n\n // ============================================================\n // OAuth Methods\n // ============================================================\n\n /**\n * Link an OAuth account to a user.\n */\n async linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO oauth_accounts (id, user_id, provider, provider_user_id, provider_username, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.provider,\n params.provider_user_id,\n params.provider_username || null,\n now\n );\n }\n\n /**\n * Find user by OAuth account.\n */\n async findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ user_id: string }>(\n `SELECT user_id FROM oauth_accounts WHERE provider = ? AND provider_user_id = ?`,\n provider,\n providerUserId\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n return this.getUserById(rows[0].user_id);\n }\n\n // ============================================================\n // Edit Lock Methods (for GitHub integration)\n // ============================================================\n\n /**\n * Acquire edit lock for GitHub commits.\n */\n async acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean> {\n await this.ensureMigrated();\n\n // Check if already locked\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n }>(`SELECT locked_by, locked_at FROM edit_lock WHERE id = 'singleton'`);\n\n const row = cursor.one();\n if (row.locked_by) {\n return false; // Already locked\n }\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = ?, locked_at = ?, lock_reason = ? WHERE id = 'singleton'`,\n params.locked_by,\n now,\n params.lock_reason\n );\n\n return true;\n }\n\n /**\n * Release edit lock.\n */\n async releaseEditLock(lockedBy: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // Only release if we hold the lock\n const cursor = await this.ctx.storage.sql.exec<{ locked_by: string | null }>(\n `SELECT locked_by FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n if (row.locked_by !== lockedBy) {\n return false;\n }\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = NULL, locked_at = NULL, lock_reason = NULL, pending_changes = NULL WHERE id = 'singleton'`\n );\n\n return true;\n }\n\n /**\n * Get current lock state.\n */\n async getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>(\n `SELECT locked_by, locked_at, lock_reason, pending_changes FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n return {\n locked: !!row.locked_by,\n locked_by: row.locked_by,\n locked_at: row.locked_at,\n lock_reason: row.lock_reason,\n pending_changes: row.pending_changes,\n };\n }\n\n /**\n * Store pending changes for commit.\n */\n async setPendingChanges(changes: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET pending_changes = ? WHERE id = 'singleton'`,\n changes\n );\n }\n\n // ============================================================\n // Utility Methods\n // ============================================================\n\n /**\n * Get the Durable Object stub for a thread.\n */\n getThreadStub(threadId: string): DurableObjectStub {\n const doId = this.env.AGENT_BUILDER_THREAD.idFromName(threadId);\n return this.env.AGENT_BUILDER_THREAD.get(doId);\n }\n\n // ============================================================\n // WebSocket Methods\n // ============================================================\n\n /**\n * Handle fetch requests - used for WebSocket upgrades\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get('Upgrade');\n if (upgradeHeader?.toLowerCase() === 'websocket') {\n return this.handleEventsWebSocketUpgrade(request);\n }\n\n return new Response('Use RPC methods instead of fetch', { status: 400 });\n }\n\n /**\n * Handle WebSocket upgrade for events channel\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleEventsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // The channel field allows for future expansion to other channels\n server.serializeAttachment({ channel: 'events' });\n\n // Track this socket for broadcasting events\n this.eventSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast an event to all connected WebSocket clients\n */\n private broadcastEvent(event: AgentBuilderEvent): void {\n const payload = JSON.stringify(event);\n for (const ws of Array.from(this.eventSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.eventSockets.delete(ws);\n }\n } catch (err) {\n this.eventSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === 'string' && message === 'ping') {\n ws.send('pong');\n return;\n }\n } catch (error) {\n console.error('[DurableAgentBuilder] Error handling WebSocket message:', error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n\n // Close the WebSocket\n ws.close(code, reason);\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableAgentBuilder] WebSocket error (channel: ${attachment?.channel}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n }\n}\n","/**\n * Model definition module for AgentBuilder.\n *\n * Models define LLM configurations including provider, model ID, pricing,\n * and fallback chains. Models are referenced by name from prompts.\n *\n * @module\n */\n\n/**\n * Supported LLM provider types.\n * Each provider requires a corresponding API key environment variable:\n * - `openai` → `OPENAI_API_KEY`\n * - `openrouter` → `OPENROUTER_API_KEY`\n * - `anthropic` → `ANTHROPIC_API_KEY`\n * - `google` → `GOOGLE_API_KEY`\n */\nexport type ModelProvider = 'openai' | 'openrouter' | 'anthropic' | 'google';\n\n/**\n * Model definition configuration.\n *\n * @template N - The model name as a string literal type for type inference\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: 'openai',\n * model: 'gpt-4o',\n * fallbacks: ['gpt-4-turbo', 'gpt-3.5-turbo'],\n * inputPrice: 2.5,\n * outputPrice: 10,\n * });\n * ```\n */\nexport interface ModelDefinition<N extends string = string> {\n /**\n * Unique name for this model definition.\n * Used as the identifier when referencing from prompts.\n * Should be descriptive and consistent (e.g., 'gpt-4o', 'claude-3-opus').\n */\n name: N;\n\n /**\n * The LLM provider to use for API calls.\n * The corresponding API key environment variable must be set.\n */\n provider: ModelProvider;\n\n /**\n * The actual model identifier sent to the provider API.\n *\n * For OpenAI: 'gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo', etc.\n * For OpenRouter: 'openai/gpt-4o', 'anthropic/claude-3-opus', etc.\n * For Anthropic: 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', etc.\n * For Google: 'gemini-1.5-pro', 'gemini-1.5-flash', etc.\n */\n model: string;\n\n /**\n * Optional list of additional provider prefixes for OpenRouter.\n * Allows routing through specific providers when using OpenRouter.\n *\n * @example ['anthropic', 'google'] - prefer Anthropic, fallback to Google\n */\n includedProviders?: string[];\n\n /**\n * Fallback models to try if this model fails.\n * Referenced by model name (must be defined in agentbuilder/models/).\n * Tried in order after primary model exhausts retries.\n *\n * @example ['gpt-4', 'gpt-3.5-turbo']\n */\n fallbacks?: AgentBuilder.Models[];\n\n /**\n * Cost per 1 million input tokens in USD.\n * Used for cost tracking and reporting in logs.\n */\n inputPrice?: number;\n\n /**\n * Cost per 1 million output tokens in USD.\n * Used for cost tracking and reporting in logs.\n */\n outputPrice?: number;\n\n /**\n * Cost per 1 million cached input tokens in USD.\n * Some providers offer reduced pricing for cached/repeated prompts.\n */\n cachedPrice?: number;\n}\n\n/**\n * Defines an LLM model configuration.\n *\n * Models are the foundation of the agent system - they specify which\n * AI model to use and how to connect to it. Models can have fallbacks\n * for reliability and include pricing for cost tracking.\n *\n * @template N - The model name as a string literal type\n * @param options - Model configuration options\n * @returns The model definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/models/gpt_4o.ts\n * import { defineModel } from '@standardagents/builder';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: 'openai',\n * model: 'gpt-4o',\n * fallbacks: ['gpt-4-turbo'],\n * inputPrice: 2.5,\n * outputPrice: 10,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using OpenRouter with provider preferences\n * export default defineModel({\n * name: 'claude-3-opus',\n * provider: 'openrouter',\n * model: 'anthropic/claude-3-opus',\n * includedProviders: ['anthropic'],\n * });\n * ```\n */\nexport function defineModel<N extends string>(\n options: ModelDefinition<N>\n): ModelDefinition<N> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Model name is required');\n }\n if (!options.provider) {\n throw new Error('Model provider is required');\n }\n if (!options.model) {\n throw new Error('Model ID is required');\n }\n\n // Validate provider is a known type\n const validProviders: ModelProvider[] = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(options.provider)) {\n throw new Error(\n `Invalid provider '${options.provider}'. Must be one of: ${validProviders.join(', ')}`\n );\n }\n\n // Validate pricing is non-negative if provided\n if (options.inputPrice !== undefined && options.inputPrice < 0) {\n throw new Error('inputPrice must be non-negative');\n }\n if (options.outputPrice !== undefined && options.outputPrice < 0) {\n throw new Error('outputPrice must be non-negative');\n }\n if (options.cachedPrice !== undefined && options.cachedPrice < 0) {\n throw new Error('cachedPrice must be non-negative');\n }\n\n return options;\n}\n","/**\n * Prompt definition module for AgentBuilder.\n *\n * Prompts define LLM interaction configurations including the system prompt,\n * model selection, available tools, and various behavioral options.\n *\n * @module\n */\n\nimport type { z } from 'zod';\n\n// ============================================================================\n// Structured Prompt Types (Discriminated Union)\n// ============================================================================\n\n/**\n * A text part of a prompt - static text content.\n *\n * @example\n * ```typescript\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' }\n * ```\n */\nexport interface PromptTextPart {\n type: 'text';\n /** The text content */\n content: string;\n}\n\n/**\n * A prompt inclusion part - includes another prompt's content.\n * Uses AgentBuilder.Prompts for type-safe autocomplete of prompt names.\n *\n * @example\n * ```typescript\n * { type: 'include', prompt: 'responder_rules' }\n * ```\n */\nexport interface PromptIncludePart {\n type: 'include';\n /** The name of the prompt to include (type-safe with autocomplete) */\n prompt: AgentBuilder.Prompts;\n}\n\n/**\n * A single part of a structured prompt.\n * Discriminated union on `type` field for TypeScript narrowing.\n */\nexport type PromptPart = PromptTextPart | PromptIncludePart;\n\n/**\n * A structured prompt is an array of prompt parts.\n * Provides type-safe composition with other prompts via autocomplete.\n *\n * @example\n * ```typescript\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' },\n * { type: 'text', content: '\\n\\nBe concise.' },\n * ]\n * ```\n */\nexport type StructuredPrompt = PromptPart[];\n\n/**\n * The prompt content can be either a plain string or a structured array.\n *\n * @example\n * ```typescript\n * // Simple string prompt:\n * prompt: 'You are a helpful assistant.'\n *\n * // Structured prompt with includes:\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' },\n * ]\n * ```\n */\nexport type PromptContent = string | StructuredPrompt;\n\n// ============================================================================\n// Tool Configuration\n// ============================================================================\n\n/**\n * Tool configuration for including a tool in a prompt.\n *\n * @template T - The tool name type (for type-safe tool references)\n */\nexport interface ToolConfig<T extends string = AgentBuilder.Callables> {\n /**\n * Name of the tool to include.\n * Must be a tool, prompt, or agent defined in agentbuilder/.\n */\n name: T;\n\n /**\n * Include text response content from sub-prompt execution in the tool result.\n * @default true\n */\n includeTextResponse?: boolean;\n\n /**\n * Include tool call details from sub-prompt execution in the tool result.\n * @default true\n */\n includeToolCalls?: boolean;\n\n /**\n * Include error details from sub-prompt execution in the tool result.\n * @default true\n */\n includeErrors?: boolean;\n\n /**\n * Property from the tool call arguments to use as the initial user message\n * when this tool triggers a sub-prompt execution.\n *\n * @example\n * If the tool is called with `{ query: \"search term\", limit: 10 }` and\n * `initUserMessageProperty: 'query'`, the sub-prompt will receive\n * \"search term\" as the initial user message.\n */\n initUserMessageProperty?: string;\n}\n\n/**\n * Reasoning configuration for models that support extended thinking.\n * Applies to models like OpenAI o1, Anthropic Claude with extended thinking,\n * Google Gemini with thinking, and Qwen with reasoning.\n */\nexport interface ReasoningConfig {\n /**\n * Effort level for reasoning models.\n * Higher effort = more thinking tokens = potentially better results.\n *\n * - `low`: Minimal reasoning, faster responses\n * - `medium`: Balanced reasoning and speed\n * - `high`: Maximum reasoning, slower but more thorough\n *\n * @default undefined (use model defaults)\n */\n effort?: 'low' | 'medium' | 'high';\n\n /**\n * Maximum tokens to allocate for reasoning.\n * Applies to models that support token limits on reasoning\n * (Anthropic, Gemini, Qwen).\n */\n maxTokens?: number;\n\n /**\n * Use reasoning internally but exclude from the response.\n * Model thinks through the problem but only returns the final answer.\n * Useful for cleaner outputs while maintaining reasoning quality.\n */\n exclude?: boolean;\n\n /**\n * Include reasoning content in the message history for multi-turn context.\n * When true, reasoning is preserved and visible to subsequent turns.\n * @default false\n */\n include?: boolean;\n}\n\n/**\n * Prompt definition configuration.\n *\n * @template N - The prompt name as a string literal type\n * @template S - The Zod schema type for requiredSchema (inferred automatically)\n *\n * @example\n * ```typescript\n * import { definePrompt } from '@standardagents/builder';\n * import { z } from 'zod';\n *\n * export default definePrompt({\n * name: 'customer_support',\n * toolDescription: 'Handle customer support inquiries',\n * model: 'gpt-4o',\n * // Simple string prompt:\n * prompt: `You are a helpful customer support agent.\n * Always be polite and try to resolve issues quickly.`,\n * // Or structured prompt with type-safe includes:\n * // prompt: [\n * // { type: 'text', content: 'You are a helpful customer support agent.\\n\\n' },\n * // { type: 'include', prompt: 'common_rules' },\n * // ],\n * tools: ['search_knowledge_base', 'create_ticket'],\n * requiredSchema: z.object({\n * query: z.string().describe('The customer inquiry'),\n * }),\n * });\n * ```\n */\nexport interface PromptDefinition<\n N extends string = string,\n S extends z.ZodTypeAny = z.ZodTypeAny\n> {\n /**\n * Unique name for this prompt.\n * Used as the identifier when referencing from agents or as a tool.\n * Should be snake_case (e.g., 'customer_support', 'data_analyst').\n */\n name: N;\n\n /**\n * Description shown when this prompt is exposed as a tool.\n * Should clearly describe what this prompt does for LLM tool selection.\n */\n toolDescription: string;\n\n /**\n * The system prompt content sent to the LLM.\n *\n * Can be either:\n * 1. A plain string - simple prompt text\n * 2. A structured array - for composing prompts with type-safe includes\n *\n * @example\n * ```typescript\n * // Simple string prompt:\n * prompt: 'You are a helpful assistant.'\n *\n * // Structured prompt with type-safe includes:\n * prompt: [\n * { type: 'text', content: 'You are a helpful assistant.\\n\\n' },\n * { type: 'include', prompt: 'common_rules' }, // autocomplete for prompt names!\n * { type: 'text', content: '\\n\\nBe concise.' },\n * ]\n * ```\n */\n prompt: PromptContent;\n\n /**\n * Model to use for this prompt.\n * Must reference a model defined in agentbuilder/models/.\n * Provides autocomplete when types are generated.\n */\n model: AgentBuilder.Models;\n\n /**\n * @deprecated All prompts are now automatically exposed as tools.\n * This property is ignored and will be removed in a future version.\n */\n exposeAsTool?: boolean;\n\n /**\n * Include full chat history in the LLM context.\n * When true, all previous messages in the conversation are included.\n * @default false\n */\n includeChat?: boolean;\n\n /**\n * Include results from past tool calls in the LLM context.\n * When true, previous tool call results are visible to the LLM.\n * @default false\n */\n includePastTools?: boolean;\n\n /**\n * Allow parallel execution of multiple tool calls.\n * When true, if the LLM requests multiple tools, they execute concurrently.\n * @default false\n */\n parallelToolCalls?: boolean;\n\n /**\n * Tool calling strategy for the LLM.\n *\n * - `auto`: Model decides when to call tools (default)\n * - `none`: Disable tool calling entirely\n * - `required`: Force the model to call at least one tool\n *\n * @default 'auto'\n */\n toolChoice?: 'auto' | 'none' | 'required';\n\n /**\n * Zod schema for validating inputs when this prompt is called as a tool.\n *\n * The schema provides:\n * - Runtime validation of tool call arguments\n * - Type inference for the prompt's input type\n * - Auto-generated JSON Schema for LLM tool definitions\n *\n * Use `.describe()` on schema fields to provide descriptions for the LLM.\n *\n * @example\n * ```typescript\n * requiredSchema: z.object({\n * query: z.string().describe('The search query'),\n * limit: z.number().optional().default(10).describe('Max results'),\n * })\n * ```\n */\n requiredSchema?: S;\n\n /**\n * Tools available to this prompt.\n * Can be simple tool names or detailed configurations.\n *\n * Tools can be:\n * - Custom tools defined in agentbuilder/tools/\n * - Other prompts with exposeAsTool: true\n * - Agents with exposeAsTool: true\n *\n * @example\n * ```typescript\n * tools: [\n * 'search_docs', // Simple reference\n * { name: 'create_ticket', includeErrors: false }, // With config\n * ]\n * ```\n */\n tools?: (AgentBuilder.Callables | ToolConfig)[];\n\n /**\n * Agents that can receive handoffs from this prompt.\n * Enables multi-agent workflows where this prompt can transfer\n * the conversation to a specialized agent.\n */\n handoffAgents?: AgentBuilder.Agents[];\n\n /**\n * Tool to execute before the LLM request.\n * Useful for data fetching, context preparation, or preprocessing.\n * The tool result is available in the prompt context.\n */\n beforeTool?: AgentBuilder.Callables;\n\n /**\n * Tool to execute after the LLM response.\n * Useful for post-processing, logging, or side effects.\n */\n afterTool?: AgentBuilder.Callables;\n\n /**\n * Reasoning configuration for models that support extended thinking.\n * Configure effort level, token limits, and visibility of reasoning.\n */\n reasoning?: ReasoningConfig;\n}\n\n/**\n * Helper type to extract the inferred input type from a prompt's Zod schema.\n *\n * @template T - The prompt definition type\n *\n * @example\n * ```typescript\n * const searchPrompt = definePrompt({\n * name: 'search',\n * requiredSchema: z.object({ query: z.string(), limit: z.number() }),\n * // ...\n * });\n *\n * type SearchInput = PromptInput<typeof searchPrompt>;\n * // { query: string; limit: number }\n * ```\n */\nexport type PromptInput<T extends PromptDefinition<any, any>> =\n T['requiredSchema'] extends z.ZodTypeAny ? z.infer<T['requiredSchema']> : never;\n\n/**\n * Defines a prompt configuration for LLM interactions.\n *\n * Prompts are the primary way to configure how agents interact with LLMs.\n * They specify the system prompt, available tools, input validation,\n * and various behavioral options.\n *\n * @template N - The prompt name as a string literal type\n * @template S - The Zod schema type for requiredSchema\n * @param options - Prompt configuration options\n * @returns The prompt definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/prompts/customer_support.ts\n * import { definePrompt } from '@standardagents/builder';\n * import { z } from 'zod';\n *\n * export default definePrompt({\n * name: 'customer_support',\n * toolDescription: 'Handle customer support inquiries',\n * model: 'gpt-4o',\n * prompt: `You are a helpful customer support agent.\n * Always be polite and try to resolve issues quickly.\n * If you cannot help, offer to escalate to a human.`,\n * tools: ['search_knowledge_base', 'create_ticket'],\n * handoffAgents: ['escalation_agent'],\n * includeChat: true,\n * exposeAsTool: true,\n * requiredSchema: z.object({\n * query: z.string().describe('The customer inquiry'),\n * }),\n * });\n * ```\n */\nexport function definePrompt<N extends string, S extends z.ZodTypeAny = never>(\n options: PromptDefinition<N, S>\n): PromptDefinition<N, S> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Prompt name is required');\n }\n if (!options.toolDescription) {\n throw new Error('Prompt toolDescription is required');\n }\n if (!options.model) {\n throw new Error('Prompt model is required');\n }\n if (!options.prompt) {\n throw new Error('Prompt content is required');\n }\n\n // Validate toolChoice is a known value\n if (options.toolChoice && !['auto', 'none', 'required'].includes(options.toolChoice)) {\n throw new Error(\n `Invalid toolChoice '${options.toolChoice}'. Must be one of: auto, none, required`\n );\n }\n\n // Validate reasoning effort is a known value\n if (options.reasoning?.effort && !['low', 'medium', 'high'].includes(options.reasoning.effort)) {\n throw new Error(\n `Invalid reasoning.effort '${options.reasoning.effort}'. Must be one of: low, medium, high`\n );\n }\n\n return options;\n}\n","/**\n * Agent definition module for AgentBuilder.\n *\n * Agents orchestrate conversations between AI models (dual_ai) or between\n * AI and human users (ai_human). They define the prompts, stop conditions,\n * and behavioral rules for each side of the conversation.\n *\n * @module\n */\n\n/**\n * Agent conversation type.\n *\n * - `ai_human`: AI conversing with a human user (most common)\n * - `dual_ai`: Two AI participants conversing with each other\n */\nexport type AgentType = 'ai_human' | 'dual_ai';\n\n/**\n * Configuration for one side of an agent conversation.\n *\n * Each side has a prompt, stop conditions, and turn limits.\n * For `ai_human` agents, only sideA (the AI) needs configuration.\n * For `dual_ai` agents, both sides need configuration.\n */\nexport interface SideConfig {\n /**\n * Custom label for this side of the conversation.\n * Used in UI and logs for clarity.\n *\n * @example 'Support Agent', 'Customer', 'ATC', 'Pilot'\n */\n label?: string;\n\n /**\n * The prompt to use for this side.\n * Must reference a prompt defined in agentbuilder/prompts/.\n */\n prompt: AgentBuilder.Prompts;\n\n /**\n * Stop this side's turn when it returns a text response (no tool calls).\n * When true, the side's turn ends after producing a message without tools.\n * @default true\n */\n stopOnResponse?: boolean;\n\n /**\n * Stop this side's turn when a specific tool is called.\n * Overrides stopOnResponse when the named tool is invoked.\n * Requires stopToolResponseProperty to extract the result.\n */\n stopTool?: AgentBuilder.Callables;\n\n /**\n * Property to extract from the stop tool's result.\n * Required when stopTool is set.\n * The extracted value is used to determine the conversation outcome.\n */\n stopToolResponseProperty?: string;\n\n /**\n * Maximum turns for this side before forcing a stop.\n * Safety limit to prevent runaway conversations.\n * A turn is one complete request/response cycle.\n */\n maxTurns?: number;\n\n /**\n * Tool that ends the entire conversation when called.\n * Different from stopTool - this ends the conversation for both sides,\n * not just this side's turn.\n */\n endConversationTool?: AgentBuilder.Callables;\n\n /**\n * Enable manual stop condition handling via hooks.\n * When true, stop conditions are evaluated by custom hook logic\n * instead of the built-in rules.\n * @default false\n */\n manualStopCondition?: boolean;\n}\n\n/**\n * Agent definition configuration.\n *\n * @template N - The agent name as a string literal type\n *\n * @example\n * ```typescript\n * import { defineAgent } from '@standardagents/builder';\n *\n * export default defineAgent({\n * name: 'support_agent',\n * title: 'Customer Support Agent',\n * type: 'ai_human',\n * sideA: {\n * label: 'Support',\n * prompt: 'customer_support',\n * stopOnResponse: true,\n * },\n * tags: ['support', 'tier-1'],\n * });\n * ```\n */\nexport interface AgentDefinition<N extends string = string> {\n /**\n * Unique name for this agent.\n * Used as the identifier for thread creation and handoffs.\n * Should be snake_case (e.g., 'support_agent', 'research_flow').\n */\n name: N;\n\n /**\n * Human-readable title for the agent.\n * Optional - if not provided, the name will be used.\n * @deprecated Use name instead. Title will be removed in a future version.\n */\n title?: string;\n\n /**\n * Agent conversation type.\n *\n * - `ai_human`: AI conversing with a human user (default)\n * - `dual_ai`: Two AI participants conversing\n *\n * @default 'ai_human'\n */\n type?: AgentType;\n\n /**\n * Maximum total turns across both sides.\n * Only applies to `dual_ai` agents.\n * Prevents infinite loops in AI-to-AI conversations.\n */\n maxSessionTurns?: number;\n\n /**\n * Configuration for Side A.\n * For `ai_human`: This is the AI side.\n * For `dual_ai`: This is the first AI participant.\n */\n sideA: SideConfig;\n\n /**\n * Configuration for Side B.\n * For `ai_human`: Optional, the human side doesn't need config.\n * For `dual_ai`: Required, the second AI participant.\n */\n sideB?: SideConfig;\n\n /**\n * Expose this agent as a tool for other prompts.\n * Enables agent composition and handoffs.\n * When true, other prompts can invoke this agent as a tool.\n * @default false\n */\n exposeAsTool?: boolean;\n\n /**\n * Description shown when agent is used as a tool.\n * Required if exposeAsTool is true.\n * Should clearly describe what this agent does.\n */\n toolDescription?: string;\n\n /**\n * Tags for categorization and filtering.\n * Useful for organizing agents in the UI and filtering in queries.\n *\n * @example ['customer-service', 'tier-1', 'english']\n */\n tags?: string[];\n}\n\n/**\n * Defines an agent configuration.\n *\n * Agents orchestrate conversations between AI models, or between AI and\n * human users. They use prompts to configure each side of the conversation\n * and define stop conditions to control conversation flow.\n *\n * @template N - The agent name as a string literal type\n * @param options - Agent configuration options\n * @returns The agent definition for registration\n *\n * @example\n * ```typescript\n * // agentbuilder/agents/support_agent.ts\n * import { defineAgent } from '@standardagents/builder';\n *\n * export default defineAgent({\n * name: 'support_agent',\n * title: 'Customer Support Agent',\n * type: 'ai_human',\n * sideA: {\n * label: 'Support',\n * prompt: 'customer_support',\n * stopOnResponse: true,\n * endConversationTool: 'close_ticket',\n * },\n * exposeAsTool: true,\n * toolDescription: 'Hand off to customer support',\n * tags: ['support', 'tier-1'],\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Dual AI agent (two AIs conversing)\n * export default defineAgent({\n * name: 'debate_agent',\n * title: 'AI Debate',\n * type: 'dual_ai',\n * maxSessionTurns: 10,\n * sideA: {\n * label: 'Pro',\n * prompt: 'debate_pro',\n * stopOnResponse: true,\n * },\n * sideB: {\n * label: 'Con',\n * prompt: 'debate_con',\n * stopOnResponse: true,\n * endConversationTool: 'conclude_debate',\n * },\n * });\n * ```\n */\nexport function defineAgent<N extends string>(\n options: AgentDefinition<N>\n): AgentDefinition<N> {\n // Validate required fields at runtime\n if (!options.name) {\n throw new Error('Agent name is required');\n }\n if (!options.sideA) {\n throw new Error('Agent sideA configuration is required');\n }\n if (!options.sideA.prompt) {\n throw new Error('Agent sideA.prompt is required');\n }\n\n // Set default type\n const type = options.type ?? 'ai_human';\n\n // Validate dual_ai requires sideB\n if (type === 'dual_ai') {\n if (!options.sideB) {\n throw new Error('Agent sideB configuration is required for dual_ai type');\n }\n if (!options.sideB.prompt) {\n throw new Error('Agent sideB.prompt is required for dual_ai type');\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (options.exposeAsTool && !options.toolDescription) {\n throw new Error('toolDescription is required when exposeAsTool is true');\n }\n\n // Validate stopTool requires stopToolResponseProperty\n if (options.sideA.stopTool && !options.sideA.stopToolResponseProperty) {\n throw new Error('sideA.stopToolResponseProperty is required when sideA.stopTool is set');\n }\n if (options.sideB?.stopTool && !options.sideB.stopToolResponseProperty) {\n throw new Error('sideB.stopToolResponseProperty is required when sideB.stopTool is set');\n }\n\n // Validate maxTurns is positive\n if (options.sideA.maxTurns !== undefined && options.sideA.maxTurns <= 0) {\n throw new Error('sideA.maxTurns must be a positive number');\n }\n if (options.sideB?.maxTurns !== undefined && options.sideB.maxTurns <= 0) {\n throw new Error('sideB.maxTurns must be a positive number');\n }\n if (options.maxSessionTurns !== undefined && options.maxSessionTurns <= 0) {\n throw new Error('maxSessionTurns must be a positive number');\n }\n\n // Validate type is a known value\n if (!['ai_human', 'dual_ai'].includes(type)) {\n throw new Error(`Invalid type '${type}'. Must be one of: ai_human, dual_ai`);\n }\n\n return {\n ...options,\n type,\n };\n}\n","import type { FlowState, Message, ToolCall } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * import { queueTool } from '@standardagents/builder';\n *\n * queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\nexport function queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true\n };\n\n flow.sequence.queue.push(toolCall);\n}\n\n/**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * import { injectMessage } from '@standardagents/builder';\n *\n * // Append a system message\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\nexport async function injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n forceTurn(flow, options.forceTurn);\n }\n\n return message;\n}\n\n/**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * import { getMessages } from '@standardagents/builder';\n *\n * // Get last 10 messages\n * const messages = await getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await getMessages(flow, 10, 0, \"desc\");\n * ```\n */\nexport async function getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth\n FROM messages\n ORDER BY created_at ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n });\n }\n\n return messages;\n}\n\n/**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * import { injectMessage, reloadHistory } from '@standardagents/builder';\n *\n * // Reload history after injecting a silent message\n * await injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await reloadHistory(flow);\n * ```\n */\nexport async function reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n}\n\n/**\n * Emit a custom event to WebSocket clients via the stream\n *\n * Sends a custom event to all connected WebSocket clients on the stream channel.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard message events.\n *\n * @param flow - The current FlowState\n * @param type - The event type name (e.g., \"progress\", \"notification\")\n * @param data - The event payload (any serializable data)\n *\n * @example\n * ```typescript\n * import { emitThreadEvent } from '@standardagents/builder';\n *\n * // Emit a progress update\n * emitThreadEvent(flow, \"progress\", { step: 3, total: 10, message: \"Processing data...\" });\n *\n * // Emit a custom notification\n * emitThreadEvent(flow, \"notification\", { level: \"info\", message: \"User authenticated\" });\n *\n * // Emit metadata\n * emitThreadEvent(flow, \"metadata\", { userId: \"123\", sessionId: \"abc\" });\n * ```\n */\nexport function emitThreadEvent(\n flow: FlowState,\n type: string,\n data: unknown\n): void {\n if (!flow.emitEvent) {\n console.warn(\"Cannot emit event: emitEvent callback is not available\");\n return;\n }\n\n // Send event via the callback to DurableThread\n flow.emitEvent(type, data);\n}\n\n/**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * import { queueTool, forceTurn } from '@standardagents/builder';\n *\n * queueTool(flow, 'myTool', {});\n * forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * import { forceTurn } from '@standardagents/builder';\n *\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\nexport function forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n}\n\n/**\n * Thread context from defineThreadEndpoint\n */\ninterface ThreadContext {\n instance: {\n updateThreadMeta: (\n threadId: string,\n params: { agent_name?: string; user_id?: string | null; tags?: string[] | null }\n ) => Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n };\n metadata: {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n };\n}\n\n/**\n * Update a thread's metadata in the DurableAgentBuilder registry\n *\n * This allows updating the agent_name, user_id, and tags for an existing thread.\n * Uses the thread instance from defineThreadEndpoint context.\n *\n * @param thread - The thread context from defineThreadEndpoint ({ instance, metadata })\n * @param params - The fields to update (agent_name, user_id, tags)\n * @returns The updated thread info, or null if update failed\n *\n * @example\n * ```typescript\n * import { defineThreadEndpoint, updateThread } from '@standardagents/builder';\n *\n * export default defineThreadEndpoint(async (req, thread) => {\n * // Update thread's user_id\n * await updateThread(thread, { user_id: 'user-123' });\n *\n * // Update thread's tags\n * await updateThread(thread, { tags: ['support', 'urgent'] });\n *\n * // Update multiple fields\n * const result = await updateThread(thread, {\n * agent_name: 'new-agent',\n * user_id: 'user-456',\n * tags: ['sales']\n * });\n *\n * return Response.json(result);\n * });\n * ```\n */\nexport async function updateThread(\n thread: ThreadContext,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n): Promise<{\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n} | null> {\n const result = await thread.instance.updateThreadMeta(thread.metadata.id, params);\n if (!result.success || !result.thread) {\n return null;\n }\n return result.thread;\n}\n","import type { FlowState, Message, ToolCall } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Options for broadcasting custom data\n */\nexport interface BroadcastOptions {\n /** The type of the broadcast message */\n type: string;\n /** The value/payload of the broadcast message */\n value: unknown;\n}\n\n/**\n * FlowState SDK - Utility methods for working with FlowState\n *\n * These methods extend the FlowState object with helpful utilities for:\n * - Queuing tool calls\n * - Injecting messages\n * - Retrieving message history\n * - Broadcasting custom data via WebSocket\n */\nexport class FlowStateSdk {\n /**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * FlowStateSdk.queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\n static queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n ): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true\n };\n\n flow.sequence.queue.push(toolCall);\n }\n\n /**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * // Append a system message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\n static async injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n ): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n FlowStateSdk.forceTurn(flow, options.forceTurn);\n }\n\n return message;\n }\n\n /**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * // Get last 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await FlowStateSdk.getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10, 0, \"desc\");\n * ```\n */\n static async getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n ): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth\n FROM messages\n ORDER BY created_at ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n });\n }\n\n return messages;\n }\n\n /**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * // Reload history after injecting a silent message\n * await FlowStateSdk.injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n * ```\n */\n static async reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n }\n\n /**\n * Broadcast custom data to WebSocket clients\n *\n * Sends a custom message to all connected WebSocket clients.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard telemetry events.\n *\n * The message is sent with the structure: { type: string, value: unknown }\n *\n * @param flow - The current FlowState\n * @param options - Broadcast options\n *\n * @example\n * ```typescript\n * // Broadcast a progress update\n * FlowStateSdk.broadcast(flow, {\n * type: \"progress\",\n * value: { step: 3, total: 10, message: \"Processing data...\" }\n * });\n *\n * // Broadcast a custom notification\n * FlowStateSdk.broadcast(flow, {\n * type: \"notification\",\n * value: { level: \"info\", message: \"User authenticated successfully\" }\n * });\n *\n * // Broadcast metadata\n * FlowStateSdk.broadcast(flow, {\n * type: \"metadata\",\n * value: { userId: \"123\", sessionId: \"abc\", timestamp: Date.now() }\n * });\n * ```\n */\n static broadcast(flow: FlowState, options: BroadcastOptions): void {\n if (!flow.stream) {\n console.warn(\"Cannot broadcast: stream is not available\");\n return;\n }\n\n // Send custom message via WebSocket using the telemetry infrastructure\n // We send it as a special telemetry event with type \"custom\"\n const message = {\n type: \"custom\" as const,\n customType: options.type,\n value: options.value,\n timestamp: Date.now(),\n };\n\n // Use the existing WebSocket infrastructure\n const wsMessage = JSON.stringify(message);\n for (const ws of (flow.stream as any).wsConnections || []) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(wsMessage);\n }\n } catch (error) {\n console.error(\"Error broadcasting custom message:\", error);\n }\n }\n }\n\n /**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * FlowStateSdk.queueTool(flow, 'myTool', {});\n * FlowStateSdk.forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * FlowStateSdk.forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * FlowStateSdk.forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * FlowStateSdk.forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\n static forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n }\n}\n\n/**\n * Convenience methods added to FlowState (optional - can be used via static methods above)\n *\n * These are helper methods that can be added to FlowState instances for convenience.\n * They delegate to the static methods above.\n */\nexport interface FlowStateWithSdk extends FlowState {\n queueTool: (toolName: string, args?: Record<string, unknown>) => void;\n injectMessage: (options: InjectMessageOptions) => Promise<Message>;\n getMessages: (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => Promise<Message[]>;\n reloadHistory: () => Promise<Message[]>;\n broadcast: (options: BroadcastOptions) => void;\n forceTurn: (side: 'side_a' | 'side_b') => void;\n}\n\n/**\n * Enhance a FlowState object with SDK methods\n *\n * This adds convenience methods to a FlowState instance that delegate to\n * the static FlowStateSdk methods.\n *\n * @param flow - The FlowState to enhance\n * @returns The enhanced FlowState with SDK methods\n *\n * @example\n * ```typescript\n * const enhancedFlow = enhanceFlowState(flow);\n *\n * // Now you can use methods directly on the flow object\n * enhancedFlow.queueTool(\"search_user\", { email: \"user@example.com\" });\n * await enhancedFlow.injectMessage({ role: \"system\", content: \"Context updated\" });\n * const messages = await enhancedFlow.getMessages(10);\n * flow.messageHistory = await enhancedFlow.reloadHistory();\n * enhancedFlow.broadcast({ type: \"progress\", value: { step: 1 } });\n * enhancedFlow.forceTurn('side_b'); // Force side_b to play next turn\n * ```\n */\nexport function enhanceFlowState(flow: FlowState): FlowStateWithSdk {\n const enhanced = flow as FlowStateWithSdk;\n\n enhanced.queueTool = (toolName: string, args?: Record<string, unknown>) => {\n FlowStateSdk.queueTool(flow, toolName, args);\n };\n\n enhanced.injectMessage = (options: InjectMessageOptions) => {\n return FlowStateSdk.injectMessage(flow, options);\n };\n\n enhanced.getMessages = (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => {\n return FlowStateSdk.getMessages(flow, limit, offset, order);\n };\n\n enhanced.reloadHistory = () => {\n return FlowStateSdk.reloadHistory(flow);\n };\n\n enhanced.broadcast = (options: BroadcastOptions) => {\n FlowStateSdk.broadcast(flow, options);\n };\n\n enhanced.forceTurn = (side: 'side_a' | 'side_b') => {\n FlowStateSdk.forceTurn(flow, side);\n };\n\n return enhanced;\n}\n","/**\n * GitHub REST API client for committing file changes.\n *\n * This client is used in production to commit configuration changes\n * (prompts, models, agents) to the repository via GitHub's REST API.\n *\n * The flow for creating a commit:\n * 1. Get the current branch ref to find HEAD commit SHA\n * 2. Get the tree SHA from the HEAD commit\n * 3. Create blobs for each file to be added/modified\n * 4. Create a new tree with the file changes\n * 5. Create a commit pointing to the new tree\n * 6. Update the branch ref to point to the new commit\n */\n\nimport type {\n GitHubConfig,\n GitHubFileChange,\n GitHubCommitResult,\n GitHubRef,\n GitHubTree,\n GitHubBlob,\n GitHubCommit,\n} from './types.js';\n\nconst GITHUB_API_BASE = 'https://api.github.com';\n\nexport class GitHubClient {\n private config: GitHubConfig;\n\n constructor(config: GitHubConfig) {\n this.config = config;\n }\n\n /**\n * Create a GitHubClient from environment variables.\n * Returns null if required env vars are missing.\n */\n static fromEnv(env: {\n GITHUB_TOKEN?: string;\n GITHUB_REPO?: string;\n GITHUB_BRANCH?: string;\n }): GitHubClient | null {\n const token = env.GITHUB_TOKEN;\n const repo = env.GITHUB_REPO;\n const branch = env.GITHUB_BRANCH || 'main';\n\n if (!token || !repo) {\n return null;\n }\n\n // Parse owner/repo from GITHUB_REPO\n const parts = repo.split('/');\n if (parts.length !== 2) {\n console.error('GITHUB_REPO must be in format \"owner/repo\"');\n return null;\n }\n\n return new GitHubClient({\n token,\n owner: parts[0],\n repo: parts[1],\n branch,\n });\n }\n\n /**\n * Check if GitHub integration is properly configured.\n */\n isConfigured(): boolean {\n return !!(\n this.config.token &&\n this.config.owner &&\n this.config.repo &&\n this.config.branch\n );\n }\n\n /**\n * Make an authenticated request to GitHub API.\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${GITHUB_API_BASE}${path}`;\n\n const response = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.config.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n 'User-Agent': 'AgentBuilder/1.0',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: 'Unknown error' })) as { message?: string };\n throw new GitHubApiError(\n errorData.message || `GitHub API error: ${response.status}`,\n response.status,\n errorData\n );\n }\n\n return response.json();\n }\n\n /**\n * Get the current branch reference.\n */\n async getBranchRef(): Promise<GitHubRef> {\n return this.request<GitHubRef>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/ref/heads/${this.config.branch}`\n );\n }\n\n /**\n * Get a commit by SHA.\n */\n async getCommit(sha: string): Promise<GitHubCommit> {\n return this.request<GitHubCommit>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/commits/${sha}`\n );\n }\n\n /**\n * Get a tree by SHA.\n */\n async getTree(sha: string): Promise<GitHubTree> {\n return this.request<GitHubTree>(\n 'GET',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees/${sha}`\n );\n }\n\n /**\n * Create a blob (file content).\n */\n async createBlob(content: string): Promise<GitHubBlob> {\n return this.request<GitHubBlob>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/blobs`,\n {\n content: btoa(content), // Base64 encode\n encoding: 'base64',\n }\n );\n }\n\n /**\n * Create a tree with file changes.\n */\n async createTree(\n baseTreeSha: string,\n files: Array<{ path: string; sha: string; mode: string }>\n ): Promise<GitHubTree> {\n return this.request<GitHubTree>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees`,\n {\n base_tree: baseTreeSha,\n tree: files.map((f) => ({\n path: f.path,\n mode: f.mode,\n type: 'blob',\n sha: f.sha,\n })),\n }\n );\n }\n\n /**\n * Create a commit.\n */\n async createCommit(\n message: string,\n treeSha: string,\n parentSha: string\n ): Promise<GitHubCommit> {\n return this.request<GitHubCommit>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/commits`,\n {\n message,\n tree: treeSha,\n parents: [parentSha],\n }\n );\n }\n\n /**\n * Update a branch reference to point to a new commit.\n */\n async updateRef(sha: string): Promise<GitHubRef> {\n return this.request<GitHubRef>(\n 'PATCH',\n `/repos/${this.config.owner}/${this.config.repo}/git/refs/heads/${this.config.branch}`,\n {\n sha,\n force: false,\n }\n );\n }\n\n /**\n * Commit multiple file changes atomically.\n *\n * @param message - Commit message\n * @param files - Array of files to add/modify\n * @returns The commit result with SHA\n */\n async commitFiles(\n message: string,\n files: GitHubFileChange[]\n ): Promise<GitHubCommitResult> {\n if (files.length === 0) {\n throw new Error('No files to commit');\n }\n\n // Step 1: Get current branch ref\n const branchRef = await this.getBranchRef();\n const headSha = branchRef.object.sha;\n\n // Step 2: Get the commit to find tree SHA\n const headCommit = await this.getCommit(headSha);\n const baseTreeSha = headCommit.tree.sha;\n\n // Step 3: Create blobs for each file\n const blobPromises = files.map(async (file) => {\n const blob = await this.createBlob(file.content);\n return {\n path: file.path,\n sha: blob.sha,\n mode: file.mode || '100644',\n };\n });\n const blobs = await Promise.all(blobPromises);\n\n // Step 4: Create new tree with changes\n const newTree = await this.createTree(baseTreeSha, blobs);\n\n // Step 5: Create commit\n const commit = await this.createCommit(message, newTree.sha, headSha);\n\n // Step 6: Update branch ref\n await this.updateRef(commit.sha);\n\n return {\n sha: commit.sha,\n url: commit.html_url,\n message: commit.message,\n };\n }\n\n /**\n * Delete files from the repository.\n *\n * @param message - Commit message\n * @param paths - Array of file paths to delete\n * @returns The commit result with SHA\n */\n async deleteFiles(\n message: string,\n paths: string[]\n ): Promise<GitHubCommitResult> {\n if (paths.length === 0) {\n throw new Error('No files to delete');\n }\n\n // Step 1: Get current branch ref\n const branchRef = await this.getBranchRef();\n const headSha = branchRef.object.sha;\n\n // Step 2: Get the commit to find tree SHA\n const headCommit = await this.getCommit(headSha);\n const baseTreeSha = headCommit.tree.sha;\n\n // Step 3: Create tree with deletions (sha: null removes the file)\n const tree = paths.map((path) => ({\n path,\n mode: '100644' as const,\n type: 'blob' as const,\n sha: null,\n }));\n\n const newTree = await this.request<GitHubTree>(\n 'POST',\n `/repos/${this.config.owner}/${this.config.repo}/git/trees`,\n {\n base_tree: baseTreeSha,\n tree,\n }\n );\n\n // Step 4: Create commit\n const commit = await this.createCommit(message, newTree.sha, headSha);\n\n // Step 5: Update branch ref\n await this.updateRef(commit.sha);\n\n return {\n sha: commit.sha,\n url: commit.html_url,\n message: commit.message,\n };\n }\n\n /**\n * Get the current HEAD commit SHA.\n */\n async getHeadSha(): Promise<string> {\n const ref = await this.getBranchRef();\n return ref.object.sha;\n }\n}\n\n/**\n * Custom error for GitHub API errors.\n */\nexport class GitHubApiError extends Error {\n status: number;\n details: unknown;\n\n constructor(message: string, status: number, details?: unknown) {\n super(message);\n this.name = 'GitHubApiError';\n this.status = status;\n this.details = details;\n }\n}\n"]}
|