@ash-cloud/ash-ai 0.1.8
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/ash-widget.js +2 -0
- package/dist/ash-widget.js.map +1 -0
- package/dist/embed.cjs +19 -0
- package/dist/embed.cjs.map +1 -0
- package/dist/embed.d.cts +278 -0
- package/dist/embed.d.ts +278 -0
- package/dist/embed.js +16 -0
- package/dist/embed.js.map +1 -0
- package/dist/icons.cjs +156 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.d.cts +1 -0
- package/dist/icons.d.ts +1 -0
- package/dist/icons.js +3 -0
- package/dist/icons.js.map +1 -0
- package/dist/index-DJwpy-R5.js +6797 -0
- package/dist/index.cjs +17502 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +9590 -0
- package/dist/index.d.ts +9590 -0
- package/dist/index.js +17328 -0
- package/dist/index.js.map +1 -0
- package/dist/playground/App.d.ts +2 -0
- package/dist/playground/App.d.ts.map +1 -0
- package/dist/playground/Playground.d.ts +62 -0
- package/dist/playground/Playground.d.ts.map +1 -0
- package/dist/playground/components/ChatInput.d.ts +60 -0
- package/dist/playground/components/ChatInput.d.ts.map +1 -0
- package/dist/playground/components/MessageList.d.ts +28 -0
- package/dist/playground/components/MessageList.d.ts.map +1 -0
- package/dist/playground/components/NormalizedMessageList.d.ts +26 -0
- package/dist/playground/components/NormalizedMessageList.d.ts.map +1 -0
- package/dist/playground/components/SandboxLogsPanel.d.ts +16 -0
- package/dist/playground/components/SandboxLogsPanel.d.ts.map +1 -0
- package/dist/playground/components/Sidebar.d.ts +7 -0
- package/dist/playground/components/Sidebar.d.ts.map +1 -0
- package/dist/playground/components/ToolCallCard.d.ts +9 -0
- package/dist/playground/components/ToolCallCard.d.ts.map +1 -0
- package/dist/playground/components/icons.d.ts +9 -0
- package/dist/playground/components/icons.d.ts.map +1 -0
- package/dist/playground/contexts/ThemeContext.d.ts +9 -0
- package/dist/playground/contexts/ThemeContext.d.ts.map +1 -0
- package/dist/playground/index.d.ts +30 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/main.d.ts +1 -0
- package/dist/playground/main.d.ts.map +1 -0
- package/dist/playground/pages/AgentsPage.d.ts +2 -0
- package/dist/playground/pages/AgentsPage.d.ts.map +1 -0
- package/dist/playground/pages/ChatPage.d.ts +2 -0
- package/dist/playground/pages/ChatPage.d.ts.map +1 -0
- package/dist/playground/pages/SessionsPage.d.ts +2 -0
- package/dist/playground/pages/SessionsPage.d.ts.map +1 -0
- package/dist/playground.css +1 -0
- package/dist/playground.d.ts +18 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +3753 -0
- package/dist/schema-B_CVsJm5.d.cts +1585 -0
- package/dist/schema-B_CVsJm5.d.ts +1585 -0
- package/dist/schema.cjs +254 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +3 -0
- package/dist/schema.d.ts +3 -0
- package/dist/schema.js +235 -0
- package/dist/schema.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/normalized.ts","../src/types/index.ts","../src/errors/index.ts","../src/session/manager.ts","../src/mcp/index.ts","../src/agent/claude-sdk.ts","../src/agent/gemini-cli.ts","../src/agent/backend.ts","../src/utils/sandbox-logger.ts","../src/agent/harness.ts","../src/agent/index.ts","../src/session/index.ts","../src/storage/memory.ts","../src/storage/queue-memory.ts","../src/storage/index.ts","../src/queue/processor.ts","../src/queue/index.ts","../src/attachment/index.ts","../src/events/index.ts","../src/config/index.ts","../src/runtime/providers/types.ts","../src/runtime/providers/local.ts","../src/runtime/providers/modal.ts","../src/runtime/providers/e2b.ts","../src/runtime/providers/cloudflare.ts","../src/runtime/providers/fly.ts","../src/runtime/providers/daytona.ts","../src/runtime/providers/vercel.ts","../src/runtime/providers/index.ts","../src/runtime/sandbox-manager.ts","../src/runtime/sandbox-pool.ts","../src/runtime/vercel-sandbox-executor.ts","../src/runtime/sandbox-file-sync.ts","../src/runtime/index.ts","../src/credentials/index.ts","../src/skills/types.ts","../src/skills/local-provider.ts","../src/skills/github-provider.ts","../src/skills/manager.ts","../src/skills/index.ts","../src/utils/normalize-messages.ts","../src/utils/tool-call-processor.ts","../src/utils/index.ts","../src/server/routes/sessions.ts","../src/server/routes/agents.ts","../src/server/routes/skills.ts","../src/server/routes/queue.ts","../src/server/server.ts","../../../../node_modules/.pnpm/@asteasolutions+zod-to-openapi@7.3.4_zod@3.25.76/node_modules/@asteasolutions/zod-to-openapi/dist/index.mjs","../../../../node_modules/.pnpm/@hono+zod-validator@0.7.6_hono@4.11.3_zod@3.25.76/node_modules/@hono/zod-validator/src/index.ts","../../../../node_modules/.pnpm/@hono+zod-openapi@0.19.10_hono@4.11.3_zod@3.25.76/node_modules/@hono/zod-openapi/dist/index.js","../../../../node_modules/.pnpm/@scalar+core@0.3.30/node_modules/@scalar/core/src/libs/html-rendering/html-rendering.ts","../../../../node_modules/.pnpm/@scalar+core@0.3.30/node_modules/@scalar/core/src/libs/html-rendering/index.ts","../../../../node_modules/.pnpm/@scalar+hono-api-reference@0.9.32_hono@4.11.3/node_modules/@scalar/hono-api-reference/src/scalar.ts","../../../../node_modules/.pnpm/@scalar+hono-api-reference@0.9.32_hono@4.11.3/node_modules/@scalar/hono-api-reference/src/index.ts","../src/server/openapi/schemas.ts","../src/server/openapi/routes/sessions.ts","../src/server/openapi/routes/agents.ts","../src/server/openapi/routes/skills.ts","../src/server/openapi/server.ts","../src/server/openapi/index.ts","../src/server/middleware/logger.ts","../src/server/middleware/rate-limit.ts","../src/server/middleware/index.ts","../src/server/index.ts","../src/workspace/skill-catalog.ts","../src/workspace/git-repo.ts","../src/workspace/persistence.ts","../src/workspace/github-skills.ts","../src/workspace/mcp-generator.ts","../src/workspace/workspace.ts","../src/workspace/bundle-store.ts","../src/workspace/supabase-store.ts","../src/workspace/cloud-store.ts","../src/workspace/file-store.ts","../src/workspace/local-sandbox.ts","../src/workspace/provider-sandbox.ts","../src/workspace/harness-integration.ts","../src/workspace/index.ts","../src/storage-postgres/schema.ts","../src/storage-postgres/storage.ts","../src/storage-postgres/queue-storage.ts","../src/storage-supabase/storage.ts","../src/storage-cloud/client.ts","../src/storage-cloud/storage.ts","../src/storage-cloud/sandbox.ts","../src/storage-cloud/ash-cloud.ts","../src/index.ts"],"names":["messages","path","resolve","env","log","logger","sessions","nanoid","attachments","index","path2","fs2","z","init_types","execSync","timestamp","fs","now","entry","sandbox","DEFAULT_MAX_FILE_SIZE","path4","init_manager","path5","agents","Hono","options","agent","streamSSE","init_skills","init_queue","_a","_b","_c","_d","_e","_f","_g","referencedSchema","value","zValidator: typeof zValidatorFunction","init_dist","validator","customTheme","init_html_rendering","createSessionsRouter","init_sessions","createAgentsRouter","init_agents","createSkillsRouter","cors","prettyJSON","secureHeaders","init_server","serve","createHarnessServer","shellQuote","fs6","path6","fs7","path7","os2","desc","spawn","FILTERED_ITEMS","fs8","path8","path9","createClient","path10","fs10","path11","fs11","fs12","path12","createE2BProvider","createVercelProvider","createModalProvider","fs13","path13","init_workspace","init_storage","postgres","drizzle","sql","eq","and","asc","conditions","row","text"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Normalized types for structured tool call display.\n *\n * These types provide a unified representation for displaying tool calls\n * with their arguments and results together, enabling collapsible UI cards\n * with ARGS and OUTPUT sections.\n */\n\n// =============================================================================\n// Tool Status\n// =============================================================================\n\n/**\n * Status of a tool call execution\n */\nexport type ToolStatus = 'pending' | 'success' | 'failed';\n\n// =============================================================================\n// Action-Specific Result Types\n// =============================================================================\n\n/**\n * Result from a command/bash execution\n */\nexport interface CommandRunResult {\n exitCode?: number;\n success?: boolean;\n output?: string;\n}\n\n/**\n * Generic tool result that can be markdown or structured JSON\n */\nexport interface ToolResult {\n type: 'markdown' | 'json';\n value: unknown;\n}\n\n// =============================================================================\n// Action Types (Discriminated Union)\n// =============================================================================\n\n/**\n * Bash/command execution action\n */\nexport interface CommandRunAction {\n action: 'command_run';\n command: string;\n description?: string;\n result?: CommandRunResult;\n}\n\n/**\n * File read action\n */\nexport interface FileReadAction {\n action: 'file_read';\n path: string;\n offset?: number;\n limit?: number;\n}\n\n/**\n * File edit action\n */\nexport interface FileEditAction {\n action: 'file_edit';\n path: string;\n oldString?: string;\n newString?: string;\n replaceAll?: boolean;\n}\n\n/**\n * File write action\n */\nexport interface FileWriteAction {\n action: 'file_write';\n path: string;\n content?: string;\n}\n\n/**\n * Search/grep action\n */\nexport interface SearchAction {\n action: 'search';\n pattern: string;\n path?: string;\n glob?: string;\n type?: string;\n}\n\n/**\n * Glob/file pattern matching action\n */\nexport interface GlobAction {\n action: 'glob';\n pattern: string;\n path?: string;\n}\n\n/**\n * Web fetch action\n */\nexport interface WebFetchAction {\n action: 'web_fetch';\n url: string;\n prompt?: string;\n}\n\n/**\n * Web search action\n */\nexport interface WebSearchAction {\n action: 'web_search';\n query: string;\n}\n\n/**\n * MCP (Model Context Protocol) tool action\n */\nexport interface McpToolAction {\n action: 'mcp_tool';\n serverName: string;\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n/**\n * Generic/unknown tool action\n */\nexport interface GenericToolAction {\n action: 'generic_tool';\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n// =============================================================================\n// Todo Types\n// =============================================================================\n\n/**\n * Status of a todo item\n */\nexport type TodoStatus = 'pending' | 'in_progress' | 'completed';\n\n/**\n * A single todo item from TodoWrite tool\n */\nexport interface TodoItem {\n /** Task content - imperative form (e.g., \"Run tests\") */\n content: string;\n /** Current status of the todo */\n status: TodoStatus;\n /** Active form shown during execution (e.g., \"Running tests\") */\n activeForm: string;\n}\n\n/**\n * TodoWrite tool action - tracks task progress\n */\nexport interface TodoWriteAction {\n action: 'todo_write';\n /** All todos in the current list */\n todos: TodoItem[];\n /** Summary statistics */\n stats?: {\n total: number;\n completed: number;\n inProgress: number;\n pending: number;\n };\n}\n\n/**\n * Discriminated union of all action types\n */\nexport type ActionType =\n | CommandRunAction\n | FileReadAction\n | FileEditAction\n | FileWriteAction\n | SearchAction\n | GlobAction\n | WebFetchAction\n | WebSearchAction\n | McpToolAction\n | GenericToolAction\n | TodoWriteAction;\n\n// =============================================================================\n// Normalized Tool Call\n// =============================================================================\n\n/**\n * A normalized tool call that combines tool_use and tool_result data\n */\nexport interface NormalizedToolCall {\n /** Unique ID from the tool_use block */\n id: string;\n\n /** Original tool name (e.g., 'Bash', 'Read', 'mcp__server__tool') */\n toolName: string;\n\n /** Parsed action type with structured arguments and result */\n actionType: ActionType;\n\n /** Current execution status */\n status: ToolStatus;\n\n /** Human-readable one-liner summary */\n summary: string;\n\n /** When the tool call started */\n startedAt?: string;\n\n /** When the tool call completed */\n completedAt?: string;\n\n /** Whether this tool call resulted in an error */\n isError?: boolean;\n}\n\n// =============================================================================\n// Normalized Entry Types\n// =============================================================================\n\n/**\n * User message entry\n */\nexport interface UserMessageEntry {\n type: 'user_message';\n}\n\n/**\n * Assistant message entry\n */\nexport interface AssistantMessageEntry {\n type: 'assistant_message';\n}\n\n/**\n * Thinking/reasoning entry (extended thinking)\n */\nexport interface ThinkingEntry {\n type: 'thinking';\n}\n\n/**\n * Tool call entry with full tool call data\n */\nexport interface ToolCallEntry {\n type: 'tool_call';\n toolCall: NormalizedToolCall;\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry {\n type: 'error';\n message: string;\n code?: string;\n}\n\n/**\n * Discriminated union of all entry types\n */\nexport type NormalizedEntryType =\n | UserMessageEntry\n | AssistantMessageEntry\n | ThinkingEntry\n | ToolCallEntry\n | ErrorEntry;\n\n// =============================================================================\n// Normalized Entry\n// =============================================================================\n\n/**\n * A normalized conversation entry for display\n */\nexport interface NormalizedEntry {\n /** Unique entry ID */\n id: string;\n\n /** ISO timestamp */\n timestamp?: string;\n\n /** Entry type with type-specific data */\n entryType: NormalizedEntryType;\n\n /** Text content for display */\n content: string;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isCommandRunAction(action: ActionType): action is CommandRunAction {\n return action.action === 'command_run';\n}\n\nexport function isFileReadAction(action: ActionType): action is FileReadAction {\n return action.action === 'file_read';\n}\n\nexport function isFileEditAction(action: ActionType): action is FileEditAction {\n return action.action === 'file_edit';\n}\n\nexport function isFileWriteAction(action: ActionType): action is FileWriteAction {\n return action.action === 'file_write';\n}\n\nexport function isSearchAction(action: ActionType): action is SearchAction {\n return action.action === 'search';\n}\n\nexport function isGlobAction(action: ActionType): action is GlobAction {\n return action.action === 'glob';\n}\n\nexport function isWebFetchAction(action: ActionType): action is WebFetchAction {\n return action.action === 'web_fetch';\n}\n\nexport function isWebSearchAction(action: ActionType): action is WebSearchAction {\n return action.action === 'web_search';\n}\n\nexport function isMcpToolAction(action: ActionType): action is McpToolAction {\n return action.action === 'mcp_tool';\n}\n\nexport function isGenericToolAction(action: ActionType): action is GenericToolAction {\n return action.action === 'generic_tool';\n}\n\nexport function isTodoWriteAction(action: ActionType): action is TodoWriteAction {\n return action.action === 'todo_write';\n}\n\nexport function isToolCallEntry(entry: NormalizedEntryType): entry is ToolCallEntry {\n return entry.type === 'tool_call';\n}\n\nexport function isErrorEntry(entry: NormalizedEntryType): entry is ErrorEntry {\n return entry.type === 'error';\n}\n","import { z } from 'zod';\nimport type { SkillConfig } from '../skills/types.js';\n\n// Re-export normalized types for structured tool call display\nexport * from './normalized.js';\n\n// Base ID types\nexport type SessionId = string;\nexport type MessageId = string;\nexport type AttachmentId = string;\nexport type AgentId = string;\n\n// Session status\nexport const SessionStatus = {\n ACTIVE: 'active',\n COMPLETED: 'completed',\n ERROR: 'error',\n SUSPENDED: 'suspended',\n STOPPED: 'stopped',\n} as const;\n\nexport type SessionStatus = (typeof SessionStatus)[keyof typeof SessionStatus];\n\n// Agent status\nexport const AgentStatus = {\n ACTIVE: 'active',\n PAUSED: 'paused',\n DELETED: 'deleted',\n} as const;\n\nexport type AgentStatus = (typeof AgentStatus)[keyof typeof AgentStatus];\n\n// Message roles\nexport const MessageRole = {\n USER: 'user',\n ASSISTANT: 'assistant',\n TOOL: 'tool',\n SYSTEM: 'system',\n} as const;\n\nexport type MessageRole = (typeof MessageRole)[keyof typeof MessageRole];\n\n// Message content types\nexport interface TextContent {\n type: 'text';\n text: string;\n}\n\nexport interface ToolUseContent {\n type: 'tool_use';\n id: string;\n name: string;\n input: unknown;\n}\n\nexport interface ToolResultContent {\n type: 'tool_result';\n toolUseId: string;\n content: unknown;\n isError?: boolean;\n}\n\nexport interface ImageContent {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n mediaType: string;\n data?: string;\n url?: string;\n };\n}\n\nexport interface FileContent {\n type: 'file';\n attachmentId: AttachmentId;\n filename: string;\n mimeType: string;\n}\n\nexport type MessageContent =\n | TextContent\n | ToolUseContent\n | ToolResultContent\n | ImageContent\n | FileContent;\n\n// Core entities\nexport interface Message {\n id: MessageId;\n sessionId: SessionId;\n role: MessageRole;\n content: MessageContent[];\n createdAt: Date;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Session {\n id: SessionId;\n agentName: string;\n status: SessionStatus;\n createdAt: Date;\n updatedAt: Date;\n metadata?: Record<string, unknown>;\n // Claude Agent SDK session ID (used for resume)\n sdkSessionId?: string;\n parentSessionId?: SessionId;\n // Stats\n totalTokens?: number;\n totalCost?: number;\n}\n\nexport interface Attachment {\n id: AttachmentId;\n messageId: MessageId;\n filename: string;\n mimeType: string;\n size: number;\n storagePath: string;\n createdAt: Date;\n}\n\n// Pagination\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n cursor?: string;\n orderBy?: 'createdAt' | 'updatedAt';\n order?: 'asc' | 'desc';\n}\n\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n// List options\nexport interface ListSessionsOptions extends PaginationOptions {\n agentName?: string;\n status?: SessionStatus;\n}\n\nexport interface ListMessagesOptions extends PaginationOptions {\n sessionId?: SessionId;\n role?: MessageRole;\n}\n\n// Zod schemas for validation\nexport const messageContentSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n z.object({\n type: z.literal('tool_use'),\n id: z.string(),\n name: z.string(),\n input: z.unknown(),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolUseId: z.string(),\n content: z.unknown(),\n isError: z.boolean().optional(),\n }),\n z.object({\n type: z.literal('image'),\n source: z.object({\n type: z.enum(['base64', 'url']),\n mediaType: z.string(),\n data: z.string().optional(),\n url: z.string().optional(),\n }),\n }),\n z.object({\n type: z.literal('file'),\n attachmentId: z.string(),\n filename: z.string(),\n mimeType: z.string(),\n }),\n]);\n\nexport const messageSchema = z.object({\n id: z.string(),\n sessionId: z.string(),\n role: z.enum(['user', 'assistant', 'tool', 'system']),\n content: z.array(messageContentSchema),\n createdAt: z.date(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string(),\n agentName: z.string(),\n status: z.enum(['active', 'completed', 'error', 'suspended', 'stopped']),\n createdAt: z.date(),\n updatedAt: z.date(),\n metadata: z.record(z.unknown()).optional(),\n sdkSessionId: z.string().optional(),\n parentSessionId: z.string().optional(),\n totalTokens: z.number().optional(),\n totalCost: z.number().optional(),\n});\n\nexport const attachmentSchema = z.object({\n id: z.string(),\n messageId: z.string(),\n filename: z.string(),\n mimeType: z.string(),\n size: z.number(),\n storagePath: z.string(),\n createdAt: z.date(),\n});\n\n/**\n * Supported sandbox provider types for cloud/external execution\n */\nexport type SandboxProviderType =\n | 'local'\n | 'vercel'\n | 'e2b'\n | 'modal'\n | 'cloudflare'\n | 'fly'\n | 'daytona';\n\n/**\n * Sandbox provider configuration for agent execution.\n * This determines WHERE the agent runs (local machine, Vercel VM, E2B sandbox, etc.)\n *\n * Note: This is different from runtime/SandboxConfig which configures the\n * Claude SDK's built-in sandboxing features (fs paths, network controls).\n */\nexport interface SandboxProviderConfig {\n /** Provider to use (defaults to 'local' in harness, 'vercel' in cloud) */\n provider: SandboxProviderType;\n\n /** Provider-specific credentials */\n credentials?: {\n /** Vercel Sandbox credentials */\n vercel?: {\n apiToken?: string;\n teamId?: string;\n projectId?: string;\n };\n /** E2B credentials */\n e2b?: {\n apiKey?: string;\n templateId?: string;\n };\n /** Modal credentials */\n modal?: {\n tokenId?: string;\n tokenSecret?: string;\n };\n };\n\n /** Resource limits for the sandbox */\n resources?: {\n memory?: string;\n cpu?: string;\n timeout?: number;\n };\n\n /** Working directory inside the sandbox */\n workingDirectory?: string;\n}\n\n/**\n * Default sandbox provider configuration (local, no isolation)\n */\nexport const DEFAULT_SANDBOX_PROVIDER_CONFIG: SandboxProviderConfig = {\n provider: 'local',\n};\n\n// Agent configuration\nexport interface AgentConfig {\n name: string;\n model?: string;\n systemPrompt?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';\n hooks?: AgentHooks;\n mcpServers?: Record<string, { command: string; args?: string[] }>;\n /** Skills to enable for this agent (materialized at session start) */\n skills?: SkillConfig[];\n\n /**\n * Sandbox provider configuration for agent execution.\n * Determines where and how the agent runs (local, Vercel, E2B, etc.)\n */\n sandbox?: SandboxProviderConfig;\n\n /**\n * Environment variables to set in the sandbox.\n * These are passed to the sandbox provider when creating the environment.\n */\n envVars?: Record<string, string>;\n\n /**\n * Bash script to run in the sandbox on startup.\n * Use this to install dependencies or configure the environment.\n * Each line is executed as a separate command.\n */\n startupScript?: string;\n\n /**\n * URL to a zip file containing the .claude directory.\n * When set, the sandbox will download and extract this zip to .claude/\n * This includes skills, commands, agents, hooks, and MCP configurations.\n */\n configFileUrl?: string;\n}\n\n/**\n * Stored agent with persistence metadata\n */\nexport interface StoredAgent extends Omit<AgentConfig, 'hooks'> {\n id: AgentId;\n slug: string;\n description?: string;\n status: AgentStatus;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n deletedAt?: Date;\n /** When the configFileUrl was last updated (for cache busting) */\n configFileUpdatedAt?: Date;\n /** Webhook URL to notify on execution completion (outbound) */\n executionWebhookUrl?: string;\n /** Secret for signing execution webhook payloads (HMAC-SHA256) */\n executionWebhookSecret?: string;\n}\n\n/**\n * Options for creating an agent\n */\nexport interface CreateAgentOptions {\n name: string;\n slug?: string;\n description?: string;\n model?: string;\n systemPrompt?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';\n mcpServers?: Record<string, { command: string; args?: string[] }>;\n envVars?: Record<string, string>;\n startupScript?: string;\n configFileUrl?: string;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for updating an agent\n */\nexport interface UpdateAgentOptions {\n name?: string;\n description?: string;\n model?: string;\n systemPrompt?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';\n mcpServers?: Record<string, { command: string; args?: string[] }>;\n envVars?: Record<string, string>;\n startupScript?: string;\n configFileUrl?: string | null;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n status?: 'active' | 'paused';\n}\n\n/**\n * Options for listing agents\n */\nexport interface ListAgentsOptions extends PaginationOptions {\n status?: AgentStatus;\n}\n\nexport interface AgentHooks {\n onSessionStart?: (session: Session) => Promise<void> | void;\n onSessionEnd?: (session: Session) => Promise<void> | void;\n onMessage?: (message: Message) => Promise<void> | void;\n onToolUse?: (\n tool: string,\n input: unknown,\n result: unknown\n ) => Promise<void> | void;\n onError?: (error: Error, session: Session) => Promise<void> | void;\n}\n\n// Session options\nexport interface CreateSessionOptions {\n metadata?: Record<string, unknown>;\n systemPrompt?: string;\n\n /**\n * API key to use for this session (overrides default)\n * Can be a plaintext key or a credential ID from CredentialManager\n */\n apiKey?: string;\n\n /**\n * Credential ID from CredentialManager (preferred over apiKey)\n */\n credentialId?: string;\n\n /**\n * Sandbox configuration for this session (overrides agent default).\n * Allows per-session provider selection and configuration.\n */\n sandbox?: SandboxProviderConfig;\n\n /**\n * Environment variables for this session (merged with agent defaults).\n * Session-level vars take precedence over agent-level vars.\n */\n envVars?: Record<string, string>;\n\n /**\n * Startup script for this session (overrides agent default if provided).\n */\n startupScript?: string;\n}\n\nexport interface SendMessageOptions {\n attachments?: Array<{\n filename: string;\n content: Buffer | string;\n mimeType: string;\n }>;\n metadata?: Record<string, unknown>;\n\n /**\n * Per-request context to prepend to the user's message.\n * This is useful for providing dynamic context on each request, such as:\n * - Current page/view the user is on\n * - User's current selection or cursor position\n * - Recent user activity or state changes\n * - Current application state\n *\n * The context is prepended to the user message (not the system prompt) for\n * cache efficiency. This keeps the system prompt prefix stable across requests,\n * allowing LLM prefix caching to work (faster responses + lower costs).\n *\n * The context is wrapped in <session-context> tags automatically.\n * It does not persist between requests.\n *\n * @example\n * ```typescript\n * await session.send(\"Help me with this code\", {\n * sessionContext: `\n * Current file: /src/components/Button.tsx\n * Selected text: \"const handleClick = () => {\"\n * Cursor position: line 42, column 15\n * `\n * });\n * // Results in message:\n * // <session-context>\n * // Current file: /src/components/Button.tsx\n * // ...\n * // </session-context>\n * //\n * // Help me with this code\n * ```\n */\n sessionContext?: string;\n\n /**\n * AbortSignal for cancelling the request.\n * When the signal is aborted, the agent execution will stop gracefully,\n * saving any partial content and updating the session status to 'stopped'.\n * The session can still be resumed with follow-up messages after stopping.\n */\n signal?: AbortSignal;\n}\n\nexport interface ResumeSessionOptions {\n forkSession?: boolean;\n}\n\n// Streaming events\nexport const StreamEventType = {\n SESSION_START: 'session_start',\n TEXT_DELTA: 'text_delta',\n MESSAGE: 'message',\n TOOL_USE: 'tool_use',\n TOOL_RESULT: 'tool_result',\n TURN_COMPLETE: 'turn_complete',\n SESSION_END: 'session_end',\n SESSION_STOPPED: 'session_stopped',\n SANDBOX_LOG: 'sandbox_log',\n ERROR: 'error',\n} as const;\n\nexport type StreamEventType =\n (typeof StreamEventType)[keyof typeof StreamEventType];\n\nexport interface SessionStartEvent {\n type: 'session_start';\n sessionId: SessionId;\n sdkSessionId: string;\n}\n\nexport interface TextDeltaEvent {\n type: 'text_delta';\n delta: string;\n}\n\nexport interface ThinkingDeltaEvent {\n type: 'thinking_delta';\n delta: string;\n}\n\nexport interface MessageEvent {\n type: 'message';\n message: Message;\n}\n\nexport interface ToolUseEvent {\n type: 'tool_use';\n id: string;\n name: string;\n input: unknown;\n}\n\nexport interface ToolResultEvent {\n type: 'tool_result';\n toolUseId: string;\n content: unknown;\n isError?: boolean;\n}\n\nexport interface SessionEndEvent {\n type: 'session_end';\n sessionId: SessionId;\n status: SessionStatus;\n totalTokens?: number;\n totalCost?: number;\n}\n\n/**\n * Emitted when Claude has finished generating its response for a turn,\n * BEFORE cleanup operations (message saving, session status updates, etc.).\n * This allows clients to show \"ready\" state earlier while background\n * operations like sandbox zip construction complete.\n */\nexport interface TurnCompleteEvent {\n type: 'turn_complete';\n sessionId: SessionId;\n}\n\nexport interface SessionStoppedEvent {\n type: 'session_stopped';\n sessionId: SessionId;\n /** Reason for stopping */\n reason: 'user_requested' | 'timeout' | 'error';\n /** Partial text content that was accumulated before stopping */\n partialContent?: string;\n}\n\nexport interface ErrorEvent {\n type: 'error';\n error: string;\n code?: string;\n}\n\n/** Log levels for sandbox logs */\nexport type SandboxLogLevel = 'info' | 'warn' | 'error' | 'debug';\n\n/** Categories for sandbox logs */\nexport type SandboxLogCategory =\n | 'setup'\n | 'skills'\n | 'execution'\n | 'process'\n | 'startup'\n | 'backup'\n | 'restore';\n\n/** A single sandbox log entry */\nexport interface SandboxLogEntry {\n timestamp: string;\n level: SandboxLogLevel;\n category: SandboxLogCategory;\n message: string;\n data?: Record<string, unknown>;\n}\n\nexport interface SandboxLogEvent {\n type: 'sandbox_log';\n entry: SandboxLogEntry;\n}\n\nexport type StreamEvent =\n | SessionStartEvent\n | TextDeltaEvent\n | ThinkingDeltaEvent\n | MessageEvent\n | ToolUseEvent\n | ToolResultEvent\n | TurnCompleteEvent\n | SessionEndEvent\n | SessionStoppedEvent\n | SandboxLogEvent\n | ErrorEvent;\n\n// ============================================================================\n// Message Queue Types\n// ============================================================================\n\n/**\n * Status of a queued message\n */\nexport const QueueItemStatus = {\n PENDING: 'pending',\n PROCESSING: 'processing',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELLED: 'cancelled',\n} as const;\n\nexport type QueueItemStatus = (typeof QueueItemStatus)[keyof typeof QueueItemStatus];\n\n/**\n * A message queued for processing by an agent\n */\nexport interface QueueItem {\n /** Unique identifier for this queue item */\n id: string;\n /** Session ID this message belongs to (null for new session) */\n sessionId: SessionId | null;\n /** Agent name/slug to process this message */\n agentName: string;\n /** The user's message prompt */\n prompt: string;\n /** Optional file attachments */\n files?: Array<{\n filename: string;\n content: string; // base64 encoded\n mimeType: string;\n }>;\n /** Optional session context to inject */\n sessionContext?: string;\n /** Optional metadata for the message */\n metadata?: Record<string, unknown>;\n /** Current status of this queue item */\n status: QueueItemStatus;\n /** Priority (higher = processed first, default 0) */\n priority: number;\n /** Number of times this has been retried */\n retryCount: number;\n /** Maximum retries before marking as failed */\n maxRetries: number;\n /** Error message if failed */\n error?: string;\n /** Result message ID if completed */\n resultMessageId?: MessageId;\n /** Created timestamp */\n createdAt: Date;\n /** Last updated timestamp */\n updatedAt: Date;\n /** Started processing timestamp */\n startedAt?: Date;\n /** Completed/failed timestamp */\n completedAt?: Date;\n}\n\n/**\n * Options for creating a queue item\n */\nexport interface CreateQueueItemOptions {\n sessionId?: SessionId | null;\n agentName: string;\n prompt: string;\n files?: Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>;\n sessionContext?: string;\n metadata?: Record<string, unknown>;\n priority?: number;\n maxRetries?: number;\n}\n\n/**\n * Options for listing queue items\n */\nexport interface ListQueueItemsOptions extends PaginationOptions {\n sessionId?: SessionId;\n agentName?: string;\n status?: QueueItemStatus;\n}\n\n/**\n * Queue statistics\n */\nexport interface QueueStats {\n pending: number;\n processing: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n}\n\n/**\n * Queue status for a specific session\n */\nexport interface SessionQueueStatus {\n sessionId: SessionId | null;\n agentName: string;\n isProcessing: boolean;\n pendingCount: number;\n currentItem?: QueueItem;\n nextItems: QueueItem[];\n}\n","/**\n * Base Error Types for Agent SDK Harness\n *\n * These error types provide a consistent error hierarchy that can be\n * extended by cloud or other implementations. All errors include:\n * - A unique error code for programmatic handling\n * - An optional cause for error chaining\n * - Optional details for debugging\n */\n\n/**\n * Base error codes for the harness\n * Cloud implementations can extend this with additional codes\n */\nexport const HarnessErrorCode = {\n // General\n UNKNOWN: 'UNKNOWN',\n INTERNAL: 'INTERNAL',\n INVALID_INPUT: 'INVALID_INPUT',\n NOT_FOUND: 'NOT_FOUND',\n ALREADY_EXISTS: 'ALREADY_EXISTS',\n OPERATION_FAILED: 'OPERATION_FAILED',\n\n // Session errors\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_ALREADY_ACTIVE: 'SESSION_ALREADY_ACTIVE',\n SESSION_COMPLETED: 'SESSION_COMPLETED',\n SESSION_ERROR: 'SESSION_ERROR',\n\n // Storage errors\n STORAGE_CONNECTION_FAILED: 'STORAGE_CONNECTION_FAILED',\n STORAGE_QUERY_FAILED: 'STORAGE_QUERY_FAILED',\n STORAGE_WRITE_FAILED: 'STORAGE_WRITE_FAILED',\n\n // Agent errors\n AGENT_NOT_FOUND: 'AGENT_NOT_FOUND',\n AGENT_NOT_INITIALIZED: 'AGENT_NOT_INITIALIZED',\n AGENT_EXECUTION_FAILED: 'AGENT_EXECUTION_FAILED',\n\n // Tool errors\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n\n // Configuration errors\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_MISSING: 'CONFIG_MISSING',\n} as const;\n\nexport type HarnessErrorCode =\n (typeof HarnessErrorCode)[keyof typeof HarnessErrorCode];\n\n/**\n * Options for creating a HarnessError\n */\nexport interface HarnessErrorOptions {\n /** The error code */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Original error that caused this error */\n cause?: Error;\n /** Additional details for debugging */\n details?: Record<string, unknown>;\n}\n\n/**\n * Base error class for all harness errors\n *\n * @example\n * ```typescript\n * throw new HarnessError({\n * code: HarnessErrorCode.SESSION_NOT_FOUND,\n * message: 'Session not found',\n * details: { sessionId: 'sess_123' },\n * });\n * ```\n */\nexport class HarnessError extends Error {\n readonly code: string;\n readonly details?: Record<string, unknown>;\n\n constructor(options: HarnessErrorOptions) {\n super(options.message, { cause: options.cause });\n this.name = 'HarnessError';\n this.code = options.code;\n this.details = options.details;\n\n // Maintain proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Convert error to a plain object for serialization\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n if (this.cause) {\n result.cause =\n this.cause instanceof Error\n ? { name: this.cause.name, message: this.cause.message }\n : this.cause;\n }\n return result;\n }\n\n /**\n * Create a HarnessError from an unknown error\n */\n static from(error: unknown, code = HarnessErrorCode.UNKNOWN): HarnessError {\n if (error instanceof HarnessError) {\n return error;\n }\n if (error instanceof Error) {\n return new HarnessError({\n code,\n message: error.message,\n cause: error,\n });\n }\n return new HarnessError({\n code,\n message: String(error),\n });\n }\n}\n\n/**\n * Error thrown when a session operation fails\n */\nexport class SessionError extends HarnessError {\n readonly sessionId?: string;\n\n constructor(\n options: HarnessErrorOptions & { sessionId?: string }\n ) {\n super(options);\n this.name = 'SessionError';\n this.sessionId = options.sessionId;\n }\n}\n\n/**\n * Error thrown when a storage operation fails\n */\nexport class StorageError extends HarnessError {\n constructor(options: HarnessErrorOptions) {\n super(options);\n this.name = 'StorageError';\n }\n}\n\n/**\n * Error thrown when an agent operation fails\n */\nexport class AgentError extends HarnessError {\n readonly agentName?: string;\n\n constructor(\n options: HarnessErrorOptions & { agentName?: string }\n ) {\n super(options);\n this.name = 'AgentError';\n this.agentName = options.agentName;\n }\n}\n\n/**\n * Error thrown when a tool operation fails\n */\nexport class ToolError extends HarnessError {\n readonly toolName?: string;\n\n constructor(\n options: HarnessErrorOptions & { toolName?: string }\n ) {\n super(options);\n this.name = 'ToolError';\n this.toolName = options.toolName;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class ConfigError extends HarnessError {\n constructor(options: HarnessErrorOptions) {\n super(options);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Error thrown when input validation fails\n */\nexport class ValidationError extends HarnessError {\n readonly field?: string;\n\n constructor(\n options: HarnessErrorOptions & { field?: string }\n ) {\n super({\n ...options,\n code: options.code ?? HarnessErrorCode.INVALID_INPUT,\n });\n this.name = 'ValidationError';\n this.field = options.field;\n }\n}\n\n/**\n * Error thrown when a resource is not found\n */\nexport class NotFoundError extends HarnessError {\n readonly resourceType?: string;\n readonly resourceId?: string;\n\n constructor(\n options: HarnessErrorOptions & {\n resourceType?: string;\n resourceId?: string;\n }\n ) {\n super({\n ...options,\n code: options.code ?? HarnessErrorCode.NOT_FOUND,\n });\n this.name = 'NotFoundError';\n this.resourceType = options.resourceType;\n this.resourceId = options.resourceId;\n }\n}\n\n/**\n * Type guard to check if an error is a HarnessError\n */\nexport function isHarnessError(error: unknown): error is HarnessError {\n return error instanceof HarnessError;\n}\n\n/**\n * Type guard to check if an error has a specific error code\n */\nexport function hasErrorCode(\n error: unknown,\n code: string\n): error is HarnessError {\n return isHarnessError(error) && error.code === code;\n}\n","import type {\n Session,\n SessionId,\n Message,\n CreateSessionOptions,\n ResumeSessionOptions,\n ListSessionsOptions,\n PaginatedResult,\n PaginationOptions,\n SessionStatus,\n} from '../types/index.js';\nimport type { SessionStorage } from '../storage/interface.js';\n\n/**\n * Manages sessions, providing high-level operations\n * for creating, resuming, and organizing agent sessions.\n */\nexport class SessionManager {\n constructor(private storage: SessionStorage) {}\n\n /**\n * Initialize the session manager and storage\n */\n async initialize(): Promise<void> {\n await this.storage.initialize();\n }\n\n /**\n * Close the session manager and storage\n */\n async close(): Promise<void> {\n await this.storage.close();\n }\n\n // Session Operations\n\n /**\n * Create a new session record\n */\n async createSession(\n agentName: string,\n options: CreateSessionOptions = {}\n ): Promise<Session> {\n return this.storage.createSession({\n agentName,\n status: 'active',\n metadata: {\n ...options.metadata,\n // Store session-level environment overrides\n ...(options.envVars && { envVars: options.envVars }),\n ...(options.startupScript && { startupScript: options.startupScript }),\n },\n });\n }\n\n /**\n * Get a session by ID\n */\n async getSession(sessionId: SessionId): Promise<Session | null> {\n return this.storage.getSession(sessionId);\n }\n\n /**\n * Update session status and metadata\n */\n async updateSession(\n sessionId: SessionId,\n updates: {\n status?: SessionStatus;\n sdkSessionId?: string;\n metadata?: Record<string, unknown>;\n totalTokens?: number;\n totalCost?: number;\n }\n ): Promise<Session> {\n return this.storage.updateSession(sessionId, updates);\n }\n\n /**\n * Delete a session and all associated messages\n */\n async deleteSession(sessionId: SessionId): Promise<void> {\n return this.storage.deleteSession(sessionId);\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(\n options?: ListSessionsOptions\n ): Promise<PaginatedResult<Session>> {\n return this.storage.listSessions(options);\n }\n\n /**\n * Create a forked session from an existing one\n */\n async forkSession(\n sessionId: SessionId,\n _options: ResumeSessionOptions = {}\n ): Promise<Session> {\n const parentSession = await this.storage.getSession(sessionId);\n if (!parentSession) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Create a new session that references the parent\n const forkedSession = await this.storage.createSession({\n agentName: parentSession.agentName,\n status: 'active',\n parentSessionId: parentSession.id,\n sdkSessionId: parentSession.sdkSessionId,\n metadata: {\n ...parentSession.metadata,\n forkedFrom: parentSession.id,\n forkedAt: new Date().toISOString(),\n },\n });\n\n return forkedSession;\n }\n\n // Message Operations\n\n /**\n * Save messages to a session\n */\n async saveMessages(\n sessionId: SessionId,\n messages: Array<Omit<Message, 'id' | 'sessionId' | 'createdAt'>>\n ): Promise<Message[]> {\n // Verify session exists\n const session = await this.storage.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n return this.storage.saveMessages(\n messages.map((msg) => ({\n ...msg,\n sessionId,\n }))\n );\n }\n\n /**\n * Get messages for a session\n */\n async getSessionMessages(\n sessionId: SessionId,\n options?: PaginationOptions\n ): Promise<PaginatedResult<Message>> {\n return this.storage.getMessages(sessionId, options);\n }\n\n /**\n * Delete a specific message\n */\n async deleteMessage(messageId: string): Promise<void> {\n return this.storage.deleteMessage(messageId);\n }\n\n // Utility Methods\n\n /**\n * Get session history chain (for forked sessions)\n */\n async getSessionHistory(sessionId: SessionId): Promise<Session[]> {\n const history: Session[] = [];\n let currentId: SessionId | undefined = sessionId;\n\n while (currentId) {\n const session = await this.storage.getSession(currentId);\n if (!session) break;\n history.unshift(session);\n currentId = session.parentSessionId;\n }\n\n return history;\n }\n}\n","/**\n * MCP (Model Context Protocol) Server Integration\n *\n * This module provides utilities for configuring and managing MCP servers\n * that extend agent capabilities with external tools and resources.\n *\n * Popular MCP servers:\n * - Playwright: Browser automation (@playwright/mcp)\n * - GitHub: Repository operations (github-mcp-server)\n * - Filesystem: File system access (filesystem-mcp-server)\n * - Postgres: Database queries (postgres-mcp-server)\n *\n * @see https://github.com/modelcontextprotocol/servers\n */\n\nimport type { ClaudeAgentOptions } from '../agent/claude-sdk.js';\n\n/**\n * Transport type for MCP servers\n */\nexport type McpTransportType = 'stdio' | 'http' | 'sse';\n\n/**\n * Authentication configuration for MCP servers\n */\nexport type McpAuth =\n | { type: 'bearer'; token: string }\n | { type: 'basic'; username: string; password: string }\n | { type: 'api-key'; key: string; header?: string };\n\n/**\n * Convert McpAuth to HTTP headers\n */\nexport function mcpAuthToHeaders(auth: McpAuth): Record<string, string> {\n switch (auth.type) {\n case 'bearer':\n return { Authorization: `Bearer ${auth.token}` };\n case 'basic':\n const credentials = Buffer.from(`${auth.username}:${auth.password}`).toString('base64');\n return { Authorization: `Basic ${credentials}` };\n case 'api-key':\n return { [auth.header ?? 'X-API-Key']: auth.key };\n }\n}\n\n/**\n * Base MCP server configuration (common fields)\n */\ninterface McpServerConfigBase {\n /** Transport type - defaults to 'stdio' if command is provided */\n type?: McpTransportType;\n}\n\n/**\n * Configuration for stdio-based MCP servers (local processes)\n */\nexport interface McpStdioServerConfig extends McpServerConfigBase {\n type?: 'stdio';\n /** Command to run the server */\n command: string;\n /** Arguments to pass to the command */\n args?: string[];\n /** Environment variables for the server process */\n env?: Record<string, string>;\n /** Working directory for the server */\n cwd?: string;\n}\n\n/**\n * Configuration for HTTP/SSE-based MCP servers (remote)\n */\nexport interface McpHttpServerConfig extends McpServerConfigBase {\n type: 'http' | 'sse';\n /** URL of the MCP server endpoint */\n url: string;\n /**\n * Authentication for the MCP server (preferred over raw headers)\n *\n * @example Bearer token\n * ```typescript\n * auth: { type: 'bearer', token: userAccessToken }\n * ```\n *\n * @example API key\n * ```typescript\n * auth: { type: 'api-key', key: 'sk-...', header: 'X-API-Key' }\n * ```\n */\n auth?: McpAuth;\n /** Additional HTTP headers (auth headers are added automatically from auth field) */\n headers?: Record<string, string>;\n}\n\n/**\n * MCP server configuration - supports both stdio and HTTP/SSE transports\n *\n * @example Stdio server (local process)\n * ```typescript\n * const stdioConfig: McpServerConfig = {\n * command: 'npx',\n * args: ['@modelcontextprotocol/server-github'],\n * env: { GITHUB_TOKEN: process.env.GITHUB_TOKEN }\n * };\n * ```\n *\n * @example HTTP server (remote)\n * ```typescript\n * const httpConfig: McpServerConfig = {\n * type: 'http',\n * url: 'https://api.example.com/mcp',\n * headers: { Authorization: `Bearer ${token}` }\n * };\n * ```\n */\nexport type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig;\n\n/**\n * Type guard to check if config is for HTTP/SSE transport\n */\nexport function isHttpMcpConfig(config: McpServerConfig): config is McpHttpServerConfig {\n return config.type === 'http' || config.type === 'sse';\n}\n\n/**\n * Type guard to check if config is for stdio transport\n */\nexport function isStdioMcpConfig(config: McpServerConfig): config is McpStdioServerConfig {\n return !config.type || config.type === 'stdio';\n}\n\n/**\n * Create an HTTP MCP server configuration with Bearer token authentication\n *\n * @param url - The MCP server endpoint URL\n * @param token - Bearer token for authentication\n * @param additionalHeaders - Optional additional headers\n * @returns HTTP MCP server configuration\n *\n * @example\n * ```typescript\n * const config = httpMcpWithAuth(\n * 'https://myapp.com/api/mcp',\n * userAccessToken\n * );\n * ```\n */\nexport function httpMcpWithAuth(\n url: string,\n token: string,\n additionalHeaders?: Record<string, string>\n): McpHttpServerConfig {\n return {\n type: 'http',\n url,\n headers: {\n Authorization: `Bearer ${token}`,\n ...additionalHeaders,\n },\n };\n}\n\n/**\n * Create an SSE MCP server configuration with Bearer token authentication\n *\n * @param url - The MCP server SSE endpoint URL\n * @param token - Bearer token for authentication\n * @param additionalHeaders - Optional additional headers\n * @returns SSE MCP server configuration\n */\nexport function sseMcpWithAuth(\n url: string,\n token: string,\n additionalHeaders?: Record<string, string>\n): McpHttpServerConfig {\n return {\n type: 'sse',\n url,\n headers: {\n Authorization: `Bearer ${token}`,\n ...additionalHeaders,\n },\n };\n}\n\n/**\n * Pre-configured MCP server definitions\n */\nexport const McpServers = {\n /**\n * Playwright MCP server for browser automation\n * @see https://github.com/microsoft/playwright-mcp\n */\n playwright: (options?: { headless?: boolean }): McpServerConfig => ({\n command: 'npx',\n args: [\n '@playwright/mcp@latest',\n ...(options?.headless === false ? ['--no-headless'] : []),\n ],\n }),\n\n /**\n * GitHub MCP server for repository operations\n * Requires GITHUB_TOKEN environment variable\n */\n github: (options?: { owner?: string; repo?: string }): McpServerConfig => ({\n command: 'npx',\n args: [\n '@modelcontextprotocol/server-github',\n ...(options?.owner ? ['--owner', options.owner] : []),\n ...(options?.repo ? ['--repo', options.repo] : []),\n ],\n }),\n\n /**\n * Filesystem MCP server for file operations\n * @param allowedPaths Paths the server can access\n */\n filesystem: (allowedPaths: string[]): McpServerConfig => ({\n command: 'npx',\n args: [\n '@modelcontextprotocol/server-filesystem',\n '--allowed-paths',\n allowedPaths.join(','),\n ],\n }),\n\n /**\n * PostgreSQL MCP server for database queries\n * @param connectionString PostgreSQL connection URL\n */\n postgres: (connectionString: string): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-postgres', connectionString],\n }),\n\n /**\n * SQLite MCP server for database queries\n * @param dbPath Path to the SQLite database file\n */\n sqlite: (dbPath: string): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-sqlite', '--db-path', dbPath],\n }),\n\n /**\n * Brave Search MCP server for web search\n * Requires BRAVE_API_KEY environment variable\n */\n braveSearch: (): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-brave-search'],\n }),\n\n /**\n * Google Drive MCP server for file access\n * Requires Google OAuth credentials\n */\n googleDrive: (): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-google-drive'],\n }),\n\n /**\n * Slack MCP server for messaging\n * Requires SLACK_BOT_TOKEN environment variable\n */\n slack: (): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-slack'],\n }),\n\n /**\n * Puppeteer MCP server for browser automation (alternative to Playwright)\n */\n puppeteer: (): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-puppeteer'],\n }),\n\n /**\n * Memory MCP server for persistent key-value storage\n */\n memory: (): McpServerConfig => ({\n command: 'npx',\n args: ['@modelcontextprotocol/server-memory'],\n }),\n\n /**\n * Custom MCP server from a local path\n * @param path Path to the server script\n * @param runtime Runtime to use (node, python, etc.)\n */\n custom: (\n path: string,\n runtime: 'node' | 'python' | 'deno' = 'node',\n args?: string[]\n ): McpServerConfig => {\n const commands: Record<string, string> = {\n node: 'node',\n python: 'python3',\n deno: 'deno',\n };\n return {\n command: commands[runtime] ?? 'node',\n args: runtime === 'deno' ? ['run', '-A', path, ...(args ?? [])] : [path, ...(args ?? [])],\n };\n },\n};\n\n/**\n * Builder for configuring multiple MCP servers\n */\nexport class McpConfigBuilder {\n private servers: Record<string, McpServerConfig> = {};\n\n /**\n * Add a pre-configured MCP server\n */\n add(name: string, config: McpServerConfig): this {\n this.servers[name] = config;\n return this;\n }\n\n /**\n * Add Playwright for browser automation\n */\n withPlaywright(options?: { headless?: boolean }): this {\n return this.add('playwright', McpServers.playwright(options));\n }\n\n /**\n * Add GitHub for repository operations\n */\n withGitHub(options?: { owner?: string; repo?: string }): this {\n return this.add('github', McpServers.github(options));\n }\n\n /**\n * Add Filesystem for file access\n */\n withFilesystem(allowedPaths: string[]): this {\n return this.add('filesystem', McpServers.filesystem(allowedPaths));\n }\n\n /**\n * Add PostgreSQL for database queries\n */\n withPostgres(connectionString: string): this {\n return this.add('postgres', McpServers.postgres(connectionString));\n }\n\n /**\n * Add SQLite for database queries\n */\n withSqlite(dbPath: string): this {\n return this.add('sqlite', McpServers.sqlite(dbPath));\n }\n\n /**\n * Add Brave Search for web search\n */\n withBraveSearch(): this {\n return this.add('brave-search', McpServers.braveSearch());\n }\n\n /**\n * Add Memory for key-value storage\n */\n withMemory(): this {\n return this.add('memory', McpServers.memory());\n }\n\n /**\n * Add a custom stdio MCP server\n */\n withCustom(\n name: string,\n path: string,\n runtime?: 'node' | 'python' | 'deno',\n args?: string[]\n ): this {\n return this.add(name, McpServers.custom(path, runtime, args));\n }\n\n /**\n * Add an HTTP MCP server with typed authentication\n *\n * @param name - Server name (used as mcp__name__ prefix for tools)\n * @param url - The MCP server endpoint URL\n * @param options - Authentication and additional headers\n *\n * @example Bearer token auth\n * ```typescript\n * builder.withHttp('myapp', '/api/mcp', {\n * auth: { type: 'bearer', token: userAccessToken }\n * })\n * ```\n *\n * @example API key auth\n * ```typescript\n * builder.withHttp('myapp', '/api/mcp', {\n * auth: { type: 'api-key', key: 'sk-...', header: 'X-API-Key' }\n * })\n * ```\n */\n withHttp(\n name: string,\n url: string,\n options?: {\n auth?: McpAuth;\n headers?: Record<string, string>;\n }\n ): this {\n return this.add(name, {\n type: 'http',\n url,\n auth: options?.auth,\n headers: options?.headers,\n });\n }\n\n /**\n * Add an SSE MCP server with typed authentication\n *\n * @param name - Server name (used as mcp__name__ prefix for tools)\n * @param url - The MCP server SSE endpoint URL\n * @param options - Authentication and additional headers\n */\n withSse(\n name: string,\n url: string,\n options?: {\n auth?: McpAuth;\n headers?: Record<string, string>;\n }\n ): this {\n return this.add(name, {\n type: 'sse',\n url,\n auth: options?.auth,\n headers: options?.headers,\n });\n }\n\n /**\n * Build the MCP servers configuration\n */\n build(): Record<string, McpServerConfig> {\n return { ...this.servers };\n }\n\n /**\n * Convert to ClaudeAgentOptions format\n * Properly handles both stdio and HTTP/SSE server configs\n * Converts typed auth to headers automatically\n */\n toAgentOptions(): Pick<ClaudeAgentOptions, 'mcpServers'> {\n return {\n mcpServers: Object.fromEntries(\n Object.entries(this.servers).map(([name, config]) => {\n if (isHttpMcpConfig(config)) {\n // HTTP/SSE server - merge auth headers with explicit headers\n const authHeaders = config.auth ? mcpAuthToHeaders(config.auth) : {};\n const headers = { ...authHeaders, ...config.headers };\n\n return [name, {\n type: config.type,\n url: config.url,\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n }];\n }\n // Stdio server (default)\n return [name, {\n command: config.command,\n args: config.args,\n }];\n })\n ),\n };\n }\n}\n\n/**\n * Create a new MCP config builder\n */\nexport function configureMcp(): McpConfigBuilder {\n return new McpConfigBuilder();\n}\n\n/**\n * Common MCP server presets for different use cases\n */\nexport const McpPresets = {\n /**\n * Web research preset: browser automation + web search\n */\n webResearch: (): McpConfigBuilder =>\n configureMcp()\n .withPlaywright()\n .withBraveSearch(),\n\n /**\n * Database preset: PostgreSQL + memory\n */\n database: (connectionString: string): McpConfigBuilder =>\n configureMcp()\n .withPostgres(connectionString)\n .withMemory(),\n\n /**\n * GitHub development preset: GitHub + filesystem\n */\n githubDev: (options: { allowedPaths: string[]; owner?: string; repo?: string }): McpConfigBuilder =>\n configureMcp()\n .withGitHub({ owner: options.owner, repo: options.repo })\n .withFilesystem(options.allowedPaths),\n\n /**\n * Full-featured preset with multiple servers\n */\n fullFeatured: (options: {\n allowedPaths: string[];\n dbConnectionString?: string;\n }): McpConfigBuilder => {\n const builder = configureMcp()\n .withPlaywright()\n .withFilesystem(options.allowedPaths)\n .withMemory();\n\n if (options.dbConnectionString) {\n builder.withPostgres(options.dbConnectionString);\n }\n\n return builder;\n },\n};\n","/**\n * Claude Agent SDK Integration Module\n *\n * This module provides the integration layer with the official Claude Agent SDK.\n * It supports both V1 (query function) and V2 (createSession) APIs.\n *\n * V1 API: Single query with streaming responses\n * - query({ prompt, options }) -> AsyncGenerator<SDKMessage>\n *\n * V2 API (Preview): Session-based multi-turn conversations\n * - unstable_v2_createSession(options) -> Session\n * - unstable_v2_resumeSession(sessionId, options) -> Session\n * - unstable_v2_prompt(prompt, options) -> Promise<Result>\n *\n * @see https://platform.claude.com/docs/en/agent-sdk/overview\n * @see https://platform.claude.com/docs/en/agent-sdk/typescript-v2-preview\n */\n\nimport type { Message, MessageContent } from '../types/index.js';\nimport { mcpAuthToHeaders } from '../mcp/index.js';\n\n/**\n * Agent options that can be passed to the Claude SDK\n */\nexport interface ClaudeAgentOptions {\n /** Model to use (e.g., 'claude-sonnet-4-5-20250514') */\n model?: string;\n\n /** API key to use (overrides environment/default) */\n apiKey?: string;\n\n /** System prompt configuration */\n systemPrompt?: string | {\n type: 'preset';\n preset: 'default' | 'claude_code';\n append?: string;\n };\n\n /** List of tools the agent can use */\n allowedTools?: string[];\n\n /** Tools to explicitly disallow */\n disallowedTools?: string[];\n\n /** Permission mode for tool execution */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';\n\n /** Maximum number of turns in the conversation */\n maxTurns?: number;\n\n /** Claude session ID for resuming a previous session (V1) */\n resume?: string;\n\n /** Whether to fork the session when resuming (V1) */\n forkSession?: boolean;\n\n /**\n * MCP servers to connect\n *\n * Supports both stdio (local process) and HTTP/SSE (remote) transports:\n *\n * @example Stdio server\n * ```typescript\n * mcpServers: {\n * \"github\": { command: \"npx\", args: [\"@modelcontextprotocol/server-github\"] }\n * }\n * ```\n *\n * @example HTTP server with auth\n * ```typescript\n * mcpServers: {\n * \"myapp\": {\n * type: \"http\",\n * url: \"https://myapp.com/api/mcp\",\n * headers: { Authorization: `Bearer ${token}` }\n * }\n * }\n * ```\n *\n * @example HTTP server with typed auth (converted to headers automatically)\n * ```typescript\n * mcpServers: {\n * \"myapp\": {\n * type: \"http\",\n * url: \"https://myapp.com/api/mcp\",\n * auth: { type: \"bearer\", token: userAccessToken }\n * }\n * }\n * ```\n */\n mcpServers?: Record<string, {\n // Stdio transport (local process)\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n // HTTP/SSE transport (remote)\n type?: 'stdio' | 'http' | 'sse';\n url?: string;\n headers?: Record<string, string>;\n /**\n * Typed authentication (alternative to raw headers).\n * Will be converted to appropriate Authorization header.\n */\n auth?: {\n type: 'bearer';\n token: string;\n } | {\n type: 'basic';\n username: string;\n password: string;\n } | {\n type: 'api-key';\n key: string;\n header?: string;\n };\n }>;\n\n /** Custom agents/subagents */\n agents?: Record<string, {\n description: string;\n prompt: string;\n tools?: string[];\n }>;\n\n /** Hooks for agent lifecycle */\n hooks?: {\n PreToolUse?: Array<{ matcher: string; hooks: Function[] }>;\n PostToolUse?: Array<{ matcher: string; hooks: Function[] }>;\n SessionStart?: Function[];\n SessionEnd?: Function[];\n Stop?: Function[];\n };\n\n /** Load project settings from .claude directory */\n settingSources?: Array<'project' | 'user'>;\n\n /**\n * Environment variables to set in the Claude agent sandbox.\n * These are passed to the sandbox provider when creating the environment.\n */\n envVars?: Record<string, string>;\n\n /**\n * Bash script to run in the sandbox on startup.\n * Use this to install dependencies or configure the environment.\n */\n startupScript?: string;\n\n /**\n * Harness session ID (UUID) used for sandbox caching.\n * This is separate from `resume` (Claude SDK session ID) and ensures\n * that the same sandbox is reused when resuming a session.\n */\n harnessSessionId?: string;\n\n /**\n * URL to a zip file containing the .claude directory.\n * When set, the sandbox will download and extract this zip to .claude/\n * so the claude-agent-sdk can discover skills, commands, hooks, etc.\n */\n configFileUrl?: string;\n\n /**\n * AbortSignal for cancelling the query execution.\n * When aborted, the query will stop processing and return early.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Message types from the Claude Agent SDK\n */\nexport interface ClaudeMessage {\n type: 'system' | 'assistant' | 'result' | 'user';\n subtype?: 'init' | 'progress';\n session_id?: string;\n parent_tool_use_id?: string | null;\n message?: {\n role: string;\n content: ClaudeContentBlock[];\n };\n // Result message fields\n result?: string;\n cost?: number;\n tokens?: {\n input: number;\n output: number;\n };\n}\n\nexport type ClaudeContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n | { type: 'tool_result'; tool_use_id: string; content: unknown; is_error?: boolean };\n\n/**\n * Normalized streaming event types for our harness\n */\nexport interface ClaudeStreamEvent {\n type: 'session_init' | 'text_delta' | 'thinking_delta' | 'text' | 'tool_use' | 'tool_result' | 'complete' | 'error';\n sessionId?: string;\n /** Incremental text or thinking delta (for streaming) */\n delta?: string;\n /** Complete text block (for compatibility) */\n text?: string;\n /** Tool use ID (for tool_use events) */\n id?: string;\n /** Tool name (for tool_use events) */\n name?: string;\n /** Tool input (for tool_use events) */\n input?: unknown;\n /** Tool use ID that the result corresponds to (for tool_result events) */\n toolUseId?: string;\n /** Tool result content (for tool_result events) */\n content?: unknown;\n /** Whether the tool result is an error */\n isError?: boolean;\n result?: string;\n totalCost?: number;\n totalTokens?: number;\n error?: string;\n}\n\n/**\n * Client for interacting with the Claude Agent SDK\n *\n * @example\n * ```typescript\n * const client = new ClaudeSdkClient();\n *\n * // V1 API - single query\n * for await (const event of client.query('Fix the bug in auth.py')) {\n * console.log(event);\n * }\n *\n * // V2 API - multi-turn session\n * const session = await client.createSession();\n * await session.send('Remember this: 42');\n * for await (const event of session.stream()) {\n * console.log(event);\n * }\n * await session.send('What was the number?');\n * // ...\n * await session.close();\n * ```\n */\nexport class ClaudeSdkClient {\n private defaultModel: string;\n private sdkAvailable: boolean | null = null;\n\n constructor(options: { apiKey?: string; defaultModel?: string } = {}) {\n // API key is read from environment by the SDK\n this.defaultModel = options.defaultModel ?? 'claude-sonnet-4-5-20250514';\n }\n\n /**\n * Execute an agent query and stream responses (V1 API)\n *\n * @param prompt - The user prompt to send\n * @param options - Agent configuration options\n * @yields ClaudeStreamEvent for each response chunk\n */\n async *query(\n prompt: string,\n options: ClaudeAgentOptions = {}\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n const model = options.model ?? this.defaultModel;\n\n if (await this.checkSdkAvailable()) {\n yield* this.executeRealQuery(prompt, { ...options, model });\n } else {\n yield* this.executeSimulatedQuery(prompt, { ...options, model });\n }\n }\n\n /**\n * Execute using the real Claude Agent SDK V1 query function\n */\n private async *executeRealQuery(\n prompt: string,\n options: ClaudeAgentOptions\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n // Handle per-session API key by temporarily setting env var\n const originalApiKey = process.env.ANTHROPIC_API_KEY;\n if (options.apiKey) {\n process.env.ANTHROPIC_API_KEY = options.apiKey;\n }\n\n try {\n const { query } = await import('@anthropic-ai/claude-agent-sdk');\n\n const queryOptions: any = {\n prompt,\n options: {\n model: options.model,\n allowedTools: options.allowedTools,\n disallowedTools: options.disallowedTools,\n permissionMode: options.permissionMode,\n maxTurns: options.maxTurns,\n resume: options.resume,\n forkSession: options.forkSession,\n mcpServers: options.mcpServers,\n agents: options.agents,\n hooks: options.hooks,\n settingSources: options.settingSources,\n // Enable streaming partial messages for real-time text deltas\n includePartialMessages: true,\n // Environment variables for the SDK\n ...(options.envVars && { env: options.envVars }),\n },\n };\n\n // Handle system prompt\n if (typeof options.systemPrompt === 'string') {\n queryOptions.options.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n append: options.systemPrompt,\n };\n } else if (options.systemPrompt) {\n queryOptions.options.systemPrompt = options.systemPrompt;\n }\n\n for await (const message of query(queryOptions) as AsyncIterable<any>) {\n // Check if aborted before processing each message\n if (options.signal?.aborted) {\n return;\n }\n\n // Handle system init message\n if (message.type === 'system' && message.subtype === 'init') {\n yield {\n type: 'session_init',\n sessionId: message.session_id,\n };\n continue;\n }\n\n // Handle streaming partial messages (text deltas)\n if (message.type === 'stream_event' && message.event) {\n const event = message.event as {\n type: string;\n index?: number;\n delta?: { type: string; text?: string; thinking?: string };\n };\n\n // Handle content_block_delta events for incremental text\n if (event.type === 'content_block_delta') {\n if (event.delta?.type === 'text_delta' && event.delta.text) {\n yield {\n type: 'text_delta',\n delta: event.delta.text,\n };\n } else if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {\n // Handle thinking deltas for extended thinking\n yield {\n type: 'thinking_delta',\n delta: event.delta.thinking,\n };\n }\n }\n continue;\n }\n\n // Handle complete assistant messages (for tool use, etc.)\n if (message.type === 'assistant' && message.message) {\n for (const block of (message as ClaudeMessage).message!.content) {\n if (block.type === 'text') {\n // Complete text block - still useful for final message assembly\n yield {\n type: 'text',\n text: block.text,\n };\n } else if (block.type === 'tool_use') {\n yield {\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n };\n }\n }\n }\n\n // Handle user messages which contain tool_result blocks\n if (message.type === 'user' && message.message) {\n for (const block of (message as ClaudeMessage).message!.content) {\n if (block.type === 'tool_result') {\n yield {\n type: 'tool_result',\n toolUseId: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n };\n }\n }\n }\n\n // Handle result message\n if (message.type === 'result') {\n yield {\n type: 'complete',\n sessionId: message.session_id,\n result: message.result,\n totalCost: message.cost,\n totalTokens: message.tokens\n ? message.tokens.input + message.tokens.output\n : undefined,\n };\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Check if it's an import error or runtime error\n if (errorMessage.includes('Cannot find module') || errorMessage.includes('MODULE_NOT_FOUND')) {\n console.warn('Claude Agent SDK not installed, using simulation mode');\n yield* this.executeSimulatedQuery(prompt, options);\n } else {\n yield {\n type: 'error',\n error: errorMessage,\n };\n }\n } finally {\n // Restore original API key\n if (options.apiKey) {\n if (originalApiKey) {\n process.env.ANTHROPIC_API_KEY = originalApiKey;\n } else {\n delete process.env.ANTHROPIC_API_KEY;\n }\n }\n }\n }\n\n /**\n * Simulated query for development/testing without the SDK installed\n */\n private async *executeSimulatedQuery(\n prompt: string,\n options: ClaudeAgentOptions\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n const sessionId = options.resume ?? `sim_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n // Emit session init\n yield {\n type: 'session_init',\n sessionId,\n };\n\n // Simulate some processing time\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n // Build simulated response\n const responseLines: string[] = [\n '**[Simulation Mode]**\\n\\n',\n `I received your prompt: \"${prompt.slice(0, 150)}${prompt.length > 150 ? '...' : ''}\"\\n\\n`,\n ];\n\n if (options.resume) {\n responseLines.push(`Resumed session: ${options.resume}\\n`);\n }\n\n if (options.allowedTools?.length) {\n responseLines.push(`Available tools: ${options.allowedTools.join(', ')}\\n`);\n }\n\n if (options.mcpServers && Object.keys(options.mcpServers).length > 0) {\n responseLines.push(`MCP servers: ${Object.keys(options.mcpServers).join(', ')}\\n`);\n }\n\n responseLines.push('\\n_Install @anthropic-ai/claude-agent-sdk for real agent execution._\\n');\n\n const fullText = responseLines.join('');\n\n // Emit text_delta events in small chunks for realistic streaming\n const chunkSize = 5; // Characters per chunk\n for (let i = 0; i < fullText.length; i += chunkSize) {\n const chunk = fullText.slice(i, i + chunkSize);\n yield {\n type: 'text_delta',\n delta: chunk,\n };\n await new Promise((resolve) => setTimeout(resolve, 15));\n }\n\n // Also emit the complete text block for message assembly\n yield {\n type: 'text',\n text: fullText,\n };\n\n // Simulate completion\n yield {\n type: 'complete',\n sessionId,\n result: fullText,\n totalCost: 0.001,\n totalTokens: 100,\n };\n }\n\n /**\n * Check if the real SDK is available\n */\n private async checkSdkAvailable(): Promise<boolean> {\n if (this.sdkAvailable !== null) {\n return this.sdkAvailable;\n }\n\n try {\n await import('@anthropic-ai/claude-agent-sdk');\n this.sdkAvailable = true;\n } catch {\n this.sdkAvailable = false;\n }\n\n return this.sdkAvailable;\n }\n\n /**\n * Create a V2-style session for multi-turn conversations\n *\n * @param options - Session configuration options\n * @returns A session object with send/stream/close methods\n */\n async createSession(options: ClaudeAgentOptions = {}): Promise<ClaudeV2Session> {\n const model = options.model ?? this.defaultModel;\n\n try {\n const sdk = await import('@anthropic-ai/claude-agent-sdk');\n if ('unstable_v2_createSession' in sdk) {\n const sessionOptions: any = {\n model,\n allowedTools: options.allowedTools,\n disallowedTools: options.disallowedTools,\n permissionMode: options.permissionMode,\n mcpServers: options.mcpServers,\n agents: options.agents,\n };\n\n if (typeof options.systemPrompt === 'string') {\n sessionOptions.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n append: options.systemPrompt,\n };\n }\n\n const session = (sdk as any).unstable_v2_createSession(sessionOptions);\n return new RealV2Session(session);\n }\n } catch {\n // Fall through to simulated session\n }\n\n return new SimulatedV2Session(model, options);\n }\n\n /**\n * Resume a V2-style session by its ID\n *\n * @param sessionId - The session ID to resume\n * @param options - Session configuration options\n * @returns A session object with send/stream/close methods\n */\n async resumeSession(\n sessionId: string,\n options: ClaudeAgentOptions = {}\n ): Promise<ClaudeV2Session> {\n const model = options.model ?? this.defaultModel;\n\n try {\n const sdk = await import('@anthropic-ai/claude-agent-sdk');\n if ('unstable_v2_resumeSession' in sdk) {\n const session = (sdk as any).unstable_v2_resumeSession(sessionId, {\n model,\n allowedTools: options.allowedTools,\n permissionMode: options.permissionMode,\n });\n\n return new RealV2Session(session);\n }\n } catch {\n // Fall through to simulated session\n }\n\n return new SimulatedV2Session(model, { ...options, resume: sessionId });\n }\n\n /**\n * One-shot prompt using V2 API (convenience method)\n *\n * @param prompt - The prompt to send\n * @param options - Agent configuration options\n * @returns The result text\n */\n async prompt(prompt: string, options: ClaudeAgentOptions = {}): Promise<string> {\n const model = options.model ?? this.defaultModel;\n\n try {\n const sdk = await import('@anthropic-ai/claude-agent-sdk');\n if ('unstable_v2_prompt' in sdk) {\n const result = await (sdk as any).unstable_v2_prompt(prompt, {\n model,\n allowedTools: options.allowedTools,\n permissionMode: options.permissionMode,\n });\n return result.result;\n }\n } catch {\n // Fall through to simulation\n }\n\n // Simulated one-shot\n return `[Simulation] Received: \"${prompt.slice(0, 100)}...\"`;\n }\n}\n\n/**\n * Interface for V2-style sessions\n */\nexport interface ClaudeV2Session {\n /** Send a message to the session */\n send(message: string): Promise<void>;\n\n /** Stream the response from the last send() */\n stream(): AsyncGenerator<ClaudeStreamEvent, void, unknown>;\n\n /** Close the session and release resources */\n close(): Promise<void>;\n\n /** Get the session ID (available after first stream) */\n getSessionId(): string | undefined;\n}\n\n/**\n * Wrapper for real Claude SDK V2 session\n */\nclass RealV2Session implements ClaudeV2Session {\n private sessionId?: string;\n\n constructor(private session: any) {}\n\n async send(message: string): Promise<void> {\n await this.session.send(message);\n }\n\n async *stream(): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n for await (const msg of this.session.stream()) {\n if (msg.session_id) {\n this.sessionId = msg.session_id;\n }\n\n if (msg.type === 'system' && msg.subtype === 'init') {\n yield { type: 'session_init', sessionId: msg.session_id };\n } else if (msg.type === 'assistant' && msg.message) {\n for (const block of msg.message.content) {\n if (block.type === 'text') {\n yield { type: 'text', text: block.text };\n } else if (block.type === 'tool_use') {\n yield {\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n };\n }\n }\n } else if (msg.type === 'user' && msg.message) {\n // Handle user messages which contain tool_result blocks\n for (const block of msg.message.content) {\n if (block.type === 'tool_result') {\n yield {\n type: 'tool_result',\n toolUseId: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n };\n }\n }\n } else if (msg.type === 'result') {\n yield {\n type: 'complete',\n sessionId: msg.session_id,\n result: msg.result,\n totalCost: msg.cost,\n totalTokens: msg.tokens ? msg.tokens.input + msg.tokens.output : undefined,\n };\n }\n }\n }\n\n async close(): Promise<void> {\n if (this.session.close) {\n this.session.close();\n }\n }\n\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n}\n\n/**\n * Simulated V2 session for development/testing\n */\nclass SimulatedV2Session implements ClaudeV2Session {\n private sessionId: string;\n private pendingMessage?: string;\n private messageHistory: string[] = [];\n\n constructor(\n private model: string,\n options: ClaudeAgentOptions\n ) {\n this.sessionId = options.resume ?? `sim_v2_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n }\n\n async send(message: string): Promise<void> {\n this.pendingMessage = message;\n this.messageHistory.push(message);\n }\n\n async *stream(): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n if (!this.pendingMessage) {\n return;\n }\n\n const prompt = this.pendingMessage;\n this.pendingMessage = undefined;\n\n yield { type: 'session_init', sessionId: this.sessionId };\n\n await new Promise((resolve) => setTimeout(resolve, 30));\n\n const response = [\n `**[Simulation Mode - Turn ${this.messageHistory.length}]**\\n\\n`,\n `Message: \"${prompt.slice(0, 100)}${prompt.length > 100 ? '...' : ''}\"\\n`,\n `Model: ${this.model}\\n`,\n ].join('');\n\n yield {\n type: 'text',\n text: response,\n };\n\n yield {\n type: 'complete',\n sessionId: this.sessionId,\n result: response,\n totalCost: 0.0005,\n totalTokens: 50,\n };\n }\n\n async close(): Promise<void> {\n // No-op for simulated session\n }\n\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n}\n\n/**\n * Helper to convert Claude SDK messages to our Message format\n */\nexport function convertClaudeMessage(\n claudeMessage: ClaudeMessage,\n sessionId: string\n): Message | null {\n if (claudeMessage.type !== 'assistant' || !claudeMessage.message) {\n return null;\n }\n\n const content: MessageContent[] = claudeMessage.message.content.map((block) => {\n if (block.type === 'text') {\n return { type: 'text' as const, text: block.text };\n } else if (block.type === 'tool_use') {\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input,\n };\n } else if (block.type === 'tool_result') {\n return {\n type: 'tool_result' as const,\n toolUseId: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n };\n }\n throw new Error(`Unknown content block type: ${(block as any).type}`);\n });\n\n return {\n id: '', // Will be assigned by storage\n sessionId,\n role: 'assistant',\n content,\n createdAt: new Date(),\n };\n}\n\n/**\n * Helper to extract text from assistant messages\n */\nexport function extractTextFromMessage(message: ClaudeMessage): string | null {\n if (message.type !== 'assistant' || !message.message) {\n return null;\n }\n\n return message.message.content\n .filter((block): block is { type: 'text'; text: string } => block.type === 'text')\n .map((block) => block.text)\n .join('');\n}\n\n/**\n * Normalize MCP servers configuration by converting typed auth to headers.\n *\n * This function processes mcpServers from ClaudeAgentOptions, converting\n * any typed `auth` fields to their corresponding Authorization headers.\n *\n * @param mcpServers - MCP servers configuration (may include auth fields)\n * @returns Normalized configuration with auth converted to headers\n *\n * @example\n * ```typescript\n * const normalized = normalizeMcpServers({\n * myapp: {\n * type: 'http',\n * url: 'https://myapp.com/api/mcp',\n * auth: { type: 'bearer', token: 'secret' }\n * }\n * });\n * // Result: { myapp: { type: 'http', url: '...', headers: { Authorization: 'Bearer secret' } } }\n * ```\n */\nexport function normalizeMcpServers(\n mcpServers: ClaudeAgentOptions['mcpServers']\n): ClaudeAgentOptions['mcpServers'] {\n if (!mcpServers) return mcpServers;\n\n return Object.fromEntries(\n Object.entries(mcpServers).map(([name, config]) => {\n // If no auth field, return as-is\n if (!config.auth) {\n return [name, config];\n }\n\n // Convert auth to headers\n const authHeaders = mcpAuthToHeaders(config.auth);\n\n // Merge with existing headers and remove auth field\n const { auth: _auth, ...rest } = config;\n return [name, {\n ...rest,\n headers: {\n ...authHeaders,\n ...config.headers, // Explicit headers take precedence\n },\n }];\n })\n );\n}\n\n// Export singleton client instance\nexport const claudeClient = new ClaudeSdkClient();\n","/**\n * Gemini CLI Integration Module\n *\n * This module provides the integration layer with Google's Gemini CLI.\n * It spawns the CLI as a subprocess and normalizes streaming events to\n * the same format as the Claude SDK for harness compatibility.\n *\n * @see https://geminicli.com/docs/\n * @see https://github.com/google-gemini/gemini-cli\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport type { ClaudeStreamEvent, ClaudeAgentOptions } from './claude-sdk.js';\n\n/**\n * Options for Gemini CLI execution\n */\nexport interface GeminiCliOptions {\n /** Gemini model to use (e.g., 'gemini-2.5-flash', 'gemini-2.5-pro') */\n model?: string;\n\n /** API key for Gemini (defaults to GEMINI_API_KEY env var) */\n apiKey?: string;\n\n /** System prompt or instructions */\n systemPrompt?: string;\n\n /** Maximum number of turns */\n maxTurns?: number;\n\n /** Working directory for the CLI */\n cwd?: string;\n\n /** Environment variables to pass to the CLI */\n envVars?: Record<string, string>;\n\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n\n /** Enable sandbox mode (safer execution) */\n sandbox?: boolean;\n\n /** Yolo mode - auto-approve all tool calls */\n yolo?: boolean;\n\n /** Debug mode - verbose output */\n debug?: boolean;\n\n /**\n * Resume a previous session.\n * - If true, resumes the most recent session\n * - If a string/number, resumes the specific session by ID\n */\n resume?: boolean | string | number;\n}\n\n/**\n * Raw event types from Gemini CLI stream-json output\n */\ninterface GeminiRawEvent {\n type: string;\n subtype?: string;\n sessionId?: string;\n session_id?: string; // Gemini might use snake_case\n text?: string;\n delta?: string;\n name?: string;\n id?: string;\n input?: unknown;\n toolUseId?: string;\n tool_use_id?: string; // Gemini might use snake_case\n content?: unknown;\n isError?: boolean;\n is_error?: boolean; // Gemini might use snake_case\n totalTokens?: number;\n total_tokens?: number; // Gemini might use snake_case\n error?: string;\n message?: string;\n}\n\n/**\n * Client for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * const client = new GeminiCliClient();\n *\n * for await (const event of client.query('Explain this code')) {\n * console.log(event);\n * }\n * ```\n */\nexport class GeminiCliClient {\n private defaultModel: string;\n\n constructor(options: { apiKey?: string; defaultModel?: string } = {}) {\n this.defaultModel = options.defaultModel ?? 'gemini-2.5-flash';\n }\n\n /**\n * Check if Gemini CLI is available on the system\n */\n async checkCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('gemini', ['--version'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n proc.on('error', () => resolve(false));\n proc.on('close', (code) => resolve(code === 0));\n\n // Timeout after 5 seconds\n setTimeout(() => {\n proc.kill();\n resolve(false);\n }, 5000);\n });\n }\n\n /**\n * Execute a query using Gemini CLI and stream responses\n *\n * @param prompt - The user prompt to send\n * @param options - Gemini CLI options\n * @yields ClaudeStreamEvent for each response chunk (normalized format)\n */\n async *query(\n prompt: string,\n options: GeminiCliOptions = {}\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n const model = options.model ?? this.defaultModel;\n\n // Check if CLI is available\n if (!(await this.checkCliAvailable())) {\n yield {\n type: 'error',\n error: 'Gemini CLI is not installed. Install with: npm install -g @anthropic-ai/gemini-cli',\n };\n return;\n }\n\n // Build CLI arguments\n const args = this.buildCliArgs(prompt, { ...options, model });\n\n // Build environment - filter out undefined values from process.env\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n env[key] = value;\n }\n }\n // Merge in options.envVars\n if (options.envVars) {\n Object.assign(env, options.envVars);\n }\n\n if (options.apiKey) {\n env.GEMINI_API_KEY = options.apiKey;\n }\n\n // Spawn the CLI process\n const proc = spawn('gemini', args, {\n cwd: options.cwd ?? process.cwd(),\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: true,\n });\n\n // Handle abort signal\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n proc.kill('SIGTERM');\n });\n }\n\n // Yield events from the streaming output\n yield* this.streamEvents(proc, options.signal);\n }\n\n /**\n * Build CLI arguments for gemini command\n */\n private buildCliArgs(prompt: string, options: GeminiCliOptions): string[] {\n const args: string[] = [];\n\n // Resume previous session if specified\n // Must come before -p flag\n if (options.resume !== undefined && options.resume !== false) {\n if (options.resume === true) {\n // Resume most recent session\n args.push('--resume');\n } else {\n // Resume specific session by ID\n args.push('--resume', String(options.resume));\n }\n }\n\n // Non-interactive mode with prompt\n args.push('-p', prompt);\n\n // Streaming JSON output format\n args.push('--output-format', 'stream-json');\n\n // Model selection\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Yolo mode (auto-approve)\n if (options.yolo) {\n args.push('--yolo');\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n return args;\n }\n\n /**\n * Stream and parse events from the CLI process\n */\n private async *streamEvents(\n proc: ChildProcess,\n signal?: AbortSignal\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n // Generate a fallback session ID - will be replaced by actual Gemini session ID if provided\n let sessionId = `gemini_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n let sessionInitEmitted = false;\n\n // Buffer for incomplete lines\n let buffer = '';\n let stderrContent = '';\n\n // Collect stderr for error reporting\n proc.stderr?.on('data', (chunk: Buffer) => {\n stderrContent += chunk.toString();\n });\n\n // Create an async iterator from stdout\n const stdout = proc.stdout;\n if (!stdout) {\n yield { type: 'error', error: 'Failed to get stdout from Gemini CLI process' };\n return;\n }\n\n // Process stdout line by line\n for await (const chunk of stdout) {\n if (signal?.aborted) {\n proc.kill('SIGTERM');\n return;\n }\n\n buffer += chunk.toString();\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const { event, extractedSessionId } = this.parseLineWithSessionId(line, sessionId);\n\n // Update session ID if Gemini provides one\n if (extractedSessionId) {\n sessionId = extractedSessionId;\n }\n\n // Emit session_init on first event or when we get a session ID\n if (!sessionInitEmitted && event) {\n yield {\n type: 'session_init',\n sessionId,\n };\n sessionInitEmitted = true;\n }\n\n if (event) {\n yield event;\n }\n }\n }\n\n // Process any remaining content in buffer\n if (buffer.trim()) {\n const { event, extractedSessionId } = this.parseLineWithSessionId(buffer, sessionId);\n\n if (extractedSessionId) {\n sessionId = extractedSessionId;\n }\n\n // Emit session_init if we haven't yet\n if (!sessionInitEmitted && event) {\n yield {\n type: 'session_init',\n sessionId,\n };\n sessionInitEmitted = true;\n }\n\n if (event) {\n yield event;\n }\n }\n\n // If we never emitted session_init, emit it now with what we have\n if (!sessionInitEmitted) {\n yield {\n type: 'session_init',\n sessionId,\n };\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number | null>((resolve) => {\n proc.on('close', resolve);\n });\n\n // Handle non-zero exit\n if (exitCode !== 0 && exitCode !== null) {\n const errorMsg = stderrContent.trim() || `Gemini CLI exited with code ${exitCode}`;\n yield { type: 'error', error: errorMsg };\n }\n }\n\n /**\n * Parse a single line of JSON output and normalize to ClaudeStreamEvent\n * Also extracts session ID if present in the event\n */\n private parseLineWithSessionId(\n line: string,\n currentSessionId: string\n ): { event: ClaudeStreamEvent | null; extractedSessionId: string | null } {\n const trimmed = line.trim();\n if (!trimmed) return { event: null, extractedSessionId: null };\n\n try {\n const raw = JSON.parse(trimmed) as GeminiRawEvent;\n\n // Extract session ID from the raw event if present (handle both camelCase and snake_case)\n const extractedSessionId = raw.sessionId ?? raw.session_id ?? null;\n\n // Use extracted session ID for this event, or fall back to current\n const sessionIdToUse = extractedSessionId ?? currentSessionId;\n const event = this.normalizeEvent(raw, sessionIdToUse);\n\n return { event, extractedSessionId };\n } catch {\n // Not valid JSON, might be plain text output\n // Treat as text delta\n if (trimmed) {\n return {\n event: {\n type: 'text_delta',\n delta: trimmed,\n sessionId: currentSessionId,\n },\n extractedSessionId: null,\n };\n }\n return { event: null, extractedSessionId: null };\n }\n }\n\n /**\n * Normalize Gemini CLI events to ClaudeStreamEvent format\n */\n private normalizeEvent(raw: GeminiRawEvent, sessionId: string): ClaudeStreamEvent | null {\n // Handle system/init events\n if (raw.type === 'system' && raw.subtype === 'init') {\n return {\n type: 'session_init',\n sessionId: raw.sessionId ?? sessionId,\n };\n }\n\n // Handle text content\n if (raw.type === 'content' || raw.type === 'text') {\n if (raw.delta) {\n return {\n type: 'text_delta',\n delta: raw.delta,\n sessionId,\n };\n }\n if (raw.text) {\n return {\n type: 'text',\n text: raw.text,\n sessionId,\n };\n }\n }\n\n // Handle text delta directly\n if (raw.type === 'text_delta') {\n return {\n type: 'text_delta',\n delta: raw.delta ?? raw.text ?? '',\n sessionId,\n };\n }\n\n // Handle thinking/reasoning\n if (raw.type === 'thinking' || raw.type === 'thinking_delta') {\n return {\n type: 'thinking_delta',\n delta: raw.delta ?? raw.text ?? '',\n sessionId,\n };\n }\n\n // Handle tool calls\n if (raw.type === 'tool_call' || raw.type === 'tool_use') {\n return {\n type: 'tool_use',\n id: raw.id ?? `tool_${Date.now()}`,\n name: raw.name ?? 'unknown',\n input: raw.input,\n sessionId,\n };\n }\n\n // Handle tool results\n if (raw.type === 'tool_result') {\n return {\n type: 'tool_result',\n toolUseId: raw.toolUseId ?? raw.tool_use_id ?? raw.id ?? '',\n content: raw.content,\n isError: raw.isError ?? raw.is_error,\n sessionId,\n };\n }\n\n // Handle completion\n if (raw.type === 'done' || raw.type === 'complete' || raw.type === 'end') {\n return {\n type: 'complete',\n sessionId,\n totalTokens: raw.totalTokens ?? raw.total_tokens,\n };\n }\n\n // Handle errors\n if (raw.type === 'error') {\n return {\n type: 'error',\n error: raw.error ?? raw.message ?? 'Unknown error',\n sessionId,\n };\n }\n\n // Unknown event type - log and skip\n console.debug('[GeminiCli] Unknown event type:', raw.type, raw);\n return null;\n }\n}\n\n/**\n * Map ClaudeAgentOptions to GeminiCliOptions\n */\nexport function mapClaudeOptionsToGemini(options: ClaudeAgentOptions): GeminiCliOptions {\n const geminiOptions: GeminiCliOptions = {};\n\n // Map model\n if (options.model) {\n // If it's a Claude model, use default Gemini model\n if (options.model.includes('claude')) {\n geminiOptions.model = 'gemini-2.5-flash';\n } else {\n geminiOptions.model = options.model;\n }\n }\n\n // Map API key\n geminiOptions.apiKey = options.apiKey;\n\n // Map system prompt\n if (typeof options.systemPrompt === 'string') {\n geminiOptions.systemPrompt = options.systemPrompt;\n } else if (options.systemPrompt?.append) {\n geminiOptions.systemPrompt = options.systemPrompt.append;\n }\n\n // Map max turns\n geminiOptions.maxTurns = options.maxTurns;\n\n // Map environment variables\n geminiOptions.envVars = options.envVars;\n\n // Map permission mode to yolo\n if (options.permissionMode === 'bypassPermissions') {\n geminiOptions.yolo = true;\n }\n\n // Map session resume\n // ClaudeAgentOptions uses 'resume' as a string (session ID)\n if (options.resume) {\n geminiOptions.resume = options.resume;\n }\n\n return geminiOptions;\n}\n\n/**\n * Create a CustomExecutor that uses Gemini CLI\n */\nexport function createGeminiExecutor(\n clientOptions: { apiKey?: string; defaultModel?: string } = {}\n): (prompt: string, options: ClaudeAgentOptions) => AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n const client = new GeminiCliClient(clientOptions);\n\n return async function* (prompt: string, options: ClaudeAgentOptions) {\n const geminiOptions = mapClaudeOptionsToGemini(options);\n\n // Pass through signal if present\n if (options.signal) {\n geminiOptions.signal = options.signal;\n }\n\n yield* client.query(prompt, geminiOptions);\n };\n}\n","/**\n * Agent Backend Abstraction\n *\n * This module provides a unified interface for different agent backends\n * (Claude SDK, Gemini CLI, etc.) and a factory function to create executors.\n */\n\nimport type { ClaudeAgentOptions, ClaudeStreamEvent } from './claude-sdk.js';\nimport { ClaudeSdkClient } from './claude-sdk.js';\nimport { GeminiCliClient, mapClaudeOptionsToGemini } from './gemini-cli.js';\nimport type { CustomExecutor } from './harness.js';\n\n/**\n * Supported agent backends\n */\nexport type AgentBackend = 'claude' | 'gemini';\n\n/**\n * Configuration for creating a backend executor\n */\nexport interface BackendConfig {\n /** Which backend to use */\n backend: AgentBackend;\n\n /** API key for the backend (Claude or Gemini) */\n apiKey?: string;\n\n /** Default model to use */\n model?: string;\n}\n\n/**\n * Default models for each backend\n */\nexport const DEFAULT_MODELS: Record<AgentBackend, string> = {\n claude: 'claude-sonnet-4-5-20250514',\n gemini: 'gemini-2.5-flash',\n};\n\n/**\n * Available models for each backend\n */\nexport const AVAILABLE_MODELS: Record<AgentBackend, string[]> = {\n claude: [\n 'claude-sonnet-4-5-20250514',\n 'claude-opus-4-5-20251101',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-haiku-20241022',\n ],\n gemini: [\n 'gemini-2.5-flash',\n 'gemini-2.5-pro',\n 'gemini-2.0-flash',\n 'gemini-1.5-pro',\n 'gemini-1.5-flash',\n ],\n};\n\n/**\n * Create a CustomExecutor for the specified backend\n *\n * @param config - Backend configuration\n * @returns A CustomExecutor function compatible with AgentHarness\n *\n * @example\n * ```typescript\n * // Create a Gemini executor\n * const executor = createBackendExecutor({\n * backend: 'gemini',\n * apiKey: process.env.GEMINI_API_KEY,\n * });\n *\n * // Use with AgentHarness\n * const harness = new AgentHarness({\n * name: 'my-agent',\n * storage: new MemoryStorage(),\n * customExecutor: executor,\n * });\n * ```\n */\nexport function createBackendExecutor(config: BackendConfig): CustomExecutor {\n const { backend, apiKey, model } = config;\n\n switch (backend) {\n case 'gemini':\n return createGeminiBackendExecutor({ apiKey, model });\n\n case 'claude':\n default:\n return createClaudeBackendExecutor({ apiKey, model });\n }\n}\n\n/**\n * Create a Claude SDK executor\n */\nfunction createClaudeBackendExecutor(options: {\n apiKey?: string;\n model?: string;\n}): CustomExecutor {\n const client = new ClaudeSdkClient({\n apiKey: options.apiKey,\n defaultModel: options.model ?? DEFAULT_MODELS.claude,\n });\n\n return async function* (\n prompt: string,\n queryOptions: ClaudeAgentOptions\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n yield* client.query(prompt, queryOptions);\n };\n}\n\n/**\n * Create a Gemini CLI executor\n */\nfunction createGeminiBackendExecutor(options: {\n apiKey?: string;\n model?: string;\n}): CustomExecutor {\n const client = new GeminiCliClient({\n apiKey: options.apiKey,\n defaultModel: options.model ?? DEFAULT_MODELS.gemini,\n });\n\n return async function* (\n prompt: string,\n queryOptions: ClaudeAgentOptions\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n const geminiOptions = mapClaudeOptionsToGemini(queryOptions);\n\n // Pass through signal if present\n if (queryOptions.signal) {\n geminiOptions.signal = queryOptions.signal;\n }\n\n yield* client.query(prompt, geminiOptions);\n };\n}\n\n/**\n * Get the API key environment variable name for a backend\n */\nexport function getApiKeyEnvVar(backend: AgentBackend): string {\n switch (backend) {\n case 'gemini':\n return 'GEMINI_API_KEY';\n case 'claude':\n default:\n return 'ANTHROPIC_API_KEY';\n }\n}\n\n/**\n * Validate that a model is available for a given backend\n */\nexport function isValidModel(backend: AgentBackend, model: string): boolean {\n return AVAILABLE_MODELS[backend]?.includes(model) ?? false;\n}\n\n/**\n * Get the default model for a backend\n */\nexport function getDefaultModel(backend: AgentBackend): string {\n return DEFAULT_MODELS[backend] ?? DEFAULT_MODELS.claude;\n}\n","/**\n * Sandbox Logger\n *\n * Collects logs during sandbox/agent execution for persistence and display.\n * Logs are accumulated in memory during the request and can be retrieved\n * for storage in session metadata.\n */\n\nexport type SandboxLogLevel = 'info' | 'warn' | 'error' | 'debug';\nexport type SandboxLogCategory =\n | 'setup'\n | 'skills'\n | 'execution'\n | 'process'\n | 'startup'\n | 'backup'\n | 'restore';\n\nexport interface SandboxLogEntry {\n timestamp: string;\n level: SandboxLogLevel;\n category: SandboxLogCategory;\n message: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Callback type for real-time log streaming\n */\nexport type SandboxLogCallback = (entry: SandboxLogEntry) => void;\n\n/**\n * Logger that collects sandbox execution logs for persistence.\n * Supports real-time streaming via callback and console output.\n */\nexport class SandboxLogger {\n private logs: SandboxLogEntry[] = [];\n private callback?: SandboxLogCallback;\n private consoleEnabled: boolean;\n\n constructor(options?: { callback?: SandboxLogCallback; consoleEnabled?: boolean }) {\n this.callback = options?.callback;\n this.consoleEnabled = options?.consoleEnabled ?? true;\n }\n\n /**\n * Set the callback for real-time log streaming\n */\n setCallback(callback: SandboxLogCallback): void {\n this.callback = callback;\n }\n\n /**\n * Log an info message\n */\n info(category: SandboxLogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('info', category, message, data);\n }\n\n /**\n * Log a warning message\n */\n warn(category: SandboxLogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('warn', category, message, data);\n }\n\n /**\n * Log an error message\n */\n error(category: SandboxLogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('error', category, message, data);\n }\n\n /**\n * Log a debug message\n */\n debug(category: SandboxLogCategory, message: string, data?: Record<string, unknown>): void {\n this.log('debug', category, message, data);\n }\n\n /**\n * Internal log method\n */\n private log(\n level: SandboxLogLevel,\n category: SandboxLogCategory,\n message: string,\n data?: Record<string, unknown>\n ): void {\n const entry: SandboxLogEntry = {\n timestamp: new Date().toISOString(),\n level,\n category,\n message,\n ...(data && { data }),\n };\n\n this.logs.push(entry);\n\n // Stream to callback if set\n if (this.callback) {\n this.callback(entry);\n }\n\n // Also log to console for real-time visibility\n if (this.consoleEnabled) {\n const prefix = `[SANDBOX:${category.toUpperCase()}]`;\n const consoleMethod =\n level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n\n if (data) {\n consoleMethod(prefix, message, data);\n } else {\n consoleMethod(prefix, message);\n }\n }\n }\n\n /**\n * Get all accumulated logs\n */\n getLogs(): SandboxLogEntry[] {\n return [...this.logs];\n }\n\n /**\n * Clear all logs\n */\n clear(): void {\n this.logs = [];\n }\n\n /**\n * Get the number of logs\n */\n get length(): number {\n return this.logs.length;\n }\n\n /**\n * Check if there are any error logs\n */\n hasErrors(): boolean {\n return this.logs.some((log) => log.level === 'error');\n }\n\n /**\n * Get only error logs\n */\n getErrors(): SandboxLogEntry[] {\n return this.logs.filter((log) => log.level === 'error');\n }\n\n /**\n * Check if there are any warning logs\n */\n hasWarnings(): boolean {\n return this.logs.some((log) => log.level === 'warn');\n }\n\n /**\n * Get only warning logs\n */\n getWarnings(): SandboxLogEntry[] {\n return this.logs.filter((log) => log.level === 'warn');\n }\n}\n\n/**\n * Create a new sandbox logger instance\n */\nexport function createSandboxLogger(options?: {\n callback?: SandboxLogCallback;\n consoleEnabled?: boolean;\n}): SandboxLogger {\n return new SandboxLogger(options);\n}\n","import type {\n Session,\n SessionId,\n Message,\n MessageContent,\n AgentConfig,\n AgentHooks,\n CreateSessionOptions,\n SendMessageOptions,\n ResumeSessionOptions,\n StreamEvent,\n SessionStatus,\n TextContent,\n ToolUseContent,\n ToolResultContent,\n SandboxLogEntry,\n} from '../types/index.js';\nimport type { SessionStorage } from '../storage/interface.js';\nimport type { CredentialManager } from '../credentials/index.js';\nimport type { SkillManager } from '../skills/manager.js';\nimport { SessionManager } from '../session/manager.js';\nimport { ClaudeSdkClient, type ClaudeAgentOptions, type ClaudeStreamEvent } from './claude-sdk.js';\nimport { type AgentBackend, createBackendExecutor } from './backend.js';\nimport { SandboxLogger } from '../utils/sandbox-logger.js';\n\n/**\n * Custom executor function type for running agent queries.\n * This allows the cloud layer to provide a custom execution strategy,\n * such as running queries inside a Vercel Sandbox instead of locally.\n */\nexport type CustomExecutor = (\n prompt: string,\n options: ClaudeAgentOptions\n) => AsyncGenerator<ClaudeStreamEvent, void, unknown>;\n\n/**\n * Configuration for creating an AgentHarness\n */\nexport interface AgentHarnessConfig extends AgentConfig {\n storage: SessionStorage;\n\n /**\n * Optional credential manager for per-session API keys\n */\n credentialManager?: CredentialManager;\n\n /**\n * Optional skill manager for loading agent skills at runtime\n */\n skillManager?: SkillManager;\n\n /**\n * Default API key (overrides ANTHROPIC_API_KEY env var)\n */\n apiKey?: string;\n\n /**\n * Optional custom executor for running agent queries.\n * When provided, this function will be called instead of the built-in\n * ClaudeSdkClient. This is useful for running agents in sandboxed\n * environments like Vercel Sandbox.\n */\n customExecutor?: CustomExecutor;\n\n /**\n * Agent backend to use for execution.\n * Defaults to 'claude' if not specified.\n * Only used if customExecutor is not provided.\n */\n backend?: AgentBackend;\n}\n\n/**\n * Result of stopping a session execution\n */\nexport interface StopSessionResult {\n /** Whether the session was successfully stopped */\n stopped: boolean;\n /** The session ID that was stopped */\n sessionId: SessionId;\n /** Partial text content that was saved (if any) */\n partialContent?: string;\n}\n\n/**\n * Active session wrapper with send/stream capabilities\n */\nexport interface ActiveSession {\n id: SessionId;\n session: Session;\n sdkSessionId?: string;\n\n /**\n * Send a message and stream the response\n */\n send(\n prompt: string,\n options?: SendMessageOptions\n ): AsyncGenerator<StreamEvent, void, unknown>;\n\n /**\n * Get current session details\n */\n getSession(): Promise<Session>;\n\n /**\n * Get all messages in this session\n */\n getMessages(): Promise<Message[]>;\n\n /**\n * Close the session\n */\n close(): Promise<void>;\n\n /**\n * Stop the current execution.\n * This will abort any running agent query and save partial content.\n * The session can still be resumed with follow-up messages after stopping.\n */\n stop(): Promise<StopSessionResult>;\n}\n\n/**\n * AgentHarness wraps the Claude Agent SDK to provide:\n * - Session persistence and management\n * - Message history storage\n * - Resume and fork capabilities\n * - Streaming with events\n *\n * @example\n * ```typescript\n * const agent = new AgentHarness({\n * name: 'code-assistant',\n * model: 'claude-sonnet-4-5',\n * allowedTools: ['Read', 'Write', 'Edit', 'Bash'],\n * storage: new MemoryStorage(),\n * });\n *\n * const session = await agent.createSession();\n * for await (const event of session.send('Help me debug auth.py')) {\n * console.log(event);\n * }\n * ```\n */\nexport class AgentHarness {\n readonly name: string;\n private config: AgentHarnessConfig;\n private sessionManager: SessionManager;\n private hooks: AgentHooks;\n private client: ClaudeSdkClient;\n private initialized = false;\n private sessionApiKeys: Map<SessionId, string> = new Map();\n /** Tracks the materialized skill directory for each session */\n private sessionSkillDirs: Map<SessionId, string> = new Map();\n /** Tracks active executions by session ID for stop/interrupt capability */\n private activeExecutions: Map<SessionId, AbortController> = new Map();\n\n constructor(config: AgentHarnessConfig) {\n this.name = config.name;\n this.config = config;\n this.sessionManager = new SessionManager(config.storage);\n this.hooks = config.hooks ?? {};\n this.client = new ClaudeSdkClient({\n defaultModel: config.model ?? 'claude-sonnet-4-5-20250514',\n apiKey: config.apiKey,\n });\n }\n\n /**\n * Initialize the agent harness and storage\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n await this.sessionManager.initialize();\n this.initialized = true;\n }\n\n /**\n * Close the agent harness and storage\n */\n async close(): Promise<void> {\n await this.sessionManager.close();\n this.initialized = false;\n }\n\n /**\n * Create a new session and return an active session wrapper\n */\n async createSession(options: CreateSessionOptions = {}): Promise<ActiveSession> {\n await this.ensureInitialized();\n\n // Resolve API key for this session\n let sessionApiKey: string | undefined;\n\n if (options.credentialId && this.config.credentialManager) {\n // Get decrypted key from credential manager\n const decryptedKey = await this.config.credentialManager.getDecryptedKey(\n options.credentialId\n );\n if (decryptedKey) {\n sessionApiKey = decryptedKey;\n }\n } else if (options.apiKey) {\n // Use provided API key directly\n sessionApiKey = options.apiKey;\n }\n\n // Create session record\n const session = await this.sessionManager.createSession(\n this.config.name,\n options\n );\n\n // Store API key for this session (in memory, not persisted)\n if (sessionApiKey) {\n this.sessionApiKeys.set(session.id, sessionApiKey);\n }\n\n // Materialize skills for this session if skill manager and skills are provided\n if (this.config.skillManager && this.config.skills && this.config.skills.length > 0) {\n try {\n const skillsDir = await this.config.skillManager.materializeSkillsForSession(\n this.config.skills,\n session.id\n );\n if (skillsDir) {\n this.sessionSkillDirs.set(session.id, skillsDir);\n }\n } catch (error) {\n console.warn('Failed to materialize skills for session:', error);\n // Don't fail session creation if skills fail to materialize\n }\n }\n\n // Call hook\n if (this.hooks.onSessionStart) {\n await this.hooks.onSessionStart(session);\n }\n\n return this.createActiveSession(session);\n }\n\n /**\n * Resume an existing session\n */\n async resumeSession(\n sessionId: SessionId,\n options: ResumeSessionOptions = {}\n ): Promise<ActiveSession> {\n await this.ensureInitialized();\n\n let session: Session | null;\n\n if (options.forkSession) {\n // Create a forked session\n session = await this.sessionManager.forkSession(sessionId);\n } else {\n // Get existing session\n session = await this.sessionManager.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Reactivate if completed or stopped (both can be resumed)\n if (session.status === 'completed' || session.status === 'stopped') {\n session = await this.sessionManager.updateSession(sessionId, {\n status: 'active',\n });\n }\n }\n\n return this.createActiveSession(session);\n }\n\n /**\n * Fork an existing session (creates a new session from a checkpoint)\n */\n async forkSession(sessionId: SessionId): Promise<ActiveSession> {\n return this.resumeSession(sessionId, { forkSession: true });\n }\n\n /**\n * Stop a currently running session execution.\n * This will abort the agent query gracefully and save any partial content.\n * The session can still be resumed with follow-up messages after stopping.\n *\n * @param sessionId - The ID of the session to stop\n * @returns Result indicating whether the session was stopped and any partial content saved\n */\n async stopSession(sessionId: SessionId): Promise<StopSessionResult> {\n const controller = this.activeExecutions.get(sessionId);\n\n if (!controller) {\n // No active execution for this session\n return {\n stopped: false,\n sessionId,\n };\n }\n\n // Abort the execution - the send() generator will handle cleanup\n controller.abort();\n\n return {\n stopped: true,\n sessionId,\n };\n }\n\n /**\n * Check if a session is currently running (has an active execution)\n *\n * @param sessionId - The ID of the session to check\n * @returns Whether the session has an active execution\n */\n isSessionRunning(sessionId: SessionId): boolean {\n return this.activeExecutions.has(sessionId);\n }\n\n /**\n * Get session details by ID\n */\n async getSession(sessionId: SessionId): Promise<Session | null> {\n await this.ensureInitialized();\n return this.sessionManager.getSession(sessionId);\n }\n\n /**\n * List all sessions for this agent\n */\n async listSessions(options?: {\n status?: SessionStatus;\n limit?: number;\n offset?: number;\n }) {\n await this.ensureInitialized();\n return this.sessionManager.listSessions({\n ...options,\n agentName: this.config.name,\n });\n }\n\n /**\n * Get the session manager for advanced operations\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n\n private async ensureInitialized(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n }\n\n private createActiveSession(session: Session): ActiveSession {\n const self = this;\n\n return {\n id: session.id,\n session,\n sdkSessionId: session.sdkSessionId,\n\n async *send(\n prompt: string,\n options: SendMessageOptions = {}\n ): AsyncGenerator<StreamEvent, void, unknown> {\n // Create AbortController for this execution\n const controller = new AbortController();\n self.activeExecutions.set(session.id, controller);\n\n // Support external signal (from HTTP request abort or user stop)\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n // Track partial text content for saving on stop\n let partialTextContent = '';\n\n // Collect sandbox logs during execution\n const sandboxLogs: SandboxLogEntry[] = [];\n const logQueue: SandboxLogEntry[] = [];\n\n // Create logger that queues logs for streaming\n const logger = new SandboxLogger({\n consoleEnabled: true,\n callback: (entry) => {\n sandboxLogs.push(entry);\n logQueue.push(entry);\n },\n });\n\n // Helper to yield queued logs\n const yieldQueuedLogs = async function* (): AsyncGenerator<StreamEvent, void, unknown> {\n while (logQueue.length > 0) {\n const entry = logQueue.shift()!;\n yield { type: 'sandbox_log', entry };\n }\n };\n\n // Log session start\n logger.info('execution', `Starting execution for session ${session.id}`);\n\n // Save user message\n const userMessage: Omit<Message, 'id' | 'sessionId' | 'createdAt'> = {\n role: 'user',\n content: [{ type: 'text', text: prompt }],\n metadata: options.metadata,\n };\n const savedMessages = await self.sessionManager.saveMessages(\n session.id,\n [userMessage]\n );\n const savedUserMessage = savedMessages[0];\n\n // Call message hook\n if (self.hooks.onMessage && savedUserMessage) {\n await self.hooks.onMessage(savedUserMessage);\n }\n\n // Yield session start event\n yield {\n type: 'session_start',\n sessionId: session.id,\n sdkSessionId: session.sdkSessionId ?? '',\n };\n\n // Yield initial log\n yield* yieldQueuedLogs();\n\n // Execute the actual Claude Agent SDK query via ClaudeSdkClient\n const assistantContent: MessageContent[] = [];\n let wasAborted = false;\n\n try {\n // Execute via ClaudeSdkClient (uses real SDK or falls back to simulation)\n logger.info('execution', 'Starting Claude Agent SDK query');\n const response = self.executeAgentQuery(\n session,\n prompt,\n options,\n controller.signal,\n logger\n );\n\n for await (const event of response) {\n // Yield any queued logs first\n yield* yieldQueuedLogs();\n\n // Check if aborted before processing each event\n if (controller.signal.aborted) {\n wasAborted = true;\n break;\n }\n\n // Handle text_delta events for real-time streaming\n if (event.type === 'text_delta' && event.delta) {\n partialTextContent += event.delta;\n yield {\n type: 'text_delta',\n delta: event.delta,\n };\n } else if (event.type === 'thinking_delta' && event.delta) {\n // Handle thinking_delta events for extended thinking display\n // Note: thinking content is not saved to partial content\n yield {\n type: 'thinking_delta',\n delta: event.delta,\n };\n } else if (event.type === 'text') {\n // Complete text block - used for final message assembly\n const textContent: TextContent = {\n type: 'text',\n text: event.text,\n };\n assistantContent.push(textContent);\n yield {\n type: 'message',\n message: {\n id: '',\n sessionId: session.id,\n role: 'assistant',\n content: [textContent],\n createdAt: new Date(),\n },\n };\n } else if (event.type === 'tool_use') {\n logger.debug('execution', `Tool use: ${event.name}`, { toolId: event.id });\n const toolContent: ToolUseContent = {\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n };\n assistantContent.push(toolContent);\n yield {\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n };\n\n // Yield log for tool use\n yield* yieldQueuedLogs();\n\n // Call tool hook\n if (self.hooks.onToolUse) {\n await self.hooks.onToolUse(event.name, event.input, null);\n }\n } else if (event.type === 'tool_result') {\n const isError = event.isError ?? false;\n if (isError) {\n logger.warn('execution', `Tool result error for ${event.toolUseId}`);\n }\n const resultContent: ToolResultContent = {\n type: 'tool_result',\n toolUseId: event.toolUseId,\n content: event.content,\n isError: event.isError,\n };\n assistantContent.push(resultContent);\n yield {\n type: 'tool_result',\n toolUseId: event.toolUseId,\n content: event.content,\n isError: event.isError,\n };\n }\n }\n\n // Handle abort - save partial content and update status\n if (wasAborted || controller.signal.aborted) {\n logger.info('execution', 'Execution stopped by user');\n\n // Save partial content if we have any\n if (partialTextContent) {\n const partialMessage: TextContent = {\n type: 'text',\n text: partialTextContent,\n };\n assistantContent.push(partialMessage);\n\n await self.sessionManager.saveMessages(session.id, [\n {\n role: 'assistant',\n content: [partialMessage],\n metadata: { interrupted: true, partialContent: true },\n },\n ]);\n }\n\n // Update session status to stopped and save logs\n await self.sessionManager.updateSession(session.id, {\n status: 'stopped',\n metadata: {\n ...session.metadata,\n stoppedAt: new Date().toISOString(),\n stoppedReason: 'user_requested',\n sandboxLogs: sandboxLogs,\n },\n });\n\n // Yield remaining logs\n yield* yieldQueuedLogs();\n\n // Yield session stopped event\n yield {\n type: 'session_stopped',\n sessionId: session.id,\n reason: 'user_requested',\n partialContent: partialTextContent || undefined,\n };\n\n return;\n }\n\n // Log completion\n logger.info('execution', 'Execution completed successfully');\n\n // Emit turn_complete immediately - this signals to clients that Claude\n // has finished generating before we do cleanup (message saving, status\n // updates, sandbox zip construction, etc.)\n yield {\n type: 'turn_complete',\n sessionId: session.id,\n };\n\n // Save assistant message (normal completion)\n if (assistantContent.length > 0) {\n const savedAssistantMessages = await self.sessionManager.saveMessages(\n session.id,\n [\n {\n role: 'assistant',\n content: assistantContent,\n },\n ]\n );\n const savedAssistantMessage = savedAssistantMessages[0];\n\n if (self.hooks.onMessage && savedAssistantMessage) {\n await self.hooks.onMessage(savedAssistantMessage);\n }\n }\n\n // Update session status and save logs\n await self.sessionManager.updateSession(session.id, {\n status: 'completed',\n metadata: {\n ...session.metadata,\n sandboxLogs: sandboxLogs,\n },\n });\n\n // Yield remaining logs\n yield* yieldQueuedLogs();\n\n // Yield session end event\n yield {\n type: 'session_end',\n sessionId: session.id,\n status: 'completed',\n };\n\n // Call session end hook\n if (self.hooks.onSessionEnd) {\n const updatedSession = await self.sessionManager.getSession(session.id);\n if (updatedSession) {\n await self.hooks.onSessionEnd(updatedSession);\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Check if this was an abort error (different from user-initiated stop)\n const isAbortError = error instanceof Error && error.name === 'AbortError';\n\n if (isAbortError || controller.signal.aborted) {\n logger.info('execution', 'Execution aborted');\n\n // Handle as a stop, not an error\n if (partialTextContent) {\n await self.sessionManager.saveMessages(session.id, [\n {\n role: 'assistant',\n content: [{ type: 'text', text: partialTextContent }],\n metadata: { interrupted: true, partialContent: true },\n },\n ]);\n }\n\n await self.sessionManager.updateSession(session.id, {\n status: 'stopped',\n metadata: {\n ...session.metadata,\n stoppedAt: new Date().toISOString(),\n stoppedReason: 'user_requested',\n sandboxLogs: sandboxLogs,\n },\n });\n\n // Yield remaining logs\n yield* yieldQueuedLogs();\n\n yield {\n type: 'session_stopped',\n sessionId: session.id,\n reason: 'user_requested',\n partialContent: partialTextContent || undefined,\n };\n } else {\n logger.error('execution', `Execution error: ${errorMessage}`);\n\n // Update session with error status and save logs\n await self.sessionManager.updateSession(session.id, {\n status: 'error',\n metadata: {\n ...session.metadata,\n lastError: errorMessage,\n sandboxLogs: sandboxLogs,\n },\n });\n\n // Yield remaining logs\n yield* yieldQueuedLogs();\n\n // Call error hook\n if (self.hooks.onError && error instanceof Error) {\n const updatedSession = await self.sessionManager.getSession(session.id);\n if (updatedSession) {\n await self.hooks.onError(error, updatedSession);\n }\n }\n\n // Yield error event\n yield {\n type: 'error',\n error: errorMessage,\n };\n }\n } finally {\n // Always clean up the active execution tracking\n self.activeExecutions.delete(session.id);\n }\n },\n\n async getSession(): Promise<Session> {\n const current = await self.sessionManager.getSession(session.id);\n if (!current) {\n throw new Error(`Session not found: ${session.id}`);\n }\n return current;\n },\n\n async getMessages(): Promise<Message[]> {\n const result = await self.sessionManager.getSessionMessages(session.id);\n return result.items;\n },\n\n async close(): Promise<void> {\n await self.sessionManager.updateSession(session.id, {\n status: 'completed',\n });\n },\n\n async stop(): Promise<StopSessionResult> {\n return self.stopSession(session.id);\n },\n };\n }\n\n /**\n * Execute the actual agent query using Claude Agent SDK via ClaudeSdkClient\n */\n private async *executeAgentQuery(\n session: Session,\n prompt: string,\n options: SendMessageOptions,\n signal?: AbortSignal,\n _logger?: SandboxLogger\n ): AsyncGenerator<AgentEvent, void, unknown> {\n // Get session-level overrides from metadata (if any)\n const sessionEnvVars = session.metadata?.envVars as Record<string, string> | undefined;\n const sessionStartupScript = session.metadata?.startupScript as string | undefined;\n\n // Merge env vars: session overrides take precedence over agent defaults\n // MAX_THINKING_TOKENS enables extended thinking in the Claude Agent SDK\n const mergedEnvVars = {\n MAX_THINKING_TOKENS: '1024',\n ...this.config.envVars,\n ...sessionEnvVars,\n };\n const hasEnvVars = Object.keys(mergedEnvVars).length > 0;\n\n // Startup script: session overrides agent default\n const startupScript = sessionStartupScript ?? this.config.startupScript;\n\n // Build options for the ClaudeSdkClient\n const queryOptions: ClaudeAgentOptions = {\n model: this.config.model,\n allowedTools: this.config.allowedTools,\n disallowedTools: this.config.disallowedTools,\n permissionMode: this.config.permissionMode,\n maxTurns: this.config.maxTurns,\n mcpServers: this.config.mcpServers,\n // Pass the harness session ID for sandbox caching\n harnessSessionId: session.id,\n // Pass environment and startup configuration\n ...(hasEnvVars && { envVars: mergedEnvVars }),\n ...(startupScript && { startupScript }),\n // Pass config file URL for cloud-hosted .claude directory (downloaded in sandbox)\n ...(this.config.configFileUrl && { configFileUrl: this.config.configFileUrl }),\n };\n\n // Use session-specific API key if available\n const sessionApiKey = this.sessionApiKeys.get(session.id);\n if (sessionApiKey) {\n queryOptions.apiKey = sessionApiKey;\n }\n\n // Handle system prompt configuration\n // Uses the claude_code preset to preserve built-in tool instructions and safety guidelines\n // Agent's static system prompt is appended once (cache-friendly - doesn't change per request)\n // Session context is prepended to the user message instead (see below)\n const agentSystemPrompt = this.config.systemPrompt;\n\n // Always use claude_code preset to get built-in tool instructions\n // Only append the agent's static system prompt (not per-request context)\n if (agentSystemPrompt) {\n queryOptions.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n append: agentSystemPrompt,\n };\n } else {\n // No custom instructions, just use the preset\n queryOptions.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n };\n }\n\n // Prepend session context to the user's message instead of system prompt\n // This is cache-friendly: system prompt prefix remains stable across requests,\n // allowing LLM prefix caching to work effectively (faster + cheaper)\n const sessionContext = options.sessionContext;\n if (sessionContext) {\n prompt = `<session-context>\\n${sessionContext}\\n</session-context>\\n\\n${prompt}`;\n }\n\n // If resuming a session, pass the SDK session ID\n if (session.sdkSessionId) {\n queryOptions.resume = session.sdkSessionId;\n\n // If this is a forked session, tell the SDK to fork instead of just resuming\n // This creates a branch of the conversation at the SDK level\n const isForkedSession = session.metadata?.forkedFrom != null;\n if (isForkedSession) {\n queryOptions.forkSession = true;\n }\n }\n\n // If skills were materialized for this session, configure SDK to load them\n const skillsDir = this.sessionSkillDirs.get(session.id);\n if (skillsDir) {\n // The SDK needs the cwd to contain .claude/skills/\n // We pass this via the query options (cwd support in SDK)\n (queryOptions as any).cwd = skillsDir;\n // Enable loading skills from the project directory\n queryOptions.settingSources = ['project'];\n // Ensure the Skill tool is available\n if (queryOptions.allowedTools && !queryOptions.allowedTools.includes('Skill')) {\n queryOptions.allowedTools = [...queryOptions.allowedTools, 'Skill'];\n }\n }\n\n // Pass signal to queryOptions for propagation to SDK\n if (signal) {\n queryOptions.signal = signal;\n }\n\n // Execute via custom executor, backend executor, or default ClaudeSdkClient\n let executor: AsyncGenerator<ClaudeStreamEvent, void, unknown>;\n if (this.config.customExecutor) {\n executor = this.config.customExecutor(prompt, queryOptions);\n } else if (this.config.backend && this.config.backend !== 'claude') {\n // Use the specified backend (gemini, etc.)\n const backendExecutor = createBackendExecutor({\n backend: this.config.backend,\n apiKey: this.config.apiKey,\n model: this.config.model,\n });\n executor = backendExecutor(prompt, queryOptions);\n } else {\n // Default to Claude SDK client\n executor = this.client.query(prompt, queryOptions);\n }\n\n for await (const event of executor) {\n // Check if aborted before processing each event\n if (signal?.aborted) {\n return;\n }\n\n if (event.type === 'session_init' && event.sessionId) {\n // Store the SDK session ID for future resume operations\n await this.sessionManager.updateSession(session.id, {\n sdkSessionId: event.sessionId,\n });\n } else if (event.type === 'text_delta' && event.delta) {\n // Yield incremental text deltas for real-time streaming\n yield { type: 'text_delta', delta: event.delta };\n } else if (event.type === 'thinking_delta' && event.delta) {\n // Yield thinking deltas for extended thinking display\n yield { type: 'thinking_delta', delta: event.delta };\n } else if (event.type === 'text' && event.text) {\n yield { type: 'text', text: event.text };\n } else if (event.type === 'tool_use') {\n yield {\n type: 'tool_use',\n id: event.id ?? '',\n name: event.name ?? '',\n input: event.input,\n };\n } else if (event.type === 'tool_result') {\n yield {\n type: 'tool_result',\n toolUseId: event.toolUseId ?? '',\n content: event.content,\n isError: event.isError,\n };\n } else if (event.type === 'error') {\n throw new Error(event.error ?? 'Unknown error from Claude SDK');\n }\n }\n }\n\n /**\n * Clean up session resources including materialized skills\n */\n async cleanupSession(sessionId: SessionId): Promise<void> {\n // Clean up API key\n this.sessionApiKeys.delete(sessionId);\n\n // Clean up skills directory\n const skillsDir = this.sessionSkillDirs.get(sessionId);\n if (skillsDir && this.config.skillManager) {\n await this.config.skillManager.cleanupSession(sessionId);\n this.sessionSkillDirs.delete(sessionId);\n }\n }\n}\n\n// Internal event types for agent execution\ntype AgentEvent =\n | { type: 'text_delta'; delta: string }\n | { type: 'thinking_delta'; delta: string }\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n | { type: 'tool_result'; toolUseId: string; content: unknown; isError?: boolean };\n","export { AgentHarness } from './harness.js';\nexport type { AgentHarnessConfig, ActiveSession, CustomExecutor, StopSessionResult } from './harness.js';\n\nexport {\n ClaudeSdkClient,\n claudeClient,\n convertClaudeMessage,\n extractTextFromMessage,\n normalizeMcpServers,\n} from './claude-sdk.js';\nexport type {\n ClaudeAgentOptions,\n ClaudeMessage,\n ClaudeContentBlock,\n ClaudeStreamEvent,\n ClaudeV2Session,\n} from './claude-sdk.js';\n\n// Gemini CLI backend\nexport {\n GeminiCliClient,\n createGeminiExecutor,\n mapClaudeOptionsToGemini,\n} from './gemini-cli.js';\nexport type { GeminiCliOptions } from './gemini-cli.js';\n\n// Backend abstraction\nexport {\n createBackendExecutor,\n getApiKeyEnvVar,\n isValidModel,\n getDefaultModel,\n DEFAULT_MODELS,\n AVAILABLE_MODELS,\n} from './backend.js';\nexport type { AgentBackend, BackendConfig } from './backend.js';\n","export { SessionManager } from './manager.js';\n","import { nanoid } from 'nanoid';\nimport type {\n Session,\n SessionId,\n Message,\n MessageId,\n Attachment,\n AttachmentId,\n ListSessionsOptions,\n PaginatedResult,\n PaginationOptions,\n} from '../types/index.js';\nimport type { SessionStorage } from './interface.js';\n\n/**\n * In-memory storage implementation for development and testing.\n * Data is lost when the process exits.\n */\nexport class MemoryStorage implements SessionStorage {\n private sessions: Map<SessionId, Session> = new Map();\n private messages: Map<MessageId, Message> = new Map();\n private attachments: Map<AttachmentId, Attachment> = new Map();\n\n async initialize(): Promise<void> {\n // No-op for memory storage\n }\n\n async close(): Promise<void> {\n // Clear all data\n this.sessions.clear();\n this.messages.clear();\n this.attachments.clear();\n }\n\n // Sessions\n async createSession(\n session: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<Session> {\n const now = new Date();\n const newSession: Session = {\n ...session,\n id: nanoid(),\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(newSession.id, newSession);\n return newSession;\n }\n\n async getSession(sessionId: SessionId): Promise<Session | null> {\n return this.sessions.get(sessionId) ?? null;\n }\n\n async updateSession(\n sessionId: SessionId,\n updates: Partial<Session>\n ): Promise<Session> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n const updatedSession: Session = {\n ...session,\n ...updates,\n id: session.id, // Preserve ID\n createdAt: session.createdAt, // Preserve createdAt\n updatedAt: new Date(),\n };\n this.sessions.set(sessionId, updatedSession);\n return updatedSession;\n }\n\n async deleteSession(sessionId: SessionId): Promise<void> {\n // Delete associated messages\n for (const [messageId, message] of this.messages) {\n if (message.sessionId === sessionId) {\n // Delete associated attachments\n for (const [attachmentId, attachment] of this.attachments) {\n if (attachment.messageId === messageId) {\n this.attachments.delete(attachmentId);\n }\n }\n this.messages.delete(messageId);\n }\n }\n this.sessions.delete(sessionId);\n }\n\n async listSessions(\n options: ListSessionsOptions = {}\n ): Promise<PaginatedResult<Session>> {\n let sessions = Array.from(this.sessions.values());\n\n // Apply filters\n if (options.agentName) {\n sessions = sessions.filter((s) => s.agentName === options.agentName);\n }\n if (options.status) {\n sessions = sessions.filter((s) => s.status === options.status);\n }\n\n // Sort\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'desc';\n sessions.sort((a, b) => {\n const aVal = a[orderBy].getTime();\n const bVal = b[orderBy].getTime();\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n\n // Paginate\n const total = sessions.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 50;\n const items = sessions.slice(offset, offset + limit);\n\n return {\n items,\n total,\n hasMore: offset + limit < total,\n nextCursor:\n offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n // Messages\n async saveMessages(\n messages: Omit<Message, 'id' | 'createdAt'>[]\n ): Promise<Message[]> {\n const saved: Message[] = [];\n for (const msg of messages) {\n const newMessage: Message = {\n ...msg,\n id: nanoid(),\n createdAt: new Date(),\n };\n this.messages.set(newMessage.id, newMessage);\n saved.push(newMessage);\n }\n return saved;\n }\n\n async getMessage(messageId: MessageId): Promise<Message | null> {\n return this.messages.get(messageId) ?? null;\n }\n\n async getMessages(\n sessionId: SessionId,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<Message>> {\n let messages = Array.from(this.messages.values()).filter(\n (m) => m.sessionId === sessionId\n );\n\n // Sort by createdAt\n const order = options.order ?? 'asc';\n messages.sort((a, b) => {\n const diff = a.createdAt.getTime() - b.createdAt.getTime();\n return order === 'asc' ? diff : -diff;\n });\n\n // Paginate\n const total = messages.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 100;\n const items = messages.slice(offset, offset + limit);\n\n return {\n items,\n total,\n hasMore: offset + limit < total,\n nextCursor:\n offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async deleteMessage(messageId: MessageId): Promise<void> {\n // Delete associated attachments\n for (const [attachmentId, attachment] of this.attachments) {\n if (attachment.messageId === messageId) {\n this.attachments.delete(attachmentId);\n }\n }\n this.messages.delete(messageId);\n }\n\n async deleteSessionMessages(sessionId: SessionId): Promise<void> {\n for (const [messageId, message] of this.messages) {\n if (message.sessionId === sessionId) {\n await this.deleteMessage(messageId);\n }\n }\n }\n\n // Attachments\n async saveAttachment(\n attachment: Omit<Attachment, 'id' | 'createdAt'>\n ): Promise<Attachment> {\n const newAttachment: Attachment = {\n ...attachment,\n id: nanoid(),\n createdAt: new Date(),\n };\n this.attachments.set(newAttachment.id, newAttachment);\n return newAttachment;\n }\n\n async getAttachment(attachmentId: AttachmentId): Promise<Attachment | null> {\n return this.attachments.get(attachmentId) ?? null;\n }\n\n async deleteAttachment(attachmentId: AttachmentId): Promise<void> {\n this.attachments.delete(attachmentId);\n }\n\n async getMessageAttachments(messageId: MessageId): Promise<Attachment[]> {\n return Array.from(this.attachments.values()).filter(\n (a) => a.messageId === messageId\n );\n }\n\n // Helper methods for testing\n clear(): void {\n this.sessions.clear();\n this.messages.clear();\n this.attachments.clear();\n }\n\n getStats(): {\n sessions: number;\n messages: number;\n attachments: number;\n } {\n return {\n sessions: this.sessions.size,\n messages: this.messages.size,\n attachments: this.attachments.size,\n };\n }\n}\n","import { nanoid } from 'nanoid';\nimport type {\n QueueItem,\n CreateQueueItemOptions,\n ListQueueItemsOptions,\n QueueStats,\n SessionId,\n PaginatedResult,\n} from '../types/index.js';\nimport type { QueueStorage } from './interface.js';\n\n/**\n * In-memory queue storage implementation for development and testing.\n * Data is lost when the process exits.\n */\nexport class MemoryQueueStorage implements QueueStorage {\n private items: Map<string, QueueItem> = new Map();\n\n async initialize(): Promise<void> {\n // No-op for memory storage\n }\n\n async close(): Promise<void> {\n this.items.clear();\n }\n\n async createQueueItem(options: CreateQueueItemOptions): Promise<QueueItem> {\n const now = new Date();\n const item: QueueItem = {\n id: nanoid(),\n sessionId: options.sessionId ?? null,\n agentName: options.agentName,\n prompt: options.prompt,\n files: options.files,\n sessionContext: options.sessionContext,\n metadata: options.metadata,\n status: 'pending',\n priority: options.priority ?? 0,\n retryCount: 0,\n maxRetries: options.maxRetries ?? 3,\n createdAt: now,\n updatedAt: now,\n };\n this.items.set(item.id, item);\n return item;\n }\n\n async getQueueItem(id: string): Promise<QueueItem | null> {\n return this.items.get(id) ?? null;\n }\n\n async updateQueueItem(\n id: string,\n updates: Partial<Pick<QueueItem, 'status' | 'error' | 'resultMessageId' | 'sessionId' | 'retryCount' | 'startedAt' | 'completedAt'>>\n ): Promise<QueueItem | null> {\n const item = this.items.get(id);\n if (!item) return null;\n\n const updated: QueueItem = {\n ...item,\n ...updates,\n updatedAt: new Date(),\n };\n this.items.set(id, updated);\n return updated;\n }\n\n async deleteQueueItem(id: string): Promise<boolean> {\n return this.items.delete(id);\n }\n\n async listQueueItems(options: ListQueueItemsOptions = {}): Promise<PaginatedResult<QueueItem>> {\n let items = Array.from(this.items.values());\n\n // Apply filters\n if (options.sessionId) {\n items = items.filter((i) => i.sessionId === options.sessionId);\n }\n if (options.agentName) {\n items = items.filter((i) => i.agentName === options.agentName);\n }\n if (options.status) {\n items = items.filter((i) => i.status === options.status);\n }\n\n // Sort by priority (desc), then createdAt (asc)\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'asc';\n items.sort((a, b) => {\n // First sort by priority (always descending)\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n // Then by the specified orderBy field\n const aVal = a[orderBy]?.getTime?.() ?? 0;\n const bVal = b[orderBy]?.getTime?.() ?? 0;\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n\n // Paginate\n const total = items.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 50;\n const pageItems = items.slice(offset, offset + limit);\n\n return {\n items: pageItems,\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async getNextPendingItem(\n agentName: string,\n sessionId?: SessionId | null,\n markAsProcessing = false\n ): Promise<QueueItem | null> {\n // Get all pending items for this agent/session\n const pendingItems = Array.from(this.items.values())\n .filter((i) =>\n i.agentName === agentName &&\n i.status === 'pending' &&\n (sessionId === undefined || i.sessionId === sessionId)\n )\n .sort((a, b) => {\n // Sort by priority (desc), then createdAt (asc)\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.createdAt.getTime() - b.createdAt.getTime();\n });\n\n const nextItem = pendingItems[0];\n if (!nextItem) return null;\n\n if (markAsProcessing) {\n const updated = await this.updateQueueItem(nextItem.id, {\n status: 'processing',\n startedAt: new Date(),\n });\n return updated;\n }\n\n return nextItem;\n }\n\n async getPendingItemsForSession(\n agentName: string,\n sessionId: SessionId | null\n ): Promise<QueueItem[]> {\n return Array.from(this.items.values())\n .filter((i) =>\n i.agentName === agentName &&\n i.sessionId === sessionId &&\n i.status === 'pending'\n )\n .sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.createdAt.getTime() - b.createdAt.getTime();\n });\n }\n\n async cancelPendingItems(\n agentName: string,\n sessionId?: SessionId | null\n ): Promise<number> {\n let count = 0;\n for (const item of this.items.values()) {\n if (\n item.agentName === agentName &&\n item.status === 'pending' &&\n (sessionId === undefined || item.sessionId === sessionId)\n ) {\n await this.updateQueueItem(item.id, {\n status: 'cancelled',\n completedAt: new Date(),\n });\n count++;\n }\n }\n return count;\n }\n\n async getQueueStats(agentName?: string): Promise<QueueStats> {\n let items = Array.from(this.items.values());\n if (agentName) {\n items = items.filter((i) => i.agentName === agentName);\n }\n\n const stats: QueueStats = {\n pending: 0,\n processing: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: items.length,\n };\n\n for (const item of items) {\n stats[item.status as keyof Omit<QueueStats, 'total'>]++;\n }\n\n return stats;\n }\n\n async cleanupOldItems(maxAgeMs: number): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeMs);\n let count = 0;\n\n for (const [id, item] of this.items) {\n if (\n ['completed', 'failed', 'cancelled'].includes(item.status) &&\n item.completedAt &&\n item.completedAt < cutoff\n ) {\n this.items.delete(id);\n count++;\n }\n }\n\n return count;\n }\n\n // Helper method for testing\n clear(): void {\n this.items.clear();\n }\n}\n","export type {\n SessionStorage,\n TransactionalStorage,\n BulkStorage,\n StorageConfig,\n AgentStorage,\n QueueStorage,\n} from './interface.js';\n\nexport { MemoryStorage } from './memory.js';\nexport { MemoryQueueStorage } from './queue-memory.js';\n","/**\n * Queue Processor\n *\n * Processes queued messages in the background, one at a time per session.\n * Supports automatic retries with exponential backoff.\n */\n\nimport type { AgentHarness } from '../agent/index.js';\nimport type { QueueStorage } from '../storage/interface.js';\nimport type { SessionManager } from '../session/index.js';\nimport type {\n QueueItem,\n SessionId,\n StreamEvent,\n} from '../types/index.js';\n\n/**\n * Callback for queue events\n */\nexport interface QueueProcessorCallbacks {\n /**\n * Called when a queue item starts processing\n */\n onItemStart?: (item: QueueItem) => void | Promise<void>;\n\n /**\n * Called for each stream event during processing\n */\n onStreamEvent?: (item: QueueItem, event: StreamEvent) => void | Promise<void>;\n\n /**\n * Called when a queue item completes successfully\n */\n onItemComplete?: (item: QueueItem, resultMessageId?: string) => void | Promise<void>;\n\n /**\n * Called when a queue item fails\n */\n onItemError?: (item: QueueItem, error: Error) => void | Promise<void>;\n\n /**\n * Called when a queue item is retried\n */\n onItemRetry?: (item: QueueItem, retryCount: number) => void | Promise<void>;\n}\n\nexport interface QueueProcessorConfig {\n /**\n * Queue storage instance\n */\n queueStorage: QueueStorage;\n\n /**\n * Session manager for managing sessions\n */\n sessionManager: SessionManager;\n\n /**\n * Map of agent name to agent instance\n */\n agents: Map<string, AgentHarness>;\n\n /**\n * Callbacks for queue events\n */\n callbacks?: QueueProcessorCallbacks;\n\n /**\n * Interval in ms between checking for new items (default: 1000)\n */\n pollIntervalMs?: number;\n\n /**\n * Base delay in ms for exponential backoff (default: 1000)\n */\n retryBaseDelayMs?: number;\n\n /**\n * Maximum delay in ms for exponential backoff (default: 60000)\n */\n retryMaxDelayMs?: number;\n}\n\n/**\n * Tracks processing state for a session\n */\ninterface SessionProcessingState {\n isProcessing: boolean;\n currentItemId?: string;\n abortController?: AbortController;\n}\n\n/**\n * Queue Processor that processes messages from the queue\n */\nexport class QueueProcessor {\n private queueStorage: QueueStorage;\n // SessionManager is available for future use (e.g., session validation)\n private _sessionManager: SessionManager;\n private agents: Map<string, AgentHarness>;\n private callbacks: QueueProcessorCallbacks;\n private pollIntervalMs: number;\n private retryBaseDelayMs: number;\n private retryMaxDelayMs: number;\n\n private isRunning = false;\n private pollTimer: NodeJS.Timeout | null = null;\n private processingStates: Map<string, SessionProcessingState> = new Map();\n\n constructor(config: QueueProcessorConfig) {\n this.queueStorage = config.queueStorage;\n this._sessionManager = config.sessionManager;\n this.agents = config.agents;\n this.callbacks = config.callbacks ?? {};\n this.pollIntervalMs = config.pollIntervalMs ?? 1000;\n this.retryBaseDelayMs = config.retryBaseDelayMs ?? 1000;\n this.retryMaxDelayMs = config.retryMaxDelayMs ?? 60000;\n }\n\n /**\n * Get the session manager (for external access if needed)\n */\n get sessionManager(): SessionManager {\n return this._sessionManager;\n }\n\n /**\n * Start the queue processor\n */\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n this.poll();\n }\n\n /**\n * Stop the queue processor\n */\n stop(): void {\n this.isRunning = false;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n // Abort all active processing\n for (const state of this.processingStates.values()) {\n state.abortController?.abort();\n }\n this.processingStates.clear();\n }\n\n /**\n * Check if a session is currently being processed\n */\n isSessionProcessing(agentName: string, sessionId: SessionId | null): boolean {\n const key = this.getSessionKey(agentName, sessionId);\n return this.processingStates.get(key)?.isProcessing ?? false;\n }\n\n /**\n * Get the current item being processed for a session\n */\n getCurrentItemForSession(agentName: string, sessionId: SessionId | null): string | undefined {\n const key = this.getSessionKey(agentName, sessionId);\n return this.processingStates.get(key)?.currentItemId;\n }\n\n /**\n * Stop processing for a specific session\n */\n stopSessionProcessing(agentName: string, sessionId: SessionId | null): void {\n const key = this.getSessionKey(agentName, sessionId);\n const state = this.processingStates.get(key);\n if (state) {\n state.abortController?.abort();\n }\n }\n\n /**\n * Trigger processing for a specific session (useful when a new item is added)\n */\n async triggerProcessing(agentName: string, sessionId: SessionId | null): Promise<void> {\n const key = this.getSessionKey(agentName, sessionId);\n const state = this.processingStates.get(key);\n\n // If already processing, don't start another\n if (state?.isProcessing) return;\n\n // Start processing for this session\n await this.processNextForSession(agentName, sessionId);\n }\n\n private getSessionKey(agentName: string, sessionId: SessionId | null): string {\n return `${agentName}:${sessionId ?? 'new'}`;\n }\n\n private async poll(): Promise<void> {\n if (!this.isRunning) return;\n\n try {\n // Get all pending items grouped by agent/session\n const stats = await this.queueStorage.getQueueStats();\n if (stats.pending > 0) {\n // Get unique agent names from pending items\n const items = await this.queueStorage.listQueueItems({\n status: 'pending',\n limit: 100,\n });\n\n // Group by agent/session\n const sessions = new Set<string>();\n for (const item of items.items) {\n sessions.add(this.getSessionKey(item.agentName, item.sessionId));\n }\n\n // Process each session that isn't already being processed\n for (const key of sessions) {\n const parts = key.split(':');\n const agentName = parts[0];\n const sessionIdStr = parts[1] ?? 'new';\n const sessionId: string | null = sessionIdStr === 'new' ? null : sessionIdStr;\n const state = this.processingStates.get(key);\n\n if (!state?.isProcessing && agentName) {\n // Don't await - process in parallel for different sessions\n this.processNextForSession(agentName, sessionId).catch((err) => {\n console.error(`Error processing queue for ${key}:`, err);\n });\n }\n }\n }\n } catch (err) {\n console.error('Error polling queue:', err);\n }\n\n // Schedule next poll\n if (this.isRunning) {\n this.pollTimer = setTimeout(() => this.poll(), this.pollIntervalMs);\n }\n }\n\n private async processNextForSession(\n agentName: string,\n sessionId: SessionId | null\n ): Promise<void> {\n const key = this.getSessionKey(agentName, sessionId);\n\n // Check if already processing\n const existingState = this.processingStates.get(key);\n if (existingState?.isProcessing) return;\n\n // Get and lock the next pending item\n const item = await this.queueStorage.getNextPendingItem(agentName, sessionId, true);\n if (!item) return;\n\n // Set processing state\n const abortController = new AbortController();\n this.processingStates.set(key, {\n isProcessing: true,\n currentItemId: item.id,\n abortController,\n });\n\n try {\n await this.processItem(item, abortController.signal);\n } finally {\n // Clear processing state\n this.processingStates.set(key, {\n isProcessing: false,\n });\n\n // Check for more items\n if (this.isRunning) {\n // Use setImmediate to avoid stack overflow with many items\n setImmediate(() => {\n this.processNextForSession(agentName, sessionId).catch((err) => {\n console.error(`Error processing next item for ${key}:`, err);\n });\n });\n }\n }\n }\n\n private async processItem(item: QueueItem, signal: AbortSignal): Promise<void> {\n // Notify start\n try {\n await this.callbacks.onItemStart?.(item);\n } catch (err) {\n console.error('Error in onItemStart callback:', err);\n }\n\n // Get the agent\n const agent = this.agents.get(item.agentName);\n if (!agent) {\n await this.handleItemError(item, new Error(`Agent not found: ${item.agentName}`));\n return;\n }\n\n try {\n let sessionId = item.sessionId;\n let resultMessageId: string | undefined;\n\n // Create or resume session\n const activeSession = sessionId\n ? await agent.resumeSession(sessionId)\n : await agent.createSession({});\n\n // Update queue item with session ID if new\n if (!sessionId) {\n sessionId = activeSession.session.id;\n await this.queueStorage.updateQueueItem(item.id, {\n sessionId,\n });\n }\n\n // Prepare attachments\n const attachments = item.files?.map((f) => ({\n filename: f.filename,\n content: f.content,\n mimeType: f.mimeType,\n }));\n\n // Send the message and collect events\n for await (const event of activeSession.send(item.prompt, {\n attachments,\n sessionContext: item.sessionContext,\n metadata: item.metadata,\n signal,\n })) {\n // Check if aborted\n if (signal.aborted) {\n throw new Error('Processing aborted');\n }\n\n // Notify stream event\n try {\n await this.callbacks.onStreamEvent?.(item, event);\n } catch (err) {\n console.error('Error in onStreamEvent callback:', err);\n }\n\n // Capture result message ID\n if (event.type === 'message' && event.message.role === 'assistant') {\n resultMessageId = event.message.id;\n }\n }\n\n // Mark as completed\n await this.queueStorage.updateQueueItem(item.id, {\n status: 'completed',\n resultMessageId,\n completedAt: new Date(),\n });\n\n // Notify completion\n try {\n await this.callbacks.onItemComplete?.(item, resultMessageId);\n } catch (err) {\n console.error('Error in onItemComplete callback:', err);\n }\n } catch (err) {\n await this.handleItemError(item, err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private async handleItemError(item: QueueItem, error: Error): Promise<void> {\n // Check if we should retry\n if (item.retryCount < item.maxRetries) {\n // Calculate backoff delay\n const delay = Math.min(\n this.retryBaseDelayMs * Math.pow(2, item.retryCount),\n this.retryMaxDelayMs\n );\n\n // Update retry count\n await this.queueStorage.updateQueueItem(item.id, {\n status: 'pending', // Back to pending for retry\n retryCount: item.retryCount + 1,\n error: error.message,\n });\n\n // Notify retry\n try {\n await this.callbacks.onItemRetry?.(item, item.retryCount + 1);\n } catch (err) {\n console.error('Error in onItemRetry callback:', err);\n }\n\n // Schedule retry after delay\n setTimeout(() => {\n if (this.isRunning) {\n this.triggerProcessing(item.agentName, item.sessionId).catch((err) => {\n console.error('Error triggering retry:', err);\n });\n }\n }, delay);\n } else {\n // Max retries reached, mark as failed\n await this.queueStorage.updateQueueItem(item.id, {\n status: 'failed',\n error: error.message,\n completedAt: new Date(),\n });\n\n // Notify error\n try {\n await this.callbacks.onItemError?.(item, error);\n } catch (err) {\n console.error('Error in onItemError callback:', err);\n }\n }\n }\n}\n\n/**\n * Create a queue processor instance\n */\nexport function createQueueProcessor(config: QueueProcessorConfig): QueueProcessor {\n return new QueueProcessor(config);\n}\n","/**\n * Queue Module\n *\n * Provides message queuing capabilities for the agent harness.\n */\n\nexport {\n QueueProcessor,\n createQueueProcessor,\n} from './processor.js';\n\nexport type {\n QueueProcessorConfig,\n QueueProcessorCallbacks,\n} from './processor.js';\n","import { nanoid } from 'nanoid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { Attachment, MessageId } from '../types/index.js';\n\n/**\n * Configuration for attachment storage\n */\nexport interface AttachmentStorageConfig {\n /**\n * Base directory for storing files\n */\n basePath: string;\n\n /**\n * Maximum file size in bytes (default: 50MB)\n */\n maxFileSize?: number;\n\n /**\n * Allowed MIME types (default: all)\n */\n allowedMimeTypes?: string[];\n}\n\n/**\n * Handles file attachment storage and retrieval\n */\nexport class AttachmentStorage {\n private config: Required<AttachmentStorageConfig>;\n\n constructor(config: AttachmentStorageConfig) {\n this.config = {\n basePath: config.basePath,\n maxFileSize: config.maxFileSize ?? 50 * 1024 * 1024, // 50MB\n allowedMimeTypes: config.allowedMimeTypes ?? [],\n };\n }\n\n /**\n * Initialize storage directory\n */\n async initialize(): Promise<void> {\n await fs.mkdir(this.config.basePath, { recursive: true });\n }\n\n /**\n * Store a file from buffer\n */\n async storeFromBuffer(\n messageId: MessageId,\n filename: string,\n content: Buffer,\n mimeType: string\n ): Promise<Attachment> {\n // Validate file size\n if (content.length > this.config.maxFileSize) {\n throw new Error(\n `File size ${content.length} exceeds maximum ${this.config.maxFileSize}`\n );\n }\n\n // Validate MIME type if restrictions are set\n if (\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new Error(`MIME type ${mimeType} is not allowed`);\n }\n\n const id = nanoid();\n const ext = path.extname(filename) || this.getExtensionForMimeType(mimeType);\n const storageName = `${id}${ext}`;\n const storagePath = path.join(this.config.basePath, storageName);\n\n // Write file\n await fs.writeFile(storagePath, content);\n\n return {\n id,\n messageId,\n filename,\n mimeType,\n size: content.length,\n storagePath,\n createdAt: new Date(),\n };\n }\n\n /**\n * Store a file from a file path\n */\n async storeFromPath(\n messageId: MessageId,\n sourcePath: string,\n mimeType?: string\n ): Promise<Attachment> {\n const content = await fs.readFile(sourcePath);\n const filename = path.basename(sourcePath);\n const detectedMimeType = mimeType ?? this.getMimeTypeForExtension(path.extname(filename));\n\n return this.storeFromBuffer(messageId, filename, content, detectedMimeType);\n }\n\n /**\n * Store a file from base64 string\n */\n async storeFromBase64(\n messageId: MessageId,\n filename: string,\n base64Content: string,\n mimeType: string\n ): Promise<Attachment> {\n const content = Buffer.from(base64Content, 'base64');\n return this.storeFromBuffer(messageId, filename, content, mimeType);\n }\n\n /**\n * Get file content as buffer\n */\n async getContent(attachment: Attachment): Promise<Buffer> {\n return fs.readFile(attachment.storagePath);\n }\n\n /**\n * Get file content as base64\n */\n async getContentBase64(attachment: Attachment): Promise<string> {\n const content = await this.getContent(attachment);\n return content.toString('base64');\n }\n\n /**\n * Get file content as stream\n */\n async getContentStream(attachment: Attachment): Promise<fs.FileHandle> {\n return fs.open(attachment.storagePath, 'r');\n }\n\n /**\n * Delete a file\n */\n async delete(attachment: Attachment): Promise<void> {\n try {\n await fs.unlink(attachment.storagePath);\n } catch (error) {\n // Ignore if file doesn't exist\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n /**\n * Check if file exists\n */\n async exists(attachment: Attachment): Promise<boolean> {\n try {\n await fs.access(attachment.storagePath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get extension for MIME type\n */\n private getExtensionForMimeType(mimeType: string): string {\n const mimeToExt: Record<string, string> = {\n 'image/png': '.png',\n 'image/jpeg': '.jpg',\n 'image/gif': '.gif',\n 'image/webp': '.webp',\n 'image/svg+xml': '.svg',\n 'application/pdf': '.pdf',\n 'text/plain': '.txt',\n 'text/markdown': '.md',\n 'text/html': '.html',\n 'text/css': '.css',\n 'text/javascript': '.js',\n 'application/json': '.json',\n 'application/xml': '.xml',\n 'application/zip': '.zip',\n 'application/gzip': '.gz',\n 'audio/mpeg': '.mp3',\n 'audio/wav': '.wav',\n 'video/mp4': '.mp4',\n 'video/webm': '.webm',\n };\n return mimeToExt[mimeType] ?? '';\n }\n\n /**\n * Get MIME type for extension\n */\n private getMimeTypeForExtension(ext: string): string {\n const extToMime: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'text/javascript',\n '.ts': 'text/typescript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.zip': 'application/zip',\n '.gz': 'application/gzip',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n };\n return extToMime[ext.toLowerCase()] ?? 'application/octet-stream';\n }\n}\n\n/**\n * Helper to convert attachment to base64 data URL for embedding in messages\n */\nexport function attachmentToDataUrl(\n content: Buffer,\n mimeType: string\n): string {\n const base64 = content.toString('base64');\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Helper to extract base64 content from data URL\n */\nexport function dataUrlToBuffer(dataUrl: string): {\n content: Buffer;\n mimeType: string;\n} {\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match || !match[1] || !match[2]) {\n throw new Error('Invalid data URL format');\n }\n return {\n mimeType: match[1],\n content: Buffer.from(match[2], 'base64'),\n };\n}\n\n/**\n * Check if content is an image based on MIME type\n */\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * Check if content is a document based on MIME type\n */\nexport function isDocumentMimeType(mimeType: string): boolean {\n return (\n mimeType === 'application/pdf' ||\n mimeType.startsWith('text/') ||\n mimeType === 'application/json' ||\n mimeType === 'application/xml'\n );\n}\n","import type { Session, Message, StreamEvent } from '../types/index.js';\n\n/**\n * Event types that can be emitted by the harness\n */\nexport type HarnessEventType =\n | 'session:created'\n | 'session:resumed'\n | 'session:forked'\n | 'session:completed'\n | 'session:error'\n | 'message:user'\n | 'message:assistant'\n | 'message:saved'\n | 'tool:start'\n | 'tool:end'\n | 'stream:start'\n | 'stream:data'\n | 'stream:end';\n\n/**\n * Event payloads for each event type\n */\nexport interface HarnessEventPayloads {\n 'session:created': { session: Session };\n 'session:resumed': { session: Session; fromSessionId: string };\n 'session:forked': { session: Session; parentSessionId: string };\n 'session:completed': { session: Session; totalTokens?: number; totalCost?: number };\n 'session:error': { session: Session; error: Error };\n 'message:user': { sessionId: string; message: string };\n 'message:assistant': { sessionId: string; content: string };\n 'message:saved': { sessionId: string; message: Message };\n 'tool:start': { sessionId: string; toolName: string; toolId: string; input: unknown };\n 'tool:end': { sessionId: string; toolName: string; toolId: string; result: unknown; isError?: boolean };\n 'stream:start': { sessionId: string };\n 'stream:data': { sessionId: string; event: StreamEvent };\n 'stream:end': { sessionId: string };\n}\n\n/**\n * Event handler type\n */\nexport type HarnessEventHandler<T extends HarnessEventType> = (\n payload: HarnessEventPayloads[T]\n) => void | Promise<void>;\n\n/**\n * Event emitter for harness events\n */\nexport class HarnessEventEmitter {\n private listeners: Map<HarnessEventType, Set<HarnessEventHandler<any>>> = new Map();\n\n /**\n * Subscribe to an event\n */\n on<T extends HarnessEventType>(\n event: T,\n handler: HarnessEventHandler<T>\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n /**\n * Subscribe to an event (one-time)\n */\n once<T extends HarnessEventType>(\n event: T,\n handler: HarnessEventHandler<T>\n ): () => void {\n const wrappedHandler: HarnessEventHandler<T> = async (payload) => {\n this.off(event, wrappedHandler);\n await handler(payload);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<T extends HarnessEventType>(\n event: T,\n handler: HarnessEventHandler<T>\n ): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event\n */\n async emit<T extends HarnessEventType>(\n event: T,\n payload: HarnessEventPayloads[T]\n ): Promise<void> {\n const handlers = this.listeners.get(event);\n if (!handlers) return;\n\n const promises: Promise<void>[] = [];\n for (const handler of handlers) {\n const result = handler(payload);\n if (result instanceof Promise) {\n promises.push(result);\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Remove all listeners for an event or all events\n */\n removeAllListeners(event?: HarnessEventType): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: HarnessEventType): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\n/**\n * Global event emitter instance\n */\nexport const globalEventEmitter = new HarnessEventEmitter();\n\n/**\n * Helper to create a typed event handler\n */\nexport function createEventHandler<T extends HarnessEventType>(\n _event: T,\n handler: HarnessEventHandler<T>\n): HarnessEventHandler<T> {\n return handler;\n}\n\n/**\n * Middleware-style event interceptor\n */\nexport interface EventMiddleware {\n event: HarnessEventType;\n handler: (payload: any, next: () => Promise<void>) => Promise<void>;\n}\n\n/**\n * Apply middleware to event emission\n */\nexport function createEventMiddlewareChain(middlewares: EventMiddleware[]) {\n return async <T extends HarnessEventType>(\n event: T,\n payload: HarnessEventPayloads[T],\n finalHandler: () => Promise<void>\n ): Promise<void> => {\n const relevantMiddlewares = middlewares.filter((m) => m.event === event);\n\n if (relevantMiddlewares.length === 0) {\n await finalHandler();\n return;\n }\n\n let index = 0;\n const next = async (): Promise<void> => {\n if (index < relevantMiddlewares.length) {\n const middleware = relevantMiddlewares[index++];\n if (middleware) {\n await middleware.handler(payload, next);\n } else {\n await next();\n }\n } else {\n await finalHandler();\n }\n };\n\n await next();\n };\n}\n","import { z } from 'zod';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * Storage configuration schema\n */\nexport const StorageConfigSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('memory'),\n }),\n z.object({\n type: z.literal('sqlite'),\n path: z.string().default('./data/harness.db'),\n }),\n z.object({\n type: z.literal('postgres'),\n connectionString: z.string(),\n poolSize: z.number().optional(),\n }),\n z.object({\n type: z.literal('libsql'),\n url: z.string(),\n authToken: z.string().optional(),\n }),\n]);\n\n/**\n * Agent configuration schema\n */\nexport const AgentConfigSchema = z.object({\n name: z.string(),\n model: z.string().default('claude-sonnet-4-5'),\n systemPrompt: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n permissionMode: z.enum(['auto', 'confirm', 'deny']).default('auto'),\n maxTurns: z.number().optional(),\n maxTokens: z.number().optional(),\n mcpServers: z.array(z.string()).optional(),\n});\n\n/**\n * Server configuration schema\n */\nexport const ServerConfigSchema = z.object({\n port: z.number().default(3000),\n host: z.string().default('localhost'),\n cors: z.object({\n origin: z.union([z.string(), z.array(z.string())]).default('*'),\n credentials: z.boolean().default(true),\n }).optional(),\n auth: z.object({\n type: z.enum(['none', 'bearer', 'api-key']).default('none'),\n token: z.string().optional(),\n headerName: z.string().default('X-API-Key'),\n }).optional(),\n});\n\n/**\n * Attachment configuration schema\n */\nexport const AttachmentConfigSchema = z.object({\n basePath: z.string().default('./data/attachments'),\n maxFileSize: z.number().default(50 * 1024 * 1024), // 50MB\n allowedMimeTypes: z.array(z.string()).optional(),\n});\n\n/**\n * Full harness configuration schema\n */\nexport const HarnessConfigSchema = z.object({\n /**\n * Name of this harness instance\n */\n name: z.string().default('agent-harness'),\n\n /**\n * Storage configuration\n */\n storage: StorageConfigSchema.default({ type: 'memory' }),\n\n /**\n * Default agent configuration (can be overridden per-agent)\n */\n defaultAgent: AgentConfigSchema.partial().optional(),\n\n /**\n * Named agent configurations\n */\n agents: z.record(z.string(), AgentConfigSchema).optional(),\n\n /**\n * Server configuration\n */\n server: ServerConfigSchema.optional(),\n\n /**\n * Attachment storage configuration\n */\n attachments: AttachmentConfigSchema.optional(),\n\n /**\n * Environment-specific overrides\n */\n environments: z.record(z.string(), z.object({\n storage: StorageConfigSchema.optional(),\n server: ServerConfigSchema.partial().optional(),\n })).optional(),\n});\n\n/**\n * Type definitions inferred from schemas\n */\nexport type StorageConfig = z.infer<typeof StorageConfigSchema>;\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\nexport type ServerConfig = z.infer<typeof ServerConfigSchema>;\nexport type AttachmentConfig = z.infer<typeof AttachmentConfigSchema>;\nexport type HarnessConfig = z.infer<typeof HarnessConfigSchema>;\n\n/**\n * Config file names to search for (in priority order)\n */\nconst CONFIG_FILE_NAMES = [\n 'harness.config.ts',\n 'harness.config.js',\n 'harness.config.json',\n 'agent-harness.config.ts',\n 'agent-harness.config.js',\n 'agent-harness.config.json',\n];\n\n/**\n * Load and validate configuration from file\n */\nexport async function loadConfig(\n configPath?: string,\n options: { env?: string } = {}\n): Promise<HarnessConfig> {\n let rawConfig: unknown;\n\n if (configPath) {\n rawConfig = await loadConfigFile(configPath);\n } else {\n // Search for config file in current directory\n rawConfig = await findAndLoadConfig(process.cwd());\n }\n\n // Parse and validate\n let config = HarnessConfigSchema.parse(rawConfig ?? {});\n\n // Apply environment-specific overrides\n const env = options.env ?? process.env.NODE_ENV ?? 'development';\n if (config.environments?.[env]) {\n const envOverrides = config.environments[env];\n if (envOverrides.storage) {\n config = { ...config, storage: envOverrides.storage };\n }\n if (envOverrides.server) {\n config = {\n ...config,\n server: { ...config.server, ...envOverrides.server } as ServerConfig,\n };\n }\n }\n\n return config;\n}\n\n/**\n * Load configuration from a specific file path\n */\nasync function loadConfigFile(filePath: string): Promise<unknown> {\n const ext = path.extname(filePath);\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(process.cwd(), filePath);\n\n if (ext === '.json') {\n const content = await fs.readFile(fullPath, 'utf-8');\n return JSON.parse(content);\n }\n\n if (ext === '.ts' || ext === '.js') {\n // Dynamic import for JS/TS files\n const module = await import(fullPath);\n return module.default ?? module;\n }\n\n throw new Error(`Unsupported config file type: ${ext}`);\n}\n\n/**\n * Search for and load config file\n */\nasync function findAndLoadConfig(directory: string): Promise<unknown | null> {\n for (const fileName of CONFIG_FILE_NAMES) {\n const filePath = path.join(directory, fileName);\n try {\n await fs.access(filePath);\n return await loadConfigFile(filePath);\n } catch {\n // File doesn't exist, try next\n }\n }\n return null;\n}\n\n/**\n * Define configuration with type checking\n */\nexport function defineConfig(config: Partial<HarnessConfig>): HarnessConfig {\n return HarnessConfigSchema.parse(config);\n}\n\n/**\n * Define an agent with type checking\n */\nexport function defineAgent(config: AgentConfig): AgentConfig {\n return AgentConfigSchema.parse(config);\n}\n\n/**\n * Create a config builder for fluent configuration\n */\nexport class ConfigBuilder {\n private config: Partial<HarnessConfig> = {};\n\n name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n storage(storage: StorageConfig): this {\n this.config.storage = storage;\n return this;\n }\n\n memoryStorage(): this {\n this.config.storage = { type: 'memory' };\n return this;\n }\n\n sqliteStorage(dbPath: string = './data/harness.db'): this {\n this.config.storage = { type: 'sqlite', path: dbPath };\n return this;\n }\n\n postgresStorage(connectionString: string, poolSize?: number): this {\n this.config.storage = { type: 'postgres', connectionString, poolSize };\n return this;\n }\n\n libsqlStorage(url: string, authToken?: string): this {\n this.config.storage = { type: 'libsql', url, authToken };\n return this;\n }\n\n defaultAgent(config: Partial<AgentConfig>): this {\n this.config.defaultAgent = config;\n return this;\n }\n\n agent(name: string, config: Omit<AgentConfig, 'name'>): this {\n if (!this.config.agents) {\n this.config.agents = {};\n }\n this.config.agents[name] = { ...config, name };\n return this;\n }\n\n server(config: Partial<ServerConfig>): this {\n this.config.server = config as ServerConfig;\n return this;\n }\n\n attachments(config: Partial<AttachmentConfig>): this {\n this.config.attachments = config as AttachmentConfig;\n return this;\n }\n\n environment(env: string, overrides: { storage?: StorageConfig; server?: Partial<ServerConfig> }): this {\n if (!this.config.environments) {\n this.config.environments = {};\n }\n this.config.environments[env] = overrides;\n return this;\n }\n\n build(): HarnessConfig {\n return HarnessConfigSchema.parse(this.config);\n }\n}\n\n/**\n * Create a new config builder\n */\nexport function createConfig(): ConfigBuilder {\n return new ConfigBuilder();\n}\n\n/**\n * Get environment variable with optional default\n */\nexport function env(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n throw new Error(`Missing required environment variable: ${key}`);\n }\n return value;\n}\n\n/**\n * Get optional environment variable\n */\nexport function envOptional(key: string): string | undefined {\n return process.env[key];\n}\n","/**\n * Sandbox Provider Types\n *\n * Common interfaces for third-party sandbox providers.\n * Each provider implements these interfaces to enable seamless switching\n * between different hosting environments.\n *\n * Supported providers:\n * - Modal (https://modal.com)\n * - E2B (https://e2b.dev)\n * - Cloudflare Sandboxes (https://github.com/cloudflare/sandbox-sdk)\n * - Fly.io Machines (https://fly.io/docs/machines)\n * - Daytona (https://daytona.io)\n * - Vercel Sandbox (https://vercel.com/docs/functions/sandbox)\n *\n * @see https://platform.claude.com/docs/en/agent-sdk/hosting\n */\n\n/**\n * Status of a sandbox instance\n */\nexport type SandboxStatus =\n | 'creating'\n | 'running'\n | 'paused'\n | 'stopping'\n | 'stopped'\n | 'error';\n\n/**\n * Resource limits for sandbox instances\n */\nexport interface SandboxResources {\n /** Memory limit (e.g., '1Gi', '2048Mi') */\n memory?: string;\n\n /** CPU limit (e.g., '1', '0.5', '2') */\n cpu?: string;\n\n /** Disk size (e.g., '5Gi', '10Gi') */\n disk?: string;\n\n /** GPU type if needed (e.g., 'T4', 'A100') */\n gpu?: string;\n\n /** Timeout in seconds before auto-shutdown */\n timeout?: number;\n}\n\n/**\n * Network configuration for sandboxes\n */\nexport interface SandboxNetwork {\n /** Enable outbound internet access */\n internetAccess?: boolean;\n\n /** Allowed outbound domains (if internetAccess is true) */\n allowedDomains?: string[];\n\n /** Blocked domains */\n blockedDomains?: string[];\n\n /** Exposed ports for inbound connections */\n exposedPorts?: number[];\n\n /** Custom DNS servers */\n dnsServers?: string[];\n}\n\n/**\n * File system mount configuration\n */\nexport interface SandboxMount {\n /** Source path or volume name */\n source: string;\n\n /** Destination path in sandbox */\n destination: string;\n\n /** Mount as read-only */\n readOnly?: boolean;\n}\n\n/**\n * Configuration for creating a sandbox\n */\nexport interface SandboxConfig {\n /** Unique identifier for this sandbox */\n id?: string;\n\n /** Human-readable name */\n name?: string;\n\n /** Base image or environment */\n image?: string;\n\n /** Resource limits */\n resources?: SandboxResources;\n\n /** Network configuration */\n network?: SandboxNetwork;\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /** File system mounts */\n mounts?: SandboxMount[];\n\n /** Working directory */\n workingDirectory?: string;\n\n /** Startup command */\n command?: string[];\n\n /** Labels/tags for organization */\n labels?: Record<string, string>;\n\n /** Provider-specific options */\n providerOptions?: Record<string, unknown>;\n}\n\n/**\n * Result of command execution\n */\nexport interface CommandResult {\n /** Exit code (0 = success) */\n exitCode: number;\n\n /** Standard output */\n stdout: string;\n\n /** Standard error */\n stderr: string;\n\n /** Execution duration in milliseconds */\n durationMs?: number;\n}\n\n/**\n * A running sandbox instance\n */\nexport interface Sandbox {\n /** Unique identifier */\n id: string;\n\n /** Provider name */\n provider: string;\n\n /** Current status */\n status: SandboxStatus;\n\n /** Public URL if exposed */\n url?: string;\n\n /** Exposed port mappings */\n ports?: Record<number, string>;\n\n /** Creation timestamp */\n createdAt: Date;\n\n /** Provider-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Streaming output from command execution\n */\nexport interface CommandStream {\n /** Async iterator for stdout chunks */\n stdout: AsyncIterable<string>;\n\n /** Async iterator for stderr chunks */\n stderr: AsyncIterable<string>;\n\n /** Promise that resolves when command completes */\n wait(): Promise<CommandResult>;\n\n /** Kill the running command */\n kill(): Promise<void>;\n}\n\n/**\n * File info in sandbox filesystem\n */\nexport interface SandboxFile {\n path: string;\n name: string;\n size: number;\n isDirectory: boolean;\n modifiedAt?: Date;\n}\n\n/**\n * Sandbox provider interface\n *\n * All sandbox providers must implement this interface to be compatible\n * with the Agent SDK Harness runtime system.\n */\nexport interface SandboxProvider {\n /** Provider name (e.g., 'modal', 'e2b', 'fly') */\n readonly name: string;\n\n /** Provider display name */\n readonly displayName: string;\n\n /** Whether the provider is available (SDK installed, credentials set) */\n isAvailable(): Promise<boolean>;\n\n /**\n * Create a new sandbox instance\n */\n createSandbox(config: SandboxConfig): Promise<Sandbox>;\n\n /**\n * Get sandbox by ID\n */\n getSandbox(sandboxId: string): Promise<Sandbox | null>;\n\n /**\n * List all sandboxes\n */\n listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]>;\n\n /**\n * Destroy a sandbox\n */\n destroySandbox(sandboxId: string): Promise<void>;\n\n /**\n * Pause a sandbox (if supported)\n */\n pauseSandbox?(sandboxId: string): Promise<void>;\n\n /**\n * Resume a paused sandbox (if supported)\n */\n resumeSandbox?(sandboxId: string): Promise<void>;\n\n /**\n * Execute a command in the sandbox\n */\n executeCommand(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult>;\n\n /**\n * Execute a command with streaming output\n */\n executeCommandStream?(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandStream>;\n\n /**\n * Write a file to the sandbox\n */\n writeFile(\n sandboxId: string,\n path: string,\n content: string | Buffer\n ): Promise<void>;\n\n /**\n * Read a file from the sandbox\n */\n readFile(sandboxId: string, path: string): Promise<string>;\n\n /**\n * List files in a directory\n */\n listFiles?(sandboxId: string, path: string): Promise<SandboxFile[]>;\n\n /**\n * Delete a file or directory\n */\n deleteFile?(sandboxId: string, path: string): Promise<void>;\n\n /**\n * Get sandbox logs\n */\n getLogs?(\n sandboxId: string,\n options?: {\n since?: Date;\n tail?: number;\n }\n ): Promise<string>;\n\n /**\n * Open a WebSocket connection to the sandbox\n */\n openWebSocket?(\n sandboxId: string,\n path?: string\n ): Promise<WebSocket>;\n\n /**\n * Get the public URL for a sandbox port\n */\n getPortUrl?(sandboxId: string, port: number): Promise<string | null>;\n}\n\n/**\n * Provider factory function type\n */\nexport type ProviderFactory<TConfig = Record<string, unknown>> = (\n config: TConfig\n) => SandboxProvider;\n\n/**\n * Provider credentials configuration\n */\nexport interface ProviderCredentials {\n /** API key or token */\n apiKey?: string;\n\n /** API secret */\n apiSecret?: string;\n\n /** Organization/team ID */\n organizationId?: string;\n\n /** Project ID */\n projectId?: string;\n\n /** Custom API endpoint */\n apiEndpoint?: string;\n}\n\n/**\n * Common error types for providers\n */\nexport class SandboxError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly provider: string,\n public readonly sandboxId?: string\n ) {\n super(message);\n this.name = 'SandboxError';\n }\n}\n\nexport class SandboxNotFoundError extends SandboxError {\n constructor(provider: string, sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, 'SANDBOX_NOT_FOUND', provider, sandboxId);\n this.name = 'SandboxNotFoundError';\n }\n}\n\nexport class SandboxTimeoutError extends SandboxError {\n constructor(provider: string, sandboxId: string, timeoutMs: number) {\n super(\n `Sandbox operation timed out after ${timeoutMs}ms`,\n 'SANDBOX_TIMEOUT',\n provider,\n sandboxId\n );\n this.name = 'SandboxTimeoutError';\n }\n}\n\nexport class ProviderNotAvailableError extends SandboxError {\n constructor(provider: string, reason?: string) {\n super(\n `Provider ${provider} is not available${reason ? `: ${reason}` : ''}`,\n 'PROVIDER_NOT_AVAILABLE',\n provider\n );\n this.name = 'ProviderNotAvailableError';\n }\n}\n","/**\n * Local Provider\n *\n * Runs agents directly on the host machine without any sandboxing.\n * This is the default behavior when no sandbox provider is configured.\n *\n * WARNING: This provides NO isolation. The agent has full access to:\n * - Your filesystem\n * - Your network\n * - Your environment variables\n * - Any processes on your machine\n *\n * Only use this for development/testing with trusted agents.\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n CommandStream,\n SandboxFile,\n ProviderCredentials,\n} from './types.js';\nimport { SandboxNotFoundError } from './types.js';\n\n/**\n * Local provider configuration\n */\nexport interface LocalConfig extends ProviderCredentials {\n /** Working directory for the sandbox (defaults to temp directory) */\n workingDirectory?: string;\n\n /** Shell to use for command execution */\n shell?: string;\n\n /** Environment variables to set */\n env?: Record<string, string>;\n}\n\n/**\n * Track running processes for a sandbox\n */\ninterface LocalSandboxInstance {\n sandbox: Sandbox;\n workingDirectory: string;\n env: Record<string, string>;\n processes: Map<string, ChildProcess>;\n}\n\n/**\n * Local provider - runs directly on host machine\n */\nexport class LocalProvider implements SandboxProvider {\n readonly name = 'local';\n readonly displayName = 'Local (No Sandbox)';\n\n private config: LocalConfig;\n private sandboxes: Map<string, LocalSandboxInstance> = new Map();\n\n constructor(config: LocalConfig = {}) {\n this.config = {\n workingDirectory: config.workingDirectory,\n shell: config.shell ?? process.platform === 'win32' ? 'cmd.exe' : '/bin/bash',\n env: config.env ?? {},\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n // Local provider is always available\n return true;\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const sandboxId = config.id ?? `local-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Create working directory\n let workingDirectory = config.workingDirectory ?? this.config.workingDirectory;\n if (!workingDirectory) {\n const os = await import('os');\n workingDirectory = path.join(os.tmpdir(), 'harness-sandbox', sandboxId);\n await fs.mkdir(workingDirectory, { recursive: true });\n }\n\n // Merge environment variables\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n ...this.config.env,\n ...config.env,\n };\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n workingDirectory,\n warning: 'Running locally without sandboxing - agent has full system access',\n },\n };\n\n this.sandboxes.set(sandboxId, {\n sandbox,\n workingDirectory,\n env,\n processes: new Map(),\n });\n\n // Run startup command if provided\n if (config.command && config.command.length > 0) {\n await this.executeCommand(sandboxId, config.command.join(' '));\n }\n\n return sandbox;\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n const instance = this.sandboxes.get(sandboxId);\n return instance?.sandbox ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values()).map((i) => i.sandbox);\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Kill all running processes\n for (const proc of instance.processes.values()) {\n proc.kill('SIGTERM');\n }\n\n instance.sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const cwd = options?.cwd\n ? path.resolve(instance.workingDirectory, options.cwd)\n : instance.workingDirectory;\n\n const env = {\n ...instance.env,\n ...options?.env,\n };\n\n const proc = spawn(command, {\n shell: this.config.shell,\n cwd,\n env,\n timeout: options?.timeout,\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n resolve({\n exitCode: code ?? 0,\n stdout,\n stderr,\n durationMs: Date.now() - startTime,\n });\n });\n\n proc.on('error', (error) => {\n resolve({\n exitCode: 1,\n stdout,\n stderr: error.message,\n durationMs: Date.now() - startTime,\n });\n });\n });\n }\n\n async executeCommandStream(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandStream> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const cwd = options?.cwd\n ? path.resolve(instance.workingDirectory, options.cwd)\n : instance.workingDirectory;\n\n const env = {\n ...instance.env,\n ...options?.env,\n };\n\n const proc = spawn(command, {\n shell: this.config.shell,\n cwd,\n env,\n timeout: options?.timeout,\n });\n\n const procId = `proc-${Date.now()}`;\n instance.processes.set(procId, proc);\n\n let stdout = '';\n let stderr = '';\n let exitCode = 0;\n let resolved = false;\n\n const stdoutChunks: string[] = [];\n const stderrChunks: string[] = [];\n\n proc.stdout?.on('data', (data) => {\n const chunk = data.toString();\n stdout += chunk;\n stdoutChunks.push(chunk);\n });\n\n proc.stderr?.on('data', (data) => {\n const chunk = data.toString();\n stderr += chunk;\n stderrChunks.push(chunk);\n });\n\n const waitPromise = new Promise<CommandResult>((resolve) => {\n proc.on('close', (code) => {\n exitCode = code ?? 0;\n resolved = true;\n instance.processes.delete(procId);\n resolve({ exitCode, stdout, stderr });\n });\n\n proc.on('error', (error) => {\n exitCode = 1;\n stderr += error.message;\n resolved = true;\n instance.processes.delete(procId);\n resolve({ exitCode, stdout, stderr });\n });\n });\n\n return {\n stdout: (async function* (): AsyncGenerator<string, void, unknown> {\n let index = 0;\n while (!resolved || index < stdoutChunks.length) {\n if (index < stdoutChunks.length) {\n const chunk = stdoutChunks[index++];\n if (chunk !== undefined) {\n yield chunk;\n }\n } else {\n await new Promise((r) => setTimeout(r, 50));\n }\n }\n })(),\n stderr: (async function* (): AsyncGenerator<string, void, unknown> {\n let index = 0;\n while (!resolved || index < stderrChunks.length) {\n if (index < stderrChunks.length) {\n const chunk = stderrChunks[index++];\n if (chunk !== undefined) {\n yield chunk;\n }\n } else {\n await new Promise((r) => setTimeout(r, 50));\n }\n }\n })(),\n wait: () => waitPromise,\n kill: async () => {\n proc.kill('SIGTERM');\n },\n };\n }\n\n async writeFile(\n sandboxId: string,\n filePath: string,\n content: string | Buffer\n ): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const fullPath = path.resolve(instance.workingDirectory, filePath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content);\n }\n\n async readFile(sandboxId: string, filePath: string): Promise<string> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const fullPath = path.resolve(instance.workingDirectory, filePath);\n return fs.readFile(fullPath, 'utf-8');\n }\n\n async listFiles(sandboxId: string, dirPath: string): Promise<SandboxFile[]> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const fullPath = path.resolve(instance.workingDirectory, dirPath);\n const entries = await fs.readdir(fullPath, { withFileTypes: true });\n\n const files: SandboxFile[] = [];\n for (const entry of entries) {\n const stat = await fs.stat(path.join(fullPath, entry.name));\n files.push({\n path: path.join(dirPath, entry.name),\n name: entry.name,\n size: stat.size,\n isDirectory: entry.isDirectory(),\n modifiedAt: stat.mtime,\n });\n }\n\n return files;\n }\n\n async deleteFile(sandboxId: string, filePath: string): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const fullPath = path.resolve(instance.workingDirectory, filePath);\n await fs.rm(fullPath, { recursive: true, force: true });\n }\n\n async getLogs(\n sandboxId: string,\n _options?: {\n since?: Date;\n tail?: number;\n }\n ): Promise<string> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n return `[Local Sandbox ${sandboxId}] No centralized logs - output is returned directly from commands`;\n }\n}\n\n/**\n * Create a local provider instance\n */\nexport function createLocalProvider(config?: LocalConfig): LocalProvider {\n return new LocalProvider(config);\n}\n","/**\n * Modal Sandbox Provider\n *\n * Integration with Modal's serverless container platform.\n * Modal provides GPU support, fast cold starts, and automatic scaling.\n *\n * @see https://modal.com/docs/guide/sandbox\n * @see https://modal.com/docs/reference/modal.Sandbox\n *\n * Required environment variables:\n * - MODAL_TOKEN_ID: Modal API token ID\n * - MODAL_TOKEN_SECRET: Modal API token secret\n *\n * Install: pip install modal (Python SDK, used via subprocess)\n * Or use the Modal REST API directly\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError } from './types.js';\n\n/**\n * Modal-specific configuration\n */\nexport interface ModalConfig extends ProviderCredentials {\n /** Modal app name */\n appName?: string;\n\n /** Default image (e.g., 'python:3.11-slim') */\n defaultImage?: string;\n\n /** GPU type (e.g., 'T4', 'A10G', 'A100') */\n gpu?: string;\n\n /** Region preference */\n region?: string;\n\n /** Use Modal's built-in Claude Code image */\n useClaudeCodeImage?: boolean;\n}\n\n/**\n * Modal sandbox provider\n */\nexport class ModalProvider implements SandboxProvider {\n readonly name = 'modal';\n readonly displayName = 'Modal';\n\n private config: ModalConfig;\n private sandboxes: Map<string, Sandbox> = new Map();\n\n constructor(config: ModalConfig = {}) {\n this.config = {\n apiKey: config.apiKey ?? process.env.MODAL_TOKEN_ID,\n apiSecret: config.apiSecret ?? process.env.MODAL_TOKEN_SECRET,\n appName: config.appName ?? 'agent-sdk-harness',\n defaultImage: config.defaultImage ?? 'python:3.11-slim',\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n // Check if Modal credentials are configured\n if (!this.config.apiKey || !this.config.apiSecret) {\n return false;\n }\n\n try {\n // Try to import modal Python package or check API\n const { execSync } = await import('child_process');\n execSync('python -c \"import modal\"', { stdio: 'ignore' });\n return true;\n } catch {\n // Modal Python SDK not installed, try REST API\n return !!(this.config.apiKey && this.config.apiSecret);\n }\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'Modal credentials not configured. Set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET.'\n );\n }\n\n const sandboxId = config.id ?? `modal-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Build Modal sandbox configuration\n const modalConfig = {\n image: config.image ?? this.config.defaultImage,\n cpu: config.resources?.cpu ?? '1',\n memory: config.resources?.memory ?? '1Gi',\n gpu: config.resources?.gpu ?? this.config.gpu,\n timeout: config.resources?.timeout ?? 3600,\n workdir: config.workingDirectory ?? '/workspace',\n env: {\n ...config.env,\n ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY ?? '',\n },\n network_file_systems: config.mounts?.map((m) => ({\n mount_path: m.destination,\n network_file_system: m.source,\n read_only: m.readOnly,\n })),\n };\n\n // Create sandbox via Modal API/CLI\n // In production, this would use the Modal Python SDK or REST API\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n modalConfig,\n appName: this.config.appName,\n },\n };\n\n this.sandboxes.set(sandboxId, sandbox);\n\n // In real implementation:\n // const result = await this.callModalApi('sandboxes.create', modalConfig);\n // sandbox.url = result.url;\n // sandbox.metadata.modalSandboxId = result.sandbox_id;\n\n return sandbox;\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n return this.sandboxes.get(sandboxId) ?? null;\n }\n\n async listSandboxes(options: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n } = {}): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values());\n\n if (options.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (sandbox) {\n sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n // In real implementation:\n // await this.callModalApi('sandboxes.terminate', { sandbox_id: sandboxId });\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n return {\n exitCode: 1,\n stdout: '',\n stderr: `Sandbox ${sandboxId} not found`,\n };\n }\n\n // In real implementation, execute via Modal API:\n // const result = await this.callModalApi('sandboxes.exec', {\n // sandbox_id: sandboxId,\n // command: command,\n // cwd: _options?.cwd,\n // env: _options?.env,\n // timeout: _options?.timeout,\n // });\n\n // Simulated response for now\n return {\n exitCode: 0,\n stdout: `[Modal Sandbox ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: 100,\n };\n }\n\n async writeFile(\n _sandboxId: string,\n _path: string,\n _content: string | Buffer\n ): Promise<void> {\n // In real implementation:\n // await this.callModalApi('sandboxes.write_file', {\n // sandbox_id: sandboxId,\n // path,\n // content: Buffer.isBuffer(content) ? content.toString('base64') : content,\n // });\n }\n\n async readFile(_sandboxId: string, path: string): Promise<string> {\n // In real implementation:\n // const result = await this.callModalApi('sandboxes.read_file', {\n // sandbox_id: sandboxId,\n // path,\n // });\n // return result.content;\n\n return `[Modal] File content from ${path}`;\n }\n\n /**\n * Modal-specific: Get GPU information\n */\n async getGpuInfo(_sandboxId: string): Promise<{\n type: string;\n memory: string;\n utilization: number;\n } | null> {\n // Modal provides GPU introspection\n return null;\n }\n\n /**\n * Modal-specific: Snapshot sandbox for faster restarts\n */\n async createSnapshot(sandboxId: string): Promise<string> {\n // Modal supports container snapshots for faster cold starts\n const timestamp = Date.now();\n return `snapshot-${sandboxId}-${timestamp}`;\n }\n}\n\n/**\n * Create a Modal provider instance\n */\nexport function createModalProvider(config?: ModalConfig): ModalProvider {\n return new ModalProvider(config);\n}\n","/**\n * E2B Sandbox Provider\n *\n * Integration with E2B's cloud sandbox platform for AI agents.\n * E2B specializes in secure code execution environments.\n *\n * @see https://e2b.dev/docs\n * @see https://github.com/e2b-dev/e2b\n *\n * Required environment variables:\n * - E2B_API_KEY: E2B API key\n *\n * Install: npm install @e2b/code-interpreter (or @e2b/sdk)\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n CommandStream,\n SandboxFile,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError, SandboxNotFoundError } from './types.js';\n\n/**\n * E2B-specific configuration\n */\nexport interface E2BConfig extends ProviderCredentials {\n /** E2B template ID (pre-built environment) */\n templateId?: string;\n\n /** Use the code interpreter template */\n useCodeInterpreter?: boolean;\n\n /** Custom Dockerfile for the sandbox */\n dockerfile?: string;\n\n /** Sandbox timeout in seconds (max 24 hours) */\n timeout?: number;\n\n /** Keep sandbox alive between requests */\n keepAlive?: boolean;\n}\n\n/**\n * E2B sandbox provider\n */\nexport class E2BProvider implements SandboxProvider {\n readonly name = 'e2b';\n readonly displayName = 'E2B';\n\n private config: E2BConfig;\n private sandboxes: Map<string, Sandbox> = new Map();\n\n constructor(config: E2BConfig = {}) {\n this.config = {\n apiKey: config.apiKey ?? process.env.E2B_API_KEY,\n templateId: config.templateId ?? 'base',\n timeout: config.timeout ?? 300,\n keepAlive: config.keepAlive ?? false,\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n // E2B requires an API key to function\n // The SDK (@e2b/code-interpreter or @e2b/sdk) is optional\n // and loaded dynamically when sandbox operations are called\n return !!this.config.apiKey;\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'E2B API key not configured or SDK not installed. Set E2B_API_KEY and install @e2b/code-interpreter.'\n );\n }\n\n const sandboxId = config.id ?? `e2b-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n try {\n // Create E2B sandbox\n // const e2bSandbox = await this.e2bSdk.Sandbox.create({\n // template: this.config.templateId,\n // apiKey: this.config.apiKey,\n // timeout: config.resources?.timeout ?? this.config.timeout,\n // envVars: {\n // ...config.env,\n // ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY ?? '',\n // },\n // cwd: config.workingDirectory ?? '/home/user',\n // });\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n templateId: this.config.templateId,\n // e2bSandboxId: e2bSandbox.id,\n // hostUrl: e2bSandbox.getHostname(),\n },\n };\n\n this.sandboxes.set(sandboxId, sandbox);\n return sandbox;\n } catch (error) {\n throw new Error(\n `Failed to create E2B sandbox: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n return this.sandboxes.get(sandboxId) ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values());\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // await e2bSandbox.close();\n\n sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // const result = await e2bSandbox.process.start({\n // cmd: command,\n // cwd: _options?.cwd,\n // envVars: _options?.env,\n // timeout: _options?.timeout,\n // });\n // await result.wait();\n // return {\n // exitCode: result.exitCode,\n // stdout: result.stdout,\n // stderr: result.stderr,\n // };\n\n return {\n exitCode: 0,\n stdout: `[E2B Sandbox ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: 100,\n };\n }\n\n async executeCommandStream(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandStream> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation, E2B supports streaming:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // const process = await e2bSandbox.process.start({\n // cmd: command,\n // onStdout: (data) => { /* stream */ },\n // onStderr: (data) => { /* stream */ },\n // });\n\n const stdoutChunks: string[] = [`[E2B] Executing: ${command}\\n`];\n const stderrChunks: string[] = [];\n\n return {\n stdout: (async function* () {\n for (const chunk of stdoutChunks) {\n yield chunk;\n }\n })(),\n stderr: (async function* () {\n for (const chunk of stderrChunks) {\n yield chunk;\n }\n })(),\n async wait() {\n return {\n exitCode: 0,\n stdout: stdoutChunks.join(''),\n stderr: stderrChunks.join(''),\n };\n },\n async kill() {\n // process.kill();\n },\n };\n }\n\n async writeFile(\n sandboxId: string,\n _path: string,\n _content: string | Buffer\n ): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // await e2bSandbox.filesystem.write(_path, _content);\n }\n\n async readFile(sandboxId: string, path: string): Promise<string> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // return await e2bSandbox.filesystem.read(path);\n\n return `[E2B] File content from ${path}`;\n }\n\n async listFiles(sandboxId: string, _path: string): Promise<SandboxFile[]> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // const files = await e2bSandbox.filesystem.list(_path);\n // return files.map(f => ({ ... }));\n\n return [];\n }\n\n /**\n * E2B-specific: Run Python code directly (Code Interpreter)\n */\n async runPython(_sandboxId: string, code: string): Promise<{\n result: unknown;\n stdout: string;\n stderr: string;\n }> {\n // E2B Code Interpreter provides direct Python execution\n // const e2bSandbox = await this.e2bSdk.Sandbox.connect(sandbox.metadata?.e2bSandboxId);\n // const result = await e2bSandbox.runPython(code);\n // return result;\n\n return {\n result: null,\n stdout: `[E2B Python] ${code}`,\n stderr: '',\n };\n }\n\n /**\n * E2B-specific: Install Python packages\n */\n async installPackages(sandboxId: string, packages: string[]): Promise<void> {\n await this.executeCommand(sandboxId, `pip install ${packages.join(' ')}`);\n }\n\n /**\n * E2B-specific: Upload a file from local filesystem\n */\n async uploadFile(\n sandboxId: string,\n localPath: string,\n remotePath: string\n ): Promise<void> {\n const fs = await import('fs/promises');\n const content = await fs.readFile(localPath);\n await this.writeFile(sandboxId, remotePath, content);\n }\n\n /**\n * E2B-specific: Download a file to local filesystem\n */\n async downloadFile(\n sandboxId: string,\n remotePath: string,\n localPath: string\n ): Promise<void> {\n const fs = await import('fs/promises');\n const content = await this.readFile(sandboxId, remotePath);\n await fs.writeFile(localPath, content);\n }\n}\n\n/**\n * Create an E2B provider instance\n */\nexport function createE2BProvider(config?: E2BConfig): E2BProvider {\n return new E2BProvider(config);\n}\n","/**\n * Cloudflare Sandbox Provider\n *\n * Integration with Cloudflare's container sandbox platform.\n * Cloudflare Sandboxes run on Cloudflare's edge network for low latency.\n *\n * @see https://github.com/cloudflare/sandbox-sdk\n * @see https://developers.cloudflare.com/workers/\n *\n * Required environment variables:\n * - CLOUDFLARE_API_TOKEN: Cloudflare API token\n * - CLOUDFLARE_ACCOUNT_ID: Cloudflare account ID\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError, SandboxNotFoundError } from './types.js';\n\n/**\n * Cloudflare-specific configuration\n */\nexport interface CloudflareConfig extends ProviderCredentials {\n /** Cloudflare account ID */\n accountId?: string;\n\n /** Worker name prefix */\n workerPrefix?: string;\n\n /** Use Durable Objects for state persistence */\n useDurableObjects?: boolean;\n\n /** Edge location preference */\n location?: string;\n\n /** Container image */\n image?: string;\n}\n\n/**\n * Cloudflare sandbox provider\n */\nexport class CloudflareProvider implements SandboxProvider {\n readonly name = 'cloudflare';\n readonly displayName = 'Cloudflare Sandboxes';\n\n private config: CloudflareConfig;\n private sandboxes: Map<string, Sandbox> = new Map();\n\n constructor(config: CloudflareConfig = {}) {\n this.config = {\n apiKey: config.apiKey ?? process.env.CLOUDFLARE_API_TOKEN,\n accountId: config.accountId ?? process.env.CLOUDFLARE_ACCOUNT_ID,\n workerPrefix: config.workerPrefix ?? 'agent-sandbox',\n useDurableObjects: config.useDurableObjects ?? true,\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n return !!(this.config.apiKey && this.config.accountId);\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'Cloudflare credentials not configured. Set CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID.'\n );\n }\n\n const sandboxId = config.id ?? `cf-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // In real implementation, use Cloudflare Sandbox SDK:\n // import { Sandbox } from '@anthropic-ai/cloudflare-sandbox';\n // const cfSandbox = await Sandbox.create({\n // accountId: this.config.accountId,\n // apiToken: this.config.apiKey,\n // image: config.image ?? this.config.image,\n // env: config.env,\n // });\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n accountId: this.config.accountId,\n workerName: `${this.config.workerPrefix}-${sandboxId}`,\n location: this.config.location,\n },\n };\n\n this.sandboxes.set(sandboxId, sandbox);\n return sandbox;\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n return this.sandboxes.get(sandboxId) ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values());\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // await cfSandbox.destroy();\n\n sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const result = await cfSandbox.exec(command, _options);\n\n return {\n exitCode: 0,\n stdout: `[Cloudflare Sandbox ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: 50,\n };\n }\n\n async writeFile(\n sandboxId: string,\n _path: string,\n _content: string | Buffer\n ): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // await cfSandbox.writeFile(_path, _content);\n }\n\n async readFile(sandboxId: string, path: string): Promise<string> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // return await cfSandbox.readFile(path);\n\n return `[Cloudflare] File content from ${path}`;\n }\n\n /**\n * Cloudflare-specific: Get edge location info\n */\n async getEdgeInfo(_sandboxId: string): Promise<{\n colo: string;\n country: string;\n city: string;\n } | null> {\n return null;\n }\n\n /**\n * Cloudflare-specific: Access Durable Objects storage\n */\n async getDurableObjectStorage(_sandboxId: string): Promise<{\n get(key: string): Promise<unknown>;\n put(key: string, value: unknown): Promise<void>;\n delete(key: string): Promise<void>;\n } | null> {\n if (!this.config.useDurableObjects) {\n return null;\n }\n\n // Return a Durable Objects-like interface\n return null;\n }\n}\n\n/**\n * Create a Cloudflare provider instance\n */\nexport function createCloudflareProvider(config?: CloudflareConfig): CloudflareProvider {\n return new CloudflareProvider(config);\n}\n","/**\n * Fly.io Machines Provider\n *\n * Integration with Fly.io's Machines API for container orchestration.\n * Fly Machines provide fast startup, global distribution, and scale-to-zero.\n *\n * @see https://fly.io/docs/machines/\n * @see https://fly.io/docs/machines/api/\n *\n * Required environment variables:\n * - FLY_API_TOKEN: Fly.io API token\n * - FLY_APP_NAME: Fly.io app name (optional)\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError, SandboxNotFoundError } from './types.js';\n\n/**\n * Fly.io-specific configuration\n */\nexport interface FlyConfig extends ProviderCredentials {\n /** Fly.io app name */\n appName?: string;\n\n /** Default region (e.g., 'iad', 'lax', 'ams') */\n region?: string;\n\n /** Machine size preset */\n size?: 'shared-cpu-1x' | 'shared-cpu-2x' | 'shared-cpu-4x' | 'performance-1x' | 'performance-2x';\n\n /** Auto-stop after idle timeout (seconds) */\n autoStopTimeout?: number;\n\n /** Auto-destroy machines on exit */\n autoDestroy?: boolean;\n}\n\n/**\n * Fly.io Machines sandbox provider\n */\nexport class FlyProvider implements SandboxProvider {\n readonly name = 'fly';\n readonly displayName = 'Fly.io Machines';\n\n private config: FlyConfig;\n private sandboxes: Map<string, Sandbox> = new Map();\n // API base for Fly Machines: https://api.machines.dev/v1\n\n constructor(config: FlyConfig = {}) {\n this.config = {\n apiKey: config.apiKey ?? process.env.FLY_API_TOKEN,\n appName: config.appName ?? process.env.FLY_APP_NAME ?? 'agent-sandbox',\n region: config.region ?? 'iad',\n size: config.size ?? 'shared-cpu-1x',\n autoStopTimeout: config.autoStopTimeout ?? 300,\n autoDestroy: config.autoDestroy ?? true,\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n return !!this.config.apiKey;\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'Fly.io API token not configured. Set FLY_API_TOKEN.'\n );\n }\n\n const sandboxId = config.id ?? `fly-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Machine configuration - used in real implementation\n // const machineConfig = {\n // name: config.name ?? sandboxId,\n // region: this.config.region,\n // config: {\n // image: config.image ?? 'node:20-slim',\n // env: { ...config.env, ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },\n // guest: this.getGuestConfig(),\n // auto_destroy: this.config.autoDestroy,\n // services: config.network?.exposedPorts?.map((port) => ({\n // ports: [{ port, handlers: ['http'] }],\n // protocol: 'tcp',\n // internal_port: port,\n // })),\n // },\n // };\n // const machine = await this._flyApi('POST', `/apps/${this.config.appName}/machines`, machineConfig);\n void config; // Mark as used\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n appName: this.config.appName,\n region: this.config.region,\n // machineId: machine.id,\n },\n };\n\n this.sandboxes.set(sandboxId, sandbox);\n return sandbox;\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n return this.sandboxes.get(sandboxId) ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n // In real implementation:\n // const machines = await this.flyApi('GET', `/apps/${this.config.appName}/machines`);\n\n let sandboxes = Array.from(this.sandboxes.values());\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // await this.flyApi('DELETE', `/apps/${this.config.appName}/machines/${sandbox.metadata?.machineId}?force=true`);\n\n sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async pauseSandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Fly Machines support stop (pause equivalent)\n // await this.flyApi('POST', `/apps/${this.config.appName}/machines/${sandbox.metadata?.machineId}/stop`);\n\n sandbox.status = 'paused';\n }\n\n async resumeSandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // await this.flyApi('POST', `/apps/${this.config.appName}/machines/${sandbox.metadata?.machineId}/start`);\n\n sandbox.status = 'running';\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Fly Machines execute commands via the exec endpoint\n // In real implementation:\n // const result = await this._flyApi('POST', `/apps/${this.config.appName}/machines/${machineId}/exec`, {\n // cmd: command.split(' '),\n // timeout: _options?.timeout ?? 60,\n // });\n\n return {\n exitCode: 0,\n stdout: `[Fly Machine ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: 100,\n };\n }\n\n async writeFile(\n sandboxId: string,\n path: string,\n content: string | Buffer\n ): Promise<void> {\n // Write file via exec: echo content > path\n const encoded = Buffer.isBuffer(content)\n ? content.toString('base64')\n : Buffer.from(content).toString('base64');\n\n await this.executeCommand(\n sandboxId,\n `echo '${encoded}' | base64 -d > ${path}`\n );\n }\n\n async readFile(sandboxId: string, path: string): Promise<string> {\n const result = await this.executeCommand(sandboxId, `cat ${path}`);\n return result.stdout;\n }\n\n /**\n * Fly-specific: Get machine metrics\n */\n async getMachineMetrics(_sandboxId: string): Promise<{\n cpu: number;\n memory: number;\n network: { rx: number; tx: number };\n } | null> {\n // In real implementation:\n // const metrics = await this._flyApi('GET', `/apps/${this.config.appName}/machines/${machineId}/metrics`);\n return null;\n }\n\n /**\n * Fly-specific: Clone machine to another region\n */\n async cloneToRegion(sandboxId: string, region: string): Promise<Sandbox> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // const cloned = await this.flyApi('POST', `/apps/${this.config.appName}/machines/${machineId}/clone`, {\n // region,\n // });\n\n return this.createSandbox({\n ...sandbox.metadata,\n id: `${sandboxId}-${region}`,\n } as SandboxConfig);\n }\n\n /**\n * Fly-specific: Get public URL for exposed port\n */\n async getPortUrl(sandboxId: string, port: number): Promise<string | null> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n return null;\n }\n\n // Fly provides URLs like: https://{app}.fly.dev\n return `https://${this.config.appName}.fly.dev:${port}`;\n }\n}\n\n/**\n * Create a Fly.io provider instance\n */\nexport function createFlyProvider(config?: FlyConfig): FlyProvider {\n return new FlyProvider(config);\n}\n","/**\n * Daytona Sandbox Provider\n *\n * Integration with Daytona's development environment platform.\n * Daytona provides standardized development environments with\n * pre-configured toolchains and IDE integration.\n *\n * @see https://www.daytona.io/\n * @see https://github.com/daytonaio/daytona\n *\n * Required environment variables:\n * - DAYTONA_API_KEY: Daytona API key\n * - DAYTONA_SERVER_URL: Daytona server URL (for self-hosted)\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n SandboxFile,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError, SandboxNotFoundError } from './types.js';\n\n/**\n * Daytona-specific configuration\n */\nexport interface DaytonaConfig extends ProviderCredentials {\n /** Daytona server URL (for self-hosted instances) */\n serverUrl?: string;\n\n /** Default project configuration */\n defaultProject?: string;\n\n /** IDE to use (vscode, jetbrains, vim) */\n ide?: 'vscode' | 'jetbrains' | 'vim' | 'none';\n\n /** Git provider for project templates */\n gitProvider?: 'github' | 'gitlab' | 'bitbucket';\n\n /** Default devcontainer configuration */\n devcontainerPath?: string;\n}\n\n/**\n * Daytona sandbox provider\n */\nexport class DaytonaProvider implements SandboxProvider {\n readonly name = 'daytona';\n readonly displayName = 'Daytona';\n\n private config: DaytonaConfig;\n private sandboxes: Map<string, Sandbox> = new Map();\n\n constructor(config: DaytonaConfig = {}) {\n this.config = {\n apiKey: config.apiKey ?? process.env.DAYTONA_API_KEY,\n serverUrl: config.serverUrl ?? process.env.DAYTONA_SERVER_URL ?? 'https://api.daytona.io',\n ide: config.ide ?? 'none',\n ...config,\n };\n }\n\n async isAvailable(): Promise<boolean> {\n if (!this.config.apiKey) {\n return false;\n }\n\n // Check if Daytona CLI is installed or API is accessible\n try {\n const { execSync } = await import('child_process');\n execSync('daytona version', { stdio: 'ignore' });\n return true;\n } catch {\n // CLI not installed, check API availability\n return !!this.config.apiKey;\n }\n }\n\n // Daytona API helper - used in real implementation\n // private async daytonaApi(method: string, path: string, body?: unknown): Promise<unknown>\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'Daytona not configured. Set DAYTONA_API_KEY or install the Daytona CLI.'\n );\n }\n\n const sandboxId = config.id ?? `daytona-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // In real implementation, workspace config would be:\n // { name, ide, env, devcontainer, resources: { cpu, memory, disk } }\n // const workspace = await this.daytonaApi('POST', '/workspaces', workspaceConfig);\n void config; // Mark as used\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n createdAt: new Date(),\n metadata: {\n serverUrl: this.config.serverUrl,\n ide: this.config.ide,\n // workspaceId: workspace.id,\n // sshUrl: workspace.ssh_url,\n },\n };\n\n this.sandboxes.set(sandboxId, sandbox);\n return sandbox;\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n return this.sandboxes.get(sandboxId) ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values());\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // In real implementation:\n // await this.daytonaApi('DELETE', `/workspaces/${sandbox.metadata?.workspaceId}`);\n\n sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async pauseSandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Daytona supports workspace suspension\n // await this.daytonaApi('POST', `/workspaces/${sandbox.metadata?.workspaceId}/stop`);\n\n sandbox.status = 'paused';\n }\n\n async resumeSandbox(sandboxId: string): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // await this.daytonaApi('POST', `/workspaces/${sandbox.metadata?.workspaceId}/start`);\n\n sandbox.status = 'running';\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n _options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Daytona executes via SSH or API\n // In real implementation:\n // const result = await this.daytonaApi('POST', `/workspaces/${workspaceId}/exec`, {\n // command,\n // cwd: options?.cwd,\n // env: options?.env,\n // });\n\n return {\n exitCode: 0,\n stdout: `[Daytona Workspace ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: 100,\n };\n }\n\n async writeFile(\n sandboxId: string,\n _path: string,\n _content: string | Buffer\n ): Promise<void> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Daytona provides file sync capabilities\n // await this.daytonaApi('PUT', `/workspaces/${workspaceId}/files/${encodeURIComponent(path)}`, {\n // content: Buffer.isBuffer(content) ? content.toString('base64') : content,\n // });\n }\n\n async readFile(sandboxId: string, path: string): Promise<string> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // const result = await this.daytonaApi('GET', `/workspaces/${workspaceId}/files/${encodeURIComponent(path)}`);\n // return result.content;\n\n return `[Daytona] File content from ${path}`;\n }\n\n async listFiles(sandboxId: string, _path: string): Promise<SandboxFile[]> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // const files = await this.daytonaApi('GET', `/workspaces/${workspaceId}/files?path=${encodeURIComponent(path)}`);\n\n return [];\n }\n\n /**\n * Daytona-specific: Get SSH connection info\n */\n async getSshInfo(sandboxId: string): Promise<{\n host: string;\n port: number;\n user: string;\n privateKey?: string;\n } | null> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) {\n return null;\n }\n\n // Daytona provides SSH access to workspaces\n return null;\n }\n\n /**\n * Daytona-specific: Open IDE in browser\n */\n async openIde(sandboxId: string): Promise<string | null> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox || this.config.ide === 'none') {\n return null;\n }\n\n // Returns URL to browser-based IDE\n // return `${this.config.serverUrl}/workspaces/${sandbox.metadata?.workspaceId}/ide`;\n return null;\n }\n\n /**\n * Daytona-specific: Clone from Git repository\n */\n async createFromGit(\n repoUrl: string,\n options?: {\n branch?: string;\n devcontainerPath?: string;\n }\n ): Promise<Sandbox> {\n return this.createSandbox({\n name: repoUrl.split('/').pop()?.replace('.git', '') ?? 'workspace',\n providerOptions: {\n gitRepo: repoUrl,\n gitBranch: options?.branch ?? 'main',\n devcontainer: options?.devcontainerPath,\n },\n });\n }\n\n /**\n * Daytona-specific: Share workspace with collaborators\n */\n async shareWorkspace(\n sandboxId: string,\n _users: string[]\n ): Promise<{ shareUrl: string }> {\n // Daytona supports workspace sharing\n return { shareUrl: `${this.config.serverUrl}/share/${sandboxId}` };\n }\n}\n\n/**\n * Create a Daytona provider instance\n */\nexport function createDaytonaProvider(config?: DaytonaConfig): DaytonaProvider {\n return new DaytonaProvider(config);\n}\n","/**\n * Vercel Sandbox Provider\n *\n * Integration with Vercel's ephemeral sandbox platform for AI agents.\n * Vercel Sandbox provides secure, isolated Linux VMs for running untrusted code.\n *\n * @see https://vercel.com/docs/vercel-sandbox\n * @see https://vercel.com/docs/vercel-sandbox/cli-reference\n *\n * Required environment variables:\n * - VERCEL_TOKEN: Vercel API access token\n * - VERCEL_TEAM_ID: Vercel team ID (optional for personal accounts)\n * - VERCEL_PROJECT_ID: Vercel project ID\n *\n * Or use OIDC authentication when running on Vercel infrastructure.\n *\n * Install: npm install @vercel/sdk\n */\n\nimport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n CommandResult,\n CommandStream,\n SandboxFile,\n ProviderCredentials,\n} from './types.js';\nimport { ProviderNotAvailableError, SandboxNotFoundError } from './types.js';\n\n/**\n * Vercel-specific configuration\n */\nexport interface VercelConfig extends ProviderCredentials {\n /** Vercel API token (or use OIDC) */\n apiToken?: string;\n\n /** Vercel team ID */\n teamId?: string;\n\n /** Vercel project ID */\n projectId?: string;\n\n /** Runtime environment: 'node22' or 'python3.13' */\n runtime?: 'node22' | 'python3.13';\n\n /** Default timeout in seconds (max varies by plan) */\n timeout?: number;\n\n /** Ports to expose for public URL access */\n exposedPorts?: number[];\n\n /** Use OIDC authentication (automatic when on Vercel) */\n useOidc?: boolean;\n}\n\n/**\n * Internal type for tracking Vercel SDK sandbox instances\n */\ninterface VercelSandboxInstance {\n sandbox: Sandbox;\n sdkInstance?: unknown; // The actual @vercel/sdk Sandbox instance\n}\n\n/**\n * Vercel Sandbox provider\n */\nexport class VercelProvider implements SandboxProvider {\n readonly name = 'vercel';\n readonly displayName = 'Vercel Sandbox';\n\n private config: VercelConfig;\n private sandboxes: Map<string, VercelSandboxInstance> = new Map();\n private vercelSdk: { Sandbox: VercelSandboxClass } | null = null;\n\n constructor(config: VercelConfig = {}) {\n this.config = {\n apiToken: config.apiToken ?? process.env.VERCEL_TOKEN,\n teamId: config.teamId ?? process.env.VERCEL_TEAM_ID,\n projectId: config.projectId ?? process.env.VERCEL_PROJECT_ID,\n runtime: config.runtime ?? 'node22',\n timeout: config.timeout ?? 300, // 5 minutes default\n useOidc: config.useOidc ?? false,\n ...config,\n };\n }\n\n /**\n * Dynamically import the Vercel SDK\n */\n private async loadSdk(): Promise<{ Sandbox: VercelSandboxClass } | null> {\n if (this.vercelSdk) {\n return this.vercelSdk;\n }\n\n try {\n // Dynamic import to avoid hard dependency\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sdk = await (Function('return import(\"@vercel/sdk\")')() as Promise<unknown>);\n this.vercelSdk = sdk as { Sandbox: VercelSandboxClass };\n return this.vercelSdk;\n } catch {\n return null;\n }\n }\n\n async isAvailable(): Promise<boolean> {\n // Check for OIDC (automatic on Vercel infrastructure)\n // VERCEL env var is set when running on Vercel, OIDC is automatic\n const isOnVercel = !!process.env.VERCEL;\n if (this.config.useOidc || process.env.VERCEL_OIDC_TOKEN || isOnVercel) {\n return true;\n }\n\n // Check for API token authentication\n if (this.config.apiToken && this.config.projectId) {\n return true;\n }\n\n // Check if SDK is installed (for local development with `vercel sandbox login`)\n const sdk = await this.loadSdk();\n if (!sdk) {\n return false;\n }\n\n return !!(this.config.apiToken || process.env.VERCEL_OIDC_TOKEN);\n }\n\n async createSandbox(config: SandboxConfig): Promise<Sandbox> {\n const available = await this.isAvailable();\n if (!available) {\n throw new ProviderNotAvailableError(\n this.name,\n 'Vercel credentials not configured. Set VERCEL_TOKEN, VERCEL_PROJECT_ID, and optionally VERCEL_TEAM_ID. Or install @vercel/sdk and run on Vercel for OIDC auth.'\n );\n }\n\n const sandboxId = config.id ?? `vercel-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n try {\n const sdk = await this.loadSdk();\n let sdkInstance: unknown = undefined;\n let url: string | undefined;\n let vercelSandboxId: string | undefined;\n\n if (sdk) {\n // Use the Vercel SDK\n const createOptions: VercelSandboxCreateOptions = {};\n\n // Configure authentication\n if (!this.config.useOidc && this.config.apiToken) {\n createOptions.client = {\n apiToken: this.config.apiToken,\n teamId: this.config.teamId,\n projectId: this.config.projectId,\n };\n }\n\n // Create the sandbox\n const vercelSandbox = await sdk.Sandbox.create(createOptions);\n sdkInstance = vercelSandbox;\n url = vercelSandbox.url;\n vercelSandboxId = vercelSandbox.id;\n\n // Set environment variables\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n await vercelSandbox.run(`export ${key}=\"${value}\"`);\n }\n }\n\n // Run startup command if specified\n if (config.command && config.command.length > 0) {\n await vercelSandbox.run(config.command.join(' '));\n }\n }\n\n const sandbox: Sandbox = {\n id: sandboxId,\n provider: this.name,\n status: 'running',\n url,\n createdAt: new Date(),\n metadata: {\n vercelSandboxId,\n runtime: this.config.runtime,\n teamId: this.config.teamId,\n projectId: this.config.projectId,\n },\n };\n\n this.sandboxes.set(sandboxId, { sandbox, sdkInstance });\n return sandbox;\n } catch (error) {\n throw new Error(\n `Failed to create Vercel sandbox: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getSandbox(sandboxId: string): Promise<Sandbox | null> {\n const instance = this.sandboxes.get(sandboxId);\n return instance?.sandbox ?? null;\n }\n\n async listSandboxes(options?: {\n status?: SandboxStatus;\n labels?: Record<string, string>;\n limit?: number;\n }): Promise<Sandbox[]> {\n let sandboxes = Array.from(this.sandboxes.values()).map((i) => i.sandbox);\n\n if (options?.status) {\n sandboxes = sandboxes.filter((s) => s.status === options.status);\n }\n\n if (options?.limit) {\n sandboxes = sandboxes.slice(0, options.limit);\n }\n\n return sandboxes;\n }\n\n async destroySandbox(sandboxId: string): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n try {\n // Stop the Vercel sandbox\n if (instance.sdkInstance) {\n const vercelSandbox = instance.sdkInstance as VercelSandboxInstance['sdkInstance'] & {\n stop: () => Promise<void>;\n };\n await vercelSandbox.stop();\n }\n } catch {\n // Ignore errors during cleanup\n }\n\n instance.sandbox.status = 'stopped';\n this.sandboxes.delete(sandboxId);\n }\n\n async executeCommand(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const startTime = Date.now();\n\n try {\n if (instance.sdkInstance) {\n const vercelSandbox = instance.sdkInstance as {\n run: (cmd: string) => Promise<{ stdout: string; stderr: string; exitCode: number }>;\n };\n\n // Build command with cwd and env if provided\n let fullCommand = command;\n if (options?.cwd) {\n fullCommand = `cd \"${options.cwd}\" && ${command}`;\n }\n if (options?.env) {\n const envPrefix = Object.entries(options.env)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n\n const result = await vercelSandbox.run(fullCommand);\n\n return {\n exitCode: result.exitCode ?? 0,\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n durationMs: Date.now() - startTime,\n };\n }\n\n // Simulated response when SDK not available\n return {\n exitCode: 0,\n stdout: `[Vercel Sandbox ${sandboxId}] Would execute: ${command}`,\n stderr: '',\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n exitCode: 1,\n stdout: '',\n stderr: error instanceof Error ? error.message : 'Unknown error',\n durationMs: Date.now() - startTime,\n };\n }\n }\n\n async executeCommandStream(\n sandboxId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandStream> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Vercel SDK currently doesn't have native streaming support in the same way\n // as some other providers. We execute and return the result as a single chunk.\n const resultPromise = this.executeCommand(sandboxId, command, options);\n\n const stdoutChunks: string[] = [];\n const stderrChunks: string[] = [];\n let resolved = false;\n let result: CommandResult | null = null;\n\n // Start execution\n resultPromise.then((r) => {\n result = r;\n if (r.stdout) stdoutChunks.push(r.stdout);\n if (r.stderr) stderrChunks.push(r.stderr);\n resolved = true;\n });\n\n return {\n stdout: (async function* () {\n while (!resolved) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n for (const chunk of stdoutChunks) {\n yield chunk;\n }\n })(),\n stderr: (async function* () {\n while (!resolved) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n for (const chunk of stderrChunks) {\n yield chunk;\n }\n })(),\n async wait() {\n await resultPromise;\n return result!;\n },\n async kill() {\n // Vercel sandboxes can be stopped but individual commands can't be killed\n // The sandbox itself would need to be destroyed\n },\n };\n }\n\n async writeFile(\n sandboxId: string,\n path: string,\n content: string | Buffer\n ): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Write file using shell command\n const contentStr = Buffer.isBuffer(content) ? content.toString('base64') : content;\n const isBase64 = Buffer.isBuffer(content);\n\n if (isBase64) {\n await this.executeCommand(\n sandboxId,\n `echo \"${contentStr}\" | base64 -d > \"${path}\"`\n );\n } else {\n // Escape content for shell\n const escaped = contentStr.replace(/'/g, \"'\\\\''\");\n await this.executeCommand(sandboxId, `cat > \"${path}\" << 'VERCEL_EOF'\\n${escaped}\\nVERCEL_EOF`);\n }\n }\n\n async readFile(sandboxId: string, path: string): Promise<string> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const result = await this.executeCommand(sandboxId, `cat \"${path}\"`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n return result.stdout;\n }\n\n async listFiles(sandboxId: string, path: string): Promise<SandboxFile[]> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n const result = await this.executeCommand(\n sandboxId,\n `ls -la \"${path}\" 2>/dev/null || echo \"\"`\n );\n\n if (result.exitCode !== 0 || !result.stdout.trim()) {\n return [];\n }\n\n // Parse ls output\n const lines = result.stdout.split('\\n').slice(1); // Skip \"total X\" line\n const files: SandboxFile[] = [];\n\n for (const line of lines) {\n const match = line.match(\n /^([d-])([rwx-]{9})\\s+\\d+\\s+\\w+\\s+\\w+\\s+(\\d+)\\s+(\\w+\\s+\\d+\\s+[\\d:]+)\\s+(.+)$/\n );\n if (match) {\n const [, type, , size, , name] = match;\n if (name && name !== '.' && name !== '..' && size) {\n files.push({\n path: `${path}/${name}`.replace(/\\/+/g, '/'),\n name,\n size: parseInt(size, 10),\n isDirectory: type === 'd',\n });\n }\n }\n }\n\n return files;\n }\n\n async deleteFile(sandboxId: string, path: string): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n await this.executeCommand(sandboxId, `rm -rf \"${path}\"`);\n }\n\n async getLogs(\n sandboxId: string,\n _options?: {\n since?: Date;\n tail?: number;\n }\n ): Promise<string> {\n // Vercel Sandbox logs are available via the dashboard\n // We can check command history from our local tracking\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n return `[Vercel Sandbox ${sandboxId}] Logs available in Vercel Dashboard > Observability > Sandboxes`;\n }\n\n async getPortUrl(sandboxId: string, port: number): Promise<string | null> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n // Vercel sandboxes expose ports via their URL\n if (instance.sandbox.url) {\n return `${instance.sandbox.url}:${port}`;\n }\n\n return null;\n }\n\n /**\n * Vercel-specific: Extend sandbox timeout\n */\n async extendTimeout(sandboxId: string, additionalSeconds: number): Promise<void> {\n const instance = this.sandboxes.get(sandboxId);\n if (!instance) {\n throw new SandboxNotFoundError(this.name, sandboxId);\n }\n\n if (instance.sdkInstance) {\n const vercelSandbox = instance.sdkInstance as {\n extendTimeout: (ms: number) => Promise<void>;\n };\n await vercelSandbox.extendTimeout(additionalSeconds * 1000);\n }\n }\n\n /**\n * Vercel-specific: Install system packages via yum\n */\n async installSystemPackages(sandboxId: string, packages: string[]): Promise<CommandResult> {\n return this.executeCommand(\n sandboxId,\n `sudo yum install -y ${packages.join(' ')}`\n );\n }\n\n /**\n * Vercel-specific: Install Node.js packages\n */\n async installNodePackages(sandboxId: string, packages: string[]): Promise<CommandResult> {\n return this.executeCommand(sandboxId, `npm install ${packages.join(' ')}`);\n }\n\n /**\n * Vercel-specific: Install Python packages\n */\n async installPythonPackages(sandboxId: string, packages: string[]): Promise<CommandResult> {\n return this.executeCommand(sandboxId, `pip install ${packages.join(' ')}`);\n }\n\n /**\n * Vercel-specific: Clone a repository\n */\n async cloneRepository(\n sandboxId: string,\n repoUrl: string,\n options?: {\n branch?: string;\n destination?: string;\n token?: string;\n }\n ): Promise<CommandResult> {\n let url = repoUrl;\n\n // Inject token for private repos\n if (options?.token && repoUrl.startsWith('https://github.com/')) {\n url = repoUrl.replace(\n 'https://github.com/',\n `https://${options.token}@github.com/`\n );\n }\n\n let command = `git clone ${url}`;\n if (options?.branch) {\n command += ` -b ${options.branch}`;\n }\n if (options?.destination) {\n command += ` \"${options.destination}\"`;\n }\n\n return this.executeCommand(sandboxId, command);\n }\n}\n\n/**\n * Create a Vercel provider instance\n */\nexport function createVercelProvider(config?: VercelConfig): VercelProvider {\n return new VercelProvider(config);\n}\n\n/**\n * Type definitions for Vercel SDK (for dynamic import)\n */\ninterface VercelSandboxCreateOptions {\n client?: {\n apiToken?: string;\n teamId?: string;\n projectId?: string;\n };\n repo?: string;\n auth?: { token: string };\n}\n\ninterface VercelSandboxClass {\n create(options?: VercelSandboxCreateOptions): Promise<{\n id: string;\n url: string;\n run(command: string): Promise<{ stdout: string; stderr: string; exitCode: number }>;\n stop(): Promise<void>;\n extendTimeout(ms: number): Promise<void>;\n }>;\n}\n","/**\n * Sandbox Providers\n *\n * Third-party sandbox provider integrations for the Agent SDK Harness.\n * Each provider implements the SandboxProvider interface for consistent usage.\n *\n * @example\n * ```typescript\n * import { createE2BProvider, createModalProvider } from '@conviction-labs/harness-core';\n *\n * // Use E2B for development\n * const devProvider = createE2BProvider({ apiKey: process.env.E2B_API_KEY });\n *\n * // Use Modal for production with GPU\n * const prodProvider = createModalProvider({ gpu: 'T4' });\n *\n * // Create sandbox\n * const sandbox = await provider.createSandbox({\n * name: 'my-agent',\n * resources: { memory: '2Gi', cpu: '2' },\n * env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },\n * });\n *\n * // Execute commands\n * const result = await provider.executeCommand(sandbox.id, 'npm install');\n *\n * // Clean up\n * await provider.destroySandbox(sandbox.id);\n * ```\n */\n\n// Types\nexport type {\n SandboxProvider,\n SandboxConfig,\n Sandbox,\n SandboxStatus,\n SandboxResources,\n SandboxNetwork,\n SandboxMount,\n CommandResult,\n CommandStream,\n SandboxFile,\n ProviderCredentials,\n ProviderFactory,\n} from './types.js';\n\nexport {\n SandboxError,\n SandboxNotFoundError,\n SandboxTimeoutError,\n ProviderNotAvailableError,\n} from './types.js';\n\n// Providers\nexport { LocalProvider, createLocalProvider, type LocalConfig } from './local.js';\nexport { ModalProvider, createModalProvider, type ModalConfig } from './modal.js';\nexport { E2BProvider, createE2BProvider, type E2BConfig } from './e2b.js';\nexport { CloudflareProvider, createCloudflareProvider, type CloudflareConfig } from './cloudflare.js';\nexport { FlyProvider, createFlyProvider, type FlyConfig } from './fly.js';\nexport { DaytonaProvider, createDaytonaProvider, type DaytonaConfig } from './daytona.js';\nexport { VercelProvider, createVercelProvider, type VercelConfig } from './vercel.js';\n\n/**\n * Available provider names\n * - 'local': Run directly on host machine (no sandboxing, full system access)\n * - 'vercel': Vercel Sandbox (ephemeral Linux VMs)\n * - 'e2b': E2B cloud sandboxes\n * - 'modal': Modal serverless containers\n * - 'cloudflare': Cloudflare Workers\n * - 'fly': Fly.io machines\n * - 'daytona': Daytona dev environments\n */\nexport const PROVIDER_NAMES = ['local', 'vercel', 'modal', 'e2b', 'cloudflare', 'fly', 'daytona'] as const;\nexport type ProviderName = (typeof PROVIDER_NAMES)[number];\n\n/**\n * Provider registry for dynamic provider selection\n */\nimport { createLocalProvider } from './local.js';\nimport { createModalProvider } from './modal.js';\nimport { createE2BProvider } from './e2b.js';\nimport { createCloudflareProvider } from './cloudflare.js';\nimport { createFlyProvider } from './fly.js';\nimport { createDaytonaProvider } from './daytona.js';\nimport { createVercelProvider } from './vercel.js';\nimport type { SandboxProvider, ProviderCredentials } from './types.js';\n\nconst providerFactories: Record<ProviderName, (config?: ProviderCredentials) => SandboxProvider> = {\n local: createLocalProvider,\n vercel: createVercelProvider,\n modal: createModalProvider,\n e2b: createE2BProvider,\n cloudflare: createCloudflareProvider,\n fly: createFlyProvider,\n daytona: createDaytonaProvider,\n};\n\n/**\n * Create a provider by name\n */\nexport function createProvider(\n name: ProviderName,\n config?: ProviderCredentials\n): SandboxProvider {\n const factory = providerFactories[name];\n if (!factory) {\n throw new Error(`Unknown provider: ${name}. Available: ${PROVIDER_NAMES.join(', ')}`);\n }\n return factory(config);\n}\n\n/**\n * Get the first available provider\n */\nexport async function getAvailableProvider(\n preferredOrder: ProviderName[] = ['vercel', 'e2b', 'modal', 'fly', 'cloudflare', 'daytona', 'local']\n): Promise<SandboxProvider | null> {\n for (const name of preferredOrder) {\n const provider = createProvider(name);\n if (await provider.isAvailable()) {\n return provider;\n }\n }\n return null;\n}\n\n/**\n * Check which providers are available\n */\nexport async function getAvailableProviders(): Promise<ProviderName[]> {\n const available: ProviderName[] = [];\n\n for (const name of PROVIDER_NAMES) {\n const provider = createProvider(name);\n if (await provider.isAvailable()) {\n available.push(name);\n }\n }\n\n return available;\n}\n","/**\n * Sandbox Manager\n *\n * Manages sandbox lifecycle for agent execution. This module bridges\n * the gap between agent sessions and sandbox providers.\n *\n * The manager:\n * 1. Creates sandboxes based on configuration\n * 2. Runs startup scripts to prepare the environment\n * 3. Sets environment variables\n * 4. Provides the execution context to the agent\n * 5. Cleans up sandboxes when sessions end\n */\n\nimport {\n createProvider,\n createLocalProvider,\n type ProviderName,\n type SandboxProvider,\n type Sandbox,\n type SandboxConfig,\n type CommandResult,\n} from './providers/index.js';\n\n/**\n * Sandbox execution configuration\n */\nexport interface SandboxExecutionConfig {\n /** Provider to use (defaults to 'local') */\n provider: ProviderName;\n\n /** Provider-specific credentials */\n credentials?: {\n /** Vercel */\n vercel?: {\n apiToken?: string;\n teamId?: string;\n projectId?: string;\n };\n /** E2B */\n e2b?: {\n apiKey?: string;\n };\n /** Modal */\n modal?: {\n tokenId?: string;\n tokenSecret?: string;\n };\n };\n\n /** Environment variables to set in the sandbox */\n envVars?: Record<string, string>;\n\n /** Startup script to run when sandbox is created */\n startupScript?: string;\n\n /** Resource limits */\n resources?: {\n memory?: string;\n cpu?: string;\n timeout?: number;\n };\n\n /** Working directory inside the sandbox */\n workingDirectory?: string;\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_SANDBOX_EXECUTION_CONFIG: SandboxExecutionConfig = {\n provider: 'local',\n envVars: {},\n};\n\n/**\n * Active sandbox session\n */\nexport interface ActiveSandbox {\n id: string;\n sessionId: string;\n provider: SandboxProvider;\n sandbox: Sandbox;\n config: SandboxExecutionConfig;\n createdAt: Date;\n}\n\n/**\n * Manages sandbox instances for agent sessions\n */\nexport class SandboxManager {\n private activeSandboxes: Map<string, ActiveSandbox> = new Map();\n\n /**\n * Create a sandbox for an agent session\n */\n async createSandbox(\n sessionId: string,\n config: SandboxExecutionConfig = DEFAULT_SANDBOX_EXECUTION_CONFIG\n ): Promise<ActiveSandbox> {\n // Check if sandbox already exists for this session\n const existing = this.activeSandboxes.get(sessionId);\n if (existing) {\n return existing;\n }\n\n // Create the provider\n const provider = this.createProviderFromConfig(config);\n\n // Check if provider is available\n const available = await provider.isAvailable();\n if (!available) {\n // Fall back to local if configured provider isn't available\n if (config.provider !== 'local') {\n console.warn(\n `Provider '${config.provider}' not available, falling back to 'local'`\n );\n return this.createSandbox(sessionId, {\n ...config,\n provider: 'local',\n });\n }\n throw new Error('No sandbox provider available');\n }\n\n // Build sandbox configuration\n const sandboxConfig: SandboxConfig = {\n id: `sandbox-${sessionId}`,\n name: `session-${sessionId}`,\n env: {\n // Include ANTHROPIC_API_KEY from environment if not explicitly set\n ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY ?? '',\n ...config.envVars,\n },\n workingDirectory: config.workingDirectory ?? '/tmp/agent-workspace',\n resources: {\n memory: config.resources?.memory,\n cpu: config.resources?.cpu,\n timeout: config.resources?.timeout ?? 3600, // 1 hour default\n },\n };\n\n // Create the sandbox\n const sandbox = await provider.createSandbox(sandboxConfig);\n\n // Run startup script if provided\n if (config.startupScript) {\n const result = await this.runStartupScript(provider, sandbox.id, config.startupScript);\n if (result.exitCode !== 0) {\n console.error(`Startup script failed with exit code ${result.exitCode}`);\n console.error('stdout:', result.stdout);\n console.error('stderr:', result.stderr);\n // Don't fail - agent might still be able to run\n }\n }\n\n const activeSandbox: ActiveSandbox = {\n id: sandbox.id,\n sessionId,\n provider,\n sandbox,\n config,\n createdAt: new Date(),\n };\n\n this.activeSandboxes.set(sessionId, activeSandbox);\n return activeSandbox;\n }\n\n /**\n * Get sandbox for a session\n */\n getSandbox(sessionId: string): ActiveSandbox | undefined {\n return this.activeSandboxes.get(sessionId);\n }\n\n /**\n * Execute a command in a session's sandbox\n */\n async executeCommand(\n sessionId: string,\n command: string,\n options?: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n }\n ): Promise<CommandResult> {\n const activeSandbox = this.activeSandboxes.get(sessionId);\n if (!activeSandbox) {\n throw new Error(`No sandbox found for session ${sessionId}`);\n }\n\n return activeSandbox.provider.executeCommand(\n activeSandbox.sandbox.id,\n command,\n options\n );\n }\n\n /**\n * Destroy a session's sandbox\n */\n async destroySandbox(sessionId: string): Promise<void> {\n const activeSandbox = this.activeSandboxes.get(sessionId);\n if (!activeSandbox) {\n return; // Already destroyed or never existed\n }\n\n try {\n await activeSandbox.provider.destroySandbox(activeSandbox.sandbox.id);\n } catch (error) {\n console.error(`Failed to destroy sandbox for session ${sessionId}:`, error);\n }\n\n this.activeSandboxes.delete(sessionId);\n }\n\n /**\n * Destroy all sandboxes (cleanup on shutdown)\n */\n async destroyAll(): Promise<void> {\n const sessions = Array.from(this.activeSandboxes.keys());\n await Promise.all(sessions.map((sessionId) => this.destroySandbox(sessionId)));\n }\n\n /**\n * Get all active sandboxes\n */\n listActiveSandboxes(): ActiveSandbox[] {\n return Array.from(this.activeSandboxes.values());\n }\n\n /**\n * Create a provider instance from configuration\n */\n private createProviderFromConfig(config: SandboxExecutionConfig): SandboxProvider {\n const providerName = config.provider;\n\n switch (providerName) {\n case 'local':\n return createLocalProvider({\n env: config.envVars,\n workingDirectory: config.workingDirectory,\n });\n\n case 'vercel':\n return createProvider('vercel', {\n apiKey: config.credentials?.vercel?.apiToken,\n organizationId: config.credentials?.vercel?.teamId,\n projectId: config.credentials?.vercel?.projectId,\n });\n\n case 'e2b':\n return createProvider('e2b', {\n apiKey: config.credentials?.e2b?.apiKey,\n });\n\n case 'modal':\n return createProvider('modal', {\n apiKey: config.credentials?.modal?.tokenId,\n apiSecret: config.credentials?.modal?.tokenSecret,\n });\n\n default:\n return createProvider(providerName);\n }\n }\n\n /**\n * Run startup script in sandbox\n */\n private async runStartupScript(\n provider: SandboxProvider,\n sandboxId: string,\n script: string\n ): Promise<CommandResult> {\n // Split script into lines and run each command\n const lines = script.split('\\n').filter((line) => {\n const trimmed = line.trim();\n return trimmed && !trimmed.startsWith('#');\n });\n\n let lastResult: CommandResult = {\n exitCode: 0,\n stdout: '',\n stderr: '',\n };\n\n for (const line of lines) {\n lastResult = await provider.executeCommand(sandboxId, line);\n if (lastResult.exitCode !== 0) {\n // Return on first failure\n return lastResult;\n }\n }\n\n return lastResult;\n }\n}\n\n/**\n * Global sandbox manager instance\n */\nlet globalSandboxManager: SandboxManager | null = null;\n\n/**\n * Get the global sandbox manager instance\n */\nexport function getSandboxManager(): SandboxManager {\n if (!globalSandboxManager) {\n globalSandboxManager = new SandboxManager();\n }\n return globalSandboxManager;\n}\n\n/**\n * Create a new sandbox manager instance\n */\nexport function createSandboxManager(): SandboxManager {\n return new SandboxManager();\n}\n","/**\n * Pre-Warmed Sandbox Pool\n *\n * Maintains a pool of ready-to-use Vercel sandboxes with the Claude SDK\n * pre-installed. This eliminates cold-start latency when users start new chats.\n *\n * Features:\n * - Configurable pool size (min/max sandboxes)\n * - Automatic SDK pre-installation during warmup\n * - Proactive replacement of sandboxes nearing expiry\n * - Background maintenance loop for pool health\n * - Metrics and observability support\n *\n * @example\n * ```typescript\n * // Initialize the pool (typically at server startup)\n * await initializeSandboxPool({ minPoolSize: 2, sandboxTimeout: 900 });\n *\n * // Pool is now automatically used by getOrCreateSandbox()\n *\n * // Shutdown (at server shutdown)\n * await shutdownSandboxPool();\n * ```\n */\n\nimport { Writable } from 'stream';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Type for Vercel Sandbox instance (from @vercel/sandbox)\n */\ninterface VercelSandboxInstance {\n readonly sandboxId: string;\n runCommand(options: {\n cmd: string;\n args?: string[];\n env?: Record<string, string>;\n sudo?: boolean;\n stdout?: Writable;\n stderr?: Writable;\n }): Promise<{\n exitCode: number;\n stdout(): Promise<string>;\n stderr(): Promise<string>;\n }>;\n stop(): Promise<void>;\n}\n\n/**\n * Configuration for the sandbox pool\n */\nexport interface SandboxPoolConfig {\n /** Minimum number of warm sandboxes to maintain (default: 2) */\n minPoolSize?: number;\n\n /** Maximum number of warm sandboxes to maintain (default: 5) */\n maxPoolSize?: number;\n\n /** Sandbox timeout in seconds (default: 900 = 15 minutes) */\n sandboxTimeout?: number;\n\n /** How close to expiry (in ms) before marking ineligible (default: 120000 = 2 min) */\n expiryThresholdMs?: number;\n\n /** How often to check pool health (in ms) (default: 30000 = 30 sec) */\n maintenanceIntervalMs?: number;\n\n /** Vercel sandbox runtime (default: 'node22') */\n runtime?: 'node22' | 'python3.13';\n\n /** Number of vCPUs per sandbox (default: 4) */\n vcpus?: number;\n\n /** Environment variables to pre-set in warm sandboxes */\n baseEnvVars?: Record<string, string>;\n\n /**\n * URL to a pre-built tarball containing node_modules with dependencies.\n * When provided, skips npm install during warmup for much faster startup.\n * Build with: harness/scripts/build-sandbox-base.sh\n */\n baseTarballUrl?: string;\n}\n\n/**\n * Resolved configuration with all defaults applied\n */\ninterface ResolvedSandboxPoolConfig {\n minPoolSize: number;\n maxPoolSize: number;\n sandboxTimeout: number;\n expiryThresholdMs: number;\n maintenanceIntervalMs: number;\n runtime: 'node22' | 'python3.13';\n vcpus: number;\n baseEnvVars: Record<string, string>;\n baseTarballUrl: string | null;\n}\n\n/**\n * Represents a pre-warmed sandbox in the pool\n */\nexport interface PooledSandbox {\n /** The Vercel sandbox instance */\n sandbox: VercelSandboxInstance;\n\n /** Unique identifier for this sandbox */\n sandboxId: string;\n\n /** When the sandbox was created */\n createdAt: number;\n\n /** When the sandbox will expire (based on Vercel timeout) */\n expiresAt: number;\n\n /** Whether SDK has been installed */\n sdkInstalled: boolean;\n\n /** Whether the sandbox is eligible for assignment (not near expiry) */\n eligible: boolean;\n\n /** If assigned, the session ID it's assigned to */\n assignedTo?: string;\n\n /** Last successful heartbeat timestamp */\n lastHeartbeat?: number;\n}\n\n/**\n * Pool status for observability\n */\nexport interface SandboxPoolStatus {\n /** Total sandboxes in pool (assigned + unassigned) */\n total: number;\n\n /** Sandboxes available for assignment */\n available: number;\n\n /** Sandboxes currently assigned to sessions */\n assigned: number;\n\n /** Sandboxes marked ineligible (near expiry) */\n ineligible: number;\n\n /** Sandboxes currently being created (warming) */\n warming: number;\n\n /** Whether the pool is running */\n running: boolean;\n\n /** Last maintenance cycle timestamp */\n lastMaintenanceAt: number | null;\n\n /** Configuration */\n config: {\n minPoolSize: number;\n maxPoolSize: number;\n sandboxTimeout: number;\n expiryThresholdMs: number;\n };\n}\n\n/**\n * Metrics callback for observability\n */\nexport type SandboxPoolMetricsCallback = (\n event:\n | 'sandbox_created'\n | 'sandbox_assigned'\n | 'sandbox_released'\n | 'sandbox_expired'\n | 'sandbox_destroyed'\n | 'pool_maintenance'\n | 'warmup_started'\n | 'warmup_completed'\n | 'warmup_failed',\n data: Record<string, unknown>\n) => void;\n\n// =============================================================================\n// WARMUP SCRIPT\n// =============================================================================\n\n/**\n * Script run during sandbox warmup to pre-install all dependencies.\n * This is the critical step that eliminates cold-start latency.\n */\nconst WARMUP_SCRIPT = `\nset -e\n\n# Install system dependencies (try multiple package managers for compatibility)\necho \"[warmup] Installing system dependencies...\"\nwhich jq || sudo dnf install -y jq 2>/dev/null || (sudo apt-get update && sudo apt-get install -y jq) 2>/dev/null || sudo apk add jq 2>/dev/null || true\nwhich git || sudo dnf install -y git 2>/dev/null || sudo apt-get install -y git 2>/dev/null || sudo apk add git 2>/dev/null || true\nwhich ffmpeg || sudo dnf install -y ffmpeg 2>/dev/null || sudo apt-get install -y ffmpeg 2>/dev/null || sudo apk add ffmpeg 2>/dev/null || true\n\n# Initialize npm project\necho \"[warmup] Initializing npm project...\"\nnpm init -y\n\n# Install Claude Agent SDK\necho \"[warmup] Installing @anthropic-ai/claude-agent-sdk...\"\nnpm install @anthropic-ai/claude-agent-sdk\n\n# Verify installation\necho \"[warmup] Verifying installation...\"\nnode -e \"require('@anthropic-ai/claude-agent-sdk'); console.log('[warmup] SDK verified successfully')\"\n\necho \"[warmup] Warmup complete!\"\n`;\n\n// =============================================================================\n// SANDBOX POOL CLASS\n// =============================================================================\n\n/**\n * Pre-warmed sandbox pool manager\n *\n * Maintains a pool of ready-to-use Vercel sandboxes with the Claude SDK\n * pre-installed. This eliminates cold-start latency when users start new chats.\n */\nexport class SandboxPool {\n private config: ResolvedSandboxPoolConfig;\n private pool: Map<string, PooledSandbox> = new Map();\n private warmingInProgress: Set<string> = new Set();\n private maintenanceIntervalId: ReturnType<typeof setInterval> | null = null;\n private running = false;\n private lastMaintenanceAt: number | null = null;\n private metricsCallback?: SandboxPoolMetricsCallback;\n private startPromise: Promise<void> | null = null;\n\n constructor(config: SandboxPoolConfig = {}) {\n this.config = {\n minPoolSize: config.minPoolSize ?? parseInt(process.env.SANDBOX_POOL_MIN_SIZE ?? '2'),\n maxPoolSize: config.maxPoolSize ?? parseInt(process.env.SANDBOX_POOL_MAX_SIZE ?? '5'),\n sandboxTimeout: config.sandboxTimeout ?? parseInt(process.env.SANDBOX_TIMEOUT ?? '900'),\n expiryThresholdMs:\n config.expiryThresholdMs ?? parseInt(process.env.SANDBOX_EXPIRY_THRESHOLD_MS ?? '120000'),\n maintenanceIntervalMs:\n config.maintenanceIntervalMs ??\n parseInt(process.env.SANDBOX_POOL_MAINTENANCE_MS ?? '30000'),\n runtime: config.runtime ?? 'node22',\n vcpus: config.vcpus ?? 4,\n baseEnvVars: config.baseEnvVars ?? {},\n baseTarballUrl: config.baseTarballUrl ?? process.env.SANDBOX_BASE_TARBALL_URL ?? null,\n };\n }\n\n /**\n * Start the pool and begin warming sandboxes\n */\n async start(): Promise<void> {\n if (this.running) {\n console.log('[POOL] Pool already running');\n return;\n }\n\n // If start is already in progress, wait for it\n if (this.startPromise) {\n return this.startPromise;\n }\n\n this.startPromise = this.doStart();\n try {\n await this.startPromise;\n } finally {\n this.startPromise = null;\n }\n }\n\n private async doStart(): Promise<void> {\n const tarballInfo = this.config.baseTarballUrl ? ' [tarball mode]' : ' [npm install mode]';\n console.log(\n `[POOL] Starting sandbox pool (min=${this.config.minPoolSize}, max=${this.config.maxPoolSize}, timeout=${this.config.sandboxTimeout}s)${tarballInfo}`\n );\n if (this.config.baseTarballUrl) {\n console.log(`[POOL] Using base tarball: ${this.config.baseTarballUrl}`);\n }\n\n this.running = true;\n\n // Start maintenance loop\n this.maintenanceIntervalId = setInterval(() => {\n this.maintainPool().catch((error) => {\n console.error('[POOL] Maintenance error:', error);\n });\n }, this.config.maintenanceIntervalMs);\n\n // Don't keep process alive just for maintenance\n if (this.maintenanceIntervalId.unref) {\n this.maintenanceIntervalId.unref();\n }\n\n // Initial warmup - spawn minPoolSize sandboxes\n console.log(`[POOL] Spawning ${this.config.minPoolSize} initial sandbox(es)...`);\n const warmupPromises: Promise<void>[] = [];\n\n for (let i = 0; i < this.config.minPoolSize; i++) {\n warmupPromises.push(\n this.warmSandbox()\n .then((sandbox) => {\n this.pool.set(sandbox.sandboxId, sandbox);\n console.log(`[POOL] Initial sandbox ready: ${sandbox.sandboxId}`);\n })\n .catch((error) => {\n console.error('[POOL] Failed to warm initial sandbox:', error);\n })\n );\n\n // Stagger creation to avoid rate limits (1s between each)\n if (i < this.config.minPoolSize - 1) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n await Promise.all(warmupPromises);\n\n const status = this.getStatus();\n console.log(`[POOL] Pool ready: ${status.available} available, ${status.assigned} assigned`);\n }\n\n /**\n * Stop the pool and clean up all sandboxes\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n console.log('[POOL] Stopping sandbox pool...');\n this.running = false;\n\n // Stop maintenance loop\n if (this.maintenanceIntervalId) {\n clearInterval(this.maintenanceIntervalId);\n this.maintenanceIntervalId = null;\n }\n\n // Destroy all sandboxes\n const destroyPromises: Promise<void>[] = [];\n for (const [sandboxId, pooled] of this.pool.entries()) {\n destroyPromises.push(this.destroySandbox(sandboxId, pooled));\n }\n\n await Promise.all(destroyPromises);\n this.pool.clear();\n\n console.log('[POOL] Pool stopped');\n }\n\n /**\n * Check if the pool is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Acquire a pre-warmed sandbox for a session.\n * If no eligible sandbox is available, creates one on-demand.\n */\n async acquire(sessionId: string): Promise<PooledSandbox> {\n if (!this.running) {\n throw new Error('Sandbox pool is not running');\n }\n\n // Check if session already has an assigned sandbox\n for (const pooled of this.pool.values()) {\n if (pooled.assignedTo === sessionId) {\n console.log(`[POOL] Session ${sessionId} already has sandbox ${pooled.sandboxId}`);\n return pooled;\n }\n }\n\n // Find an available eligible sandbox\n const available = this.getAvailableSandbox();\n\n if (available) {\n available.assignedTo = sessionId;\n console.log(`[POOL] Acquired sandbox ${available.sandboxId} for session ${sessionId}`);\n\n this.emitMetric('sandbox_assigned', {\n sandboxId: available.sandboxId,\n sessionId,\n poolAvailable: this.getAvailableCount(),\n });\n\n // Trigger async replenishment if below min\n this.triggerReplenishment();\n\n return available;\n }\n\n // No available sandbox - create on-demand\n console.log(`[POOL] No available sandbox, creating on-demand for session ${sessionId}...`);\n const sandbox = await this.warmSandbox();\n sandbox.assignedTo = sessionId;\n this.pool.set(sandbox.sandboxId, sandbox);\n\n this.emitMetric('sandbox_assigned', {\n sandboxId: sandbox.sandboxId,\n sessionId,\n onDemand: true,\n });\n\n return sandbox;\n }\n\n /**\n * Release a sandbox from a session.\n * The sandbox is destroyed (not returned to pool) since it may have session-specific state.\n */\n async release(sessionId: string): Promise<void> {\n for (const [sandboxId, pooled] of this.pool.entries()) {\n if (pooled.assignedTo === sessionId) {\n console.log(`[POOL] Releasing sandbox ${sandboxId} from session ${sessionId}`);\n\n // Remove from pool and destroy\n this.pool.delete(sandboxId);\n await this.destroySandbox(sandboxId, pooled);\n\n this.emitMetric('sandbox_released', {\n sandboxId,\n sessionId,\n });\n\n // Trigger replenishment\n this.triggerReplenishment();\n return;\n }\n }\n\n // Session not found in pool - might have been managed outside pool\n console.log(`[POOL] Session ${sessionId} not found in pool (may be managed externally)`);\n }\n\n /**\n * Get current pool status for monitoring\n */\n getStatus(): SandboxPoolStatus {\n let available = 0;\n let assigned = 0;\n let ineligible = 0;\n\n for (const pooled of this.pool.values()) {\n if (pooled.assignedTo) {\n assigned++;\n } else if (pooled.eligible) {\n available++;\n } else {\n ineligible++;\n }\n }\n\n return {\n total: this.pool.size,\n available,\n assigned,\n ineligible,\n warming: this.warmingInProgress.size,\n running: this.running,\n lastMaintenanceAt: this.lastMaintenanceAt,\n config: {\n minPoolSize: this.config.minPoolSize,\n maxPoolSize: this.config.maxPoolSize,\n sandboxTimeout: this.config.sandboxTimeout,\n expiryThresholdMs: this.config.expiryThresholdMs,\n },\n };\n }\n\n /**\n * Register a metrics callback for observability\n */\n onMetrics(callback: SandboxPoolMetricsCallback): void {\n this.metricsCallback = callback;\n }\n\n // ===========================================================================\n // PRIVATE METHODS\n // ===========================================================================\n\n /**\n * Create and warm a new sandbox\n */\n private async warmSandbox(): Promise<PooledSandbox> {\n const warmupId = `warming-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n this.warmingInProgress.add(warmupId);\n\n this.emitMetric('warmup_started', { warmupId });\n const startTime = Date.now();\n const useTarball = !!this.config.baseTarballUrl;\n\n try {\n const { Sandbox } = await import('@vercel/sandbox');\n\n // Build sandbox creation options\n const createOptions: {\n runtime: 'node22' | 'python3.13';\n timeout: number;\n resources: { vcpus: number };\n source?: { type: 'tarball'; url: string };\n } = {\n runtime: this.config.runtime,\n timeout: this.config.sandboxTimeout * 1000, // Convert to milliseconds\n resources: { vcpus: this.config.vcpus },\n };\n\n // If tarball URL is provided, use it as the source\n if (useTarball) {\n console.log(`[POOL] Creating sandbox with pre-built tarball (timeout=${this.config.sandboxTimeout}s)...`);\n createOptions.source = {\n type: 'tarball',\n url: this.config.baseTarballUrl!,\n };\n } else {\n console.log(`[POOL] Creating sandbox (timeout=${this.config.sandboxTimeout}s)...`);\n }\n\n // Retry logic for sandbox creation - Vercel can intermittently fail with tarball errors\n const MAX_RETRIES = 3;\n const BASE_DELAY_MS = 1000;\n let sandbox: VercelSandboxInstance;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n try {\n sandbox = await Sandbox.create(createOptions);\n break; // Success, exit retry loop\n } catch (createError) {\n lastError = createError instanceof Error ? createError : new Error(String(createError));\n\n // Check if this is a retryable error (tarball uncompression failures, etc.)\n const errorMessage = lastError.message || '';\n const errorJson =\n (createError as { json?: { error?: { message?: string } } })?.json?.error?.message || '';\n const isRetryable =\n errorMessage.includes('uncompressing tarball') ||\n errorJson.includes('uncompressing tarball') ||\n errorMessage.includes('Status code 400') ||\n errorMessage.includes('Status code 500') ||\n errorMessage.includes('Status code 502') ||\n errorMessage.includes('Status code 503');\n\n if (!isRetryable || attempt === MAX_RETRIES) {\n console.error(\n `[POOL] Sandbox creation failed (attempt ${attempt}/${MAX_RETRIES}, not retrying):`,\n lastError.message\n );\n throw lastError;\n }\n\n // Exponential backoff: 1s, 2s, 4s\n const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1);\n console.warn(\n `[POOL] Sandbox creation failed (attempt ${attempt}/${MAX_RETRIES}), retrying in ${delay}ms:`,\n lastError.message\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n // TypeScript needs this assertion since we exit the loop on success or throw\n sandbox = sandbox!;\n\n if (useTarball) {\n console.log(`[POOL] Sandbox created with tarball: ${sandbox.sandboxId}, verifying installation...`);\n\n // Install system dependencies (skipped during tarball mode since warmup script doesn't run)\n const jqInstallResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', 'which jq || sudo dnf install -y jq 2>/dev/null || (sudo apt-get update && sudo apt-get install -y jq) 2>/dev/null || sudo apk add jq 2>/dev/null || true'],\n });\n if (jqInstallResult.exitCode !== 0) {\n console.warn('[POOL] Failed to install jq (non-fatal)');\n }\n\n // Install ffmpeg for media processing\n const ffmpegInstallResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', 'which ffmpeg || sudo dnf install -y ffmpeg 2>/dev/null || sudo apt-get install -y ffmpeg 2>/dev/null || sudo apk add ffmpeg 2>/dev/null || true'],\n });\n if (ffmpegInstallResult.exitCode !== 0) {\n console.warn('[POOL] Failed to install ffmpeg (non-fatal)');\n }\n\n // Quick verification that the SDK is available\n const verifyResult = await sandbox.runCommand({\n cmd: 'node',\n args: ['-e', \"require('@anthropic-ai/claude-agent-sdk'); console.log('[verify] SDK ready')\"],\n env: this.config.baseEnvVars,\n });\n\n if (verifyResult.exitCode !== 0) {\n const stderr = await verifyResult.stderr();\n console.error('[POOL] Tarball verification failed, SDK not found:', stderr);\n await sandbox.stop();\n throw new Error(`Tarball verification failed: SDK not installed. ${stderr}`);\n }\n } else {\n console.log(`[POOL] Sandbox created: ${sandbox.sandboxId}, running warmup script...`);\n\n // Run warmup script (npm install)\n const result = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', WARMUP_SCRIPT],\n env: this.config.baseEnvVars,\n });\n\n if (result.exitCode !== 0) {\n const stderr = await result.stderr();\n console.error('[POOL] Warmup failed:', stderr);\n await sandbox.stop();\n throw new Error(`Warmup failed: ${stderr}`);\n }\n }\n\n const warmupTime = Date.now() - startTime;\n const now = Date.now();\n const pooled: PooledSandbox = {\n sandbox,\n sandboxId: sandbox.sandboxId,\n createdAt: now,\n expiresAt: now + this.config.sandboxTimeout * 1000,\n sdkInstalled: true,\n eligible: true,\n lastHeartbeat: now,\n };\n\n console.log(`[POOL] Warmup completed for ${sandbox.sandboxId} (took ${warmupTime}ms)${useTarball ? ' [tarball]' : ''}`);\n\n this.emitMetric('warmup_completed', {\n sandboxId: pooled.sandboxId,\n warmupTimeMs: warmupTime,\n usedTarball: useTarball,\n });\n this.emitMetric('sandbox_created', { sandboxId: pooled.sandboxId });\n\n return pooled;\n } catch (error) {\n const warmupTime = Date.now() - startTime;\n this.emitMetric('warmup_failed', {\n error: error instanceof Error ? error.message : 'Unknown',\n warmupTimeMs: warmupTime,\n usedTarball: useTarball,\n });\n throw error;\n } finally {\n this.warmingInProgress.delete(warmupId);\n }\n }\n\n /**\n * Background maintenance loop\n */\n private async maintainPool(): Promise<void> {\n if (!this.running) return;\n\n const now = Date.now();\n this.lastMaintenanceAt = now;\n\n // Update eligibility for all sandboxes\n this.updateEligibility();\n\n // Find and destroy expired sandboxes\n const toDestroy: string[] = [];\n for (const [sandboxId, pooled] of this.pool.entries()) {\n if (now >= pooled.expiresAt) {\n toDestroy.push(sandboxId);\n }\n }\n\n for (const sandboxId of toDestroy) {\n const pooled = this.pool.get(sandboxId);\n if (pooled) {\n console.log(`[POOL] Destroying expired sandbox: ${sandboxId}`);\n this.pool.delete(sandboxId);\n await this.destroySandbox(sandboxId, pooled);\n this.emitMetric('sandbox_expired', { sandboxId });\n }\n }\n\n // Replenish if below min\n await this.replenishPool();\n\n const status = this.getStatus();\n this.emitMetric('pool_maintenance', {\n available: status.available,\n assigned: status.assigned,\n ineligible: status.ineligible,\n warming: status.warming,\n total: status.total,\n });\n\n if (status.available < this.config.minPoolSize || status.ineligible > 0) {\n console.log(\n `[POOL] Maintenance: ${status.available} available, ${status.assigned} assigned, ${status.ineligible} ineligible, ${status.warming} warming`\n );\n }\n }\n\n /**\n * Update eligibility of all sandboxes based on remaining TTL\n */\n private updateEligibility(): void {\n const now = Date.now();\n\n for (const pooled of this.pool.values()) {\n const timeRemaining = pooled.expiresAt - now;\n const wasEligible = pooled.eligible;\n\n // Mark ineligible if within expiry threshold\n pooled.eligible = timeRemaining > this.config.expiryThresholdMs;\n\n if (wasEligible && !pooled.eligible && !pooled.assignedTo) {\n console.log(\n `[POOL] Sandbox ${pooled.sandboxId} marked ineligible (expires in ${Math.round(timeRemaining / 1000)}s)`\n );\n }\n }\n }\n\n /**\n * Get an available eligible sandbox for assignment\n */\n private getAvailableSandbox(): PooledSandbox | null {\n // Find the sandbox with the most time remaining (to maximize useful lifetime)\n let best: PooledSandbox | null = null;\n\n for (const pooled of this.pool.values()) {\n if (!pooled.assignedTo && pooled.eligible) {\n if (!best || pooled.expiresAt > best.expiresAt) {\n best = pooled;\n }\n }\n }\n\n return best;\n }\n\n /**\n * Get count of available sandboxes\n */\n private getAvailableCount(): number {\n let count = 0;\n for (const pooled of this.pool.values()) {\n if (!pooled.assignedTo && pooled.eligible) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Get count of eligible sandboxes (available + assigned but still eligible)\n */\n private getEligibleCount(): number {\n let count = 0;\n for (const pooled of this.pool.values()) {\n if (pooled.eligible) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Trigger async pool replenishment if needed\n */\n private triggerReplenishment(): void {\n // Fire and forget\n this.replenishPool().catch((error) => {\n console.error('[POOL] Replenishment error:', error);\n });\n }\n\n /**\n * Replenish pool if below min size\n */\n private async replenishPool(): Promise<void> {\n const eligibleCount = this.getEligibleCount();\n const warmingCount = this.warmingInProgress.size;\n const totalProjected = eligibleCount + warmingCount;\n\n // Don't exceed max pool size\n const needed = Math.min(\n this.config.minPoolSize - totalProjected,\n this.config.maxPoolSize - this.pool.size - warmingCount\n );\n\n if (needed <= 0) return;\n\n console.log(`[POOL] Spawning ${needed} sandbox(es) to maintain pool...`);\n\n const promises: Promise<void>[] = [];\n for (let i = 0; i < needed; i++) {\n promises.push(\n this.warmSandbox()\n .then((sandbox) => {\n this.pool.set(sandbox.sandboxId, sandbox);\n console.log(`[POOL] Replenishment sandbox ready: ${sandbox.sandboxId}`);\n })\n .catch((error) => {\n console.error('[POOL] Failed to warm replenishment sandbox:', error);\n })\n );\n\n // Stagger creation to avoid rate limits\n if (i < needed - 1) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Destroy a sandbox and clean up\n */\n private async destroySandbox(sandboxId: string, pooled: PooledSandbox): Promise<void> {\n try {\n await pooled.sandbox.stop();\n this.emitMetric('sandbox_destroyed', { sandboxId });\n } catch (error) {\n console.error(`[POOL] Failed to stop sandbox ${sandboxId}:`, error);\n }\n }\n\n /**\n * Emit a metrics event\n */\n private emitMetric(\n event: Parameters<SandboxPoolMetricsCallback>[0],\n data: Record<string, unknown>\n ): void {\n if (this.metricsCallback) {\n try {\n this.metricsCallback(event, data);\n } catch (error) {\n console.error('[POOL] Metrics callback error:', error);\n }\n }\n }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\nlet globalPool: SandboxPool | null = null;\nlet initializationPromise: Promise<SandboxPool | null> | null = null;\nlet autoInitAttempted = false;\n\n/**\n * Get the global sandbox pool instance (if initialized)\n */\nexport function getSandboxPool(): SandboxPool | null {\n return globalPool;\n}\n\n/**\n * Check if the pool is enabled via environment variables\n */\nfunction isPoolEnabled(): boolean {\n // Only enable on Vercel (where sandboxes are used)\n if (!process.env.VERCEL) {\n return false;\n }\n // Explicit disable check\n if (process.env.SANDBOX_POOL_ENABLED === 'false') {\n return false;\n }\n return true;\n}\n\n/**\n * Ensure the sandbox pool is initialized (auto-initialization).\n * This is called automatically by getOrCreateSandbox().\n *\n * IMPORTANT: This is NON-BLOCKING for the first request.\n * - If pool is already ready, returns it immediately\n * - If pool is initializing, returns null (caller should create on-demand)\n * - If pool hasn't started, kicks off background init and returns null\n *\n * This ensures the first request isn't delayed by pool warmup.\n */\nexport async function ensureSandboxPoolInitialized(): Promise<SandboxPool | null> {\n // If already initialized and running, return it immediately\n if (globalPool && globalPool.isRunning()) {\n return globalPool;\n }\n\n // If pool is disabled, don't try\n if (!isPoolEnabled()) {\n return null;\n }\n\n // If we already tried auto-init and it failed, don't retry\n if (autoInitAttempted && !globalPool) {\n return null;\n }\n\n // If initialization is in progress, DON'T WAIT - return null\n // The caller will create a sandbox on-demand while pool warms up\n if (initializationPromise) {\n console.log('[POOL] Pool initialization in progress, proceeding with on-demand creation');\n return null;\n }\n\n // Start background initialization (fire and forget)\n autoInitAttempted = true;\n console.log('[POOL] Starting background pool initialization...');\n\n initializationPromise = (async () => {\n try {\n console.log('[POOL] Auto-initializing sandbox pool...');\n globalPool = new SandboxPool();\n await globalPool.start();\n console.log('[POOL] Auto-initialization complete');\n return globalPool;\n } catch (error) {\n console.error('[POOL] Auto-initialization failed:', error instanceof Error ? error.message : error);\n globalPool = null;\n return null;\n } finally {\n initializationPromise = null;\n }\n })();\n\n // DON'T await - return null so first request proceeds with on-demand creation\n // Pool will be ready for subsequent requests\n return null;\n}\n\n/**\n * Initialize the global sandbox pool\n */\nexport async function initializeSandboxPool(config: SandboxPoolConfig = {}): Promise<SandboxPool> {\n // Check if pool is disabled\n if (process.env.SANDBOX_POOL_ENABLED === 'false') {\n console.log('[POOL] Sandbox pool disabled via SANDBOX_POOL_ENABLED=false');\n throw new Error('Sandbox pool is disabled');\n }\n\n if (globalPool) {\n console.log('[POOL] Pool already initialized, returning existing instance');\n return globalPool;\n }\n\n // If auto-init is in progress, wait for it then return\n if (initializationPromise) {\n const pool = await initializationPromise;\n if (pool) return pool;\n }\n\n globalPool = new SandboxPool(config);\n await globalPool.start();\n return globalPool;\n}\n\n/**\n * Shutdown the global sandbox pool\n */\nexport async function shutdownSandboxPool(): Promise<void> {\n if (globalPool) {\n await globalPool.stop();\n globalPool = null;\n }\n autoInitAttempted = false;\n}\n","/**\n * Vercel Sandbox Executor for Claude Agent SDK\n *\n * This module provides the ability to run Claude Agent SDK queries inside\n * a Vercel Sandbox. It is the unified implementation used by both the\n * standalone harness and the cloud layer.\n *\n * When running on Vercel, we:\n * 1. Get or create a Vercel Sandbox (reusing existing ones for the same session)\n * 2. Install Claude Agent SDK (npm package) if not already installed\n * 3. Run the agent query using the SDK's query() function\n * 4. Stream results back in REAL-TIME using Writable streams\n *\n * Sandboxes are cached by session ID to avoid the overhead of creating new\n * sandboxes and reinstalling dependencies for follow-up messages in the same session.\n *\n * STREAMING: We use Vercel Sandbox's Writable stream support to receive stdout\n * in real-time as the SDK emits events, rather than waiting for command completion.\n */\n\nimport { Writable } from 'stream';\nimport type { ClaudeAgentOptions, ClaudeStreamEvent } from '../agent/claude-sdk.js';\nimport type { CustomExecutor } from '../agent/harness.js';\nimport { getSandboxPool, ensureSandboxPoolInitialized } from './sandbox-pool.js';\n\n// =============================================================================\n// SANDBOX CACHE\n// =============================================================================\n\ninterface CachedSandbox {\n sandbox: VercelSandboxInstance;\n sessionId: string;\n createdAt: number;\n lastUsedAt: number;\n sdkInstalled: boolean;\n startupScriptRan: boolean;\n startupScriptHash?: string;\n /** Marked true if sandbox has been detected as expired/invalid */\n isExpired?: boolean;\n /** URL of config file that has been installed */\n configFileUrl?: string;\n /** Timestamp when config was installed (for detecting updated configs) */\n configInstalledAt?: number;\n /** Last successful heartbeat timestamp */\n lastHeartbeat?: number;\n /** Last heartbeat status */\n heartbeatStatus?: 'healthy' | 'unhealthy' | 'checking';\n}\n\n// Cache of active sandboxes by session ID\nconst sandboxCache = new Map<string, CachedSandbox>();\n\n// Default TTL: 10 minutes of inactivity before sandbox is cleaned up\nconst DEFAULT_IDLE_TTL = 10 * 60 * 1000; // 10 minutes\n\n// Cleanup interval: check every minute for idle sandboxes\nconst CLEANUP_INTERVAL = 60 * 1000; // 1 minute\n\n// Heartbeat interval: ping sandboxes every 15 seconds\nconst HEARTBEAT_INTERVAL = 15 * 1000; // 15 seconds\n\n// Track cleanup interval\nlet cleanupIntervalId: ReturnType<typeof setInterval> | null = null;\n\n// Track heartbeat interval\nlet heartbeatIntervalId: ReturnType<typeof setInterval> | null = null;\n\n// Use global to share heartbeat state across ESM/CJS module instances (dual-package hazard mitigation)\nconst GLOBAL_HEARTBEAT_KEY = '__ash_ai_heartbeat_state__' as const;\ninterface HeartbeatGlobalState {\n lastRunTimestamp: number;\n intervalStarted: boolean;\n}\nfunction getGlobalHeartbeatState(): HeartbeatGlobalState {\n const g = globalThis as unknown as Record<string, HeartbeatGlobalState | undefined>;\n if (!g[GLOBAL_HEARTBEAT_KEY]) {\n g[GLOBAL_HEARTBEAT_KEY] = { lastRunTimestamp: 0, intervalStarted: false };\n }\n return g[GLOBAL_HEARTBEAT_KEY]!;\n}\n\n// Heartbeat listeners - callbacks that will be notified of heartbeat status changes\ntype HeartbeatListener = (status: SandboxHeartbeatStatus) => void;\nconst heartbeatListeners = new Set<HeartbeatListener>();\n\n/**\n * Sandbox heartbeat status for a session\n */\nexport interface SandboxHeartbeatStatus {\n sessionId: string;\n status: 'healthy' | 'unhealthy' | 'checking' | 'expired';\n lastHeartbeat: number | null;\n uptime: number; // milliseconds since creation\n lastUsed: number; // milliseconds since last use\n}\n\n/**\n * Start the cleanup interval if not already running\n */\nfunction ensureCleanupRunning() {\n if (cleanupIntervalId === null) {\n cleanupIntervalId = setInterval(() => {\n cleanupIdleSandboxes();\n }, CLEANUP_INTERVAL);\n\n // Don't keep the process alive just for cleanup\n if (cleanupIntervalId.unref) {\n cleanupIntervalId.unref();\n }\n }\n}\n\n/**\n * Start the heartbeat interval if not already running\n */\nfunction ensureHeartbeatRunning() {\n const globalState = getGlobalHeartbeatState();\n\n // Use both local and global checks to handle ESM/CJS dual-package loading\n if (heartbeatIntervalId === null && !globalState.intervalStarted) {\n globalState.intervalStarted = true;\n heartbeatIntervalId = setInterval(() => {\n performHeartbeats();\n }, HEARTBEAT_INTERVAL);\n\n // Don't keep the process alive just for heartbeats\n if (heartbeatIntervalId.unref) {\n heartbeatIntervalId.unref();\n }\n }\n}\n\n/**\n * Perform heartbeat checks on all active sandboxes\n */\nasync function performHeartbeats() {\n const now = Date.now();\n const globalState = getGlobalHeartbeatState();\n\n // Prevent duplicate heartbeat runs from ESM/CJS dual-package loading\n // If we've run a heartbeat within the last 5 seconds, skip this run\n if (now - globalState.lastRunTimestamp < 5000) {\n return;\n }\n globalState.lastRunTimestamp = now;\n\n for (const [sessionId, cached] of sandboxCache.entries()) {\n // Skip expired sandboxes\n if (cached.isExpired) {\n notifyHeartbeatListeners({\n sessionId,\n status: 'expired',\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: now - cached.createdAt,\n lastUsed: now - cached.lastUsedAt,\n });\n continue;\n }\n\n // Mark as checking\n cached.heartbeatStatus = 'checking';\n notifyHeartbeatListeners({\n sessionId,\n status: 'checking',\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: now - cached.createdAt,\n lastUsed: now - cached.lastUsedAt,\n });\n\n try {\n // Run a simple command to verify the sandbox is still alive\n const result = await cached.sandbox.runCommand({\n cmd: 'echo',\n args: ['heartbeat'],\n });\n\n if (result.exitCode === 0) {\n cached.lastHeartbeat = Date.now();\n cached.heartbeatStatus = 'healthy';\n console.log(`[HEARTBEAT] Session ${sessionId}: healthy`);\n\n notifyHeartbeatListeners({\n sessionId,\n status: 'healthy',\n lastHeartbeat: cached.lastHeartbeat,\n uptime: Date.now() - cached.createdAt,\n lastUsed: Date.now() - cached.lastUsedAt,\n });\n } else {\n cached.heartbeatStatus = 'unhealthy';\n console.log(`[HEARTBEAT] Session ${sessionId}: unhealthy (exit code ${result.exitCode})`);\n\n notifyHeartbeatListeners({\n sessionId,\n status: 'unhealthy',\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: Date.now() - cached.createdAt,\n lastUsed: Date.now() - cached.lastUsedAt,\n });\n }\n } catch (error) {\n console.log(`[HEARTBEAT] Session ${sessionId}: failed -`, error instanceof Error ? error.message : 'Unknown error');\n\n // Check if sandbox expired\n if (isSandboxExpiredError(error)) {\n cached.isExpired = true;\n cached.heartbeatStatus = 'unhealthy';\n\n notifyHeartbeatListeners({\n sessionId,\n status: 'expired',\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: Date.now() - cached.createdAt,\n lastUsed: Date.now() - cached.lastUsedAt,\n });\n } else {\n cached.heartbeatStatus = 'unhealthy';\n\n notifyHeartbeatListeners({\n sessionId,\n status: 'unhealthy',\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: Date.now() - cached.createdAt,\n lastUsed: Date.now() - cached.lastUsedAt,\n });\n }\n }\n }\n}\n\n/**\n * Notify all heartbeat listeners of a status change\n */\nfunction notifyHeartbeatListeners(status: SandboxHeartbeatStatus) {\n for (const listener of heartbeatListeners) {\n try {\n listener(status);\n } catch (error) {\n console.error('[HEARTBEAT] Listener error:', error);\n }\n }\n}\n\n/**\n * Register a listener for heartbeat status changes\n */\nexport function onHeartbeat(listener: HeartbeatListener): () => void {\n heartbeatListeners.add(listener);\n return () => {\n heartbeatListeners.delete(listener);\n };\n}\n\n/**\n * Get the current heartbeat status for a session\n */\nexport function getHeartbeatStatus(sessionId: string): SandboxHeartbeatStatus | null {\n const cached = sandboxCache.get(sessionId);\n if (!cached) return null;\n\n const now = Date.now();\n return {\n sessionId,\n status: cached.isExpired ? 'expired' : (cached.heartbeatStatus || 'healthy'),\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: now - cached.createdAt,\n lastUsed: now - cached.lastUsedAt,\n };\n}\n\n/**\n * Get heartbeat status for all active sandboxes\n */\nexport function getAllHeartbeatStatuses(): SandboxHeartbeatStatus[] {\n const statuses: SandboxHeartbeatStatus[] = [];\n const now = Date.now();\n\n for (const [sessionId, cached] of sandboxCache.entries()) {\n statuses.push({\n sessionId,\n status: cached.isExpired ? 'expired' : (cached.heartbeatStatus || 'healthy'),\n lastHeartbeat: cached.lastHeartbeat || null,\n uptime: now - cached.createdAt,\n lastUsed: now - cached.lastUsedAt,\n });\n }\n\n return statuses;\n}\n\n/**\n * Clean up sandboxes that have been idle too long\n */\nasync function cleanupIdleSandboxes(idleTtl: number = DEFAULT_IDLE_TTL) {\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [sessionId, cached] of sandboxCache.entries()) {\n if (now - cached.lastUsedAt > idleTtl) {\n toRemove.push(sessionId);\n }\n }\n\n for (const sessionId of toRemove) {\n await releaseSandbox(sessionId);\n }\n}\n\n/**\n * Generate a hash for startup script to detect changes\n */\nfunction hashStartupScript(script: string | undefined): string | undefined {\n if (!script) return undefined;\n // Simple hash for comparison - just use length + first/last chars\n return `${script.length}:${script.slice(0, 50)}:${script.slice(-50)}`;\n}\n\n/**\n * Check if an error indicates the sandbox has expired (HTTP 410 Gone, 401 Unauthorized, 404 Not Found, etc.)\n * Sandboxes can expire after 5 minutes of creation on Vercel.\n * The 404 error with \"Sandbox Exec not found\" indicates the command execution was cleaned up.\n */\nexport function isSandboxExpiredError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('410') ||\n message.includes('401') ||\n message.includes('404') ||\n message.includes('gone') ||\n message.includes('expired') ||\n message.includes('not found') ||\n message.includes('sandbox not found') ||\n message.includes('sandbox exec not found') ||\n message.includes('unauthorized') ||\n message.includes('invalid session') ||\n message.includes('session expired')\n );\n }\n return false;\n}\n\n/**\n * Invalidate a sandbox in the cache, marking it as expired.\n * This will cause the next getOrCreateSandbox call to create a fresh sandbox.\n */\nexport function invalidateSandbox(sessionId: string): void {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n console.log('[SANDBOX] Invalidating sandbox for session:', sessionId);\n cached.isExpired = true;\n }\n}\n\n/**\n * Check if a cached sandbox is still valid by running a simple command.\n * Returns true if valid, false if expired/invalid.\n */\nasync function isSandboxValid(cached: CachedSandbox): Promise<boolean> {\n if (cached.isExpired) {\n return false;\n }\n\n try {\n // Run a simple command to verify the sandbox is still alive\n const result = await cached.sandbox.runCommand({\n cmd: 'echo',\n args: ['ping'],\n });\n return result.exitCode === 0;\n } catch (error) {\n console.log('[SANDBOX] Health check failed:', error instanceof Error ? error.message : 'Unknown error');\n // Mark as expired so we don't keep trying\n cached.isExpired = true;\n return false;\n }\n}\n\n/**\n * Remove an expired sandbox from cache without trying to stop it\n * (since it's already gone on the server side)\n */\nfunction removeExpiredSandbox(sessionId: string): void {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n console.log('[SANDBOX] Removing expired sandbox from cache:', sessionId);\n sandboxCache.delete(sessionId);\n }\n}\n\nexport interface GetOrCreateSandboxOptions {\n sessionId: string;\n runtime?: 'node22' | 'python3.13';\n timeout?: number; // in seconds\n vcpus?: number;\n /** Previously stored sandbox ID to reconnect to */\n existingSandboxId?: string;\n}\n\nexport interface SandboxWithState {\n sandbox: VercelSandboxInstance;\n /** The Vercel sandbox ID (for persistence/reconnection) */\n sandboxId: string;\n sdkInstalled: boolean;\n startupScriptRan: boolean;\n startupScriptHash?: string;\n isNew: boolean;\n configFileUrl?: string;\n /** When the config was installed (for detecting updated configs) */\n configInstalledAt?: number;\n}\n\n/**\n * Get an existing sandbox for a session, or create a new one.\n * Automatically handles expired sandboxes by creating new ones.\n *\n * If existingSandboxId is provided (from persisted session metadata),\n * we'll try to reconnect to that sandbox using Sandbox.get() instead\n * of creating a new one. This handles the case where the in-memory\n * cache is lost (e.g., serverless function cold start) but the\n * sandbox is still running on Vercel.\n */\nexport async function getOrCreateSandbox(\n options: GetOrCreateSandboxOptions\n): Promise<SandboxWithState> {\n const { sessionId, runtime = 'node22', timeout = 300, vcpus = 4, existingSandboxId } = options;\n\n ensureCleanupRunning();\n ensureHeartbeatRunning();\n\n // Dynamically import Vercel Sandbox\n const { Sandbox } = await import('@vercel/sandbox');\n\n // Check if we have a cached sandbox for this session (in-memory)\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n // Validate that the sandbox is still alive\n console.log('[SANDBOX] Checking cached sandbox health for session:', sessionId);\n const isValid = await isSandboxValid(cached);\n\n if (isValid) {\n // Update last used time\n cached.lastUsedAt = Date.now();\n console.log('[SANDBOX] Cached sandbox is healthy, reusing');\n\n return {\n sandbox: cached.sandbox,\n sandboxId: cached.sandbox.sandboxId,\n sdkInstalled: cached.sdkInstalled,\n startupScriptRan: cached.startupScriptRan,\n startupScriptHash: cached.startupScriptHash,\n isNew: false,\n configFileUrl: cached.configFileUrl,\n configInstalledAt: cached.configInstalledAt,\n };\n }\n\n // Sandbox has expired - remove from cache and create a new one\n console.log('[SANDBOX] Cached sandbox has expired (HTTP 410 or similar), creating new sandbox');\n removeExpiredSandbox(sessionId);\n }\n\n // Try to acquire from the pre-warmed pool first (auto-initializes if needed)\n const pool = await ensureSandboxPoolInitialized();\n if (pool && pool.isRunning()) {\n try {\n console.log('[SANDBOX] Attempting to acquire from pre-warmed pool...');\n const pooled = await pool.acquire(sessionId);\n\n console.log('[SANDBOX] Acquired pre-warmed sandbox:', pooled.sandboxId);\n\n // Create cache entry for the pooled sandbox\n const now = Date.now();\n const entry: CachedSandbox = {\n sandbox: pooled.sandbox,\n sessionId,\n createdAt: pooled.createdAt,\n lastUsedAt: now,\n sdkInstalled: pooled.sdkInstalled,\n startupScriptRan: false, // User script hasn't run yet\n };\n\n sandboxCache.set(sessionId, entry);\n\n return {\n sandbox: pooled.sandbox,\n sandboxId: pooled.sandboxId,\n sdkInstalled: pooled.sdkInstalled,\n startupScriptRan: false,\n startupScriptHash: undefined,\n isNew: false, // Not new - came from pool\n configFileUrl: undefined,\n configInstalledAt: undefined,\n };\n } catch (error) {\n console.warn(\n '[SANDBOX] Failed to acquire from pool, falling back to on-demand creation:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n }\n\n // If we have an existing sandbox ID (from database), try to reconnect\n if (existingSandboxId) {\n console.log('[SANDBOX] Attempting to reconnect to existing sandbox:', existingSandboxId);\n try {\n const sandbox = await Sandbox.get({ sandboxId: existingSandboxId });\n\n // Verify the sandbox is still alive with a health check\n const healthResult = await sandbox.runCommand({\n cmd: 'echo',\n args: ['reconnect-ping'],\n });\n\n if (healthResult.exitCode === 0) {\n console.log('[SANDBOX] Successfully reconnected to existing sandbox:', existingSandboxId);\n\n const now = Date.now();\n const entry: CachedSandbox = {\n sandbox,\n sessionId,\n createdAt: now, // We don't know the actual creation time\n lastUsedAt: now,\n // We assume SDK is installed since this is an existing sandbox\n // The caller can verify and re-mark if needed\n sdkInstalled: true,\n startupScriptRan: true,\n };\n\n sandboxCache.set(sessionId, entry);\n\n return {\n sandbox,\n sandboxId: existingSandboxId,\n sdkInstalled: true, // Assume installed for reconnected sandboxes\n startupScriptRan: true, // Assume ran for reconnected sandboxes\n startupScriptHash: undefined,\n isNew: false,\n configFileUrl: undefined,\n configInstalledAt: undefined, // We don't know when config was installed on reconnected sandboxes\n };\n } else {\n console.log('[SANDBOX] Reconnected sandbox failed health check, will create new');\n }\n } catch (error) {\n console.log('[SANDBOX] Failed to reconnect to sandbox:', existingSandboxId,\n error instanceof Error ? error.message : 'Unknown error');\n // Fall through to create a new sandbox\n }\n }\n\n // Create a new sandbox\n console.log('[SANDBOX] Creating new sandbox for session:', sessionId);\n\n // Check if we have a base tarball URL - if so, use it to skip npm install\n const baseTarballUrl = process.env.SANDBOX_BASE_TARBALL_URL;\n const useTarball = !!baseTarballUrl;\n\n let sandbox: VercelSandboxInstance;\n\n if (useTarball) {\n console.log('[SANDBOX] Using pre-built tarball for faster startup:', baseTarballUrl);\n sandbox = await Sandbox.create({\n runtime,\n timeout: timeout * 1000,\n resources: { vcpus },\n source: {\n type: 'tarball',\n url: baseTarballUrl,\n },\n });\n } else {\n console.log('[SANDBOX] No SANDBOX_BASE_TARBALL_URL set, will use npm install (slower)');\n sandbox = await Sandbox.create({\n runtime,\n timeout: timeout * 1000,\n resources: { vcpus },\n });\n }\n const sandboxId = sandbox.sandboxId;\n console.log('[SANDBOX] New sandbox created successfully with ID:', sandboxId, useTarball ? '(from tarball)' : '(bare)');\n\n const now = Date.now();\n const entry: CachedSandbox = {\n sandbox,\n sessionId,\n createdAt: now,\n lastUsedAt: now,\n // If we used tarball, SDK is pre-installed\n sdkInstalled: useTarball,\n startupScriptRan: false,\n };\n\n sandboxCache.set(sessionId, entry);\n\n return {\n sandbox,\n sandboxId,\n // If we used tarball, SDK is pre-installed\n sdkInstalled: useTarball,\n startupScriptRan: false,\n startupScriptHash: undefined,\n isNew: true,\n configFileUrl: undefined,\n configInstalledAt: undefined,\n };\n}\n\n/**\n * Mark that the SDK has been installed in a sandbox\n */\nexport function markSdkInstalled(sessionId: string): void {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n cached.sdkInstalled = true;\n cached.lastUsedAt = Date.now();\n }\n}\n\n/**\n * Mark that config has been installed in a sandbox\n */\nexport function markConfigInstalled(sessionId: string, configFileUrl: string): void {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n const now = Date.now();\n cached.configFileUrl = configFileUrl;\n cached.configInstalledAt = now;\n cached.lastUsedAt = now;\n }\n}\n\n/**\n * Re-key a sandbox cache entry with a new session ID.\n */\nexport function rekeySessionId(oldSessionId: string, newSessionId: string): void {\n if (oldSessionId === newSessionId) return;\n\n const cached = sandboxCache.get(oldSessionId);\n if (cached) {\n cached.sessionId = newSessionId;\n cached.lastUsedAt = Date.now();\n sandboxCache.delete(oldSessionId);\n sandboxCache.set(newSessionId, cached);\n }\n}\n\n/**\n * Mark that the startup script has been run in a sandbox\n */\nexport function markStartupScriptRan(sessionId: string, scriptHash?: string): void {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n cached.startupScriptRan = true;\n cached.startupScriptHash = scriptHash;\n cached.lastUsedAt = Date.now();\n }\n}\n\n/**\n * Check if the startup script needs to be re-run (script changed)\n */\nexport function needsStartupScriptRerun(sessionId: string, newScript?: string): boolean {\n const cached = sandboxCache.get(sessionId);\n if (!cached) return true;\n\n const newHash = hashStartupScript(newScript);\n return cached.startupScriptHash !== newHash;\n}\n\n/**\n * Release a sandbox back to be cleaned up.\n */\nexport async function releaseSandbox(sessionId: string): Promise<void> {\n const cached = sandboxCache.get(sessionId);\n if (cached) {\n sandboxCache.delete(sessionId);\n\n // Notify pool if running - pool will handle cleanup\n const pool = getSandboxPool();\n if (pool && pool.isRunning()) {\n try {\n await pool.release(sessionId);\n return; // Pool handles the cleanup\n } catch (error) {\n console.warn(\n `[SANDBOX] Failed to release to pool, stopping directly:`,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n }\n\n // No pool or pool release failed - stop directly\n try {\n await cached.sandbox.stop();\n } catch (error) {\n console.error(`[SANDBOX] Failed to stop sandbox for session ${sessionId}:`, error);\n }\n }\n}\n\n/**\n * Get stats about the sandbox cache\n */\nexport function getSandboxCacheStats(): {\n activeCount: number;\n sessions: string[];\n} {\n return {\n activeCount: sandboxCache.size,\n sessions: Array.from(sandboxCache.keys()),\n };\n}\n\n/**\n * Force cleanup of all sandboxes (useful for shutdown)\n */\nexport async function cleanupAllSandboxes(): Promise<void> {\n const sessions = Array.from(sandboxCache.keys());\n await Promise.all(sessions.map((sessionId) => releaseSandbox(sessionId)));\n\n if (cleanupIntervalId) {\n clearInterval(cleanupIntervalId);\n cleanupIntervalId = null;\n }\n\n if (heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n heartbeatIntervalId = null;\n }\n\n // Reset global heartbeat state\n const globalState = getGlobalHeartbeatState();\n globalState.intervalStarted = false;\n globalState.lastRunTimestamp = 0;\n\n // Clear all listeners\n heartbeatListeners.clear();\n}\n\n// =============================================================================\n// SANDBOX FILE OPERATIONS\n// =============================================================================\n\nimport type { SandboxFileOperations, SandboxWriteResult, SandboxReadResult } from './sandbox-file-sync.js';\n\n/**\n * Check if a sandbox is running for a session\n */\nexport function isSandboxRunning(sessionId: string): boolean {\n const cached = sandboxCache.get(sessionId);\n return cached !== undefined && !cached.isExpired;\n}\n\n/**\n * Write a file to a running sandbox\n *\n * @param sessionId - The session ID\n * @param path - Full path in the sandbox (e.g., /workspace/files/data.csv)\n * @param content - File content as Buffer\n */\nexport async function writeFileToSandbox(\n sessionId: string,\n path: string,\n content: Buffer\n): Promise<SandboxWriteResult> {\n const cached = sandboxCache.get(sessionId);\n\n if (!cached) {\n return { success: false, error: 'No active sandbox for session' };\n }\n\n if (cached.isExpired) {\n return { success: false, error: 'Sandbox has expired' };\n }\n\n try {\n const sandbox = cached.sandbox;\n\n // Ensure directory exists\n const dir = path.substring(0, path.lastIndexOf('/'));\n if (dir) {\n await sandbox.runCommand({ cmd: 'mkdir', args: ['-p', dir] });\n }\n\n // Write file using base64 encoding for binary safety\n const base64Content = content.toString('base64');\n\n // Use a heredoc-style approach with base64 to handle any content safely\n const result = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', `echo '${base64Content}' | base64 -d > '${path}'`],\n });\n\n if (result.exitCode !== 0) {\n const stderr = await result.stderr();\n return { success: false, error: `Write failed: ${stderr}` };\n }\n\n // Update last used time\n cached.lastUsedAt = Date.now();\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Read a file from a running sandbox\n *\n * @param sessionId - The session ID\n * @param path - Full path in the sandbox (e.g., /workspace/files/data.csv)\n */\nexport async function readFileFromSandbox(\n sessionId: string,\n path: string\n): Promise<SandboxReadResult> {\n const cached = sandboxCache.get(sessionId);\n\n if (!cached) {\n return { success: false, error: 'No active sandbox for session' };\n }\n\n if (cached.isExpired) {\n return { success: false, error: 'Sandbox has expired' };\n }\n\n try {\n const sandbox = cached.sandbox;\n\n // Check if file exists\n const checkResult = await sandbox.runCommand({\n cmd: 'test',\n args: ['-f', path],\n });\n\n if (checkResult.exitCode !== 0) {\n return { success: false, error: 'File not found' };\n }\n\n // Read file and encode as base64 for binary safety\n const result = await sandbox.runCommand({\n cmd: 'base64',\n args: [path],\n });\n\n if (result.exitCode !== 0) {\n const stderr = await result.stderr();\n return { success: false, error: `Read failed: ${stderr}` };\n }\n\n const base64Content = await result.stdout();\n const content = Buffer.from(base64Content.trim(), 'base64');\n\n // Update last used time\n cached.lastUsedAt = Date.now();\n\n return { success: true, content };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * List files in a directory in a running sandbox\n *\n * @param sessionId - The session ID\n * @param path - Directory path in the sandbox\n */\nexport async function listFilesInSandbox(\n sessionId: string,\n path: string\n): Promise<{ success: boolean; files?: string[]; error?: string }> {\n const cached = sandboxCache.get(sessionId);\n\n if (!cached) {\n return { success: false, error: 'No active sandbox for session' };\n }\n\n if (cached.isExpired) {\n return { success: false, error: 'Sandbox has expired' };\n }\n\n try {\n const sandbox = cached.sandbox;\n\n // Check if directory exists\n const checkResult = await sandbox.runCommand({\n cmd: 'test',\n args: ['-d', path],\n });\n\n if (checkResult.exitCode !== 0) {\n return { success: true, files: [] }; // Directory doesn't exist, return empty list\n }\n\n // List files recursively, outputting relative paths\n const result = await sandbox.runCommand({\n cmd: 'find',\n args: [path, '-type', 'f', '-printf', '%P\\\\n'],\n });\n\n if (result.exitCode !== 0) {\n const stderr = await result.stderr();\n return { success: false, error: `List failed: ${stderr}` };\n }\n\n const stdout = await result.stdout();\n const files = stdout\n .trim()\n .split('\\n')\n .filter((f) => f.length > 0);\n\n // Update last used time\n cached.lastUsedAt = Date.now();\n\n return { success: true, files };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Create a SandboxFileOperations implementation using the sandbox cache\n */\nexport function createSandboxFileOperations(): SandboxFileOperations {\n return {\n writeFile: writeFileToSandbox,\n readFile: readFileFromSandbox,\n listFiles: listFilesInSandbox,\n isSandboxRunning,\n };\n}\n\n// =============================================================================\n// VERCEL SANDBOX INSTANCE TYPE\n// =============================================================================\n\n/**\n * Type for Vercel Sandbox instance (from @vercel/sandbox)\n */\ninterface VercelSandboxInstance {\n /** The unique identifier for this sandbox */\n readonly sandboxId: string;\n runCommand(options: {\n cmd: string;\n args?: string[];\n env?: Record<string, string>;\n sudo?: boolean;\n stdout?: Writable;\n stderr?: Writable;\n }): Promise<{\n exitCode: number;\n stdout(): Promise<string>;\n stderr(): Promise<string>;\n }>;\n stop(): Promise<void>;\n}\n\n// =============================================================================\n// EXECUTOR\n// =============================================================================\n\n/**\n * Check if we're running on Vercel and should use sandbox execution\n */\nexport function shouldUseSandbox(): boolean {\n return !!process.env.VERCEL;\n}\n\n/**\n * Create a custom executor that runs Claude Agent SDK in a Vercel Sandbox.\n *\n * @param apiKey - The Anthropic API key to use\n * @returns A CustomExecutor function for use with AgentHarness\n */\nexport function createVercelSandboxExecutor(apiKey: string): CustomExecutor {\n return async function* (\n prompt: string,\n options: ClaudeAgentOptions\n ): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n yield* executeInSandbox(prompt, apiKey, options);\n };\n}\n\n/**\n * Execute an agent query inside a Vercel Sandbox using the Claude Agent SDK.\n */\nasync function* executeInSandbox(\n prompt: string,\n apiKey: string,\n options: ClaudeAgentOptions\n): AsyncGenerator<ClaudeStreamEvent, void, unknown> {\n // Use harness session ID for sandbox caching\n const sessionId = options.harnessSessionId || `temp-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n try {\n // Get or create a sandbox for this session\n const { sandbox, sdkInstalled, startupScriptRan, startupScriptHash: cachedScriptHash, configFileUrl: cachedConfigUrl } = await getOrCreateSandbox({\n sessionId,\n runtime: 'node22',\n timeout: 600, // 10 minutes\n vcpus: 4,\n });\n\n // Build environment variables\n const envVars: Record<string, string> = {\n ANTHROPIC_API_KEY: apiKey,\n ...options.envVars,\n };\n\n // Only install SDK if not already installed in this sandbox\n if (!sdkInstalled) {\n // Install system dependencies (jq for JSON processing in scripts)\n // Try multiple package managers for compatibility with different base images\n const jqResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', 'which jq || (sudo dnf install -y jq 2>/dev/null || sudo apt-get update && sudo apt-get install -y jq 2>/dev/null || sudo apk add jq 2>/dev/null) || true'],\n });\n\n if (jqResult.exitCode !== 0) {\n const stderr = await jqResult.stderr();\n console.warn('[SANDBOX] Failed to install jq (non-fatal):', stderr);\n } else {\n console.log('[SANDBOX] Successfully installed jq');\n }\n\n // Install ffmpeg for media processing\n const ffmpegResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', 'which ffmpeg || (sudo dnf install -y ffmpeg 2>/dev/null || sudo apt-get update && sudo apt-get install -y ffmpeg 2>/dev/null || sudo apk add ffmpeg 2>/dev/null) || true'],\n });\n\n if (ffmpegResult.exitCode !== 0) {\n const stderr = await ffmpegResult.stderr();\n console.warn('[SANDBOX] Failed to install ffmpeg (non-fatal):', stderr);\n } else {\n console.log('[SANDBOX] Successfully installed ffmpeg');\n }\n\n // Initialize npm and install the SDK\n const sdkResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', 'npm init -y && npm install @anthropic-ai/claude-agent-sdk'],\n env: envVars,\n });\n\n if (sdkResult.exitCode !== 0) {\n const stderr = await sdkResult.stderr();\n yield {\n type: 'error',\n error: `Failed to install Claude Agent SDK: ${stderr}`,\n };\n return;\n }\n\n markSdkInstalled(sessionId);\n }\n\n // Run user-defined startup script if provided and hasn't been run yet\n const currentScriptHash = hashStartupScript(options.startupScript);\n const needsStartupScript = options.startupScript && (!startupScriptRan || currentScriptHash !== cachedScriptHash);\n if (needsStartupScript) {\n console.log('[SANDBOX] Running startup script...');\n const startupStartTime = Date.now();\n\n const startupResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', options.startupScript!],\n env: envVars,\n });\n\n const stdout = await startupResult.stdout();\n const stderr = await startupResult.stderr();\n const duration = Date.now() - startupStartTime;\n\n if (startupResult.exitCode !== 0) {\n console.error('[SANDBOX] Startup script failed after', duration, 'ms');\n console.error('[SANDBOX] Startup script stdout:', stdout);\n console.error('[SANDBOX] Startup script stderr:', stderr);\n\n yield {\n type: 'error',\n error: `Startup script failed: ${stderr || stdout || 'Unknown error'}`,\n };\n return;\n }\n\n console.log('[SANDBOX] Startup script completed successfully in', duration, 'ms');\n markStartupScriptRan(sessionId, currentScriptHash);\n }\n\n // Download and extract config if provided and different from cached\n const needsConfigInstall = options.configFileUrl && options.configFileUrl !== cachedConfigUrl;\n if (needsConfigInstall) {\n console.log('[SANDBOX] Installing .claude config from:', options.configFileUrl);\n const configStartTime = Date.now();\n\n // The zip file is extracted directly to cwd, supporting two formats:\n // 1. Traditional: .claude/ folder only (skills, commands, settings.json, .mcp.json, etc.)\n // 2. Hosted agent: CLAUDE.md at root + .claude/ folder (for full project context)\n const configScript = `\n set -e\n echo \"[config] Downloading config from: ${options.configFileUrl}\"\n if ! curl -sSL --fail \"${options.configFileUrl}\" -o /tmp/config.zip; then\n echo \"[config] ERROR: Failed to download config file\" >&2\n exit 1\n fi\n\n echo \"[config] Extracting config...\"\n # Extract directly to cwd - supports both .claude/ only and hosted agent (CLAUDE.md + .claude/) formats\n if ! unzip -o /tmp/config.zip -d .; then\n echo \"[config] ERROR: Failed to extract config zip file\" >&2\n exit 2\n fi\n\n echo \"[config] Cleaning up...\"\n rm -f /tmp/config.zip\n\n # Report what was installed\n if [ -f \"CLAUDE.md\" ]; then\n echo \"[config] Found root CLAUDE.md (hosted agent format)\"\n fi\n echo \"[config] Installed .claude directory contents:\"\n ls -la .claude/ 2>/dev/null || echo \"[config] No .claude directory found\"\n SKILLS_COUNT=$(find .claude -name \"SKILL.md\" -type f 2>/dev/null | wc -l | tr -d ' ')\n COMMANDS_COUNT=$(find .claude/commands -type f 2>/dev/null | wc -l | tr -d ' ' || echo \"0\")\n echo \"[config] Successfully installed config (skills: $SKILLS_COUNT, commands: $COMMANDS_COUNT)\"\n `;\n\n const configResult = await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', configScript],\n env: envVars,\n });\n\n const stdout = await configResult.stdout();\n const stderr = await configResult.stderr();\n const duration = Date.now() - configStartTime;\n\n if (configResult.exitCode !== 0) {\n console.error('[SANDBOX] Failed to install config after', duration, 'ms');\n console.error('[SANDBOX] Config install stderr:', stderr);\n\n let errorMessage = 'Failed to install config';\n if (configResult.exitCode === 1) {\n errorMessage = `Failed to download config file from ${options.configFileUrl}`;\n } else if (configResult.exitCode === 2) {\n errorMessage = 'Failed to extract config zip file';\n } else if (stderr) {\n errorMessage = `Failed to install config: ${stderr}`;\n }\n\n yield { type: 'error', error: errorMessage };\n return;\n }\n\n console.log('[SANDBOX] Config installed successfully in', duration, 'ms');\n if (stdout) {\n console.log('[SANDBOX] Config install output:\\n', stdout);\n }\n\n markConfigInstalled(sessionId, options.configFileUrl!);\n }\n\n // Build SDK query options\n const sdkOptions: Record<string, unknown> = {\n model: options.model || 'claude-sonnet-4-5-20250514',\n permissionMode: options.permissionMode || 'bypassPermissions',\n includePartialMessages: true,\n };\n\n // If config is installed, enable settingSources\n const hasConfig = options.configFileUrl || cachedConfigUrl;\n if (hasConfig) {\n sdkOptions.settingSources = ['project'];\n\n if (options.allowedTools && options.allowedTools.length > 0) {\n const allowedTools = [...options.allowedTools];\n if (!allowedTools.includes('Skill')) {\n allowedTools.push('Skill');\n }\n sdkOptions.allowedTools = allowedTools;\n }\n } else if (options.allowedTools && options.allowedTools.length > 0) {\n sdkOptions.allowedTools = options.allowedTools;\n }\n\n if (options.disallowedTools && options.disallowedTools.length > 0) {\n sdkOptions.disallowedTools = options.disallowedTools;\n }\n\n // Handle system prompt\n if (options.systemPrompt) {\n if (typeof options.systemPrompt === 'string') {\n sdkOptions.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n append: options.systemPrompt,\n };\n } else {\n sdkOptions.systemPrompt = options.systemPrompt;\n }\n } else {\n sdkOptions.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n };\n }\n\n if (options.maxTurns) {\n sdkOptions.maxTurns = options.maxTurns;\n }\n\n if (options.resume) {\n sdkOptions.resume = options.resume;\n }\n\n // Create the Node.js script that uses the SDK\n const agentScript = `\nconst { query } = require('@anthropic-ai/claude-agent-sdk');\n\nconst prompt = ${JSON.stringify(prompt)};\nconst options = ${JSON.stringify(sdkOptions)};\n\nasync function run() {\n try {\n for await (const message of query({ prompt, options })) {\n console.log(JSON.stringify(message));\n }\n } catch (error) {\n const errorInfo = {\n type: 'error',\n error: error.message || 'Unknown error',\n name: error.name || 'Error',\n stack: error.stack ? error.stack.split('\\\\n').slice(0, 10).join('\\\\n') : undefined,\n code: error.code || undefined,\n };\n console.log(JSON.stringify(errorInfo));\n console.error('[AGENT ERROR]', error.message);\n process.exit(1);\n }\n}\n\nprocess.on('unhandledRejection', (reason) => {\n const errorInfo = {\n type: 'error',\n error: reason instanceof Error ? reason.message : String(reason),\n name: 'UnhandledRejection',\n };\n console.log(JSON.stringify(errorInfo));\n process.exit(1);\n});\n\nprocess.on('uncaughtException', (error) => {\n const errorInfo = {\n type: 'error',\n error: error.message || 'Unknown error',\n name: 'UncaughtException',\n };\n console.log(JSON.stringify(errorInfo));\n process.exit(1);\n});\n\nrun();\n`;\n\n // Write the script\n await sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', `cat > agent-runner.js << 'SCRIPT_EOF'\\n${agentScript}\\nSCRIPT_EOF`],\n });\n\n // Build env string for command\n // Escape both \" and $ to prevent shell interpretation\n const envString = Object.entries(envVars)\n .map(([k, v]) => `${k}=\"${v.replace(/\"/g, '\\\\\"').replace(/\\$/g, '\\\\$')}\"`)\n .join(' ');\n\n const sdkCommand = `${envString} node agent-runner.js`;\n\n // Use an event queue to bridge Writable stream callbacks with async generator yields\n const eventQueue: ClaudeStreamEvent[] = [];\n let resolveWait: (() => void) | null = null;\n let streamDone = false;\n let stderrContent = '';\n let stdoutBuffer = '';\n let rawStdoutContent = '';\n let lastAgentError = '';\n\n // Helper to parse a JSON line and convert to ClaudeStreamEvent\n const parseJsonLine = (line: string): ClaudeStreamEvent[] => {\n if (!line.trim()) return [];\n\n rawStdoutContent += line + '\\n';\n\n try {\n const event = JSON.parse(line);\n const events: ClaudeStreamEvent[] = [];\n\n if (event.type === 'error') {\n let errorParts = [event.error || 'Unknown agent error'];\n if (event.name && event.name !== 'Error') {\n errorParts.unshift(`[${event.name}]`);\n }\n if (event.code) {\n errorParts.push(`(code: ${event.code})`);\n }\n lastAgentError = errorParts.join(' ');\n\n console.error('[SANDBOX] Agent reported error:', lastAgentError);\n\n events.push({\n type: 'error',\n error: lastAgentError,\n stack: event.stack,\n } as ClaudeStreamEvent);\n }\n\n if (event.type === 'system' && event.subtype === 'init') {\n events.push({ type: 'session_init', sessionId: event.session_id || '' });\n } else if (event.type === 'stream_event' && event.event) {\n const streamEvent = event.event;\n if (streamEvent.type === 'content_block_delta') {\n if (streamEvent.delta?.type === 'text_delta' && streamEvent.delta.text) {\n events.push({ type: 'text_delta', delta: streamEvent.delta.text });\n } else if (streamEvent.delta?.type === 'thinking_delta' && streamEvent.delta.thinking) {\n events.push({ type: 'thinking_delta', delta: streamEvent.delta.thinking });\n }\n }\n } else if (event.type === 'assistant' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'text') {\n events.push({ type: 'text', text: block.text });\n } else if (block.type === 'tool_use') {\n events.push({\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n });\n }\n }\n } else if (event.type === 'user' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_result') {\n events.push({\n type: 'tool_result',\n toolUseId: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n });\n }\n }\n } else if (event.type === 'result') {\n events.push({\n type: 'complete',\n sessionId: event.session_id,\n result: event.result,\n totalCost: event.total_cost_usd,\n totalTokens: event.total_tokens,\n });\n }\n\n return events;\n } catch {\n if (line.trim()) {\n return [{ type: 'text', text: line + '\\n' }];\n }\n return [];\n }\n };\n\n // Create Writable streams for real-time output\n const stdoutStream = new Writable({\n write(chunk, _encoding, callback) {\n const data = chunk.toString();\n stdoutBuffer += data;\n\n const lines = stdoutBuffer.split('\\n');\n stdoutBuffer = lines.pop() || '';\n\n for (const line of lines) {\n const events = parseJsonLine(line);\n eventQueue.push(...events);\n }\n\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n callback();\n },\n final(callback) {\n if (stdoutBuffer.trim()) {\n const events = parseJsonLine(stdoutBuffer);\n eventQueue.push(...events);\n }\n streamDone = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n callback();\n },\n });\n\n const stderrStream = new Writable({\n write(chunk, _encoding, callback) {\n stderrContent += chunk.toString();\n callback();\n },\n });\n\n // Start the command execution\n const execPromise = sandbox.runCommand({\n cmd: 'bash',\n args: ['-c', sdkCommand],\n stdout: stdoutStream,\n stderr: stderrStream,\n });\n\n // Yield events as they arrive in real-time\n while (true) {\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n yield event;\n }\n\n if (streamDone) break;\n\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n\n // Wait for command to fully complete\n const execResult = await execPromise;\n\n if (execResult.exitCode !== 0) {\n console.error('[SANDBOX] Agent process exited with code:', execResult.exitCode);\n\n const stderrError = new Error(stderrContent || '');\n if (isSandboxExpiredError(stderrError)) {\n console.log('[SANDBOX] Detected sandbox expiration in stderr, invalidating sandbox');\n invalidateSandbox(sessionId);\n yield {\n type: 'error',\n error: 'Sandbox expired. Please retry your request - a fresh sandbox will be created automatically.',\n code: 'SANDBOX_EXPIRED',\n retryable: true,\n } as ClaudeStreamEvent;\n } else {\n let errorMessage = lastAgentError || stderrContent || `Claude Code process exited with code ${execResult.exitCode}`;\n yield { type: 'error', error: errorMessage };\n }\n }\n\n yield { type: 'complete' };\n\n } catch (error) {\n if (isSandboxExpiredError(error)) {\n console.log('[SANDBOX] Detected sandbox expiration error in executor, invalidating sandbox');\n invalidateSandbox(sessionId);\n yield {\n type: 'error',\n error: 'Sandbox expired. Please retry your request - a fresh sandbox will be created automatically.',\n code: 'SANDBOX_EXPIRED',\n retryable: true,\n } as ClaudeStreamEvent;\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n yield { type: 'error', error: errorMessage };\n }\n }\n}\n\nexport { hashStartupScript };\n","/**\n * Sandbox File Sync\n *\n * Bidirectional file synchronization between S3 storage and ephemeral sandboxes.\n * S3 is the source of truth - sandboxes can be recreated from S3 state.\n *\n * Usage:\n * - pushFile(): Client → S3 → Sandbox\n * - pullFile(): Sandbox → S3\n * - syncToSandbox(): Restore all S3 files when sandbox starts\n * - syncFromSandbox(): Backup sandbox files to S3 before it dies\n */\n\nimport type { FileStore, FileMetadata } from '../workspace/file-store.js';\n\n/**\n * Extract a meaningful error message from various error types\n * Handles AWS SDK v3 errors, standard Error objects, and other formats\n */\nfunction extractErrorMessage(error: unknown): string {\n if (error === null || error === undefined) {\n return 'Unknown error (null/undefined)';\n }\n\n // Handle standard Error instances\n if (error instanceof Error) {\n // AWS SDK v3 errors often have a 'name' that's more specific than the message\n const awsError = error as Error & {\n Code?: string;\n $metadata?: { httpStatusCode?: number };\n name?: string;\n };\n\n // Build a detailed error message\n const parts: string[] = [];\n\n if (awsError.Code) {\n parts.push(`[${awsError.Code}]`);\n } else if (awsError.name && awsError.name !== 'Error') {\n parts.push(`[${awsError.name}]`);\n }\n\n if (awsError.message) {\n parts.push(awsError.message);\n }\n\n if (awsError.$metadata?.httpStatusCode) {\n parts.push(`(HTTP ${awsError.$metadata.httpStatusCode})`);\n }\n\n return parts.length > 0 ? parts.join(' ') : 'Unknown Error instance';\n }\n\n // Handle plain objects with message property\n if (typeof error === 'object' && error !== null) {\n const obj = error as Record<string, unknown>;\n if (typeof obj.message === 'string') {\n return obj.message;\n }\n if (typeof obj.code === 'string') {\n return `Error code: ${obj.code}`;\n }\n // Try to stringify the object\n try {\n return JSON.stringify(error);\n } catch {\n return 'Unknown error (non-serializable object)';\n }\n }\n\n // Handle string errors\n if (typeof error === 'string') {\n return error;\n }\n\n return `Unknown error (${typeof error})`;\n}\n\n/**\n * Result of writing a file to a sandbox\n */\nexport interface SandboxWriteResult {\n success: boolean;\n error?: string;\n}\n\n/**\n * Result of reading a file from a sandbox\n */\nexport interface SandboxReadResult {\n success: boolean;\n content?: Buffer;\n error?: string;\n}\n\n/**\n * Result of a file push operation\n */\nexport interface FilePushResult {\n path: string;\n s3Written: boolean;\n sandboxWritten: boolean;\n error?: string;\n}\n\n/**\n * Options for push operations\n */\nexport interface PushOptions {\n /**\n * Override the sandbox target path for these files.\n * Default uses sandboxBasePath (.claude/files).\n * Use '.' to write to sandbox working directory root.\n */\n targetPath?: string;\n}\n\n/**\n * Result of a file pull operation\n */\nexport interface FilePullResult {\n path: string;\n content: Buffer | null;\n s3Written: boolean;\n error?: string;\n}\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n fileCount: number;\n errors: Array<{ path: string; error: string }>;\n}\n\n/**\n * Options for creating a SandboxFileSync instance\n */\nexport interface SandboxFileSyncOptions {\n /** The file store for persistent storage (S3) */\n fileStore: FileStore;\n\n /** Base path in sandbox for synced files (default: .claude/files) */\n sandboxBasePath?: string;\n}\n\n/**\n * Interface for sandbox file operations\n * This is implemented by the sandbox executor\n */\nexport interface SandboxFileOperations {\n /**\n * Write a file to the sandbox\n */\n writeFile(sessionId: string, path: string, content: Buffer): Promise<SandboxWriteResult>;\n\n /**\n * Read a file from the sandbox\n */\n readFile(sessionId: string, path: string): Promise<SandboxReadResult>;\n\n /**\n * List files in a directory in the sandbox\n */\n listFiles(sessionId: string, path: string): Promise<{ success: boolean; files?: string[]; error?: string }>;\n\n /**\n * Check if a sandbox is running for the session\n */\n isSandboxRunning(sessionId: string): boolean;\n}\n\n/**\n * Sandbox File Sync service\n *\n * Handles bidirectional file synchronization between S3 and sandboxes.\n */\nexport class SandboxFileSync {\n private readonly fileStore: FileStore;\n private readonly sandboxBasePath: string;\n private sandboxOps: SandboxFileOperations | null = null;\n\n constructor(options: SandboxFileSyncOptions) {\n this.fileStore = options.fileStore;\n this.sandboxBasePath = options.sandboxBasePath ?? '.claude/files';\n }\n\n /**\n * Set the sandbox operations implementation\n * This is called by the cloud layer after creating the sync service\n */\n setSandboxOperations(ops: SandboxFileOperations): void {\n this.sandboxOps = ops;\n }\n\n /**\n * Get the full sandbox path for a file\n * @param path - The relative file path\n * @param targetPath - Optional override for the base path\n */\n private getSandboxPath(path: string, targetPath?: string): string {\n const normalizedPath = path.replace(/^\\/+/, '');\n const basePath = targetPath ?? this.sandboxBasePath;\n\n // If targetPath is '.', write directly to working directory\n if (basePath === '.') {\n return normalizedPath;\n }\n\n return `${basePath}/${normalizedPath}`;\n }\n\n /**\n * Push a file: writes to S3, then to sandbox if running\n * @param sessionId - Session ID\n * @param path - File path (stored in S3 and used as relative path in sandbox)\n * @param content - File content\n * @param options - Push options (e.g., targetPath to override sandbox location)\n */\n async pushFile(sessionId: string, path: string, content: Buffer, options?: PushOptions): Promise<FilePushResult> {\n const result: FilePushResult = {\n path,\n s3Written: false,\n sandboxWritten: false,\n };\n\n // 1. Write to S3 (always)\n try {\n await this.fileStore.writeFile(sessionId, path, content);\n result.s3Written = true;\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n result.error = `S3 write failed: ${errorMessage}`;\n console.error(`[FILE_SYNC] S3 write failed for session ${sessionId}, path ${path}:`, error);\n return result;\n }\n\n // 2. Write to sandbox if running\n if (this.sandboxOps?.isSandboxRunning(sessionId)) {\n try {\n const sandboxPath = this.getSandboxPath(path, options?.targetPath);\n const writeResult = await this.sandboxOps.writeFile(sessionId, sandboxPath, content);\n result.sandboxWritten = writeResult.success;\n if (!writeResult.success && writeResult.error) {\n // S3 succeeded but sandbox failed - log but don't fail the whole operation\n console.warn(`[FILE_SYNC] Sandbox write failed for ${path}: ${writeResult.error}`);\n }\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n console.warn(`[FILE_SYNC] Sandbox write error for ${path}: ${errorMessage}`);\n }\n } else {\n // Log when sandbox is not running to help debug\n console.debug(`[FILE_SYNC] Sandbox not running for session ${sessionId}, skipping sandbox write`);\n }\n\n return result;\n }\n\n /**\n * Push multiple files\n * @param sessionId - Session ID\n * @param files - Array of files to push\n * @param options - Push options (e.g., targetPath to override sandbox location)\n */\n async pushFiles(\n sessionId: string,\n files: Array<{ path: string; content: Buffer }>,\n options?: PushOptions\n ): Promise<{ results: FilePushResult[] }> {\n const results: FilePushResult[] = [];\n\n for (const file of files) {\n const result = await this.pushFile(sessionId, file.path, file.content, options);\n results.push(result);\n }\n\n return { results };\n }\n\n /**\n * Pull a file from sandbox to S3\n * Reads from sandbox and writes to S3\n */\n async pullFile(sessionId: string, path: string): Promise<FilePullResult> {\n const result: FilePullResult = {\n path,\n content: null,\n s3Written: false,\n };\n\n if (!this.sandboxOps?.isSandboxRunning(sessionId)) {\n result.error = 'Sandbox is not running';\n return result;\n }\n\n // 1. Read from sandbox\n try {\n const sandboxPath = this.getSandboxPath(path);\n const readResult = await this.sandboxOps.readFile(sessionId, sandboxPath);\n\n if (!readResult.success || !readResult.content) {\n result.error = readResult.error ?? 'File not found in sandbox';\n return result;\n }\n\n result.content = readResult.content;\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n result.error = `Sandbox read failed: ${errorMessage}`;\n return result;\n }\n\n // 2. Write to S3\n try {\n await this.fileStore.writeFile(sessionId, path, result.content!);\n result.s3Written = true;\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n result.error = `S3 write failed: ${errorMessage}`;\n console.error(`[FILE_SYNC] S3 write failed in pullFile for session ${sessionId}, path ${path}:`, error);\n }\n\n return result;\n }\n\n /**\n * Read a file (tries sandbox first, falls back to S3)\n */\n async readFile(sessionId: string, path: string): Promise<{ content: Buffer | null; source: 's3' | 'sandbox' | null }> {\n // Try sandbox first if running\n if (this.sandboxOps?.isSandboxRunning(sessionId)) {\n try {\n const sandboxPath = this.getSandboxPath(path);\n const readResult = await this.sandboxOps.readFile(sessionId, sandboxPath);\n\n if (readResult.success && readResult.content) {\n return { content: readResult.content, source: 'sandbox' };\n }\n } catch {\n // Fall through to S3\n }\n }\n\n // Fall back to S3\n try {\n const content = await this.fileStore.readFile(sessionId, path);\n if (content) {\n return { content, source: 's3' };\n }\n } catch {\n // File not found\n }\n\n return { content: null, source: null };\n }\n\n /**\n * List files in storage for a session\n */\n async listFiles(sessionId: string, prefix?: string): Promise<FileMetadata[]> {\n return this.fileStore.listFiles(sessionId, prefix);\n }\n\n /**\n * Delete a file from both S3 and sandbox\n */\n async deleteFile(sessionId: string, path: string): Promise<{ s3Deleted: boolean; sandboxDeleted: boolean }> {\n const result = { s3Deleted: false, sandboxDeleted: false };\n\n // Delete from S3\n try {\n await this.fileStore.deleteFile(sessionId, path);\n result.s3Deleted = true;\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n console.warn(`[FILE_SYNC] S3 delete failed for ${path}: ${errorMessage}`);\n }\n\n // Delete from sandbox if running\n if (this.sandboxOps?.isSandboxRunning(sessionId)) {\n try {\n const sandboxPath = this.getSandboxPath(path);\n // Use writeFile with empty content to effectively delete, or we can add a deleteFile method\n // For now, we'll just log - actual deletion would need a sandbox rm command\n console.log(`[FILE_SYNC] Would delete ${sandboxPath} from sandbox`);\n result.sandboxDeleted = true;\n } catch {\n // Ignore sandbox delete errors\n }\n }\n\n return result;\n }\n\n /**\n * Sync all S3 files to a sandbox\n * Called when a sandbox starts or restarts\n */\n async syncToSandbox(sessionId: string): Promise<SyncResult> {\n const result: SyncResult = { fileCount: 0, errors: [] };\n\n if (!this.sandboxOps?.isSandboxRunning(sessionId)) {\n result.errors.push({ path: '*', error: 'Sandbox is not running' });\n return result;\n }\n\n // List all files in S3 for this session\n const files = await this.fileStore.listFiles(sessionId);\n\n for (const file of files) {\n try {\n // Read from S3\n const content = await this.fileStore.readFile(sessionId, file.path);\n if (!content) {\n result.errors.push({ path: file.path, error: 'File not found in S3' });\n continue;\n }\n\n // Write to sandbox\n const sandboxPath = this.getSandboxPath(file.path);\n const writeResult = await this.sandboxOps.writeFile(sessionId, sandboxPath, content);\n\n if (writeResult.success) {\n result.fileCount++;\n } else {\n result.errors.push({ path: file.path, error: writeResult.error ?? 'Unknown error' });\n }\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n result.errors.push({\n path: file.path,\n error: errorMessage,\n });\n }\n }\n\n console.log(`[FILE_SYNC] Synced ${result.fileCount} files to sandbox for session ${sessionId}`);\n return result;\n }\n\n /**\n * Sync sandbox files back to S3\n * Called before sandbox expires or on explicit backup request\n */\n async syncFromSandbox(sessionId: string, paths?: string[]): Promise<SyncResult> {\n const result: SyncResult = { fileCount: 0, errors: [] };\n\n if (!this.sandboxOps?.isSandboxRunning(sessionId)) {\n result.errors.push({ path: '*', error: 'Sandbox is not running' });\n return result;\n }\n\n // If specific paths provided, sync those\n // Otherwise, list files in the sandbox base path\n let filesToSync: string[] = [];\n\n if (paths && paths.length > 0) {\n filesToSync = paths;\n } else {\n // List files in sandbox\n const listResult = await this.sandboxOps.listFiles(sessionId, this.sandboxBasePath);\n if (listResult.success && listResult.files) {\n filesToSync = listResult.files;\n } else {\n result.errors.push({ path: this.sandboxBasePath, error: listResult.error ?? 'Failed to list sandbox files' });\n return result;\n }\n }\n\n for (const filePath of filesToSync) {\n try {\n const pullResult = await this.pullFile(sessionId, filePath);\n if (pullResult.s3Written) {\n result.fileCount++;\n } else if (pullResult.error) {\n result.errors.push({ path: filePath, error: pullResult.error });\n }\n } catch (error) {\n const errorMessage = extractErrorMessage(error);\n result.errors.push({\n path: filePath,\n error: errorMessage,\n });\n }\n }\n\n console.log(`[FILE_SYNC] Synced ${result.fileCount} files from sandbox to S3 for session ${sessionId}`);\n return result;\n }\n\n /**\n * Get a signed URL for direct file download\n */\n async getSignedUrl(sessionId: string, path: string, expiresIn?: number): Promise<string> {\n return this.fileStore.getSignedUrl(sessionId, path, expiresIn);\n }\n\n /**\n * Get a signed URL for direct file upload\n */\n async getUploadUrl(sessionId: string, path: string, expiresIn?: number): Promise<string> {\n return this.fileStore.getUploadUrl(sessionId, path, expiresIn);\n }\n}\n\n/**\n * Create a SandboxFileSync instance\n */\nexport function createSandboxFileSync(options: SandboxFileSyncOptions): SandboxFileSync {\n return new SandboxFileSync(options);\n}\n","/**\n * Agent Runtime & Sandboxing Configuration\n *\n * This module provides utilities for configuring secure agent execution environments.\n * The Claude Agent SDK can run in various isolation levels depending on security needs:\n *\n * - Local: No isolation, runs directly on host (development only)\n * - Sandbox: Built-in sandbox mode with restricted fs/network\n * - Docker: Container isolation with configurable security\n * - gVisor: Kernel-level isolation for multi-tenant deployments\n * - VM: Full virtual machine isolation (Firecracker, etc.)\n *\n * @see https://platform.claude.com/docs/en/agent-sdk/hosting\n * @see https://platform.claude.com/docs/en/agent-sdk/secure-deployment\n */\n\nimport type { ClaudeAgentOptions } from '../agent/claude-sdk.js';\n\n/**\n * Sandbox configuration for the Claude Agent SDK\n */\nexport interface SandboxConfig {\n /** Enable sandbox mode */\n enabled: boolean;\n\n /** Allowed filesystem paths (read/write) */\n allowedPaths?: string[];\n\n /** Read-only filesystem paths */\n readOnlyPaths?: string[];\n\n /** Allowed network domains */\n allowedDomains?: string[];\n\n /** Block all network access */\n networkDisabled?: boolean;\n\n /** Maximum execution time in seconds */\n timeout?: number;\n\n /** Memory limit in bytes */\n memoryLimit?: number;\n\n /** Maximum number of processes */\n processLimit?: number;\n}\n\n/**\n * Docker container configuration for agent isolation\n */\nexport interface DockerConfig {\n /** Docker image to use */\n image: string;\n\n /** Container name prefix */\n namePrefix?: string;\n\n /** Memory limit (e.g., '2g') */\n memory?: string;\n\n /** CPU limit (e.g., '2') */\n cpus?: string;\n\n /** Run container in read-only mode */\n readOnly?: boolean;\n\n /** Drop all Linux capabilities */\n dropCapabilities?: boolean;\n\n /** Disable network access */\n networkNone?: boolean;\n\n /** Volume mounts */\n volumes?: Array<{\n hostPath: string;\n containerPath: string;\n readOnly?: boolean;\n }>;\n\n /** Tmpfs mounts for ephemeral storage */\n tmpfs?: Array<{\n path: string;\n size?: string;\n options?: string;\n }>;\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /** Use gVisor runtime for enhanced isolation */\n useGVisor?: boolean;\n\n /** Custom Docker run arguments */\n additionalArgs?: string[];\n}\n\n/**\n * Proxy configuration for credential injection and network control\n */\nexport interface ProxyConfig {\n /** Proxy URL for HTTP traffic */\n httpProxy?: string;\n\n /** Proxy URL for HTTPS traffic */\n httpsProxy?: string;\n\n /** Custom base URL for Anthropic API (routes through proxy) */\n anthropicBaseUrl?: string;\n\n /** Unix socket path for proxy connection */\n unixSocket?: string;\n\n /** Domains that bypass the proxy */\n noProxy?: string[];\n}\n\n/**\n * Full runtime configuration\n */\nexport interface RuntimeConfig {\n /** Isolation mode */\n mode: 'local' | 'sandbox' | 'docker' | 'gvisor' | 'vm';\n\n /** Sandbox settings (for sandbox mode) */\n sandbox?: SandboxConfig;\n\n /** Docker settings (for docker/gvisor modes) */\n docker?: DockerConfig;\n\n /** Proxy settings for credential injection */\n proxy?: ProxyConfig;\n\n /** Working directory for the agent */\n workingDirectory?: string;\n\n /** Deployment pattern */\n pattern?: 'ephemeral' | 'long-running' | 'hybrid';\n\n /** Health check configuration */\n healthCheck?: {\n enabled: boolean;\n interval?: number;\n timeout?: number;\n endpoint?: string;\n };\n}\n\n/**\n * Generate Docker run command from configuration\n */\nexport function generateDockerCommand(config: DockerConfig): string[] {\n const args: string[] = ['docker', 'run'];\n\n // Security options\n if (config.dropCapabilities) {\n args.push('--cap-drop', 'ALL');\n args.push('--security-opt', 'no-new-privileges');\n }\n\n // Resource limits\n if (config.memory) {\n args.push('--memory', config.memory);\n }\n if (config.cpus) {\n args.push('--cpus', config.cpus);\n }\n\n // Filesystem\n if (config.readOnly) {\n args.push('--read-only');\n }\n\n // Tmpfs mounts\n if (config.tmpfs) {\n for (const mount of config.tmpfs) {\n const opts = [\n mount.size ? `size=${mount.size}` : '',\n mount.options ?? 'rw,noexec,nosuid',\n ]\n .filter(Boolean)\n .join(',');\n args.push('--tmpfs', `${mount.path}:${opts}`);\n }\n }\n\n // Network\n if (config.networkNone) {\n args.push('--network', 'none');\n }\n\n // Volumes\n if (config.volumes) {\n for (const vol of config.volumes) {\n const mode = vol.readOnly ? ':ro' : '';\n args.push('-v', `${vol.hostPath}:${vol.containerPath}${mode}`);\n }\n }\n\n // Environment\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n args.push('-e', `${key}=${value}`);\n }\n }\n\n // Runtime\n if (config.useGVisor) {\n args.push('--runtime', 'runsc');\n }\n\n // Additional args\n if (config.additionalArgs) {\n args.push(...config.additionalArgs);\n }\n\n // Image\n args.push(config.image);\n\n return args;\n}\n\n/**\n * Generate environment variables for proxy configuration\n */\nexport function generateProxyEnv(config: ProxyConfig): Record<string, string> {\n const env: Record<string, string> = {};\n\n if (config.httpProxy) {\n env.HTTP_PROXY = config.httpProxy;\n env.http_proxy = config.httpProxy;\n }\n\n if (config.httpsProxy) {\n env.HTTPS_PROXY = config.httpsProxy;\n env.https_proxy = config.httpsProxy;\n }\n\n if (config.anthropicBaseUrl) {\n env.ANTHROPIC_BASE_URL = config.anthropicBaseUrl;\n }\n\n if (config.noProxy?.length) {\n const noProxyStr = config.noProxy.join(',');\n env.NO_PROXY = noProxyStr;\n env.no_proxy = noProxyStr;\n }\n\n return env;\n}\n\n/**\n * Create sandbox configuration for Claude Agent SDK options\n */\nexport function createSandboxOptions(_config: SandboxConfig): Partial<ClaudeAgentOptions> {\n // The SDK accepts sandbox settings through the sandbox option\n // This is passed to the Claude Code CLI's sandboxing feature\n return {\n // Note: These would be passed to the SDK's sandbox settings\n // The exact format depends on the SDK version\n };\n}\n\n/**\n * Runtime configuration presets\n */\nexport const RuntimePresets = {\n /**\n * Development mode - no isolation, for local testing\n */\n development: (): RuntimeConfig => ({\n mode: 'local',\n pattern: 'ephemeral',\n }),\n\n /**\n * Basic sandbox - built-in Claude Code sandboxing\n */\n sandboxed: (options: {\n allowedPaths?: string[];\n allowedDomains?: string[];\n }): RuntimeConfig => ({\n mode: 'sandbox',\n pattern: 'ephemeral',\n sandbox: {\n enabled: true,\n allowedPaths: options.allowedPaths,\n allowedDomains: options.allowedDomains,\n },\n }),\n\n /**\n * Docker container with security hardening\n */\n dockerSecure: (options: {\n image: string;\n workingDirectory: string;\n proxyUrl?: string;\n }): RuntimeConfig => ({\n mode: 'docker',\n pattern: 'ephemeral',\n workingDirectory: options.workingDirectory,\n docker: {\n image: options.image,\n memory: '2g',\n cpus: '2',\n readOnly: true,\n dropCapabilities: true,\n networkNone: !!options.proxyUrl, // Use network none if proxy provided\n tmpfs: [\n { path: '/tmp', size: '100m', options: 'rw,noexec,nosuid' },\n { path: '/home/agent', size: '500m', options: 'rw,noexec,nosuid' },\n ],\n volumes: [\n {\n hostPath: options.workingDirectory,\n containerPath: '/workspace',\n readOnly: true,\n },\n ],\n },\n proxy: options.proxyUrl\n ? {\n anthropicBaseUrl: options.proxyUrl,\n httpProxy: options.proxyUrl,\n httpsProxy: options.proxyUrl,\n }\n : undefined,\n }),\n\n /**\n * gVisor for multi-tenant deployments\n */\n gvisorMultiTenant: (options: {\n image: string;\n workingDirectory: string;\n proxyUrl: string;\n }): RuntimeConfig => ({\n mode: 'gvisor',\n pattern: 'ephemeral',\n workingDirectory: options.workingDirectory,\n docker: {\n image: options.image,\n memory: '2g',\n cpus: '1',\n readOnly: true,\n dropCapabilities: true,\n networkNone: true,\n useGVisor: true,\n tmpfs: [\n { path: '/tmp', size: '100m' },\n { path: '/workspace', size: '500m' },\n ],\n },\n proxy: {\n anthropicBaseUrl: options.proxyUrl,\n unixSocket: '/var/run/proxy.sock',\n },\n }),\n\n /**\n * Long-running agent for continuous tasks\n */\n longRunning: (options: {\n image: string;\n memory?: string;\n proxyUrl?: string;\n }): RuntimeConfig => ({\n mode: 'docker',\n pattern: 'long-running',\n docker: {\n image: options.image,\n memory: options.memory ?? '4g',\n cpus: '2',\n dropCapabilities: true,\n },\n proxy: options.proxyUrl\n ? { anthropicBaseUrl: options.proxyUrl }\n : undefined,\n healthCheck: {\n enabled: true,\n interval: 30,\n timeout: 10,\n },\n }),\n};\n\n/**\n * Builder for runtime configuration\n */\nexport class RuntimeConfigBuilder {\n private config: RuntimeConfig = {\n mode: 'local',\n };\n\n mode(mode: RuntimeConfig['mode']): this {\n this.config.mode = mode;\n return this;\n }\n\n pattern(pattern: RuntimeConfig['pattern']): this {\n this.config.pattern = pattern;\n return this;\n }\n\n workingDirectory(path: string): this {\n this.config.workingDirectory = path;\n return this;\n }\n\n sandbox(config: SandboxConfig): this {\n this.config.sandbox = config;\n return this;\n }\n\n docker(config: DockerConfig): this {\n this.config.docker = config;\n return this;\n }\n\n proxy(config: ProxyConfig): this {\n this.config.proxy = config;\n return this;\n }\n\n healthCheck(enabled: boolean, options?: Omit<RuntimeConfig['healthCheck'], 'enabled'>): this {\n this.config.healthCheck = { enabled, ...options };\n return this;\n }\n\n build(): RuntimeConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Create a runtime configuration builder\n */\nexport function configureRuntime(): RuntimeConfigBuilder {\n return new RuntimeConfigBuilder();\n}\n\n/**\n * Security best practices checker\n */\nexport function checkSecurityConfig(config: RuntimeConfig): {\n issues: string[];\n warnings: string[];\n recommendations: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Check mode\n if (config.mode === 'local') {\n warnings.push('Running in local mode without isolation. Not recommended for production.');\n }\n\n // Check Docker config\n if (config.docker) {\n if (!config.docker.dropCapabilities) {\n warnings.push('Linux capabilities not dropped. Consider adding --cap-drop ALL.');\n }\n\n if (!config.docker.readOnly) {\n recommendations.push('Consider using read-only root filesystem (--read-only).');\n }\n\n if (!config.docker.networkNone && !config.proxy) {\n warnings.push('Container has network access without proxy. Consider using network controls.');\n }\n\n if (!config.docker.memory) {\n recommendations.push('No memory limit set. Consider adding --memory to prevent resource exhaustion.');\n }\n }\n\n // Check proxy config\n if (config.mode !== 'local' && !config.proxy) {\n recommendations.push(\n 'No proxy configured. Consider using a proxy for credential injection and network control.'\n );\n }\n\n // Check pattern\n if (config.pattern === 'long-running' && !config.healthCheck?.enabled) {\n recommendations.push('Long-running pattern without health checks. Consider enabling health checks.');\n }\n\n return { issues, warnings, recommendations };\n}\n\n/**\n * Credential paths that should be excluded from mounts\n */\nexport const SENSITIVE_PATHS = [\n '.env',\n '.env.local',\n '.env.production',\n '~/.git-credentials',\n '~/.aws/credentials',\n '~/.config/gcloud/application_default_credentials.json',\n '~/.azure/',\n '~/.docker/config.json',\n '~/.kube/config',\n '.npmrc',\n '.pypirc',\n '*-service-account.json',\n '*.pem',\n '*.key',\n '~/.ssh/',\n];\n\n/**\n * Check if a path might contain sensitive credentials\n */\nexport function isSensitivePath(path: string): boolean {\n const normalized = path.replace(/\\\\/g, '/').toLowerCase();\n\n for (const sensitive of SENSITIVE_PATHS) {\n const pattern = sensitive\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/~/g, '.*');\n\n if (new RegExp(pattern).test(normalized)) {\n return true;\n }\n }\n\n return false;\n}\n\n// Re-export sandbox providers\nexport * from './providers/index.js';\n\n// Re-export sandbox manager\nexport {\n SandboxManager,\n getSandboxManager,\n createSandboxManager,\n DEFAULT_SANDBOX_EXECUTION_CONFIG,\n} from './sandbox-manager.js';\nexport type {\n SandboxExecutionConfig,\n ActiveSandbox,\n} from './sandbox-manager.js';\n\n// Re-export Vercel Sandbox Executor (unified implementation)\nexport {\n createVercelSandboxExecutor,\n shouldUseSandbox,\n // Sandbox cache functions\n getOrCreateSandbox,\n markSdkInstalled,\n markConfigInstalled,\n markStartupScriptRan,\n needsStartupScriptRerun,\n rekeySessionId,\n releaseSandbox,\n invalidateSandbox,\n isSandboxExpiredError,\n getSandboxCacheStats,\n cleanupAllSandboxes,\n hashStartupScript,\n // Heartbeat functions\n onHeartbeat,\n getHeartbeatStatus,\n getAllHeartbeatStatuses,\n // File operations\n isSandboxRunning,\n writeFileToSandbox,\n readFileFromSandbox,\n listFilesInSandbox,\n createSandboxFileOperations,\n} from './vercel-sandbox-executor.js';\nexport type {\n GetOrCreateSandboxOptions,\n SandboxWithState,\n SandboxHeartbeatStatus,\n} from './vercel-sandbox-executor.js';\n\n// Re-export Sandbox File Sync\nexport {\n SandboxFileSync,\n createSandboxFileSync,\n} from './sandbox-file-sync.js';\nexport type {\n SandboxFileSyncOptions,\n SandboxFileOperations,\n SandboxWriteResult,\n SandboxReadResult,\n FilePushResult,\n FilePullResult,\n SyncResult,\n PushOptions,\n} from './sandbox-file-sync.js';\n\n// Re-export Sandbox Pool\nexport {\n SandboxPool,\n getSandboxPool,\n ensureSandboxPoolInitialized,\n initializeSandboxPool,\n shutdownSandboxPool,\n} from './sandbox-pool.js';\nexport type {\n SandboxPoolConfig,\n SandboxPoolStatus,\n PooledSandbox,\n SandboxPoolMetricsCallback,\n} from './sandbox-pool.js';\n","/**\n * Credential Management\n *\n * Secure storage and handling of user API keys.\n * Supports encryption at rest and per-session key injection.\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'crypto';\n\n/**\n * Encrypted credential with metadata\n */\nexport interface EncryptedCredential {\n /** Unique identifier for this credential */\n id: string;\n\n /** User or resource this credential belongs to */\n ownerId: string;\n\n /** Type of credential (e.g., 'anthropic', 'openai') */\n type: 'anthropic' | 'openai' | 'custom';\n\n /** Encrypted API key (base64) */\n encryptedKey: string;\n\n /** Initialization vector (base64) */\n iv: string;\n\n /** Auth tag for AES-GCM (base64) */\n authTag: string;\n\n /** When the credential was created */\n createdAt: Date;\n\n /** When the credential was last used */\n lastUsedAt?: Date;\n\n /** Optional label for the credential */\n label?: string;\n\n /** Whether the credential is active */\n active: boolean;\n}\n\n/**\n * Credential storage interface\n */\nexport interface CredentialStorage {\n /**\n * Store an encrypted credential\n */\n store(credential: EncryptedCredential): Promise<void>;\n\n /**\n * Get a credential by ID\n */\n get(id: string): Promise<EncryptedCredential | null>;\n\n /**\n * Get all credentials for an owner\n */\n getByOwner(ownerId: string): Promise<EncryptedCredential[]>;\n\n /**\n * Delete a credential\n */\n delete(id: string): Promise<void>;\n\n /**\n * Update last used timestamp\n */\n updateLastUsed(id: string): Promise<void>;\n}\n\n/**\n * In-memory credential storage (for development/testing)\n */\nexport class MemoryCredentialStorage implements CredentialStorage {\n private credentials: Map<string, EncryptedCredential> = new Map();\n\n async store(credential: EncryptedCredential): Promise<void> {\n this.credentials.set(credential.id, { ...credential });\n }\n\n async get(id: string): Promise<EncryptedCredential | null> {\n return this.credentials.get(id) ?? null;\n }\n\n async getByOwner(ownerId: string): Promise<EncryptedCredential[]> {\n return Array.from(this.credentials.values()).filter(\n (c) => c.ownerId === ownerId\n );\n }\n\n async delete(id: string): Promise<void> {\n this.credentials.delete(id);\n }\n\n async updateLastUsed(id: string): Promise<void> {\n const credential = this.credentials.get(id);\n if (credential) {\n credential.lastUsedAt = new Date();\n }\n }\n}\n\n/**\n * Credential manager configuration\n */\nexport interface CredentialManagerConfig {\n /**\n * Encryption key (32 bytes for AES-256)\n * Should be derived from a master secret using a KDF\n */\n encryptionKey?: string;\n\n /**\n * Salt for key derivation\n */\n salt?: string;\n\n /**\n * Storage backend\n */\n storage?: CredentialStorage;\n}\n\n/**\n * Manages secure storage and retrieval of API credentials\n *\n * @example\n * ```typescript\n * const manager = new CredentialManager({\n * encryptionKey: process.env.CREDENTIAL_ENCRYPTION_KEY,\n * });\n *\n * // Store a user's API key\n * const credentialId = await manager.storeCredential(\n * 'user-123',\n * 'anthropic',\n * 'sk-ant-...'\n * );\n *\n * // Retrieve for use in a session\n * const apiKey = await manager.getDecryptedKey(credentialId);\n * ```\n */\nexport class CredentialManager {\n private encryptionKey: Buffer;\n private storage: CredentialStorage;\n\n constructor(config: CredentialManagerConfig = {}) {\n // Derive encryption key from provided key or generate one\n const keySource =\n config.encryptionKey ?? process.env.CREDENTIAL_ENCRYPTION_KEY ?? '';\n const salt = config.salt ?? process.env.CREDENTIAL_SALT ?? 'agent-sdk-harness';\n\n if (keySource) {\n // Derive a 32-byte key using scrypt\n this.encryptionKey = scryptSync(keySource, salt, 32);\n } else {\n // Generate a random key (only for development - not persistent!)\n console.warn(\n 'CredentialManager: No encryption key provided. Using random key (credentials will not persist across restarts).'\n );\n this.encryptionKey = randomBytes(32);\n }\n\n this.storage = config.storage ?? new MemoryCredentialStorage();\n }\n\n /**\n * Store a credential securely\n *\n * @param ownerId - User or resource ID that owns this credential\n * @param type - Type of credential\n * @param apiKey - The plaintext API key to encrypt\n * @param label - Optional label for the credential\n * @returns The credential ID\n */\n async storeCredential(\n ownerId: string,\n type: EncryptedCredential['type'],\n apiKey: string,\n label?: string\n ): Promise<string> {\n // Generate ID and IV\n const id = `cred_${randomBytes(16).toString('hex')}`;\n const iv = randomBytes(16);\n\n // Encrypt with AES-256-GCM\n const cipher = createCipheriv('aes-256-gcm', this.encryptionKey, iv);\n const encrypted = Buffer.concat([\n cipher.update(apiKey, 'utf8'),\n cipher.final(),\n ]);\n const authTag = cipher.getAuthTag();\n\n const credential: EncryptedCredential = {\n id,\n ownerId,\n type,\n encryptedKey: encrypted.toString('base64'),\n iv: iv.toString('base64'),\n authTag: authTag.toString('base64'),\n createdAt: new Date(),\n label,\n active: true,\n };\n\n await this.storage.store(credential);\n return id;\n }\n\n /**\n * Get a decrypted API key\n *\n * @param credentialId - The credential ID\n * @returns The decrypted API key or null if not found\n */\n async getDecryptedKey(credentialId: string): Promise<string | null> {\n const credential = await this.storage.get(credentialId);\n if (!credential || !credential.active) {\n return null;\n }\n\n try {\n const iv = Buffer.from(credential.iv, 'base64');\n const authTag = Buffer.from(credential.authTag, 'base64');\n const encrypted = Buffer.from(credential.encryptedKey, 'base64');\n\n const decipher = createDecipheriv('aes-256-gcm', this.encryptionKey, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n\n // Update last used timestamp\n await this.storage.updateLastUsed(credentialId);\n\n return decrypted.toString('utf8');\n } catch (error) {\n console.error('Failed to decrypt credential:', error);\n return null;\n }\n }\n\n /**\n * Get all credentials for an owner (without decrypting)\n */\n async getCredentials(ownerId: string): Promise<Array<{\n id: string;\n type: EncryptedCredential['type'];\n label?: string;\n createdAt: Date;\n lastUsedAt?: Date;\n active: boolean;\n }>> {\n const credentials = await this.storage.getByOwner(ownerId);\n return credentials.map((c) => ({\n id: c.id,\n type: c.type,\n label: c.label,\n createdAt: c.createdAt,\n lastUsedAt: c.lastUsedAt,\n active: c.active,\n }));\n }\n\n /**\n * Delete a credential\n */\n async deleteCredential(credentialId: string): Promise<void> {\n await this.storage.delete(credentialId);\n }\n\n /**\n * Validate an API key format (basic check)\n */\n static validateApiKeyFormat(apiKey: string, type: string): boolean {\n switch (type) {\n case 'anthropic':\n return apiKey.startsWith('sk-ant-') && apiKey.length > 20;\n case 'openai':\n return apiKey.startsWith('sk-') && apiKey.length > 20;\n default:\n return apiKey.length > 10;\n }\n }\n\n /**\n * Mask an API key for display\n */\n static maskApiKey(apiKey: string): string {\n if (apiKey.length < 12) {\n return '****';\n }\n return `${apiKey.slice(0, 7)}...${apiKey.slice(-4)}`;\n }\n}\n\n/**\n * Create a credential manager with default settings\n */\nexport function createCredentialManager(\n config?: CredentialManagerConfig\n): CredentialManager {\n return new CredentialManager(config);\n}\n","import { z } from 'zod';\n\n// ============================================================================\n// Skill Source Types\n// ============================================================================\n\n/**\n * Configuration for a GitHub-based skill source\n */\nexport interface GitHubSkillSource {\n type: 'github';\n /** Repository in \"owner/repo\" format */\n repo: string;\n /** Branch name (default: \"main\") */\n branch?: string;\n /** Path within the repository (default: \".\") */\n path?: string;\n}\n\n/**\n * Configuration for a local filesystem skill source\n */\nexport interface LocalSkillSource {\n type: 'local';\n /** Absolute path to the local directory */\n localPath: string;\n}\n\n/**\n * Union of all skill source types\n */\nexport type SkillSource = GitHubSkillSource | LocalSkillSource;\n\n// ============================================================================\n// Skill Config (embedded in agent config)\n// ============================================================================\n\n/**\n * A skill configuration embedded in an agent's config.\n * Points to a source (GitHub repo or local folder) and specifies which files to include.\n */\nexport interface SkillConfig {\n /** Display name for the skill (used as folder name in .claude/skills/) */\n name: string;\n /** Optional description for UI */\n description?: string;\n /** Source configuration (GitHub or local) */\n source: SkillSource;\n /** Relative paths to include from source (e.g., [\"SKILL.md\", \"scripts/\"]) */\n includePaths: string[];\n /** Whether this skill is enabled (default: true) */\n enabled?: boolean;\n}\n\n// ============================================================================\n// File Entry Types (for browsing)\n// ============================================================================\n\n/**\n * Represents a file or directory entry when browsing a skill source\n */\nexport interface FileEntry {\n /** File or directory name */\n name: string;\n /** Full path relative to source root */\n path: string;\n /** Type of entry */\n type: 'file' | 'directory';\n /** File size in bytes (only for files) */\n size?: number;\n /** Last modified timestamp */\n modifiedAt?: Date;\n}\n\n/**\n * File content with metadata\n */\nexport interface FileContent {\n path: string;\n content: string;\n encoding: 'utf-8' | 'base64';\n size: number;\n}\n\n// ============================================================================\n// Zod Schemas for Validation\n// ============================================================================\n\nexport const gitHubSkillSourceSchema = z.object({\n type: z.literal('github'),\n repo: z.string().regex(/^[^/]+\\/[^/]+$/, 'Must be in \"owner/repo\" format'),\n branch: z.string().optional(),\n path: z.string().optional(),\n});\n\nexport const localSkillSourceSchema = z.object({\n type: z.literal('local'),\n localPath: z.string().min(1),\n});\n\nexport const skillSourceSchema = z.discriminatedUnion('type', [\n gitHubSkillSourceSchema,\n localSkillSourceSchema,\n]);\n\nexport const skillConfigSchema = z.object({\n name: z.string().min(1).max(255),\n description: z.string().optional(),\n source: skillSourceSchema,\n includePaths: z.array(z.string()).min(1),\n enabled: z.boolean().optional(),\n});\n\nexport const fileEntrySchema = z.object({\n name: z.string(),\n path: z.string(),\n type: z.enum(['file', 'directory']),\n size: z.number().optional(),\n modifiedAt: z.date().optional(),\n});\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileProvider, FileProviderOptions } from './file-provider.js';\nimport type { FileEntry, FileContent, LocalSkillSource } from './types.js';\n\nconst DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\n\n/**\n * File provider implementation for local filesystem sources.\n */\nexport class LocalFileProvider implements FileProvider {\n readonly source: LocalSkillSource;\n private readonly basePath: string;\n private readonly maxFileSize: number;\n\n constructor(source: LocalSkillSource, options: FileProviderOptions = {}) {\n this.source = source;\n this.basePath = path.resolve(source.localPath);\n this.maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;\n }\n\n /**\n * Resolve a relative path to an absolute path within the base directory.\n * Prevents path traversal attacks.\n */\n private resolvePath(relativePath: string): string {\n // Normalize and resolve the path\n const normalized = path.normalize(relativePath);\n const resolved = path.resolve(this.basePath, normalized);\n\n // Ensure the resolved path is within the base directory\n if (!resolved.startsWith(this.basePath)) {\n throw new Error(`Path traversal detected: ${relativePath}`);\n }\n\n return resolved;\n }\n\n async listFiles(relativePath: string): Promise<FileEntry[]> {\n const dirPath = this.resolvePath(relativePath || '.');\n\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n const fileEntries: FileEntry[] = await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(relativePath || '.', entry.name);\n const fullPath = path.join(dirPath, entry.name);\n\n let size: number | undefined;\n let modifiedAt: Date | undefined;\n\n try {\n const stats = await fs.stat(fullPath);\n size = entry.isFile() ? stats.size : undefined;\n modifiedAt = stats.mtime;\n } catch {\n // Ignore stat errors (e.g., broken symlinks)\n }\n\n return {\n name: entry.name,\n path: entryPath.replace(/^\\.\\/?/, ''), // Remove leading \"./\"\n type: entry.isDirectory() ? 'directory' : 'file',\n size,\n modifiedAt,\n } as FileEntry;\n })\n );\n\n // Sort: directories first, then by name\n return fileEntries.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Directory not found: ${relativePath}`);\n }\n if ((error as NodeJS.ErrnoException).code === 'ENOTDIR') {\n throw new Error(`Not a directory: ${relativePath}`);\n }\n throw error;\n }\n }\n\n async readFile(relativePath: string): Promise<FileContent> {\n const filePath = this.resolvePath(relativePath);\n\n try {\n const stats = await fs.stat(filePath);\n\n if (stats.isDirectory()) {\n throw new Error(`Cannot read directory as file: ${relativePath}`);\n }\n\n if (stats.size > this.maxFileSize) {\n throw new Error(\n `File too large: ${relativePath} (${stats.size} bytes, max ${this.maxFileSize})`\n );\n }\n\n // Try to read as UTF-8 first\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return {\n path: relativePath,\n content,\n encoding: 'utf-8',\n size: stats.size,\n };\n } catch {\n // Fall back to base64 for binary files\n const buffer = await fs.readFile(filePath);\n return {\n path: relativePath,\n content: buffer.toString('base64'),\n encoding: 'base64',\n size: stats.size,\n };\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`File not found: ${relativePath}`);\n }\n throw error;\n }\n }\n\n async exists(relativePath: string): Promise<'file' | 'directory' | null> {\n try {\n const fullPath = this.resolvePath(relativePath);\n const stats = await fs.stat(fullPath);\n return stats.isDirectory() ? 'directory' : 'file';\n } catch {\n return null;\n }\n }\n\n async copyTo(\n sourcePath: string,\n targetPath: string,\n recursive = true\n ): Promise<void> {\n const sourceFullPath = this.resolvePath(sourcePath);\n\n try {\n const stats = await fs.stat(sourceFullPath);\n\n if (stats.isDirectory()) {\n if (!recursive) {\n throw new Error(\n `Cannot copy directory without recursive flag: ${sourcePath}`\n );\n }\n await this.copyDirectory(sourceFullPath, targetPath);\n } else {\n // Ensure parent directory exists\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourceFullPath, targetPath);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Source not found: ${sourcePath}`);\n }\n throw error;\n }\n }\n\n private async copyDirectory(\n sourceDir: string,\n targetDir: string\n ): Promise<void> {\n // Create target directory\n await fs.mkdir(targetDir, { recursive: true });\n\n // Read all entries\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n\n // Copy each entry\n await Promise.all(\n entries.map(async (entry) => {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n await this.copyDirectory(sourcePath, targetPath);\n } else {\n await fs.copyFile(sourcePath, targetPath);\n }\n })\n );\n }\n}\n\n/**\n * Create a LocalFileProvider for the given source\n */\nexport function createLocalFileProvider(\n source: LocalSkillSource,\n options?: FileProviderOptions\n): LocalFileProvider {\n return new LocalFileProvider(source, options);\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileProvider, FileProviderOptions } from './file-provider.js';\nimport type { FileEntry, FileContent, GitHubSkillSource } from './types.js';\n\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\nconst DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\nconst GITHUB_API_BASE = 'https://api.github.com';\n\ninterface GitHubContentResponse {\n name: string;\n path: string;\n sha: string;\n size: number;\n url: string;\n html_url: string;\n git_url: string;\n download_url: string | null;\n type: 'file' | 'dir';\n content?: string;\n encoding?: string;\n}\n\n/**\n * File provider implementation for GitHub repository sources.\n * Uses the GitHub Contents API for file operations.\n */\nexport class GitHubFileProvider implements FileProvider {\n readonly source: GitHubSkillSource;\n private readonly owner: string;\n private readonly repo: string;\n private readonly branch: string;\n private readonly basePath: string;\n private readonly token?: string;\n private readonly timeout: number;\n private readonly maxFileSize: number;\n\n constructor(source: GitHubSkillSource, options: FileProviderOptions = {}) {\n this.source = source;\n\n // Parse owner/repo\n const [owner, repo] = source.repo.split('/');\n if (!owner || !repo) {\n throw new Error(`Invalid repository format: ${source.repo}. Expected \"owner/repo\"`);\n }\n this.owner = owner;\n this.repo = repo;\n\n this.branch = source.branch ?? 'main';\n this.basePath = source.path ?? '';\n this.token = options.token;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;\n }\n\n /**\n * Make an authenticated request to the GitHub API\n */\n private async fetch<T>(endpoint: string): Promise<T> {\n const url = endpoint.startsWith('http')\n ? endpoint\n : `${GITHUB_API_BASE}${endpoint}`;\n\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'agent-sdk-harness',\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Not found: ${endpoint}`);\n }\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `GitHub API authentication error. ${this.token ? 'Token may be invalid.' : 'Consider providing a token for private repos.'}`\n );\n }\n throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get the full path within the repository\n */\n private getFullPath(relativePath: string): string {\n const normalized = relativePath.replace(/^\\.?\\/?/, ''); // Remove leading \"./\" or \"/\"\n if (!this.basePath) {\n return normalized;\n }\n return normalized ? `${this.basePath}/${normalized}` : this.basePath;\n }\n\n async listFiles(relativePath: string): Promise<FileEntry[]> {\n const fullPath = this.getFullPath(relativePath);\n const endpoint = `/repos/${this.owner}/${this.repo}/contents/${fullPath}?ref=${this.branch}`;\n\n try {\n const response = await this.fetch<GitHubContentResponse | GitHubContentResponse[]>(endpoint);\n\n // If single item returned, it's a file not a directory\n if (!Array.isArray(response)) {\n throw new Error(`Not a directory: ${relativePath}`);\n }\n\n const entries: FileEntry[] = response.map((item) => ({\n name: item.name,\n path: this.basePath\n ? item.path.replace(`${this.basePath}/`, '')\n : item.path,\n type: item.type === 'dir' ? 'directory' : 'file',\n size: item.type === 'file' ? item.size : undefined,\n }));\n\n // Sort: directories first, then by name\n return entries.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Not found')) {\n throw new Error(`Directory not found: ${relativePath}`);\n }\n throw error;\n }\n }\n\n async readFile(relativePath: string): Promise<FileContent> {\n const fullPath = this.getFullPath(relativePath);\n const endpoint = `/repos/${this.owner}/${this.repo}/contents/${fullPath}?ref=${this.branch}`;\n\n try {\n const response = await this.fetch<GitHubContentResponse>(endpoint);\n\n if (response.type === 'dir') {\n throw new Error(`Cannot read directory as file: ${relativePath}`);\n }\n\n if (response.size > this.maxFileSize) {\n throw new Error(\n `File too large: ${relativePath} (${response.size} bytes, max ${this.maxFileSize})`\n );\n }\n\n // GitHub returns base64 encoded content\n if (response.content && response.encoding === 'base64') {\n // Remove newlines from base64 content (GitHub adds them)\n const base64Content = response.content.replace(/\\n/g, '');\n\n // Try to decode as UTF-8\n try {\n const content = Buffer.from(base64Content, 'base64').toString('utf-8');\n // Check if it's valid UTF-8 by looking for replacement characters\n if (!content.includes('\\ufffd')) {\n return {\n path: relativePath,\n content,\n encoding: 'utf-8',\n size: response.size,\n };\n }\n } catch {\n // Fall through to base64\n }\n\n return {\n path: relativePath,\n content: base64Content,\n encoding: 'base64',\n size: response.size,\n };\n }\n\n // For large files, use the download URL\n if (response.download_url) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const downloadResponse = await fetch(response.download_url, {\n signal: controller.signal,\n });\n\n if (!downloadResponse.ok) {\n throw new Error(`Failed to download file: ${downloadResponse.status}`);\n }\n\n const content = await downloadResponse.text();\n return {\n path: relativePath,\n content,\n encoding: 'utf-8',\n size: response.size,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n throw new Error(`Unable to read file content: ${relativePath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('Not found')) {\n throw new Error(`File not found: ${relativePath}`);\n }\n throw error;\n }\n }\n\n async exists(relativePath: string): Promise<'file' | 'directory' | null> {\n const fullPath = this.getFullPath(relativePath);\n const endpoint = `/repos/${this.owner}/${this.repo}/contents/${fullPath}?ref=${this.branch}`;\n\n try {\n const response = await this.fetch<GitHubContentResponse | GitHubContentResponse[]>(endpoint);\n\n if (Array.isArray(response)) {\n return 'directory';\n }\n return response.type === 'dir' ? 'directory' : 'file';\n } catch {\n return null;\n }\n }\n\n async copyTo(\n sourcePath: string,\n targetPath: string,\n recursive = true\n ): Promise<void> {\n const type = await this.exists(sourcePath);\n\n if (type === null) {\n throw new Error(`Source not found: ${sourcePath}`);\n }\n\n if (type === 'file') {\n // Read and write file\n const content = await this.readFile(sourcePath);\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n if (content.encoding === 'base64') {\n await fs.writeFile(targetPath, Buffer.from(content.content, 'base64'));\n } else {\n await fs.writeFile(targetPath, content.content, 'utf-8');\n }\n } else {\n // Directory\n if (!recursive) {\n throw new Error(\n `Cannot copy directory without recursive flag: ${sourcePath}`\n );\n }\n\n await fs.mkdir(targetPath, { recursive: true });\n\n const entries = await this.listFiles(sourcePath);\n await Promise.all(\n entries.map((entry) =>\n this.copyTo(\n entry.path,\n path.join(targetPath, entry.name),\n recursive\n )\n )\n );\n }\n }\n}\n\n/**\n * Create a GitHubFileProvider for the given source\n */\nexport function createGitHubFileProvider(\n source: GitHubSkillSource,\n options?: FileProviderOptions\n): GitHubFileProvider {\n return new GitHubFileProvider(source, options);\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type {\n SkillConfig,\n SkillSource,\n FileEntry,\n FileContent,\n} from './types.js';\nimport type { FileProvider, FileProviderOptions } from './file-provider.js';\nimport { LocalFileProvider } from './local-provider.js';\nimport { GitHubFileProvider } from './github-provider.js';\n\n/**\n * Options for SkillManager\n */\nexport interface SkillManagerOptions {\n /** Options for file providers */\n fileProviderOptions?: FileProviderOptions;\n /** Temporary directory for materializing skills (default: /tmp/harness-skills) */\n tempDir?: string;\n /** GitHub token for accessing private repos (can be overridden per-source) */\n githubToken?: string;\n}\n\n/**\n * SkillManager handles file browsing and runtime materialization.\n * Skills are configured as part of agent config, not stored separately.\n */\nexport class SkillManager {\n private readonly fileProviderOptions: FileProviderOptions;\n private readonly tempDir: string;\n private readonly githubToken?: string;\n\n constructor(options: SkillManagerOptions = {}) {\n this.fileProviderOptions = options.fileProviderOptions ?? {};\n this.tempDir = options.tempDir ?? '/tmp/harness-skills';\n this.githubToken = options.githubToken;\n }\n\n // ==========================================================================\n // File Provider Factory\n // ==========================================================================\n\n /**\n * Create a file provider for the given source\n */\n createFileProvider(source: SkillSource, token?: string): FileProvider {\n // Build options with token for GitHub sources\n const effectiveToken = token ?? this.githubToken;\n const optionsWithToken: FileProviderOptions = {\n ...this.fileProviderOptions,\n token: effectiveToken,\n };\n\n switch (source.type) {\n case 'local':\n return new LocalFileProvider(source, this.fileProviderOptions);\n case 'github':\n return new GitHubFileProvider(source, optionsWithToken);\n default:\n throw new Error(`Unknown skill source type: ${(source as SkillSource).type}`);\n }\n }\n\n // ==========================================================================\n // File Browsing (for UI)\n // ==========================================================================\n\n /**\n * List files at a path in a skill source\n */\n async browseSource(source: SkillSource, browsePath: string, token?: string): Promise<FileEntry[]> {\n const provider = this.createFileProvider(source, token);\n return provider.listFiles(browsePath);\n }\n\n /**\n * Read a file from a skill source\n */\n async readSourceFile(source: SkillSource, filePath: string, token?: string): Promise<FileContent> {\n const provider = this.createFileProvider(source, token);\n return provider.readFile(filePath);\n }\n\n // ==========================================================================\n // Runtime Materialization\n // ==========================================================================\n\n /**\n * Materialize skills to a target directory for a session.\n * Creates the directory structure expected by Claude SDK:\n * {targetPath}/.claude/skills/{skill-name}/...\n *\n * @param skills - Array of skill configurations from agent config\n * @param sessionId - The session ID (used for temp directory isolation)\n * @param token - Optional GitHub token for private repos\n * @returns The path to the session directory (contains .claude/skills/)\n */\n async materializeSkillsForSession(\n skills: SkillConfig[],\n sessionId: string,\n token?: string\n ): Promise<string> {\n // Filter to enabled skills only\n const enabledSkills = skills.filter((s) => s.enabled !== false);\n\n if (enabledSkills.length === 0) {\n return '';\n }\n\n // Create session-specific directory\n const sessionDir = path.join(this.tempDir, sessionId);\n const skillsDir = path.join(sessionDir, '.claude', 'skills');\n\n await fs.mkdir(skillsDir, { recursive: true });\n\n // Materialize each skill\n await Promise.all(\n enabledSkills.map((skill) => this.materializeSkill(skill, skillsDir, token))\n );\n\n return sessionDir;\n }\n\n /**\n * Materialize a single skill to the target directory\n */\n private async materializeSkill(\n skill: SkillConfig,\n skillsDir: string,\n token?: string\n ): Promise<void> {\n const provider = this.createFileProvider(skill.source, token);\n const skillDir = path.join(skillsDir, skill.name);\n\n // Create skill directory\n await fs.mkdir(skillDir, { recursive: true });\n\n // Copy each included path\n for (const includePath of skill.includePaths) {\n const targetPath = path.join(skillDir, path.basename(includePath));\n\n try {\n await provider.copyTo(includePath, targetPath, true);\n } catch (error) {\n console.error(\n `Failed to materialize ${includePath} for skill ${skill.name}:`,\n error\n );\n // Continue with other paths\n }\n }\n }\n\n /**\n * Clean up materialized skills for a session\n */\n async cleanupSession(sessionId: string): Promise<void> {\n const sessionDir = path.join(this.tempDir, sessionId);\n\n try {\n await fs.rm(sessionDir, { recursive: true, force: true });\n } catch (error) {\n // Ignore cleanup errors\n console.warn(`Failed to cleanup session directory: ${sessionDir}`, error);\n }\n }\n\n /**\n * Clean up all stale session directories (older than maxAge)\n * @param maxAgeMs - Maximum age in milliseconds (default: 24 hours)\n */\n async cleanupStale(maxAgeMs = 24 * 60 * 60 * 1000): Promise<void> {\n try {\n const entries = await fs.readdir(this.tempDir, { withFileTypes: true });\n const now = Date.now();\n\n await Promise.all(\n entries.map(async (entry) => {\n if (!entry.isDirectory()) return;\n\n const dirPath = path.join(this.tempDir, entry.name);\n try {\n const stats = await fs.stat(dirPath);\n if (now - stats.mtimeMs > maxAgeMs) {\n await fs.rm(dirPath, { recursive: true, force: true });\n }\n } catch {\n // Ignore errors\n }\n })\n );\n } catch {\n // Temp dir might not exist yet\n }\n }\n}\n\n/**\n * Create a SkillManager with the given options\n */\nexport function createSkillManager(options?: SkillManagerOptions): SkillManager {\n return new SkillManager(options);\n}\n","// Types\nexport * from './types.js';\n\n// File Provider\nexport type { FileProvider, FileProviderOptions } from './file-provider.js';\n\n// Provider Implementations\nexport { LocalFileProvider, createLocalFileProvider } from './local-provider.js';\nexport { GitHubFileProvider, createGitHubFileProvider } from './github-provider.js';\n\n// Skill Manager\nexport { SkillManager, createSkillManager } from './manager.js';\nexport type { SkillManagerOptions } from './manager.js';\n","/**\n * Message normalization utilities for converting raw SDK messages\n * to normalized entries with correlated tool calls.\n */\n\nimport type { Message, MessageContent, ToolUseContent, ToolResultContent } from '../types/index.js';\nimport type {\n NormalizedEntry,\n NormalizedToolCall,\n ActionType,\n ToolResult,\n CommandRunResult,\n TodoItem,\n} from '../types/normalized.js';\n\n// =============================================================================\n// Tool Name Formatting\n// =============================================================================\n\n/**\n * Format MCP tool names from mcp__server__tool to mcp:server:tool\n */\nexport function formatToolName(name: string): string {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3) {\n return `mcp:${parts[1]}:${parts.slice(2).join(':')}`;\n }\n }\n return name;\n}\n\n/**\n * Parse MCP tool name to extract server and tool names\n */\nexport function parseMcpToolName(name: string): { serverName: string; toolName: string } | null {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3 && parts[1] !== undefined) {\n return {\n serverName: parts[1],\n toolName: parts.slice(2).join('__'),\n };\n }\n }\n return null;\n}\n\n// =============================================================================\n// Action Type Mapping\n// =============================================================================\n\n/**\n * Map a tool name and input to a structured ActionType\n */\nexport function mapToolToActionType(\n toolName: string,\n input: unknown\n): ActionType {\n const inputObj = (input as Record<string, unknown>) || {};\n\n switch (toolName) {\n case 'Bash':\n return {\n action: 'command_run',\n command: (inputObj.command as string) || '',\n description: inputObj.description as string | undefined,\n };\n\n case 'Read':\n return {\n action: 'file_read',\n path: (inputObj.file_path as string) || '',\n offset: inputObj.offset as number | undefined,\n limit: inputObj.limit as number | undefined,\n };\n\n case 'Edit':\n return {\n action: 'file_edit',\n path: (inputObj.file_path as string) || '',\n oldString: inputObj.old_string as string | undefined,\n newString: inputObj.new_string as string | undefined,\n replaceAll: inputObj.replace_all as boolean | undefined,\n };\n\n case 'Write':\n return {\n action: 'file_write',\n path: (inputObj.file_path as string) || '',\n content: inputObj.content as string | undefined,\n };\n\n case 'Grep':\n return {\n action: 'search',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n glob: inputObj.glob as string | undefined,\n type: inputObj.type as string | undefined,\n };\n\n case 'Glob':\n return {\n action: 'glob',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n };\n\n case 'WebFetch':\n return {\n action: 'web_fetch',\n url: (inputObj.url as string) || '',\n prompt: inputObj.prompt as string | undefined,\n };\n\n case 'WebSearch':\n return {\n action: 'web_search',\n query: (inputObj.query as string) || '',\n };\n\n case 'TodoWrite': {\n const todos = (inputObj.todos as TodoItem[]) || [];\n const stats = {\n total: todos.length,\n completed: todos.filter((t) => t.status === 'completed').length,\n inProgress: todos.filter((t) => t.status === 'in_progress').length,\n pending: todos.filter((t) => t.status === 'pending').length,\n };\n return {\n action: 'todo_write',\n todos,\n stats,\n };\n }\n\n default: {\n // Check if it's an MCP tool\n const mcpParts = parseMcpToolName(toolName);\n if (mcpParts) {\n return {\n action: 'mcp_tool',\n serverName: mcpParts.serverName,\n toolName: mcpParts.toolName,\n arguments: input,\n };\n }\n\n // Generic tool\n return {\n action: 'generic_tool',\n toolName: formatToolName(toolName),\n arguments: input,\n };\n }\n }\n}\n\n// =============================================================================\n// Summary Generation\n// =============================================================================\n\n/**\n * Generate a human-readable summary for a tool call\n */\nexport function generateToolSummary(\n _toolName: string,\n _input: unknown,\n actionType: ActionType\n): string {\n switch (actionType.action) {\n case 'command_run':\n // Truncate long commands\n const cmd = actionType.command;\n return cmd.length > 60 ? cmd.substring(0, 57) + '...' : cmd;\n\n case 'file_read':\n return actionType.path;\n\n case 'file_edit':\n return actionType.path;\n\n case 'file_write':\n return actionType.path;\n\n case 'search':\n return `${actionType.pattern}${actionType.path ? ` in ${actionType.path}` : ''}`;\n\n case 'glob':\n return actionType.pattern;\n\n case 'web_fetch':\n return actionType.url;\n\n case 'web_search':\n return actionType.query;\n\n case 'mcp_tool':\n return `${actionType.serverName}:${actionType.toolName}`;\n\n case 'generic_tool':\n return actionType.toolName;\n\n case 'todo_write': {\n const { stats } = actionType;\n if (stats) {\n return `${stats.completed}/${stats.total} completed`;\n }\n return `${actionType.todos.length} tasks`;\n }\n\n default:\n return 'Unknown tool';\n }\n}\n\n// =============================================================================\n// Result Normalization\n// =============================================================================\n\n/**\n * Extract text content from various content formats\n */\nexport function extractTextContent(content: unknown): string {\n if (typeof content === 'string') return content;\n\n if (Array.isArray(content)) {\n return content\n .filter((item): item is { text: string } => typeof item?.text === 'string')\n .map((item) => item.text)\n .join('\\n');\n }\n\n if (content && typeof content === 'object' && 'text' in content) {\n return String((content as { text: unknown }).text);\n }\n\n return JSON.stringify(content, null, 2);\n}\n\n/**\n * Normalize tool result content to markdown or JSON format\n */\nexport function normalizeToolResult(content: unknown): ToolResult {\n if (typeof content === 'string') {\n // Try parsing as JSON\n try {\n const parsed = JSON.parse(content);\n return { type: 'json', value: parsed };\n } catch {\n return { type: 'markdown', value: content };\n }\n }\n\n // Handle array of text items: [{ type: 'text', text: '...' }]\n if (Array.isArray(content)) {\n const texts = content\n .filter(\n (item): item is { type: 'text'; text: string } =>\n item?.type === 'text' && typeof item.text === 'string'\n )\n .map((item) => item.text);\n\n if (texts.length > 0) {\n const joined = texts.join('\\n\\n');\n try {\n return { type: 'json', value: JSON.parse(joined) };\n } catch {\n return { type: 'markdown', value: joined };\n }\n }\n }\n\n return { type: 'json', value: content };\n}\n\n/**\n * Parse command result from tool result content\n */\nexport function parseCommandResult(content: unknown): CommandRunResult {\n const output = extractTextContent(content);\n\n // Try to parse structured output (exitCode, output)\n if (typeof content === 'string') {\n try {\n const parsed = JSON.parse(content);\n if (typeof parsed.exitCode === 'number') {\n return {\n exitCode: parsed.exitCode,\n output: parsed.output || output,\n success: parsed.exitCode === 0,\n };\n }\n } catch {\n // Not JSON, use raw output\n }\n }\n\n return {\n output,\n success: true, // Assume success if no exit code\n };\n}\n\n// =============================================================================\n// Tool Call Creation\n// =============================================================================\n\n/**\n * Create a NormalizedToolCall from a tool_use content block\n */\nexport function createToolCall(toolUse: ToolUseContent): NormalizedToolCall {\n const actionType = mapToolToActionType(toolUse.name, toolUse.input);\n const summary = generateToolSummary(toolUse.name, toolUse.input, actionType);\n\n return {\n id: toolUse.id,\n toolName: toolUse.name,\n actionType,\n status: 'pending',\n summary,\n startedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Update a NormalizedToolCall with its result\n */\nexport function updateToolCallWithResult(\n toolCall: NormalizedToolCall,\n content: unknown,\n isError?: boolean\n): NormalizedToolCall {\n const updatedToolCall = { ...toolCall };\n const actionType = { ...toolCall.actionType };\n\n updatedToolCall.status = isError ? 'failed' : 'success';\n updatedToolCall.completedAt = new Date().toISOString();\n updatedToolCall.isError = isError;\n\n // Update action type with result\n if (actionType.action === 'command_run') {\n const result = parseCommandResult(content);\n (actionType as typeof actionType).result = result;\n if (result.exitCode !== undefined && result.exitCode !== 0) {\n updatedToolCall.status = 'failed';\n updatedToolCall.isError = true;\n }\n } else if (actionType.action === 'mcp_tool' || actionType.action === 'generic_tool') {\n (actionType as typeof actionType).result = normalizeToolResult(content);\n }\n\n updatedToolCall.actionType = actionType;\n return updatedToolCall;\n}\n\n// =============================================================================\n// Message Normalization\n// =============================================================================\n\n/**\n * Check if a content block is a tool_use block\n */\nfunction isToolUseContent(block: MessageContent): block is ToolUseContent {\n return block.type === 'tool_use';\n}\n\n/**\n * Check if a content block is a tool_result block\n */\nfunction isToolResultContent(block: MessageContent): block is ToolResultContent {\n return block.type === 'tool_result';\n}\n\n/**\n * Normalize an array of messages into NormalizedEntry array.\n * This correlates tool_use blocks with their tool_result blocks.\n */\nexport function normalizeMessages(messages: Message[]): NormalizedEntry[] {\n const entries: NormalizedEntry[] = [];\n\n // Map to store pending tool calls by ID\n const pendingToolCalls = new Map<string, NormalizedToolCall>();\n\n // Map to track which entries contain tool calls (for updating)\n const toolCallEntryMap = new Map<string, NormalizedEntry>();\n\n for (const message of messages) {\n const timestamp = message.createdAt instanceof Date\n ? message.createdAt.toISOString()\n : message.createdAt;\n\n for (const block of message.content) {\n if (block.type === 'text' && 'text' in block) {\n // Text content - determine if user or assistant\n entries.push({\n id: `${message.id}-text-${entries.length}`,\n timestamp,\n entryType: {\n type: message.role === 'user' ? 'user_message' : 'assistant_message',\n },\n content: block.text,\n });\n } else if (isToolUseContent(block)) {\n // Tool use - create pending tool call\n const toolCall = createToolCall(block);\n pendingToolCalls.set(block.id, toolCall);\n\n const entry: NormalizedEntry = {\n id: block.id,\n timestamp,\n entryType: {\n type: 'tool_call',\n toolCall,\n },\n content: toolCall.summary,\n };\n entries.push(entry);\n toolCallEntryMap.set(block.id, entry);\n } else if (isToolResultContent(block)) {\n // Tool result - find and update the corresponding tool call\n const toolUseId = block.toolUseId;\n const pendingToolCall = pendingToolCalls.get(toolUseId);\n\n if (pendingToolCall) {\n // Update the tool call with result\n const updatedToolCall = updateToolCallWithResult(\n pendingToolCall,\n block.content,\n block.isError\n );\n\n // Update the entry in place\n const entry = toolCallEntryMap.get(toolUseId);\n if (entry && entry.entryType.type === 'tool_call') {\n entry.entryType.toolCall = updatedToolCall;\n }\n\n pendingToolCalls.delete(toolUseId);\n }\n }\n }\n }\n\n return entries;\n}\n\n/**\n * Get display icon name for an action type\n */\nexport function getActionIcon(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'terminal';\n case 'file_read':\n return 'file-text';\n case 'file_edit':\n return 'edit';\n case 'file_write':\n return 'file-plus';\n case 'search':\n return 'search';\n case 'glob':\n return 'folder-search';\n case 'web_fetch':\n return 'globe';\n case 'web_search':\n return 'search';\n case 'mcp_tool':\n return 'plug';\n case 'generic_tool':\n return 'tool';\n case 'todo_write':\n return 'list-checks';\n default:\n return 'tool';\n }\n}\n\n/**\n * Get display label for an action type\n */\nexport function getActionLabel(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'Command';\n case 'file_read':\n return 'Read';\n case 'file_edit':\n return 'Edit';\n case 'file_write':\n return 'Write';\n case 'search':\n return 'Search';\n case 'glob':\n return 'Glob';\n case 'web_fetch':\n return 'Fetch';\n case 'web_search':\n return 'Search';\n case 'mcp_tool':\n return 'MCP';\n case 'generic_tool':\n return 'Tool';\n case 'todo_write':\n return 'Tasks';\n default:\n return 'Tool';\n }\n}\n","/**\n * Streaming tool call processor for real-time tool call display.\n *\n * This processor handles incoming stream events and maintains correlated\n * tool call state, enabling real-time UI updates as tool calls execute.\n */\n\nimport type { StreamEvent, ToolUseEvent, ToolResultEvent } from '../types/index.js';\nimport type { NormalizedEntry, NormalizedToolCall } from '../types/normalized.js';\nimport {\n createToolCall,\n updateToolCallWithResult,\n} from './normalize-messages.js';\n\n/**\n * Listener callback for entry updates\n */\nexport type EntryListener = (entries: NormalizedEntry[]) => void;\n\n/**\n * Processor for streaming tool call events.\n *\n * This class maintains state during a streaming conversation,\n * correlating tool_use events with their tool_result events\n * and providing real-time updates to listeners.\n *\n * @example\n * ```typescript\n * const processor = new ToolCallProcessor();\n *\n * // Subscribe to updates\n * processor.subscribe((entries) => {\n * setConversationEntries(entries);\n * });\n *\n * // Process streaming events\n * for await (const event of response) {\n * processor.processEvent(event);\n * }\n * ```\n */\nexport class ToolCallProcessor {\n private entries: NormalizedEntry[] = [];\n private pendingToolCalls = new Map<string, { entryIndex: number; toolCall: NormalizedToolCall }>();\n private listeners = new Set<EntryListener>();\n private currentTextContent = '';\n private currentTextEntryId: string | null = null;\n private hadToolCallSinceText = false;\n /** Track the last few deltas to detect duplicates (prevents double-processing) */\n private recentDeltas: string[] = [];\n private static readonly MAX_RECENT_DELTAS = 10;\n\n /**\n * Subscribe to entry updates.\n * Returns an unsubscribe function.\n */\n subscribe(listener: EntryListener): () => void {\n this.listeners.add(listener);\n // Immediately emit current state\n listener([...this.entries]);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Get current entries (snapshot)\n */\n getEntries(): NormalizedEntry[] {\n return [...this.entries];\n }\n\n /**\n * Get pending tool calls (tools that started but haven't finished)\n */\n getPendingToolCalls(): NormalizedToolCall[] {\n return Array.from(this.pendingToolCalls.values()).map((p) => p.toolCall);\n }\n\n /**\n * Check if there are any pending tool calls\n */\n hasPendingToolCalls(): boolean {\n return this.pendingToolCalls.size > 0;\n }\n\n /**\n * Reset processor state for a new conversation\n */\n reset(): void {\n this.entries = [];\n this.pendingToolCalls.clear();\n this.currentTextContent = '';\n this.currentTextEntryId = null;\n this.hadToolCallSinceText = false;\n this.recentDeltas = [];\n this.emit();\n }\n\n /**\n * Add initial entries (e.g., from message history)\n */\n setInitialEntries(entries: NormalizedEntry[]): void {\n this.entries = [...entries];\n this.emit();\n }\n\n /**\n * Add a user message entry\n */\n addUserMessage(content: string, id?: string): void {\n this.finalizeCurrentText();\n\n this.entries.push({\n id: id || `user-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: { type: 'user_message' },\n content,\n });\n this.emit();\n }\n\n /**\n * Process an incoming stream event\n */\n processEvent(event: StreamEvent): void {\n switch (event.type) {\n case 'text_delta':\n this.handleTextDelta(event.delta);\n break;\n\n case 'thinking_delta':\n // Thinking deltas can be handled similarly to text deltas in the future\n // For now, we skip them as the UI doesn't display thinking content\n break;\n\n case 'message':\n // Complete message - usually handled by refreshing from server\n // But we can use it to finalize any streaming text\n this.finalizeCurrentText();\n break;\n\n case 'tool_use':\n this.handleToolUse(event as ToolUseEvent);\n break;\n\n case 'tool_result':\n this.handleToolResult(event as ToolResultEvent);\n break;\n\n case 'error':\n this.handleError(event.error, event.code);\n break;\n\n case 'session_start':\n case 'session_end':\n // These don't affect entries directly\n break;\n }\n }\n\n /**\n * Handle text_delta event - accumulate streaming text\n * Creates a new text entry if there have been tool calls since the last text\n */\n private handleTextDelta(delta: string): void {\n // Skip empty deltas\n if (!delta) return;\n\n // Duplicate detection: Check if this delta would cause content repetition\n // This guards against SSE events being processed twice\n const potentialContent = this.currentTextContent + delta;\n\n // Check if the delta appears to be a duplicate (content would repeat)\n // This catches cases where the same delta is processed twice in quick succession\n if (this.currentTextContent.length > 0 && delta.length > 10) {\n // If the new delta would cause the content to contain a repeated pattern,\n // and we've seen this delta recently, skip it\n const recentDeltaKey = delta.substring(0, Math.min(50, delta.length));\n if (this.recentDeltas.includes(recentDeltaKey)) {\n // Check if content would literally double\n if (potentialContent.includes(this.currentTextContent + this.currentTextContent.substring(0, Math.min(20, this.currentTextContent.length)))) {\n console.warn('[ToolCallProcessor] Skipping potential duplicate delta');\n return;\n }\n }\n // Track this delta for future duplicate detection\n this.recentDeltas.push(recentDeltaKey);\n if (this.recentDeltas.length > ToolCallProcessor.MAX_RECENT_DELTAS) {\n this.recentDeltas.shift();\n }\n }\n\n // If there was a tool call since last text, start a new text entry\n if (this.hadToolCallSinceText && this.currentTextEntryId) {\n // Finalize the previous text entry and start fresh\n this.currentTextContent = '';\n this.currentTextEntryId = null;\n this.hadToolCallSinceText = false;\n }\n\n this.currentTextContent += delta;\n\n if (!this.currentTextEntryId) {\n // Create new text entry\n this.currentTextEntryId = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n this.entries.push({\n id: this.currentTextEntryId,\n timestamp: new Date().toISOString(),\n entryType: { type: 'assistant_message' },\n content: this.currentTextContent,\n });\n } else {\n // Update existing text entry\n const entryIndex = this.entries.findIndex((e) => e.id === this.currentTextEntryId);\n if (entryIndex !== -1) {\n const existingEntry = this.entries[entryIndex];\n if (existingEntry) {\n this.entries[entryIndex] = {\n id: existingEntry.id,\n timestamp: existingEntry.timestamp,\n entryType: existingEntry.entryType,\n content: this.currentTextContent,\n };\n }\n }\n }\n\n this.emit();\n }\n\n /**\n * Finalize any accumulated text content\n */\n private finalizeCurrentText(): void {\n if (this.currentTextContent && this.currentTextEntryId) {\n // Text is already in entries, just reset tracking\n this.currentTextContent = '';\n this.currentTextEntryId = null;\n }\n }\n\n /**\n * Handle tool_use event - create pending tool call\n */\n private handleToolUse(event: ToolUseEvent): void {\n this.finalizeCurrentText();\n // Mark that we've had a tool call - next text should be a new entry\n this.hadToolCallSinceText = true;\n\n const toolCall = createToolCall({\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n });\n\n const entry: NormalizedEntry = {\n id: event.id,\n timestamp: new Date().toISOString(),\n entryType: {\n type: 'tool_call',\n toolCall,\n },\n content: toolCall.summary,\n };\n\n const entryIndex = this.entries.length;\n this.entries.push(entry);\n\n // Track pending tool call\n this.pendingToolCalls.set(event.id, { entryIndex, toolCall });\n\n this.emit();\n }\n\n /**\n * Handle tool_result event - update pending tool call with result\n */\n private handleToolResult(event: ToolResultEvent): void {\n const pending = this.pendingToolCalls.get(event.toolUseId);\n\n if (pending) {\n // Update the tool call with result\n const updatedToolCall = updateToolCallWithResult(\n pending.toolCall,\n event.content,\n event.isError\n );\n\n // Update the entry\n const existingEntry = this.entries[pending.entryIndex];\n if (existingEntry && existingEntry.entryType.type === 'tool_call') {\n this.entries[pending.entryIndex] = {\n id: existingEntry.id,\n timestamp: existingEntry.timestamp,\n entryType: {\n type: 'tool_call',\n toolCall: updatedToolCall,\n },\n content: existingEntry.content,\n };\n }\n\n this.pendingToolCalls.delete(event.toolUseId);\n this.emit();\n }\n }\n\n /**\n * Handle error event\n */\n private handleError(error: string, code?: string): void {\n this.finalizeCurrentText();\n\n this.entries.push({\n id: `error-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: {\n type: 'error',\n message: error,\n code,\n },\n content: error,\n });\n\n this.emit();\n }\n\n /**\n * Emit current entries to all listeners\n */\n private emit(): void {\n const snapshot = [...this.entries];\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\n/**\n * Create a new ToolCallProcessor instance\n */\nexport function createToolCallProcessor(): ToolCallProcessor {\n return new ToolCallProcessor();\n}\n\n/**\n * Hook-style helper for processing events\n */\nexport function processStreamEvents(\n events: AsyncIterable<StreamEvent>,\n onUpdate: EntryListener\n): Promise<NormalizedEntry[]> {\n return new Promise(async (resolve, reject) => {\n const processor = new ToolCallProcessor();\n processor.subscribe(onUpdate);\n\n try {\n for await (const event of events) {\n processor.processEvent(event);\n }\n resolve(processor.getEntries());\n } catch (error) {\n reject(error);\n }\n });\n}\n","/**\n * Utility functions for message normalization and tool call processing.\n */\n\n// Message normalization\nexport {\n formatToolName,\n parseMcpToolName,\n mapToolToActionType,\n generateToolSummary,\n extractTextContent,\n normalizeToolResult,\n parseCommandResult,\n createToolCall,\n updateToolCallWithResult,\n normalizeMessages,\n getActionIcon,\n getActionLabel,\n} from './normalize-messages.js';\n\n// Tool call processor\nexport {\n ToolCallProcessor,\n createToolCallProcessor,\n processStreamEvents,\n} from './tool-call-processor.js';\nexport type { EntryListener } from './tool-call-processor.js';\n\n// Sandbox logger\nexport {\n SandboxLogger,\n createSandboxLogger,\n} from './sandbox-logger.js';\nexport type {\n SandboxLogLevel,\n SandboxLogCategory,\n SandboxLogEntry,\n SandboxLogCallback,\n} from './sandbox-logger.js';\n","import { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { z } from 'zod';\nimport type { AgentHarness, SessionManager } from '../../index.js';\n\nconst createSessionSchema = z.object({\n agentName: z.string(),\n metadata: z.record(z.unknown()).optional(),\n /** Environment variables for this session (merged with agent defaults) */\n envVars: z.record(z.string()).optional(),\n /** Startup script for this session (overrides agent default if provided) */\n startupScript: z.string().optional(),\n});\n\n/** Schema for file attachments */\nconst fileAttachmentSchema = z.object({\n /** Original filename */\n filename: z.string(),\n /** Base64-encoded file content */\n content: z.string(),\n /** MIME type of the file */\n mimeType: z.string(),\n});\n\n/** Export type for file attachments */\nexport type FileAttachment = z.infer<typeof fileAttachmentSchema>;\n\nconst sendMessageSchema = z.object({\n prompt: z.string(),\n metadata: z.record(z.unknown()).optional(),\n /**\n * Per-request context to inject into the system prompt.\n * This is useful for providing dynamic context on each request, such as:\n * - Current page/view the user is on\n * - User's current selection or cursor position\n * - Recent user activity or state changes\n */\n sessionContext: z.string().optional(),\n /**\n * File attachments to upload to the sandbox.\n * Files will be written to /uploads/ in the sandbox filesystem.\n */\n files: z.array(fileAttachmentSchema).optional(),\n});\n\nconst updateEnvSchema = z.object({\n /** Environment variables to set (merged with existing) */\n envVars: z.record(z.string()),\n /** If true, replace all env vars instead of merging */\n replace: z.boolean().optional(),\n});\n\nconst listSessionsSchema = z.object({\n agentName: z.string().optional(),\n status: z.enum(['active', 'completed', 'error', 'suspended', 'stopped']).optional(),\n limit: z.coerce.number().min(1).max(100).default(50),\n offset: z.coerce.number().min(0).default(0),\n orderBy: z.enum(['createdAt', 'updatedAt']).default('updatedAt'),\n order: z.enum(['asc', 'desc']).default('desc'),\n});\n\n/**\n * Tracking for active SSE streams by session ID.\n * This allows the stop endpoint to abort ongoing executions.\n */\ninterface ActiveStreamInfo {\n /** Abort controller for this stream */\n controller: AbortController;\n /** Agent name for this session */\n agentName: string;\n /** Timestamp when the stream started */\n startedAt: Date;\n}\n\n/**\n * Map of active SSE streams by session ID.\n * Used by the stop endpoint to abort running executions.\n */\nconst activeStreams = new Map<string, ActiveStreamInfo>();\n\n/**\n * Subscriber callback type for session events\n */\ntype SubscriberCallback = (event: { type: string; [key: string]: unknown }) => void;\n\n/**\n * Tracking for session subscribers.\n * Multiple clients can subscribe to receive updates for a session.\n */\ninterface SubscriberInfo {\n /** Callback to send events to this subscriber */\n callback: SubscriberCallback;\n /** Timestamp when subscribed */\n subscribedAt: Date;\n}\n\n/**\n * Map of session ID -> Set of subscribers.\n * Used to broadcast events to all clients watching a session.\n */\nconst sessionSubscribers = new Map<string, Set<SubscriberInfo>>();\n\n/**\n * Broadcast an event to all subscribers of a session.\n * This is called when messages are saved or session state changes.\n */\nexport function broadcastToSession(sessionId: string, event: { type: string; [key: string]: unknown }) {\n const subscribers = sessionSubscribers.get(sessionId);\n if (subscribers && subscribers.size > 0) {\n for (const subscriber of subscribers) {\n try {\n subscriber.callback(event);\n } catch (error) {\n console.error('Error broadcasting to subscriber:', error);\n }\n }\n }\n}\n\n/**\n * Get the number of active subscribers for a session.\n */\nexport function getSubscriberCount(sessionId: string): number {\n return sessionSubscribers.get(sessionId)?.size ?? 0;\n}\n\n/**\n * Lifecycle hooks for session events\n */\nexport interface SessionHooks {\n onSessionStart?: (sessionId: string, agentName: string) => void | Promise<void>;\n onSessionEnd?: (sessionId: string) => void | Promise<void>;\n onMessage?: (sessionId: string, agentName: string) => void | Promise<void>;\n}\n\nexport interface SessionsRouterOptions {\n sessionManager: SessionManager;\n agents: Map<string, AgentHarness>;\n hooks?: SessionHooks;\n}\n\nexport function createSessionsRouter(options: SessionsRouterOptions) {\n const { sessionManager, agents, hooks = {} } = options;\n const router = new Hono();\n\n // List sessions\n router.get('/', async (c) => {\n const query = listSessionsSchema.parse(c.req.query());\n const result = await sessionManager.listSessions(query);\n return c.json(result);\n });\n\n // Create session\n router.post('/', async (c) => {\n const body = await c.req.json();\n const data = createSessionSchema.parse(body);\n\n const agent = agents.get(data.agentName);\n if (!agent) {\n return c.json(\n { error: `Agent not found: ${data.agentName}` },\n 404\n );\n }\n\n const session = await agent.createSession({\n metadata: data.metadata,\n envVars: data.envVars,\n startupScript: data.startupScript,\n });\n\n // Call onSessionStart hook\n if (hooks.onSessionStart) {\n try {\n await hooks.onSessionStart(session.session.id, data.agentName);\n } catch (error) {\n console.error('onSessionStart hook error:', error);\n }\n }\n\n return c.json(session.session, 201);\n });\n\n // Get session\n router.get('/:sessionId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n return c.json(session);\n });\n\n // Delete session\n router.delete('/:sessionId', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n // Call onSessionEnd hook before deleting\n if (hooks.onSessionEnd) {\n try {\n await hooks.onSessionEnd(sessionId);\n } catch (error) {\n console.error('onSessionEnd hook error:', error);\n }\n }\n\n await sessionManager.deleteSession(sessionId);\n return c.json({ success: true });\n });\n\n // Update session environment variables\n router.patch('/:sessionId/env', async (c) => {\n const sessionId = c.req.param('sessionId');\n const body = await c.req.json();\n const data = updateEnvSchema.parse(body);\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n // Get existing envVars from metadata\n const existingEnvVars = (session.metadata?.envVars as Record<string, string>) ?? {};\n\n // Merge or replace env vars\n const newEnvVars = data.replace\n ? data.envVars\n : { ...existingEnvVars, ...data.envVars };\n\n // Update session metadata with new env vars\n const updatedSession = await sessionManager.updateSession(sessionId, {\n metadata: {\n ...session.metadata,\n envVars: newEnvVars,\n },\n });\n\n return c.json({\n session: updatedSession,\n envVars: newEnvVars,\n });\n });\n\n // Get session messages\n router.get('/:sessionId/messages', async (c) => {\n const sessionId = c.req.param('sessionId');\n const query = z\n .object({\n limit: z.coerce.number().min(1).max(100).default(100),\n offset: z.coerce.number().min(0).default(0),\n })\n .parse(c.req.query());\n\n const result = await sessionManager.getSessionMessages(sessionId, query);\n return c.json(result);\n });\n\n // Get session sandbox logs\n router.get('/:sessionId/logs', async (c) => {\n const sessionId = c.req.param('sessionId');\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n // Extract sandbox logs from session metadata\n const metadata = (session.metadata || {}) as Record<string, unknown>;\n const sandboxLogs = metadata.sandboxLogs || [];\n\n return c.json({ logs: sandboxLogs });\n });\n\n // Send message to session (SSE streaming)\n router.post('/:sessionId/send', async (c) => {\n const sessionId = c.req.param('sessionId');\n const body = await c.req.json();\n const data = sendMessageSchema.parse(body);\n\n // Get session to find agent\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json(\n { error: `Agent not found: ${session.agentName}` },\n 404\n );\n }\n\n // Resume session and stream response\n const activeSession = await agent.resumeSession(sessionId);\n\n // Convert file attachments to the format expected by SendMessageOptions\n const attachments = data.files?.map((file) => ({\n filename: file.filename,\n content: file.content, // base64 string\n mimeType: file.mimeType,\n }));\n\n // Create abort controller for this stream\n const controller = new AbortController();\n activeStreams.set(sessionId, {\n controller,\n agentName: session.agentName,\n startedAt: new Date(),\n });\n\n return streamSSE(c, async (stream) => {\n try {\n for await (const event of activeSession.send(data.prompt, {\n metadata: data.metadata,\n sessionContext: data.sessionContext,\n attachments,\n signal: controller.signal,\n })) {\n // Check if aborted before writing\n if (controller.signal.aborted) {\n break;\n }\n\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n });\n\n // Broadcast to other subscribers (cross-tab/cross-browser sync)\n // Only broadcast certain events that other tabs need to know about\n const eventsToBroadcast = [\n 'messages_saved',\n 'text_delta',\n 'text',\n 'tool_use',\n 'tool_result',\n 'session_start',\n 'session_end',\n 'complete',\n 'error',\n ];\n if (eventsToBroadcast.includes(event.type)) {\n broadcastToSession(sessionId, event as unknown as { type: string; [key: string]: unknown });\n }\n }\n\n // Call onMessage hook after successful message processing\n if (hooks.onMessage && !controller.signal.aborted) {\n try {\n await hooks.onMessage(sessionId, session.agentName);\n } catch (error) {\n console.error('onMessage hook error:', error);\n }\n }\n } catch (error) {\n // Don't send error event if we were aborted\n if (!controller.signal.aborted) {\n const errorEvent = {\n type: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify(errorEvent),\n });\n // Also broadcast error to subscribers\n broadcastToSession(sessionId, errorEvent);\n }\n } finally {\n // Always clean up the active stream tracking\n activeStreams.delete(sessionId);\n }\n });\n });\n\n // Stop a running session execution\n router.post('/:sessionId/stop', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n // Get session to find agent\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json(\n { error: `Agent not found: ${session.agentName}` },\n 404\n );\n }\n\n // Check if there's an active stream for this session\n const activeStream = activeStreams.get(sessionId);\n if (!activeStream) {\n // No active stream - check if the agent knows about it\n const isRunning = agent.isSessionRunning(sessionId);\n if (!isRunning) {\n return c.json({\n stopped: false,\n sessionId,\n message: 'No active execution to stop',\n });\n }\n }\n\n // Abort the stream controller if we have one\n if (activeStream) {\n activeStream.controller.abort();\n activeStreams.delete(sessionId);\n }\n\n // Also call stopSession on the agent harness\n await agent.stopSession(sessionId);\n\n return c.json({\n stopped: true,\n sessionId,\n status: 'stopped',\n message: 'Execution stopped successfully',\n });\n });\n\n // Get session status including whether it's currently running\n router.get('/:sessionId/status', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n const isRunning = activeStreams.has(sessionId) ||\n (agent ? agent.isSessionRunning(sessionId) : false);\n\n return c.json({\n sessionId,\n status: session.status,\n isRunning,\n canStop: isRunning,\n canResume: !isRunning && session.status !== 'error',\n });\n });\n\n // Resume session\n router.post('/:sessionId/resume', async (c) => {\n const sessionId = c.req.param('sessionId');\n const body = await c.req.json().catch(() => ({}));\n const forkSession = body.forkSession ?? false;\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json(\n { error: `Agent not found: ${session.agentName}` },\n 404\n );\n }\n\n const activeSession = await agent.resumeSession(sessionId, { forkSession });\n return c.json(activeSession.session);\n });\n\n // Fork session\n router.post('/:sessionId/fork', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json(\n { error: `Agent not found: ${session.agentName}` },\n 404\n );\n }\n\n const forkedSession = await agent.forkSession(sessionId);\n return c.json(forkedSession.session, 201);\n });\n\n // Subscribe to session updates (SSE streaming for cross-tab/cross-browser sync)\n // This allows multiple clients to receive real-time updates when messages are saved\n router.get('/:sessionId/subscribe', async (c) => {\n const sessionId = c.req.param('sessionId');\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return streamSSE(c, async (stream) => {\n // Create subscriber info\n const subscriberInfo: SubscriberInfo = {\n callback: (event) => {\n stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n }).catch(() => {\n // Stream closed, will be cleaned up\n });\n },\n subscribedAt: new Date(),\n };\n\n // Register subscriber\n if (!sessionSubscribers.has(sessionId)) {\n sessionSubscribers.set(sessionId, new Set());\n }\n sessionSubscribers.get(sessionId)!.add(subscriberInfo);\n\n // Send initial connection event\n await stream.writeSSE({\n event: 'connected',\n data: JSON.stringify({\n type: 'connected',\n sessionId,\n subscriberCount: sessionSubscribers.get(sessionId)!.size,\n }),\n });\n\n // Keep the connection alive with periodic heartbeats\n const heartbeatInterval = setInterval(async () => {\n try {\n await stream.writeSSE({\n event: 'heartbeat',\n data: JSON.stringify({ type: 'heartbeat', timestamp: Date.now() }),\n });\n } catch {\n // Stream closed\n clearInterval(heartbeatInterval);\n }\n }, 30000); // 30 second heartbeat\n\n // Wait for the stream to close (client disconnects)\n // Using the abort signal from the request\n const abortController = new AbortController();\n c.req.raw.signal.addEventListener('abort', () => {\n abortController.abort();\n });\n\n // Keep the stream open until aborted\n await new Promise<void>((resolve) => {\n abortController.signal.addEventListener('abort', () => resolve());\n // Also resolve after 24 hours max to prevent memory leaks\n setTimeout(() => resolve(), 24 * 60 * 60 * 1000);\n });\n\n // Cleanup\n clearInterval(heartbeatInterval);\n sessionSubscribers.get(sessionId)?.delete(subscriberInfo);\n if (sessionSubscribers.get(sessionId)?.size === 0) {\n sessionSubscribers.delete(sessionId);\n }\n });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { z } from 'zod';\nimport type { AgentHarness, AgentStorage } from '../../index.js';\n\nconst runAgentSchema = z.object({\n prompt: z.string(),\n metadata: z.record(z.unknown()).optional(),\n /** Environment variables for this session (merged with agent defaults) */\n envVars: z.record(z.string()).optional(),\n /** Startup script for this session (overrides agent default) */\n startupScript: z.string().optional(),\n});\n\nconst createAgentSchema = z.object({\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100).optional(),\n description: z.string().max(500).optional(),\n model: z.string().optional(),\n systemPrompt: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n maxTurns: z.number().int().positive().optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n mcpServers: z.record(z.object({\n command: z.string(),\n args: z.array(z.string()).optional(),\n })).optional(),\n envVars: z.record(z.string()).optional(),\n startupScript: z.string().optional(),\n config: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nconst updateAgentSchema = z.object({\n name: z.string().min(1).max(100).optional(),\n description: z.string().max(500).optional(),\n model: z.string().optional(),\n systemPrompt: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n maxTurns: z.number().int().positive().optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n mcpServers: z.record(z.object({\n command: z.string(),\n args: z.array(z.string()).optional(),\n })).optional(),\n envVars: z.record(z.string()).optional(),\n startupScript: z.string().optional(),\n config: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n status: z.enum(['active', 'paused']).optional(),\n});\n\nexport interface AgentsRouterOptions {\n agents: Map<string, AgentHarness>;\n agentStorage?: AgentStorage;\n onAgentChange?: () => Promise<void>;\n}\n\nexport function createAgentsRouter(options: AgentsRouterOptions) {\n const { agents, agentStorage, onAgentChange } = options;\n const router = new Hono();\n\n // List available agents (from memory) or stored agents (from storage)\n router.get('/', async (c) => {\n if (agentStorage) {\n const query = z\n .object({\n status: z.enum(['active', 'paused', 'deleted']).optional(),\n limit: z.coerce.number().min(1).max(100).default(50),\n offset: z.coerce.number().min(0).default(0),\n })\n .safeParse(c.req.query());\n\n const options = query.success ? query.data : {};\n const result = await agentStorage.listAgents(options);\n return c.json(result);\n }\n\n // Fallback to in-memory agents\n const agentList = Array.from(agents.keys()).map((name) => ({\n name,\n }));\n return c.json({ items: agentList, total: agentList.length, hasMore: false });\n });\n\n // Create a new agent (requires agentStorage)\n router.post('/', async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const body = await c.req.json();\n const parseResult = createAgentSchema.safeParse(body);\n if (!parseResult.success) {\n return c.json({\n error: parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '),\n code: 'INVALID_INPUT',\n }, 400);\n }\n\n try {\n const agent = await agentStorage.createAgent(parseResult.data);\n if (onAgentChange) {\n await onAgentChange();\n }\n return c.json(agent, 201);\n } catch (err) {\n if (err instanceof Error && err.message.includes('already exists')) {\n return c.json({ error: err.message, code: 'CONFLICT' }, 409);\n }\n throw err;\n }\n });\n\n // Get agent by ID (from storage) or by name (from memory)\n router.get('/:agentId', async (c) => {\n const agentId = c.req.param('agentId');\n\n if (agentStorage) {\n // Try UUID first\n const agent = await agentStorage.getAgent(agentId);\n if (agent) {\n return c.json(agent);\n }\n // Try slug\n const agentBySlug = await agentStorage.getAgentBySlug(agentId);\n if (agentBySlug) {\n return c.json(agentBySlug);\n }\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n // Fallback to in-memory lookup by name\n const agent = agents.get(agentId);\n if (!agent) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n return c.json({ name: agentId });\n });\n\n // Update agent (requires agentStorage)\n router.patch('/:agentId', async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const agentId = c.req.param('agentId');\n const body = await c.req.json();\n const parseResult = updateAgentSchema.safeParse(body);\n if (!parseResult.success) {\n return c.json({\n error: parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '),\n code: 'INVALID_INPUT',\n }, 400);\n }\n\n const agent = await agentStorage.updateAgent(agentId, parseResult.data);\n if (!agent) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n if (onAgentChange) {\n await onAgentChange();\n }\n\n return c.json(agent);\n });\n\n // Delete agent (requires agentStorage)\n router.delete('/:agentId', async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const agentId = c.req.param('agentId');\n const deleted = await agentStorage.deleteAgent(agentId);\n if (!deleted) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n if (onAgentChange) {\n await onAgentChange();\n }\n\n return c.json({ success: true });\n });\n\n // Run agent (creates session and streams response)\n router.post('/:agentName/run', async (c) => {\n const agentName = c.req.param('agentName');\n const body = await c.req.json();\n const data = runAgentSchema.parse(body);\n\n const agent = agents.get(agentName);\n if (!agent) {\n return c.json({ error: 'Agent not found' }, 404);\n }\n\n // Create session with optional environment overrides\n const session = await agent.createSession({\n metadata: data.metadata,\n envVars: data.envVars,\n startupScript: data.startupScript,\n });\n\n // Stream response\n return streamSSE(c, async (stream) => {\n try {\n for await (const event of session.send(data.prompt)) {\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n });\n }\n } catch (error) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({\n type: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n });\n }\n });\n });\n\n // Get agent sessions\n router.get('/:agentName/sessions', async (c) => {\n const agentName = c.req.param('agentName');\n const agent = agents.get(agentName);\n if (!agent) {\n return c.json({ error: 'Agent not found' }, 404);\n }\n\n const query = z\n .object({\n status: z.enum(['active', 'completed', 'error', 'suspended']).optional(),\n limit: z.coerce.number().min(1).max(100).default(50),\n offset: z.coerce.number().min(0).default(0),\n })\n .parse(c.req.query());\n\n const result = await agent.listSessions(query);\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { z } from 'zod';\nimport {\n SkillManager,\n skillSourceSchema,\n} from '../../index.js';\n\nexport interface SkillsRouterOptions {\n skillManager: SkillManager;\n /**\n * Optional GitHub token for accessing private repos.\n * Can also be passed per-request in the request body.\n */\n githubToken?: string;\n}\n\n/**\n * Skills Router - Browse-only API for skill source file selection UI.\n *\n * Skills are now embedded in agent config (not stored in a separate DB table).\n * This router provides endpoints for browsing and reading files from skill sources\n * (GitHub repos or local folders) to support the UI for selecting which files\n * to include in a skill.\n */\nexport function createSkillsRouter(options: SkillsRouterOptions) {\n const { skillManager, githubToken } = options;\n const router = new Hono();\n\n // ============================================================================\n // File Browsing (for source selection UI)\n // ============================================================================\n\n // Browse files at a path in a skill source\n router.post('/browse', async (c) => {\n const body = await c.req.json();\n\n try {\n const data = z\n .object({\n source: skillSourceSchema,\n path: z.string().default(''),\n token: z.string().optional(),\n })\n .parse(body);\n\n // Use request token, or fall back to configured token\n const token = data.token ?? githubToken;\n const files = await skillManager.browseSource(data.source, data.path, token);\n return c.json({ files });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return c.json(\n { error: 'Validation error', details: error.errors },\n 400\n );\n }\n if (error instanceof Error) {\n return c.json({ error: error.message }, 400);\n }\n throw error;\n }\n });\n\n // Read file content from a skill source\n router.post('/read', async (c) => {\n const body = await c.req.json();\n\n try {\n const data = z\n .object({\n source: skillSourceSchema,\n path: z.string(),\n token: z.string().optional(),\n })\n .parse(body);\n\n // Use request token, or fall back to configured token\n const token = data.token ?? githubToken;\n const content = await skillManager.readSourceFile(data.source, data.path, token);\n return c.json({ file: content });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return c.json(\n { error: 'Validation error', details: error.errors },\n 400\n );\n }\n if (error instanceof Error) {\n return c.json({ error: error.message }, 400);\n }\n throw error;\n }\n });\n\n return router;\n}\n","/**\n * Queue API Routes\n *\n * Provides REST API endpoints for managing the message queue.\n */\n\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { z } from 'zod';\nimport type { QueueStorage } from '../../storage/interface.js';\nimport type { QueueProcessor } from '../../queue/processor.js';\nimport type { AgentHarness } from '../../agent/index.js';\nimport type { SessionManager } from '../../session/index.js';\n\n// Schemas\nconst createQueueItemSchema = z.object({\n sessionId: z.string().nullable().optional(),\n agentName: z.string(),\n prompt: z.string(),\n files: z.array(z.object({\n filename: z.string(),\n content: z.string(),\n mimeType: z.string(),\n })).optional(),\n sessionContext: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n priority: z.number().int().default(0),\n maxRetries: z.number().int().min(0).max(10).default(3),\n});\n\nconst listQueueItemsSchema = z.object({\n sessionId: z.string().optional(),\n agentName: z.string().optional(),\n status: z.enum(['pending', 'processing', 'completed', 'failed', 'cancelled']).optional(),\n limit: z.coerce.number().min(1).max(100).default(50),\n offset: z.coerce.number().min(0).default(0),\n});\n\nexport interface QueueRouterOptions {\n /**\n * Queue storage instance\n */\n queueStorage: QueueStorage;\n\n /**\n * Queue processor instance (optional - if not provided, items won't be processed automatically)\n */\n queueProcessor?: QueueProcessor;\n\n /**\n * Map of agent name to agent instance\n */\n agents: Map<string, AgentHarness>;\n\n /**\n * Session manager\n */\n sessionManager: SessionManager;\n}\n\nexport function createQueueRouter(options: QueueRouterOptions) {\n const { queueStorage, queueProcessor, agents, sessionManager } = options;\n const router = new Hono();\n\n // List queue items\n router.get('/', async (c) => {\n const query = listQueueItemsSchema.parse(c.req.query());\n const result = await queueStorage.listQueueItems(query);\n return c.json(result);\n });\n\n // Get queue statistics\n router.get('/stats', async (c) => {\n const agentName = c.req.query('agentName');\n const stats = await queueStorage.getQueueStats(agentName);\n return c.json(stats);\n });\n\n // Get queue status for a specific session\n router.get('/status/:agentName', async (c) => {\n const agentName = c.req.param('agentName');\n const sessionId = c.req.query('sessionId') || null;\n\n const isProcessing = queueProcessor?.isSessionProcessing(agentName, sessionId) ?? false;\n const pendingItems = await queueStorage.getPendingItemsForSession(agentName, sessionId);\n const currentItemId = queueProcessor?.getCurrentItemForSession(agentName, sessionId);\n\n // Find the current item if processing\n let currentItem = undefined;\n if (currentItemId) {\n currentItem = await queueStorage.getQueueItem(currentItemId);\n }\n\n return c.json({\n sessionId,\n agentName,\n isProcessing,\n pendingCount: pendingItems.length,\n currentItem: currentItem ?? undefined,\n nextItems: pendingItems.slice(0, 5), // Return first 5 pending items\n });\n });\n\n // Create a new queue item\n router.post('/', async (c) => {\n const body = await c.req.json();\n const data = createQueueItemSchema.parse(body);\n\n // Validate agent exists\n const agent = agents.get(data.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${data.agentName}` }, 404);\n }\n\n // If sessionId provided, validate session exists and belongs to this agent\n if (data.sessionId) {\n const session = await sessionManager.getSession(data.sessionId);\n if (!session) {\n return c.json({ error: `Session not found: ${data.sessionId}` }, 404);\n }\n if (session.agentName !== data.agentName) {\n return c.json({\n error: `Session ${data.sessionId} belongs to agent ${session.agentName}, not ${data.agentName}`,\n }, 400);\n }\n }\n\n // Create the queue item\n const item = await queueStorage.createQueueItem({\n sessionId: data.sessionId ?? null,\n agentName: data.agentName,\n prompt: data.prompt,\n files: data.files,\n sessionContext: data.sessionContext,\n metadata: data.metadata,\n priority: data.priority,\n maxRetries: data.maxRetries,\n });\n\n // Trigger processing if processor is available\n if (queueProcessor) {\n // Don't await - trigger async\n queueProcessor.triggerProcessing(data.agentName, data.sessionId ?? null).catch((err) => {\n console.error('Error triggering queue processing:', err);\n });\n }\n\n return c.json(item, 201);\n });\n\n // Get a specific queue item\n router.get('/:id', async (c) => {\n const id = c.req.param('id');\n const item = await queueStorage.getQueueItem(id);\n if (!item) {\n return c.json({ error: 'Queue item not found' }, 404);\n }\n return c.json(item);\n });\n\n // Cancel a queue item (only if pending)\n router.post('/:id/cancel', async (c) => {\n const id = c.req.param('id');\n const item = await queueStorage.getQueueItem(id);\n if (!item) {\n return c.json({ error: 'Queue item not found' }, 404);\n }\n\n if (item.status !== 'pending') {\n return c.json({\n error: `Cannot cancel item with status: ${item.status}`,\n currentStatus: item.status,\n }, 400);\n }\n\n const updated = await queueStorage.updateQueueItem(id, {\n status: 'cancelled',\n completedAt: new Date(),\n });\n\n return c.json(updated);\n });\n\n // Delete a queue item\n router.delete('/:id', async (c) => {\n const id = c.req.param('id');\n const item = await queueStorage.getQueueItem(id);\n if (!item) {\n return c.json({ error: 'Queue item not found' }, 404);\n }\n\n // Don't allow deleting items that are currently processing\n if (item.status === 'processing') {\n return c.json({\n error: 'Cannot delete item that is currently processing',\n }, 400);\n }\n\n await queueStorage.deleteQueueItem(id);\n return c.json({ success: true });\n });\n\n // Cancel all pending items for a session\n router.post('/cancel-all', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const agentName = body.agentName as string;\n const sessionId = body.sessionId as string | null | undefined;\n\n if (!agentName) {\n return c.json({ error: 'agentName is required' }, 400);\n }\n\n const count = await queueStorage.cancelPendingItems(agentName, sessionId);\n return c.json({ cancelled: count });\n });\n\n // Queue a message and stream the response (convenience endpoint)\n // This queues the message, waits for it to be processed, and streams events back\n router.post('/send', async (c) => {\n const body = await c.req.json();\n const data = createQueueItemSchema.parse(body);\n\n // Validate agent exists\n const agent = agents.get(data.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${data.agentName}` }, 404);\n }\n\n // If sessionId provided, validate session exists\n if (data.sessionId) {\n const session = await sessionManager.getSession(data.sessionId);\n if (!session) {\n return c.json({ error: `Session not found: ${data.sessionId}` }, 404);\n }\n if (session.agentName !== data.agentName) {\n return c.json({\n error: `Session ${data.sessionId} belongs to agent ${session.agentName}, not ${data.agentName}`,\n }, 400);\n }\n }\n\n // Create the queue item\n const item = await queueStorage.createQueueItem({\n sessionId: data.sessionId ?? null,\n agentName: data.agentName,\n prompt: data.prompt,\n files: data.files,\n sessionContext: data.sessionContext,\n metadata: data.metadata,\n priority: data.priority,\n maxRetries: data.maxRetries,\n });\n\n // Stream the response\n return streamSSE(c, async (stream) => {\n // Send queue item created event\n await stream.writeSSE({\n event: 'queue_item_created',\n data: JSON.stringify({\n type: 'queue_item_created',\n queueItemId: item.id,\n }),\n });\n\n // Poll for status changes and stream events\n let lastStatus = item.status;\n let completed = false;\n const pollInterval = 100; // Check every 100ms\n\n while (!completed) {\n const currentItem = await queueStorage.getQueueItem(item.id);\n if (!currentItem) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({\n type: 'error',\n error: 'Queue item not found',\n }),\n });\n break;\n }\n\n // Check for status changes\n if (currentItem.status !== lastStatus) {\n await stream.writeSSE({\n event: 'queue_status_change',\n data: JSON.stringify({\n type: 'queue_status_change',\n queueItemId: item.id,\n status: currentItem.status,\n previousStatus: lastStatus,\n }),\n });\n lastStatus = currentItem.status;\n\n // If processing started, send session info\n if (currentItem.status === 'processing' && currentItem.sessionId) {\n await stream.writeSSE({\n event: 'session_start',\n data: JSON.stringify({\n type: 'session_start',\n sessionId: currentItem.sessionId,\n queueItemId: item.id,\n }),\n });\n }\n\n // Check if completed or failed\n if (['completed', 'failed', 'cancelled'].includes(currentItem.status)) {\n completed = true;\n\n if (currentItem.status === 'completed') {\n await stream.writeSSE({\n event: 'queue_item_completed',\n data: JSON.stringify({\n type: 'queue_item_completed',\n queueItemId: item.id,\n sessionId: currentItem.sessionId,\n resultMessageId: currentItem.resultMessageId,\n }),\n });\n } else if (currentItem.status === 'failed') {\n await stream.writeSSE({\n event: 'queue_item_failed',\n data: JSON.stringify({\n type: 'queue_item_failed',\n queueItemId: item.id,\n error: currentItem.error,\n }),\n });\n } else if (currentItem.status === 'cancelled') {\n await stream.writeSSE({\n event: 'queue_item_cancelled',\n data: JSON.stringify({\n type: 'queue_item_cancelled',\n queueItemId: item.id,\n }),\n });\n }\n break;\n }\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n });\n });\n\n // Retry a failed queue item\n router.post('/:id/retry', async (c) => {\n const id = c.req.param('id');\n const item = await queueStorage.getQueueItem(id);\n if (!item) {\n return c.json({ error: 'Queue item not found' }, 404);\n }\n\n if (item.status !== 'failed' && item.status !== 'cancelled') {\n return c.json({\n error: `Cannot retry item with status: ${item.status}`,\n currentStatus: item.status,\n }, 400);\n }\n\n // Reset to pending\n const updated = await queueStorage.updateQueueItem(id, {\n status: 'pending',\n error: undefined,\n retryCount: 0,\n startedAt: undefined,\n completedAt: undefined,\n });\n\n // Trigger processing\n if (queueProcessor && updated) {\n queueProcessor.triggerProcessing(updated.agentName, updated.sessionId).catch((err) => {\n console.error('Error triggering queue processing:', err);\n });\n }\n\n return c.json(updated);\n });\n\n // Cleanup old completed/failed/cancelled items\n router.post('/cleanup', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const maxAgeHours = body.maxAgeHours ?? 24;\n const maxAgeMs = maxAgeHours * 60 * 60 * 1000;\n\n const count = await queueStorage.cleanupOldItems(maxAgeMs);\n return c.json({ deleted: count });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { prettyJSON } from 'hono/pretty-json';\nimport { secureHeaders } from 'hono/secure-headers';\nimport {\n SessionManager,\n SkillManager,\n type AgentHarness,\n type SessionStorage,\n type AgentStorage,\n type StoredAgent,\n} from '../index.js';\nimport type { QueueStorage } from '../storage/interface.js';\nimport { QueueProcessor, type QueueProcessorCallbacks } from '../queue/index.js';\nimport { createSessionsRouter } from './routes/sessions.js';\nimport { createAgentsRouter } from './routes/agents.js';\nimport { createSkillsRouter } from './routes/skills.js';\nimport { createQueueRouter } from './routes/queue.js';\n\n/**\n * Lifecycle hooks for session events\n */\nexport interface HarnessServerHooks {\n /**\n * Called when a new session is created\n */\n onSessionStart?: (sessionId: string, agentName: string) => void | Promise<void>;\n\n /**\n * Called when a session ends (completed, error, or deleted)\n */\n onSessionEnd?: (sessionId: string) => void | Promise<void>;\n\n /**\n * Called after each message is processed\n */\n onMessage?: (sessionId: string, agentName: string) => void | Promise<void>;\n}\n\nexport interface HarnessServerConfig {\n /**\n * Storage implementation for sessions and messages\n */\n storage: SessionStorage;\n\n /**\n * Optional storage for agent configurations.\n * If provided, enables CRUD operations on agents via the API.\n */\n agentStorage?: AgentStorage;\n\n /**\n * Optional storage for the message queue.\n * If provided, enables queue-based message processing.\n */\n queueStorage?: QueueStorage;\n\n /**\n * Map of agent name to agent instance\n */\n agents?: Map<string, AgentHarness>;\n\n /**\n * Skill manager for handling agent skills\n */\n skillManager?: SkillManager;\n\n /**\n * Enable CORS (default: true)\n */\n cors?: boolean;\n\n /**\n * Enable request logging (default: true in development)\n */\n logging?: boolean;\n\n /**\n * Base path for API routes (default: '/api')\n */\n basePath?: string;\n\n /**\n * Custom middleware to add before routes\n */\n middleware?: Array<(c: any, next: () => Promise<void>) => Promise<void>>;\n\n /**\n * Lifecycle hooks for session events (e.g., workspace management)\n */\n hooks?: HarnessServerHooks;\n\n /**\n * Queue processor configuration\n */\n queue?: {\n /**\n * Whether to enable the queue processor (default: true if queueStorage is provided)\n */\n enabled?: boolean;\n\n /**\n * Polling interval in ms (default: 1000)\n */\n pollIntervalMs?: number;\n\n /**\n * Base delay for retry backoff in ms (default: 1000)\n */\n retryBaseDelayMs?: number;\n\n /**\n * Maximum delay for retry backoff in ms (default: 60000)\n */\n retryMaxDelayMs?: number;\n\n /**\n * Callbacks for queue events\n */\n callbacks?: QueueProcessorCallbacks;\n };\n}\n\n/**\n * Create and configure the Hono server for Agent SDK Harness\n */\nexport function createHarnessServer(config: HarnessServerConfig) {\n const {\n storage,\n agentStorage,\n queueStorage,\n agents = new Map(),\n skillManager,\n cors: enableCors = true,\n logging = process.env.NODE_ENV !== 'production',\n basePath = '/api',\n middleware = [],\n hooks = {},\n queue: queueConfig = {},\n } = config;\n\n // Track if agents need to be reloaded from storage\n let agentsNeedReload = false;\n\n // Create session manager first (needed for queue processor)\n const sessionManager = new SessionManager(storage);\n\n // Create queue processor if queue storage is provided\n let queueProcessor: QueueProcessor | undefined;\n if (queueStorage && queueConfig.enabled !== false) {\n queueProcessor = new QueueProcessor({\n queueStorage,\n sessionManager,\n agents,\n pollIntervalMs: queueConfig.pollIntervalMs,\n retryBaseDelayMs: queueConfig.retryBaseDelayMs,\n retryMaxDelayMs: queueConfig.retryMaxDelayMs,\n callbacks: queueConfig.callbacks,\n });\n }\n\n const app = new Hono();\n\n // Global middleware\n if (enableCors) {\n app.use('*', cors());\n }\n if (logging) {\n app.use('*', logger());\n }\n app.use('*', prettyJSON());\n app.use('*', secureHeaders({\n // Content Security Policy to prevent XSS\n contentSecurityPolicy: {\n defaultSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:', 'https:'],\n connectSrc: [\"'self'\"],\n fontSrc: [\"'self'\"],\n objectSrc: [\"'none'\"],\n frameAncestors: [\"'none'\"],\n formAction: [\"'self'\"],\n baseUri: [\"'self'\"],\n },\n // Prevent clickjacking\n xFrameOptions: 'DENY',\n // Prevent MIME type sniffing\n xContentTypeOptions: 'nosniff',\n // Strict transport security\n strictTransportSecurity: 'max-age=31536000; includeSubDomains',\n // Referrer policy\n referrerPolicy: 'strict-origin-when-cross-origin',\n }));\n\n // Custom middleware\n for (const mw of middleware) {\n app.use('*', mw);\n }\n\n // Mount routes\n const api = new Hono();\n\n api.route(\n '/sessions',\n createSessionsRouter({ sessionManager, agents, hooks })\n );\n api.route('/agents', createAgentsRouter({\n agents,\n agentStorage,\n onAgentChange: async () => {\n agentsNeedReload = true;\n },\n }));\n\n // Mount skills router if skill manager is provided\n if (skillManager) {\n api.route('/skills', createSkillsRouter({ skillManager }));\n }\n\n // Mount queue router if queue storage is provided\n if (queueStorage) {\n api.route('/queue', createQueueRouter({\n queueStorage,\n queueProcessor,\n agents,\n sessionManager,\n }));\n }\n\n // Health check\n api.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));\n\n // Mount API at base path\n app.route(basePath, api);\n\n // Root redirect\n app.get('/', (c) => c.redirect(`${basePath}/health`));\n\n // Error handler\n app.onError((err, c) => {\n console.error('Server error:', err);\n return c.json(\n {\n error: err.message || 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n });\n\n // Not found handler\n app.notFound((c) => {\n return c.json(\n {\n error: 'Not found',\n code: 'NOT_FOUND',\n },\n 404\n );\n });\n\n return {\n app,\n sessionManager,\n queueProcessor,\n\n /**\n * Register an agent with the server\n */\n registerAgent(name: string, agent: AgentHarness) {\n agents.set(name, agent);\n },\n\n /**\n * Unregister an agent\n */\n unregisterAgent(name: string) {\n agents.delete(name);\n },\n\n /**\n * Get all registered agents\n */\n getAgents() {\n return agents;\n },\n\n /**\n * Check if agents need to be reloaded from storage\n */\n needsReload() {\n return agentsNeedReload;\n },\n\n /**\n * Mark agents as reloaded (call after reloading)\n */\n markReloaded() {\n agentsNeedReload = false;\n },\n\n /**\n * Get agent storage (if configured)\n */\n getAgentStorage() {\n return agentStorage;\n },\n\n /**\n * Get queue storage (if configured)\n */\n getQueueStorage() {\n return queueStorage;\n },\n\n /**\n * Get stored agents from agent storage\n */\n async getStoredAgents(): Promise<StoredAgent[]> {\n if (!agentStorage) {\n return [];\n }\n return agentStorage.getActiveAgents();\n },\n\n /**\n * Initialize storage, agents, and start queue processor\n */\n async initialize() {\n await storage.initialize();\n if (agentStorage) {\n await agentStorage.initialize();\n }\n if (queueStorage) {\n await queueStorage.initialize();\n }\n for (const agent of agents.values()) {\n await agent.initialize();\n }\n // Start queue processor\n queueProcessor?.start();\n },\n\n /**\n * Close storage, agents, and stop queue processor\n */\n async close() {\n // Stop queue processor first\n queueProcessor?.stop();\n for (const agent of agents.values()) {\n await agent.close();\n }\n await storage.close();\n if (agentStorage) {\n await agentStorage.close();\n }\n if (queueStorage) {\n await queueStorage.close();\n }\n },\n };\n}\n\nexport type HarnessServer = ReturnType<typeof createHarnessServer>;\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nfunction isZodType(schema, typeName) {\n var _a;\n return ((_a = schema === null || schema === void 0 ? void 0 : schema._def) === null || _a === void 0 ? void 0 : _a.typeName) === typeName;\n}\nfunction isAnyZodType(schema) {\n return '_def' in schema;\n}\n\nfunction preserveMetadataFromModifier(zod, modifier) {\n const zodModifier = zod.ZodType.prototype[modifier];\n zod.ZodType.prototype[modifier] = function (...args) {\n const result = zodModifier.apply(this, args);\n result._def.openapi = this._def.openapi;\n return result;\n };\n}\nfunction extendZodWithOpenApi(zod) {\n if (typeof zod.ZodType.prototype.openapi !== 'undefined') {\n // This zod instance is already extended with the required methods,\n // doing it again will just result in multiple wrapper methods for\n // `optional` and `nullable`\n return;\n }\n zod.ZodType.prototype.openapi = function (refOrOpenapi, metadata) {\n var _a, _b, _c, _d, _e, _f;\n const openapi = typeof refOrOpenapi === 'string' ? metadata : refOrOpenapi;\n const _g = openapi !== null && openapi !== void 0 ? openapi : {}, { param } = _g, restOfOpenApi = __rest(_g, [\"param\"]);\n const _internal = Object.assign(Object.assign({}, (_a = this._def.openapi) === null || _a === void 0 ? void 0 : _a._internal), (typeof refOrOpenapi === 'string'\n ? { refId: refOrOpenapi }\n : undefined));\n const resultMetadata = Object.assign(Object.assign(Object.assign({}, (_b = this._def.openapi) === null || _b === void 0 ? void 0 : _b.metadata), restOfOpenApi), (((_d = (_c = this._def.openapi) === null || _c === void 0 ? void 0 : _c.metadata) === null || _d === void 0 ? void 0 : _d.param) || param\n ? {\n param: Object.assign(Object.assign({}, (_f = (_e = this._def.openapi) === null || _e === void 0 ? void 0 : _e.metadata) === null || _f === void 0 ? void 0 : _f.param), param),\n }\n : undefined));\n const result = new this.constructor(Object.assign(Object.assign({}, this._def), { openapi: Object.assign(Object.assign({}, (Object.keys(_internal).length > 0 ? { _internal } : undefined)), (Object.keys(resultMetadata).length > 0\n ? { metadata: resultMetadata }\n : undefined)) }));\n if (isZodType(this, 'ZodObject')) {\n const originalExtend = this.extend;\n result.extend = function (...args) {\n var _a, _b, _c, _d, _e, _f, _g;\n const extendedResult = originalExtend.apply(this, args);\n extendedResult._def.openapi = {\n _internal: {\n extendedFrom: ((_b = (_a = this._def.openapi) === null || _a === void 0 ? void 0 : _a._internal) === null || _b === void 0 ? void 0 : _b.refId)\n ? { refId: (_d = (_c = this._def.openapi) === null || _c === void 0 ? void 0 : _c._internal) === null || _d === void 0 ? void 0 : _d.refId, schema: this }\n : (_f = (_e = this._def.openapi) === null || _e === void 0 ? void 0 : _e._internal) === null || _f === void 0 ? void 0 : _f.extendedFrom,\n },\n metadata: (_g = extendedResult._def.openapi) === null || _g === void 0 ? void 0 : _g.metadata,\n };\n return extendedResult;\n };\n }\n return result;\n };\n preserveMetadataFromModifier(zod, 'optional');\n preserveMetadataFromModifier(zod, 'nullable');\n preserveMetadataFromModifier(zod, 'default');\n preserveMetadataFromModifier(zod, 'transform');\n preserveMetadataFromModifier(zod, 'refine');\n const zodDeepPartial = zod.ZodObject.prototype.deepPartial;\n zod.ZodObject.prototype.deepPartial = function () {\n const initialShape = this._def.shape();\n const result = zodDeepPartial.apply(this);\n const resultShape = result._def.shape();\n Object.entries(resultShape).forEach(([key, value]) => {\n var _a, _b;\n value._def.openapi = (_b = (_a = initialShape[key]) === null || _a === void 0 ? void 0 : _a._def) === null || _b === void 0 ? void 0 : _b.openapi;\n });\n result._def.openapi = undefined;\n return result;\n };\n const zodPick = zod.ZodObject.prototype.pick;\n zod.ZodObject.prototype.pick = function (...args) {\n const result = zodPick.apply(this, args);\n result._def.openapi = undefined;\n return result;\n };\n const zodOmit = zod.ZodObject.prototype.omit;\n zod.ZodObject.prototype.omit = function (...args) {\n const result = zodOmit.apply(this, args);\n result._def.openapi = undefined;\n return result;\n };\n}\n\nfunction isEqual(x, y) {\n if (x === null || x === undefined || y === null || y === undefined) {\n return x === y;\n }\n if (x === y || x.valueOf() === y.valueOf()) {\n return true;\n }\n if (Array.isArray(x)) {\n if (!Array.isArray(y)) {\n return false;\n }\n if (x.length !== y.length) {\n return false;\n }\n }\n // if they are strictly equal, they both need to be object at least\n if (!(x instanceof Object) || !(y instanceof Object)) {\n return false;\n }\n // recursive object equality check\n const keysX = Object.keys(x);\n return (Object.keys(y).every(keyY => keysX.indexOf(keyY) !== -1) &&\n keysX.every(key => isEqual(x[key], y[key])));\n}\nclass ObjectSet {\n constructor() {\n this.buckets = new Map();\n }\n put(value) {\n const hashCode = this.hashCodeOf(value);\n const itemsByCode = this.buckets.get(hashCode);\n if (!itemsByCode) {\n this.buckets.set(hashCode, [value]);\n return;\n }\n const alreadyHasItem = itemsByCode.some(_ => isEqual(_, value));\n if (!alreadyHasItem) {\n itemsByCode.push(value);\n }\n }\n contains(value) {\n const hashCode = this.hashCodeOf(value);\n const itemsByCode = this.buckets.get(hashCode);\n if (!itemsByCode) {\n return false;\n }\n return itemsByCode.some(_ => isEqual(_, value));\n }\n values() {\n return [...this.buckets.values()].flat();\n }\n stats() {\n let totalBuckets = 0;\n let totalValues = 0;\n let collisions = 0;\n for (const bucket of this.buckets.values()) {\n totalBuckets += 1;\n totalValues += bucket.length;\n if (bucket.length > 1) {\n collisions += 1;\n }\n }\n const hashEffectiveness = totalBuckets / totalValues;\n return { totalBuckets, collisions, totalValues, hashEffectiveness };\n }\n hashCodeOf(object) {\n let hashCode = 0;\n if (Array.isArray(object)) {\n for (let i = 0; i < object.length; i++) {\n hashCode ^= this.hashCodeOf(object[i]) * i;\n }\n return hashCode;\n }\n if (typeof object === 'string') {\n for (let i = 0; i < object.length; i++) {\n hashCode ^= object.charCodeAt(i) * i;\n }\n return hashCode;\n }\n if (typeof object === 'number') {\n return object;\n }\n if (typeof object === 'object') {\n for (const [key, value] of Object.entries(object)) {\n hashCode ^= this.hashCodeOf(key) + this.hashCodeOf(value !== null && value !== void 0 ? value : '');\n }\n }\n return hashCode;\n }\n}\n\nfunction isUndefined(value) {\n return value === undefined;\n}\nfunction mapValues(object, mapper) {\n const result = {};\n Object.entries(object).forEach(([key, value]) => {\n result[key] = mapper(value);\n });\n return result;\n}\nfunction omit(object, keys) {\n const result = {};\n Object.entries(object).forEach(([key, value]) => {\n if (!keys.some(keyToOmit => keyToOmit === key)) {\n result[key] = value;\n }\n });\n return result;\n}\nfunction omitBy(object, predicate) {\n const result = {};\n Object.entries(object).forEach(([key, value]) => {\n if (!predicate(value, key)) {\n result[key] = value;\n }\n });\n return result;\n}\nfunction compact(arr) {\n return arr.filter((elem) => !isUndefined(elem));\n}\nconst objectEquals = isEqual;\nfunction uniq(values) {\n const set = new ObjectSet();\n values.forEach(value => set.put(value));\n return [...set.values()];\n}\nfunction isString(val) {\n return typeof val === 'string';\n}\n\nfunction getOpenApiMetadata(zodSchema) {\n var _a, _b;\n return omitBy((_b = (_a = zodSchema._def.openapi) === null || _a === void 0 ? void 0 : _a.metadata) !== null && _b !== void 0 ? _b : {}, isUndefined);\n}\n\nclass OpenAPIRegistry {\n constructor(parents) {\n this.parents = parents;\n this._definitions = [];\n }\n get definitions() {\n var _a, _b;\n const parentDefinitions = (_b = (_a = this.parents) === null || _a === void 0 ? void 0 : _a.flatMap(par => par.definitions)) !== null && _b !== void 0 ? _b : [];\n return [...parentDefinitions, ...this._definitions];\n }\n /**\n * Registers a new component schema under /components/schemas/${name}\n */\n register(refId, zodSchema) {\n const schemaWithRefId = this.schemaWithRefId(refId, zodSchema);\n this._definitions.push({ type: 'schema', schema: schemaWithRefId });\n return schemaWithRefId;\n }\n /**\n * Registers a new parameter schema under /components/parameters/${name}\n */\n registerParameter(refId, zodSchema) {\n var _a, _b, _c;\n const schemaWithRefId = this.schemaWithRefId(refId, zodSchema);\n const currentMetadata = (_a = schemaWithRefId._def.openapi) === null || _a === void 0 ? void 0 : _a.metadata;\n const schemaWithMetadata = schemaWithRefId.openapi(Object.assign(Object.assign({}, currentMetadata), { param: Object.assign(Object.assign({}, currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param), { name: (_c = (_b = currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : refId }) }));\n this._definitions.push({\n type: 'parameter',\n schema: schemaWithMetadata,\n });\n return schemaWithMetadata;\n }\n /**\n * Registers a new path that would be generated under paths:\n */\n registerPath(route) {\n this._definitions.push({\n type: 'route',\n route,\n });\n }\n /**\n * Registers a new webhook that would be generated under webhooks:\n */\n registerWebhook(webhook) {\n this._definitions.push({\n type: 'webhook',\n webhook,\n });\n }\n /**\n * Registers a raw OpenAPI component. Use this if you have a simple object instead of a Zod schema.\n *\n * @param type The component type, e.g. `schemas`, `responses`, `securitySchemes`, etc.\n * @param name The name of the object, it is the key under the component\n * type in the resulting OpenAPI document\n * @param component The actual object to put there\n */\n registerComponent(type, name, component) {\n this._definitions.push({\n type: 'component',\n componentType: type,\n name,\n component,\n });\n return {\n name,\n ref: { $ref: `#/components/${type}/${name}` },\n };\n }\n schemaWithRefId(refId, zodSchema) {\n return zodSchema.openapi(refId);\n }\n}\n\nclass ZodToOpenAPIError {\n constructor(message) {\n this.message = message;\n }\n}\nclass ConflictError extends ZodToOpenAPIError {\n constructor(message, data) {\n super(message);\n this.data = data;\n }\n}\nclass MissingParameterDataError extends ZodToOpenAPIError {\n constructor(data) {\n super(`Missing parameter data, please specify \\`${data.missingField}\\` and other OpenAPI parameter props using the \\`param\\` field of \\`ZodSchema.openapi\\``);\n this.data = data;\n }\n}\nfunction enhanceMissingParametersError(action, paramsToAdd) {\n try {\n return action();\n }\n catch (error) {\n if (error instanceof MissingParameterDataError) {\n throw new MissingParameterDataError(Object.assign(Object.assign({}, error.data), paramsToAdd));\n }\n throw error;\n }\n}\nclass UnknownZodTypeError extends ZodToOpenAPIError {\n constructor(data) {\n super(`Unknown zod object type, please specify \\`type\\` and other OpenAPI props using \\`ZodSchema.openapi\\`.`);\n this.data = data;\n }\n}\n\nclass Metadata {\n static getMetadata(zodSchema) {\n var _a;\n const innerSchema = this.unwrapChained(zodSchema);\n const metadata = zodSchema._def.openapi\n ? zodSchema._def.openapi\n : innerSchema._def.openapi;\n /**\n * Every zod schema can receive a `description` by using the .describe method.\n * That description should be used when generating an OpenApi schema.\n * The `??` bellow makes sure we can handle both:\n * - schema.describe('Test').optional()\n * - schema.optional().describe('Test')\n */\n const zodDescription = (_a = zodSchema.description) !== null && _a !== void 0 ? _a : innerSchema.description;\n // A description provided from .openapi() should be taken with higher precedence\n return {\n _internal: metadata === null || metadata === void 0 ? void 0 : metadata._internal,\n metadata: Object.assign({ description: zodDescription }, metadata === null || metadata === void 0 ? void 0 : metadata.metadata),\n };\n }\n static getInternalMetadata(zodSchema) {\n const innerSchema = this.unwrapChained(zodSchema);\n const openapi = zodSchema._def.openapi\n ? zodSchema._def.openapi\n : innerSchema._def.openapi;\n return openapi === null || openapi === void 0 ? void 0 : openapi._internal;\n }\n static getParamMetadata(zodSchema) {\n var _a, _b;\n const innerSchema = this.unwrapChained(zodSchema);\n const metadata = zodSchema._def.openapi\n ? zodSchema._def.openapi\n : innerSchema._def.openapi;\n /**\n * Every zod schema can receive a `description` by using the .describe method.\n * That description should be used when generating an OpenApi schema.\n * The `??` bellow makes sure we can handle both:\n * - schema.describe('Test').optional()\n * - schema.optional().describe('Test')\n */\n const zodDescription = (_a = zodSchema.description) !== null && _a !== void 0 ? _a : innerSchema.description;\n return {\n _internal: metadata === null || metadata === void 0 ? void 0 : metadata._internal,\n metadata: Object.assign(Object.assign({}, metadata === null || metadata === void 0 ? void 0 : metadata.metadata), { \n // A description provided from .openapi() should be taken with higher precedence\n param: Object.assign({ description: zodDescription }, (_b = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _b === void 0 ? void 0 : _b.param) }),\n };\n }\n /**\n * A method that omits all custom keys added to the regular OpenAPI\n * metadata properties\n */\n static buildSchemaMetadata(metadata) {\n return omitBy(omit(metadata, ['param']), isUndefined);\n }\n static buildParameterMetadata(metadata) {\n return omitBy(metadata, isUndefined);\n }\n static applySchemaMetadata(initialData, metadata) {\n return omitBy(Object.assign(Object.assign({}, initialData), this.buildSchemaMetadata(metadata)), isUndefined);\n }\n static getRefId(zodSchema) {\n var _a;\n return (_a = this.getInternalMetadata(zodSchema)) === null || _a === void 0 ? void 0 : _a.refId;\n }\n static unwrapChained(schema) {\n return this.unwrapUntil(schema);\n }\n static getDefaultValue(zodSchema) {\n const unwrapped = this.unwrapUntil(zodSchema, 'ZodDefault');\n return unwrapped === null || unwrapped === void 0 ? void 0 : unwrapped._def.defaultValue();\n }\n static unwrapUntil(schema, typeName) {\n if (typeName && isZodType(schema, typeName)) {\n return schema;\n }\n if (isZodType(schema, 'ZodOptional') ||\n isZodType(schema, 'ZodNullable') ||\n isZodType(schema, 'ZodBranded')) {\n return this.unwrapUntil(schema.unwrap(), typeName);\n }\n if (isZodType(schema, 'ZodDefault') || isZodType(schema, 'ZodReadonly')) {\n return this.unwrapUntil(schema._def.innerType, typeName);\n }\n if (isZodType(schema, 'ZodEffects')) {\n return this.unwrapUntil(schema._def.schema, typeName);\n }\n if (isZodType(schema, 'ZodPipeline')) {\n return this.unwrapUntil(schema._def.in, typeName);\n }\n return typeName ? undefined : schema;\n }\n static isOptionalSchema(zodSchema) {\n return zodSchema.isOptional();\n }\n}\n\nclass ArrayTransformer {\n transform(zodSchema, mapNullableType, mapItems) {\n var _a, _b;\n const itemType = zodSchema._def.type;\n return Object.assign(Object.assign({}, mapNullableType('array')), { items: mapItems(itemType), minItems: (_a = zodSchema._def.minLength) === null || _a === void 0 ? void 0 : _a.value, maxItems: (_b = zodSchema._def.maxLength) === null || _b === void 0 ? void 0 : _b.value });\n }\n}\n\nclass BigIntTransformer {\n transform(mapNullableType) {\n return Object.assign(Object.assign({}, mapNullableType('string')), { pattern: `^\\d+$` });\n }\n}\n\nclass DiscriminatedUnionTransformer {\n transform(zodSchema, isNullable, mapNullableOfArray, mapItem, generateSchemaRef) {\n const options = [...zodSchema.options.values()];\n const optionSchema = options.map(mapItem);\n if (isNullable) {\n return {\n oneOf: mapNullableOfArray(optionSchema, isNullable),\n };\n }\n return {\n oneOf: optionSchema,\n discriminator: this.mapDiscriminator(options, zodSchema.discriminator, generateSchemaRef),\n };\n }\n mapDiscriminator(zodObjects, discriminator, generateSchemaRef) {\n // All schemas must be registered to use a discriminator\n if (zodObjects.some(obj => Metadata.getRefId(obj) === undefined)) {\n return undefined;\n }\n const mapping = {};\n zodObjects.forEach(obj => {\n var _a;\n const refId = Metadata.getRefId(obj); // type-checked earlier\n const value = (_a = obj.shape) === null || _a === void 0 ? void 0 : _a[discriminator];\n if (isZodType(value, 'ZodEnum') || isZodType(value, 'ZodNativeEnum')) {\n // Native enums have their keys as both number and strings however the number is an\n // internal representation and the string is the access point for a documentation\n const keys = Object.values(value.enum).filter(isString);\n keys.forEach((enumValue) => {\n mapping[enumValue] = generateSchemaRef(refId);\n });\n return;\n }\n const literalValue = value === null || value === void 0 ? void 0 : value._def.value;\n // This should never happen because Zod checks the disciminator type but to keep the types happy\n if (typeof literalValue !== 'string') {\n throw new Error(`Discriminator ${discriminator} could not be found in one of the values of a discriminated union`);\n }\n mapping[literalValue] = generateSchemaRef(refId);\n });\n return {\n propertyName: discriminator,\n mapping,\n };\n }\n}\n\nclass EnumTransformer {\n transform(zodSchema, mapNullableType) {\n // ZodEnum only accepts strings\n return Object.assign(Object.assign({}, mapNullableType('string')), { enum: zodSchema._def.values });\n }\n}\n\nclass IntersectionTransformer {\n transform(zodSchema, isNullable, mapNullableOfArray, mapItem) {\n const subtypes = this.flattenIntersectionTypes(zodSchema);\n const allOfSchema = {\n allOf: subtypes.map(mapItem),\n };\n if (isNullable) {\n return {\n anyOf: mapNullableOfArray([allOfSchema], isNullable),\n };\n }\n return allOfSchema;\n }\n flattenIntersectionTypes(schema) {\n if (!isZodType(schema, 'ZodIntersection')) {\n return [schema];\n }\n const leftSubTypes = this.flattenIntersectionTypes(schema._def.left);\n const rightSubTypes = this.flattenIntersectionTypes(schema._def.right);\n return [...leftSubTypes, ...rightSubTypes];\n }\n}\n\nclass LiteralTransformer {\n transform(zodSchema, mapNullableType) {\n return Object.assign(Object.assign({}, mapNullableType(typeof zodSchema._def.value)), { enum: [zodSchema._def.value] });\n }\n}\n\n/**\n * Numeric enums have a reverse mapping https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\n * whereas string ones don't.\n *\n * This function checks if an enum is fully numeric - i.e all values are numbers or not.\n * And filters out only the actual enum values when a reverse mapping is apparent.\n */\nfunction enumInfo(enumObject) {\n const keysExceptReverseMappings = Object.keys(enumObject).filter(key => typeof enumObject[enumObject[key]] !== 'number');\n const values = keysExceptReverseMappings.map(key => enumObject[key]);\n const numericCount = values.filter(_ => typeof _ === 'number').length;\n const type = numericCount === 0\n ? 'string'\n : numericCount === values.length\n ? 'numeric'\n : 'mixed';\n return { values, type };\n}\n\nclass NativeEnumTransformer {\n transform(zodSchema, mapNullableType) {\n const { type, values } = enumInfo(zodSchema._def.values);\n if (type === 'mixed') {\n // enum Test {\n // A = 42,\n // B = 'test',\n // }\n //\n // const result = z.nativeEnum(Test).parse('42');\n //\n // This is an error, so we can't just say it's a 'string'\n throw new ZodToOpenAPIError('Enum has mixed string and number values, please specify the OpenAPI type manually');\n }\n return Object.assign(Object.assign({}, mapNullableType(type === 'numeric' ? 'integer' : 'string')), { enum: values });\n }\n}\n\nclass NumberTransformer {\n transform(zodSchema, mapNullableType, getNumberChecks) {\n return Object.assign(Object.assign({}, mapNullableType(zodSchema.isInt ? 'integer' : 'number')), getNumberChecks(zodSchema._def.checks));\n }\n}\n\nclass ObjectTransformer {\n transform(zodSchema, defaultValue, mapNullableType, mapItem) {\n var _a;\n const extendedFrom = (_a = Metadata.getInternalMetadata(zodSchema)) === null || _a === void 0 ? void 0 : _a.extendedFrom;\n const required = this.requiredKeysOf(zodSchema);\n const properties = mapValues(zodSchema._def.shape(), mapItem);\n if (!extendedFrom) {\n return Object.assign(Object.assign(Object.assign(Object.assign({}, mapNullableType('object')), { properties, default: defaultValue }), (required.length > 0 ? { required } : {})), this.generateAdditionalProperties(zodSchema, mapItem));\n }\n const parent = extendedFrom.schema;\n // We want to generate the parent schema so that it can be referenced down the line\n mapItem(parent);\n const keysRequiredByParent = this.requiredKeysOf(parent);\n const propsOfParent = mapValues(parent === null || parent === void 0 ? void 0 : parent._def.shape(), mapItem);\n const propertiesToAdd = Object.fromEntries(Object.entries(properties).filter(([key, type]) => {\n return !objectEquals(propsOfParent[key], type);\n }));\n const additionallyRequired = required.filter(prop => !keysRequiredByParent.includes(prop));\n const objectData = Object.assign(Object.assign(Object.assign(Object.assign({}, mapNullableType('object')), { default: defaultValue, properties: propertiesToAdd }), (additionallyRequired.length > 0\n ? { required: additionallyRequired }\n : {})), this.generateAdditionalProperties(zodSchema, mapItem));\n return {\n allOf: [\n { $ref: `#/components/schemas/${extendedFrom.refId}` },\n objectData,\n ],\n };\n }\n generateAdditionalProperties(zodSchema, mapItem) {\n const unknownKeysOption = zodSchema._def.unknownKeys;\n const catchallSchema = zodSchema._def.catchall;\n if (isZodType(catchallSchema, 'ZodNever')) {\n if (unknownKeysOption === 'strict') {\n return { additionalProperties: false };\n }\n return {};\n }\n return { additionalProperties: mapItem(catchallSchema) };\n }\n requiredKeysOf(objectSchema) {\n return Object.entries(objectSchema._def.shape())\n .filter(([_key, type]) => !Metadata.isOptionalSchema(type))\n .map(([key, _type]) => key);\n }\n}\n\nclass RecordTransformer {\n transform(zodSchema, mapNullableType, mapItem) {\n const propertiesType = zodSchema._def.valueType;\n const keyType = zodSchema._def.keyType;\n const propertiesSchema = mapItem(propertiesType);\n if (isZodType(keyType, 'ZodEnum') || isZodType(keyType, 'ZodNativeEnum')) {\n // Native enums have their keys as both number and strings however the number is an\n // internal representation and the string is the access point for a documentation\n const keys = Object.values(keyType.enum).filter(isString);\n const properties = keys.reduce((acc, curr) => (Object.assign(Object.assign({}, acc), { [curr]: propertiesSchema })), {});\n return Object.assign(Object.assign({}, mapNullableType('object')), { properties });\n }\n return Object.assign(Object.assign({}, mapNullableType('object')), { additionalProperties: propertiesSchema });\n }\n}\n\nclass StringTransformer {\n transform(zodSchema, mapNullableType) {\n var _a, _b, _c;\n const regexCheck = this.getZodStringCheck(zodSchema, 'regex');\n const length = (_a = this.getZodStringCheck(zodSchema, 'length')) === null || _a === void 0 ? void 0 : _a.value;\n const maxLength = Number.isFinite(zodSchema.minLength)\n ? (_b = zodSchema.minLength) !== null && _b !== void 0 ? _b : undefined\n : undefined;\n const minLength = Number.isFinite(zodSchema.maxLength)\n ? (_c = zodSchema.maxLength) !== null && _c !== void 0 ? _c : undefined\n : undefined;\n return Object.assign(Object.assign({}, mapNullableType('string')), { \n // FIXME: https://github.com/colinhacks/zod/commit/d78047e9f44596a96d637abb0ce209cd2732d88c\n minLength: length !== null && length !== void 0 ? length : maxLength, maxLength: length !== null && length !== void 0 ? length : minLength, format: this.mapStringFormat(zodSchema), pattern: regexCheck === null || regexCheck === void 0 ? void 0 : regexCheck.regex.source });\n }\n /**\n * Attempts to map Zod strings to known formats\n * https://json-schema.org/understanding-json-schema/reference/string.html#built-in-formats\n */\n mapStringFormat(zodString) {\n if (zodString.isUUID)\n return 'uuid';\n if (zodString.isEmail)\n return 'email';\n if (zodString.isURL)\n return 'uri';\n if (zodString.isDate)\n return 'date';\n if (zodString.isDatetime)\n return 'date-time';\n if (zodString.isCUID)\n return 'cuid';\n if (zodString.isCUID2)\n return 'cuid2';\n if (zodString.isULID)\n return 'ulid';\n if (zodString.isIP)\n return 'ip';\n if (zodString.isEmoji)\n return 'emoji';\n return undefined;\n }\n getZodStringCheck(zodString, kind) {\n return zodString._def.checks.find((check) => {\n return check.kind === kind;\n });\n }\n}\n\nclass TupleTransformer {\n constructor(versionSpecifics) {\n this.versionSpecifics = versionSpecifics;\n }\n transform(zodSchema, mapNullableType, mapItem) {\n const { items } = zodSchema._def;\n const schemas = items.map(mapItem);\n return Object.assign(Object.assign({}, mapNullableType('array')), this.versionSpecifics.mapTupleItems(schemas));\n }\n}\n\nclass UnionTransformer {\n transform(zodSchema, mapNullableOfArray, mapItem) {\n const options = this.flattenUnionTypes(zodSchema);\n const schemas = options.map(schema => {\n // If any of the underlying schemas of a union is .nullable then the whole union\n // would be nullable. `mapNullableOfArray` would place it where it belongs.\n // Therefor we are stripping the additional nullables from the inner schemas\n // See https://github.com/asteasolutions/zod-to-openapi/issues/149\n const optionToGenerate = this.unwrapNullable(schema);\n return mapItem(optionToGenerate);\n });\n return {\n anyOf: mapNullableOfArray(schemas),\n };\n }\n flattenUnionTypes(schema) {\n if (!isZodType(schema, 'ZodUnion')) {\n return [schema];\n }\n const options = schema._def.options;\n return options.flatMap(option => this.flattenUnionTypes(option));\n }\n unwrapNullable(schema) {\n if (isZodType(schema, 'ZodNullable')) {\n return this.unwrapNullable(schema.unwrap());\n }\n return schema;\n }\n}\n\nclass OpenApiTransformer {\n constructor(versionSpecifics) {\n this.versionSpecifics = versionSpecifics;\n this.objectTransformer = new ObjectTransformer();\n this.stringTransformer = new StringTransformer();\n this.numberTransformer = new NumberTransformer();\n this.bigIntTransformer = new BigIntTransformer();\n this.literalTransformer = new LiteralTransformer();\n this.enumTransformer = new EnumTransformer();\n this.nativeEnumTransformer = new NativeEnumTransformer();\n this.arrayTransformer = new ArrayTransformer();\n this.unionTransformer = new UnionTransformer();\n this.discriminatedUnionTransformer = new DiscriminatedUnionTransformer();\n this.intersectionTransformer = new IntersectionTransformer();\n this.recordTransformer = new RecordTransformer();\n this.tupleTransformer = new TupleTransformer(versionSpecifics);\n }\n transform(zodSchema, isNullable, mapItem, generateSchemaRef, defaultValue) {\n if (isZodType(zodSchema, 'ZodNull')) {\n return this.versionSpecifics.nullType;\n }\n if (isZodType(zodSchema, 'ZodUnknown') || isZodType(zodSchema, 'ZodAny')) {\n return this.versionSpecifics.mapNullableType(undefined, isNullable);\n }\n if (isZodType(zodSchema, 'ZodObject')) {\n return this.objectTransformer.transform(zodSchema, defaultValue, // verified on TS level from input\n // verified on TS level from input\n _ => this.versionSpecifics.mapNullableType(_, isNullable), mapItem);\n }\n const schema = this.transformSchemaWithoutDefault(zodSchema, isNullable, mapItem, generateSchemaRef);\n return Object.assign(Object.assign({}, schema), { default: defaultValue });\n }\n transformSchemaWithoutDefault(zodSchema, isNullable, mapItem, generateSchemaRef) {\n if (isZodType(zodSchema, 'ZodUnknown') || isZodType(zodSchema, 'ZodAny')) {\n return this.versionSpecifics.mapNullableType(undefined, isNullable);\n }\n if (isZodType(zodSchema, 'ZodString')) {\n return this.stringTransformer.transform(zodSchema, schema => this.versionSpecifics.mapNullableType(schema, isNullable));\n }\n if (isZodType(zodSchema, 'ZodNumber')) {\n return this.numberTransformer.transform(zodSchema, schema => this.versionSpecifics.mapNullableType(schema, isNullable), _ => this.versionSpecifics.getNumberChecks(_));\n }\n if (isZodType(zodSchema, 'ZodBigInt')) {\n return this.bigIntTransformer.transform(schema => this.versionSpecifics.mapNullableType(schema, isNullable));\n }\n if (isZodType(zodSchema, 'ZodBoolean')) {\n return this.versionSpecifics.mapNullableType('boolean', isNullable);\n }\n if (isZodType(zodSchema, 'ZodLiteral')) {\n return this.literalTransformer.transform(zodSchema, schema => this.versionSpecifics.mapNullableType(schema, isNullable));\n }\n if (isZodType(zodSchema, 'ZodEnum')) {\n return this.enumTransformer.transform(zodSchema, schema => this.versionSpecifics.mapNullableType(schema, isNullable));\n }\n if (isZodType(zodSchema, 'ZodNativeEnum')) {\n return this.nativeEnumTransformer.transform(zodSchema, schema => this.versionSpecifics.mapNullableType(schema, isNullable));\n }\n if (isZodType(zodSchema, 'ZodArray')) {\n return this.arrayTransformer.transform(zodSchema, _ => this.versionSpecifics.mapNullableType(_, isNullable), mapItem);\n }\n if (isZodType(zodSchema, 'ZodTuple')) {\n return this.tupleTransformer.transform(zodSchema, _ => this.versionSpecifics.mapNullableType(_, isNullable), mapItem);\n }\n if (isZodType(zodSchema, 'ZodUnion')) {\n return this.unionTransformer.transform(zodSchema, _ => this.versionSpecifics.mapNullableOfArray(_, isNullable), mapItem);\n }\n if (isZodType(zodSchema, 'ZodDiscriminatedUnion')) {\n return this.discriminatedUnionTransformer.transform(zodSchema, isNullable, _ => this.versionSpecifics.mapNullableOfArray(_, isNullable), mapItem, generateSchemaRef);\n }\n if (isZodType(zodSchema, 'ZodIntersection')) {\n return this.intersectionTransformer.transform(zodSchema, isNullable, _ => this.versionSpecifics.mapNullableOfArray(_, isNullable), mapItem);\n }\n if (isZodType(zodSchema, 'ZodRecord')) {\n return this.recordTransformer.transform(zodSchema, _ => this.versionSpecifics.mapNullableType(_, isNullable), mapItem);\n }\n if (isZodType(zodSchema, 'ZodDate')) {\n return this.versionSpecifics.mapNullableType('string', isNullable);\n }\n const refId = Metadata.getRefId(zodSchema);\n throw new UnknownZodTypeError({\n currentSchema: zodSchema._def,\n schemaName: refId,\n });\n }\n}\n\nclass OpenAPIGenerator {\n constructor(definitions, versionSpecifics) {\n this.definitions = definitions;\n this.versionSpecifics = versionSpecifics;\n this.schemaRefs = {};\n this.paramRefs = {};\n this.pathRefs = {};\n this.rawComponents = [];\n this.openApiTransformer = new OpenApiTransformer(versionSpecifics);\n this.sortDefinitions();\n }\n generateDocumentData() {\n this.definitions.forEach(definition => this.generateSingle(definition));\n return {\n components: this.buildComponents(),\n paths: this.pathRefs,\n };\n }\n generateComponents() {\n this.definitions.forEach(definition => this.generateSingle(definition));\n return {\n components: this.buildComponents(),\n };\n }\n buildComponents() {\n var _a, _b;\n const rawComponents = {};\n this.rawComponents.forEach(({ componentType, name, component }) => {\n var _a;\n (_a = rawComponents[componentType]) !== null && _a !== void 0 ? _a : (rawComponents[componentType] = {});\n rawComponents[componentType][name] = component;\n });\n return Object.assign(Object.assign({}, rawComponents), { schemas: Object.assign(Object.assign({}, ((_a = rawComponents.schemas) !== null && _a !== void 0 ? _a : {})), this.schemaRefs), parameters: Object.assign(Object.assign({}, ((_b = rawComponents.parameters) !== null && _b !== void 0 ? _b : {})), this.paramRefs) });\n }\n sortDefinitions() {\n const generationOrder = [\n 'schema',\n 'parameter',\n 'component',\n 'route',\n ];\n this.definitions.sort((left, right) => {\n // No type means \"plain zod schema\" => it comes as highest priority based on the array above\n if (!('type' in left)) {\n if (!('type' in right)) {\n return 0;\n }\n return -1;\n }\n if (!('type' in right)) {\n return 1;\n }\n const leftIndex = generationOrder.findIndex(type => type === left.type);\n const rightIndex = generationOrder.findIndex(type => type === right.type);\n return leftIndex - rightIndex;\n });\n }\n generateSingle(definition) {\n if (!('type' in definition)) {\n this.generateSchemaWithRef(definition);\n return;\n }\n switch (definition.type) {\n case 'parameter':\n this.generateParameterDefinition(definition.schema);\n return;\n case 'schema':\n this.generateSchemaWithRef(definition.schema);\n return;\n case 'route':\n this.generateSingleRoute(definition.route);\n return;\n case 'component':\n this.rawComponents.push(definition);\n return;\n }\n }\n generateParameterDefinition(zodSchema) {\n const refId = Metadata.getRefId(zodSchema);\n const result = this.generateParameter(zodSchema);\n if (refId) {\n this.paramRefs[refId] = result;\n }\n return result;\n }\n getParameterRef(schemaMetadata, external) {\n var _a, _b, _c, _d, _e;\n const parameterMetadata = (_a = schemaMetadata === null || schemaMetadata === void 0 ? void 0 : schemaMetadata.metadata) === null || _a === void 0 ? void 0 : _a.param;\n const existingRef = ((_b = schemaMetadata === null || schemaMetadata === void 0 ? void 0 : schemaMetadata._internal) === null || _b === void 0 ? void 0 : _b.refId)\n ? this.paramRefs[(_c = schemaMetadata._internal) === null || _c === void 0 ? void 0 : _c.refId]\n : undefined;\n if (!((_d = schemaMetadata === null || schemaMetadata === void 0 ? void 0 : schemaMetadata._internal) === null || _d === void 0 ? void 0 : _d.refId) || !existingRef) {\n return undefined;\n }\n if ((parameterMetadata && existingRef.in !== parameterMetadata.in) ||\n ((external === null || external === void 0 ? void 0 : external.in) && existingRef.in !== external.in)) {\n throw new ConflictError(`Conflicting location for parameter ${existingRef.name}`, {\n key: 'in',\n values: compact([\n existingRef.in,\n external === null || external === void 0 ? void 0 : external.in,\n parameterMetadata === null || parameterMetadata === void 0 ? void 0 : parameterMetadata.in,\n ]),\n });\n }\n if ((parameterMetadata && existingRef.name !== parameterMetadata.name) ||\n ((external === null || external === void 0 ? void 0 : external.name) && existingRef.name !== (external === null || external === void 0 ? void 0 : external.name))) {\n throw new ConflictError(`Conflicting names for parameter`, {\n key: 'name',\n values: compact([\n existingRef.name,\n external === null || external === void 0 ? void 0 : external.name,\n parameterMetadata === null || parameterMetadata === void 0 ? void 0 : parameterMetadata.name,\n ]),\n });\n }\n return {\n $ref: `#/components/parameters/${(_e = schemaMetadata._internal) === null || _e === void 0 ? void 0 : _e.refId}`,\n };\n }\n generateInlineParameters(zodSchema, location) {\n var _a;\n const metadata = Metadata.getMetadata(zodSchema);\n const parameterMetadata = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _a === void 0 ? void 0 : _a.param;\n const referencedSchema = this.getParameterRef(metadata, { in: location });\n if (referencedSchema) {\n return [referencedSchema];\n }\n if (isZodType(zodSchema, 'ZodObject')) {\n const propTypes = zodSchema._def.shape();\n const parameters = Object.entries(propTypes).map(([key, schema]) => {\n var _a, _b;\n const innerMetadata = Metadata.getMetadata(schema);\n const referencedSchema = this.getParameterRef(innerMetadata, {\n in: location,\n name: key,\n });\n if (referencedSchema) {\n return referencedSchema;\n }\n const innerParameterMetadata = (_a = innerMetadata === null || innerMetadata === void 0 ? void 0 : innerMetadata.metadata) === null || _a === void 0 ? void 0 : _a.param;\n if ((innerParameterMetadata === null || innerParameterMetadata === void 0 ? void 0 : innerParameterMetadata.name) &&\n innerParameterMetadata.name !== key) {\n throw new ConflictError(`Conflicting names for parameter`, {\n key: 'name',\n values: [key, innerParameterMetadata.name],\n });\n }\n if ((innerParameterMetadata === null || innerParameterMetadata === void 0 ? void 0 : innerParameterMetadata.in) &&\n innerParameterMetadata.in !== location) {\n throw new ConflictError(`Conflicting location for parameter ${(_b = innerParameterMetadata.name) !== null && _b !== void 0 ? _b : key}`, {\n key: 'in',\n values: [location, innerParameterMetadata.in],\n });\n }\n return this.generateParameter(schema.openapi({ param: { name: key, in: location } }));\n });\n return parameters;\n }\n if ((parameterMetadata === null || parameterMetadata === void 0 ? void 0 : parameterMetadata.in) && parameterMetadata.in !== location) {\n throw new ConflictError(`Conflicting location for parameter ${parameterMetadata.name}`, {\n key: 'in',\n values: [location, parameterMetadata.in],\n });\n }\n return [\n this.generateParameter(zodSchema.openapi({ param: { in: location } })),\n ];\n }\n generateSimpleParameter(zodSchema) {\n var _a;\n const metadata = Metadata.getParamMetadata(zodSchema);\n const paramMetadata = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _a === void 0 ? void 0 : _a.param;\n // TODO: Why are we not unwrapping here for isNullable as well?\n const required = !Metadata.isOptionalSchema(zodSchema) && !zodSchema.isNullable();\n const schema = this.generateSchemaWithRef(zodSchema);\n return Object.assign({ schema,\n required }, (paramMetadata ? Metadata.buildParameterMetadata(paramMetadata) : {}));\n }\n generateParameter(zodSchema) {\n var _a;\n const metadata = Metadata.getMetadata(zodSchema);\n const paramMetadata = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _a === void 0 ? void 0 : _a.param;\n const paramName = paramMetadata === null || paramMetadata === void 0 ? void 0 : paramMetadata.name;\n const paramLocation = paramMetadata === null || paramMetadata === void 0 ? void 0 : paramMetadata.in;\n if (!paramName) {\n throw new MissingParameterDataError({ missingField: 'name' });\n }\n if (!paramLocation) {\n throw new MissingParameterDataError({\n missingField: 'in',\n paramName,\n });\n }\n const baseParameter = this.generateSimpleParameter(zodSchema);\n return Object.assign(Object.assign({}, baseParameter), { in: paramLocation, name: paramName });\n }\n generateSchemaWithMetadata(zodSchema) {\n var _a;\n const innerSchema = Metadata.unwrapChained(zodSchema);\n const metadata = Metadata.getMetadata(zodSchema);\n const defaultValue = Metadata.getDefaultValue(zodSchema);\n const result = ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _a === void 0 ? void 0 : _a.type)\n ? { type: metadata === null || metadata === void 0 ? void 0 : metadata.metadata.type }\n : this.toOpenAPISchema(innerSchema, zodSchema.isNullable(), defaultValue);\n return (metadata === null || metadata === void 0 ? void 0 : metadata.metadata)\n ? Metadata.applySchemaMetadata(result, metadata.metadata)\n : omitBy(result, isUndefined);\n }\n /**\n * Same as above but applies nullable\n */\n constructReferencedOpenAPISchema(zodSchema) {\n var _a;\n const metadata = Metadata.getMetadata(zodSchema);\n const innerSchema = Metadata.unwrapChained(zodSchema);\n const defaultValue = Metadata.getDefaultValue(zodSchema);\n const isNullableSchema = zodSchema.isNullable();\n if ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) === null || _a === void 0 ? void 0 : _a.type) {\n return this.versionSpecifics.mapNullableType(metadata.metadata.type, isNullableSchema);\n }\n return this.toOpenAPISchema(innerSchema, isNullableSchema, defaultValue);\n }\n /**\n * Generates an OpenAPI SchemaObject or a ReferenceObject with all the provided metadata applied\n */\n generateSimpleSchema(zodSchema) {\n var _a;\n const metadata = Metadata.getMetadata(zodSchema);\n const refId = Metadata.getRefId(zodSchema);\n if (!refId || !this.schemaRefs[refId]) {\n return this.generateSchemaWithMetadata(zodSchema);\n }\n const schemaRef = this.schemaRefs[refId];\n const referenceObject = {\n $ref: this.generateSchemaRef(refId),\n };\n // Metadata provided from .openapi() that is new to what we had already registered\n const newMetadata = omitBy(Metadata.buildSchemaMetadata((_a = metadata === null || metadata === void 0 ? void 0 : metadata.metadata) !== null && _a !== void 0 ? _a : {}), (value, key) => value === undefined || objectEquals(value, schemaRef[key]));\n // Do not calculate schema metadata overrides if type is provided in .openapi\n // https://github.com/asteasolutions/zod-to-openapi/pull/52/files/8ff707fe06e222bc573ed46cf654af8ee0b0786d#r996430801\n if (newMetadata.type) {\n return {\n allOf: [referenceObject, newMetadata],\n };\n }\n // New metadata from ZodSchema properties.\n const newSchemaMetadata = omitBy(this.constructReferencedOpenAPISchema(zodSchema), (value, key) => value === undefined || objectEquals(value, schemaRef[key]));\n const appliedMetadata = Metadata.applySchemaMetadata(newSchemaMetadata, newMetadata);\n if (Object.keys(appliedMetadata).length > 0) {\n return {\n allOf: [referenceObject, appliedMetadata],\n };\n }\n return referenceObject;\n }\n /**\n * Same as `generateSchema` but if the new schema is added into the\n * referenced schemas, it would return a ReferenceObject and not the\n * whole result.\n *\n * Should be used for nested objects, arrays, etc.\n */\n generateSchemaWithRef(zodSchema) {\n const refId = Metadata.getRefId(zodSchema);\n const result = this.generateSimpleSchema(zodSchema);\n if (refId && this.schemaRefs[refId] === undefined) {\n this.schemaRefs[refId] = result;\n return { $ref: this.generateSchemaRef(refId) };\n }\n return result;\n }\n generateSchemaRef(refId) {\n return `#/components/schemas/${refId}`;\n }\n getRequestBody(requestBody) {\n if (!requestBody) {\n return;\n }\n const { content } = requestBody, rest = __rest(requestBody, [\"content\"]);\n const requestBodyContent = this.getBodyContent(content);\n return Object.assign(Object.assign({}, rest), { content: requestBodyContent });\n }\n getParameters(request) {\n if (!request) {\n return [];\n }\n const { headers } = request;\n const query = this.cleanParameter(request.query);\n const params = this.cleanParameter(request.params);\n const cookies = this.cleanParameter(request.cookies);\n const queryParameters = enhanceMissingParametersError(() => (query ? this.generateInlineParameters(query, 'query') : []), { location: 'query' });\n const pathParameters = enhanceMissingParametersError(() => (params ? this.generateInlineParameters(params, 'path') : []), { location: 'path' });\n const cookieParameters = enhanceMissingParametersError(() => (cookies ? this.generateInlineParameters(cookies, 'cookie') : []), { location: 'cookie' });\n const headerParameters = enhanceMissingParametersError(() => {\n if (Array.isArray(headers)) {\n return headers.flatMap(header => this.generateInlineParameters(header, 'header'));\n }\n const cleanHeaders = this.cleanParameter(headers);\n return cleanHeaders\n ? this.generateInlineParameters(cleanHeaders, 'header')\n : [];\n }, { location: 'header' });\n return [\n ...pathParameters,\n ...queryParameters,\n ...headerParameters,\n ...cookieParameters,\n ];\n }\n cleanParameter(schema) {\n if (!schema) {\n return undefined;\n }\n return isZodType(schema, 'ZodEffects')\n ? this.cleanParameter(schema._def.schema)\n : schema;\n }\n generatePath(route) {\n const { method, path, request, responses } = route, pathItemConfig = __rest(route, [\"method\", \"path\", \"request\", \"responses\"]);\n const generatedResponses = mapValues(responses, response => {\n return this.getResponse(response);\n });\n const parameters = enhanceMissingParametersError(() => this.getParameters(request), { route: `${method} ${path}` });\n const requestBody = this.getRequestBody(request === null || request === void 0 ? void 0 : request.body);\n const routeDoc = {\n [method]: Object.assign(Object.assign(Object.assign(Object.assign({}, pathItemConfig), (parameters.length > 0\n ? {\n parameters: [...(pathItemConfig.parameters || []), ...parameters],\n }\n : {})), (requestBody ? { requestBody } : {})), { responses: generatedResponses }),\n };\n return routeDoc;\n }\n generateSingleRoute(route) {\n const routeDoc = this.generatePath(route);\n this.pathRefs[route.path] = Object.assign(Object.assign({}, this.pathRefs[route.path]), routeDoc);\n return routeDoc;\n }\n getResponse(response) {\n if (this.isReferenceObject(response)) {\n return response;\n }\n const { content, headers } = response, rest = __rest(response, [\"content\", \"headers\"]);\n const responseContent = content\n ? { content: this.getBodyContent(content) }\n : {};\n if (!headers) {\n return Object.assign(Object.assign({}, rest), responseContent);\n }\n const responseHeaders = isZodType(headers, 'ZodObject')\n ? this.getResponseHeaders(headers)\n : // This is input data so it is okay to cast in the common generator\n // since this is the user's responsibility to keep it correct\n headers;\n return Object.assign(Object.assign(Object.assign({}, rest), { headers: responseHeaders }), responseContent);\n }\n isReferenceObject(schema) {\n return '$ref' in schema;\n }\n getResponseHeaders(headers) {\n const schemaShape = headers._def.shape();\n const responseHeaders = mapValues(schemaShape, _ => this.generateSimpleParameter(_));\n return responseHeaders;\n }\n getBodyContent(content) {\n return mapValues(content, config => {\n if (!config || !isAnyZodType(config.schema)) {\n return config;\n }\n const { schema: configSchema } = config, rest = __rest(config, [\"schema\"]);\n const schema = this.generateSchemaWithRef(configSchema);\n return Object.assign({ schema }, rest);\n });\n }\n toOpenAPISchema(zodSchema, isNullable, defaultValue) {\n return this.openApiTransformer.transform(zodSchema, isNullable, _ => this.generateSchemaWithRef(_), _ => this.generateSchemaRef(_), defaultValue);\n }\n}\n\nclass OpenApiGeneratorV30Specifics {\n get nullType() {\n return { nullable: true };\n }\n mapNullableOfArray(objects, isNullable) {\n if (isNullable) {\n return [...objects, this.nullType];\n }\n return objects;\n }\n mapNullableType(type, isNullable) {\n return Object.assign(Object.assign({}, (type ? { type } : undefined)), (isNullable ? this.nullType : undefined));\n }\n mapTupleItems(schemas) {\n const uniqueSchemas = uniq(schemas);\n return {\n items: uniqueSchemas.length === 1\n ? uniqueSchemas[0]\n : { anyOf: uniqueSchemas },\n minItems: schemas.length,\n maxItems: schemas.length,\n };\n }\n getNumberChecks(checks) {\n return Object.assign({}, ...checks.map(check => {\n switch (check.kind) {\n case 'min':\n return check.inclusive\n ? { minimum: Number(check.value) }\n : { minimum: Number(check.value), exclusiveMinimum: true };\n case 'max':\n return check.inclusive\n ? { maximum: Number(check.value) }\n : { maximum: Number(check.value), exclusiveMaximum: true };\n default:\n return {};\n }\n }));\n }\n}\n\nclass OpenApiGeneratorV3 {\n constructor(definitions) {\n const specifics = new OpenApiGeneratorV30Specifics();\n this.generator = new OpenAPIGenerator(definitions, specifics);\n }\n generateDocument(config) {\n const baseData = this.generator.generateDocumentData();\n return Object.assign(Object.assign({}, config), baseData);\n }\n generateComponents() {\n return this.generator.generateComponents();\n }\n}\n\nclass OpenApiGeneratorV31Specifics {\n get nullType() {\n return { type: 'null' };\n }\n mapNullableOfArray(objects, isNullable) {\n if (isNullable) {\n return [...objects, this.nullType];\n }\n return objects;\n }\n mapNullableType(type, isNullable) {\n if (!type) {\n // 'null' is considered a type in Open API 3.1.0 => not providing a type includes null\n return {};\n }\n // Open API 3.1.0 made the `nullable` key invalid and instead you use type arrays\n if (isNullable) {\n return {\n type: Array.isArray(type) ? [...type, 'null'] : [type, 'null'],\n };\n }\n return {\n type,\n };\n }\n mapTupleItems(schemas) {\n return {\n prefixItems: schemas,\n };\n }\n getNumberChecks(checks) {\n return Object.assign({}, ...checks.map(check => {\n switch (check.kind) {\n case 'min':\n return check.inclusive\n ? { minimum: Number(check.value) }\n : { exclusiveMinimum: Number(check.value) };\n case 'max':\n return check.inclusive\n ? { maximum: Number(check.value) }\n : { exclusiveMaximum: Number(check.value) };\n default:\n return {};\n }\n }));\n }\n}\n\nfunction isWebhookDefinition(definition) {\n return 'type' in definition && definition.type === 'webhook';\n}\nclass OpenApiGeneratorV31 {\n constructor(definitions) {\n this.definitions = definitions;\n this.webhookRefs = {};\n const specifics = new OpenApiGeneratorV31Specifics();\n this.generator = new OpenAPIGenerator(this.definitions, specifics);\n }\n generateDocument(config) {\n const baseDocument = this.generator.generateDocumentData();\n this.definitions\n .filter(isWebhookDefinition)\n .forEach(definition => this.generateSingleWebhook(definition.webhook));\n return Object.assign(Object.assign(Object.assign({}, config), baseDocument), { webhooks: this.webhookRefs });\n }\n generateComponents() {\n return this.generator.generateComponents();\n }\n generateSingleWebhook(route) {\n const routeDoc = this.generator.generatePath(route);\n this.webhookRefs[route.path] = Object.assign(Object.assign({}, this.webhookRefs[route.path]), routeDoc);\n return routeDoc;\n }\n}\n\nexport { OpenAPIRegistry, OpenApiGeneratorV3, OpenApiGeneratorV31, extendZodWithOpenApi, getOpenApiMetadata };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Context, Env, Input, MiddlewareHandler, TypedResponse, ValidationTargets } from 'hono'\nimport { validator } from 'hono/validator'\nimport type * as v3 from 'zod/v3'\nimport type { ZodSafeParseResult as v4ZodSafeParseResult } from 'zod/v4'\nimport type * as v4 from 'zod/v4/core'\nimport type { InferInput } from './utils'\n\ntype ZodSchema = v3.ZodType | v4.$ZodType\ntype ZodError<T extends ZodSchema> = T extends v4.$ZodType\n ? v4.$ZodError<v4.output<T>>\n : v3.ZodError\ntype ZodSafeParseResult<T, T2, T3 extends ZodSchema> = T3 extends v4.$ZodType\n ? v4ZodSafeParseResult<T>\n : v3.SafeParseReturnType<T, T2>\ntype zInput<T> = T extends v3.ZodType ? v3.input<T> : T extends v4.$ZodType ? v4.input<T> : never\ntype zOutput<T> = T extends v3.ZodType ? v3.output<T> : T extends v4.$ZodType ? v4.output<T> : never\ntype zInfer<T> = T extends v3.ZodType ? v3.infer<T> : T extends v4.$ZodType ? v4.infer<T> : never\n\nexport type Hook<\n T,\n E extends Env,\n P extends string,\n Target extends keyof ValidationTargets = keyof ValidationTargets,\n O = {},\n Schema extends ZodSchema = any,\n> = (\n result: ({ success: true; data: T } | { success: false; error: ZodError<Schema>; data: T }) & {\n target: Target\n },\n c: Context<E, P>\n) => Response | void | TypedResponse<O> | Promise<Response | void | TypedResponse<O>>\n\ntype HasUndefined<T> = undefined extends T ? true : false\n\ntype ExtractValidationResponse<VF> = VF extends (value: any, c: any) => infer R\n ? R extends Promise<infer PR>\n ? PR extends TypedResponse<infer T, infer S, infer F>\n ? TypedResponse<T, S, F>\n : PR extends Response\n ? PR\n : PR extends undefined\n ? never\n : never\n : R extends TypedResponse<infer T, infer S, infer F>\n ? TypedResponse<T, S, F>\n : R extends Response\n ? R\n : R extends undefined\n ? never\n : never\n : never\n\ntype DefaultInput<Target extends keyof ValidationTargets, In, Out> = {\n in: HasUndefined<In> extends true\n ? {\n [K in Target]?: [In] extends [ValidationTargets[K]] ? In : InferInput<In, K>\n }\n : {\n [K in Target]: [In] extends [ValidationTargets[K]] ? In : InferInput<In, K>\n }\n out: { [K in Target]: Out }\n}\n\n// without hook and options\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n In = zInput<T>,\n Out = zOutput<T>,\n I extends Input = DefaultInput<Target, In, Out>,\n V extends I = I,\n>(target: Target, schema: T): MiddlewareHandler<E, P, V>\n\n// with hook and options\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n HookFn extends Hook<InferredValue, E, P, Target, {}, T>,\n In = zInput<T>,\n Out = zOutput<T>,\n I extends Input = DefaultInput<Target, In, Out>,\n V extends I = I,\n InferredValue = zInfer<T>,\n>(\n target: Target,\n schema: T,\n hook?: HookFn,\n options?: {\n validationFunction: (\n schema: T,\n value: ValidationTargets[Target]\n ) => ZodSafeParseResult<any, any, T> | Promise<ZodSafeParseResult<any, any, T>>\n }\n): MiddlewareHandler<E, P, V, ExtractValidationResponse<HookFn>>\n\n// implementation\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n HookFn extends Hook<InferredValue, E, P, Target, {}, T>,\n In = zInput<T>,\n Out = zOutput<T>,\n I extends Input = DefaultInput<Target, In, Out>,\n V extends I = I,\n InferredValue = zInfer<T>,\n>(\n target: Target,\n schema: T,\n hook?: HookFn,\n options?: {\n validationFunction: (\n schema: T,\n value: ValidationTargets[Target]\n ) => ZodSafeParseResult<any, any, T> | Promise<ZodSafeParseResult<any, any, T>>\n }\n): MiddlewareHandler<E, P, V> | MiddlewareHandler<E, P, V, ExtractValidationResponse<HookFn>> {\n // @ts-expect-error not typed well\n return validator(target, async (value: ValidationTargets[Target], c) => {\n let validatorValue = value\n\n // in case where our `target` === `header`, Hono parses all of the headers into lowercase.\n // this might not match the Zod schema, so we want to make sure that we account for that when parsing the schema.\n if ((target === 'header' && '_def' in schema) || (target === 'header' && '_zod' in schema)) {\n // create an object that maps lowercase schema keys to lowercase\n // @ts-expect-error the schema is a Zod Schema\n const schemaKeys = Object.keys('in' in schema ? schema.in.shape : schema.shape)\n const caseInsensitiveKeymap = Object.fromEntries(\n schemaKeys.map((key) => [key.toLowerCase(), key])\n )\n\n validatorValue = Object.fromEntries(\n Object.entries(value).map(([key, value]) => [caseInsensitiveKeymap[key] || key, value])\n )\n }\n\n const result =\n options && options.validationFunction\n ? await options.validationFunction(schema, validatorValue)\n : // @ts-expect-error z4.$ZodType has safeParseAsync\n await schema.safeParseAsync(validatorValue)\n\n if (hook) {\n const hookResult = await hook({ data: validatorValue, ...result, target }, c)\n if (hookResult) {\n if (hookResult instanceof Response) {\n return hookResult\n }\n\n if ('response' in hookResult) {\n return hookResult.response\n }\n }\n }\n\n if (!result.success) {\n return c.json(result, 400)\n }\n\n return result.data as zInfer<T>\n })\n}\n\nexport const zValidator: typeof zValidatorFunction = zValidatorFunction\n","// src/index.ts\nimport {\n OpenAPIRegistry,\n OpenApiGeneratorV3,\n OpenApiGeneratorV31,\n extendZodWithOpenApi\n} from \"@asteasolutions/zod-to-openapi\";\nimport { zValidator } from \"@hono/zod-validator\";\nimport { Hono } from \"hono\";\nimport { mergePath } from \"hono/utils/url\";\nimport { ZodType, z } from \"zod\";\nvar OpenAPIHono = class _OpenAPIHono extends Hono {\n openAPIRegistry;\n defaultHook;\n constructor(init) {\n super(init);\n this.openAPIRegistry = new OpenAPIRegistry();\n this.defaultHook = init?.defaultHook;\n }\n /**\n *\n * @param {RouteConfig} route - The route definition which you create with `createRoute()`.\n * @param {Handler} handler - The handler. If you want to return a JSON object, you should specify the status code with `c.json()`.\n * @param {Hook} hook - Optional. The hook method defines what it should do after validation.\n * @example\n * app.openapi(\n * route,\n * (c) => {\n * // ...\n * return c.json(\n * {\n * age: 20,\n * name: 'Young man',\n * },\n * 200 // You should specify the status code even if it's 200.\n * )\n * },\n * (result, c) => {\n * if (!result.success) {\n * return c.json(\n * {\n * code: 400,\n * message: 'Custom Message',\n * },\n * 400\n * )\n * }\n * }\n *)\n */\n openapi = ({ middleware: routeMiddleware, hide, ...route }, handler, hook = this.defaultHook) => {\n if (!hide) {\n this.openAPIRegistry.registerPath(route);\n }\n const validators = [];\n if (route.request?.query) {\n const validator = zValidator(\"query\", route.request.query, hook);\n validators.push(validator);\n }\n if (route.request?.params) {\n const validator = zValidator(\"param\", route.request.params, hook);\n validators.push(validator);\n }\n if (route.request?.headers) {\n const validator = zValidator(\"header\", route.request.headers, hook);\n validators.push(validator);\n }\n if (route.request?.cookies) {\n const validator = zValidator(\"cookie\", route.request.cookies, hook);\n validators.push(validator);\n }\n const bodyContent = route.request?.body?.content;\n if (bodyContent) {\n for (const mediaType of Object.keys(bodyContent)) {\n if (!bodyContent[mediaType]) {\n continue;\n }\n const schema = bodyContent[mediaType][\"schema\"];\n if (!(schema instanceof ZodType)) {\n continue;\n }\n if (isJSONContentType(mediaType)) {\n const validator = zValidator(\"json\", schema, hook);\n if (route.request?.body?.required) {\n validators.push(validator);\n } else {\n const mw = async (c, next) => {\n if (c.req.header(\"content-type\")) {\n if (isJSONContentType(c.req.header(\"content-type\"))) {\n return await validator(c, next);\n }\n }\n c.req.addValidatedData(\"json\", {});\n await next();\n };\n validators.push(mw);\n }\n }\n if (isFormContentType(mediaType)) {\n const validator = zValidator(\"form\", schema, hook);\n if (route.request?.body?.required) {\n validators.push(validator);\n } else {\n const mw = async (c, next) => {\n if (c.req.header(\"content-type\")) {\n if (isFormContentType(c.req.header(\"content-type\"))) {\n return await validator(c, next);\n }\n }\n c.req.addValidatedData(\"form\", {});\n await next();\n };\n validators.push(mw);\n }\n }\n }\n }\n const middleware = routeMiddleware ? Array.isArray(routeMiddleware) ? routeMiddleware : [routeMiddleware] : [];\n this.on(\n [route.method],\n route.path.replaceAll(/\\/{(.+?)}/g, \"/:$1\"),\n ...middleware,\n ...validators,\n handler\n );\n return this;\n };\n getOpenAPIDocument = (config) => {\n const generator = new OpenApiGeneratorV3(this.openAPIRegistry.definitions);\n const document = generator.generateDocument(config);\n return this._basePath ? addBasePathToDocument(document, this._basePath) : document;\n };\n getOpenAPI31Document = (config) => {\n const generator = new OpenApiGeneratorV31(this.openAPIRegistry.definitions);\n const document = generator.generateDocument(config);\n return this._basePath ? addBasePathToDocument(document, this._basePath) : document;\n };\n doc = (path, configure) => {\n return this.get(path, (c) => {\n const config = typeof configure === \"function\" ? configure(c) : configure;\n try {\n const document = this.getOpenAPIDocument(config);\n return c.json(document);\n } catch (e) {\n return c.json(e, 500);\n }\n });\n };\n doc31 = (path, configure) => {\n return this.get(path, (c) => {\n const config = typeof configure === \"function\" ? configure(c) : configure;\n try {\n const document = this.getOpenAPI31Document(config);\n return c.json(document);\n } catch (e) {\n return c.json(e, 500);\n }\n });\n };\n route(path, app) {\n const pathForOpenAPI = path.replaceAll(/:([^\\/]+)/g, \"{$1}\");\n super.route(path, app);\n if (!(app instanceof _OpenAPIHono)) {\n return this;\n }\n app.openAPIRegistry.definitions.forEach((def) => {\n switch (def.type) {\n case \"component\":\n return this.openAPIRegistry.registerComponent(def.componentType, def.name, def.component);\n case \"route\": {\n this.openAPIRegistry.registerPath({\n ...def.route,\n path: mergePath(\n pathForOpenAPI,\n // @ts-expect-error _basePath is private\n app._basePath.replaceAll(/:([^\\/]+)/g, \"{$1}\"),\n def.route.path\n )\n });\n return;\n }\n case \"webhook\": {\n this.openAPIRegistry.registerWebhook({\n ...def.webhook,\n path: mergePath(\n pathForOpenAPI,\n // @ts-expect-error _basePath is private\n app._basePath.replaceAll(/:([^\\/]+)/g, \"{$1}\"),\n def.webhook.path\n )\n });\n return;\n }\n case \"schema\":\n return this.openAPIRegistry.register(def.schema._def.openapi._internal.refId, def.schema);\n case \"parameter\":\n return this.openAPIRegistry.registerParameter(\n def.schema._def.openapi._internal.refId,\n def.schema\n );\n default: {\n const errorIfNotExhaustive = def;\n throw new Error(`Unknown registry type: ${errorIfNotExhaustive}`);\n }\n }\n });\n return this;\n }\n basePath(path) {\n return new _OpenAPIHono({ ...super.basePath(path), defaultHook: this.defaultHook });\n }\n};\nvar createRoute = (routeConfig) => {\n const route = {\n ...routeConfig,\n getRoutingPath() {\n return routeConfig.path.replaceAll(/\\/{(.+?)}/g, \"/:$1\");\n }\n };\n return Object.defineProperty(route, \"getRoutingPath\", { enumerable: false });\n};\nextendZodWithOpenApi(z);\nfunction addBasePathToDocument(document, basePath) {\n const updatedPaths = {};\n Object.keys(document.paths).forEach((path) => {\n updatedPaths[mergePath(basePath.replaceAll(/:([^\\/]+)/g, \"{$1}\"), path)] = document.paths[path];\n });\n return {\n ...document,\n paths: updatedPaths\n };\n}\nfunction isJSONContentType(contentType) {\n return /^application\\/([a-z-\\.]+\\+)?json/.test(contentType);\n}\nfunction isFormContentType(contentType) {\n return contentType.startsWith(\"multipart/form-data\") || contentType.startsWith(\"application/x-www-form-urlencoded\");\n}\nexport {\n OpenAPIHono,\n createRoute,\n extendZodWithOpenApi,\n z\n};\n","import type { ApiReferenceConfigurationWithSource, HtmlRenderingConfiguration } from '@scalar/types/api-reference'\n\n// Re-export the type for convenience\nexport type { HtmlRenderingConfiguration }\n\n/**\n * Helper function to add consistent indentation to multiline strings\n * @param str The string to indent\n * @param spaces Number of spaces for each level\n * @param initialIndent Whether to indent the first line\n */\nconst addIndent = (str: string, spaces: number = 2, initialIndent: boolean = false): string => {\n const indent = ' '.repeat(spaces)\n const lines = str.split('\\n')\n return lines\n .map((line, index) => {\n if (index === 0 && !initialIndent) {\n return line\n }\n return `${indent}${line}`\n })\n .join('\\n')\n}\n\n/**\n * Generate the style tag with custom theme if needed\n */\nconst getStyles = (configuration: Partial<HtmlRenderingConfiguration>, customTheme: string): string => {\n const styles: string[] = []\n\n if (configuration.customCss) {\n styles.push('/* Custom CSS */')\n styles.push(configuration.customCss)\n }\n\n if (!configuration.theme && customTheme) {\n styles.push('/* Custom Theme */')\n styles.push(customTheme)\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `\n <style type=\"text/css\">\n ${addIndent(styles.join('\\n\\n'), 6)}\n </style>`\n}\n\n/**\n * The HTML document to render the Scalar API reference.\n *\n * We must check the passed in configuration and not the configuration for the theme as the configuration will have it\n * defaulted to 'default'\n */\nexport const getHtmlDocument = (givenConfiguration: Partial<HtmlRenderingConfiguration>, customTheme = '') => {\n const { cdn, pageTitle, customCss, theme, ...rest } = givenConfiguration\n\n const configuration = getConfiguration({\n ...rest,\n ...(theme ? { theme } : {}),\n customCss,\n })\n\n const content = `<!doctype html>\n<html>\n <head>\n <title>${pageTitle ?? 'Scalar API Reference'}</title>\n <meta charset=\"utf-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1\" />${getStyles(configuration, customTheme)}\n </head>\n <body>\n <div id=\"app\"></div>${getScriptTags(configuration, cdn)}\n </body>\n</html>`\n\n return content\n}\n\n/**\n * Helper function to serialize arrays that may contain functions\n */\nconst serializeArrayWithFunctions = (arr: unknown[]): string => {\n return `[${arr.map((item) => (typeof item === 'function' ? item.toString() : JSON.stringify(item))).join(', ')}]`\n}\n\n/**\n * The script tags to load the @scalar/api-reference package from the CDN.\n */\nexport function getScriptTags(configuration: Partial<ApiReferenceConfigurationWithSource>, cdn?: string) {\n const restConfig = { ...configuration }\n\n const functionProps: string[] = []\n\n for (const [key, value] of Object.entries(configuration) as [keyof typeof configuration, unknown][]) {\n if (typeof value === 'function') {\n functionProps.push(`\"${key}\": ${value.toString()}`)\n delete restConfig[key]\n } else if (Array.isArray(value) && value.some((item) => typeof item === 'function')) {\n // Handle arrays that contain functions (like plugins)\n functionProps.push(`\"${key}\": ${serializeArrayWithFunctions(value)}`)\n delete restConfig[key]\n }\n }\n\n // Stringify the rest of the configuration\n const configString = JSON.stringify(restConfig, null, 2)\n .split('\\n')\n .map((line, index) => (index === 0 ? line : ' ' + line))\n .join('\\n')\n .replace(/\\s*}$/, '') // Remove the closing brace and any whitespace before it\n\n const functionPropsString = functionProps.length ? `,\\n ${functionProps.join(',\\n ')}\\n }` : '}'\n\n return `\n <!-- Load the Script -->\n <script src=\"${cdn ?? 'https://cdn.jsdelivr.net/npm/@scalar/api-reference'}\"></script>\n\n <!-- Initialize the Scalar API Reference -->\n <script type=\"text/javascript\">\n Scalar.createApiReference('#app', ${configString}${functionPropsString})\n </script>`\n}\n\n/**\n * The configuration to pass to the @scalar/api-reference package.\n */\nexport const getConfiguration = (\n givenConfiguration: Partial<ApiReferenceConfigurationWithSource>,\n): Partial<ApiReferenceConfigurationWithSource> => {\n // Clone the given configuration\n const configuration = {\n ...givenConfiguration,\n }\n\n // Execute content if it's a function\n if (typeof configuration.content === 'function') {\n configuration.content = configuration.content()\n }\n\n // Only remove content if url is provided\n if (configuration.content && configuration.url) {\n delete configuration.content\n }\n\n // Just return regular JSON string, no HTML escaping needed\n return configuration\n}\n","export {\n type HtmlRenderingConfiguration,\n getConfiguration,\n getHtmlDocument,\n getScriptTags,\n} from './html-rendering'\n","import { getHtmlDocument } from '@scalar/core/libs/html-rendering'\nimport type { Context, Env, MiddlewareHandler } from 'hono'\n\nimport type { ApiReferenceConfiguration } from './types'\n\n/**\n * The default configuration for the API Reference.\n */\nconst DEFAULT_CONFIGURATION: Partial<ApiReferenceConfiguration> = {\n _integration: 'hono',\n}\n\n/**\n * The custom theme for Hono\n */\nexport const customTheme = `\n.dark-mode {\n color-scheme: dark;\n --scalar-color-1: rgba(255, 255, 245, .86);\n --scalar-color-2: rgba(255, 255, 245, .6);\n --scalar-color-3: rgba(255, 255, 245, .38);\n --scalar-color-disabled: rgba(255, 255, 245, .25);\n --scalar-color-ghost: rgba(255, 255, 245, .25);\n --scalar-color-accent: #e36002;\n --scalar-background-1: #1e1e20;\n --scalar-background-2: #2a2a2a;\n --scalar-background-3: #505053;\n --scalar-background-4: rgba(255, 255, 255, 0.06);\n --scalar-background-accent: #e360021f;\n\n --scalar-border-color: rgba(255, 255, 255, 0.1);\n --scalar-scrollbar-color: rgba(255, 255, 255, 0.24);\n --scalar-scrollbar-color-active: rgba(255, 255, 255, 0.48);\n --scalar-lifted-brightness: 1.45;\n --scalar-backdrop-brightness: 0.5;\n\n --scalar-shadow-1: 0 1px 3px 0 rgb(0, 0, 0, 0.1);\n --scalar-shadow-2: rgba(15, 15, 15, 0.2) 0px 3px 6px,\n rgba(15, 15, 15, 0.4) 0px 9px 24px, 0 0 0 1px rgba(255, 255, 255, 0.1);\n\n --scalar-button-1: #f6f6f6;\n --scalar-button-1-color: #000;\n --scalar-button-1-hover: #e7e7e7;\n\n --scalar-color-green: #3dd68c;\n --scalar-color-red: #f66f81;\n --scalar-color-yellow: #f9b44e;\n --scalar-color-blue: #5c73e7;\n --scalar-color-orange: #ff8d4d;\n --scalar-color-purple: #b191f9;\n}\n/* Sidebar */\n.dark-mode .sidebar {\n --scalar-sidebar-background-1: #161618;\n --scalar-sidebar-item-hover-color: var(--scalar-color-accent);\n --scalar-sidebar-item-hover-background: transparent;\n --scalar-sidebar-item-active-background: transparent;\n --scalar-sidebar-border-color: transparent;\n --scalar-sidebar-color-1: var(--scalar-color-1);\n --scalar-sidebar-color-2: var(--scalar-color-2);\n --scalar-sidebar-color-active: var(--scalar-color-accent);\n --scalar-sidebar-search-background: #252529;\n --scalar-sidebar-search-border-color: transparent;\n --scalar-sidebar-search-color: var(--scalar-color-3);\n}\n`\n\ntype Configuration<E extends Env> =\n | Partial<ApiReferenceConfiguration>\n | ((c: Context<E>) => Partial<ApiReferenceConfiguration> | Promise<Partial<ApiReferenceConfiguration>>)\n\n/**\n * The Hono middleware for the Scalar API Reference.\n */\nexport const Scalar = <E extends Env>(configOrResolver: Configuration<E>): MiddlewareHandler<E> => {\n return async (c) => {\n let resolvedConfig: Partial<ApiReferenceConfiguration> = {}\n\n if (typeof configOrResolver === 'function') {\n resolvedConfig = await configOrResolver(c)\n } else {\n resolvedConfig = configOrResolver\n }\n\n // Merge the defaults\n const configuration = {\n ...DEFAULT_CONFIGURATION,\n ...resolvedConfig,\n }\n\n // Respond with the HTML document\n return c.html(getHtmlDocument(configuration, customTheme))\n }\n}\n\n/**\n * @deprecated Use `Scalar` instead.\n */\nexport const apiReference = Scalar\n","export { apiReference, Scalar } from './scalar'\nexport type { ApiReferenceConfiguration } from './types'\n","/**\n * OpenAPI Schemas for Harness API\n *\n * This file contains all Zod schemas with OpenAPI metadata for auto-generating\n * API documentation. These schemas serve as the single source of truth for\n * both validation and documentation.\n */\n\nimport { z } from 'zod';\nimport { extendZodWithOpenApi } from '@hono/zod-openapi';\n\n// Extend Zod with OpenAPI capabilities\nextendZodWithOpenApi(z);\n\n// =============================================================================\n// Common Schemas\n// =============================================================================\n\nexport const ErrorResponseSchema = z\n .object({\n error: z.string().openapi({ description: 'Error message', example: 'Resource not found' }),\n code: z.string().optional().openapi({ description: 'Error code', example: 'NOT_FOUND' }),\n })\n .openapi('ErrorResponse');\n\nexport const SuccessResponseSchema = z\n .object({\n success: z.literal(true).openapi({ description: 'Success indicator' }),\n })\n .openapi('SuccessResponse');\n\nexport const PaginationQuerySchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .default(50)\n .openapi({ description: 'Number of items per page', example: 50 }),\n offset: z.coerce\n .number()\n .min(0)\n .default(0)\n .openapi({ description: 'Number of items to skip', example: 0 }),\n});\n\nexport const OrderQuerySchema = z.object({\n orderBy: z\n .enum(['createdAt', 'updatedAt'])\n .default('updatedAt')\n .openapi({ description: 'Field to sort by' }),\n order: z\n .enum(['asc', 'desc'])\n .default('desc')\n .openapi({ description: 'Sort direction' }),\n});\n\n// =============================================================================\n// Message Content Schemas\n// =============================================================================\n\nexport const TextContentSchema = z\n .object({\n type: z.literal('text'),\n text: z.string().openapi({ description: 'Text content', example: 'Hello, how can I help you?' }),\n })\n .openapi('TextContent');\n\nexport const ToolUseContentSchema = z\n .object({\n type: z.literal('tool_use'),\n id: z.string().openapi({ description: 'Tool use ID', example: 'toolu_01abc123' }),\n name: z.string().openapi({ description: 'Tool name', example: 'Read' }),\n input: z.unknown().openapi({ description: 'Tool input parameters' }),\n })\n .openapi('ToolUseContent');\n\nexport const ToolResultContentSchema = z\n .object({\n type: z.literal('tool_result'),\n toolUseId: z.string().openapi({ description: 'ID of the tool use this result is for' }),\n content: z.unknown().openapi({ description: 'Tool execution result' }),\n isError: z.boolean().optional().openapi({ description: 'Whether the tool execution resulted in an error' }),\n })\n .openapi('ToolResultContent');\n\nexport const ImageContentSchema = z\n .object({\n type: z.literal('image'),\n source: z.object({\n type: z.enum(['base64', 'url']).openapi({ description: 'Image source type' }),\n mediaType: z.string().openapi({ description: 'MIME type', example: 'image/png' }),\n data: z.string().optional().openapi({ description: 'Base64-encoded image data' }),\n url: z.string().optional().openapi({ description: 'Image URL' }),\n }),\n })\n .openapi('ImageContent');\n\nexport const FileContentSchema = z\n .object({\n type: z.literal('file'),\n attachmentId: z.string().openapi({ description: 'Attachment ID' }),\n filename: z.string().openapi({ description: 'File name', example: 'document.pdf' }),\n mimeType: z.string().openapi({ description: 'MIME type', example: 'application/pdf' }),\n })\n .openapi('FileContent');\n\nexport const MessageContentSchema = z\n .discriminatedUnion('type', [\n TextContentSchema,\n ToolUseContentSchema,\n ToolResultContentSchema,\n ImageContentSchema,\n FileContentSchema,\n ])\n .openapi('MessageContent');\n\n// =============================================================================\n// Message Schema\n// =============================================================================\n\nexport const MessageSchema = z\n .object({\n id: z.string().openapi({ description: 'Message ID', example: 'msg_abc123' }),\n sessionId: z.string().openapi({ description: 'Session ID' }),\n role: z\n .enum(['user', 'assistant', 'tool', 'system'])\n .openapi({ description: 'Message role' }),\n content: z.array(MessageContentSchema).openapi({ description: 'Message content blocks' }),\n createdAt: z.string().openapi({ description: 'Creation timestamp', example: '2024-01-15T10:30:00Z' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n })\n .openapi('Message');\n\nexport const PaginatedMessagesSchema = z\n .object({\n items: z.array(MessageSchema).openapi({ description: 'List of messages' }),\n total: z.number().openapi({ description: 'Total number of messages', example: 42 }),\n hasMore: z.boolean().openapi({ description: 'Whether more items are available' }),\n })\n .openapi('PaginatedMessages');\n\n// =============================================================================\n// Session Schemas\n// =============================================================================\n\nexport const SessionStatusSchema = z\n .enum(['active', 'completed', 'error', 'suspended'])\n .openapi('SessionStatus');\n\nexport const SessionSchema = z\n .object({\n id: z.string().openapi({ description: 'Session ID', example: 'sess_abc123' }),\n agentName: z.string().openapi({ description: 'Name of the agent', example: 'coding-assistant' }),\n status: SessionStatusSchema,\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Last update timestamp' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n sdkSessionId: z.string().optional().openapi({ description: 'Claude Agent SDK session ID for resume' }),\n parentSessionId: z.string().optional().openapi({ description: 'Parent session ID if forked' }),\n totalTokens: z.number().optional().openapi({ description: 'Total tokens used', example: 1500 }),\n totalCost: z.number().optional().openapi({ description: 'Total cost in USD', example: 0.0045 }),\n })\n .openapi('Session');\n\nexport const PaginatedSessionsSchema = z\n .object({\n items: z.array(SessionSchema).openapi({ description: 'List of sessions' }),\n total: z.number().openapi({ description: 'Total number of sessions' }),\n hasMore: z.boolean().openapi({ description: 'Whether more items are available' }),\n nextCursor: z.string().optional().openapi({ description: 'Cursor for next page' }),\n })\n .openapi('PaginatedSessions');\n\nexport const CreateSessionRequestSchema = z\n .object({\n agentName: z.string().openapi({ description: 'Name of the agent to use', example: 'coding-assistant' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n })\n .openapi('CreateSessionRequest');\n\nexport const SendMessageRequestSchema = z\n .object({\n prompt: z.string().openapi({ description: 'Message to send to the agent', example: 'Help me write a function to sort an array' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata for this message' }),\n })\n .openapi('SendMessageRequest');\n\nexport const ResumeSessionRequestSchema = z\n .object({\n forkSession: z.boolean().default(false).openapi({ description: 'Whether to fork the session instead of resuming' }),\n })\n .openapi('ResumeSessionRequest');\n\nexport const ListSessionsQuerySchema = PaginationQuerySchema.merge(OrderQuerySchema).extend({\n agentName: z.string().optional().openapi({ description: 'Filter by agent name' }),\n status: SessionStatusSchema.optional().openapi({ description: 'Filter by status' }),\n});\n\n// =============================================================================\n// Agent Schemas\n// =============================================================================\n\nexport const AgentStatusSchema = z\n .enum(['active', 'paused', 'deleted'])\n .openapi('AgentStatus');\n\nexport const PermissionModeSchema = z\n .enum(['default', 'acceptEdits', 'bypassPermissions', 'plan'])\n .openapi('PermissionMode');\n\nexport const McpServerConfigSchema = z\n .object({\n command: z.string().openapi({ description: 'Command to run', example: 'npx' }),\n args: z.array(z.string()).optional().openapi({ description: 'Command arguments', example: ['-y', '@modelcontextprotocol/server-filesystem'] }),\n })\n .openapi('McpServerConfig');\n\nexport const StoredAgentSchema = z\n .object({\n id: z.string().openapi({ description: 'Agent ID', example: 'agent_abc123' }),\n name: z.string().openapi({ description: 'Agent name', example: 'coding-assistant' }),\n slug: z.string().openapi({ description: 'URL-friendly identifier', example: 'coding-assistant' }),\n description: z.string().optional().openapi({ description: 'Agent description', example: 'A helpful coding assistant' }),\n model: z.string().optional().openapi({ description: 'Claude model to use', example: 'claude-sonnet-4-20250514' }),\n systemPrompt: z.string().optional().openapi({ description: 'System prompt for the agent' }),\n status: AgentStatusSchema,\n allowedTools: z.array(z.string()).optional().openapi({ description: 'List of allowed tools', example: ['Read', 'Write', 'Bash'] }),\n disallowedTools: z.array(z.string()).optional().openapi({ description: 'List of disallowed tools' }),\n maxTurns: z.number().optional().openapi({ description: 'Maximum conversation turns', example: 25 }),\n permissionMode: PermissionModeSchema.optional(),\n mcpServers: z.record(McpServerConfigSchema).optional().openapi({ description: 'MCP server configurations' }),\n envVars: z.record(z.string()).optional().openapi({ description: 'Environment variables' }),\n startupScript: z.string().optional().openapi({ description: 'Bash script to run on startup' }),\n configFileUrl: z.string().optional().openapi({ description: 'URL to .claude config ZIP file' }),\n config: z.record(z.unknown()).optional().openapi({ description: 'Additional configuration' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n createdAt: z.string().openapi({ description: 'Creation timestamp' }),\n updatedAt: z.string().openapi({ description: 'Last update timestamp' }),\n })\n .openapi('StoredAgent');\n\nexport const SimpleAgentSchema = z\n .object({\n name: z.string().openapi({ description: 'Agent name' }),\n })\n .openapi('SimpleAgent');\n\nexport const PaginatedAgentsSchema = z\n .object({\n items: z.array(StoredAgentSchema).openapi({ description: 'List of agents' }),\n total: z.number().openapi({ description: 'Total number of agents' }),\n hasMore: z.boolean().openapi({ description: 'Whether more items are available' }),\n })\n .openapi('PaginatedAgents');\n\nexport const CreateAgentRequestSchema = z\n .object({\n name: z.string().min(1).max(100).openapi({ description: 'Agent name', example: 'my-agent' }),\n slug: z.string().min(1).max(100).optional().openapi({ description: 'URL-friendly identifier' }),\n description: z.string().max(500).optional().openapi({ description: 'Agent description' }),\n model: z.string().optional().openapi({ description: 'Claude model to use' }),\n systemPrompt: z.string().optional().openapi({ description: 'System prompt' }),\n allowedTools: z.array(z.string()).optional().openapi({ description: 'Allowed tools' }),\n disallowedTools: z.array(z.string()).optional().openapi({ description: 'Disallowed tools' }),\n maxTurns: z.number().int().positive().optional().openapi({ description: 'Max turns' }),\n permissionMode: PermissionModeSchema.optional(),\n mcpServers: z.record(McpServerConfigSchema).optional().openapi({ description: 'MCP servers' }),\n envVars: z.record(z.string()).optional().openapi({ description: 'Environment variables' }),\n startupScript: z.string().optional().openapi({ description: 'Startup script' }),\n config: z.record(z.unknown()).optional().openapi({ description: 'Additional config' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n })\n .openapi('CreateAgentRequest');\n\nexport const UpdateAgentRequestSchema = z\n .object({\n name: z.string().min(1).max(100).optional().openapi({ description: 'Agent name' }),\n description: z.string().max(500).optional().openapi({ description: 'Agent description' }),\n model: z.string().optional().openapi({ description: 'Claude model' }),\n systemPrompt: z.string().optional().openapi({ description: 'System prompt' }),\n allowedTools: z.array(z.string()).optional().openapi({ description: 'Allowed tools' }),\n disallowedTools: z.array(z.string()).optional().openapi({ description: 'Disallowed tools' }),\n maxTurns: z.number().int().positive().optional().openapi({ description: 'Max turns' }),\n permissionMode: PermissionModeSchema.optional(),\n mcpServers: z.record(McpServerConfigSchema).optional().openapi({ description: 'MCP servers' }),\n envVars: z.record(z.string()).optional().openapi({ description: 'Environment variables' }),\n startupScript: z.string().optional().openapi({ description: 'Startup script' }),\n config: z.record(z.unknown()).optional().openapi({ description: 'Additional config' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n status: z.enum(['active', 'paused']).optional().openapi({ description: 'Agent status' }),\n })\n .openapi('UpdateAgentRequest');\n\nexport const RunAgentRequestSchema = z\n .object({\n prompt: z.string().openapi({ description: 'Message to send', example: 'Help me write a function' }),\n metadata: z.record(z.unknown()).optional().openapi({ description: 'Custom metadata' }),\n envVars: z.record(z.string()).optional().openapi({ description: 'Session environment variables' }),\n startupScript: z.string().optional().openapi({ description: 'Session startup script' }),\n })\n .openapi('RunAgentRequest');\n\nexport const ListAgentsQuerySchema = PaginationQuerySchema.extend({\n status: AgentStatusSchema.optional().openapi({ description: 'Filter by status' }),\n});\n\n// =============================================================================\n// Skills Schemas\n// =============================================================================\n\nexport const GitHubSkillSourceSchema = z\n .object({\n type: z.literal('github'),\n repo: z.string().openapi({ description: 'GitHub repo (owner/repo)', example: 'anthropics/claude-code' }),\n branch: z.string().optional().openapi({ description: 'Branch name', example: 'main' }),\n path: z.string().optional().openapi({ description: 'Root path in repo', example: 'skills' }),\n })\n .openapi('GitHubSkillSource');\n\nexport const LocalSkillSourceSchema = z\n .object({\n type: z.literal('local'),\n localPath: z.string().openapi({ description: 'Absolute local path', example: '/home/user/skills' }),\n })\n .openapi('LocalSkillSource');\n\nexport const SkillSourceSchema = z\n .discriminatedUnion('type', [GitHubSkillSourceSchema, LocalSkillSourceSchema])\n .openapi('SkillSource');\n\nexport const BrowseSkillsRequestSchema = z\n .object({\n source: SkillSourceSchema,\n path: z.string().default('').openapi({ description: 'Path to browse', example: 'tools' }),\n token: z.string().optional().openapi({ description: 'GitHub token for private repos' }),\n })\n .openapi('BrowseSkillsRequest');\n\nexport const ReadSkillFileRequestSchema = z\n .object({\n source: SkillSourceSchema,\n path: z.string().openapi({ description: 'File path to read', example: 'SKILL.md' }),\n token: z.string().optional().openapi({ description: 'GitHub token for private repos' }),\n })\n .openapi('ReadSkillFileRequest');\n\nexport const FileEntrySchema = z\n .object({\n name: z.string().openapi({ description: 'File or directory name' }),\n path: z.string().openapi({ description: 'Full path' }),\n type: z.enum(['file', 'directory']).openapi({ description: 'Entry type' }),\n size: z.number().optional().openapi({ description: 'File size in bytes' }),\n modifiedAt: z.string().optional().openapi({ description: 'Last modified timestamp' }),\n })\n .openapi('FileEntry');\n\nexport const BrowseSkillsResponseSchema = z\n .object({\n files: z.array(FileEntrySchema).openapi({ description: 'List of files and directories' }),\n })\n .openapi('BrowseSkillsResponse');\n\nexport const SkillFileContentSchema = z\n .object({\n path: z.string().openapi({ description: 'File path' }),\n content: z.string().openapi({ description: 'File content' }),\n encoding: z.string().openapi({ description: 'Content encoding', example: 'utf-8' }),\n size: z.number().openapi({ description: 'File size in bytes' }),\n })\n .openapi('SkillFileContent');\n\nexport const ReadSkillFileResponseSchema = z\n .object({\n file: SkillFileContentSchema,\n })\n .openapi('ReadSkillFileResponse');\n\n// =============================================================================\n// Streaming Event Schemas (for documentation)\n// =============================================================================\n\nexport const SessionStartEventSchema = z\n .object({\n type: z.literal('session_start'),\n sessionId: z.string().openapi({ description: 'Session ID' }),\n claudeSessionId: z.string().openapi({ description: 'Claude SDK session ID' }),\n })\n .openapi('SessionStartEvent');\n\nexport const TextDeltaEventSchema = z\n .object({\n type: z.literal('text_delta'),\n delta: z.string().openapi({ description: 'Text chunk', example: 'Hello' }),\n })\n .openapi('TextDeltaEvent');\n\nexport const ThinkingDeltaEventSchema = z\n .object({\n type: z.literal('thinking_delta'),\n delta: z.string().openapi({ description: 'Thinking text chunk' }),\n })\n .openapi('ThinkingDeltaEvent');\n\nexport const MessageEventSchema = z\n .object({\n type: z.literal('message'),\n message: MessageSchema,\n })\n .openapi('MessageEvent');\n\nexport const ToolUseEventSchema = z\n .object({\n type: z.literal('tool_use'),\n id: z.string().openapi({ description: 'Tool use ID' }),\n name: z.string().openapi({ description: 'Tool name' }),\n input: z.unknown().openapi({ description: 'Tool input' }),\n })\n .openapi('ToolUseEvent');\n\nexport const ToolResultEventSchema = z\n .object({\n type: z.literal('tool_result'),\n toolUseId: z.string().openapi({ description: 'Tool use ID' }),\n content: z.unknown().openapi({ description: 'Result content' }),\n isError: z.boolean().optional().openapi({ description: 'Whether result is an error' }),\n })\n .openapi('ToolResultEvent');\n\nexport const SessionEndEventSchema = z\n .object({\n type: z.literal('session_end'),\n sessionId: z.string().openapi({ description: 'Session ID' }),\n status: z.string().openapi({ description: 'Final session status' }),\n totalTokens: z.number().optional().openapi({ description: 'Total tokens used' }),\n totalCost: z.number().optional().openapi({ description: 'Total cost in USD' }),\n })\n .openapi('SessionEndEvent');\n\nexport const TurnCompleteEventSchema = z\n .object({\n type: z.literal('turn_complete'),\n sessionId: z.string().openapi({ description: 'Session ID' }),\n })\n .openapi('TurnCompleteEvent', {\n description:\n 'Emitted when Claude finishes generating its response, before cleanup operations. Clients can use this to show ready state earlier.',\n });\n\nexport const StreamErrorEventSchema = z\n .object({\n type: z.literal('error'),\n error: z.string().openapi({ description: 'Error message' }),\n code: z.string().optional().openapi({ description: 'Error code' }),\n })\n .openapi('StreamErrorEvent');\n\n// =============================================================================\n// Health Check Schema\n// =============================================================================\n\nexport const HealthResponseSchema = z\n .object({\n status: z.literal('ok').openapi({ description: 'Health status' }),\n timestamp: z.string().openapi({ description: 'Current timestamp', example: '2024-01-15T10:30:00Z' }),\n })\n .openapi('HealthResponse');\n","/**\n * OpenAPI Sessions Routes\n *\n * Session management endpoints with auto-generated documentation.\n */\n\nimport { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport { streamSSE } from 'hono/streaming';\nimport type { AgentHarness, SessionManager } from '../../../index.js';\nimport {\n ErrorResponseSchema,\n SuccessResponseSchema,\n SessionSchema,\n PaginatedSessionsSchema,\n PaginatedMessagesSchema,\n CreateSessionRequestSchema,\n SendMessageRequestSchema,\n ResumeSessionRequestSchema,\n ListSessionsQuerySchema,\n PaginationQuerySchema,\n} from '../schemas.js';\n\n// =============================================================================\n// Route Definitions\n// =============================================================================\n\nconst listSessionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Sessions'],\n summary: 'List sessions',\n description: 'List sessions with optional filtering by thread, agent, or status.',\n request: {\n query: ListSessionsQuerySchema,\n },\n responses: {\n 200: {\n description: 'List of sessions',\n content: {\n 'application/json': {\n schema: PaginatedSessionsSchema,\n },\n },\n },\n },\n});\n\nconst createSessionRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Sessions'],\n summary: 'Create session',\n description: 'Create a new session for an agent. The session can optionally be associated with a thread.',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: CreateSessionRequestSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n description: 'Session created successfully',\n content: {\n 'application/json': {\n schema: SessionSchema,\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst getSessionRoute = createRoute({\n method: 'get',\n path: '/{sessionId}',\n tags: ['Sessions'],\n summary: 'Get session',\n description: 'Get a specific session by ID.',\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID', example: 'sess_abc123' }),\n }),\n },\n responses: {\n 200: {\n description: 'Session details',\n content: {\n 'application/json': {\n schema: SessionSchema,\n },\n },\n },\n 404: {\n description: 'Session not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst deleteSessionRoute = createRoute({\n method: 'delete',\n path: '/{sessionId}',\n tags: ['Sessions'],\n summary: 'Delete session',\n description: 'Delete a session and all its messages.',\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID' }),\n }),\n },\n responses: {\n 200: {\n description: 'Session deleted successfully',\n content: {\n 'application/json': {\n schema: SuccessResponseSchema,\n },\n },\n },\n },\n});\n\nconst getSessionMessagesRoute = createRoute({\n method: 'get',\n path: '/{sessionId}/messages',\n tags: ['Sessions'],\n summary: 'Get session messages',\n description: 'Get all messages in a session with pagination.',\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID' }),\n }),\n query: PaginationQuerySchema.extend({\n limit: z.coerce.number().min(1).max(100).default(100),\n }),\n },\n responses: {\n 200: {\n description: 'List of messages',\n content: {\n 'application/json': {\n schema: PaginatedMessagesSchema,\n },\n },\n },\n 404: {\n description: 'Session not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst sendMessageRoute = createRoute({\n method: 'post',\n path: '/{sessionId}/send',\n tags: ['Sessions'],\n summary: 'Send message (SSE)',\n description: `Send a message to a session and stream the response via Server-Sent Events.\n\n## Event Types\n\nThe stream emits the following event types:\n\n- \\`session_start\\` - Session started, includes sessionId and sdkSessionId\n- \\`text_delta\\` - Text chunk being generated\n- \\`thinking_delta\\` - Thinking/reasoning text chunk\n- \\`message\\` - Complete message saved to storage\n- \\`tool_use\\` - Agent is calling a tool\n- \\`tool_result\\` - Result from tool execution\n- \\`session_end\\` - Session completed with stats\n- \\`error\\` - Error occurred\n\n## Example\n\n\\`\\`\\`javascript\nconst eventSource = new EventSource('/api/sessions/sess_123/send');\neventSource.onmessage = (event) => {\n const data = JSON.parse(event.data);\n console.log(data.type, data);\n};\n\\`\\`\\``,\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID' }),\n }),\n body: {\n content: {\n 'application/json': {\n schema: SendMessageRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Server-Sent Events stream',\n content: {\n 'text/event-stream': {\n schema: z.string().openapi({ description: 'SSE stream of events' }),\n },\n },\n },\n 404: {\n description: 'Session or agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst resumeSessionRoute = createRoute({\n method: 'post',\n path: '/{sessionId}/resume',\n tags: ['Sessions'],\n summary: 'Resume session',\n description: 'Resume a suspended session. Optionally fork it to create a new independent session.',\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID' }),\n }),\n body: {\n content: {\n 'application/json': {\n schema: ResumeSessionRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Session resumed',\n content: {\n 'application/json': {\n schema: SessionSchema,\n },\n },\n },\n 404: {\n description: 'Session or agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst forkSessionRoute = createRoute({\n method: 'post',\n path: '/{sessionId}/fork',\n tags: ['Sessions'],\n summary: 'Fork session',\n description: 'Create a new session by forking an existing one. The new session will have the same conversation history but can diverge from that point.',\n request: {\n params: z.object({\n sessionId: z.string().openapi({ description: 'Session ID to fork' }),\n }),\n },\n responses: {\n 201: {\n description: 'New forked session',\n content: {\n 'application/json': {\n schema: SessionSchema,\n },\n },\n },\n 404: {\n description: 'Session or agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\n// =============================================================================\n// Router Factory\n// =============================================================================\n\nexport interface SessionHooks {\n onSessionStart?: (sessionId: string, agentName: string) => void | Promise<void>;\n onSessionEnd?: (sessionId: string) => void | Promise<void>;\n onMessage?: (sessionId: string, agentName: string) => void | Promise<void>;\n}\n\nexport interface SessionsRouterOptions {\n sessionManager: SessionManager;\n agents: Map<string, AgentHarness>;\n hooks?: SessionHooks;\n}\n\nexport function createSessionsRouter(options: SessionsRouterOptions) {\n const { sessionManager, agents, hooks = {} } = options;\n const router = new OpenAPIHono();\n\n // List sessions\n router.openapi(listSessionsRoute, async (c) => {\n const query = c.req.valid('query');\n const result = await sessionManager.listSessions(query);\n return c.json(result as any, 200);\n });\n\n // Create session\n router.openapi(createSessionRoute, async (c) => {\n const data = c.req.valid('json');\n\n const agent = agents.get(data.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${data.agentName}` }, 404);\n }\n\n const session = await agent.createSession({\n metadata: data.metadata,\n });\n\n if (hooks.onSessionStart) {\n try {\n await hooks.onSessionStart(session.session.id, data.agentName);\n } catch (error) {\n console.error('onSessionStart hook error:', error);\n }\n }\n\n return c.json(session.session as any, 201);\n });\n\n // Get session\n router.openapi(getSessionRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n return c.json(session as any, 200);\n });\n\n // Delete session\n router.openapi(deleteSessionRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n\n if (hooks.onSessionEnd) {\n try {\n await hooks.onSessionEnd(sessionId);\n } catch (error) {\n console.error('onSessionEnd hook error:', error);\n }\n }\n\n await sessionManager.deleteSession(sessionId);\n return c.json({ success: true as const }, 200);\n });\n\n // Get session messages\n router.openapi(getSessionMessagesRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n const query = c.req.valid('query');\n\n const result = await sessionManager.getSessionMessages(sessionId, query);\n return c.json(result as any, 200);\n });\n\n // Send message (SSE streaming) - using raw handler for streaming\n router.openapi(sendMessageRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n const data = c.req.valid('json');\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${session.agentName}` }, 404);\n }\n\n const activeSession = await agent.resumeSession(sessionId);\n\n return streamSSE(c, async (stream) => {\n try {\n for await (const event of activeSession.send(data.prompt, {\n metadata: data.metadata,\n })) {\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n });\n }\n\n if (hooks.onMessage) {\n try {\n await hooks.onMessage(sessionId, session.agentName);\n } catch (error) {\n console.error('onMessage hook error:', error);\n }\n }\n } catch (error) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({\n type: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n });\n }\n }) as any;\n });\n\n // Resume session\n router.openapi(resumeSessionRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n const body = c.req.valid('json');\n const forkSession = body.forkSession ?? false;\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${session.agentName}` }, 404);\n }\n\n const activeSession = await agent.resumeSession(sessionId, { forkSession });\n return c.json(activeSession.session as any, 200);\n });\n\n // Fork session\n router.openapi(forkSessionRoute, async (c) => {\n const { sessionId } = c.req.valid('param');\n\n const session = await sessionManager.getSession(sessionId);\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n const agent = agents.get(session.agentName);\n if (!agent) {\n return c.json({ error: `Agent not found: ${session.agentName}` }, 404);\n }\n\n const forkedSession = await agent.forkSession(sessionId);\n return c.json(forkedSession.session as any, 201);\n });\n\n return router;\n}\n","/**\n * OpenAPI Agents Routes\n *\n * Agent management endpoints with auto-generated documentation.\n */\n\nimport { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport { streamSSE } from 'hono/streaming';\nimport type { AgentHarness, AgentStorage } from '../../../index.js';\nimport {\n ErrorResponseSchema,\n SuccessResponseSchema,\n StoredAgentSchema,\n SimpleAgentSchema,\n PaginatedAgentsSchema,\n PaginatedSessionsSchema,\n CreateAgentRequestSchema,\n UpdateAgentRequestSchema,\n RunAgentRequestSchema,\n ListAgentsQuerySchema,\n SessionStatusSchema,\n PaginationQuerySchema,\n} from '../schemas.js';\n\n// =============================================================================\n// Route Definitions\n// =============================================================================\n\nconst listAgentsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Agents'],\n summary: 'List agents',\n description: 'List available agents. If agent storage is configured, returns full agent details with pagination. Otherwise, returns only agent names from in-memory registry.',\n request: {\n query: ListAgentsQuerySchema,\n },\n responses: {\n 200: {\n description: 'List of agents',\n content: {\n 'application/json': {\n schema: PaginatedAgentsSchema,\n },\n },\n },\n },\n});\n\nconst createAgentRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Agents'],\n summary: 'Create agent',\n description: 'Create a new agent configuration. Requires agent storage to be configured.',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: CreateAgentRequestSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n description: 'Agent created successfully',\n content: {\n 'application/json': {\n schema: StoredAgentSchema,\n },\n },\n },\n 400: {\n description: 'Invalid input',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n 409: {\n description: 'Agent already exists',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n 501: {\n description: 'Agent storage not configured',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst getAgentRoute = createRoute({\n method: 'get',\n path: '/{agentId}',\n tags: ['Agents'],\n summary: 'Get agent',\n description: 'Get an agent by ID, slug, or name.',\n request: {\n params: z.object({\n agentId: z.string().openapi({ description: 'Agent ID, slug, or name', example: 'coding-assistant' }),\n }),\n },\n responses: {\n 200: {\n description: 'Agent details',\n content: {\n 'application/json': {\n schema: z.union([StoredAgentSchema, SimpleAgentSchema]),\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst updateAgentRoute = createRoute({\n method: 'patch',\n path: '/{agentId}',\n tags: ['Agents'],\n summary: 'Update agent',\n description: 'Update an agent configuration. Requires agent storage to be configured.',\n request: {\n params: z.object({\n agentId: z.string().openapi({ description: 'Agent ID or slug' }),\n }),\n body: {\n content: {\n 'application/json': {\n schema: UpdateAgentRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Agent updated successfully',\n content: {\n 'application/json': {\n schema: StoredAgentSchema,\n },\n },\n },\n 400: {\n description: 'Invalid input',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n 501: {\n description: 'Agent storage not configured',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst deleteAgentRoute = createRoute({\n method: 'delete',\n path: '/{agentId}',\n tags: ['Agents'],\n summary: 'Delete agent',\n description: 'Delete an agent. Requires agent storage to be configured.',\n request: {\n params: z.object({\n agentId: z.string().openapi({ description: 'Agent ID or slug' }),\n }),\n },\n responses: {\n 200: {\n description: 'Agent deleted successfully',\n content: {\n 'application/json': {\n schema: SuccessResponseSchema,\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n 501: {\n description: 'Agent storage not configured',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst runAgentRoute = createRoute({\n method: 'post',\n path: '/{agentName}/run',\n tags: ['Agents'],\n summary: 'Run agent (SSE)',\n description: `Create a session and immediately run the agent with the provided prompt. Streams the response via Server-Sent Events.\n\nThis is a convenience endpoint that combines session creation and message sending into a single call.\n\n## Event Types\n\nThe stream emits the following event types:\n\n- \\`session_start\\` - Session started\n- \\`text_delta\\` - Text chunk being generated\n- \\`thinking_delta\\` - Thinking/reasoning text chunk\n- \\`message\\` - Complete message saved\n- \\`tool_use\\` - Agent is calling a tool\n- \\`tool_result\\` - Tool execution result\n- \\`session_end\\` - Session completed with stats\n- \\`error\\` - Error occurred`,\n request: {\n params: z.object({\n agentName: z.string().openapi({ description: 'Agent name', example: 'coding-assistant' }),\n }),\n body: {\n content: {\n 'application/json': {\n schema: RunAgentRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Server-Sent Events stream',\n content: {\n 'text/event-stream': {\n schema: z.string().openapi({ description: 'SSE stream of events' }),\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst getAgentSessionsRoute = createRoute({\n method: 'get',\n path: '/{agentName}/sessions',\n tags: ['Agents'],\n summary: 'Get agent sessions',\n description: 'Get all sessions for a specific agent with optional status filtering.',\n request: {\n params: z.object({\n agentName: z.string().openapi({ description: 'Agent name' }),\n }),\n query: PaginationQuerySchema.extend({\n status: SessionStatusSchema.optional(),\n }),\n },\n responses: {\n 200: {\n description: 'List of agent sessions',\n content: {\n 'application/json': {\n schema: PaginatedSessionsSchema,\n },\n },\n },\n 404: {\n description: 'Agent not found',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\n// =============================================================================\n// Router Factory\n// =============================================================================\n\nexport interface AgentsRouterOptions {\n agents: Map<string, AgentHarness>;\n agentStorage?: AgentStorage;\n onAgentChange?: () => Promise<void>;\n}\n\nexport function createAgentsRouter(options: AgentsRouterOptions) {\n const { agents, agentStorage, onAgentChange } = options;\n const router = new OpenAPIHono();\n\n // List agents\n router.openapi(listAgentsRoute, async (c) => {\n if (agentStorage) {\n const query = c.req.valid('query');\n const result = await agentStorage.listAgents(query);\n return c.json(result as any, 200);\n }\n\n // Fallback to in-memory agents\n const agentList = Array.from(agents.keys()).map((name) => ({ name }));\n return c.json({ items: agentList, total: agentList.length, hasMore: false }, 200);\n });\n\n // Create agent\n router.openapi(createAgentRoute, async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const data = c.req.valid('json');\n\n try {\n const agent = await agentStorage.createAgent(data);\n if (onAgentChange) {\n await onAgentChange();\n }\n return c.json(agent as any, 201);\n } catch (err) {\n if (err instanceof Error && err.message.includes('already exists')) {\n return c.json({ error: err.message, code: 'CONFLICT' }, 409);\n }\n throw err;\n }\n });\n\n // Get agent\n router.openapi(getAgentRoute, async (c) => {\n const { agentId } = c.req.valid('param');\n\n if (agentStorage) {\n // Try UUID first\n const agent = await agentStorage.getAgent(agentId);\n if (agent) {\n return c.json(agent as any, 200);\n }\n // Try slug\n const agentBySlug = await agentStorage.getAgentBySlug(agentId);\n if (agentBySlug) {\n return c.json(agentBySlug as any, 200);\n }\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n // Fallback to in-memory lookup by name\n const agent = agents.get(agentId);\n if (!agent) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n return c.json({ name: agentId }, 200);\n });\n\n // Update agent\n router.openapi(updateAgentRoute, async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const { agentId } = c.req.valid('param');\n const data = c.req.valid('json');\n\n const agent = await agentStorage.updateAgent(agentId, data);\n if (!agent) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n if (onAgentChange) {\n await onAgentChange();\n }\n\n return c.json(agent as any, 200);\n });\n\n // Delete agent\n router.openapi(deleteAgentRoute, async (c) => {\n if (!agentStorage) {\n return c.json({ error: 'Agent storage not configured' }, 501);\n }\n\n const { agentId } = c.req.valid('param');\n const deleted = await agentStorage.deleteAgent(agentId);\n if (!deleted) {\n return c.json({ error: 'Agent not found', code: 'NOT_FOUND' }, 404);\n }\n\n if (onAgentChange) {\n await onAgentChange();\n }\n\n return c.json({ success: true as const }, 200);\n });\n\n // Run agent (SSE streaming)\n router.openapi(runAgentRoute, async (c) => {\n const { agentName } = c.req.valid('param');\n const data = c.req.valid('json');\n\n const agent = agents.get(agentName);\n if (!agent) {\n return c.json({ error: 'Agent not found' }, 404);\n }\n\n // Create session with optional environment overrides\n const session = await agent.createSession({\n metadata: data.metadata,\n envVars: data.envVars,\n startupScript: data.startupScript,\n });\n\n // Stream response\n return streamSSE(c, async (stream) => {\n try {\n for await (const event of session.send(data.prompt)) {\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n });\n }\n } catch (error) {\n await stream.writeSSE({\n event: 'error',\n data: JSON.stringify({\n type: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n });\n }\n }) as any;\n });\n\n // Get agent sessions\n router.openapi(getAgentSessionsRoute, async (c) => {\n const { agentName } = c.req.valid('param');\n const agent = agents.get(agentName);\n if (!agent) {\n return c.json({ error: 'Agent not found' }, 404);\n }\n\n const query = c.req.valid('query');\n const result = await agent.listSessions(query);\n return c.json(result as any, 200);\n });\n\n return router;\n}\n","/**\n * OpenAPI Skills Routes\n *\n * Skills browsing endpoints with auto-generated documentation.\n */\n\nimport { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport type { SkillManager } from '../../../index.js';\nimport {\n ErrorResponseSchema,\n BrowseSkillsRequestSchema,\n BrowseSkillsResponseSchema,\n ReadSkillFileRequestSchema,\n ReadSkillFileResponseSchema,\n} from '../schemas.js';\n\n// =============================================================================\n// Route Definitions\n// =============================================================================\n\nconst browseSkillsRoute = createRoute({\n method: 'post',\n path: '/browse',\n tags: ['Skills'],\n summary: 'Browse skill source',\n description: `Browse files at a path in a skill source (GitHub repo or local directory).\n\nUse this endpoint to explore the file structure of a skill repository and select which files to include in an agent's skill configuration.\n\n## GitHub Sources\n\nFor GitHub repos, you can optionally provide a personal access token to access private repositories.\n\n## Local Sources\n\nLocal sources must use absolute paths and require the server to have filesystem access.`,\n request: {\n body: {\n content: {\n 'application/json': {\n schema: BrowseSkillsRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'List of files and directories',\n content: {\n 'application/json': {\n schema: BrowseSkillsResponseSchema,\n },\n },\n },\n 400: {\n description: 'Invalid request or browsing error',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\nconst readSkillFileRoute = createRoute({\n method: 'post',\n path: '/read',\n tags: ['Skills'],\n summary: 'Read skill file',\n description: `Read the content of a file from a skill source.\n\nUse this to preview skill definitions (SKILL.md files) or other files in a skill repository before including them in an agent configuration.`,\n request: {\n body: {\n content: {\n 'application/json': {\n schema: ReadSkillFileRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'File content',\n content: {\n 'application/json': {\n schema: ReadSkillFileResponseSchema,\n },\n },\n },\n 400: {\n description: 'Invalid request or file reading error',\n content: {\n 'application/json': {\n schema: ErrorResponseSchema,\n },\n },\n },\n },\n});\n\n// =============================================================================\n// Router Factory\n// =============================================================================\n\nexport interface SkillsRouterOptions {\n skillManager: SkillManager;\n /**\n * Optional GitHub token for accessing private repos.\n * Can also be passed per-request in the request body.\n */\n githubToken?: string;\n}\n\nexport function createSkillsRouter(options: SkillsRouterOptions) {\n const { skillManager, githubToken } = options;\n const router = new OpenAPIHono();\n\n // Browse files\n router.openapi(browseSkillsRoute, async (c) => {\n const data = c.req.valid('json');\n\n try {\n // Use request token, or fall back to configured token\n const token = data.token ?? githubToken;\n const files = await skillManager.browseSource(data.source, data.path, token);\n return c.json({ files } as any, 200);\n } catch (error) {\n if (error instanceof z.ZodError) {\n return c.json({ error: 'Validation error', details: error.errors }, 400);\n }\n if (error instanceof Error) {\n return c.json({ error: error.message }, 400);\n }\n throw error;\n }\n });\n\n // Read file\n router.openapi(readSkillFileRoute, async (c) => {\n const data = c.req.valid('json');\n\n try {\n // Use request token, or fall back to configured token\n const token = data.token ?? githubToken;\n const content = await skillManager.readSourceFile(data.source, data.path, token);\n return c.json({ file: content } as any, 200);\n } catch (error) {\n if (error instanceof z.ZodError) {\n return c.json({ error: 'Validation error', details: error.errors }, 400);\n }\n if (error instanceof Error) {\n return c.json({ error: error.message }, 400);\n }\n throw error;\n }\n });\n\n return router;\n}\n","/**\n * OpenAPI Harness Server\n *\n * Creates an OpenAPI-documented Hono server with Scalar UI for interactive documentation.\n */\n\nimport { OpenAPIHono } from '@hono/zod-openapi';\nimport { apiReference } from '@scalar/hono-api-reference';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { prettyJSON } from 'hono/pretty-json';\nimport { secureHeaders } from 'hono/secure-headers';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\nimport {\n SessionManager,\n SkillManager,\n type AgentHarness,\n type SessionStorage,\n type AgentStorage,\n type StoredAgent,\n} from '../../index.js';\nimport { createSessionsRouter } from './routes/sessions.js';\nimport { createAgentsRouter } from './routes/agents.js';\nimport { createSkillsRouter } from './routes/skills.js';\n\n/**\n * Lifecycle hooks for session events\n */\nexport interface HarnessServerHooks {\n /**\n * Called when a new session is created\n */\n onSessionStart?: (sessionId: string, agentName: string) => void | Promise<void>;\n\n /**\n * Called when a session ends (completed, error, or deleted)\n */\n onSessionEnd?: (sessionId: string) => void | Promise<void>;\n\n /**\n * Called after each message is processed\n */\n onMessage?: (sessionId: string, agentName: string) => void | Promise<void>;\n}\n\nexport interface OpenAPIServerConfig {\n /**\n * Storage implementation for sessions and messages\n */\n storage: SessionStorage;\n\n /**\n * Optional storage for agent configurations.\n * If provided, enables CRUD operations on agents via the API.\n */\n agentStorage?: AgentStorage;\n\n /**\n * Map of agent name to agent instance\n */\n agents?: Map<string, AgentHarness>;\n\n /**\n * Skill manager for handling agent skills\n */\n skillManager?: SkillManager;\n\n /**\n * Enable CORS (default: true)\n */\n cors?: boolean;\n\n /**\n * Enable request logging (default: true in development)\n */\n logging?: boolean;\n\n /**\n * Base path for API routes (default: '/api')\n */\n basePath?: string;\n\n /**\n * Custom middleware to add before routes\n */\n middleware?: Array<(c: any, next: () => Promise<void>) => Promise<void>>;\n\n /**\n * Lifecycle hooks for session events (e.g., workspace management)\n */\n hooks?: HarnessServerHooks;\n\n /**\n * API documentation configuration\n */\n docs?: {\n /**\n * Enable API documentation (default: true)\n */\n enabled?: boolean;\n\n /**\n * Documentation path (default: '/docs')\n */\n path?: string;\n\n /**\n * OpenAPI specification path (default: '/openapi.json')\n */\n specPath?: string;\n\n /**\n * API title (default: 'Agent SDK Harness API')\n */\n title?: string;\n\n /**\n * API description\n */\n description?: string;\n\n /**\n * API version (default: '1.0.0')\n */\n version?: string;\n };\n}\n\n/**\n * Create and configure the OpenAPI-documented Hono server for Agent SDK Harness\n */\nexport function createOpenAPIServer(config: OpenAPIServerConfig) {\n const {\n storage,\n agentStorage,\n agents = new Map(),\n skillManager,\n cors: enableCors = true,\n logging = process.env.NODE_ENV !== 'production',\n basePath = '/api',\n middleware = [],\n hooks = {},\n docs = {},\n } = config;\n\n const {\n enabled: docsEnabled = true,\n path: docsPath = '/docs',\n specPath = '/openapi.json',\n title = 'Agent SDK Harness API',\n description = `REST API for managing Claude AI agent sessions and messages.\n\n## Overview\n\nThe Agent SDK Harness provides a complete framework for building, managing, and persisting Claude Agent SDK sessions. This API enables you to:\n\n- **Sessions**: Create and manage agent conversations with full state persistence\n- **Agents**: Configure and manage AI agents with custom tools and prompts\n- **Skills**: Browse and manage skill files for agent capabilities\n\n## Streaming Responses\n\nSeveral endpoints return Server-Sent Events (SSE) streams for real-time responses:\n- \\`POST /sessions/{sessionId}/send\\` - Send message and stream response\n- \\`POST /agents/{agentName}/run\\` - Create session and stream response\n\n## Authentication\n\nAuthentication is handled by the hosting application. This API does not enforce authentication by default.`,\n version = '1.0.0',\n } = docs;\n\n // Track if agents need to be reloaded from storage\n let agentsNeedReload = false;\n\n const app = new OpenAPIHono();\n\n // Global middleware\n if (enableCors) {\n app.use('*', cors());\n }\n if (logging) {\n app.use('*', logger());\n }\n app.use('*', prettyJSON());\n app.use('*', secureHeaders());\n\n // Custom middleware\n for (const mw of middleware) {\n app.use('*', mw);\n }\n\n // Create session manager\n const sessionManager = new SessionManager(storage);\n\n // Create API router with OpenAPI\n const api = new OpenAPIHono();\n\n // Mount routes\n api.route(\n '/sessions',\n createSessionsRouter({ sessionManager, agents, hooks })\n );\n api.route('/agents', createAgentsRouter({\n agents,\n agentStorage,\n onAgentChange: async () => {\n agentsNeedReload = true;\n },\n }));\n\n // Mount skills router if skill manager is provided\n if (skillManager) {\n api.route('/skills', createSkillsRouter({ skillManager }));\n }\n\n // Health check\n api.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));\n\n // Mount API at base path\n app.route(basePath, api);\n\n // OpenAPI documentation\n if (docsEnabled) {\n // Serve OpenAPI JSON spec\n app.doc(specPath, {\n openapi: '3.1.0',\n info: {\n title,\n description,\n version,\n },\n servers: [\n {\n url: basePath,\n description: 'API Server',\n },\n ],\n tags: [\n {\n name: 'Sessions',\n description: 'Session management - create, manage, and interact with agent sessions',\n },\n {\n name: 'Agents',\n description: 'Agent management - configure and manage AI agents',\n },\n {\n name: 'Skills',\n description: 'Skills management - browse and manage skill files',\n },\n ],\n });\n\n // Serve Scalar API Reference UI\n app.get(\n docsPath,\n apiReference({\n url: specPath,\n theme: 'kepler',\n layout: 'modern',\n hideModels: false,\n hideDownloadButton: false,\n darkMode: true,\n pageTitle: `${title} - Documentation`,\n })\n );\n }\n\n // Root redirect\n app.get('/', (c) => {\n if (docsEnabled) {\n return c.redirect(docsPath);\n }\n return c.redirect(`${basePath}/health`);\n });\n\n // Error handler\n app.onError((err, c) => {\n console.error('Server error:', err);\n return c.json(\n {\n error: err.message || 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n });\n\n // Not found handler\n app.notFound((c) => {\n return c.json(\n {\n error: 'Not found',\n code: 'NOT_FOUND',\n },\n 404\n );\n });\n\n return {\n app,\n sessionManager,\n\n /**\n * Register an agent with the server\n */\n registerAgent(name: string, agent: AgentHarness) {\n agents.set(name, agent);\n },\n\n /**\n * Unregister an agent\n */\n unregisterAgent(name: string) {\n agents.delete(name);\n },\n\n /**\n * Get all registered agents\n */\n getAgents() {\n return agents;\n },\n\n /**\n * Check if agents need to be reloaded from storage\n */\n needsReload() {\n return agentsNeedReload;\n },\n\n /**\n * Mark agents as reloaded (call after reloading)\n */\n markReloaded() {\n agentsNeedReload = false;\n },\n\n /**\n * Get agent storage (if configured)\n */\n getAgentStorage() {\n return agentStorage;\n },\n\n /**\n * Get stored agents from agent storage\n */\n async getStoredAgents(): Promise<StoredAgent[]> {\n if (!agentStorage) {\n return [];\n }\n return agentStorage.getActiveAgents();\n },\n\n /**\n * Initialize storage and agents\n */\n async initialize() {\n await storage.initialize();\n if (agentStorage) {\n await agentStorage.initialize();\n }\n for (const agent of agents.values()) {\n await agent.initialize();\n }\n },\n\n /**\n * Close storage and agents\n */\n async close() {\n for (const agent of agents.values()) {\n await agent.close();\n }\n await storage.close();\n if (agentStorage) {\n await agentStorage.close();\n }\n },\n\n /**\n * Get the OpenAPI specification as JSON\n */\n getOpenAPISpec(): OpenAPIObject {\n return app.getOpenAPI31Document({\n openapi: '3.1.0',\n info: {\n title,\n description,\n version,\n },\n });\n },\n };\n}\n\nexport type OpenAPIServer = ReturnType<typeof createOpenAPIServer>;\n\n// Re-export for backwards compatibility\nexport { createOpenAPIServer as createHarnessServer };\n","/**\n * OpenAPI Module\n *\n * This module provides OpenAPI-documented routes and server factory for the Harness API.\n * It uses @hono/zod-openapi for automatic OpenAPI spec generation from Zod schemas.\n */\n\n// Server factory\nexport {\n createOpenAPIServer,\n createOpenAPIServer as createHarnessServer,\n type OpenAPIServer,\n type OpenAPIServerConfig,\n type HarnessServerHooks,\n} from './server.js';\n\n// Route factories\nexport { createSessionsRouter, type SessionsRouterOptions, type SessionHooks } from './routes/sessions.js';\nexport { createAgentsRouter, type AgentsRouterOptions } from './routes/agents.js';\nexport { createSkillsRouter, type SkillsRouterOptions } from './routes/skills.js';\n\n// All schemas for external use\nexport * from './schemas.js';\n","/**\n * Structured Logger for Agent SDK Harness Server\n *\n * Provides level-based logging with support for:\n * - JSON format for production (structured logging)\n * - Pretty format for development\n * - Request logging middleware for Hono\n * - Child loggers with preset context\n */\n\nimport type { Context, MiddlewareHandler } from 'hono';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface LogContext {\n [key: string]: unknown;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: LogContext;\n}\n\nexport interface LoggerConfig {\n /** Minimum log level to output */\n minLevel?: LogLevel;\n /** Force JSON output regardless of NODE_ENV */\n forceJson?: boolean;\n /** Custom output function (defaults to console) */\n output?: (entry: LogEntry, formatted: string) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nconst LEVEL_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m', // cyan\n info: '\\x1b[32m', // green\n warn: '\\x1b[33m', // yellow\n error: '\\x1b[31m', // red\n};\n\nconst RESET = '\\x1b[0m';\n\nfunction getDefaultMinLevel(): LogLevel {\n return process.env.NODE_ENV === 'production' ? 'info' : 'debug';\n}\n\nfunction shouldLog(level: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[minLevel];\n}\n\nfunction formatLogEntry(entry: LogEntry, forceJson: boolean): string {\n const isProduction = process.env.NODE_ENV === 'production';\n\n if (isProduction || forceJson) {\n // JSON format for production (structured logging)\n return JSON.stringify(entry);\n }\n\n // Pretty format for development\n const color = LEVEL_COLORS[entry.level];\n const contextStr = entry.context\n ? ' ' + JSON.stringify(entry.context)\n : '';\n\n return `${color}[${entry.level.toUpperCase()}]${RESET} ${entry.timestamp} ${entry.message}${contextStr}`;\n}\n\nfunction defaultOutput(entry: LogEntry, formatted: string): void {\n switch (entry.level) {\n case 'error':\n console.error(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n default:\n console.log(formatted);\n }\n}\n\n/**\n * Create a logger instance with the given configuration\n */\nexport function createLogger(config: LoggerConfig = {}) {\n const minLevel = config.minLevel ?? getDefaultMinLevel();\n const forceJson = config.forceJson ?? false;\n const output = config.output ?? defaultOutput;\n\n function logFn(level: LogLevel) {\n return (message: string, context?: LogContext): void => {\n if (!shouldLog(level, minLevel)) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n ...(context && { context }),\n };\n\n const formatted = formatLogEntry(entry, forceJson);\n output(entry, formatted);\n };\n }\n\n return {\n debug: logFn('debug'),\n info: logFn('info'),\n warn: logFn('warn'),\n error: logFn('error'),\n\n /**\n * Create a child logger with preset context\n */\n child(baseContext: LogContext) {\n return {\n debug: (message: string, context?: LogContext) =>\n logFn('debug')(message, { ...baseContext, ...context }),\n info: (message: string, context?: LogContext) =>\n logFn('info')(message, { ...baseContext, ...context }),\n warn: (message: string, context?: LogContext) =>\n logFn('warn')(message, { ...baseContext, ...context }),\n error: (message: string, context?: LogContext) =>\n logFn('error')(message, { ...baseContext, ...context }),\n };\n },\n };\n}\n\n/**\n * Default logger instance\n */\nexport const log = createLogger();\n\n/**\n * Generate a unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport interface RequestLoggerOptions {\n /** Logger instance to use */\n logger?: ReturnType<typeof createLogger>;\n /** Skip logging for certain paths */\n skip?: (c: Context) => boolean;\n /** Custom request ID generator */\n generateId?: () => string;\n}\n\n/**\n * Hono middleware for request logging\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { requestLogger } from '@conviction-labs/harness-server';\n *\n * const app = new Hono();\n * app.use('*', requestLogger());\n * ```\n */\nexport function requestLogger(options: RequestLoggerOptions = {}): MiddlewareHandler {\n const {\n logger = log,\n skip,\n generateId = generateRequestId,\n } = options;\n\n return async (c: Context, next) => {\n if (skip?.(c)) {\n return next();\n }\n\n const requestId = generateId();\n const start = Date.now();\n const method = c.req.method;\n const path = c.req.path;\n\n // Set request ID for use in handlers\n c.set('requestId', requestId);\n\n logger.debug('Request started', {\n requestId,\n method,\n path,\n userAgent: c.req.header('user-agent'),\n });\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n\n const logFn = status >= 500 ? logger.error : status >= 400 ? logger.warn : logger.info;\n\n logFn('Request completed', {\n requestId,\n method,\n path,\n status,\n duration: `${duration}ms`,\n });\n };\n}\n\nexport type Logger = ReturnType<typeof createLogger>;\n","/**\n * Rate Limiting Middleware for Agent SDK Harness Server\n *\n * Provides configurable rate limiting with:\n * - In-memory store (suitable for single-instance deployments)\n * - Pluggable store interface for Redis or other backends\n * - Sliding window algorithm\n * - Standard rate limit headers\n */\n\nimport type { Context, MiddlewareHandler } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\n/**\n * Result of a rate limit check\n */\nexport interface RateLimitResult {\n /** Whether the request is allowed */\n allowed: boolean;\n /** Remaining requests in the current window */\n remaining: number;\n /** Timestamp when the limit resets (ms since epoch) */\n resetAt: number;\n}\n\n/**\n * Store interface for rate limit data\n * Implement this to use Redis or other backends\n */\nexport interface RateLimitStore {\n /**\n * Check and increment the rate limit counter\n * @param key - Unique identifier for the rate limit bucket\n * @param maxRequests - Maximum requests allowed in the window\n * @param windowMs - Window size in milliseconds\n * @returns Rate limit check result\n */\n check(\n key: string,\n maxRequests: number,\n windowMs: number\n ): Promise<RateLimitResult>;\n\n /**\n * Clean up expired entries (optional)\n */\n cleanup?(): Promise<void>;\n}\n\n/**\n * In-memory rate limit store\n * Suitable for single-instance deployments\n */\nexport class MemoryRateLimitStore implements RateLimitStore {\n private store = new Map<string, { count: number; resetAt: number }>();\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(cleanupIntervalMs = 60000) {\n // Periodically clean up expired entries\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, cleanupIntervalMs);\n\n // Allow garbage collection if the store is no longer referenced\n if (this.cleanupInterval.unref) {\n this.cleanupInterval.unref();\n }\n }\n\n async check(\n key: string,\n maxRequests: number,\n windowMs: number\n ): Promise<RateLimitResult> {\n const now = Date.now();\n let entry = this.store.get(key);\n\n if (!entry || entry.resetAt < now) {\n entry = {\n count: 0,\n resetAt: now + windowMs,\n };\n this.store.set(key, entry);\n }\n\n entry.count++;\n const allowed = entry.count <= maxRequests;\n const remaining = Math.max(0, maxRequests - entry.count);\n\n return {\n allowed,\n remaining,\n resetAt: entry.resetAt,\n };\n }\n\n async cleanup(): Promise<void> {\n const now = Date.now();\n for (const [key, entry] of this.store) {\n if (entry.resetAt < now) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Stop the cleanup interval\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n}\n\n/**\n * Configuration for rate limiting\n */\nexport interface RateLimitConfig {\n /** Time window in milliseconds */\n windowMs: number;\n /** Maximum requests per window */\n maxRequests: number;\n /** Custom key generator (defaults to IP-based) */\n keyGenerator?: (c: Context) => string;\n /** Custom store (defaults to in-memory) */\n store?: RateLimitStore;\n /** Skip rate limiting for certain requests */\n skip?: (c: Context) => boolean;\n /** Custom error message */\n message?: string;\n /** Custom error handler */\n onRateLimited?: (c: Context, result: RateLimitResult) => void | Promise<void>;\n /** Whether to add rate limit headers (default: true) */\n headers?: boolean;\n}\n\nconst defaultStore = new MemoryRateLimitStore();\n\n/**\n * Default key generator based on IP address\n */\nfunction defaultKeyGenerator(c: Context): string {\n const ip =\n c.req.header('x-forwarded-for')?.split(',')[0]?.trim() ||\n c.req.header('x-real-ip') ||\n 'unknown';\n return `ip:${ip}`;\n}\n\n/**\n * Create a rate limiting middleware\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { rateLimit } from '@conviction-labs/harness-server';\n *\n * const app = new Hono();\n *\n * // Apply global rate limit\n * app.use('*', rateLimit({\n * windowMs: 60000, // 1 minute\n * maxRequests: 100,\n * }));\n *\n * // Or apply to specific routes\n * app.post('/api/sessions', rateLimit({ windowMs: 60000, maxRequests: 20 }), handler);\n * ```\n */\nexport function rateLimit(config: Partial<RateLimitConfig> = {}): MiddlewareHandler {\n const {\n windowMs = 60000, // 1 minute default\n maxRequests = 100,\n keyGenerator = defaultKeyGenerator,\n store = defaultStore,\n skip,\n message = 'Too many requests. Please try again later.',\n onRateLimited,\n headers = true,\n } = config;\n\n return async (c: Context, next) => {\n // Skip if configured\n if (skip?.(c)) {\n return next();\n }\n\n const key = keyGenerator(c);\n const result = await store.check(key, maxRequests, windowMs);\n\n // Set rate limit headers\n if (headers) {\n c.header('X-RateLimit-Limit', maxRequests.toString());\n c.header('X-RateLimit-Remaining', result.remaining.toString());\n c.header('X-RateLimit-Reset', Math.ceil(result.resetAt / 1000).toString());\n }\n\n if (!result.allowed) {\n // Call custom handler if provided\n if (onRateLimited) {\n await onRateLimited(c, result);\n }\n\n // Add Retry-After header\n const retryAfter = Math.ceil((result.resetAt - Date.now()) / 1000);\n c.header('Retry-After', retryAfter.toString());\n\n throw new HTTPException(429, { message });\n }\n\n return next();\n };\n}\n\n/**\n * Pre-configured rate limiters for common use cases\n */\nexport const rateLimiters = {\n /**\n * Standard API rate limit (100 req/min)\n */\n standard: () =>\n rateLimit({\n windowMs: 60000,\n maxRequests: 100,\n }),\n\n /**\n * Strict rate limit for sensitive endpoints (10 req/min)\n */\n strict: () =>\n rateLimit({\n windowMs: 60000,\n maxRequests: 10,\n }),\n\n /**\n * Rate limit for expensive operations (20 req/min)\n */\n expensive: () =>\n rateLimit({\n windowMs: 60000,\n maxRequests: 20,\n }),\n\n /**\n * Lenient rate limit for read operations (500 req/min)\n */\n lenient: () =>\n rateLimit({\n windowMs: 60000,\n maxRequests: 500,\n }),\n};\n","/**\n * Middleware exports for Agent SDK Harness Server\n */\n\n// Logger\nexport {\n createLogger,\n requestLogger,\n log,\n} from './logger.js';\nexport type {\n LogLevel,\n LogContext,\n LogEntry,\n LoggerConfig,\n RequestLoggerOptions,\n Logger,\n} from './logger.js';\n\n// Rate Limiting\nexport {\n rateLimit,\n rateLimiters,\n MemoryRateLimitStore,\n} from './rate-limit.js';\nexport type {\n RateLimitConfig,\n RateLimitResult,\n RateLimitStore,\n} from './rate-limit.js';\n","export { createHarnessServer } from './server.js';\nexport type { HarnessServerConfig, HarnessServer, HarnessServerHooks } from './server.js';\n\n// Re-export route factories for custom composition\nexport { createSessionsRouter } from './routes/sessions.js';\nexport type { SessionsRouterOptions, FileAttachment } from './routes/sessions.js';\nexport { createAgentsRouter } from './routes/agents.js';\nexport type { AgentsRouterOptions } from './routes/agents.js';\n\n// Middleware\nexport {\n // Logger\n createLogger,\n requestLogger,\n log,\n // Rate limiting\n rateLimit,\n rateLimiters,\n MemoryRateLimitStore,\n} from './middleware/index.js';\nexport type {\n LogLevel,\n LogContext,\n LogEntry,\n LoggerConfig,\n RequestLoggerOptions,\n Logger,\n RateLimitConfig,\n RateLimitResult,\n RateLimitStore,\n} from './middleware/index.js';\n\n// Node.js server helper\nexport { serve } from '@hono/node-server';\n\n/**\n * Check if a port is available\n */\nasync function isPortAvailable(port: number, hostname: string): Promise<boolean> {\n const net = await import('net');\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, hostname);\n });\n}\n\n/**\n * Find an available port starting from the given port\n */\nasync function findAvailablePort(startPort: number, hostname: string, maxAttempts = 10): Promise<number> {\n for (let i = 0; i < maxAttempts; i++) {\n const port = startPort + i;\n if (await isPortAvailable(port, hostname)) {\n return port;\n }\n }\n throw new Error(`No available port found in range ${startPort}-${startPort + maxAttempts - 1}`);\n}\n\nexport interface StartServerOptions {\n /**\n * Port to listen on (default: 3000)\n */\n port?: number;\n /**\n * Hostname to bind to (default: '0.0.0.0')\n */\n hostname?: string;\n /**\n * If true, find an available port if the requested port is in use (default: true)\n */\n findAvailablePort?: boolean;\n /**\n * Maximum number of ports to try when finding an available port (default: 10)\n */\n maxPortAttempts?: number;\n}\n\n/**\n * Quick start helper for running the server\n */\nexport async function startServer(\n config: import('./server.js').HarnessServerConfig & StartServerOptions\n) {\n const { serve } = await import('@hono/node-server');\n const { createHarnessServer } = await import('./server.js');\n\n const {\n port: requestedPort = 3000,\n hostname = '0.0.0.0',\n findAvailablePort: shouldFindPort = true,\n maxPortAttempts = 10,\n ...serverConfig\n } = config;\n\n const server = createHarnessServer(serverConfig);\n await server.initialize();\n\n // Find an available port if needed\n let port = requestedPort;\n if (shouldFindPort) {\n const available = await isPortAvailable(port, hostname);\n if (!available) {\n console.log(`Port ${port} is in use, finding an available port...`);\n port = await findAvailablePort(requestedPort + 1, hostname, maxPortAttempts - 1);\n console.log(`Found available port: ${port}`);\n }\n }\n\n const nodeServer = serve({\n fetch: server.app.fetch,\n port,\n hostname,\n });\n\n console.log(`Agent SDK Harness server running at http://${hostname}:${port}`);\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log('Shutting down server...');\n await server.close();\n nodeServer.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n return { server, nodeServer, port };\n}\n","/**\n * Skill Catalog\n *\n * Discovers and manages skills within a workspace.\n * Skills are identified by SKILL.md files in the repository.\n */\n\nimport type { SandboxConnection, DiscoveredSkill } from './types.js';\n\n/**\n * Shell-escape a string\n */\nfunction shellQuote(str: string): string {\n if (/^[a-zA-Z0-9._\\-/]+$/.test(str)) {\n return str;\n }\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Skill catalog for discovering and accessing skills in a workspace\n */\nexport class SkillCatalog {\n private readonly sandbox: SandboxConnection;\n private readonly repoRoot: string;\n private skills: Map<string, DiscoveredSkill> = new Map();\n private _scanned = false;\n\n constructor(sandbox: SandboxConnection, repoRoot: string) {\n this.sandbox = sandbox;\n this.repoRoot = repoRoot;\n }\n\n /**\n * Scan the workspace for skills (directories containing SKILL.md)\n * @returns Number of skills discovered\n */\n async scan(): Promise<number> {\n this.skills.clear();\n\n // Find all SKILL.md files\n const findResult = await this.sandbox.runCommand(\n `find ${shellQuote(this.repoRoot)} -name \"SKILL.md\" -type f 2>/dev/null || true`\n );\n\n if (findResult.exitCode !== 0 || !findResult.stdout.trim()) {\n this._scanned = true;\n return 0;\n }\n\n const skillMdPaths = findResult.stdout\n .trim()\n .split('\\n')\n .filter((p) => p.length > 0);\n\n for (const skillMdPath of skillMdPaths) {\n try {\n // Get skill name from parent directory\n const skillDir = skillMdPath.substring(0, skillMdPath.lastIndexOf('/'));\n const skillName = skillDir.substring(skillDir.lastIndexOf('/') + 1);\n\n // Read SKILL.md content\n const content = await this.sandbox.readFile(skillMdPath);\n\n // List other files in the skill directory\n const lsResult = await this.sandbox.runCommand(\n `find ${shellQuote(skillDir)} -type f -not -name \"SKILL.md\" 2>/dev/null || true`\n );\n const files = lsResult.stdout\n .trim()\n .split('\\n')\n .filter((f) => f.length > 0)\n .map((f) => f.replace(skillDir + '/', ''));\n\n this.skills.set(skillName, {\n name: skillName,\n skillMdPath,\n skillMdContent: content,\n files,\n });\n } catch {\n // Skip skills that can't be read\n continue;\n }\n }\n\n this._scanned = true;\n return this.skills.size;\n }\n\n /**\n * Get all discovered skills\n */\n getAll(): DiscoveredSkill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * Get a skill by name\n */\n get(name: string): DiscoveredSkill | undefined {\n return this.skills.get(name);\n }\n\n /**\n * Check if a skill exists\n */\n has(name: string): boolean {\n return this.skills.has(name);\n }\n\n /**\n * Get skill names\n */\n names(): string[] {\n return Array.from(this.skills.keys());\n }\n\n /**\n * Get number of skills\n */\n get count(): number {\n return this.skills.size;\n }\n\n /**\n * Check if catalog has been scanned\n */\n get scanned(): boolean {\n return this._scanned;\n }\n\n /**\n * Get formatted skill information for system prompts\n */\n getSkillPrompt(skillName: string): string | undefined {\n const skill = this.skills.get(skillName);\n if (!skill) {\n return undefined;\n }\n\n return [\n `# Skill: ${skill.name}`,\n '',\n skill.skillMdContent,\n '',\n skill.files.length > 0\n ? `Available files: ${skill.files.join(', ')}`\n : '',\n ]\n .filter((line) => line !== undefined)\n .join('\\n');\n }\n\n /**\n * Get all skill prompts combined\n */\n getAllSkillPrompts(): string {\n return this.getAll()\n .map((skill) => this.getSkillPrompt(skill.name))\n .filter((prompt) => prompt !== undefined)\n .join('\\n\\n---\\n\\n');\n }\n}\n\n/**\n * Create a skill catalog for a workspace\n */\nexport function createSkillCatalog(\n sandbox: SandboxConnection,\n repoRoot: string\n): SkillCatalog {\n return new SkillCatalog(sandbox, repoRoot);\n}\n","/**\n * Git Repository Management\n *\n * Provides git operations within a sandbox environment.\n * Used for version-controlling workspace state.\n */\n\nimport type { SandboxConnection, CommandResult, GitRepo } from './types.js';\n\n/**\n * Shell-escape a string for safe command execution\n */\nfunction shellQuote(str: string): string {\n // If string contains no special characters, return as-is\n if (/^[a-zA-Z0-9._\\-/]+$/.test(str)) {\n return str;\n }\n // Otherwise, wrap in single quotes and escape existing single quotes\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Git repository operations within a sandbox\n */\nexport class SandboxGitRepo implements GitRepo {\n private readonly sandbox: SandboxConnection;\n readonly root: string;\n\n constructor(sandbox: SandboxConnection, root: string) {\n this.sandbox = sandbox;\n this.root = root;\n }\n\n /**\n * Execute a git command in the repository\n */\n private async git(args: string): Promise<CommandResult> {\n const command = `cd ${shellQuote(this.root)} && git ${args}`;\n const result = await Promise.resolve(this.sandbox.runCommand(command));\n return result;\n }\n\n /**\n * Initialize an empty git repository with proper configuration\n */\n async initEmpty(): Promise<void> {\n // Create directory if it doesn't exist\n await this.sandbox.runCommand(`mkdir -p ${shellQuote(this.root)}`);\n\n // Initialize repository\n const initResult = await this.git('init');\n if (initResult.exitCode !== 0) {\n throw new Error(`Failed to initialize git repository: ${initResult.stderr || initResult.error}`);\n }\n\n // Configure git user (required for commits)\n await this.git('config user.email \"agent@ash-ai.local\"');\n await this.git('config user.name \"ASH Agent\"');\n\n // Create initial commit with .gitkeep\n await this.sandbox.runCommand(\n `cd ${shellQuote(this.root)} && touch .gitkeep`\n );\n await this.git('add .gitkeep');\n const commitResult = await this.git('commit -m \"Initialize workspace\"');\n if (commitResult.exitCode !== 0 && !commitResult.stdout?.includes('nothing to commit')) {\n throw new Error(`Failed to create initial commit: ${commitResult.stderr || commitResult.error}`);\n }\n }\n\n /**\n * Restore repository from a git bundle file\n */\n async restoreFromBundle(bundlePath: string, checkoutDir: string): Promise<void> {\n const quotedBundle = shellQuote(bundlePath);\n const quotedDir = shellQuote(checkoutDir);\n\n // Create parent directory if needed\n const parentDir = checkoutDir.substring(0, checkoutDir.lastIndexOf('/'));\n if (parentDir) {\n await this.sandbox.runCommand(`mkdir -p ${shellQuote(parentDir)}`);\n }\n\n // Clone directly from bundle (no verification needed - git clone will fail if invalid)\n const cloneResult = await this.sandbox.runCommand(\n `git clone ${quotedBundle} ${quotedDir}`\n );\n if (cloneResult.exitCode !== 0) {\n throw new Error(`Failed to clone from bundle: ${cloneResult.stderr || cloneResult.error}`);\n }\n\n // Configure git user\n await this.git('config user.email \"agent@ash-ai.local\"');\n await this.git('config user.name \"ASH Agent\"');\n }\n\n /**\n * Create a git bundle containing all repository history\n */\n async createBundle(bundlePath: string): Promise<void> {\n // Ensure bundle directory exists\n const bundleDir = bundlePath.substring(0, bundlePath.lastIndexOf('/'));\n if (bundleDir) {\n await this.sandbox.runCommand(`mkdir -p ${shellQuote(bundleDir)}`);\n }\n\n // Create bundle\n const bundleResult = await this.git(\n `bundle create ${shellQuote(bundlePath)} --all`\n );\n if (bundleResult.exitCode !== 0) {\n throw new Error(`Failed to create bundle: ${bundleResult.stderr || bundleResult.error}`);\n }\n }\n\n /**\n * Stage all changes (including untracked files)\n */\n async addAll(): Promise<void> {\n const result = await this.git('add -A');\n if (result.exitCode !== 0) {\n throw new Error(`Failed to stage changes: ${result.stderr || result.error}`);\n }\n }\n\n /**\n * Commit staged changes\n */\n async commit(message: string): Promise<CommandResult> {\n return this.git(`commit -m ${shellQuote(message)}`);\n }\n\n /**\n * Get repository status\n */\n async status(): Promise<CommandResult> {\n return this.git('status --porcelain');\n }\n\n /**\n * Get commit log\n */\n async log(options?: { maxCount?: number }): Promise<CommandResult> {\n const maxCount = options?.maxCount ?? 10;\n return this.git(`log --oneline -n ${maxCount}`);\n }\n\n /**\n * Get the number of commits in the repository\n */\n async getCommitCount(): Promise<number> {\n const result = await this.git('rev-list --count HEAD');\n if (result.exitCode !== 0) {\n return 0;\n }\n return parseInt(result.stdout.trim(), 10) || 0;\n }\n\n /**\n * Check if there are uncommitted changes\n */\n async hasChanges(): Promise<boolean> {\n const result = await this.status();\n return result.exitCode === 0 && result.stdout.trim().length > 0;\n }\n}\n\n/**\n * Create a git repository helper for a sandbox\n */\nexport function createGitRepo(sandbox: SandboxConnection, root: string): SandboxGitRepo {\n return new SandboxGitRepo(sandbox, root);\n}\n","/**\n * Workspace Persistence\n *\n * Functions for saving and loading workspace state between sessions.\n * Uses git bundles for version-controlled persistence.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SandboxConnection, BundleStore } from './types.js';\nimport { SandboxGitRepo } from './git-repo.js';\n\n/** Bundle path template inside sandbox */\nconst BUNDLE_PATH_TEMPLATE = '/tmp/ash-workspace-bundles/{workspaceId}.bundle';\n\n/**\n * Shell-escape a string\n */\nfunction shellQuote(str: string): string {\n if (/^[a-zA-Z0-9._\\-/]+$/.test(str)) {\n return str;\n }\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport interface LoadStateResult {\n gitRepo: SandboxGitRepo;\n restored: boolean;\n commitCount: number;\n}\n\n/**\n * Load workspace state from storage into sandbox.\n *\n * Downloads bundle from storage if it exists and restores the git repository.\n * If no bundle exists, initializes a fresh repository.\n */\nexport async function loadWorkspaceState(\n workspaceId: string,\n sandbox: SandboxConnection,\n bundleStore: BundleStore,\n repoRoot?: string\n): Promise<LoadStateResult> {\n const resolvedRoot = repoRoot ?? sandbox.defaultRepoRoot;\n\n // Create GitRepo instance\n const gitRepo = new SandboxGitRepo(sandbox, resolvedRoot);\n\n // Create temp directory for bundle download\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ash-workspace-'));\n const localBundle = path.join(tmpDir, `${workspaceId}.bundle`);\n\n try {\n // Try to download existing bundle\n const bundleExists = await Promise.resolve(\n bundleStore.downloadBundle(workspaceId, localBundle)\n );\n\n if (bundleExists) {\n // Bundle exists - restore from it\n const remoteBundlePath = BUNDLE_PATH_TEMPLATE.replace('{workspaceId}', workspaceId);\n\n // Ensure bundle directory exists in sandbox\n const bundleDir = remoteBundlePath.substring(0, remoteBundlePath.lastIndexOf('/'));\n await sandbox.runCommand(`mkdir -p ${shellQuote(bundleDir)}`);\n\n // Check if repo root is empty\n const emptyCheck = await sandbox.runCommand(\n `if [ -d ${shellQuote(resolvedRoot)} ] && [ -n \"$(ls -A ${shellQuote(resolvedRoot)} 2>/dev/null)\" ]; then echo NONEMPTY; fi`\n );\n if (emptyCheck.stdout?.includes('NONEMPTY')) {\n throw new Error(\n `Cannot restore into non-empty directory: ${resolvedRoot}. ` +\n 'Please provide an empty or nonexistent directory.'\n );\n }\n\n // Upload bundle to sandbox\n await sandbox.uploadFile(localBundle, remoteBundlePath);\n\n // Restore repository from bundle\n await gitRepo.restoreFromBundle(remoteBundlePath, resolvedRoot);\n\n const commitCount = await gitRepo.getCommitCount();\n\n return {\n gitRepo,\n restored: true,\n commitCount,\n };\n } else {\n // No bundle exists - initialize fresh repository\n await gitRepo.initEmpty();\n\n return {\n gitRepo,\n restored: false,\n commitCount: 1, // Initial commit\n };\n }\n } finally {\n // Clean up temp directory\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\nexport interface SaveStateResult {\n committed: boolean;\n commitMessage: string;\n bundleSize: number;\n}\n\n/**\n * Save workspace state from sandbox to storage.\n *\n * Commits pending changes, creates a git bundle, and uploads to storage.\n */\nexport async function saveWorkspaceState(\n workspaceId: string,\n sandbox: SandboxConnection,\n gitRepo: SandboxGitRepo,\n bundleStore: BundleStore,\n commitMessage?: string\n): Promise<SaveStateResult> {\n // Generate default commit message if not provided\n const message = commitMessage ??\n `Auto-checkpoint for workspace ${workspaceId} at ${new Date().toISOString()}`;\n\n // Stage all changes\n await gitRepo.addAll();\n\n // Commit changes\n const commitResult = await gitRepo.commit(message);\n const committed = commitResult.exitCode === 0;\n\n if (!committed) {\n const output = (commitResult.stdout + commitResult.stderr).toLowerCase();\n if (!output.includes('nothing to commit')) {\n throw new Error(\n `Git commit failed: ${commitResult.stderr || commitResult.error || 'unknown error'}`\n );\n }\n }\n\n // Create bundle inside sandbox\n const remoteBundlePath = BUNDLE_PATH_TEMPLATE.replace('{workspaceId}', workspaceId);\n await gitRepo.createBundle(remoteBundlePath);\n\n // Create temp directory for bundle download\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ash-workspace-'));\n const localBundle = path.join(tmpDir, `${workspaceId}.bundle`);\n\n try {\n // Download bundle from sandbox\n await sandbox.downloadFile(remoteBundlePath, localBundle);\n\n // Get bundle size\n const bundleSize = fs.statSync(localBundle).size;\n\n // Upload to storage\n await bundleStore.uploadBundle(workspaceId, localBundle);\n\n return {\n committed,\n commitMessage: message,\n bundleSize,\n };\n } finally {\n // Clean up temp directory\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","/**\n * GitHub Skills Loader\n *\n * Clones skills from GitHub repositories and uploads them to the workspace sandbox.\n * Supports specifying branches, tags, and subdirectory paths.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { execSync } from 'node:child_process';\nimport type { SandboxConnection, GitHubSkillConfig } from './types.js';\n\n/** Items to filter when uploading skills */\nconst FILTERED_ITEMS = new Set([\n '.DS_Store',\n 'Thumbs.db',\n '__pycache__',\n '.git',\n '.gitignore',\n '.pytest_cache',\n 'node_modules',\n '.env',\n '.env.local',\n]);\n\n/**\n * Result of loading a skill from GitHub\n */\nexport interface GitHubSkillResult {\n /** Skill name (directory name) */\n name: string;\n\n /** Path in the sandbox where skill was uploaded */\n remotePath: string;\n\n /** Source URL */\n sourceUrl: string;\n\n /** Git ref used */\n ref?: string;\n\n /** Number of files uploaded */\n fileCount: number;\n}\n\n/**\n * Clone a GitHub repository to a temporary directory\n */\nasync function cloneRepository(\n url: string,\n ref?: string,\n timeout = 120000\n): Promise<string> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ash-github-skill-'));\n\n try {\n const cloneCmd = ['git', 'clone', '--depth', '1'];\n\n if (ref) {\n cloneCmd.push('--branch', ref);\n }\n\n cloneCmd.push(url, tmpDir);\n\n execSync(cloneCmd.join(' '), {\n timeout,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n\n return tmpDir;\n } catch (error) {\n // Clean up on failure\n try {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Extract repository name from URL\n */\nfunction getRepoName(url: string): string {\n let cleanUrl = url.replace(/\\.git$/, '').replace(/\\/$/, '');\n return cleanUrl.split('/').pop() || 'skill';\n}\n\n/**\n * Count files in a directory (recursively)\n */\nfunction countFiles(dir: string, exclude: Set<string>): number {\n let count = 0;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (exclude.has(entry.name)) continue;\n\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n count += countFiles(fullPath, exclude);\n } else if (entry.isFile()) {\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Upload a directory to the sandbox (recursively)\n */\nasync function uploadDirectory(\n sandbox: SandboxConnection,\n localPath: string,\n remotePath: string,\n exclude: Set<string>\n): Promise<number> {\n let uploadCount = 0;\n\n // Create remote directory\n await sandbox.runCommand(`mkdir -p '${remotePath}'`);\n\n const entries = fs.readdirSync(localPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (exclude.has(entry.name)) continue;\n\n const srcPath = path.join(localPath, entry.name);\n const destPath = `${remotePath}/${entry.name}`;\n\n if (entry.isDirectory()) {\n uploadCount += await uploadDirectory(sandbox, srcPath, destPath, exclude);\n } else if (entry.isFile()) {\n const content = fs.readFileSync(srcPath, 'utf-8');\n await sandbox.writeFile(destPath, content);\n uploadCount++;\n }\n }\n\n return uploadCount;\n}\n\n/**\n * Load a single skill from GitHub\n */\nexport async function loadGitHubSkill(\n sandbox: SandboxConnection,\n config: GitHubSkillConfig,\n skillsBasePath: string\n): Promise<GitHubSkillResult> {\n const { url, ref, path: subpath } = config;\n\n // Determine skill name\n let skillName: string;\n if (subpath) {\n skillName = subpath.split('/').filter(Boolean).pop() || getRepoName(url);\n } else {\n skillName = getRepoName(url);\n }\n\n // Normalize skill name (replace invalid characters)\n skillName = skillName.replace(/[^a-zA-Z0-9_-]/g, '-');\n\n const remotePath = `${skillsBasePath}/${skillName}`;\n\n // Clone repository\n let clonePath: string;\n try {\n clonePath = await cloneRepository(url, ref);\n } catch (error) {\n throw new Error(\n `Failed to clone ${url}${ref ? ` (ref: ${ref})` : ''}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n try {\n // Determine source path (repo root or subdirectory)\n const sourcePath = subpath\n ? path.join(clonePath, subpath)\n : clonePath;\n\n if (!fs.existsSync(sourcePath)) {\n throw new Error(\n `Path '${subpath}' not found in repository ${url}`\n );\n }\n\n if (!fs.statSync(sourcePath).isDirectory()) {\n throw new Error(\n `Path '${subpath}' in ${url} is not a directory`\n );\n }\n\n // Count files\n const fileCount = countFiles(sourcePath, FILTERED_ITEMS);\n if (fileCount === 0) {\n throw new Error(`No files found in ${url}${subpath ? '/' + subpath : ''}`);\n }\n\n // Upload to sandbox\n await uploadDirectory(sandbox, sourcePath, remotePath, FILTERED_ITEMS);\n\n return {\n name: skillName,\n remotePath,\n sourceUrl: url,\n ref,\n fileCount,\n };\n } finally {\n // Clean up temp directory\n try {\n fs.rmSync(clonePath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Load multiple skills from GitHub configurations\n */\nexport async function loadGitHubSkills(\n sandbox: SandboxConnection,\n configs: GitHubSkillConfig[],\n skillsBasePath: string,\n options?: {\n /** Continue loading even if some skills fail */\n continueOnError?: boolean;\n /** Callback for progress updates */\n onProgress?: (loaded: number, total: number, current: string) => void;\n }\n): Promise<{\n results: GitHubSkillResult[];\n errors: { config: GitHubSkillConfig; error: Error }[];\n}> {\n const results: GitHubSkillResult[] = [];\n const errors: { config: GitHubSkillConfig; error: Error }[] = [];\n\n for (let i = 0; i < configs.length; i++) {\n const config = configs[i];\n if (!config) continue;\n\n options?.onProgress?.(i, configs.length, config.url);\n\n try {\n const result = await loadGitHubSkill(sandbox, config, skillsBasePath);\n results.push(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.push({ config: config, error: err });\n\n if (!options?.continueOnError) {\n break;\n }\n }\n }\n\n options?.onProgress?.(configs.length, configs.length, 'complete');\n\n return { results, errors };\n}\n\n/**\n * Normalize GitHub skill configuration from various input formats\n */\nexport function normalizeGitHubConfigs(\n value: string | string[] | GitHubSkillConfig | GitHubSkillConfig[] | undefined\n): GitHubSkillConfig[] {\n if (!value) return [];\n\n if (typeof value === 'string') {\n return [{ url: value }];\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n typeof item === 'string' ? { url: item } : item\n );\n }\n\n return [value];\n}\n\n/**\n * Parse a GitHub URL with optional ref and path\n *\n * Supports formats:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo/tree/branch/path/to/dir\n * - owner/repo (shorthand)\n * - owner/repo@branch\n * - owner/repo@branch:path/to/dir\n */\nexport function parseGitHubUrl(input: string): GitHubSkillConfig {\n // Handle shorthand format: owner/repo or owner/repo@branch\n if (!input.startsWith('http')) {\n const [repoWithRef, pathPart] = input.split(':');\n const [repo, ref] = (repoWithRef ?? '').split('@');\n\n return {\n url: `https://github.com/${repo}.git`,\n ref: ref || undefined,\n path: pathPart || undefined,\n };\n }\n\n // Handle full GitHub URL\n const url = new URL(input);\n\n if (url.hostname !== 'github.com') {\n return { url: input };\n }\n\n const pathParts = url.pathname.split('/').filter(Boolean);\n\n // Basic format: /owner/repo\n if (pathParts.length === 2) {\n return { url: `https://github.com/${pathParts[0]}/${pathParts[1]}.git` };\n }\n\n // Format with tree: /owner/repo/tree/branch[/path]\n if (pathParts.length >= 4 && pathParts[2] === 'tree') {\n const owner = pathParts[0];\n const repo = pathParts[1];\n const ref = pathParts[3];\n const subpath = pathParts.slice(4).join('/');\n\n return {\n url: `https://github.com/${owner}/${repo}.git`,\n ref,\n path: subpath || undefined,\n };\n }\n\n return { url: input };\n}\n","/**\n * MCP Tool Generator\n *\n * Introspects MCP servers and generates TypeScript wrapper code.\n * Creates a skill-like package structure with tool functions.\n */\n\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport type { SandboxConnection } from './types.js';\nimport { isStdioMcpConfig, type McpServerConfig, type McpStdioServerConfig } from '../mcp/index.js';\n\n/**\n * MCP Tool definition (from MCP protocol)\n */\nexport interface McpTool {\n name: string;\n description?: string;\n inputSchema?: {\n type: string;\n properties?: Record<string, {\n type: string;\n description?: string;\n enum?: string[];\n default?: unknown;\n }>;\n required?: string[];\n };\n}\n\n/**\n * Result of MCP server introspection\n */\nexport interface McpServerInfo {\n name: string;\n tools: McpTool[];\n instructions?: string;\n}\n\n/**\n * Result of MCP tool generation\n */\nexport interface McpGenerationResult {\n serverName: string;\n remotePath: string;\n toolCount: number;\n hasInstructions: boolean;\n}\n\n/**\n * Convert a name to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert a name to camelCase\n */\nfunction toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Normalize server name to be a valid TypeScript identifier\n */\nfunction normalizeServerName(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, '_').replace(/^(\\d)/, '_$1');\n}\n\n/**\n * Convert JSON schema type to TypeScript type\n */\nfunction jsonTypeToTS(jsonType: string): string {\n switch (jsonType) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'unknown[]';\n case 'object':\n return 'Record<string, unknown>';\n default:\n return 'unknown';\n }\n}\n\n/**\n * Generate TypeScript interface for tool parameters\n */\nfunction generateParamsInterface(tool: McpTool): string {\n const schema = tool.inputSchema;\n if (!schema?.properties) {\n return `export interface ${toPascalCase(tool.name)}Params {}`;\n }\n\n const props = Object.entries(schema.properties).map(([name, prop]) => {\n const isRequired = schema.required?.includes(name) ?? false;\n const tsType = prop.enum\n ? prop.enum.map((v) => `'${v}'`).join(' | ')\n : jsonTypeToTS(prop.type);\n const optional = isRequired ? '' : '?';\n const comment = prop.description ? ` /** ${prop.description} */\\n` : '';\n return `${comment} ${name}${optional}: ${tsType};`;\n });\n\n return `export interface ${toPascalCase(tool.name)}Params {\\n${props.join('\\n')}\\n}`;\n}\n\n/**\n * Generate TypeScript function for a tool\n */\nfunction generateToolFunction(tool: McpTool, serverName: string): string {\n const funcName = toCamelCase(tool.name);\n const paramsType = `${toPascalCase(tool.name)}Params`;\n const normalizedServer = normalizeServerName(serverName);\n\n const description = tool.description\n ? `/**\\n * ${tool.description}\\n */\\n`\n : '';\n\n // Generate parameter docs\n let paramDocs = '';\n if (tool.inputSchema?.properties) {\n const docs = Object.entries(tool.inputSchema.properties)\n .map(([name, prop]) => {\n const desc = prop.description || 'No description';\n return ` * @param params.${name} - ${desc}`;\n })\n .join('\\n');\n paramDocs = docs ? `${docs}\\n` : '';\n }\n\n return `${description}${paramDocs ? `/**\\n${paramDocs} */\\n` : ''}export async function ${funcName}(\n params: ${paramsType}\n): Promise<unknown> {\n const connection = get${toPascalCase(normalizedServer)}Connection();\n if (!connection) {\n throw new Error('${serverName} MCP server not connected. Call connect${toPascalCase(normalizedServer)}() first.');\n }\n\n return connection.callTool('${tool.name}', params);\n}`;\n}\n\n/**\n * Generate the connection manager code\n */\nfunction generateConnectionManager(serverName: string, config: McpServerConfig): string {\n const normalized = normalizeServerName(serverName);\n const pascal = toPascalCase(normalized);\n\n const configJson = JSON.stringify(config, null, 2);\n\n return `/**\n * MCP Connection Manager for ${serverName}\n *\n * Auto-generated connection manager for the ${serverName} MCP server.\n */\n\nexport const ${normalized}Config: McpServerConfig = ${configJson};\n\ninterface McpConnection {\n callTool: (name: string, params: unknown) => Promise<unknown>;\n close: () => Promise<void>;\n}\n\nlet _connection: McpConnection | null = null;\n\n/**\n * Get the current connection (null if not connected)\n */\nexport function get${pascal}Connection(): McpConnection | null {\n return _connection;\n}\n\n/**\n * Connect to the ${serverName} MCP server\n */\nexport async function connect${pascal}(): Promise<void> {\n if (_connection) {\n return; // Already connected\n }\n\n // Note: Actual MCP connection requires the @modelcontextprotocol/sdk\n // This is a placeholder that should be replaced with real MCP client code\n console.log('Connecting to ${serverName} MCP server...');\n console.log('Command:', ${normalized}Config.command);\n console.log('Args:', ${normalized}Config.args?.join(' '));\n\n _connection = {\n async callTool(name: string, params: unknown): Promise<unknown> {\n console.log(\\`Calling tool \\${name} with params:\\`, params);\n // In real implementation, this would use MCP protocol\n return { success: true, tool: name, params };\n },\n async close(): Promise<void> {\n console.log('Closing ${serverName} MCP connection');\n },\n };\n}\n\n/**\n * Disconnect from the ${serverName} MCP server\n */\nexport async function disconnect${pascal}(): Promise<void> {\n if (_connection) {\n await _connection.close();\n _connection = null;\n }\n}\n\n/**\n * Check if connected to ${serverName}\n */\nexport function is${pascal}Connected(): boolean {\n return _connection !== null;\n}`;\n}\n\n/**\n * Generate SKILL.md file content\n */\nfunction generateSkillMd(\n serverName: string,\n tools: McpTool[],\n instructions?: string\n): string {\n const normalized = normalizeServerName(serverName);\n const pascal = toPascalCase(normalized);\n\n const toolList = tools\n .map((tool) => {\n const desc = tool.description ? ` - ${tool.description}` : '';\n return `- \\`${tool.name}\\`${desc}`;\n })\n .join('\\n');\n\n const firstTool = tools[0]?.name ? toCamelCase(tools[0].name) : 'toolName';\n\n const instructionsSection = instructions\n ? `\\n## Server Instructions\\n\\n${instructions}\\n`\n : '';\n\n return `---\nname: ${normalized}\ndescription: MCP tools from ${serverName}\n---\n\n# ${serverName} MCP Server\n\nThis skill provides tools from the \\`${serverName}\\` MCP server.\n\n## Available Tools\n\n${toolList}\n\n## Usage\n\n\\`\\`\\`typescript\nimport { connect${pascal}, disconnect${pascal}, ${firstTool} } from './index';\n\n// Connect to the server\nawait connect${pascal}();\n\n// Use tools\nconst result = await ${firstTool}({ /* params */ });\n\n// Disconnect when done\nawait disconnect${pascal}();\n\\`\\`\\`\n${instructionsSection}`;\n}\n\n/**\n * Generate complete TypeScript package for an MCP server\n */\nfunction generateServerPackage(\n serverName: string,\n config: McpServerConfig,\n tools: McpTool[],\n instructions?: string\n): Map<string, string> {\n const files = new Map<string, string>();\n const normalized = normalizeServerName(serverName);\n const pascal = toPascalCase(normalized);\n\n // Generate types.ts with interfaces\n const typesContent = [\n '/**',\n ` * Type definitions for ${serverName} MCP tools`,\n ' */',\n '',\n 'export interface McpServerConfig {',\n ' command: string;',\n ' args?: string[];',\n ' env?: Record<string, string>;',\n '}',\n '',\n ...tools.map((tool) => generateParamsInterface(tool)),\n ].join('\\n');\n\n files.set('types.ts', typesContent);\n\n // Generate connection.ts with connection manager\n const connectionContent = generateConnectionManager(serverName, config);\n files.set('connection.ts', connectionContent);\n\n // Generate tools directory with individual tool files\n for (const tool of tools) {\n const toolContent = [\n '/**',\n ` * Tool: ${tool.name}`,\n tool.description ? ` * ${tool.description}` : '',\n ' */',\n '',\n `import type { ${toPascalCase(tool.name)}Params } from '../types';`,\n `import { get${pascal}Connection } from '../connection';`,\n '',\n generateToolFunction(tool, serverName),\n ]\n .filter(Boolean)\n .join('\\n');\n\n files.set(`tools/${tool.name}.ts`, toolContent);\n }\n\n // Generate tools/index.ts\n const toolExports = tools\n .map((tool) => `export { ${toCamelCase(tool.name)} } from './${tool.name}';`)\n .join('\\n');\n\n files.set(\n 'tools/index.ts',\n `/**\\n * Tool exports for ${serverName}\\n */\\n\\n${toolExports}\\n`\n );\n\n // Generate main index.ts\n const mainExports = [\n '/**',\n ` * ${serverName} MCP Server Tools`,\n ' *',\n ' * Auto-generated TypeScript wrappers for MCP tools.',\n ' */',\n '',\n '// Types',\n 'export * from \\'./types\\';',\n '',\n '// Connection management',\n 'export {',\n ` connect${pascal},`,\n ` disconnect${pascal},`,\n ` is${pascal}Connected,`,\n ` get${pascal}Connection,`,\n ` ${normalized}Config,`,\n '} from \\'./connection\\';',\n '',\n '// Tools',\n 'export * from \\'./tools\\';',\n ].join('\\n');\n\n files.set('index.ts', mainExports);\n\n // Generate SKILL.md\n files.set('SKILL.md', generateSkillMd(serverName, tools, instructions));\n\n return files;\n}\n\n/**\n * Generate MCP server package and upload to sandbox\n */\nexport async function generateMcpServerPackage(\n sandbox: SandboxConnection,\n serverName: string,\n config: McpServerConfig,\n tools: McpTool[],\n basePath: string,\n instructions?: string\n): Promise<McpGenerationResult> {\n const normalized = normalizeServerName(serverName);\n const remotePath = `${basePath}/${normalized}`;\n\n // Generate all files\n const files = generateServerPackage(serverName, config, tools, instructions);\n\n // Create directory structure in sandbox\n await sandbox.runCommand(`mkdir -p '${remotePath}/tools'`);\n\n // Upload all files\n for (const [filePath, content] of files) {\n const fullPath = `${remotePath}/${filePath}`;\n\n // Ensure parent directory exists\n const dir = fullPath.substring(0, fullPath.lastIndexOf('/'));\n if (dir !== remotePath) {\n await sandbox.runCommand(`mkdir -p '${dir}'`);\n }\n\n await sandbox.writeFile(fullPath, content);\n }\n\n return {\n serverName,\n remotePath,\n toolCount: tools.length,\n hasInstructions: !!instructions,\n };\n}\n\n/**\n * Introspect an MCP server to get available tools\n *\n * Note: This only works for stdio-based MCP servers that can be run locally.\n * For HTTP/SSE servers, use mock tools or the server's tools/list endpoint.\n */\nexport async function introspectMcpServer(\n config: McpServerConfig,\n timeout = 30000\n): Promise<McpServerInfo> {\n // Only stdio servers can be introspected by spawning a local process\n if (!isStdioMcpConfig(config)) {\n throw new Error(\n 'introspectMcpServer only supports stdio-based MCP servers. ' +\n 'HTTP/SSE servers cannot be introspected this way.'\n );\n }\n\n const stdioConfig = config as McpStdioServerConfig;\n\n // Create a simple introspection request\n // This is a simplified version - real implementation would use MCP protocol\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n proc?.kill();\n reject(new Error(`Timeout introspecting MCP server: ${stdioConfig.command}`));\n }, timeout);\n\n let proc: ChildProcess | null = null;\n\n try {\n // Start the MCP server process\n proc = spawn(stdioConfig.command, stdioConfig.args ?? [], {\n env: { ...process.env, ...stdioConfig.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n // For now, return a placeholder since proper MCP introspection\n // requires the full MCP client protocol implementation\n setTimeout(() => {\n clearTimeout(timer);\n proc?.kill();\n\n // Return placeholder tools based on common MCP patterns\n resolve({\n name: stdioConfig.command,\n tools: [],\n instructions: undefined,\n });\n }, 2000);\n\n proc.on('error', (error) => {\n clearTimeout(timer);\n reject(new Error(`Failed to start MCP server: ${error.message}`));\n });\n } catch (error) {\n clearTimeout(timer);\n reject(error);\n }\n });\n}\n\n/**\n * Generate MCP packages for multiple servers with predefined tool definitions\n */\nexport async function generateMcpServers(\n sandbox: SandboxConnection,\n servers: Record<string, McpServerConfig>,\n basePath: string,\n toolDefinitions?: Record<string, McpTool[]>\n): Promise<McpGenerationResult[]> {\n const results: McpGenerationResult[] = [];\n\n for (const [name, config] of Object.entries(servers)) {\n // Use predefined tools or generate placeholder\n const tools = toolDefinitions?.[name] ?? generatePlaceholderTools(name, config);\n\n const result = await generateMcpServerPackage(\n sandbox,\n name,\n config,\n tools,\n basePath\n );\n\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Generate placeholder tools for common MCP servers\n */\nfunction generatePlaceholderTools(name: string, _config: McpServerConfig): McpTool[] {\n // Common MCP server tool patterns\n const commonTools: Record<string, McpTool[]> = {\n playwright: [\n {\n name: 'browser_navigate',\n description: 'Navigate to a URL',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'The URL to navigate to' },\n },\n required: ['url'],\n },\n },\n {\n name: 'browser_click',\n description: 'Click an element on the page',\n inputSchema: {\n type: 'object',\n properties: {\n selector: { type: 'string', description: 'CSS selector of the element' },\n },\n required: ['selector'],\n },\n },\n {\n name: 'browser_screenshot',\n description: 'Take a screenshot of the page',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to save the screenshot' },\n },\n },\n },\n ],\n filesystem: [\n {\n name: 'read_file',\n description: 'Read contents of a file',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file' },\n },\n required: ['path'],\n },\n },\n {\n name: 'write_file',\n description: 'Write contents to a file',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the file' },\n content: { type: 'string', description: 'Content to write' },\n },\n required: ['path', 'content'],\n },\n },\n {\n name: 'list_directory',\n description: 'List files in a directory',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to the directory' },\n },\n required: ['path'],\n },\n },\n ],\n github: [\n {\n name: 'create_issue',\n description: 'Create a GitHub issue',\n inputSchema: {\n type: 'object',\n properties: {\n repo: { type: 'string', description: 'Repository (owner/name)' },\n title: { type: 'string', description: 'Issue title' },\n body: { type: 'string', description: 'Issue body' },\n },\n required: ['repo', 'title'],\n },\n },\n {\n name: 'create_pull_request',\n description: 'Create a pull request',\n inputSchema: {\n type: 'object',\n properties: {\n repo: { type: 'string', description: 'Repository (owner/name)' },\n title: { type: 'string', description: 'PR title' },\n head: { type: 'string', description: 'Head branch' },\n base: { type: 'string', description: 'Base branch' },\n },\n required: ['repo', 'title', 'head', 'base'],\n },\n },\n ],\n };\n\n // Check for known server patterns\n const lowerName = name.toLowerCase();\n for (const [pattern, tools] of Object.entries(commonTools)) {\n if (lowerName.includes(pattern)) {\n return tools;\n }\n }\n\n // Return generic placeholder\n return [\n {\n name: 'execute',\n description: `Execute a command on the ${name} server`,\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Command to execute' },\n args: { type: 'object', description: 'Command arguments' },\n },\n required: ['command'],\n },\n },\n ];\n}\n","/**\n * Workspace\n *\n * Persistent, version-controlled sandbox for AI agents.\n * Handles the infrastructure: load state, save state, setup MCP servers, manage skills.\n *\n * @example\n * ```typescript\n * import { Workspace, LocalBundleStore } from '@ash-cloud/ash-ai';\n *\n * const store = new LocalBundleStore({ directory: '/tmp/workspaces' });\n *\n * const workspace = new Workspace({\n * workspaceId: 'my-workspace',\n * sandbox,\n * store,\n * mcpServers: {\n * playwright: { command: 'npx', args: ['@playwright/mcp@latest'] }\n * },\n * generateMcpTools: true,\n * });\n *\n * await workspace.load();\n *\n * // Use sandbox for work...\n * sandbox.runCommand('echo \"Hello, world!\" > hello.txt');\n *\n * await workspace.save();\n * ```\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type {\n WorkspaceConfig,\n SandboxConnection,\n BundleStore,\n SkillsConfig,\n WorkspaceLoadResult,\n WorkspaceSaveResult,\n} from './types.js';\nimport type { McpServerConfig } from '../mcp/index.js';\nimport { SandboxGitRepo } from './git-repo.js';\nimport { SkillCatalog } from './skill-catalog.js';\nimport { loadWorkspaceState, saveWorkspaceState } from './persistence.js';\nimport {\n loadGitHubSkills,\n normalizeGitHubConfigs,\n type GitHubSkillResult,\n} from './github-skills.js';\nimport {\n generateMcpServers,\n type McpGenerationResult,\n} from './mcp-generator.js';\n\n/** Items to filter when uploading skills */\nconst FILTERED_ITEMS = new Set([\n '.DS_Store',\n 'Thumbs.db',\n '__pycache__',\n '.git',\n '.gitignore',\n '.pytest_cache',\n 'node_modules',\n]);\n\n/**\n * Shell-escape a string\n */\nfunction shellQuote(str: string): string {\n if (/^[a-zA-Z0-9._\\-/]+$/.test(str)) {\n return str;\n }\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Persistent, version-controlled workspace for AI agents.\n */\nexport class Workspace {\n readonly workspaceId: string;\n readonly sandbox: SandboxConnection;\n\n private readonly store: BundleStore;\n private readonly repoRoot: string;\n private readonly mcpServers: Record<string, McpServerConfig>;\n private readonly generateMcpTools: boolean;\n private readonly skillsConfig: SkillsConfig;\n private readonly loadSkillsOnStart: boolean;\n\n private gitRepo: SandboxGitRepo | null = null;\n private _skillCatalog: SkillCatalog | null = null;\n private _isLoaded = false;\n\n constructor(config: WorkspaceConfig) {\n this.workspaceId = config.workspaceId;\n this.sandbox = config.sandbox;\n this.store = config.store;\n this.repoRoot = config.repoRoot ?? config.sandbox.defaultRepoRoot;\n this.mcpServers = config.mcpServers ?? {};\n this.generateMcpTools = config.generateMcpTools ?? false;\n this.skillsConfig = config.skills ?? {};\n this.loadSkillsOnStart = config.loadSkills ?? false;\n }\n\n /**\n * Load workspace state from storage into sandbox.\n *\n * Downloads bundle from storage if it exists and restores the git repository.\n * If no bundle exists, initializes a fresh repository.\n * Sets up MCP servers and skills if configured.\n */\n async load(): Promise<WorkspaceLoadResult> {\n if (this._isLoaded) {\n throw new Error(\n `Workspace ${this.workspaceId} is already loaded. ` +\n 'Call save() and create a new Workspace instance to reload.'\n );\n }\n\n // Load or initialize repository\n const { gitRepo, restored, commitCount } = await loadWorkspaceState(\n this.workspaceId,\n this.sandbox,\n this.store,\n this.repoRoot\n );\n this.gitRepo = gitRepo;\n\n // Setup MCP servers if configured\n if (this.generateMcpTools && Object.keys(this.mcpServers).length > 0) {\n await this.setupMcpServers(this.mcpServers);\n }\n\n // Setup skills if configured\n if (this.loadSkillsOnStart && Object.keys(this.skillsConfig).length > 0) {\n await this.setupSkills(this.skillsConfig);\n }\n\n // Scan for skills\n this._skillCatalog = new SkillCatalog(this.sandbox, this.repoRoot);\n const skillCount = await this._skillCatalog.scan();\n\n this._isLoaded = true;\n\n return {\n restored,\n commitCount,\n skillCount,\n };\n }\n\n /**\n * Save workspace state from sandbox to storage.\n *\n * Commits pending changes, creates a git bundle, and uploads to storage.\n */\n async save(commitMessage?: string): Promise<WorkspaceSaveResult> {\n if (!this._isLoaded || !this.gitRepo) {\n throw new Error(\n `Workspace ${this.workspaceId} is not loaded. Call load() first.`\n );\n }\n\n return saveWorkspaceState(\n this.workspaceId,\n this.sandbox,\n this.gitRepo,\n this.store,\n commitMessage\n );\n }\n\n /**\n * Setup MCP servers and generate TypeScript tool wrappers.\n *\n * Creates TypeScript wrappers for MCP tools at src/servers/<server-name>/.\n * Each server gets its own package with types, connection manager, and tool functions.\n */\n async setupMcpServers(\n serversConfig: Record<string, McpServerConfig>\n ): Promise<McpGenerationResult[]> {\n if (!this.gitRepo) {\n throw new Error(\n `Workspace ${this.workspaceId} repository not initialized. Call load() first.`\n );\n }\n\n const serversBase = `${this.repoRoot}/src/servers`;\n\n // Use the MCP generator to create full TypeScript packages\n const results = await generateMcpServers(\n this.sandbox,\n serversConfig,\n serversBase\n );\n\n return results;\n }\n\n /**\n * Setup skills by uploading skill folders to the sandbox.\n *\n * Supports local filesystem paths and GitHub repositories.\n * Skills are uploaded to src/skills/<skill-name>/.\n */\n async setupSkills(skillsConfig: SkillsConfig): Promise<{\n local: Map<string, string>;\n github: GitHubSkillResult[];\n errors: { source: string; error: Error }[];\n }> {\n if (!this.gitRepo) {\n throw new Error(\n `Workspace ${this.workspaceId} repository not initialized. Call load() first.`\n );\n }\n\n const localResults = new Map<string, string>();\n const githubResults: GitHubSkillResult[] = [];\n const errors: { source: string; error: Error }[] = [];\n const skillsBase = `${this.repoRoot}/src/skills`;\n\n // Create skills directory\n await this.sandbox.runCommand(`mkdir -p ${shellQuote(skillsBase)}`);\n\n // Process local skills\n const localPaths = normalizeToArray(skillsConfig.local);\n for (const localPath of localPaths) {\n try {\n if (!fs.existsSync(localPath)) {\n errors.push({\n source: localPath,\n error: new Error(`Path does not exist: ${localPath}`),\n });\n continue;\n }\n\n const stat = fs.statSync(localPath);\n if (!stat.isDirectory()) {\n errors.push({\n source: localPath,\n error: new Error(`Path is not a directory: ${localPath}`),\n });\n continue;\n }\n\n // Upload each skill directory\n const entries = fs.readdirSync(localPath);\n for (const entry of entries) {\n if (FILTERED_ITEMS.has(entry)) continue;\n\n const entryPath = path.join(localPath, entry);\n const entryStat = fs.statSync(entryPath);\n\n if (entryStat.isDirectory()) {\n const remotePath = `${skillsBase}/${entry}`;\n await this.sandbox.uploadDirectory(entryPath, remotePath, {\n exclude: FILTERED_ITEMS,\n });\n localResults.set(entry, remotePath);\n }\n }\n } catch (error) {\n errors.push({\n source: localPath,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n // Process GitHub skills using the full git clone implementation\n const githubConfigs = normalizeGitHubConfigs(skillsConfig.github);\n if (githubConfigs.length > 0) {\n const { results, errors: githubErrors } = await loadGitHubSkills(\n this.sandbox,\n githubConfigs,\n skillsBase,\n { continueOnError: true }\n );\n\n githubResults.push(...results);\n\n for (const { config, error } of githubErrors) {\n errors.push({\n source: config.url,\n error,\n });\n }\n }\n\n return {\n local: localResults,\n github: githubResults,\n errors,\n };\n }\n\n /**\n * Check if workspace is loaded\n */\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Get the skill catalog (available after load)\n */\n get skillCatalog(): SkillCatalog | null {\n return this._skillCatalog;\n }\n\n /**\n * Get the repository root path\n */\n get repositoryRoot(): string {\n return this.repoRoot;\n }\n\n /**\n * Get a commit tool for use with runners.\n * Returns a function that commits and saves state.\n */\n getCommitTool(): (message: string) => Promise<WorkspaceSaveResult> {\n return async (message: string) => {\n return this.save(message);\n };\n }\n\n toString(): string {\n const status = this._isLoaded ? 'loaded' : 'not loaded';\n return `Workspace(id=${this.workspaceId}, status=${status})`;\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nfunction normalizeToArray<T>(value: T | T[] | undefined): T[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a new workspace instance\n */\nexport function createWorkspace(config: WorkspaceConfig): Workspace {\n return new Workspace(config);\n}\n","/**\n * Bundle Store Implementations\n *\n * Storage backends for persisting workspace state as git bundles.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { BundleStore } from './types.js';\n\n/**\n * Local filesystem bundle store.\n * Stores bundles in a directory on the local filesystem.\n */\nexport class LocalBundleStore implements BundleStore {\n private readonly directory: string;\n\n constructor(options: { directory: string }) {\n this.directory = options.directory;\n // Ensure directory exists\n if (!fs.existsSync(this.directory)) {\n fs.mkdirSync(this.directory, { recursive: true });\n }\n }\n\n keyForWorkspace(workspaceId: string): string {\n return path.join(this.directory, `${workspaceId}.bundle`);\n }\n\n downloadBundle(workspaceId: string, destPath: string): boolean {\n const bundlePath = this.keyForWorkspace(workspaceId);\n\n if (!fs.existsSync(bundlePath)) {\n return false;\n }\n\n // Ensure destination directory exists\n const destDir = path.dirname(destPath);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.copyFileSync(bundlePath, destPath);\n return true;\n }\n\n uploadBundle(workspaceId: string, srcPath: string): void {\n if (!fs.existsSync(srcPath)) {\n throw new Error(`Source bundle not found: ${srcPath}`);\n }\n\n const bundlePath = this.keyForWorkspace(workspaceId);\n\n // Ensure directory exists\n const bundleDir = path.dirname(bundlePath);\n if (!fs.existsSync(bundleDir)) {\n fs.mkdirSync(bundleDir, { recursive: true });\n }\n\n fs.copyFileSync(srcPath, bundlePath);\n }\n\n exists(workspaceId: string): boolean {\n return fs.existsSync(this.keyForWorkspace(workspaceId));\n }\n\n deleteBundle(workspaceId: string): void {\n const bundlePath = this.keyForWorkspace(workspaceId);\n if (fs.existsSync(bundlePath)) {\n fs.unlinkSync(bundlePath);\n }\n }\n\n listWorkspaces(): string[] {\n if (!fs.existsSync(this.directory)) {\n return [];\n }\n\n return fs\n .readdirSync(this.directory)\n .filter((file) => file.endsWith('.bundle'))\n .map((file) => file.replace('.bundle', ''));\n }\n}\n\n/**\n * In-memory bundle store for testing.\n */\nexport class MemoryBundleStore implements BundleStore {\n private bundles: Map<string, Buffer> = new Map();\n\n keyForWorkspace(workspaceId: string): string {\n return workspaceId;\n }\n\n downloadBundle(workspaceId: string, destPath: string): boolean {\n const bundle = this.bundles.get(workspaceId);\n if (!bundle) {\n return false;\n }\n\n const destDir = path.dirname(destPath);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, bundle);\n return true;\n }\n\n uploadBundle(workspaceId: string, srcPath: string): void {\n if (!fs.existsSync(srcPath)) {\n throw new Error(`Source bundle not found: ${srcPath}`);\n }\n\n const content = fs.readFileSync(srcPath);\n this.bundles.set(workspaceId, content);\n }\n\n exists(workspaceId: string): boolean {\n return this.bundles.has(workspaceId);\n }\n\n deleteBundle(workspaceId: string): void {\n this.bundles.delete(workspaceId);\n }\n\n listWorkspaces(): string[] {\n return Array.from(this.bundles.keys());\n }\n\n /** Clear all bundles (useful for testing) */\n clear(): void {\n this.bundles.clear();\n }\n}\n\n/**\n * Create a local bundle store\n */\nexport function createLocalBundleStore(directory: string): LocalBundleStore {\n return new LocalBundleStore({ directory });\n}\n\n/**\n * Create an in-memory bundle store (for testing)\n */\nexport function createMemoryBundleStore(): MemoryBundleStore {\n return new MemoryBundleStore();\n}\n","/**\n * Supabase Bundle Store\n *\n * Storage backend for persisting workspace state to Supabase Storage.\n * Uses the existing Supabase infrastructure for simplified cloud storage.\n *\n * Requires @supabase/supabase-js to be installed:\n * ```\n * npm install @supabase/supabase-js\n * ```\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { BundleStore } from './types.js';\n\n/**\n * Supabase Storage configuration\n */\nexport interface SupabaseBundleStoreConfig {\n /** Supabase project URL */\n supabaseUrl: string;\n\n /** Supabase service role key (or anon key with appropriate RLS) */\n supabaseKey: string;\n\n /** Storage bucket name (defaults to 'workspaces') */\n bucket?: string;\n\n /** Key prefix for bundles (e.g., 'bundles/') */\n prefix?: string;\n}\n\n// Type definitions for Supabase client (to avoid requiring the package at compile time)\ninterface SupabaseStorageFileApi {\n upload(\n path: string,\n file: Buffer | Blob,\n options?: { contentType?: string; upsert?: boolean }\n ): Promise<{ data: { path: string } | null; error: Error | null }>;\n download(path: string): Promise<{ data: Blob | null; error: Error | null }>;\n remove(paths: string[]): Promise<{ data: unknown; error: Error | null }>;\n list(\n path?: string,\n options?: { limit?: number; offset?: number }\n ): Promise<{ data: { name: string }[] | null; error: Error | null }>;\n}\n\ninterface SupabaseStorage {\n from(bucket: string): SupabaseStorageFileApi;\n}\n\ninterface SupabaseClient {\n storage: SupabaseStorage;\n}\n\ninterface SupabaseModule {\n createClient: (url: string, key: string) => SupabaseClient;\n}\n\n/**\n * Supabase Storage bundle store.\n *\n * Stores workspace git bundles in Supabase Storage for cloud persistence.\n * This is the recommended cloud storage option when using Supabase.\n *\n * @example\n * ```typescript\n * import { SupabaseBundleStore } from '@ash-cloud/ash-ai';\n *\n * const store = new SupabaseBundleStore({\n * supabaseUrl: process.env.SUPABASE_URL!,\n * supabaseKey: process.env.SUPABASE_SERVICE_KEY!,\n * bucket: 'workspaces',\n * });\n *\n * const workspace = new Workspace({\n * workspaceId: 'my-workspace',\n * sandbox,\n * store,\n * });\n * ```\n */\nexport class SupabaseBundleStore implements BundleStore {\n private readonly supabaseUrl: string;\n private readonly supabaseKey: string;\n private readonly bucket: string;\n private readonly prefix: string;\n private client: SupabaseClient | null = null;\n\n constructor(config: SupabaseBundleStoreConfig) {\n this.supabaseUrl = config.supabaseUrl;\n this.supabaseKey = config.supabaseKey;\n this.bucket = config.bucket ?? 'workspaces';\n this.prefix = config.prefix ?? 'bundles/';\n }\n\n /**\n * Lazily initialize the Supabase client\n */\n private async ensureClient(): Promise<SupabaseClient> {\n if (this.client) {\n return this.client;\n }\n\n try {\n // Dynamic import for better tree-shaking when not used\n const { createClient } = (await import('@supabase/supabase-js')) as SupabaseModule;\n\n this.client = createClient(this.supabaseUrl, this.supabaseKey);\n return this.client;\n } catch {\n throw new Error(\n 'SupabaseBundleStore requires @supabase/supabase-js. Install with: npm install @supabase/supabase-js'\n );\n }\n }\n\n /**\n * Get the storage path for a workspace\n */\n keyForWorkspace(workspaceId: string): string {\n return `${this.prefix}${workspaceId}.bundle`;\n }\n\n async downloadBundle(workspaceId: string, destPath: string): Promise<boolean> {\n const client = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n const { data, error } = await client.storage.from(this.bucket).download(key);\n\n if (error) {\n // Check if it's a \"not found\" error\n if (error.message?.includes('not found') || error.message?.includes('Object not found')) {\n return false;\n }\n throw error;\n }\n\n if (!data) {\n return false;\n }\n\n // Ensure directory exists\n const dir = path.dirname(destPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Convert Blob to Buffer and write to file\n const arrayBuffer = await data.arrayBuffer();\n fs.writeFileSync(destPath, Buffer.from(arrayBuffer));\n\n return true;\n }\n\n async uploadBundle(workspaceId: string, srcPath: string): Promise<void> {\n if (!fs.existsSync(srcPath)) {\n throw new Error(`Source bundle not found: ${srcPath}`);\n }\n\n const client = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n const content = fs.readFileSync(srcPath);\n\n const { error } = await client.storage.from(this.bucket).upload(key, content, {\n contentType: 'application/octet-stream',\n upsert: true, // Overwrite if exists\n });\n\n if (error) {\n throw error;\n }\n }\n\n async exists(workspaceId: string): Promise<boolean> {\n const client = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n // Try to download with a small range to check existence\n const { error } = await client.storage.from(this.bucket).download(key);\n\n if (error) {\n if (error.message?.includes('not found') || error.message?.includes('Object not found')) {\n return false;\n }\n // For other errors, we might want to throw or return false\n return false;\n }\n\n return true;\n }\n\n async deleteBundle(workspaceId: string): Promise<void> {\n const client = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n const { error } = await client.storage.from(this.bucket).remove([key]);\n\n if (error) {\n throw error;\n }\n }\n\n async listWorkspaces(): Promise<string[]> {\n const client = await this.ensureClient();\n\n const { data, error } = await client.storage.from(this.bucket).list(this.prefix, {\n limit: 1000,\n });\n\n if (error) {\n throw error;\n }\n\n if (!data) {\n return [];\n }\n\n return data\n .filter((file) => file.name.endsWith('.bundle'))\n .map((file) => file.name.replace('.bundle', ''));\n }\n}\n\n/**\n * Create a Supabase bundle store\n *\n * @example\n * ```typescript\n * const store = createSupabaseBundleStore({\n * supabaseUrl: process.env.SUPABASE_URL!,\n * supabaseKey: process.env.SUPABASE_SERVICE_KEY!,\n * });\n * ```\n */\nexport function createSupabaseBundleStore(\n config: SupabaseBundleStoreConfig\n): SupabaseBundleStore {\n return new SupabaseBundleStore(config);\n}\n\n/**\n * Create a Supabase bundle store from environment variables\n *\n * Requires SUPABASE_URL and SUPABASE_SERVICE_KEY (or SUPABASE_KEY) to be set.\n *\n * @example\n * ```typescript\n * const store = createSupabaseBundleStoreFromEnv();\n * ```\n */\nexport function createSupabaseBundleStoreFromEnv(options?: {\n bucket?: string;\n prefix?: string;\n}): SupabaseBundleStore {\n const supabaseUrl = process.env.SUPABASE_URL;\n const supabaseKey =\n process.env.SUPABASE_SERVICE_KEY ||\n process.env.SUPABASE_SECRET_KEY ||\n process.env.SUPABASE_KEY;\n\n if (!supabaseUrl) {\n throw new Error('SUPABASE_URL environment variable is required');\n }\n\n if (!supabaseKey) {\n throw new Error(\n 'SUPABASE_SERVICE_KEY, SUPABASE_SECRET_KEY, or SUPABASE_KEY environment variable is required'\n );\n }\n\n return new SupabaseBundleStore({\n supabaseUrl,\n supabaseKey,\n bucket: options?.bucket,\n prefix: options?.prefix,\n });\n}\n","/**\n * Cloud Bundle Stores\n *\n * Storage backends for persisting workspace state to cloud storage services.\n * Supports S3-compatible storage (AWS S3, MinIO, R2, etc.) and Google Cloud Storage.\n *\n * Note: These stores require optional dependencies:\n * - S3: npm install @aws-sdk/client-s3\n * - GCS: npm install @google-cloud/storage\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { BundleStore } from './types.js';\n\n/**\n * S3-compatible storage configuration\n */\nexport interface S3BundleStoreConfig {\n /** S3 bucket name */\n bucket: string;\n\n /** Key prefix for bundles (e.g., 'workspaces/') */\n prefix?: string;\n\n /** AWS region */\n region?: string;\n\n /** Custom endpoint for S3-compatible services (MinIO, R2, etc.) */\n endpoint?: string;\n\n /** Access key ID */\n accessKeyId?: string;\n\n /** Secret access key */\n secretAccessKey?: string;\n\n /** Force path-style URLs (required for some S3-compatible services) */\n forcePathStyle?: boolean;\n}\n\n// Type definitions for AWS SDK (to avoid requiring the package)\ninterface S3ClientConfig {\n region?: string;\n endpoint?: string;\n credentials?: { accessKeyId: string; secretAccessKey: string };\n forcePathStyle?: boolean;\n}\n\ninterface S3Command {\n input: unknown;\n}\n\ninterface S3Client {\n send(command: S3Command): Promise<unknown>;\n}\n\ninterface S3Module {\n S3Client: new (config: S3ClientConfig) => S3Client;\n GetObjectCommand: new (input: unknown) => S3Command;\n PutObjectCommand: new (input: unknown) => S3Command;\n HeadObjectCommand: new (input: unknown) => S3Command;\n DeleteObjectCommand: new (input: unknown) => S3Command;\n ListObjectsV2Command: new (input: unknown) => S3Command;\n}\n\n/**\n * S3-compatible bundle store.\n *\n * Works with AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces, etc.\n *\n * Requires @aws-sdk/client-s3 to be installed:\n * ```\n * npm install @aws-sdk/client-s3\n * ```\n */\nexport class S3BundleStore implements BundleStore {\n private readonly bucket: string;\n private readonly prefix: string;\n private readonly config: S3BundleStoreConfig;\n private s3Client: S3Client | null = null;\n private s3Module: S3Module | null = null;\n\n constructor(config: S3BundleStoreConfig) {\n this.bucket = config.bucket;\n this.prefix = config.prefix ?? 'workspaces/';\n this.config = config;\n }\n\n /**\n * Lazily load the S3 module and initialize client\n */\n private async ensureClient(): Promise<{ client: S3Client; module: S3Module }> {\n if (this.s3Client && this.s3Module) {\n return { client: this.s3Client, module: this.s3Module };\n }\n\n try {\n // Dynamic import - optional dependency\n // @ts-expect-error - @aws-sdk/client-s3 is an optional dependency\n this.s3Module = await import('@aws-sdk/client-s3') as unknown as S3Module;\n\n this.s3Client = new this.s3Module.S3Client({\n region: this.config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: this.config.endpoint,\n credentials: this.config.accessKeyId\n ? {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey ?? '',\n }\n : undefined,\n forcePathStyle: this.config.forcePathStyle,\n });\n\n return { client: this.s3Client, module: this.s3Module };\n } catch {\n throw new Error(\n 'S3BundleStore requires @aws-sdk/client-s3. Install with: npm install @aws-sdk/client-s3'\n );\n }\n }\n\n keyForWorkspace(workspaceId: string): string {\n return `${this.prefix}${workspaceId}.bundle`;\n }\n\n async downloadBundle(workspaceId: string, destPath: string): Promise<boolean> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n try {\n const response = await client.send(\n new module.GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n ) as { Body?: { transformToByteArray: () => Promise<Uint8Array> } };\n\n const body = response.Body;\n if (!body) {\n return false;\n }\n\n const bytes = await body.transformToByteArray();\n\n // Ensure directory exists\n const dir = path.dirname(destPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(destPath, Buffer.from(bytes));\n return true;\n } catch (error: unknown) {\n const err = error as { name?: string };\n if (err.name === 'NoSuchKey' || err.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async uploadBundle(workspaceId: string, srcPath: string): Promise<void> {\n if (!fs.existsSync(srcPath)) {\n throw new Error(`Source bundle not found: ${srcPath}`);\n }\n\n const { client, module } = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n const content = fs.readFileSync(srcPath);\n\n await client.send(\n new module.PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: content,\n ContentType: 'application/octet-stream',\n })\n );\n }\n\n async exists(workspaceId: string): Promise<boolean> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n try {\n await client.send(\n new module.HeadObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n );\n return true;\n } catch (error: unknown) {\n const err = error as { name?: string };\n if (err.name === 'NotFound' || err.name === 'NoSuchKey') {\n return false;\n }\n throw error;\n }\n }\n\n async deleteBundle(workspaceId: string): Promise<void> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForWorkspace(workspaceId);\n\n await client.send(\n new module.DeleteObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n );\n }\n\n async listWorkspaces(): Promise<string[]> {\n const { client, module } = await this.ensureClient();\n\n const workspaces: string[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = (await client.send(\n new module.ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: this.prefix,\n ContinuationToken: continuationToken,\n })\n )) as {\n Contents?: { Key?: string }[];\n IsTruncated?: boolean;\n NextContinuationToken?: string;\n };\n\n for (const obj of response.Contents ?? []) {\n if (obj.Key?.endsWith('.bundle')) {\n const key = obj.Key.slice(this.prefix.length);\n const workspaceId = key.replace('.bundle', '');\n workspaces.push(workspaceId);\n }\n }\n\n continuationToken = response.IsTruncated\n ? response.NextContinuationToken\n : undefined;\n } while (continuationToken);\n\n return workspaces;\n }\n}\n\n/**\n * Google Cloud Storage configuration\n */\nexport interface GCSBundleStoreConfig {\n /** GCS bucket name */\n bucket: string;\n\n /** Key prefix for bundles */\n prefix?: string;\n\n /** Path to service account key file */\n keyFilePath?: string;\n\n /** Project ID */\n projectId?: string;\n}\n\n// Type definitions for GCS (to avoid requiring the package)\ninterface GCSFile {\n exists(): Promise<[boolean]>;\n download(options: { destination: string }): Promise<void>;\n save(content: Buffer): Promise<void>;\n delete(): Promise<void>;\n name: string;\n}\n\ninterface GCSBucket {\n file(name: string): GCSFile;\n getFiles(options: { prefix: string }): Promise<[GCSFile[]]>;\n}\n\ninterface GCSStorage {\n bucket(name: string): GCSBucket;\n}\n\ninterface GCSModule {\n Storage: new (options?: { keyFilename?: string; projectId?: string }) => GCSStorage;\n}\n\n/**\n * Google Cloud Storage bundle store.\n *\n * Requires @google-cloud/storage to be installed:\n * ```\n * npm install @google-cloud/storage\n * ```\n */\nexport class GCSBundleStore implements BundleStore {\n private readonly bucket: string;\n private readonly prefix: string;\n private readonly config: GCSBundleStoreConfig;\n private storage: GCSStorage | null = null;\n\n constructor(config: GCSBundleStoreConfig) {\n this.bucket = config.bucket;\n this.prefix = config.prefix ?? 'workspaces/';\n this.config = config;\n }\n\n private async ensureStorage(): Promise<GCSStorage> {\n if (this.storage) {\n return this.storage;\n }\n\n try {\n // Dynamic import - optional dependency\n // @ts-expect-error - @google-cloud/storage is an optional dependency\n const gcsModule = await import('@google-cloud/storage') as unknown as GCSModule;\n\n this.storage = new gcsModule.Storage({\n keyFilename: this.config.keyFilePath,\n projectId: this.config.projectId,\n });\n\n return this.storage;\n } catch {\n throw new Error(\n 'GCSBundleStore requires @google-cloud/storage. Install with: npm install @google-cloud/storage'\n );\n }\n }\n\n keyForWorkspace(workspaceId: string): string {\n return `${this.prefix}${workspaceId}.bundle`;\n }\n\n async downloadBundle(workspaceId: string, destPath: string): Promise<boolean> {\n const storage = await this.ensureStorage();\n const key = this.keyForWorkspace(workspaceId);\n\n try {\n const file = storage.bucket(this.bucket).file(key);\n const [exists] = await file.exists();\n\n if (!exists) {\n return false;\n }\n\n // Ensure directory exists\n const dir = path.dirname(destPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n await file.download({ destination: destPath });\n return true;\n } catch {\n return false;\n }\n }\n\n async uploadBundle(workspaceId: string, srcPath: string): Promise<void> {\n if (!fs.existsSync(srcPath)) {\n throw new Error(`Source bundle not found: ${srcPath}`);\n }\n\n const storage = await this.ensureStorage();\n const key = this.keyForWorkspace(workspaceId);\n const content = fs.readFileSync(srcPath);\n\n const file = storage.bucket(this.bucket).file(key);\n await file.save(content);\n }\n\n async exists(workspaceId: string): Promise<boolean> {\n const storage = await this.ensureStorage();\n const key = this.keyForWorkspace(workspaceId);\n\n const file = storage.bucket(this.bucket).file(key);\n const [exists] = await file.exists();\n return exists;\n }\n\n async deleteBundle(workspaceId: string): Promise<void> {\n const storage = await this.ensureStorage();\n const key = this.keyForWorkspace(workspaceId);\n\n const file = storage.bucket(this.bucket).file(key);\n await file.delete();\n }\n\n async listWorkspaces(): Promise<string[]> {\n const storage = await this.ensureStorage();\n\n const [files] = await storage.bucket(this.bucket).getFiles({\n prefix: this.prefix,\n });\n\n return files\n .filter((file) => file.name.endsWith('.bundle'))\n .map((file) => {\n const key = file.name.slice(this.prefix.length);\n return key.replace('.bundle', '');\n });\n }\n}\n\n/**\n * Create an S3-compatible bundle store\n */\nexport function createS3BundleStore(config: S3BundleStoreConfig): S3BundleStore {\n return new S3BundleStore(config);\n}\n\n/**\n * Create a Google Cloud Storage bundle store\n */\nexport function createGCSBundleStore(config: GCSBundleStoreConfig): GCSBundleStore {\n return new GCSBundleStore(config);\n}\n\n/**\n * Create an S3 bundle store for Cloudflare R2\n */\nexport function createR2BundleStore(config: {\n accountId: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix?: string;\n}): S3BundleStore {\n return new S3BundleStore({\n bucket: config.bucket,\n prefix: config.prefix,\n endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n forcePathStyle: true,\n });\n}\n\n/**\n * Create an S3 bundle store for MinIO\n */\nexport function createMinioBundleStore(config: {\n endpoint: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix?: string;\n}): S3BundleStore {\n return new S3BundleStore({\n bucket: config.bucket,\n prefix: config.prefix,\n endpoint: config.endpoint,\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n forcePathStyle: true,\n });\n}\n","/**\n * File Store\n *\n * Storage backend for individual session files.\n * Unlike BundleStore (for git bundles), FileStore handles individual files\n * with support for read, write, list, and delete operations.\n *\n * Primary implementation is S3FileStore for AWS S3 / S3-compatible storage.\n *\n * Note: Requires @aws-sdk/client-s3 to be installed:\n * ```\n * npm install @aws-sdk/client-s3\n * ```\n */\n\n/**\n * File metadata returned from list operations\n */\nexport interface FileMetadata {\n /** File path relative to session prefix */\n path: string;\n /** File size in bytes */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * Abstract interface for storing and retrieving individual files.\n * Implementations persist to different backends (S3, R2, etc.)\n */\nexport interface FileStore {\n /**\n * Write a file to storage\n * @param sessionId - Session identifier\n * @param path - File path within the session (e.g., 'data/input.csv')\n * @param content - File content as Buffer\n */\n writeFile(sessionId: string, path: string, content: Buffer): Promise<void>;\n\n /**\n * Read a file from storage\n * @returns File content as Buffer, or null if not found\n */\n readFile(sessionId: string, path: string): Promise<Buffer | null>;\n\n /**\n * Check if a file exists\n */\n exists(sessionId: string, path: string): Promise<boolean>;\n\n /**\n * Delete a file from storage\n */\n deleteFile(sessionId: string, path: string): Promise<void>;\n\n /**\n * List files for a session\n * @param prefix - Optional prefix to filter files\n * @returns Array of file metadata\n */\n listFiles(sessionId: string, prefix?: string): Promise<FileMetadata[]>;\n\n /**\n * Delete all files for a session\n */\n deleteSession(sessionId: string): Promise<void>;\n\n /**\n * Get a signed URL for direct download\n * @param expiresIn - URL expiration in seconds (default: 3600)\n */\n getSignedUrl(sessionId: string, path: string, expiresIn?: number): Promise<string>;\n\n /**\n * Get a signed URL for direct upload\n * @param expiresIn - URL expiration in seconds (default: 3600)\n */\n getUploadUrl(sessionId: string, path: string, expiresIn?: number): Promise<string>;\n}\n\n/**\n * S3-compatible file store configuration\n */\nexport interface S3FileStoreConfig {\n /** S3 bucket name */\n bucket: string;\n\n /** Key prefix for files (e.g., 'sessions/') */\n prefix?: string;\n\n /** AWS region */\n region?: string;\n\n /** Custom endpoint for S3-compatible services (R2, MinIO, etc.) */\n endpoint?: string;\n\n /** Access key ID */\n accessKeyId?: string;\n\n /** Secret access key */\n secretAccessKey?: string;\n\n /** Force path-style URLs (required for some S3-compatible services) */\n forcePathStyle?: boolean;\n}\n\n// Type definitions for AWS SDK (to avoid requiring the package at compile time)\ninterface S3ClientConfig {\n region?: string;\n endpoint?: string;\n credentials?: { accessKeyId: string; secretAccessKey: string };\n forcePathStyle?: boolean;\n}\n\ninterface S3Command {\n input: unknown;\n}\n\ninterface S3Client {\n send(command: S3Command): Promise<unknown>;\n}\n\ninterface S3Module {\n S3Client: new (config: S3ClientConfig) => S3Client;\n GetObjectCommand: new (input: unknown) => S3Command;\n PutObjectCommand: new (input: unknown) => S3Command;\n HeadObjectCommand: new (input: unknown) => S3Command;\n DeleteObjectCommand: new (input: unknown) => S3Command;\n DeleteObjectsCommand: new (input: unknown) => S3Command;\n ListObjectsV2Command: new (input: unknown) => S3Command;\n}\n\ninterface S3PresignerModule {\n getSignedUrl: (client: S3Client, command: S3Command, options: { expiresIn: number }) => Promise<string>;\n}\n\n/**\n * S3-compatible file store implementation.\n *\n * Works with AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces, etc.\n */\nexport class S3FileStore implements FileStore {\n private readonly bucket: string;\n private readonly prefix: string;\n private readonly config: S3FileStoreConfig;\n private s3Client: S3Client | null = null;\n private s3Module: S3Module | null = null;\n private presignerModule: S3PresignerModule | null = null;\n\n constructor(config: S3FileStoreConfig) {\n this.bucket = config.bucket;\n this.prefix = config.prefix ?? 'sessions/';\n this.config = config;\n }\n\n /**\n * Lazily load the S3 module and initialize client\n */\n private async ensureClient(): Promise<{ client: S3Client; module: S3Module; presigner: S3PresignerModule }> {\n if (this.s3Client && this.s3Module && this.presignerModule) {\n return { client: this.s3Client, module: this.s3Module, presigner: this.presignerModule };\n }\n\n try {\n // Dynamic import - optional dependency\n // @ts-expect-error - @aws-sdk/client-s3 is an optional dependency\n this.s3Module = (await import('@aws-sdk/client-s3')) as unknown as S3Module;\n // @ts-expect-error - @aws-sdk/s3-request-presigner is an optional dependency\n this.presignerModule = (await import('@aws-sdk/s3-request-presigner')) as unknown as S3PresignerModule;\n\n this.s3Client = new this.s3Module.S3Client({\n region: this.config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: this.config.endpoint,\n credentials: this.config.accessKeyId\n ? {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey ?? '',\n }\n : undefined,\n forcePathStyle: this.config.forcePathStyle,\n });\n\n return { client: this.s3Client, module: this.s3Module, presigner: this.presignerModule };\n } catch {\n throw new Error(\n 'S3FileStore requires @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner. Install with: npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner'\n );\n }\n }\n\n /**\n * Generate the S3 key for a file\n */\n private keyForFile(sessionId: string, path: string): string {\n // Normalize path - remove leading slashes\n const normalizedPath = path.replace(/^\\/+/, '');\n return `${this.prefix}${sessionId}/${normalizedPath}`;\n }\n\n async writeFile(sessionId: string, path: string, content: Buffer): Promise<void> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n await client.send(\n new module.PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: content,\n ContentType: this.getMimeType(path),\n })\n );\n }\n\n async readFile(sessionId: string, path: string): Promise<Buffer | null> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n try {\n const response = (await client.send(\n new module.GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n )) as { Body?: { transformToByteArray: () => Promise<Uint8Array> } };\n\n const body = response.Body;\n if (!body) {\n return null;\n }\n\n const bytes = await body.transformToByteArray();\n return Buffer.from(bytes);\n } catch (error: unknown) {\n const err = error as { name?: string };\n if (err.name === 'NoSuchKey' || err.name === 'NotFound') {\n return null;\n }\n throw error;\n }\n }\n\n async exists(sessionId: string, path: string): Promise<boolean> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n try {\n await client.send(\n new module.HeadObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n );\n return true;\n } catch (error: unknown) {\n const err = error as { name?: string };\n if (err.name === 'NotFound' || err.name === 'NoSuchKey') {\n return false;\n }\n throw error;\n }\n }\n\n async deleteFile(sessionId: string, path: string): Promise<void> {\n const { client, module } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n await client.send(\n new module.DeleteObjectCommand({\n Bucket: this.bucket,\n Key: key,\n })\n );\n }\n\n async listFiles(sessionId: string, prefix?: string): Promise<FileMetadata[]> {\n const { client, module } = await this.ensureClient();\n const basePrefix = this.keyForFile(sessionId, prefix ?? '');\n\n const files: FileMetadata[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = (await client.send(\n new module.ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: basePrefix,\n ContinuationToken: continuationToken,\n })\n )) as {\n Contents?: { Key?: string; Size?: number; LastModified?: Date }[];\n IsTruncated?: boolean;\n NextContinuationToken?: string;\n };\n\n for (const obj of response.Contents ?? []) {\n if (obj.Key) {\n // Extract path relative to session prefix\n const sessionPrefix = `${this.prefix}${sessionId}/`;\n const relativePath = obj.Key.slice(sessionPrefix.length);\n\n files.push({\n path: relativePath,\n size: obj.Size ?? 0,\n lastModified: obj.LastModified ?? new Date(),\n });\n }\n }\n\n continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;\n } while (continuationToken);\n\n return files;\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n const { client, module } = await this.ensureClient();\n const prefix = `${this.prefix}${sessionId}/`;\n\n // List all objects with the session prefix\n const files = await this.listFiles(sessionId);\n\n if (files.length === 0) {\n return;\n }\n\n // Delete in batches of 1000 (S3 limit)\n const batchSize = 1000;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n const objects = batch.map((f) => ({ Key: `${prefix}${f.path}` }));\n\n await client.send(\n new module.DeleteObjectsCommand({\n Bucket: this.bucket,\n Delete: { Objects: objects },\n })\n );\n }\n }\n\n async getSignedUrl(sessionId: string, path: string, expiresIn: number = 3600): Promise<string> {\n const { client, module, presigner } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n const command = new module.GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n return presigner.getSignedUrl(client, command, { expiresIn });\n }\n\n async getUploadUrl(sessionId: string, path: string, expiresIn: number = 3600): Promise<string> {\n const { client, module, presigner } = await this.ensureClient();\n const key = this.keyForFile(sessionId, path);\n\n const command = new module.PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n ContentType: this.getMimeType(path),\n });\n\n return presigner.getSignedUrl(client, command, { expiresIn });\n }\n\n /**\n * Get MIME type based on file extension\n */\n private getMimeType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase();\n const mimeTypes: Record<string, string> = {\n // Text\n txt: 'text/plain',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n html: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'text/typescript',\n md: 'text/markdown',\n yaml: 'text/yaml',\n yml: 'text/yaml',\n // Images\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n // Archives\n zip: 'application/zip',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n // Binary\n bin: 'application/octet-stream',\n };\n\n return mimeTypes[ext ?? ''] ?? 'application/octet-stream';\n }\n}\n\n/**\n * Create an S3 file store\n */\nexport function createS3FileStore(config: S3FileStoreConfig): S3FileStore {\n return new S3FileStore(config);\n}\n\n/**\n * Create an S3 file store for Cloudflare R2\n */\nexport function createR2FileStore(config: {\n accountId: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix?: string;\n}): S3FileStore {\n return new S3FileStore({\n bucket: config.bucket,\n prefix: config.prefix,\n endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n forcePathStyle: true,\n });\n}\n\n/**\n * Create an S3 file store for MinIO\n */\nexport function createMinioFileStore(config: {\n endpoint: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix?: string;\n}): S3FileStore {\n return new S3FileStore({\n bucket: config.bucket,\n prefix: config.prefix,\n endpoint: config.endpoint,\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n forcePathStyle: true,\n });\n}\n","/**\n * Local Sandbox Connection\n *\n * A SandboxConnection implementation that runs commands on the local filesystem.\n * Useful for development and testing without a remote sandbox provider.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { execSync, type ExecSyncOptionsWithBufferEncoding } from 'node:child_process';\nimport type { SandboxConnection, CommandResult } from './types.js';\n\n/**\n * Configuration for local sandbox\n */\nexport interface LocalSandboxConfig {\n /** Working directory (defaults to temp directory) */\n workingDirectory?: string;\n\n /** Default repository root (defaults to workingDirectory/repo) */\n defaultRepoRoot?: string;\n\n /** Environment variables to set for commands */\n env?: Record<string, string>;\n\n /** Command timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Local filesystem sandbox implementation.\n * Executes commands directly on the host machine.\n */\nexport class LocalSandbox implements SandboxConnection {\n readonly defaultRepoRoot: string;\n\n private readonly workingDirectory: string;\n private readonly env: Record<string, string>;\n private readonly timeout: number;\n\n constructor(config: LocalSandboxConfig = {}) {\n this.workingDirectory = config.workingDirectory ?? '/tmp/ash-workspace';\n this.defaultRepoRoot = config.defaultRepoRoot ?? `${this.workingDirectory}/repo`;\n this.env = { ...process.env, ...config.env } as Record<string, string>;\n this.timeout = config.timeout ?? 30000;\n\n // Ensure working directory exists\n if (!fs.existsSync(this.workingDirectory)) {\n fs.mkdirSync(this.workingDirectory, { recursive: true });\n }\n }\n\n runCommand(command: string): CommandResult {\n const options: ExecSyncOptionsWithBufferEncoding = {\n cwd: this.workingDirectory,\n env: this.env,\n timeout: this.timeout,\n stdio: 'pipe',\n encoding: 'buffer',\n };\n\n try {\n const stdout = execSync(command, options);\n return {\n exitCode: 0,\n stdout: stdout.toString('utf-8'),\n stderr: '',\n };\n } catch (error: unknown) {\n const execError = error as {\n status?: number;\n stdout?: Buffer;\n stderr?: Buffer;\n message?: string;\n };\n return {\n exitCode: execError.status ?? 1,\n stdout: execError.stdout?.toString('utf-8') ?? '',\n stderr: execError.stderr?.toString('utf-8') ?? '',\n error: execError.message,\n };\n }\n }\n\n uploadFile(localPath: string, remotePath: string): void {\n // Ensure directory exists\n const dir = path.dirname(remotePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.copyFileSync(localPath, remotePath);\n }\n\n downloadFile(remotePath: string, localPath: string): void {\n // Ensure directory exists\n const dir = path.dirname(localPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.copyFileSync(remotePath, localPath);\n }\n\n uploadDirectory(\n localPath: string,\n remotePath: string,\n options?: { exclude?: Set<string> }\n ): void {\n const exclude = options?.exclude ?? new Set();\n\n // Ensure remote directory exists\n if (!fs.existsSync(remotePath)) {\n fs.mkdirSync(remotePath, { recursive: true });\n }\n\n const copyRecursive = (src: string, dest: string) => {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n if (exclude.has(entry.name)) continue;\n\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n if (!fs.existsSync(destPath)) {\n fs.mkdirSync(destPath, { recursive: true });\n }\n copyRecursive(srcPath, destPath);\n } else if (entry.isFile()) {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n };\n\n copyRecursive(localPath, remotePath);\n }\n\n readFile(remotePath: string): string {\n return fs.readFileSync(remotePath, 'utf-8');\n }\n\n writeFile(remotePath: string, content: string): void {\n const dir = path.dirname(remotePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(remotePath, content, 'utf-8');\n }\n\n close(): void {\n // No cleanup needed for local sandbox\n }\n\n /**\n * Clean up the working directory\n */\n cleanup(): void {\n if (fs.existsSync(this.workingDirectory)) {\n fs.rmSync(this.workingDirectory, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Create a local sandbox for development/testing\n */\nexport function createLocalSandbox(config?: LocalSandboxConfig): LocalSandbox {\n return new LocalSandbox(config);\n}\n","/**\n * Provider Sandbox Adapter\n *\n * Bridges the existing SandboxProvider interface from runtime/providers\n * to the SandboxConnection interface used by Workspace.\n *\n * This allows using any sandbox provider (E2B, Modal, Vercel, etc.)\n * with the workspace persistence system.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { SandboxConnection, CommandResult } from './types.js';\nimport type {\n SandboxProvider,\n Sandbox,\n SandboxConfig,\n CommandResult as ProviderCommandResult,\n} from '../runtime/providers/types.js';\n\n/**\n * Configuration for the provider sandbox adapter\n */\nexport interface ProviderSandboxConfig {\n /** The sandbox provider to use */\n provider: SandboxProvider;\n\n /** Sandbox configuration */\n sandboxConfig?: Partial<SandboxConfig>;\n\n /** Default repository root path */\n defaultRepoRoot?: string;\n}\n\n/**\n * Adapts a SandboxProvider to the SandboxConnection interface\n */\nexport class ProviderSandbox implements SandboxConnection {\n readonly defaultRepoRoot: string;\n\n private readonly provider: SandboxProvider;\n private readonly sandboxConfig: Partial<SandboxConfig>;\n private sandbox: Sandbox | null = null;\n private _initialized = false;\n\n constructor(config: ProviderSandboxConfig) {\n this.provider = config.provider;\n this.sandboxConfig = config.sandboxConfig ?? {};\n this.defaultRepoRoot = config.defaultRepoRoot ?? '/home/user/workspace';\n }\n\n /**\n * Initialize the sandbox (create it if not already created)\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n\n const available = await this.provider.isAvailable();\n if (!available) {\n throw new Error(\n `Provider ${this.provider.name} is not available. ` +\n 'Check credentials and SDK installation.'\n );\n }\n\n this.sandbox = await this.provider.createSandbox({\n id: `workspace-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n workingDirectory: this.defaultRepoRoot,\n ...this.sandboxConfig,\n });\n\n this._initialized = true;\n }\n\n /**\n * Get the sandbox ID (throws if not initialized)\n */\n private getSandboxId(): string {\n if (!this.sandbox) {\n throw new Error('Sandbox not initialized. Call initialize() first.');\n }\n return this.sandbox.id;\n }\n\n /**\n * Convert provider CommandResult to workspace CommandResult\n */\n private convertResult(result: ProviderCommandResult): CommandResult {\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n logs: result.stdout + (result.stderr ? '\\n' + result.stderr : ''),\n };\n }\n\n async runCommand(command: string): Promise<CommandResult> {\n await this.initialize();\n const result = await this.provider.executeCommand(\n this.getSandboxId(),\n command\n );\n return this.convertResult(result);\n }\n\n async uploadFile(localPath: string, remotePath: string): Promise<void> {\n await this.initialize();\n const content = fs.readFileSync(localPath);\n await this.provider.writeFile(this.getSandboxId(), remotePath, content);\n }\n\n async downloadFile(remotePath: string, localPath: string): Promise<void> {\n await this.initialize();\n const content = await this.provider.readFile(this.getSandboxId(), remotePath);\n\n // Ensure directory exists\n const dir = path.dirname(localPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(localPath, content);\n }\n\n async uploadDirectory(\n localPath: string,\n remotePath: string,\n options?: { exclude?: Set<string> }\n ): Promise<void> {\n await this.initialize();\n const exclude = options?.exclude ?? new Set();\n\n // Create remote directory\n await this.runCommand(`mkdir -p '${remotePath}'`);\n\n // Recursively upload files\n const uploadRecursive = async (src: string, dest: string) => {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n if (exclude.has(entry.name)) continue;\n\n const srcPath = path.join(src, entry.name);\n const destPath = `${dest}/${entry.name}`;\n\n if (entry.isDirectory()) {\n await this.runCommand(`mkdir -p '${destPath}'`);\n await uploadRecursive(srcPath, destPath);\n } else if (entry.isFile()) {\n const content = fs.readFileSync(srcPath);\n await this.provider.writeFile(this.getSandboxId(), destPath, content);\n }\n }\n };\n\n await uploadRecursive(localPath, remotePath);\n }\n\n async readFile(remotePath: string): Promise<string> {\n await this.initialize();\n return this.provider.readFile(this.getSandboxId(), remotePath);\n }\n\n async writeFile(remotePath: string, content: string): Promise<void> {\n await this.initialize();\n\n // Ensure parent directory exists\n const dir = remotePath.substring(0, remotePath.lastIndexOf('/'));\n if (dir) {\n await this.runCommand(`mkdir -p '${dir}'`);\n }\n\n await this.provider.writeFile(this.getSandboxId(), remotePath, content);\n }\n\n async close(): Promise<void> {\n if (this.sandbox) {\n await this.provider.destroySandbox(this.sandbox.id);\n this.sandbox = null;\n this._initialized = false;\n }\n }\n\n /**\n * Get the underlying sandbox instance\n */\n getSandbox(): Sandbox | null {\n return this.sandbox;\n }\n\n /**\n * Check if sandbox is initialized\n */\n get initialized(): boolean {\n return this._initialized;\n }\n}\n\n/**\n * Create a sandbox connection from a provider\n */\nexport function createProviderSandbox(\n config: ProviderSandboxConfig\n): ProviderSandbox {\n return new ProviderSandbox(config);\n}\n\n/**\n * Create a sandbox connection using E2B\n */\nexport async function createE2BSandbox(options?: {\n apiKey?: string;\n templateId?: string;\n defaultRepoRoot?: string;\n}): Promise<ProviderSandbox> {\n const { createE2BProvider } = await import('../runtime/providers/e2b.js');\n\n const provider = createE2BProvider({\n apiKey: options?.apiKey ?? process.env.E2B_API_KEY,\n templateId: options?.templateId,\n });\n\n const sandbox = new ProviderSandbox({\n provider,\n defaultRepoRoot: options?.defaultRepoRoot ?? '/home/user/workspace',\n });\n\n await sandbox.initialize();\n return sandbox;\n}\n\n/**\n * Create a sandbox connection using Vercel\n */\nexport async function createVercelSandbox(options?: {\n apiToken?: string;\n teamId?: string;\n defaultRepoRoot?: string;\n}): Promise<ProviderSandbox> {\n const { createVercelProvider } = await import('../runtime/providers/vercel.js');\n\n const provider = createVercelProvider({\n apiKey: options?.apiToken ?? process.env.VERCEL_TOKEN,\n organizationId: options?.teamId ?? process.env.VERCEL_TEAM_ID,\n });\n\n const sandbox = new ProviderSandbox({\n provider,\n defaultRepoRoot: options?.defaultRepoRoot ?? '/home/user/workspace',\n });\n\n await sandbox.initialize();\n return sandbox;\n}\n\n/**\n * Create a sandbox connection using Modal\n */\nexport async function createModalSandbox(options?: {\n tokenId?: string;\n tokenSecret?: string;\n defaultRepoRoot?: string;\n}): Promise<ProviderSandbox> {\n const { createModalProvider } = await import('../runtime/providers/modal.js');\n\n const provider = createModalProvider({\n apiKey: options?.tokenId ?? process.env.MODAL_TOKEN_ID,\n apiSecret: options?.tokenSecret ?? process.env.MODAL_TOKEN_SECRET,\n });\n\n const sandbox = new ProviderSandbox({\n provider,\n defaultRepoRoot: options?.defaultRepoRoot ?? '/root/workspace',\n });\n\n await sandbox.initialize();\n return sandbox;\n}\n","/**\n * AgentHarness Integration\n *\n * Integrates the Workspace module with the AgentHarness session lifecycle.\n * Provides automatic workspace management for agent sessions.\n */\n\nimport type { SandboxConnection, BundleStore, WorkspaceConfig } from './types.js';\nimport type { McpServerConfig } from '../mcp/index.js';\nimport { Workspace } from './workspace.js';\nimport { LocalBundleStore } from './bundle-store.js';\nimport { LocalSandbox } from './local-sandbox.js';\n\n/**\n * Configuration for workspace-enabled agent sessions\n */\nexport interface WorkspaceSessionConfig {\n /** Session ID (used as workspace ID) */\n sessionId: string;\n\n /** Bundle store for persistence (defaults to local store) */\n store?: BundleStore;\n\n /** Sandbox connection (defaults to local sandbox) */\n sandbox?: SandboxConnection;\n\n /** MCP servers to setup */\n mcpServers?: Record<string, McpServerConfig>;\n\n /** Generate MCP tool wrappers */\n generateMcpTools?: boolean;\n\n /** Skills configuration */\n skills?: WorkspaceConfig['skills'];\n\n /** Load skills on session start */\n loadSkills?: boolean;\n\n /** Working directory for local sandbox */\n workingDirectory?: string;\n\n /** Bundle storage directory for local store */\n bundleDirectory?: string;\n}\n\n/**\n * Managed workspace for an agent session\n */\nexport interface ManagedWorkspace {\n /** The workspace instance */\n workspace: Workspace;\n\n /** The sandbox connection */\n sandbox: SandboxConnection;\n\n /** The bundle store */\n store: BundleStore;\n\n /** Session ID */\n sessionId: string;\n\n /** Whether the workspace was restored from existing state */\n restored: boolean;\n\n /**\n * Save the workspace state\n */\n save(message?: string): Promise<void>;\n\n /**\n * Close the workspace and clean up resources\n */\n close(): Promise<void>;\n}\n\n/**\n * Workspace manager for AgentHarness sessions.\n *\n * Manages the lifecycle of workspaces for agent sessions:\n * - Creates or restores workspaces when sessions start\n * - Saves state when sessions end\n * - Provides hooks for automatic checkpointing\n */\nexport class WorkspaceManager {\n private readonly defaultBundleDir: string;\n private readonly defaultWorkDir: string;\n private activeWorkspaces: Map<string, ManagedWorkspace> = new Map();\n\n constructor(options?: {\n bundleDirectory?: string;\n workingDirectory?: string;\n }) {\n this.defaultBundleDir = options?.bundleDirectory ?? '/tmp/ash-workspaces/bundles';\n this.defaultWorkDir = options?.workingDirectory ?? '/tmp/ash-workspaces/sandboxes';\n }\n\n /**\n * Create or restore a workspace for a session\n */\n async getWorkspace(config: WorkspaceSessionConfig): Promise<ManagedWorkspace> {\n const { sessionId } = config;\n\n // Return existing workspace if already active\n const existing = this.activeWorkspaces.get(sessionId);\n if (existing) {\n return existing;\n }\n\n // Create or use provided store\n const store = config.store ?? new LocalBundleStore({\n directory: config.bundleDirectory ?? this.defaultBundleDir,\n });\n\n // Create or use provided sandbox\n const sandbox = config.sandbox ?? new LocalSandbox({\n workingDirectory: config.workingDirectory ?? `${this.defaultWorkDir}/${sessionId}`,\n });\n\n // Create workspace\n const workspace = new Workspace({\n workspaceId: sessionId,\n sandbox,\n store,\n mcpServers: config.mcpServers,\n generateMcpTools: config.generateMcpTools,\n skills: config.skills,\n loadSkills: config.loadSkills,\n });\n\n // Load workspace (restore or initialize)\n const loadResult = await workspace.load();\n\n const managed: ManagedWorkspace = {\n workspace,\n sandbox,\n store,\n sessionId,\n restored: loadResult.restored,\n\n async save(message?: string) {\n await workspace.save(message);\n },\n\n async close() {\n // Save before closing\n try {\n await workspace.save('Session ended');\n } catch {\n // Ignore save errors on close\n }\n\n // Close sandbox\n await sandbox.close();\n },\n };\n\n this.activeWorkspaces.set(sessionId, managed);\n return managed;\n }\n\n /**\n * Get an existing workspace by session ID\n */\n getActiveWorkspace(sessionId: string): ManagedWorkspace | undefined {\n return this.activeWorkspaces.get(sessionId);\n }\n\n /**\n * Close a workspace by session ID\n */\n async closeWorkspace(sessionId: string): Promise<void> {\n const workspace = this.activeWorkspaces.get(sessionId);\n if (workspace) {\n await workspace.close();\n this.activeWorkspaces.delete(sessionId);\n }\n }\n\n /**\n * Close all active workspaces\n */\n async closeAll(): Promise<void> {\n const sessions = Array.from(this.activeWorkspaces.keys());\n await Promise.all(sessions.map((id) => this.closeWorkspace(id)));\n }\n\n /**\n * List all active workspace session IDs\n */\n listActive(): string[] {\n return Array.from(this.activeWorkspaces.keys());\n }\n\n /**\n * Check if a workspace is active\n */\n isActive(sessionId: string): boolean {\n return this.activeWorkspaces.has(sessionId);\n }\n}\n\n/**\n * Global workspace manager instance\n */\nlet globalWorkspaceManager: WorkspaceManager | null = null;\n\n/**\n * Get the global workspace manager\n */\nexport function getWorkspaceManager(): WorkspaceManager {\n if (!globalWorkspaceManager) {\n globalWorkspaceManager = new WorkspaceManager();\n }\n return globalWorkspaceManager;\n}\n\n/**\n * Create a new workspace manager\n */\nexport function createWorkspaceManager(options?: {\n bundleDirectory?: string;\n workingDirectory?: string;\n}): WorkspaceManager {\n return new WorkspaceManager(options);\n}\n\n/**\n * Quick helper to create a workspace for a session\n */\nexport async function createSessionWorkspace(\n sessionId: string,\n options?: Omit<WorkspaceSessionConfig, 'sessionId'>\n): Promise<ManagedWorkspace> {\n const manager = getWorkspaceManager();\n return manager.getWorkspace({ sessionId, ...options });\n}\n\n/**\n * Hook function type for workspace events\n */\nexport type WorkspaceHook = (workspace: Workspace, sessionId: string) => void | Promise<void>;\n\n/**\n * Create workspace middleware for AgentHarness.\n *\n * This returns hooks that can be used with AgentHarness to automatically\n * manage workspace lifecycle:\n *\n * ```typescript\n * const { onSessionStart, onSessionEnd, onMessage } = createWorkspaceHooks({\n * bundleDirectory: '/data/workspaces',\n * mcpServers: { playwright: { command: 'npx', args: ['@playwright/mcp'] } },\n * });\n *\n * const harness = new AgentHarness({\n * // ... other config\n * hooks: {\n * onSessionStart,\n * onSessionEnd,\n * onMessage,\n * },\n * });\n * ```\n */\nexport function createWorkspaceHooks(options?: {\n bundleDirectory?: string;\n workingDirectory?: string;\n mcpServers?: Record<string, McpServerConfig>;\n generateMcpTools?: boolean;\n skills?: WorkspaceConfig['skills'];\n loadSkills?: boolean;\n autoCheckpoint?: boolean;\n checkpointInterval?: number;\n onWorkspaceCreated?: WorkspaceHook;\n onWorkspaceSaved?: WorkspaceHook;\n}): {\n onSessionStart: (sessionId: string) => Promise<void>;\n onSessionEnd: (sessionId: string) => Promise<void>;\n onMessage?: (sessionId: string, message: unknown) => Promise<void>;\n getWorkspace: (sessionId: string) => ManagedWorkspace | undefined;\n} {\n const manager = createWorkspaceManager({\n bundleDirectory: options?.bundleDirectory,\n workingDirectory: options?.workingDirectory,\n });\n\n const checkpointIntervals: Map<string, NodeJS.Timeout> = new Map();\n\n return {\n async onSessionStart(sessionId: string) {\n const managed = await manager.getWorkspace({\n sessionId,\n mcpServers: options?.mcpServers,\n generateMcpTools: options?.generateMcpTools,\n skills: options?.skills,\n loadSkills: options?.loadSkills,\n });\n\n await options?.onWorkspaceCreated?.(managed.workspace, sessionId);\n\n // Setup auto-checkpoint if enabled\n if (options?.autoCheckpoint) {\n const interval = options.checkpointInterval ?? 60000; // 1 minute default\n const timer = setInterval(async () => {\n try {\n await managed.save('Auto-checkpoint');\n await options?.onWorkspaceSaved?.(managed.workspace, sessionId);\n } catch {\n // Ignore checkpoint errors\n }\n }, interval);\n checkpointIntervals.set(sessionId, timer);\n }\n },\n\n async onSessionEnd(sessionId: string) {\n // Clear checkpoint interval\n const timer = checkpointIntervals.get(sessionId);\n if (timer) {\n clearInterval(timer);\n checkpointIntervals.delete(sessionId);\n }\n\n const managed = manager.getActiveWorkspace(sessionId);\n if (managed) {\n await options?.onWorkspaceSaved?.(managed.workspace, sessionId);\n }\n\n await manager.closeWorkspace(sessionId);\n },\n\n onMessage: options?.autoCheckpoint\n ? undefined // Let the interval handle it\n : async (sessionId: string) => {\n // Save after each message if not using interval-based checkpointing\n const managed = manager.getActiveWorkspace(sessionId);\n if (managed) {\n await managed.save('Message checkpoint');\n }\n },\n\n getWorkspace(sessionId: string) {\n return manager.getActiveWorkspace(sessionId);\n },\n };\n}\n","/**\n * Workspace Module\n *\n * Provides persistent, version-controlled sandbox state management for AI agents.\n * Provides git-based persistence and skill management for AI agent sandboxes.\n *\n * Key concepts:\n * - Workspace: Main class that manages sandbox state lifecycle\n * - BundleStore: Storage backends for git bundles (local filesystem, S3, GCS)\n * - SandboxConnection: Interface for sandbox operations (commands, file I/O)\n * - SkillCatalog: Discovers and manages skills (SKILL.md files)\n * - WorkspaceManager: Integrates workspaces with AgentHarness sessions\n *\n * @example Basic Usage\n * ```typescript\n * import {\n * Workspace,\n * LocalBundleStore,\n * LocalSandbox,\n * } from '@ash-cloud/ash-ai';\n *\n * // Create storage and sandbox\n * const store = new LocalBundleStore({ directory: '/tmp/workspaces' });\n * const sandbox = new LocalSandbox({ workingDirectory: '/tmp/sandbox' });\n *\n * // Create workspace\n * const workspace = new Workspace({\n * workspaceId: 'my-workspace',\n * sandbox,\n * store,\n * mcpServers: {\n * playwright: { command: 'npx', args: ['@playwright/mcp@latest'] }\n * },\n * });\n *\n * // Load state (restores from previous session if exists)\n * const { restored, skillCount } = await workspace.load();\n *\n * // Do work with the sandbox...\n * sandbox.runCommand('echo \"Hello\" > greeting.txt');\n *\n * // Save state (commits and uploads git bundle)\n * await workspace.save('Added greeting file');\n * ```\n *\n * @example With AgentHarness\n * ```typescript\n * import { createWorkspaceHooks } from '@ash-cloud/ash-ai';\n *\n * const hooks = createWorkspaceHooks({\n * bundleDirectory: '/data/workspaces',\n * mcpServers: { playwright: { command: 'npx', args: ['@playwright/mcp'] } },\n * autoCheckpoint: true,\n * });\n *\n * // Use hooks with AgentHarness for automatic workspace management\n * ```\n *\n * @example With Cloud Storage\n * ```typescript\n * import { Workspace, S3BundleStore, createE2BSandbox } from '@ash-cloud/ash-ai';\n *\n * const store = new S3BundleStore({\n * bucket: 'my-workspaces',\n * region: 'us-east-1',\n * });\n *\n * const sandbox = await createE2BSandbox({ apiKey: 'e2b_...' });\n *\n * const workspace = new Workspace({\n * workspaceId: 'cloud-workspace',\n * sandbox,\n * store,\n * });\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n SandboxConnection,\n BundleStore,\n GitRepo,\n CommandResult,\n WorkspaceConfig,\n SkillsConfig,\n GitHubSkillConfig,\n DiscoveredSkill,\n WorkspaceLoadResult,\n WorkspaceSaveResult,\n} from './types.js';\n\n// =============================================================================\n// Workspace\n// =============================================================================\n\nexport { Workspace, createWorkspace } from './workspace.js';\n\n// =============================================================================\n// Bundle Stores\n// =============================================================================\n\nexport {\n LocalBundleStore,\n MemoryBundleStore,\n createLocalBundleStore,\n createMemoryBundleStore,\n} from './bundle-store.js';\n\n// Cloud stores - Supabase (recommended)\nexport {\n SupabaseBundleStore,\n createSupabaseBundleStore,\n createSupabaseBundleStoreFromEnv,\n type SupabaseBundleStoreConfig,\n} from './supabase-store.js';\n\n// Cloud stores - S3/GCS (optional)\nexport {\n S3BundleStore,\n GCSBundleStore,\n createS3BundleStore,\n createGCSBundleStore,\n createR2BundleStore,\n createMinioBundleStore,\n type S3BundleStoreConfig,\n type GCSBundleStoreConfig,\n} from './cloud-store.js';\n\n// =============================================================================\n// File Stores (for individual file storage, not git bundles)\n// =============================================================================\n\nexport {\n S3FileStore,\n createS3FileStore,\n createR2FileStore,\n createMinioFileStore,\n type FileStore,\n type FileMetadata,\n type S3FileStoreConfig,\n} from './file-store.js';\n\n// =============================================================================\n// Sandbox Connections\n// =============================================================================\n\n// Local sandbox\nexport {\n LocalSandbox,\n createLocalSandbox,\n type LocalSandboxConfig,\n} from './local-sandbox.js';\n\n// Provider adapters\nexport {\n ProviderSandbox,\n createProviderSandbox,\n createE2BSandbox,\n createVercelSandbox,\n createModalSandbox,\n type ProviderSandboxConfig,\n} from './provider-sandbox.js';\n\n// =============================================================================\n// Git Repository\n// =============================================================================\n\nexport { SandboxGitRepo, createGitRepo } from './git-repo.js';\n\n// =============================================================================\n// Skill Catalog\n// =============================================================================\n\nexport { SkillCatalog, createSkillCatalog } from './skill-catalog.js';\n\n// =============================================================================\n// GitHub Skills\n// =============================================================================\n\nexport {\n loadGitHubSkill,\n loadGitHubSkills,\n normalizeGitHubConfigs,\n parseGitHubUrl,\n type GitHubSkillResult,\n} from './github-skills.js';\n\n// =============================================================================\n// MCP Tool Generation\n// =============================================================================\n\nexport {\n generateMcpServerPackage,\n generateMcpServers,\n introspectMcpServer,\n type McpTool,\n type McpServerInfo,\n type McpGenerationResult,\n} from './mcp-generator.js';\n\n// =============================================================================\n// Persistence Utilities\n// =============================================================================\n\nexport {\n loadWorkspaceState,\n saveWorkspaceState,\n type LoadStateResult,\n type SaveStateResult,\n} from './persistence.js';\n\n// =============================================================================\n// AgentHarness Integration\n// =============================================================================\n\nexport {\n WorkspaceManager,\n getWorkspaceManager,\n createWorkspaceManager,\n createSessionWorkspace,\n createWorkspaceHooks,\n type WorkspaceSessionConfig,\n type ManagedWorkspace,\n type WorkspaceHook,\n} from './harness-integration.js';\n","/**\n * PostgreSQL Schema for Agent SDK Harness\n *\n * This schema is designed to be:\n * 1. Compatible with @conviction-labs/harness-core types\n * 2. Tenant-agnostic - no multi-tenancy concepts in core\n * 3. Usable standalone for self-hosted deployments\n *\n * Multi-tenancy (organizations, API keys, billing) should be implemented\n * in the cloud layer by:\n * - Creating separate tables that reference these via foreign keys\n * - Or extending these tables in cloud-specific migrations\n */\n\nimport {\n pgTable,\n text,\n timestamp,\n uuid,\n jsonb,\n integer,\n index,\n pgEnum,\n} from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport const sessionStatusEnum = pgEnum('session_status', [\n 'active',\n 'completed',\n 'error',\n 'suspended',\n]);\n\nexport const messageRoleEnum = pgEnum('message_role', [\n 'user',\n 'assistant',\n 'tool',\n 'system',\n]);\n\nexport const agentStatusEnum = pgEnum('agent_status', [\n 'active',\n 'paused',\n 'deleted',\n]);\n\nexport const agentBackendEnum = pgEnum('agent_backend', [\n 'claude',\n 'gemini',\n]);\n\nexport const queueItemStatusEnum = pgEnum('queue_item_status', [\n 'pending',\n 'processing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\n// Claude config deployment enums (for .claude directory sync from GitHub)\nexport const configDeploymentStatusEnum = pgEnum('config_deployment_status', [\n 'pending',\n 'success',\n 'failed',\n]);\n\nexport const configDeploymentTriggerEnum = pgEnum('config_deployment_trigger', [\n 'webhook',\n 'manual',\n 'initial',\n 'rollback',\n]);\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nexport const sessions = pgTable(\n 'sessions',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n agentName: text('agent_name').notNull(),\n status: sessionStatusEnum('status').default('active').notNull(),\n sdkSessionId: text('sdk_session_id'), // Claude Agent SDK session ID for resume\n parentSessionId: uuid('parent_session_id'),\n totalTokens: integer('total_tokens'),\n totalCost: integer('total_cost'), // In cents\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_sessions_tenant').on(table.tenantId),\n index('idx_sessions_agent').on(table.agentName),\n index('idx_sessions_sdk').on(table.sdkSessionId),\n index('idx_sessions_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Messages\n// ============================================================================\n\nexport const messages = pgTable(\n 'messages',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: messageRoleEnum('role').notNull(),\n content: jsonb('content').notNull().$type<unknown[]>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_messages_session').on(table.sessionId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Attachments\n// ============================================================================\n\nexport const attachments = pgTable(\n 'attachments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n messageId: uuid('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n filename: text('filename').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n storagePath: text('storage_path').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [index('idx_attachments_message').on(table.messageId)]\n);\n\n// ============================================================================\n// Agents\n// ============================================================================\n\nexport const agents = pgTable(\n 'agents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n name: text('name').notNull(),\n slug: text('slug').notNull(),\n description: text('description'),\n model: text('model').notNull().default('claude-sonnet-4-5'),\n backend: agentBackendEnum('backend').default('claude').notNull(),\n systemPrompt: text('system_prompt'),\n allowedTools: jsonb('allowed_tools').default([]).$type<string[]>(),\n disallowedTools: jsonb('disallowed_tools').default([]).$type<string[]>(),\n maxTurns: integer('max_turns'),\n permissionMode: text('permission_mode'),\n mcpServers: jsonb('mcp_servers').default({}).$type<Record<string, { command: string; args?: string[] }>>(),\n envVars: jsonb('env_vars').default({}).$type<Record<string, string>>(),\n startupScript: text('startup_script'),\n configFileUrl: text('config_file_url'), // .claude directory zip (skills, commands, agents, hooks, mcp)\n configFileUpdatedAt: timestamp('config_file_updated_at', { withTimezone: true }), // When config was last updated (for cache busting)\n config: jsonb('config').default({}).$type<Record<string, unknown>>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: agentStatusEnum('status').default('active').notNull(),\n // Webhook configuration for execution completion notifications (outbound)\n executionWebhookUrl: text('execution_webhook_url'),\n executionWebhookSecret: text('execution_webhook_secret'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp('deleted_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_agents_tenant').on(table.tenantId),\n index('idx_agents_slug').on(table.slug),\n index('idx_agents_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Queue Items\n// ============================================================================\n\nexport const queueItems = pgTable(\n 'queue_items',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n sessionId: uuid('session_id').references(() => sessions.id, {\n onDelete: 'cascade',\n }),\n agentName: text('agent_name').notNull(),\n prompt: text('prompt').notNull(),\n files: jsonb('files').$type<Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>>(),\n sessionContext: text('session_context'),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: queueItemStatusEnum('status').default('pending').notNull(),\n priority: integer('priority').default(0).notNull(),\n retryCount: integer('retry_count').default(0).notNull(),\n maxRetries: integer('max_retries').default(3).notNull(),\n error: text('error'),\n resultMessageId: uuid('result_message_id'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n completedAt: timestamp('completed_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_queue_items_tenant').on(table.tenantId),\n index('idx_queue_items_agent').on(table.agentName),\n index('idx_queue_items_session').on(table.sessionId),\n index('idx_queue_items_status').on(table.status),\n index('idx_queue_items_pending').on(table.agentName, table.sessionId, table.status, table.priority, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Config Deployments (history for GitHub-synced .claude directory)\n// ============================================================================\n\nexport const configDeployments = pgTable(\n 'config_deployments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n agentId: uuid('agent_id')\n .notNull()\n .references(() => agents.id, { onDelete: 'cascade' }),\n\n // Git commit info\n commitSha: text('commit_sha').notNull(),\n commitMessage: text('commit_message'),\n commitAuthor: text('commit_author'),\n commitTimestamp: timestamp('commit_timestamp', { withTimezone: true }),\n\n // Deployment status\n status: configDeploymentStatusEnum('status').default('pending').notNull(),\n errorMessage: text('error_message'),\n\n // Config file info (zipped .claude directory)\n configFileUrl: text('config_file_url'),\n configFileSize: integer('config_file_size'),\n\n // Content manifest - what's included in this deployment\n manifest: jsonb('manifest').default({}).$type<{\n hasSkills?: boolean;\n skillsCount?: number;\n hasCommands?: boolean;\n commandsCount?: number;\n hasAgents?: boolean;\n agentsCount?: number;\n hasHooks?: boolean;\n hasMcpConfig?: boolean;\n mcpServersCount?: number;\n }>(),\n\n // Trigger info\n triggeredBy: configDeploymentTriggerEnum('triggered_by').notNull(),\n rollbackFromId: uuid('rollback_from_id'), // If this was a rollback, which deployment it came from\n\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_config_deployments_agent').on(table.agentId),\n index('idx_config_deployments_status').on(table.status),\n index('idx_config_deployments_created').on(table.agentId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Relations\n// ============================================================================\n\nexport const sessionsRelations = relations(sessions, ({ one, many }) => ({\n parentSession: one(sessions, {\n fields: [sessions.parentSessionId],\n references: [sessions.id],\n relationName: 'parentSession',\n }),\n childSessions: many(sessions, {\n relationName: 'parentSession',\n }),\n messages: many(messages),\n}));\n\nexport const messagesRelations = relations(messages, ({ one, many }) => ({\n session: one(sessions, {\n fields: [messages.sessionId],\n references: [sessions.id],\n }),\n attachments: many(attachments),\n}));\n\nexport const attachmentsRelations = relations(attachments, ({ one }) => ({\n message: one(messages, {\n fields: [attachments.messageId],\n references: [messages.id],\n }),\n}));\n\nexport const configDeploymentsRelations = relations(configDeployments, ({ one }) => ({\n agent: one(agents, {\n fields: [configDeployments.agentId],\n references: [agents.id],\n }),\n}));\n\nexport const agentsRelations = relations(agents, ({ many }) => ({\n configDeployments: many(configDeployments),\n}));\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\n\nexport type MessageRow = typeof messages.$inferSelect;\nexport type NewMessageRow = typeof messages.$inferInsert;\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\n\nexport type AgentRow = typeof agents.$inferSelect;\nexport type NewAgentRow = typeof agents.$inferInsert;\n\nexport type QueueItemRow = typeof queueItems.$inferSelect;\nexport type NewQueueItemRow = typeof queueItems.$inferInsert;\n\nexport type ConfigDeploymentRow = typeof configDeployments.$inferSelect;\nexport type NewConfigDeploymentRow = typeof configDeployments.$inferInsert;\n","/**\n * PostgreSQL Storage Adapter for Agent SDK Harness\n *\n * Implements the SessionStorage interface using Drizzle ORM.\n * This is a tenant-agnostic implementation for self-hosted deployments.\n *\n * For multi-tenant cloud deployments, extend this class or create a\n * wrapper that adds organization scoping via a separate join table.\n */\n\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport { eq, and, desc, asc, sql } from 'drizzle-orm';\nimport postgres from 'postgres';\nimport type {\n SessionStorage,\n TransactionalStorage,\n AgentStorage,\n Session,\n SessionId,\n Message,\n MessageId,\n Attachment,\n AttachmentId,\n ListSessionsOptions,\n PaginatedResult,\n PaginationOptions,\n SessionStatus,\n MessageRole,\n MessageContent,\n StoredAgent,\n AgentId,\n CreateAgentOptions,\n UpdateAgentOptions,\n ListAgentsOptions,\n AgentStatus,\n} from '../index.js';\n\nimport * as schema from './schema.js';\n\n/**\n * Configuration for PostgresStorage\n */\nexport interface PostgresStorageConfig {\n /**\n * PostgreSQL connection string\n * @example \"postgresql://user:password@localhost:5432/database\"\n */\n connectionString: string;\n\n /**\n * Whether to run migrations on initialization\n * @default false\n */\n runMigrations?: boolean;\n\n /**\n * Optional tenant ID for multi-tenant deployments.\n * When set, all queries are filtered by tenant_id and all\n * inserts include the tenant_id. When not set (single-tenant\n * mode), tenant filtering is disabled.\n * @example \"project-uuid-here\"\n */\n tenantId?: string;\n\n /**\n * Maximum number of connections in the client-side pool.\n * When using a connection pooler like PgBouncer,\n * set this to a small value (1-3) since the pooler handles\n * connection management.\n * @default 3\n */\n maxConnections?: number;\n}\n\n/**\n * PostgreSQL storage implementation using Drizzle ORM\n */\nexport class PostgresStorage implements SessionStorage, TransactionalStorage, AgentStorage {\n private client: ReturnType<typeof postgres>;\n private db: ReturnType<typeof drizzle>;\n private initialized = false;\n private tenantId: string | null;\n\n constructor(config: PostgresStorageConfig) {\n // Default to 3 connections - suitable for pooled connections (PgBouncer)\n // For direct connections without a pooler, callers can increase this\n this.client = postgres(config.connectionString, {\n max: config.maxConnections ?? 3,\n });\n this.db = drizzle(this.client, { schema });\n this.tenantId = config.tenantId ?? null;\n }\n\n /**\n * Get the tenant ID for this storage instance.\n * Returns null for single-tenant mode.\n */\n getTenantId(): string | null {\n return this.tenantId;\n }\n\n /**\n * Build a tenant condition for the given table.\n * Returns undefined if no tenantId is set (single-tenant mode).\n */\n private tenantCondition(\n table: typeof schema.sessions | typeof schema.agents | typeof schema.queueItems\n ) {\n if (!this.tenantId) return undefined;\n return eq(table.tenantId, this.tenantId);\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Test connection\n await this.db.execute(sql`SELECT 1`);\n\n this.initialized = true;\n }\n\n /**\n * Run schema migrations for existing databases.\n * Call this explicitly via a migration script, not on every initialize.\n */\n async runMigrations(): Promise<void> {\n // Migration: Rename claude_session_id to sdk_session_id\n await this.db.execute(sql`\n DO $$ BEGIN\n ALTER TABLE sessions RENAME COLUMN claude_session_id TO sdk_session_id;\n EXCEPTION\n WHEN undefined_column THEN null;\n WHEN duplicate_column THEN null;\n END $$;\n `);\n\n // Migration: Add sdk_session_id column if it doesn't exist\n await this.db.execute(sql`\n ALTER TABLE sessions ADD COLUMN IF NOT EXISTS sdk_session_id TEXT;\n `);\n\n // Add index for sdk_session_id if it doesn't exist\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_sessions_sdk ON sessions(sdk_session_id);\n `);\n\n // Migration: Drop threads table and remove thread_id from sessions\n await this.db.execute(sql`\n ALTER TABLE sessions DROP COLUMN IF EXISTS thread_id;\n `);\n await this.db.execute(sql`\n DROP TABLE IF EXISTS threads CASCADE;\n `);\n\n // Migration: Rename skills_file_url to config_file_url\n await this.db.execute(sql`\n DO $$ BEGIN\n ALTER TABLE agents RENAME COLUMN skills_file_url TO config_file_url;\n EXCEPTION\n WHEN undefined_column THEN null;\n WHEN duplicate_column THEN null;\n END $$;\n `);\n\n // Ensure config_file_url column exists (for new tables or if rename failed)\n await this.db.execute(sql`\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS config_file_url TEXT;\n `);\n\n // Migration: Create config_deployments table for GitHub-synced .claude directory\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE config_deployment_status AS ENUM ('pending', 'success', 'failed');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE config_deployment_trigger AS ENUM ('webhook', 'manual', 'initial', 'rollback');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS config_deployments (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,\n commit_sha TEXT NOT NULL,\n commit_message TEXT,\n commit_author TEXT,\n commit_timestamp TIMESTAMPTZ,\n status config_deployment_status NOT NULL DEFAULT 'pending',\n error_message TEXT,\n config_file_url TEXT,\n config_file_size INTEGER,\n manifest JSONB DEFAULT '{}',\n triggered_by config_deployment_trigger NOT NULL,\n rollback_from_id UUID,\n metadata JSONB DEFAULT '{}',\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_agent ON config_deployments(agent_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_status ON config_deployments(status);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_created ON config_deployments(agent_id, created_at);\n `);\n\n // Migration: Add tenant_id column to sessions, agents, queue_items for multi-tenant support\n await this.db.execute(sql`\n ALTER TABLE sessions ADD COLUMN IF NOT EXISTS tenant_id TEXT;\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_sessions_tenant ON sessions(tenant_id);\n `);\n\n await this.db.execute(sql`\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS tenant_id TEXT;\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_agents_tenant ON agents(tenant_id);\n `);\n\n // Create queue_items table if it doesn't exist\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE queue_item_status AS ENUM ('pending', 'processing', 'completed', 'failed', 'cancelled');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS queue_items (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id TEXT,\n session_id UUID REFERENCES sessions(id) ON DELETE CASCADE,\n agent_name TEXT NOT NULL,\n prompt TEXT NOT NULL,\n files JSONB,\n session_context TEXT,\n metadata JSONB DEFAULT '{}',\n status queue_item_status NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 0,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 3,\n error TEXT,\n result_message_id UUID,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n started_at TIMESTAMPTZ,\n completed_at TIMESTAMPTZ\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_tenant ON queue_items(tenant_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_agent ON queue_items(agent_name);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_session ON queue_items(session_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_status ON queue_items(status);\n `);\n\n // Add tenant_id to existing queue_items table\n await this.db.execute(sql`\n ALTER TABLE queue_items ADD COLUMN IF NOT EXISTS tenant_id TEXT;\n `);\n\n // Migration: Add backend column to agents table\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE agent_backend AS ENUM ('claude', 'gemini');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n await this.db.execute(sql`\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS backend agent_backend DEFAULT 'claude' NOT NULL;\n `);\n }\n\n /**\n * Create the database schema (tables, enums, indexes)\n * Call this when setting up a new database for the first time.\n * Safe to call multiple times - uses IF NOT EXISTS.\n */\n async createSchema(): Promise<void> {\n // Create enums\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE session_status AS ENUM ('active', 'completed', 'error', 'suspended');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE message_role AS ENUM ('user', 'assistant', 'tool', 'system');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE agent_status AS ENUM ('active', 'paused', 'deleted');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n // Create sessions table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS sessions (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id TEXT,\n agent_name TEXT NOT NULL,\n status session_status NOT NULL DEFAULT 'active',\n sdk_session_id TEXT,\n parent_session_id UUID,\n total_tokens INTEGER,\n total_cost INTEGER,\n metadata JSONB DEFAULT '{}',\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_sessions_tenant ON sessions(tenant_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions(agent_name);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\n `);\n // Only create sdk_session_id index if column exists (for old databases with claude_session_id)\n await this.db.execute(sql`\n DO $$ BEGIN\n IF EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'sessions' AND column_name = 'sdk_session_id'\n ) THEN\n CREATE INDEX IF NOT EXISTS idx_sessions_sdk ON sessions(sdk_session_id);\n END IF;\n END $$;\n `);\n\n // Create messages table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS messages (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n role message_role NOT NULL,\n content JSONB NOT NULL,\n metadata JSONB DEFAULT '{}',\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, created_at);\n `);\n\n // Create attachments table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS attachments (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n message_id UUID NOT NULL REFERENCES messages(id) ON DELETE CASCADE,\n filename TEXT NOT NULL,\n mime_type TEXT NOT NULL,\n size INTEGER NOT NULL,\n storage_path TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_attachments_message ON attachments(message_id);\n `);\n\n // Create agent_backend enum\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE agent_backend AS ENUM ('claude', 'gemini');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n // Create agents table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS agents (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id TEXT,\n name TEXT NOT NULL,\n slug TEXT NOT NULL,\n description TEXT,\n model TEXT NOT NULL DEFAULT 'claude-sonnet-4-5',\n backend agent_backend NOT NULL DEFAULT 'claude',\n system_prompt TEXT,\n allowed_tools JSONB DEFAULT '[]',\n disallowed_tools JSONB DEFAULT '[]',\n max_turns INTEGER,\n permission_mode TEXT,\n mcp_servers JSONB DEFAULT '{}',\n env_vars JSONB DEFAULT '{}',\n startup_script TEXT,\n config_file_url TEXT,\n config JSONB DEFAULT '{}',\n metadata JSONB DEFAULT '{}',\n status agent_status NOT NULL DEFAULT 'active',\n execution_webhook_url TEXT,\n execution_webhook_secret TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n deleted_at TIMESTAMPTZ\n );\n `);\n\n // Migration: Add config_file_url column if it doesn't exist\n await this.db.execute(sql`\n DO $$ BEGIN\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS config_file_url TEXT;\n EXCEPTION\n WHEN duplicate_column THEN null;\n END $$;\n `);\n\n // Migration: Add execution webhook columns if they don't exist\n await this.db.execute(sql`\n DO $$ BEGIN\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS execution_webhook_url TEXT;\n ALTER TABLE agents ADD COLUMN IF NOT EXISTS execution_webhook_secret TEXT;\n EXCEPTION\n WHEN duplicate_column THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_agents_tenant ON agents(tenant_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_agents_slug ON agents(slug);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_agents_status ON agents(status);\n `);\n\n // Create queue_items table\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE queue_item_status AS ENUM ('pending', 'processing', 'completed', 'failed', 'cancelled');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS queue_items (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id TEXT,\n session_id UUID REFERENCES sessions(id) ON DELETE CASCADE,\n agent_name TEXT NOT NULL,\n prompt TEXT NOT NULL,\n files JSONB,\n session_context TEXT,\n metadata JSONB DEFAULT '{}',\n status queue_item_status NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 0,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 3,\n error TEXT,\n result_message_id UUID,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n started_at TIMESTAMPTZ,\n completed_at TIMESTAMPTZ\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_tenant ON queue_items(tenant_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_agent ON queue_items(agent_name);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_session ON queue_items(session_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_status ON queue_items(status);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_pending ON queue_items(agent_name, session_id, status, priority, created_at);\n `);\n\n // Create config_deployment enums\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE config_deployment_status AS ENUM ('pending', 'success', 'failed');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE config_deployment_trigger AS ENUM ('webhook', 'manual', 'initial', 'rollback');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n // Create config_deployments table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS config_deployments (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,\n commit_sha TEXT NOT NULL,\n commit_message TEXT,\n commit_author TEXT,\n commit_timestamp TIMESTAMPTZ,\n status config_deployment_status NOT NULL DEFAULT 'pending',\n error_message TEXT,\n config_file_url TEXT,\n config_file_size INTEGER,\n manifest JSONB DEFAULT '{}',\n triggered_by config_deployment_trigger NOT NULL,\n rollback_from_id UUID,\n metadata JSONB DEFAULT '{}',\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n `);\n\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_agent ON config_deployments(agent_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_status ON config_deployments(status);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_config_deployments_created ON config_deployments(agent_id, created_at);\n `);\n }\n\n async close(): Promise<void> {\n await this.client.end();\n this.initialized = false;\n }\n\n // ============================================================================\n // Sessions\n // ============================================================================\n\n async createSession(\n session: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<Session> {\n const [row] = await this.db\n .insert(schema.sessions)\n .values({\n tenantId: this.tenantId,\n agentName: session.agentName,\n status: session.status as 'active' | 'completed' | 'error' | 'suspended',\n sdkSessionId: session.sdkSessionId ?? null,\n parentSessionId: session.parentSessionId ?? null,\n totalTokens: session.totalTokens ?? null,\n totalCost: session.totalCost ?? null,\n metadata: session.metadata ?? {},\n })\n .returning();\n\n return this.rowToSession(row!);\n }\n\n async getSession(sessionId: SessionId): Promise<Session | null> {\n const tenantCond = this.tenantCondition(schema.sessions);\n const conditions = [eq(schema.sessions.id, sessionId)];\n if (tenantCond) conditions.push(tenantCond);\n\n const [row] = await this.db\n .select()\n .from(schema.sessions)\n .where(and(...conditions))\n .limit(1);\n\n return row ? this.rowToSession(row) : null;\n }\n\n async updateSession(\n sessionId: SessionId,\n updates: Partial<Omit<Session, 'id' | 'createdAt' | 'agentName'>>\n ): Promise<Session> {\n const tenantCond = this.tenantCondition(schema.sessions);\n const conditions = [eq(schema.sessions.id, sessionId)];\n if (tenantCond) conditions.push(tenantCond);\n\n const [row] = await this.db\n .update(schema.sessions)\n .set({\n ...(updates.status && {\n status: updates.status as 'active' | 'completed' | 'error' | 'suspended',\n }),\n ...(updates.sdkSessionId !== undefined && {\n sdkSessionId: updates.sdkSessionId,\n }),\n ...(updates.parentSessionId !== undefined && {\n parentSessionId: updates.parentSessionId,\n }),\n ...(updates.totalTokens !== undefined && {\n totalTokens: updates.totalTokens,\n }),\n ...(updates.totalCost !== undefined && {\n totalCost: updates.totalCost,\n }),\n ...(updates.metadata && { metadata: updates.metadata }),\n updatedAt: new Date(),\n })\n .where(and(...conditions))\n .returning();\n\n if (!row) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n return this.rowToSession(row);\n }\n\n async deleteSession(sessionId: SessionId): Promise<void> {\n const tenantCond = this.tenantCondition(schema.sessions);\n const conditions = [eq(schema.sessions.id, sessionId)];\n if (tenantCond) conditions.push(tenantCond);\n\n await this.db.delete(schema.sessions).where(and(...conditions));\n }\n\n async listSessions(\n options: ListSessionsOptions = {}\n ): Promise<PaginatedResult<Session>> {\n const conditions: ReturnType<typeof eq>[] = [];\n\n // Add tenant filter if in multi-tenant mode\n const tenantCond = this.tenantCondition(schema.sessions);\n if (tenantCond) conditions.push(tenantCond);\n\n if (options.agentName) {\n conditions.push(eq(schema.sessions.agentName, options.agentName));\n }\n if (options.status) {\n conditions.push(\n eq(schema.sessions.status, options.status as 'active' | 'completed' | 'error' | 'suspended')\n );\n }\n\n const orderColumn =\n options.orderBy === 'updatedAt'\n ? schema.sessions.updatedAt\n : schema.sessions.createdAt;\n const orderFn = options.order === 'asc' ? asc : desc;\n\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n\n const [rows, countResult] = await Promise.all([\n this.db\n .select()\n .from(schema.sessions)\n .where(whereClause)\n .orderBy(orderFn(orderColumn))\n .limit(limit)\n .offset(offset),\n this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.sessions)\n .where(whereClause),\n ]);\n\n const total = countResult[0]?.count ?? 0;\n\n return {\n items: rows.map((row) => this.rowToSession(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n async saveMessages(\n messages: Omit<Message, 'id' | 'createdAt'>[]\n ): Promise<Message[]> {\n if (messages.length === 0) return [];\n\n const rows = await this.db\n .insert(schema.messages)\n .values(\n messages.map((msg) => ({\n sessionId: msg.sessionId,\n role: msg.role as 'user' | 'assistant' | 'tool' | 'system',\n content: msg.content as unknown[],\n metadata: msg.metadata ?? {},\n }))\n )\n .returning();\n\n return rows.map((row) => this.rowToMessage(row));\n }\n\n async getMessage(messageId: MessageId): Promise<Message | null> {\n const [row] = await this.db\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.id, messageId))\n .limit(1);\n\n return row ? this.rowToMessage(row) : null;\n }\n\n async getMessages(\n sessionId: SessionId,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<Message>> {\n const orderFn = options.order === 'desc' ? desc : asc;\n const limit = options.limit ?? 100;\n const offset = options.offset ?? 0;\n\n const [rows, countResult] = await Promise.all([\n this.db\n .select()\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId))\n .orderBy(orderFn(schema.messages.createdAt))\n .limit(limit)\n .offset(offset),\n this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId)),\n ]);\n\n const total = countResult[0]?.count ?? 0;\n\n return {\n items: rows.map((row) => this.rowToMessage(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async deleteMessage(messageId: MessageId): Promise<void> {\n await this.db\n .delete(schema.messages)\n .where(eq(schema.messages.id, messageId));\n }\n\n async deleteSessionMessages(sessionId: SessionId): Promise<void> {\n await this.db\n .delete(schema.messages)\n .where(eq(schema.messages.sessionId, sessionId));\n }\n\n // ============================================================================\n // Attachments\n // ============================================================================\n\n async saveAttachment(\n attachment: Omit<Attachment, 'id' | 'createdAt'>\n ): Promise<Attachment> {\n const [row] = await this.db\n .insert(schema.attachments)\n .values({\n messageId: attachment.messageId,\n filename: attachment.filename,\n mimeType: attachment.mimeType,\n size: attachment.size,\n storagePath: attachment.storagePath,\n })\n .returning();\n\n return this.rowToAttachment(row!);\n }\n\n async getAttachment(attachmentId: AttachmentId): Promise<Attachment | null> {\n const [row] = await this.db\n .select()\n .from(schema.attachments)\n .where(eq(schema.attachments.id, attachmentId))\n .limit(1);\n\n return row ? this.rowToAttachment(row) : null;\n }\n\n async deleteAttachment(attachmentId: AttachmentId): Promise<void> {\n await this.db\n .delete(schema.attachments)\n .where(eq(schema.attachments.id, attachmentId));\n }\n\n async getMessageAttachments(messageId: MessageId): Promise<Attachment[]> {\n const rows = await this.db\n .select()\n .from(schema.attachments)\n .where(eq(schema.attachments.messageId, messageId));\n\n return rows.map((row) => this.rowToAttachment(row));\n }\n\n // ============================================================================\n // Transactions\n // ============================================================================\n\n async transaction<T>(fn: (storage: SessionStorage) => Promise<T>): Promise<T> {\n // For transactions, we create a new storage instance that shares the transaction context\n // This is a simplified implementation - for complex transactions, consider using\n // Drizzle's transaction API directly\n return fn(this);\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n private rowToSession(row: schema.SessionRow): Session {\n return {\n id: row.id,\n agentName: row.agentName,\n status: row.status as SessionStatus,\n sdkSessionId: row.sdkSessionId ?? undefined,\n parentSessionId: row.parentSessionId ?? undefined,\n totalTokens: row.totalTokens ?? undefined,\n totalCost: row.totalCost ?? undefined,\n metadata: (row.metadata as Record<string, unknown>) ?? undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n private rowToMessage(row: schema.MessageRow): Message {\n return {\n id: row.id,\n sessionId: row.sessionId,\n role: row.role as MessageRole,\n content: row.content as MessageContent[],\n metadata: (row.metadata as Record<string, unknown>) ?? undefined,\n createdAt: row.createdAt,\n };\n }\n\n private rowToAttachment(row: schema.AttachmentRow): Attachment {\n return {\n id: row.id,\n messageId: row.messageId,\n filename: row.filename,\n mimeType: row.mimeType,\n size: row.size,\n storagePath: row.storagePath,\n createdAt: row.createdAt,\n };\n }\n\n private rowToAgent(row: schema.AgentRow): StoredAgent {\n return {\n id: row.id,\n name: row.name,\n slug: row.slug,\n description: row.description ?? undefined,\n model: row.model,\n systemPrompt: row.systemPrompt ?? undefined,\n allowedTools: row.allowedTools ?? undefined,\n disallowedTools: row.disallowedTools ?? undefined,\n maxTurns: row.maxTurns ?? undefined,\n permissionMode: row.permissionMode as StoredAgent['permissionMode'],\n mcpServers: row.mcpServers ?? undefined,\n envVars: row.envVars ?? undefined,\n startupScript: row.startupScript ?? undefined,\n configFileUrl: row.configFileUrl ?? undefined,\n configFileUpdatedAt: row.configFileUpdatedAt ?? undefined,\n config: row.config ?? undefined,\n metadata: row.metadata ?? undefined,\n status: row.status as AgentStatus,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n deletedAt: row.deletedAt ?? undefined,\n executionWebhookUrl: row.executionWebhookUrl ?? undefined,\n executionWebhookSecret: row.executionWebhookSecret ?? undefined,\n };\n }\n\n // ============================================================================\n // Agents\n // ============================================================================\n\n private slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n async createAgent(options: CreateAgentOptions): Promise<StoredAgent> {\n const slug = options.slug || this.slugify(options.name);\n\n // Check for duplicate slug (within tenant if multi-tenant)\n const tenantCond = this.tenantCondition(schema.agents);\n const duplicateConditions = [eq(schema.agents.slug, slug), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) duplicateConditions.push(tenantCond);\n\n const existing = await this.db\n .select({ id: schema.agents.id })\n .from(schema.agents)\n .where(and(...duplicateConditions))\n .limit(1);\n\n if (existing.length > 0) {\n throw new Error(`Agent with slug \"${slug}\" already exists`);\n }\n\n const [row] = await this.db\n .insert(schema.agents)\n .values({\n tenantId: this.tenantId,\n name: options.name,\n slug,\n description: options.description,\n model: options.model ?? 'claude-sonnet-4-5',\n systemPrompt: options.systemPrompt,\n allowedTools: options.allowedTools ?? [],\n disallowedTools: options.disallowedTools ?? [],\n maxTurns: options.maxTurns,\n permissionMode: options.permissionMode,\n mcpServers: options.mcpServers ?? {},\n envVars: options.envVars ?? {},\n startupScript: options.startupScript,\n configFileUrl: options.configFileUrl,\n config: options.config ?? {},\n metadata: options.metadata ?? {},\n })\n .returning();\n\n return this.rowToAgent(row!);\n }\n\n async getAgent(agentId: AgentId): Promise<StoredAgent | null> {\n const tenantCond = this.tenantCondition(schema.agents);\n const conditions = [eq(schema.agents.id, agentId), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) conditions.push(tenantCond);\n\n const [row] = await this.db\n .select()\n .from(schema.agents)\n .where(and(...conditions))\n .limit(1);\n\n return row ? this.rowToAgent(row) : null;\n }\n\n async getAgentBySlug(slug: string): Promise<StoredAgent | null> {\n const tenantCond = this.tenantCondition(schema.agents);\n const conditions = [eq(schema.agents.slug, slug), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) conditions.push(tenantCond);\n\n const [row] = await this.db\n .select()\n .from(schema.agents)\n .where(and(...conditions))\n .limit(1);\n\n return row ? this.rowToAgent(row) : null;\n }\n\n async updateAgent(agentId: AgentId, updates: UpdateAgentOptions): Promise<StoredAgent | null> {\n const tenantCond = this.tenantCondition(schema.agents);\n const conditions = [eq(schema.agents.id, agentId), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) conditions.push(tenantCond);\n\n const updateValues: Partial<schema.NewAgentRow> = {\n updatedAt: new Date(),\n };\n\n if (updates.name !== undefined) updateValues.name = updates.name;\n if (updates.description !== undefined) updateValues.description = updates.description;\n if (updates.model !== undefined) updateValues.model = updates.model;\n if (updates.systemPrompt !== undefined) updateValues.systemPrompt = updates.systemPrompt;\n if (updates.allowedTools !== undefined) updateValues.allowedTools = updates.allowedTools;\n if (updates.disallowedTools !== undefined) updateValues.disallowedTools = updates.disallowedTools;\n if (updates.maxTurns !== undefined) updateValues.maxTurns = updates.maxTurns;\n if (updates.permissionMode !== undefined) updateValues.permissionMode = updates.permissionMode;\n if (updates.mcpServers !== undefined) updateValues.mcpServers = updates.mcpServers;\n if (updates.envVars !== undefined) updateValues.envVars = updates.envVars;\n if (updates.startupScript !== undefined) updateValues.startupScript = updates.startupScript;\n if (updates.configFileUrl !== undefined) {\n updateValues.configFileUrl = updates.configFileUrl ?? null;\n // Track when config was updated for cache busting\n updateValues.configFileUpdatedAt = new Date();\n }\n if (updates.config !== undefined) updateValues.config = updates.config;\n if (updates.metadata !== undefined) updateValues.metadata = updates.metadata;\n if (updates.status !== undefined) updateValues.status = updates.status;\n\n const [row] = await this.db\n .update(schema.agents)\n .set(updateValues)\n .where(and(...conditions))\n .returning();\n\n return row ? this.rowToAgent(row) : null;\n }\n\n async deleteAgent(agentId: AgentId): Promise<boolean> {\n const tenantCond = this.tenantCondition(schema.agents);\n const conditions = [eq(schema.agents.id, agentId), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) conditions.push(tenantCond);\n\n // Soft delete\n const result = await this.db\n .update(schema.agents)\n .set({\n status: 'deleted',\n deletedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(and(...conditions));\n\n return (result as unknown as { rowCount: number }).rowCount > 0;\n }\n\n async listAgents(options: ListAgentsOptions = {}): Promise<PaginatedResult<StoredAgent>> {\n const conditions: ReturnType<typeof eq>[] = [];\n\n // Add tenant filter if in multi-tenant mode\n const tenantCond = this.tenantCondition(schema.agents);\n if (tenantCond) conditions.push(tenantCond);\n\n conditions.push(sql`${schema.agents.deletedAt} IS NULL`);\n\n if (options.status) {\n conditions.push(eq(schema.agents.status, options.status));\n }\n\n const orderColumn =\n options.orderBy === 'updatedAt' ? schema.agents.updatedAt : schema.agents.createdAt;\n const orderFn = options.order === 'asc' ? asc : desc;\n\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n const [rows, countResult] = await Promise.all([\n this.db\n .select()\n .from(schema.agents)\n .where(and(...conditions))\n .orderBy(orderFn(orderColumn))\n .limit(limit)\n .offset(offset),\n this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.agents)\n .where(and(...conditions)),\n ]);\n\n const total = countResult[0]?.count ?? 0;\n\n return {\n items: rows.map((row) => this.rowToAgent(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async getActiveAgents(): Promise<StoredAgent[]> {\n const tenantCond = this.tenantCondition(schema.agents);\n const conditions = [eq(schema.agents.status, 'active'), sql`${schema.agents.deletedAt} IS NULL`];\n if (tenantCond) conditions.push(tenantCond);\n\n const rows = await this.db\n .select()\n .from(schema.agents)\n .where(and(...conditions))\n .orderBy(schema.agents.name);\n\n return rows.map((row) => this.rowToAgent(row));\n }\n\n // ============================================================================\n // Database Access (for extensions)\n // ============================================================================\n\n /**\n * Get the underlying Drizzle database instance\n * Useful for extensions that need direct database access\n */\n getDb() {\n return this.db;\n }\n}\n","/**\n * PostgreSQL Queue Storage Adapter\n *\n * Implements the QueueStorage interface using Drizzle ORM.\n */\n\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport { eq, and, desc, asc, sql, lt, or, isNull } from 'drizzle-orm';\nimport postgres from 'postgres';\nimport type {\n QueueItem,\n CreateQueueItemOptions,\n ListQueueItemsOptions,\n QueueItemStatus,\n QueueStats,\n SessionId,\n PaginatedResult,\n} from '../index.js';\nimport type { QueueStorage } from '../storage/interface.js';\nimport * as schema from './schema.js';\n\nexport interface PostgresQueueStorageConfig {\n /**\n * PostgreSQL connection string\n */\n connectionString: string;\n}\n\n/**\n * PostgreSQL queue storage implementation using Drizzle ORM\n */\nexport class PostgresQueueStorage implements QueueStorage {\n private client: ReturnType<typeof postgres>;\n private db: ReturnType<typeof drizzle>;\n private initialized = false;\n\n constructor(config: PostgresQueueStorageConfig) {\n this.client = postgres(config.connectionString);\n this.db = drizzle(this.client, { schema });\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Test connection\n await this.db.execute(sql`SELECT 1`);\n\n this.initialized = true;\n }\n\n /**\n * Create the queue_items table schema if it doesn't exist\n */\n async createSchema(): Promise<void> {\n // Create enum\n await this.db.execute(sql`\n DO $$ BEGIN\n CREATE TYPE queue_item_status AS ENUM ('pending', 'processing', 'completed', 'failed', 'cancelled');\n EXCEPTION\n WHEN duplicate_object THEN null;\n END $$;\n `);\n\n // Create table\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS queue_items (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n session_id UUID REFERENCES sessions(id) ON DELETE CASCADE,\n agent_name TEXT NOT NULL,\n prompt TEXT NOT NULL,\n files JSONB,\n session_context TEXT,\n metadata JSONB DEFAULT '{}',\n status queue_item_status NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 0,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 3,\n error TEXT,\n result_message_id UUID,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n started_at TIMESTAMPTZ,\n completed_at TIMESTAMPTZ\n );\n `);\n\n // Create indexes\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_agent ON queue_items(agent_name);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_session ON queue_items(session_id);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_status ON queue_items(status);\n `);\n await this.db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_queue_items_pending ON queue_items(agent_name, session_id, status, priority DESC, created_at ASC);\n `);\n }\n\n async close(): Promise<void> {\n await this.client.end();\n this.initialized = false;\n }\n\n async createQueueItem(options: CreateQueueItemOptions): Promise<QueueItem> {\n const [row] = await this.db\n .insert(schema.queueItems)\n .values({\n sessionId: options.sessionId ?? null,\n agentName: options.agentName,\n prompt: options.prompt,\n files: options.files ?? null,\n sessionContext: options.sessionContext ?? null,\n metadata: options.metadata ?? {},\n priority: options.priority ?? 0,\n maxRetries: options.maxRetries ?? 3,\n })\n .returning();\n\n return this.rowToQueueItem(row!);\n }\n\n async getQueueItem(id: string): Promise<QueueItem | null> {\n const [row] = await this.db\n .select()\n .from(schema.queueItems)\n .where(eq(schema.queueItems.id, id))\n .limit(1);\n\n return row ? this.rowToQueueItem(row) : null;\n }\n\n async updateQueueItem(\n id: string,\n updates: Partial<Pick<QueueItem, 'status' | 'error' | 'resultMessageId' | 'sessionId' | 'retryCount' | 'startedAt' | 'completedAt'>>\n ): Promise<QueueItem | null> {\n const updateValues: Partial<schema.NewQueueItemRow> = {\n updatedAt: new Date(),\n };\n\n if (updates.status !== undefined) {\n updateValues.status = updates.status as 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n }\n if (updates.error !== undefined) updateValues.error = updates.error;\n if (updates.resultMessageId !== undefined) updateValues.resultMessageId = updates.resultMessageId;\n if (updates.sessionId !== undefined) updateValues.sessionId = updates.sessionId;\n if (updates.retryCount !== undefined) updateValues.retryCount = updates.retryCount;\n if (updates.startedAt !== undefined) updateValues.startedAt = updates.startedAt;\n if (updates.completedAt !== undefined) updateValues.completedAt = updates.completedAt;\n\n const [row] = await this.db\n .update(schema.queueItems)\n .set(updateValues)\n .where(eq(schema.queueItems.id, id))\n .returning();\n\n return row ? this.rowToQueueItem(row) : null;\n }\n\n async deleteQueueItem(id: string): Promise<boolean> {\n const result = await this.db\n .delete(schema.queueItems)\n .where(eq(schema.queueItems.id, id));\n\n return (result as unknown as { rowCount: number }).rowCount > 0;\n }\n\n async listQueueItems(options: ListQueueItemsOptions = {}): Promise<PaginatedResult<QueueItem>> {\n const conditions: ReturnType<typeof eq>[] = [];\n\n if (options.sessionId) {\n conditions.push(eq(schema.queueItems.sessionId, options.sessionId));\n }\n if (options.agentName) {\n conditions.push(eq(schema.queueItems.agentName, options.agentName));\n }\n if (options.status) {\n conditions.push(\n eq(schema.queueItems.status, options.status as 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled')\n );\n }\n\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n const [rows, countResult] = await Promise.all([\n this.db\n .select()\n .from(schema.queueItems)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(schema.queueItems.priority), asc(schema.queueItems.createdAt))\n .limit(limit)\n .offset(offset),\n this.db\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.queueItems)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\n ]);\n\n const total = countResult[0]?.count ?? 0;\n\n return {\n items: rows.map((row) => this.rowToQueueItem(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async getNextPendingItem(\n agentName: string,\n sessionId?: SessionId | null,\n markAsProcessing = false\n ): Promise<QueueItem | null> {\n if (markAsProcessing) {\n // Use a transaction to atomically get and update\n const conditions = [\n eq(schema.queueItems.agentName, agentName),\n eq(schema.queueItems.status, 'pending'),\n ];\n\n if (sessionId !== undefined) {\n if (sessionId === null) {\n conditions.push(isNull(schema.queueItems.sessionId));\n } else {\n conditions.push(eq(schema.queueItems.sessionId, sessionId));\n }\n }\n\n // Get the next item and update it atomically using a CTE\n const result = await this.db.execute(sql`\n WITH next_item AS (\n SELECT id FROM queue_items\n WHERE agent_name = ${agentName}\n AND status = 'pending'\n ${sessionId === undefined ? sql`` : sessionId === null ? sql`AND session_id IS NULL` : sql`AND session_id = ${sessionId}`}\n ORDER BY priority DESC, created_at ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED\n )\n UPDATE queue_items\n SET status = 'processing', started_at = NOW(), updated_at = NOW()\n WHERE id = (SELECT id FROM next_item)\n RETURNING *\n `);\n\n const row = (result as unknown as schema.QueueItemRow[])[0];\n return row ? this.rowToQueueItem(row) : null;\n }\n\n // Just get without updating\n const conditions = [\n eq(schema.queueItems.agentName, agentName),\n eq(schema.queueItems.status, 'pending'),\n ];\n\n if (sessionId !== undefined) {\n if (sessionId === null) {\n conditions.push(isNull(schema.queueItems.sessionId));\n } else {\n conditions.push(eq(schema.queueItems.sessionId, sessionId));\n }\n }\n\n const [row] = await this.db\n .select()\n .from(schema.queueItems)\n .where(and(...conditions))\n .orderBy(desc(schema.queueItems.priority), asc(schema.queueItems.createdAt))\n .limit(1);\n\n return row ? this.rowToQueueItem(row) : null;\n }\n\n async getPendingItemsForSession(\n agentName: string,\n sessionId: SessionId | null\n ): Promise<QueueItem[]> {\n const conditions = [\n eq(schema.queueItems.agentName, agentName),\n eq(schema.queueItems.status, 'pending'),\n ];\n\n if (sessionId === null) {\n conditions.push(isNull(schema.queueItems.sessionId));\n } else {\n conditions.push(eq(schema.queueItems.sessionId, sessionId));\n }\n\n const rows = await this.db\n .select()\n .from(schema.queueItems)\n .where(and(...conditions))\n .orderBy(desc(schema.queueItems.priority), asc(schema.queueItems.createdAt));\n\n return rows.map((row) => this.rowToQueueItem(row));\n }\n\n async cancelPendingItems(\n agentName: string,\n sessionId?: SessionId | null\n ): Promise<number> {\n const conditions = [\n eq(schema.queueItems.agentName, agentName),\n eq(schema.queueItems.status, 'pending'),\n ];\n\n if (sessionId !== undefined) {\n if (sessionId === null) {\n conditions.push(isNull(schema.queueItems.sessionId));\n } else {\n conditions.push(eq(schema.queueItems.sessionId, sessionId));\n }\n }\n\n const result = await this.db\n .update(schema.queueItems)\n .set({\n status: 'cancelled',\n completedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(and(...conditions));\n\n return (result as unknown as { rowCount: number }).rowCount;\n }\n\n async getQueueStats(agentName?: string): Promise<QueueStats> {\n const conditions = agentName\n ? [eq(schema.queueItems.agentName, agentName)]\n : [];\n\n const result = await this.db\n .select({\n status: schema.queueItems.status,\n count: sql<number>`count(*)::int`,\n })\n .from(schema.queueItems)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .groupBy(schema.queueItems.status);\n\n const stats: QueueStats = {\n pending: 0,\n processing: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: 0,\n };\n\n for (const row of result) {\n const status = row.status as keyof Omit<QueueStats, 'total'>;\n stats[status] = row.count;\n stats.total += row.count;\n }\n\n return stats;\n }\n\n async cleanupOldItems(maxAgeMs: number): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeMs);\n\n const result = await this.db\n .delete(schema.queueItems)\n .where(\n and(\n or(\n eq(schema.queueItems.status, 'completed'),\n eq(schema.queueItems.status, 'failed'),\n eq(schema.queueItems.status, 'cancelled')\n ),\n lt(schema.queueItems.completedAt, cutoff)\n )\n );\n\n return (result as unknown as { rowCount: number }).rowCount;\n }\n\n private rowToQueueItem(row: schema.QueueItemRow): QueueItem {\n return {\n id: row.id,\n sessionId: row.sessionId,\n agentName: row.agentName,\n prompt: row.prompt,\n files: row.files ?? undefined,\n sessionContext: row.sessionContext ?? undefined,\n metadata: row.metadata ?? undefined,\n status: row.status as QueueItemStatus,\n priority: row.priority,\n retryCount: row.retryCount,\n maxRetries: row.maxRetries,\n error: row.error ?? undefined,\n resultMessageId: row.resultMessageId ?? undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n startedAt: row.startedAt ?? undefined,\n completedAt: row.completedAt ?? undefined,\n };\n }\n\n /**\n * Get the underlying Drizzle database instance\n */\n getDb() {\n return this.db;\n }\n}\n","/**\n * Supabase Storage Adapter for Agent SDK Harness\n *\n * Implements the SessionStorage interface using Supabase's JavaScript client.\n * Uses PostgREST under the hood, which doesn't create direct database connections,\n * avoiding connection pooling limits that occur with direct postgres connections.\n *\n * For multi-tenant deployments, use the tenantId option to filter all queries.\n */\n\nimport { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport type {\n SessionStorage,\n TransactionalStorage,\n AgentStorage,\n Session,\n SessionId,\n Message,\n MessageId,\n Attachment,\n AttachmentId,\n ListSessionsOptions,\n PaginatedResult,\n PaginationOptions,\n SessionStatus,\n MessageRole,\n MessageContent,\n StoredAgent,\n AgentId,\n CreateAgentOptions,\n UpdateAgentOptions,\n ListAgentsOptions,\n AgentStatus,\n} from '../index.js';\n\n/**\n * Configuration for SupabaseStorage\n */\nexport interface SupabaseStorageConfig {\n /**\n * Supabase project URL\n * @example \"https://your-project.supabase.co\"\n */\n supabaseUrl: string;\n\n /**\n * Supabase service role key (for server-side access)\n * Use service_role key for full database access\n * @example \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n */\n supabaseKey: string;\n\n /**\n * Optional tenant ID for multi-tenant deployments.\n * When set, all queries are filtered by tenant_id and all\n * inserts include the tenant_id. When not set (single-tenant\n * mode), tenant filtering is disabled.\n * @example \"project-uuid-here\"\n */\n tenantId?: string;\n}\n\n// Database row types (matching Supabase table structure)\ninterface SessionRow {\n id: string;\n tenant_id: string | null;\n agent_name: string;\n status: 'active' | 'completed' | 'error' | 'suspended';\n sdk_session_id: string | null;\n parent_session_id: string | null;\n total_tokens: number | null;\n total_cost: number | null;\n metadata: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\ninterface MessageRow {\n id: string;\n session_id: string;\n role: 'user' | 'assistant' | 'tool' | 'system';\n content: unknown[];\n metadata: Record<string, unknown>;\n created_at: string;\n}\n\ninterface AttachmentRow {\n id: string;\n message_id: string;\n filename: string;\n mime_type: string;\n size: number;\n storage_path: string;\n created_at: string;\n}\n\ninterface AgentRow {\n id: string;\n tenant_id: string | null;\n name: string;\n slug: string;\n description: string | null;\n model: string;\n backend: 'claude' | 'gemini' | null;\n system_prompt: string | null;\n allowed_tools: string[] | null;\n disallowed_tools: string[] | null;\n max_turns: number | null;\n permission_mode: string | null;\n mcp_servers: Record<string, unknown> | null;\n env_vars: Record<string, string> | null;\n startup_script: string | null;\n config_file_url: string | null;\n config_file_updated_at: string | null;\n config: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n status: 'active' | 'paused' | 'deleted';\n created_at: string;\n updated_at: string;\n deleted_at: string | null;\n execution_webhook_url: string | null;\n execution_webhook_secret: string | null;\n}\n\n/**\n * Supabase storage implementation using Supabase JS client.\n * Uses PostgREST API which avoids direct database connection issues.\n */\nexport class SupabaseStorage implements SessionStorage, TransactionalStorage, AgentStorage {\n private client: SupabaseClient;\n private initialized = false;\n private tenantId: string | null;\n\n constructor(config: SupabaseStorageConfig) {\n this.client = createClient(config.supabaseUrl, config.supabaseKey, {\n auth: {\n autoRefreshToken: false,\n persistSession: false,\n },\n });\n this.tenantId = config.tenantId ?? null;\n }\n\n /**\n * Get the tenant ID for this storage instance.\n * Returns null for single-tenant mode.\n */\n getTenantId(): string | null {\n return this.tenantId;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Test connection by querying sessions table\n const { error } = await this.client\n .from('sessions')\n .select('id')\n .limit(1);\n\n if (error) {\n throw new Error(`Failed to initialize Supabase storage: ${error.message}`);\n }\n\n this.initialized = true;\n }\n\n async close(): Promise<void> {\n // Supabase client doesn't require explicit closing\n this.initialized = false;\n }\n\n // ============================================================================\n // Sessions\n // ============================================================================\n\n async createSession(\n session: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<Session> {\n const { data, error } = await this.client\n .from('sessions')\n .insert({\n tenant_id: this.tenantId,\n agent_name: session.agentName,\n status: session.status,\n sdk_session_id: session.sdkSessionId ?? null,\n parent_session_id: session.parentSessionId ?? null,\n total_tokens: session.totalTokens ?? null,\n total_cost: session.totalCost ?? null,\n metadata: session.metadata ?? {},\n })\n .select()\n .single();\n\n if (error) {\n throw new Error(`Failed to create session: ${error.message}`);\n }\n\n return this.rowToSession(data as SessionRow);\n }\n\n async getSession(sessionId: SessionId): Promise<Session | null> {\n let query = this.client\n .from('sessions')\n .select('*')\n .eq('id', sessionId);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === 'PGRST116') return null; // Not found\n throw new Error(`Failed to get session: ${error.message}`);\n }\n\n return data ? this.rowToSession(data as SessionRow) : null;\n }\n\n async updateSession(\n sessionId: SessionId,\n updates: Partial<Omit<Session, 'id' | 'createdAt' | 'agentName'>>\n ): Promise<Session> {\n const updateData: Partial<Record<string, unknown>> = {\n updated_at: new Date().toISOString(),\n };\n\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.sdkSessionId !== undefined) updateData.sdk_session_id = updates.sdkSessionId;\n if (updates.parentSessionId !== undefined) updateData.parent_session_id = updates.parentSessionId;\n if (updates.totalTokens !== undefined) updateData.total_tokens = updates.totalTokens;\n if (updates.totalCost !== undefined) updateData.total_cost = updates.totalCost;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n let query = this.client\n .from('sessions')\n .update(updateData)\n .eq('id', sessionId);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.select().single();\n\n if (error) {\n throw new Error(`Failed to update session: ${error.message}`);\n }\n\n if (!data) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n return this.rowToSession(data as SessionRow);\n }\n\n async deleteSession(sessionId: SessionId): Promise<void> {\n let query = this.client\n .from('sessions')\n .delete()\n .eq('id', sessionId);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { error } = await query;\n\n if (error) {\n throw new Error(`Failed to delete session: ${error.message}`);\n }\n }\n\n async listSessions(\n options: ListSessionsOptions = {}\n ): Promise<PaginatedResult<Session>> {\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n let query = this.client\n .from('sessions')\n .select('*', { count: 'exact' });\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n if (options.agentName) {\n query = query.eq('agent_name', options.agentName);\n }\n\n if (options.status) {\n query = query.eq('status', options.status);\n }\n\n const orderColumn = options.orderBy === 'updatedAt' ? 'updated_at' : 'created_at';\n const ascending = options.order === 'asc';\n\n query = query\n .order(orderColumn, { ascending })\n .range(offset, offset + limit - 1);\n\n const { data, error, count } = await query;\n\n if (error) {\n throw new Error(`Failed to list sessions: ${error.message}`);\n }\n\n const total = count ?? 0;\n\n return {\n items: (data as SessionRow[]).map((row) => this.rowToSession(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n async saveMessages(\n messages: Omit<Message, 'id' | 'createdAt'>[]\n ): Promise<Message[]> {\n if (messages.length === 0) return [];\n\n const { data, error } = await this.client\n .from('messages')\n .insert(\n messages.map((msg) => ({\n session_id: msg.sessionId,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata ?? {},\n }))\n )\n .select();\n\n if (error) {\n throw new Error(`Failed to save messages: ${error.message}`);\n }\n\n return (data as MessageRow[]).map((row) => this.rowToMessage(row));\n }\n\n async getMessage(messageId: MessageId): Promise<Message | null> {\n // Join through sessions to verify tenant ownership\n let query = this.client\n .from('messages')\n .select('*, sessions!inner(tenant_id)')\n .eq('id', messageId);\n\n if (this.tenantId) {\n query = query.eq('sessions.tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === 'PGRST116') return null;\n throw new Error(`Failed to get message: ${error.message}`);\n }\n\n return data ? this.rowToMessage(data as MessageRow) : null;\n }\n\n async getMessages(\n sessionId: SessionId,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<Message>> {\n const limit = options.limit ?? 100;\n const offset = options.offset ?? 0;\n const ascending = options.order !== 'desc';\n\n const { data, error, count } = await this.client\n .from('messages')\n .select('*', { count: 'exact' })\n .eq('session_id', sessionId)\n .order('created_at', { ascending })\n .range(offset, offset + limit - 1);\n\n if (error) {\n throw new Error(`Failed to get messages: ${error.message}`);\n }\n\n const total = count ?? 0;\n\n return {\n items: (data as MessageRow[]).map((row) => this.rowToMessage(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async deleteMessage(messageId: MessageId): Promise<void> {\n // First verify the message belongs to a session owned by this tenant\n if (this.tenantId) {\n const { data: message } = await this.client\n .from('messages')\n .select('session_id, sessions!inner(tenant_id)')\n .eq('id', messageId)\n .eq('sessions.tenant_id', this.tenantId)\n .single();\n\n if (!message) {\n throw new Error(`Message not found or access denied: ${messageId}`);\n }\n }\n\n const { error } = await this.client\n .from('messages')\n .delete()\n .eq('id', messageId);\n\n if (error) {\n throw new Error(`Failed to delete message: ${error.message}`);\n }\n }\n\n async deleteSessionMessages(sessionId: SessionId): Promise<void> {\n // First verify the session belongs to this tenant\n if (this.tenantId) {\n const { data: session } = await this.client\n .from('sessions')\n .select('id')\n .eq('id', sessionId)\n .eq('tenant_id', this.tenantId)\n .single();\n\n if (!session) {\n throw new Error(`Session not found or access denied: ${sessionId}`);\n }\n }\n\n const { error } = await this.client\n .from('messages')\n .delete()\n .eq('session_id', sessionId);\n\n if (error) {\n throw new Error(`Failed to delete session messages: ${error.message}`);\n }\n }\n\n // ============================================================================\n // Attachments\n // ============================================================================\n\n async saveAttachment(\n attachment: Omit<Attachment, 'id' | 'createdAt'>\n ): Promise<Attachment> {\n const { data, error } = await this.client\n .from('attachments')\n .insert({\n message_id: attachment.messageId,\n filename: attachment.filename,\n mime_type: attachment.mimeType,\n size: attachment.size,\n storage_path: attachment.storagePath,\n })\n .select()\n .single();\n\n if (error) {\n throw new Error(`Failed to save attachment: ${error.message}`);\n }\n\n return this.rowToAttachment(data as AttachmentRow);\n }\n\n async getAttachment(attachmentId: AttachmentId): Promise<Attachment | null> {\n // Join through messages -> sessions to verify tenant ownership\n let query = this.client\n .from('attachments')\n .select('*, messages!inner(session_id, sessions:sessions!inner(tenant_id))')\n .eq('id', attachmentId);\n\n if (this.tenantId) {\n query = query.eq('messages.sessions.tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === 'PGRST116') return null;\n throw new Error(`Failed to get attachment: ${error.message}`);\n }\n\n return data ? this.rowToAttachment(data as AttachmentRow) : null;\n }\n\n async deleteAttachment(attachmentId: AttachmentId): Promise<void> {\n // First verify the attachment belongs to a session owned by this tenant\n if (this.tenantId) {\n const { data: attachment } = await this.client\n .from('attachments')\n .select('id, messages!inner(session_id, sessions:sessions!inner(tenant_id))')\n .eq('id', attachmentId)\n .eq('messages.sessions.tenant_id', this.tenantId)\n .single();\n\n if (!attachment) {\n throw new Error(`Attachment not found or access denied: ${attachmentId}`);\n }\n }\n\n const { error } = await this.client\n .from('attachments')\n .delete()\n .eq('id', attachmentId);\n\n if (error) {\n throw new Error(`Failed to delete attachment: ${error.message}`);\n }\n }\n\n async getMessageAttachments(messageId: MessageId): Promise<Attachment[]> {\n // Join through messages -> sessions to verify tenant ownership\n let query = this.client\n .from('attachments')\n .select('*, messages!inner(session_id, sessions:sessions!inner(tenant_id))')\n .eq('message_id', messageId);\n\n if (this.tenantId) {\n query = query.eq('messages.sessions.tenant_id', this.tenantId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new Error(`Failed to get message attachments: ${error.message}`);\n }\n\n return (data as AttachmentRow[]).map((row) => this.rowToAttachment(row));\n }\n\n // ============================================================================\n // Transactions\n // ============================================================================\n\n async transaction<T>(fn: (storage: SessionStorage) => Promise<T>): Promise<T> {\n // Supabase JS client doesn't support true transactions through PostgREST\n // For complex transactional operations, consider using RPC functions\n return fn(this);\n }\n\n // ============================================================================\n // Agents\n // ============================================================================\n\n private slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n async createAgent(options: CreateAgentOptions): Promise<StoredAgent> {\n const slug = options.slug || this.slugify(options.name);\n\n // Check for duplicate slug\n let checkQuery = this.client\n .from('agents')\n .select('id')\n .eq('slug', slug)\n .is('deleted_at', null);\n\n if (this.tenantId) {\n checkQuery = checkQuery.eq('tenant_id', this.tenantId);\n }\n\n const { data: existing } = await checkQuery.limit(1);\n\n if (existing && existing.length > 0) {\n throw new Error(`Agent with slug \"${slug}\" already exists`);\n }\n\n const { data, error } = await this.client\n .from('agents')\n .insert({\n tenant_id: this.tenantId,\n name: options.name,\n slug,\n description: options.description,\n model: options.model ?? 'claude-sonnet-4-5',\n system_prompt: options.systemPrompt,\n allowed_tools: options.allowedTools ?? [],\n disallowed_tools: options.disallowedTools ?? [],\n max_turns: options.maxTurns,\n permission_mode: options.permissionMode,\n mcp_servers: options.mcpServers ?? {},\n env_vars: options.envVars ?? {},\n startup_script: options.startupScript,\n config_file_url: options.configFileUrl,\n config: options.config ?? {},\n metadata: options.metadata ?? {},\n })\n .select()\n .single();\n\n if (error) {\n throw new Error(`Failed to create agent: ${error.message}`);\n }\n\n return this.rowToAgent(data as AgentRow);\n }\n\n async getAgent(agentId: AgentId): Promise<StoredAgent | null> {\n let query = this.client\n .from('agents')\n .select('*')\n .eq('id', agentId)\n .is('deleted_at', null);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === 'PGRST116') return null;\n throw new Error(`Failed to get agent: ${error.message}`);\n }\n\n return data ? this.rowToAgent(data as AgentRow) : null;\n }\n\n async getAgentBySlug(slug: string): Promise<StoredAgent | null> {\n let query = this.client\n .from('agents')\n .select('*')\n .eq('slug', slug)\n .is('deleted_at', null);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === 'PGRST116') return null;\n throw new Error(`Failed to get agent by slug: ${error.message}`);\n }\n\n return data ? this.rowToAgent(data as AgentRow) : null;\n }\n\n async updateAgent(agentId: AgentId, updates: UpdateAgentOptions): Promise<StoredAgent | null> {\n const updateData: Partial<Record<string, unknown>> = {\n updated_at: new Date().toISOString(),\n };\n\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.description !== undefined) updateData.description = updates.description;\n if (updates.model !== undefined) updateData.model = updates.model;\n if (updates.systemPrompt !== undefined) updateData.system_prompt = updates.systemPrompt;\n if (updates.allowedTools !== undefined) updateData.allowed_tools = updates.allowedTools;\n if (updates.disallowedTools !== undefined) updateData.disallowed_tools = updates.disallowedTools;\n if (updates.maxTurns !== undefined) updateData.max_turns = updates.maxTurns;\n if (updates.permissionMode !== undefined) updateData.permission_mode = updates.permissionMode;\n if (updates.mcpServers !== undefined) updateData.mcp_servers = updates.mcpServers;\n if (updates.envVars !== undefined) updateData.env_vars = updates.envVars;\n if (updates.startupScript !== undefined) updateData.startup_script = updates.startupScript;\n if (updates.configFileUrl !== undefined) updateData.config_file_url = updates.configFileUrl;\n if (updates.config !== undefined) updateData.config = updates.config;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n if (updates.status !== undefined) updateData.status = updates.status;\n\n let query = this.client\n .from('agents')\n .update(updateData)\n .eq('id', agentId)\n .is('deleted_at', null);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.select().single();\n\n if (error) {\n if (error.code === 'PGRST116') return null;\n throw new Error(`Failed to update agent: ${error.message}`);\n }\n\n return data ? this.rowToAgent(data as AgentRow) : null;\n }\n\n async deleteAgent(agentId: AgentId): Promise<boolean> {\n let query = this.client\n .from('agents')\n .update({\n status: 'deleted',\n deleted_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .is('deleted_at', null);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query.select();\n\n if (error) {\n throw new Error(`Failed to delete agent: ${error.message}`);\n }\n\n return (data?.length ?? 0) > 0;\n }\n\n async listAgents(options: ListAgentsOptions = {}): Promise<PaginatedResult<StoredAgent>> {\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n let query = this.client\n .from('agents')\n .select('*', { count: 'exact' })\n .is('deleted_at', null);\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n if (options.status) {\n query = query.eq('status', options.status);\n }\n\n const orderColumn = options.orderBy === 'updatedAt' ? 'updated_at' : 'created_at';\n const ascending = options.order === 'asc';\n\n query = query\n .order(orderColumn, { ascending })\n .range(offset, offset + limit - 1);\n\n const { data, error, count } = await query;\n\n if (error) {\n throw new Error(`Failed to list agents: ${error.message}`);\n }\n\n const total = count ?? 0;\n\n return {\n items: (data as AgentRow[]).map((row) => this.rowToAgent(row)),\n total,\n hasMore: offset + limit < total,\n nextCursor: offset + limit < total ? String(offset + limit) : undefined,\n };\n }\n\n async getActiveAgents(): Promise<StoredAgent[]> {\n let query = this.client\n .from('agents')\n .select('*')\n .eq('status', 'active')\n .is('deleted_at', null)\n .order('name', { ascending: true });\n\n if (this.tenantId) {\n query = query.eq('tenant_id', this.tenantId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new Error(`Failed to get active agents: ${error.message}`);\n }\n\n return (data as AgentRow[]).map((row) => this.rowToAgent(row));\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n private rowToSession(row: SessionRow): Session {\n return {\n id: row.id,\n agentName: row.agent_name,\n status: row.status as SessionStatus,\n sdkSessionId: row.sdk_session_id ?? undefined,\n parentSessionId: row.parent_session_id ?? undefined,\n totalTokens: row.total_tokens ?? undefined,\n totalCost: row.total_cost ?? undefined,\n metadata: row.metadata ?? undefined,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n };\n }\n\n private rowToMessage(row: MessageRow): Message {\n return {\n id: row.id,\n sessionId: row.session_id,\n role: row.role as MessageRole,\n content: row.content as MessageContent[],\n metadata: row.metadata ?? undefined,\n createdAt: new Date(row.created_at),\n };\n }\n\n private rowToAttachment(row: AttachmentRow): Attachment {\n return {\n id: row.id,\n messageId: row.message_id,\n filename: row.filename,\n mimeType: row.mime_type,\n size: row.size,\n storagePath: row.storage_path,\n createdAt: new Date(row.created_at),\n };\n }\n\n private rowToAgent(row: AgentRow): StoredAgent {\n return {\n id: row.id,\n name: row.name,\n slug: row.slug,\n description: row.description ?? undefined,\n model: row.model,\n systemPrompt: row.system_prompt ?? undefined,\n allowedTools: row.allowed_tools ?? undefined,\n disallowedTools: row.disallowed_tools ?? undefined,\n maxTurns: row.max_turns ?? undefined,\n permissionMode: row.permission_mode as StoredAgent['permissionMode'],\n mcpServers: row.mcp_servers as StoredAgent['mcpServers'],\n envVars: row.env_vars ?? undefined,\n startupScript: row.startup_script ?? undefined,\n configFileUrl: row.config_file_url ?? undefined,\n configFileUpdatedAt: row.config_file_updated_at ? new Date(row.config_file_updated_at) : undefined,\n config: row.config ?? undefined,\n metadata: row.metadata ?? undefined,\n status: row.status as AgentStatus,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n deletedAt: row.deleted_at ? new Date(row.deleted_at) : undefined,\n executionWebhookUrl: row.execution_webhook_url ?? undefined,\n executionWebhookSecret: row.execution_webhook_secret ?? undefined,\n };\n }\n}\n","/**\n * HTTP client for Ash Cloud API\n */\n\nexport interface AshCloudConfig {\n /** API key from Ash Cloud dashboard */\n apiKey: string;\n /** Base URL (defaults to https://api.ash.cloud) */\n baseUrl?: string;\n /** Project slug (optional - uses default project if not specified) */\n projectSlug?: string;\n /** Request timeout in ms (default 30000) */\n timeout?: number;\n}\n\nexport interface AshCloudError {\n code: string;\n message: string;\n status: number;\n}\n\nexport class AshCloudClient {\n private apiKey: string;\n private baseUrl: string;\n private projectSlug?: string;\n private timeout: number;\n\n constructor(config: AshCloudConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl?.replace(/\\/$/, '') || 'https://api.ash.cloud';\n this.projectSlug = config.projectSlug;\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * Make an authenticated request to the Ash Cloud API\n */\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n timeout?: number;\n }\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n // Add query parameters\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n // Add project slug to headers if specified\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n if (this.projectSlug) {\n headers['X-Project-Slug'] = this.projectSlug;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n options?.timeout || this.timeout\n );\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n let errorData: AshCloudError;\n try {\n errorData = (await response.json()) as AshCloudError;\n } catch {\n errorData = {\n code: 'UNKNOWN_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n };\n }\n throw new AshCloudApiError(errorData);\n }\n\n // Handle empty responses\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof AshCloudApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new AshCloudApiError({\n code: 'TIMEOUT',\n message: 'Request timed out',\n status: 408,\n });\n }\n\n throw new AshCloudApiError({\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network error',\n status: 0,\n });\n }\n }\n\n /**\n * Make a streaming request (for SSE endpoints)\n */\n async *stream<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n signal?: AbortSignal;\n }\n ): AsyncGenerator<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n if (this.projectSlug) {\n headers['X-Project-Slug'] = this.projectSlug;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n let errorData: AshCloudError;\n try {\n errorData = (await response.json()) as AshCloudError;\n } catch {\n errorData = {\n code: 'UNKNOWN_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n status: response.status,\n };\n }\n throw new AshCloudApiError(errorData);\n }\n\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n return;\n }\n try {\n yield JSON.parse(data) as T;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nexport class AshCloudApiError extends Error {\n code: string;\n status: number;\n\n constructor(error: AshCloudError) {\n super(error.message);\n this.name = 'AshCloudApiError';\n this.code = error.code;\n this.status = error.status;\n }\n}\n","/**\n * Cloud Storage Adapter\n *\n * Implements SessionStorage and AgentStorage interfaces using the Ash Cloud API.\n * This allows open-source users to use Ash Cloud as their backend without\n * running their own database.\n */\n\nimport type {\n SessionStorage,\n AgentStorage,\n QueueStorage,\n} from '../storage/interface.js';\nimport type {\n Session,\n SessionId,\n Message,\n MessageId,\n Attachment,\n AttachmentId,\n PaginatedResult,\n PaginationOptions,\n ListSessionsOptions,\n StoredAgent,\n AgentId,\n CreateAgentOptions,\n UpdateAgentOptions,\n ListAgentsOptions,\n QueueItem,\n CreateQueueItemOptions,\n ListQueueItemsOptions,\n QueueStats,\n} from '../types/index.js';\nimport { AshCloudClient, type AshCloudConfig } from './client.js';\n\nexport interface CloudStorageConfig extends AshCloudConfig {\n /** Agent slug to use for session operations */\n agentSlug?: string;\n}\n\n/**\n * CloudStorage - Use Ash Cloud as your storage backend\n *\n * @example\n * ```typescript\n * import { AgentHarness, CloudStorage } from '@ash-cloud/ash-ai';\n *\n * const harness = new AgentHarness({\n * storage: new CloudStorage({\n * apiKey: process.env.ASH_CLOUD_API_KEY,\n * }),\n * });\n * ```\n */\nexport class CloudStorage implements SessionStorage, AgentStorage, QueueStorage {\n private client: AshCloudClient;\n private initialized = false;\n\n constructor(config: CloudStorageConfig) {\n this.client = new AshCloudClient(config);\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Verify API key by making a health check request\n try {\n await this.client.request<{ ok: boolean }>('GET', '/api/v1/status');\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to connect to Ash Cloud: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async close(): Promise<void> {\n // No persistent connections to close\n this.initialized = false;\n }\n\n // ============================================================================\n // Sessions\n // ============================================================================\n\n async createSession(\n session: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<Session> {\n const result = await this.client.request<Session>('POST', '/api/v1/sessions', {\n body: {\n agentSlug: session.agentName,\n metadata: session.metadata,\n },\n });\n return this.parseSession(result);\n }\n\n async getSession(sessionId: SessionId): Promise<Session | null> {\n try {\n const result = await this.client.request<Session>(\n 'GET',\n `/api/v1/sessions/${sessionId}`\n );\n return this.parseSession(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async updateSession(\n sessionId: SessionId,\n updates: Partial<Omit<Session, 'id' | 'createdAt' | 'agentName'>>\n ): Promise<Session> {\n const result = await this.client.request<Session>(\n 'PATCH',\n `/api/v1/sessions/${sessionId}`,\n { body: updates }\n );\n return this.parseSession(result);\n }\n\n async deleteSession(sessionId: SessionId): Promise<void> {\n await this.client.request('DELETE', `/api/v1/sessions/${sessionId}`);\n }\n\n async listSessions(\n options?: ListSessionsOptions\n ): Promise<PaginatedResult<Session>> {\n const result = await this.client.request<PaginatedResult<Session>>(\n 'GET',\n '/api/v1/sessions',\n {\n query: {\n limit: options?.limit,\n offset: options?.offset,\n agentName: options?.agentName,\n status: options?.status,\n },\n }\n );\n return {\n ...result,\n items: result.items.map((s) => this.parseSession(s)),\n };\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n async saveMessages(\n messages: Omit<Message, 'id' | 'createdAt'>[]\n ): Promise<Message[]> {\n if (messages.length === 0) return [];\n\n const firstMessage = messages[0];\n if (!firstMessage) return [];\n\n const sessionId = firstMessage.sessionId;\n const result = await this.client.request<Message[]>(\n 'POST',\n `/api/v1/sessions/${sessionId}/messages`,\n { body: { messages } }\n );\n return result.map((m) => this.parseMessage(m));\n }\n\n async getMessage(messageId: MessageId): Promise<Message | null> {\n try {\n const result = await this.client.request<Message>(\n 'GET',\n `/api/v1/messages/${messageId}`\n );\n return this.parseMessage(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getMessages(\n sessionId: SessionId,\n options?: PaginationOptions\n ): Promise<PaginatedResult<Message>> {\n const result = await this.client.request<PaginatedResult<Message>>(\n 'GET',\n `/api/v1/sessions/${sessionId}/messages`,\n {\n query: {\n limit: options?.limit,\n offset: options?.offset,\n },\n }\n );\n return {\n ...result,\n items: result.items.map((m) => this.parseMessage(m)),\n };\n }\n\n async deleteMessage(messageId: MessageId): Promise<void> {\n await this.client.request('DELETE', `/api/v1/messages/${messageId}`);\n }\n\n async deleteSessionMessages(sessionId: SessionId): Promise<void> {\n await this.client.request('DELETE', `/api/v1/sessions/${sessionId}/messages`);\n }\n\n // ============================================================================\n // Attachments\n // ============================================================================\n\n async saveAttachment(\n attachment: Omit<Attachment, 'id' | 'createdAt'>\n ): Promise<Attachment> {\n const result = await this.client.request<Attachment>(\n 'POST',\n '/api/v1/attachments',\n { body: attachment }\n );\n return this.parseAttachment(result);\n }\n\n async getAttachment(attachmentId: AttachmentId): Promise<Attachment | null> {\n try {\n const result = await this.client.request<Attachment>(\n 'GET',\n `/api/v1/attachments/${attachmentId}`\n );\n return this.parseAttachment(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async deleteAttachment(attachmentId: AttachmentId): Promise<void> {\n await this.client.request('DELETE', `/api/v1/attachments/${attachmentId}`);\n }\n\n async getMessageAttachments(messageId: MessageId): Promise<Attachment[]> {\n const result = await this.client.request<Attachment[]>(\n 'GET',\n `/api/v1/messages/${messageId}/attachments`\n );\n return result.map((a) => this.parseAttachment(a));\n }\n\n // ============================================================================\n // Agents\n // ============================================================================\n\n async createAgent(options: CreateAgentOptions): Promise<StoredAgent> {\n const result = await this.client.request<StoredAgent>(\n 'POST',\n '/api/v1/agents',\n { body: options }\n );\n return this.parseAgent(result);\n }\n\n async getAgent(agentId: AgentId): Promise<StoredAgent | null> {\n try {\n const result = await this.client.request<StoredAgent>(\n 'GET',\n `/api/v1/agents/${agentId}`\n );\n return this.parseAgent(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getAgentBySlug(slug: string): Promise<StoredAgent | null> {\n try {\n const result = await this.client.request<StoredAgent>(\n 'GET',\n `/api/v1/agents/by-slug/${slug}`\n );\n return this.parseAgent(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async updateAgent(\n agentId: AgentId,\n updates: UpdateAgentOptions\n ): Promise<StoredAgent | null> {\n try {\n const result = await this.client.request<StoredAgent>(\n 'PATCH',\n `/api/v1/agents/${agentId}`,\n { body: updates }\n );\n return this.parseAgent(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async deleteAgent(agentId: AgentId): Promise<boolean> {\n try {\n await this.client.request('DELETE', `/api/v1/agents/${agentId}`);\n return true;\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n }\n\n async listAgents(\n options?: ListAgentsOptions\n ): Promise<PaginatedResult<StoredAgent>> {\n const result = await this.client.request<PaginatedResult<StoredAgent>>(\n 'GET',\n '/api/v1/agents',\n {\n query: {\n limit: options?.limit,\n offset: options?.offset,\n status: options?.status,\n },\n }\n );\n return {\n ...result,\n items: result.items.map((a) => this.parseAgent(a)),\n };\n }\n\n async getActiveAgents(): Promise<StoredAgent[]> {\n const result = await this.listAgents({ status: 'active', limit: 1000 });\n return result.items;\n }\n\n // ============================================================================\n // Queue\n // ============================================================================\n\n async createQueueItem(options: CreateQueueItemOptions): Promise<QueueItem> {\n const result = await this.client.request<QueueItem>(\n 'POST',\n '/api/v1/queue',\n { body: options }\n );\n return this.parseQueueItem(result);\n }\n\n async getQueueItem(id: string): Promise<QueueItem | null> {\n try {\n const result = await this.client.request<QueueItem>(\n 'GET',\n `/api/v1/queue/${id}`\n );\n return this.parseQueueItem(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async updateQueueItem(\n id: string,\n updates: Partial<\n Pick<\n QueueItem,\n | 'status'\n | 'error'\n | 'resultMessageId'\n | 'sessionId'\n | 'retryCount'\n | 'startedAt'\n | 'completedAt'\n >\n >\n ): Promise<QueueItem | null> {\n try {\n const result = await this.client.request<QueueItem>(\n 'PATCH',\n `/api/v1/queue/${id}`,\n { body: updates }\n );\n return this.parseQueueItem(result);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async deleteQueueItem(id: string): Promise<boolean> {\n try {\n await this.client.request('DELETE', `/api/v1/queue/${id}`);\n return true;\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n }\n\n async listQueueItems(\n options?: ListQueueItemsOptions\n ): Promise<PaginatedResult<QueueItem>> {\n const result = await this.client.request<PaginatedResult<QueueItem>>(\n 'GET',\n '/api/v1/queue',\n {\n query: {\n limit: options?.limit,\n offset: options?.offset,\n sessionId: options?.sessionId,\n agentName: options?.agentName,\n status: options?.status,\n },\n }\n );\n return {\n ...result,\n items: result.items.map((q) => this.parseQueueItem(q)),\n };\n }\n\n async getNextPendingItem(\n agentName: string,\n sessionId?: SessionId | null,\n markAsProcessing?: boolean\n ): Promise<QueueItem | null> {\n try {\n const result = await this.client.request<QueueItem | null>(\n 'POST',\n '/api/v1/queue/next',\n {\n body: {\n agentName,\n sessionId,\n markAsProcessing,\n },\n }\n );\n return result ? this.parseQueueItem(result) : null;\n } catch (error) {\n if (this.isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n async getPendingItemsForSession(\n agentName: string,\n sessionId: SessionId | null\n ): Promise<QueueItem[]> {\n const result = await this.client.request<QueueItem[]>(\n 'GET',\n '/api/v1/queue/pending',\n {\n query: {\n agentName,\n sessionId: sessionId || undefined,\n },\n }\n );\n return result.map((q) => this.parseQueueItem(q));\n }\n\n async cancelPendingItems(\n agentName: string,\n sessionId?: SessionId | null\n ): Promise<number> {\n const result = await this.client.request<{ cancelled: number }>(\n 'POST',\n '/api/v1/queue/cancel',\n {\n body: {\n agentName,\n sessionId,\n },\n }\n );\n return result.cancelled;\n }\n\n async getQueueStats(agentName?: string): Promise<QueueStats> {\n return this.client.request<QueueStats>('GET', '/api/v1/queue/stats', {\n query: { agentName },\n });\n }\n\n async cleanupOldItems(maxAgeMs: number): Promise<number> {\n const result = await this.client.request<{ deleted: number }>(\n 'POST',\n '/api/v1/queue/cleanup',\n { body: { maxAgeMs } }\n );\n return result.deleted;\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n private parseSession(data: Session): Session {\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n };\n }\n\n private parseMessage(data: Message): Message {\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n };\n }\n\n private parseAttachment(data: Attachment): Attachment {\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n };\n }\n\n private parseAgent(data: StoredAgent): StoredAgent {\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n deletedAt: data.deletedAt ? new Date(data.deletedAt) : undefined,\n };\n }\n\n private parseQueueItem(data: QueueItem): QueueItem {\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n startedAt: data.startedAt ? new Date(data.startedAt) : undefined,\n completedAt: data.completedAt ? new Date(data.completedAt) : undefined,\n };\n }\n\n private isNotFoundError(error: unknown): boolean {\n return (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code === 'NOT_FOUND'\n );\n }\n}\n","/**\n * Cloud Sandbox Provider\n *\n * Allows running agent execution remotely on Ash Cloud infrastructure.\n * This provides zero-infrastructure agent execution for open-source users.\n */\n\nimport type { StreamEvent, SessionId, SandboxProviderConfig } from '../types/index.js';\nimport { AshCloudClient, type AshCloudConfig } from './client.js';\n\nexport interface CloudSandboxConfig extends AshCloudConfig {\n /** Default agent slug to use */\n agentSlug?: string;\n}\n\nexport interface SendMessageRequest {\n /** Agent slug (required if not set in config) */\n agentSlug?: string;\n /** Session ID (omit to create new session) */\n sessionId?: SessionId;\n /** Message to send */\n message: string;\n /** Optional session context */\n sessionContext?: string;\n /** File attachments */\n attachments?: Array<{\n filename: string;\n content: string; // base64 encoded\n mimeType: string;\n }>;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\nexport interface SendMessageResult {\n /** Session ID (useful if a new session was created) */\n sessionId: SessionId;\n /** Stream of events from the agent */\n stream: AsyncGenerator<StreamEvent>;\n}\n\n/**\n * CloudSandbox - Execute agents remotely on Ash Cloud\n *\n * This allows open-source users to run agents without local infrastructure.\n * The agent executes on Ash Cloud's managed sandbox environment.\n *\n * @example\n * ```typescript\n * import { CloudSandbox } from '@ash-cloud/ash-ai';\n *\n * const sandbox = new CloudSandbox({\n * apiKey: process.env.ASH_CLOUD_API_KEY,\n * agentSlug: 'my-agent',\n * });\n *\n * // Send a message and stream the response\n * const { sessionId, stream } = await sandbox.send({\n * message: 'Hello, world!',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'text_delta') {\n * process.stdout.write(event.delta);\n * }\n * }\n * ```\n */\nexport class CloudSandbox {\n private client: AshCloudClient;\n private agentSlug?: string;\n\n constructor(config: CloudSandboxConfig) {\n this.client = new AshCloudClient(config);\n this.agentSlug = config.agentSlug;\n }\n\n /**\n * Send a message to an agent and stream the response\n */\n async send(request: SendMessageRequest): Promise<SendMessageResult> {\n const agentSlug = request.agentSlug || this.agentSlug;\n if (!agentSlug) {\n throw new Error('agentSlug is required - set it in config or request');\n }\n\n // Determine endpoint based on whether we have a session\n // - For new sessions: use /api/v1/agents/by-slug/:slug/run\n // - For existing sessions: use /api/v1/sessions/:id/send\n const endpoint = request.sessionId\n ? `/api/v1/sessions/${request.sessionId}/send`\n : `/api/v1/agents/by-slug/${agentSlug}/run`;\n\n // Create the stream\n // Note: API expects 'prompt' not 'message'\n const stream = this.client.stream<StreamEvent>('POST', endpoint, {\n body: {\n prompt: request.message,\n sessionContext: request.sessionContext,\n // Files should be uploaded separately via /api/v1/uploads, then passed as fileUrls\n // Legacy attachments field kept for backwards compatibility\n ...(request.attachments && { attachments: request.attachments }),\n },\n signal: request.signal,\n });\n\n // Wrap to capture session ID from first event\n let sessionId = request.sessionId || '';\n\n async function* wrappedStream(): AsyncGenerator<StreamEvent> {\n for await (const event of stream) {\n if (event.type === 'session_start') {\n sessionId = event.sessionId;\n }\n yield event;\n }\n }\n\n return {\n get sessionId() {\n return sessionId;\n },\n stream: wrappedStream(),\n };\n }\n\n /**\n * Resume an existing session and send a message\n *\n * This is equivalent to calling send() with a sessionId.\n * Use this when you want to continue a conversation.\n */\n async resume(\n sessionId: SessionId,\n options?: {\n message?: string;\n sessionContext?: string;\n signal?: AbortSignal;\n }\n ): Promise<SendMessageResult> {\n if (!options?.message) {\n throw new Error('message is required to resume a session');\n }\n\n // Use the send endpoint to continue the conversation\n const stream = this.client.stream<StreamEvent>(\n 'POST',\n `/api/v1/sessions/${sessionId}/send`,\n {\n body: {\n prompt: options.message,\n sessionContext: options.sessionContext,\n },\n signal: options?.signal,\n }\n );\n\n return {\n sessionId,\n stream,\n };\n }\n\n /**\n * Stop a running session\n */\n async stop(sessionId: SessionId): Promise<void> {\n await this.client.request('POST', `/api/v1/sessions/${sessionId}/stop`);\n }\n\n /**\n * Get session status\n */\n async getStatus(sessionId: SessionId): Promise<{\n sessionId: SessionId;\n status: string;\n isRunning: boolean;\n canStop: boolean;\n canResume: boolean;\n }> {\n return this.client.request('GET', `/api/v1/sessions/${sessionId}/status`);\n }\n\n /**\n * Create a sandbox provider config for use with AgentHarness\n *\n * This returns a SandboxProviderConfig that routes execution through Ash Cloud.\n */\n toProviderConfig(): SandboxProviderConfig {\n return {\n provider: 'ash-cloud' as any, // Will be added to SandboxProviderType\n credentials: {\n // @ts-expect-error - ash-cloud credentials will be added\n ashCloud: {\n apiKey: (this.client as any).apiKey,\n baseUrl: (this.client as any).baseUrl,\n },\n },\n };\n }\n}\n\n/**\n * Create a cloud sandbox from environment variables\n *\n * @example\n * ```typescript\n * // Uses ASH_CLOUD_API_KEY and optionally ASH_CLOUD_BASE_URL\n * const sandbox = createCloudSandbox();\n * ```\n */\nexport function createCloudSandbox(\n options?: Partial<CloudSandboxConfig>\n): CloudSandbox {\n const apiKey = options?.apiKey || process.env.ASH_CLOUD_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'ASH_CLOUD_API_KEY environment variable is required, or pass apiKey in options'\n );\n }\n\n return new CloudSandbox({\n apiKey,\n baseUrl: options?.baseUrl || process.env.ASH_CLOUD_BASE_URL,\n projectSlug: options?.projectSlug || process.env.ASH_CLOUD_PROJECT_SLUG,\n agentSlug: options?.agentSlug,\n timeout: options?.timeout,\n });\n}\n","/**\n * Unified Ash Cloud Client\n *\n * Provides a convenient interface for using Ash Cloud as your backend.\n * Combines storage (database) and sandbox (execution) capabilities.\n */\n\nimport { CloudStorage, type CloudStorageConfig } from './storage.js';\nimport { CloudSandbox, type CloudSandboxConfig } from './sandbox.js';\nimport { AshCloudClient, type AshCloudConfig } from './client.js';\n\nexport interface AshCloudOptions extends AshCloudConfig {\n /** Default agent slug for sandbox operations */\n agentSlug?: string;\n}\n\n/**\n * AshCloud - Use Ash Cloud as your complete backend\n *\n * This provides both storage (database) and sandbox (execution) capabilities\n * using a single API key. Perfect for zero-infrastructure agent deployment.\n *\n * @example\n * ```typescript\n * import { AgentHarness, AshCloud } from '@ash-cloud/ash-ai';\n *\n * // Create a unified client\n * const cloud = new AshCloud({\n * apiKey: process.env.ASH_CLOUD_API_KEY,\n * });\n *\n * // Option 1: Use with AgentHarness (runs agent locally, stores in cloud)\n * const harness = new AgentHarness({\n * storage: cloud.storage(),\n * });\n *\n * // Option 2: Use cloud sandbox directly (runs agent remotely)\n * const sandbox = cloud.sandbox({ agentSlug: 'my-agent' });\n * const { stream } = await sandbox.send({ message: 'Hello!' });\n * for await (const event of stream) {\n * console.log(event);\n * }\n *\n * // Option 3: Full cloud mode (storage + execution in cloud)\n * // Just use the sandbox - everything runs remotely\n * ```\n */\nexport class AshCloud {\n private config: AshCloudOptions;\n private _storage?: CloudStorage;\n private _sandbox?: CloudSandbox;\n\n constructor(config: AshCloudOptions) {\n this.config = config;\n }\n\n /**\n * Get a CloudStorage instance for database operations\n *\n * Use this when you want to run the agent locally but store\n * sessions, messages, and agents in Ash Cloud.\n */\n storage(options?: Partial<CloudStorageConfig>): CloudStorage {\n if (!this._storage || options) {\n this._storage = new CloudStorage({\n ...this.config,\n ...options,\n });\n }\n return this._storage;\n }\n\n /**\n * Get a CloudSandbox instance for remote execution\n *\n * Use this when you want to run the agent entirely in Ash Cloud.\n * No local compute needed - just send messages and receive responses.\n */\n sandbox(options?: Partial<CloudSandboxConfig>): CloudSandbox {\n if (!this._sandbox || options) {\n this._sandbox = new CloudSandbox({\n ...this.config,\n ...options,\n });\n }\n return this._sandbox;\n }\n\n /**\n * Get the raw HTTP client for custom API calls\n */\n client(): AshCloudClient {\n return new AshCloudClient(this.config);\n }\n\n /**\n * Check if the API key is valid and can connect to Ash Cloud\n */\n async verify(): Promise<{ ok: boolean; message?: string }> {\n try {\n await this.client().request<{ ok: boolean }>('GET', '/api/v1/status');\n return { ok: true };\n } catch (error) {\n return {\n ok: false,\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get account information\n */\n async getAccount(): Promise<{\n id: string;\n email: string;\n name?: string;\n organization?: {\n id: string;\n name: string;\n };\n }> {\n return this.client().request('GET', '/api/v1/account');\n }\n\n /**\n * Get usage statistics\n */\n async getUsage(options?: {\n startDate?: Date;\n endDate?: Date;\n }): Promise<{\n sessions: number;\n messages: number;\n tokens: number;\n cost: number;\n }> {\n return this.client().request('GET', '/api/v1/usage', {\n query: {\n startDate: options?.startDate?.toISOString(),\n endDate: options?.endDate?.toISOString(),\n },\n });\n }\n}\n\n/**\n * Create an AshCloud client from environment variables\n *\n * @example\n * ```typescript\n * // Uses ASH_CLOUD_API_KEY and optionally ASH_CLOUD_BASE_URL\n * const cloud = createAshCloud();\n * ```\n */\nexport function createAshCloud(options?: Partial<AshCloudOptions>): AshCloud {\n const apiKey = options?.apiKey || process.env.ASH_CLOUD_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'ASH_CLOUD_API_KEY environment variable is required, or pass apiKey in options'\n );\n }\n\n return new AshCloud({\n apiKey,\n baseUrl: options?.baseUrl || process.env.ASH_CLOUD_BASE_URL,\n projectSlug: options?.projectSlug || process.env.ASH_CLOUD_PROJECT_SLUG,\n agentSlug: options?.agentSlug,\n timeout: options?.timeout,\n });\n}\n","/**\n * ASH-AI - Agent SDK Harness\n *\n * Complete framework for Claude Agent SDK session management.\n * This unified package exports core, server, and storage-postgres functionality.\n *\n * @example\n * ```typescript\n * import {\n * AgentHarness,\n * createHarnessServer,\n * PostgresStorage,\n * } from '@ash-cloud/ash-ai';\n *\n * const storage = new PostgresStorage({\n * connectionString: 'postgresql://...',\n * });\n *\n * const server = createHarnessServer({ storage });\n * ```\n */\n\n// =============================================================================\n// CORE EXPORTS\n// =============================================================================\n\n// Core types\nexport * from './types/index.js';\n\n// Errors\nexport {\n HarnessError,\n SessionError,\n StorageError,\n AgentError,\n ToolError,\n ConfigError,\n ValidationError,\n NotFoundError,\n HarnessErrorCode,\n isHarnessError,\n hasErrorCode,\n} from './errors/index.js';\nexport type { HarnessErrorOptions } from './errors/index.js';\n\n// Agent\nexport {\n AgentHarness,\n ClaudeSdkClient,\n claudeClient,\n convertClaudeMessage,\n extractTextFromMessage,\n normalizeMcpServers,\n // Gemini CLI backend\n GeminiCliClient,\n createGeminiExecutor,\n mapClaudeOptionsToGemini,\n // Backend abstraction\n createBackendExecutor,\n getApiKeyEnvVar,\n isValidModel,\n getDefaultModel,\n DEFAULT_MODELS,\n AVAILABLE_MODELS,\n} from './agent/index.js';\nexport type {\n AgentHarnessConfig,\n ActiveSession,\n CustomExecutor,\n StopSessionResult,\n ClaudeAgentOptions,\n ClaudeMessage,\n ClaudeContentBlock,\n ClaudeStreamEvent,\n ClaudeV2Session,\n // Gemini types\n GeminiCliOptions,\n // Backend types\n AgentBackend,\n BackendConfig,\n} from './agent/index.js';\n\n// Session\nexport { SessionManager } from './session/index.js';\n\n// Storage\nexport { MemoryStorage, MemoryQueueStorage } from './storage/index.js';\nexport type {\n SessionStorage,\n TransactionalStorage,\n BulkStorage,\n StorageConfig,\n AgentStorage,\n QueueStorage,\n} from './storage/index.js';\n\n// Queue\nexport {\n QueueProcessor,\n createQueueProcessor,\n} from './queue/index.js';\nexport type {\n QueueProcessorConfig,\n QueueProcessorCallbacks,\n} from './queue/index.js';\n\n// Attachments\nexport {\n AttachmentStorage,\n attachmentToDataUrl,\n dataUrlToBuffer,\n isImageMimeType,\n isDocumentMimeType,\n} from './attachment/index.js';\nexport type { AttachmentStorageConfig } from './attachment/index.js';\n\n// Events\nexport {\n HarnessEventEmitter,\n globalEventEmitter,\n createEventHandler,\n createEventMiddlewareChain,\n} from './events/index.js';\nexport type {\n HarnessEventType,\n HarnessEventPayloads,\n HarnessEventHandler,\n EventMiddleware,\n} from './events/index.js';\n\n// Configuration\nexport {\n loadConfig,\n defineConfig,\n defineAgent,\n createConfig,\n ConfigBuilder,\n HarnessConfigSchema,\n AgentConfigSchema,\n StorageConfigSchema,\n ServerConfigSchema,\n AttachmentConfigSchema,\n env,\n envOptional,\n} from './config/index.js';\nexport type {\n HarnessConfig,\n AgentConfig as HarnessAgentConfig,\n ServerConfig,\n AttachmentConfig,\n} from './config/index.js';\n\n// MCP Server Integration\nexport {\n McpServers,\n McpConfigBuilder,\n configureMcp,\n McpPresets,\n // HTTP/SSE MCP helpers\n httpMcpWithAuth,\n sseMcpWithAuth,\n isHttpMcpConfig,\n isStdioMcpConfig,\n // Typed MCP authentication\n mcpAuthToHeaders,\n} from './mcp/index.js';\nexport type {\n McpServerConfig,\n McpStdioServerConfig,\n McpHttpServerConfig,\n McpTransportType,\n McpAuth,\n} from './mcp/index.js';\n\n// Runtime & Sandboxing\nexport {\n generateDockerCommand,\n generateProxyEnv,\n createSandboxOptions,\n RuntimePresets,\n RuntimeConfigBuilder,\n configureRuntime,\n checkSecurityConfig,\n isSensitivePath,\n SENSITIVE_PATHS,\n // Vercel Sandbox Executor (unified implementation for cloud and standalone)\n createVercelSandboxExecutor,\n shouldUseSandbox,\n // Sandbox cache functions\n getOrCreateSandbox,\n markSdkInstalled,\n markConfigInstalled,\n markStartupScriptRan,\n needsStartupScriptRerun,\n rekeySessionId,\n releaseSandbox,\n invalidateSandbox,\n isSandboxExpiredError,\n getSandboxCacheStats,\n cleanupAllSandboxes,\n hashStartupScript,\n // Sandbox heartbeat functions\n onHeartbeat,\n getHeartbeatStatus,\n getAllHeartbeatStatuses,\n // Sandbox pool\n SandboxPool,\n getSandboxPool,\n ensureSandboxPoolInitialized,\n initializeSandboxPool,\n shutdownSandboxPool,\n // Sandbox file operations\n isSandboxRunning,\n writeFileToSandbox,\n readFileFromSandbox,\n listFilesInSandbox,\n createSandboxFileOperations,\n // Sandbox file sync service\n SandboxFileSync,\n createSandboxFileSync,\n} from './runtime/index.js';\nexport type {\n SandboxConfig,\n DockerConfig,\n ProxyConfig,\n RuntimeConfig,\n GetOrCreateSandboxOptions,\n SandboxWithState,\n SandboxHeartbeatStatus,\n SandboxPoolConfig,\n SandboxPoolStatus,\n PooledSandbox,\n SandboxPoolMetricsCallback,\n // Sandbox file sync types\n SandboxFileSyncOptions,\n SandboxFileOperations,\n SandboxWriteResult,\n SandboxReadResult,\n FilePushResult,\n FilePullResult,\n SyncResult,\n} from './runtime/index.js';\n\n// Credential Management\nexport {\n CredentialManager,\n MemoryCredentialStorage,\n createCredentialManager,\n} from './credentials/index.js';\nexport type {\n EncryptedCredential,\n CredentialStorage,\n CredentialManagerConfig,\n} from './credentials/index.js';\n\n// Skills\nexport {\n SkillManager,\n createSkillManager,\n LocalFileProvider,\n createLocalFileProvider,\n GitHubFileProvider,\n createGitHubFileProvider,\n // Schemas\n skillSourceSchema,\n skillConfigSchema,\n fileEntrySchema,\n gitHubSkillSourceSchema,\n localSkillSourceSchema,\n} from './skills/index.js';\nexport type {\n SkillConfig,\n SkillSource,\n GitHubSkillSource,\n LocalSkillSource,\n FileEntry,\n FileContent,\n FileProvider,\n FileProviderOptions,\n SkillManagerOptions,\n} from './skills/index.js';\n\n// =============================================================================\n// UTILITY EXPORTS (Message Normalization & Tool Call Processing)\n// =============================================================================\n\nexport {\n // Message normalization\n formatToolName,\n parseMcpToolName,\n mapToolToActionType,\n generateToolSummary,\n extractTextContent,\n normalizeToolResult,\n parseCommandResult,\n createToolCall,\n updateToolCallWithResult,\n normalizeMessages,\n getActionIcon,\n getActionLabel,\n // Tool call processor\n ToolCallProcessor,\n createToolCallProcessor,\n processStreamEvents,\n // Sandbox logger\n SandboxLogger,\n createSandboxLogger,\n} from './utils/index.js';\nexport type {\n EntryListener,\n SandboxLogCallback,\n} from './utils/index.js';\n\n// =============================================================================\n// SERVER EXPORTS\n// =============================================================================\n\n// Legacy server (for backwards compatibility)\nexport { createHarnessServer } from './server/server.js';\nexport type { HarnessServerConfig, HarnessServer } from './server/server.js';\n\n// OpenAPI-documented server with Scalar UI (recommended)\nexport {\n createOpenAPIServer,\n createOpenAPIServer as createDocumentedServer,\n} from './server/openapi/server.js';\nexport type {\n OpenAPIServerConfig,\n OpenAPIServer,\n HarnessServerHooks,\n} from './server/openapi/server.js';\n\n// OpenAPI schemas (for extending or reusing)\nexport * as openApiSchemas from './server/openapi/schemas.js';\n\n// Route factories for custom composition (legacy)\nexport { createSessionsRouter } from './server/routes/sessions.js';\nexport type { SessionsRouterOptions } from './server/routes/sessions.js';\nexport { createAgentsRouter } from './server/routes/agents.js';\nexport type { AgentsRouterOptions } from './server/routes/agents.js';\nexport { createQueueRouter } from './server/routes/queue.js';\nexport type { QueueRouterOptions } from './server/routes/queue.js';\n\n// OpenAPI route factories (recommended)\nexport {\n createSessionsRouter as createOpenAPISessionsRouter,\n createAgentsRouter as createOpenAPIAgentsRouter,\n createSkillsRouter as createOpenAPISkillsRouter,\n} from './server/openapi/index.js';\n\n// Middleware\nexport {\n createLogger,\n requestLogger,\n log,\n rateLimit,\n rateLimiters,\n MemoryRateLimitStore,\n} from './server/middleware/index.js';\nexport type {\n LogLevel,\n LogContext,\n LogEntry,\n LoggerConfig,\n RequestLoggerOptions,\n Logger,\n RateLimitConfig,\n RateLimitResult,\n RateLimitStore,\n} from './server/middleware/index.js';\n\n// Node.js server helper\nexport { serve } from '@hono/node-server';\nexport { startServer } from './server/index.js';\nexport type { StartServerOptions } from './server/index.js';\n\n// =============================================================================\n// WORKSPACE EXPORTS (SkillFS-inspired persistent sandbox state)\n// =============================================================================\n\nexport {\n // Main Workspace class\n Workspace,\n createWorkspace,\n // Bundle Stores\n LocalBundleStore,\n MemoryBundleStore,\n createLocalBundleStore,\n createMemoryBundleStore,\n // Cloud Bundle Stores - Supabase (recommended)\n SupabaseBundleStore,\n createSupabaseBundleStore,\n createSupabaseBundleStoreFromEnv,\n // Cloud Bundle Stores - S3/GCS (optional)\n S3BundleStore,\n GCSBundleStore,\n createS3BundleStore,\n createGCSBundleStore,\n createR2BundleStore,\n createMinioBundleStore,\n // Sandbox Connections\n LocalSandbox,\n createLocalSandbox,\n // Provider Sandbox Adapters\n ProviderSandbox,\n createProviderSandbox,\n createE2BSandbox,\n createVercelSandbox,\n createModalSandbox,\n // Git Repository\n SandboxGitRepo,\n createGitRepo,\n // Skill Catalog\n SkillCatalog,\n createSkillCatalog,\n // GitHub Skills\n loadGitHubSkill,\n loadGitHubSkills,\n normalizeGitHubConfigs,\n parseGitHubUrl,\n // MCP Tool Generation\n generateMcpServerPackage,\n generateMcpServers,\n introspectMcpServer,\n // Persistence utilities\n loadWorkspaceState,\n saveWorkspaceState,\n // AgentHarness Integration\n WorkspaceManager,\n getWorkspaceManager,\n createWorkspaceManager,\n createSessionWorkspace,\n createWorkspaceHooks,\n // File Stores (individual file storage)\n S3FileStore,\n createS3FileStore,\n createR2FileStore,\n createMinioFileStore,\n} from './workspace/index.js';\nexport type {\n SandboxConnection,\n BundleStore,\n GitRepo,\n CommandResult as WorkspaceCommandResult,\n WorkspaceConfig,\n SkillsConfig,\n GitHubSkillConfig,\n DiscoveredSkill,\n WorkspaceLoadResult,\n WorkspaceSaveResult,\n LocalSandboxConfig,\n LoadStateResult,\n SaveStateResult,\n // Cloud store configs\n SupabaseBundleStoreConfig,\n S3BundleStoreConfig,\n GCSBundleStoreConfig,\n // Provider sandbox config\n ProviderSandboxConfig,\n // GitHub skills\n GitHubSkillResult,\n // MCP types\n McpTool,\n McpServerInfo,\n McpGenerationResult,\n // Harness integration\n WorkspaceSessionConfig,\n ManagedWorkspace,\n WorkspaceHook,\n // File store types\n FileStore,\n FileMetadata,\n S3FileStoreConfig,\n} from './workspace/index.js';\n\n// =============================================================================\n// STORAGE-POSTGRES EXPORTS\n// =============================================================================\n\nexport { PostgresStorage } from './storage-postgres/storage.js';\nexport type { PostgresStorageConfig } from './storage-postgres/storage.js';\n\nexport { PostgresQueueStorage } from './storage-postgres/queue-storage.js';\nexport type { PostgresQueueStorageConfig } from './storage-postgres/queue-storage.js';\n\n// Re-export schema for migrations and direct database access\nexport * as schema from './storage-postgres/schema.js';\nexport type {\n SessionRow,\n NewSessionRow,\n MessageRow,\n NewMessageRow,\n AttachmentRow,\n NewAttachmentRow,\n QueueItemRow,\n NewQueueItemRow,\n} from './storage-postgres/schema.js';\n\n// =============================================================================\n// STORAGE-SUPABASE EXPORTS\n// =============================================================================\n\nexport { SupabaseStorage } from './storage-supabase/storage.js';\nexport type { SupabaseStorageConfig } from './storage-supabase/storage.js';\n\n// =============================================================================\n// STORAGE-CLOUD EXPORTS (Ash Cloud as Backend)\n// =============================================================================\n\n// Unified client for using Ash Cloud as a backend\nexport { AshCloud, createAshCloud } from './storage-cloud/ash-cloud.js';\nexport type { AshCloudOptions } from './storage-cloud/ash-cloud.js';\n\n// Cloud storage adapter (implements SessionStorage, AgentStorage, QueueStorage)\nexport { CloudStorage } from './storage-cloud/storage.js';\nexport type { CloudStorageConfig } from './storage-cloud/storage.js';\n\n// Cloud sandbox for remote agent execution\nexport { CloudSandbox, createCloudSandbox } from './storage-cloud/sandbox.js';\nexport type {\n CloudSandboxConfig,\n SendMessageRequest,\n SendMessageResult,\n} from './storage-cloud/sandbox.js';\n\n// Low-level HTTP client\nexport { AshCloudClient, AshCloudApiError } from './storage-cloud/client.js';\nexport type { AshCloudConfig, AshCloudError } from './storage-cloud/client.js';\n"]}
|