@standardagents/builder 0.9.17 → 0.10.1-dev.114898
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/LICENSE.txt +48 -0
- package/dist/built-in-routes.js +362 -10
- package/dist/built-in-routes.js.map +1 -1
- package/dist/client/assets/index.css +1 -1
- package/dist/client/index.js +19 -19
- package/dist/client/vendor.js +1 -1
- package/dist/client/vue.js +1 -1
- package/dist/image-processing.d.ts +44 -0
- package/dist/image-processing.js +174 -0
- package/dist/image-processing.js.map +1 -0
- package/dist/index.d.ts +790 -3
- package/dist/index.js +1616 -41
- package/dist/index.js.map +1 -1
- package/dist/plugin.js +55 -6
- package/dist/plugin.js.map +1 -1
- package/package.json +27 -17
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/generateTypes.ts","../src/sdk/generators/generateModelFile.ts","../src/sdk/generators/jsonSchemaToZod.ts","../src/sdk/generators/generatePromptFile.ts","../src/sdk/generators/generateAgentFile.ts","../src/sdk/persistence/index.ts","../src/plugin.ts"],"names":["fs","path","escapeString","options"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"plugin.js","sourcesContent":["/**\n * Type generation module for AgentBuilder.\n *\n * Generates TypeScript declaration files that provide compile-time\n * type safety for model, prompt, agent, and tool references.\n *\n * @module\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Configuration for directory scanning.\n */\nexport interface DirectoryConfig {\n modelsDir: string;\n promptsDir: string;\n agentsDir: string;\n toolsDir: string;\n outputDir: string;\n}\n\n/**\n * Content of the generated tsconfig.json for the .agents directory.\n */\nconst TSCONFIG_CONTENT = `{\n \"compilerOptions\": {\n \"composite\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"moduleResolution\": \"bundler\",\n \"module\": \"ESNext\",\n \"target\": \"ESNext\"\n },\n \"include\": [\"types.d.ts\", \"virtual-module.d.ts\"]\n}\n`;\n\n/**\n * Scan a directory for TypeScript files and extract the definition names.\n *\n * This function reads each .ts file and extracts the `name` property from\n * the defineX() call. It uses a simple regex pattern to avoid full parsing.\n *\n * @param dir - Directory to scan\n * @param useFilename - If true, use filename as the name (for tools that don't have name property)\n * @returns Array of definition names found\n */\nexport function scanForNames(dir: string, useFilename: boolean = false): string[] {\n const names: string[] = [];\n\n if (!fs.existsSync(dir)) {\n return names;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (useFilename) {\n // For tools: use the filename (without extension) as the tool name\n // Convert underscores to match convention (e.g., my_tool.ts -> my_tool)\n const toolName = entry.name.replace(/\\.ts$/, '');\n // Verify the file actually exports a tool (contains defineTool)\n if (content.includes('defineTool')) {\n names.push(toolName);\n }\n } else {\n // Extract name from defineX({ name: 'xxx', ... })\n // Matches: name: 'xxx' or name: \"xxx\"\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n names.push(nameMatch[1]);\n }\n }\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dir}:`, error);\n }\n\n return names;\n}\n\n/**\n * Generate interface properties from an array of string names.\n * Each name becomes a property with value `true`.\n *\n * @param names - Array of string names\n * @returns TypeScript interface properties string\n */\nfunction generateRegistryProperties(names: string[]): string {\n if (names.length === 0) {\n return '';\n }\n\n return names.map((n) => `'${n}': true;`).join('\\n ');\n}\n\n/**\n * Generate the types.d.ts content for the .agents directory.\n *\n * This generates a namespace augmentation that overrides the default `string`\n * types in the AgentBuilder namespace with specific union types based on\n * the user's defined models, prompts, agents, and tools.\n *\n * @param config - Directory configuration\n * @returns The generated TypeScript declaration content\n */\nexport function generateTypesContent(config: DirectoryConfig): string {\n const models = scanForNames(config.modelsDir);\n const prompts = scanForNames(config.promptsDir);\n const agents = scanForNames(config.agentsDir);\n // Tools use filename as name since defineTool doesn't have a name property\n const tools = scanForNames(config.toolsDir, true);\n\n // Generate the callables union from all three sources\n const callables = [...prompts, ...agents, ...tools];\n\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n// Generated at: ${new Date().toISOString()}\n//\n// This file augments the AgentBuilder namespace declared in @standardagents/builder\n// to provide type-safe references for your models, prompts, agents, and tools.\n\n/**\n * Augment the global AgentBuilder namespace with your project's specific types.\n * This provides autocomplete and type checking for model, prompt, agent, and tool references.\n *\n * Uses interface declaration merging with property keys to create union types.\n * Example: interface ModelRegistry { 'gpt-4o': true; } gives type Models = 'gpt-4o'\n */\ndeclare global {\n namespace AgentBuilder {\n /** Model names from agents/models/ */\n interface ModelRegistry {\n ${generateRegistryProperties(models)}\n }\n\n /** Prompt names from agents/prompts/ */\n interface PromptRegistry {\n ${generateRegistryProperties(prompts)}\n }\n\n /** Agent names from agents/agents/ */\n interface AgentRegistry {\n ${generateRegistryProperties(agents)}\n }\n\n /** Tool names from agents/tools/ */\n interface ToolRegistry {\n ${generateRegistryProperties(tools)}\n }\n\n /** All callable items (prompts, agents, tools) that can be used as tools */\n interface CallableRegistry {\n ${generateRegistryProperties(callables)}\n }\n }\n}\n\n// This export is required for TypeScript to treat this as a module\n// and allow the declare global to work properly\nexport {};\n`;\n}\n\n/**\n * Generate the virtual-module.d.ts content for the .agents directory.\n *\n * This provides type declarations for the virtual:@standardagents/builder module.\n * It must be in a separate file (without export {}) to work as an ambient module declaration.\n *\n * @returns The generated TypeScript declaration content\n */\nexport function generateVirtualModuleContent(): string {\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n//\n// Type declarations for the virtual:@standardagents/builder module.\n// This file must NOT have any exports to work as an ambient module declaration.\n\n/**\n * Type declarations for the consolidated virtual module.\n * This module provides DurableThread and DurableAgentBuilder classes\n * with all virtual module methods (tools, hooks, models, prompts, agents)\n * already implemented, plus the router function.\n */\ndeclare module 'virtual:@standardagents/builder' {\n import type { DurableThread as BaseDurableThread } from '@standardagents/builder/runtime';\n import type { DurableAgentBuilder as BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n // ============================================================\n // Message Types\n // ============================================================\n\n export interface ThreadMessage {\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: 'success' | 'error' | null;\n log_id: string | null;\n created_at: number;\n silent: boolean;\n parent_id: string | null;\n depth: number;\n status: 'pending' | 'completed' | 'failed' | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }\n\n export interface GetMessagesResult {\n messages: ThreadMessage[];\n total: number;\n hasMore: boolean;\n }\n\n // ============================================================\n // Log Types\n // ============================================================\n\n export interface ThreadLog {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: boolean;\n created_at: number;\n request_body: string | null;\n }\n\n export interface GetLogsResult {\n logs: ThreadLog[];\n total: number;\n hasMore: boolean;\n }\n\n export interface ThreadLogDetails extends ThreadLog {\n endpoint: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n tools_schema: string | null;\n message_history: string | null;\n system_prompt: string | null;\n errors: string | null;\n tool_results: string | null;\n }\n\n // ============================================================\n // Thread Metadata Types\n // ============================================================\n\n export interface ThreadMetaResult {\n thread: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n agent: {\n id: string;\n title: string;\n type: string;\n side_a_label?: string;\n side_b_label?: string;\n } | null;\n stats: {\n message_count: number;\n log_count: number;\n };\n }\n\n // ============================================================\n // DurableThread Class\n // ============================================================\n\n /**\n * DurableThread with all virtual module methods pre-implemented.\n * Extend this class in your agents/Thread.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * \\`\\`\\`\n */\n export class DurableThread extends BaseDurableThread {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Execution methods\n execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response>;\n sendMessage(\n threadId: string,\n content: string,\n role?: string\n ): Promise<Response>;\n stop(): Promise<Response>;\n shouldStop(): Promise<boolean>;\n\n // Message methods\n getMessages(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC',\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<GetMessagesResult>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }): Promise<{ success: boolean; count?: number; error?: string }>;\n\n // Log methods\n getLogs(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC'\n ): Promise<GetLogsResult>;\n getLogDetails(logId: string): Promise<ThreadLogDetails>;\n\n // Thread management methods\n getThreadMeta(threadId: string): Promise<ThreadMetaResult>;\n updateThreadMeta(\n threadId: string,\n params: UpdateThreadParams\n ): Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n deleteThread(): Promise<{ success: boolean; message: string }>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // DurableAgentBuilder Types\n // ============================================================\n\n export interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n }\n\n export interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n\n export interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }\n\n export interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n }\n\n // ============================================================\n // DurableAgentBuilder Class\n // ============================================================\n\n /**\n * DurableAgentBuilder with all virtual module methods pre-implemented.\n * Extend this class in your agents/AgentBuilder.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n *\n * export class AgentBuilder extends DurableAgentBuilder {}\n * \\`\\`\\`\n */\n export class DurableAgentBuilder extends BaseDurableAgentBuilder {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Thread registry methods\n createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry>;\n getThread(id: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(id: string): Promise<boolean>;\n updateThreadAgent(id: string, agent_name: string): Promise<boolean>;\n updateThread(id: string, params: UpdateThreadParams): Promise<ThreadRegistryEntry | null>;\n getThreadStub(threadId: string): DurableObjectStub;\n\n // Provider methods\n getProvider(name: string): Promise<Provider | null>;\n setProvider(provider: Provider): Promise<void>;\n listProviders(): Promise<Provider[]>;\n deleteProvider(name: string): Promise<boolean>;\n\n // User methods\n getUserByUsername(username: string): Promise<User | null>;\n getUserById(id: string): Promise<User | null>;\n createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User>;\n hasUsers(): Promise<boolean>;\n listUsers(): Promise<Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>>;\n updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null>;\n deleteUser(id: string): Promise<boolean>;\n\n // Session methods\n createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string>;\n validateSession(tokenHash: string): Promise<{ user_id: string; expires_at: number } | null>;\n cleanupSessions(): Promise<number>;\n deleteSession(tokenHash: string): Promise<void>;\n\n // API key methods\n createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string>;\n validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null>;\n listApiKeys(userId: string): Promise<Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>>;\n deleteApiKey(id: string, userId: string): Promise<boolean>;\n\n // OAuth methods\n linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void>;\n findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null>;\n\n // Edit lock methods (for GitHub integration)\n acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean>;\n releaseEditLock(lockedBy: string): Promise<boolean>;\n getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>;\n setPendingChanges(changes: string): Promise<void>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // Router Function\n // ============================================================\n\n /**\n * Main router function for handling incoming requests.\n * Routes requests to the appropriate API endpoint or serves the UI.\n *\n * @example\n * \\`\\`\\`typescript\n * import { router } from 'virtual:@standardagents/builder'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const response = await router(request, env);\n * return response ?? new Response('Not Found', { status: 404 });\n * }\n * }\n * \\`\\`\\`\n */\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n}\n\n/**\n * Legacy alias for the router module.\n * @deprecated Use \\`import { router } from 'virtual:@standardagents/builder'\\` instead.\n */\ndeclare module 'virtual:@standardagents/router' {\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n\n export { DurableThread } from 'virtual:@standardagents/builder';\n}\n`;\n}\n\n/**\n * Ensure a directory exists, creating it if necessary.\n *\n * @param dir - Directory path to ensure exists\n */\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Generate the .agents directory with type declarations.\n *\n * Creates or updates:\n * - .agents/types.d.ts - Type declarations for all definitions (with export {})\n * - .agents/virtual-module.d.ts - Virtual module declarations (ambient, no export)\n * - .agents/tsconfig.json - TypeScript configuration\n * - .agents/.gitignore - Ignore all generated files\n *\n * @param config - Directory configuration\n */\nexport function generateTypes(config: DirectoryConfig): void {\n ensureDir(config.outputDir);\n\n // Generate types.d.ts (global namespace augmentation - needs export {})\n const typesContent = generateTypesContent(config);\n fs.writeFileSync(path.join(config.outputDir, 'types.d.ts'), typesContent);\n\n // Generate virtual-module.d.ts (ambient module declaration - no export)\n const virtualModuleContent = generateVirtualModuleContent();\n fs.writeFileSync(path.join(config.outputDir, 'virtual-module.d.ts'), virtualModuleContent);\n\n // Generate tsconfig.json\n fs.writeFileSync(path.join(config.outputDir, 'tsconfig.json'), TSCONFIG_CONTENT);\n\n // Generate .gitignore to ignore all generated files\n fs.writeFileSync(path.join(config.outputDir, '.gitignore'), '*\\n');\n}\n\n/**\n * Check if type generation is needed based on file modification times.\n *\n * @param config - Directory configuration\n * @returns True if types need regeneration\n */\nexport function needsRegeneration(config: DirectoryConfig): boolean {\n const typesPath = path.join(config.outputDir, 'types.d.ts');\n\n // If types file doesn't exist, we need to generate\n if (!fs.existsSync(typesPath)) {\n return true;\n }\n\n const typesMtime = fs.statSync(typesPath).mtime;\n\n // Check if any source directory has newer files\n const dirs = [config.modelsDir, config.promptsDir, config.agentsDir, config.toolsDir];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) {\n continue;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const fileMtime = fs.statSync(filePath).mtime;\n if (fileMtime > typesMtime) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get default directory configuration based on a base directory.\n *\n * @param baseDir - Base directory (usually process.cwd())\n * @param options - Optional overrides for directory paths\n * @returns Complete directory configuration\n */\nexport function getDefaultConfig(\n baseDir: string,\n options: Partial<DirectoryConfig> = {}\n): DirectoryConfig {\n return {\n modelsDir: options.modelsDir ?? path.join(baseDir, 'agents/models'),\n promptsDir: options.promptsDir ?? path.join(baseDir, 'agents/prompts'),\n agentsDir: options.agentsDir ?? path.join(baseDir, 'agents/agents'),\n toolsDir: options.toolsDir ?? path.join(baseDir, 'agents/tools'),\n outputDir: options.outputDir ?? path.join(baseDir, '.agents'),\n };\n}\n","import type { ModelDefinition } from '../defineModel.js';\n\n/**\n * Generate a TypeScript file for a model definition.\n */\nexport function generateModelFile(data: ModelDefinition): string {\n const lines = [\n `import { defineModel } from '@standardagents/builder';`,\n '',\n `export default defineModel({`,\n ` name: '${escapeString(data.name)}',`,\n ` provider: '${escapeString(data.provider)}',`,\n ` model: '${escapeString(data.model)}',`,\n ];\n\n if (data.includedProviders && data.includedProviders.length > 0) {\n lines.push(` includedProviders: ${JSON.stringify(data.includedProviders)},`);\n }\n\n if (data.fallbacks && data.fallbacks.length > 0) {\n lines.push(` fallbacks: ${JSON.stringify(data.fallbacks)},`);\n }\n\n if (data.inputPrice !== undefined) {\n lines.push(` inputPrice: ${data.inputPrice},`);\n }\n\n if (data.outputPrice !== undefined) {\n lines.push(` outputPrice: ${data.outputPrice},`);\n }\n\n if (data.cachedPrice !== undefined) {\n lines.push(` cachedPrice: ${data.cachedPrice},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * Converts JSON Schema to Zod code string.\n *\n * This is used when saving prompts from the UI - the form editor works with\n * JSON Schema, but we need to generate Zod code for the TypeScript file.\n */\n\nexport interface JSONSchema {\n type?: string;\n description?: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n items?: JSONSchema;\n enum?: (string | number | boolean)[];\n anyOf?: JSONSchema[];\n oneOf?: JSONSchema[];\n allOf?: JSONSchema[];\n const?: any;\n default?: any;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n additionalProperties?: boolean | JSONSchema;\n nullable?: boolean;\n}\n\n/**\n * Convert a JSON Schema to Zod code string.\n *\n * @param schema - The JSON Schema to convert\n * @param indent - Current indentation level (for pretty printing)\n * @returns Zod code as a string\n *\n * @example\n * ```typescript\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', description: 'User name' },\n * age: { type: 'number' }\n * },\n * required: ['name']\n * };\n *\n * jsonSchemaToZod(schema);\n * // Returns: z.object({ name: z.string().describe('User name'), age: z.number().optional() })\n * ```\n */\nexport function jsonSchemaToZod(schema: JSONSchema, indent = 0): string {\n if (!schema || Object.keys(schema).length === 0) {\n return 'z.any()';\n }\n\n // Handle anyOf (union types)\n if (schema.anyOf && schema.anyOf.length > 0) {\n const types = schema.anyOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle oneOf (similar to anyOf for our purposes)\n if (schema.oneOf && schema.oneOf.length > 0) {\n const types = schema.oneOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle allOf (intersection types - merge objects)\n if (schema.allOf && schema.allOf.length > 0) {\n const types = schema.allOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n // For allOf, we use .and() to intersect\n return types.reduce((acc, t) => `${acc}.and(${t})`);\n }\n\n // Handle const\n if (schema.const !== undefined) {\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v) => JSON.stringify(v));\n if (values.length === 1) {\n return `z.literal(${values[0]})`;\n }\n return `z.enum([${values.join(', ')}])`;\n }\n\n // Handle by type\n switch (schema.type) {\n case 'string':\n return buildStringSchema(schema);\n\n case 'number':\n case 'integer':\n return buildNumberSchema(schema);\n\n case 'boolean':\n return addDescription('z.boolean()', schema.description);\n\n case 'null':\n return addDescription('z.null()', schema.description);\n\n case 'array':\n return buildArraySchema(schema, indent);\n\n case 'object':\n return buildObjectSchema(schema, indent);\n\n default:\n // No type specified - use any\n return 'z.any()';\n }\n}\n\nfunction buildStringSchema(schema: JSONSchema): string {\n let code = 'z.string()';\n\n // Add constraints\n if (schema.minLength !== undefined) {\n code += `.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n code += `.max(${schema.maxLength})`;\n }\n if (schema.pattern) {\n code += `.regex(/${escapeRegex(schema.pattern)}/)`;\n }\n\n // Handle format (common JSON Schema formats)\n if (schema.format) {\n switch (schema.format) {\n case 'email':\n code += '.email()';\n break;\n case 'uri':\n case 'url':\n code += '.url()';\n break;\n case 'uuid':\n code += '.uuid()';\n break;\n case 'date-time':\n code += '.datetime()';\n break;\n case 'date':\n code += '.date()';\n break;\n case 'time':\n code += '.time()';\n break;\n case 'ipv4':\n code += '.ip({ version: \"v4\" })';\n break;\n case 'ipv6':\n code += '.ip({ version: \"v6\" })';\n break;\n // Other formats are ignored\n }\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildNumberSchema(schema: JSONSchema): string {\n let code = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if (schema.minimum !== undefined) {\n code += `.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n code += `.max(${schema.maximum})`;\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildArraySchema(schema: JSONSchema, indent: number): string {\n const itemsSchema = schema.items ? jsonSchemaToZod(schema.items, indent) : 'z.any()';\n let code = `z.array(${itemsSchema})`;\n\n return addDescription(code, schema.description);\n}\n\nfunction buildObjectSchema(schema: JSONSchema, indent: number): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or object with any properties\n if (schema.additionalProperties === false) {\n return addDescription('z.object({})', schema.description);\n }\n return addDescription('z.record(z.any())', schema.description);\n }\n\n const required = new Set(schema.required || []);\n const spaces = ' '.repeat(indent + 1);\n const closingSpaces = ' '.repeat(indent);\n\n const props = Object.entries(schema.properties).map(([key, propSchema]) => {\n let propCode = jsonSchemaToZod(propSchema, indent + 1);\n\n // Handle nullable\n if (propSchema.nullable) {\n propCode += '.nullable()';\n }\n\n // Add optional() if not in required array\n if (!required.has(key)) {\n propCode += '.optional()';\n }\n\n // Handle default values\n if (propSchema.default !== undefined) {\n propCode += `.default(${JSON.stringify(propSchema.default)})`;\n }\n\n return `${spaces}${safePropertyKey(key)}: ${propCode}`;\n });\n\n const propsStr = props.join(',\\n');\n let code = `z.object({\\n${propsStr}\\n${closingSpaces}})`;\n\n // Handle additionalProperties\n if (schema.additionalProperties === false) {\n code += '.strict()';\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction addDescription(code: string, description?: string): string {\n if (description) {\n return `${code}.describe(${JSON.stringify(description)})`;\n }\n return code;\n}\n\nfunction escapeRegex(pattern: string): string {\n // Escape forward slashes for regex literal\n return pattern.replace(/\\//g, '\\\\/');\n}\n\nfunction safePropertyKey(key: string): string {\n // Check if key is a valid JS identifier\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n // Otherwise quote it\n return JSON.stringify(key);\n}\n\n/**\n * Check if a JSON Schema is empty or trivial (no meaningful constraints).\n */\nexport function isEmptySchema(schema: JSONSchema | null | undefined): boolean {\n if (!schema) return true;\n if (Object.keys(schema).length === 0) return true;\n\n // A schema with only type: object and empty properties is considered empty\n if (\n schema.type === 'object' &&\n (!schema.properties || Object.keys(schema.properties).length === 0) &&\n (!schema.required || schema.required.length === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import type { PromptDefinition, PromptPart, StructuredPrompt } from '../definePrompt.js';\nimport { jsonSchemaToZod, isEmptySchema, type JSONSchema } from './jsonSchemaToZod.js';\n\n/**\n * Tool configuration from UI (snake_case).\n */\ninterface ToolConfigInput {\n name: string;\n include_text_response?: boolean;\n include_tool_calls?: boolean;\n include_errors?: boolean;\n init_user_message_property?: string | null;\n}\n\n/**\n * Prompt part as it comes from the UI/API.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt')\n */\ninterface PromptPartInput {\n // New format\n type: 'text' | 'include' | 'string' | 'prompt' | 'variable';\n content?: string; // For type: 'text'\n prompt?: string; // For type: 'include'\n // Legacy format\n value?: string; // For legacy type: 'string' or 'variable'\n id?: string; // For legacy type: 'prompt'\n label?: string; // Legacy UI field\n schema?: any; // Legacy field from UI, ignored\n}\n\n/**\n * Input data for generating a prompt file.\n * This can include JSON Schema for requiredSchema which will be converted to Zod.\n */\nexport interface PromptFileData {\n name: string;\n toolDescription?: string;\n /**\n * Prompt content can be:\n * - A plain string\n * - A structured array of prompt parts\n * - A JSON string of a structured array (legacy format from UI)\n */\n prompt?: string | PromptPartInput[];\n model: string;\n includeChat?: boolean;\n includePastTools?: boolean;\n parallelToolCalls?: boolean;\n toolChoice?: 'auto' | 'none' | 'required';\n tools?: (string | ToolConfigInput)[];\n handoffAgents?: string[];\n beforeTool?: string;\n afterTool?: string;\n reasoning?: {\n effort?: 'low' | 'medium' | 'high';\n maxTokens?: number;\n exclude?: boolean;\n include?: boolean;\n };\n /**\n * Required schema as JSON Schema (from the UI).\n * Will be converted to Zod code.\n */\n requiredSchema?: JSONSchema;\n}\n\n/**\n * Generate a TypeScript file for a prompt definition.\n *\n * @param data - Prompt data including JSON Schema for requiredSchema\n * @returns TypeScript code as a string\n */\nexport function generatePromptFile(data: PromptFileData): string {\n const hasSchema = data.requiredSchema && !isEmptySchema(data.requiredSchema);\n\n const lines = [`import { definePrompt } from '@standardagents/builder';`];\n\n // Add zod import if there's a requiredSchema with actual content\n if (hasSchema) {\n lines.push(`import { z } from 'zod';`);\n }\n\n lines.push('');\n lines.push(`export default definePrompt({`);\n lines.push(` name: '${escapeString(data.name)}',`);\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n // Prompt content - either plain string or structured array\n if (data.prompt !== undefined) {\n const promptCode = formatPromptContent(data.prompt);\n lines.push(` prompt: ${promptCode},`);\n }\n\n lines.push(` model: '${escapeString(data.model)}',`);\n\n // Note: exposeAsTool removed - all prompts are exposed as tools by default\n\n if (data.includeChat !== undefined) {\n lines.push(` includeChat: ${data.includeChat},`);\n }\n\n if (data.includePastTools !== undefined) {\n lines.push(` includePastTools: ${data.includePastTools},`);\n }\n\n if (data.parallelToolCalls !== undefined) {\n lines.push(` parallelToolCalls: ${data.parallelToolCalls},`);\n }\n\n if (data.toolChoice && data.toolChoice !== 'auto') {\n lines.push(` toolChoice: '${data.toolChoice}',`);\n }\n\n // Tools - can be strings or ToolConfig objects\n if (data.tools && data.tools.length > 0) {\n const toolsCode = formatToolsArray(data.tools);\n lines.push(` tools: ${toolsCode},`);\n }\n\n // Handoff agents - output as TypeScript array\n if (data.handoffAgents && data.handoffAgents.length > 0) {\n const agentsStr = data.handoffAgents.map(a => `'${escapeString(a)}'`).join(', ');\n lines.push(` handoffAgents: [${agentsStr}],`);\n }\n\n // Before/after tools\n if (data.beforeTool) {\n lines.push(` beforeTool: '${escapeString(data.beforeTool)}',`);\n }\n\n if (data.afterTool) {\n lines.push(` afterTool: '${escapeString(data.afterTool)}',`);\n }\n\n // Reasoning config - output as TypeScript object (no quoted keys)\n if (data.reasoning && hasNonNullProperties(data.reasoning)) {\n const reasoningCode = formatReasoningConfig(data.reasoning);\n lines.push(` reasoning: ${reasoningCode},`);\n }\n\n // RequiredSchema - convert JSON Schema to Zod code\n if (hasSchema) {\n const zodCode = jsonSchemaToZod(data.requiredSchema!, 1);\n lines.push(` requiredSchema: ${zodCode},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if an object has any non-null/non-undefined properties.\n */\nfunction hasNonNullProperties(obj: Record<string, any>): boolean {\n return Object.values(obj).some(v => v !== null && v !== undefined);\n}\n\n/**\n * Format the tools array as TypeScript code (not JSON).\n * Transforms snake_case properties from UI to camelCase for TypeScript.\n */\nfunction formatToolsArray(tools: (string | ToolConfigInput)[]): string {\n const formatted = tools.map(tool => {\n if (typeof tool === 'string') {\n return `'${escapeString(tool)}'`;\n }\n // Tool config object - transform to camelCase and format as TypeScript\n return formatToolConfig(tool);\n });\n\n if (formatted.length === 1) {\n return `[${formatted[0]}]`;\n }\n\n // Multi-line format for multiple tools\n const indented = formatted.map(t => ` ${t}`).join(',\\n');\n return `[\\n${indented}\\n ]`;\n}\n\n/**\n * Format a tool config object as TypeScript code.\n * Transforms snake_case to camelCase and omits null/default values.\n */\nfunction formatToolConfig(config: ToolConfigInput): string {\n const parts: string[] = [];\n\n parts.push(`name: '${escapeString(config.name)}'`);\n\n // Transform snake_case to camelCase and only include non-default values\n if (config.include_text_response !== undefined && config.include_text_response !== true) {\n parts.push(`includeTextResponse: ${config.include_text_response}`);\n }\n\n if (config.include_tool_calls !== undefined && config.include_tool_calls !== true) {\n parts.push(`includeToolCalls: ${config.include_tool_calls}`);\n }\n\n if (config.include_errors !== undefined && config.include_errors !== true) {\n parts.push(`includeErrors: ${config.include_errors}`);\n }\n\n if (config.init_user_message_property !== undefined && config.init_user_message_property !== null) {\n parts.push(`initUserMessageProperty: '${escapeString(config.init_user_message_property)}'`);\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\n/**\n * Format reasoning config as TypeScript code (not JSON).\n */\nfunction formatReasoningConfig(reasoning: PromptFileData['reasoning']): string {\n if (!reasoning) return '{}';\n\n const parts: string[] = [];\n\n if (reasoning.effort !== undefined && reasoning.effort !== null) {\n parts.push(`effort: '${reasoning.effort}'`);\n }\n\n if (reasoning.maxTokens !== undefined && reasoning.maxTokens !== null) {\n parts.push(`maxTokens: ${reasoning.maxTokens}`);\n }\n\n if (reasoning.exclude !== undefined && reasoning.exclude !== null) {\n parts.push(`exclude: ${reasoning.exclude}`);\n }\n\n if (reasoning.include !== undefined && reasoning.include !== null) {\n parts.push(`include: ${reasoning.include}`);\n }\n\n if (parts.length === 0) {\n return '{}';\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\${/g, '\\\\${');\n}\n\n/**\n * Parse prompt content into an array of parts.\n * Returns null if it's a plain string, or the array of parts if structured.\n */\nfunction parsePromptContent(prompt: string | PromptPartInput[] | undefined): PromptPartInput[] | null {\n if (!prompt) return null;\n\n // Already an array\n if (Array.isArray(prompt)) {\n return prompt;\n }\n\n // Try to parse as JSON array (legacy format from UI)\n if (typeof prompt === 'string') {\n try {\n const parsed = JSON.parse(prompt);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, it's a plain string\n }\n }\n\n return null;\n}\n\n/**\n * Format prompt content as TypeScript code.\n * Plain strings use template literals, structured prompts use helper functions.\n */\nfunction formatPromptContent(prompt: string | PromptPartInput[] | undefined): string {\n if (!prompt) return \"''\";\n\n // Parse the prompt content\n const parts = parsePromptContent(prompt);\n\n // If it's a structured prompt (array), format it using helper functions\n if (parts !== null) {\n return formatStructuredPrompt(parts);\n }\n\n // Plain string - use template literal for multi-line\n if (typeof prompt === 'string') {\n if (prompt.includes('\\n')) {\n return `\\`${escapeTemplateLiteral(prompt)}\\``;\n }\n return `'${escapeString(prompt)}'`;\n }\n\n return \"''\";\n}\n\n/**\n * Format a structured prompt array as TypeScript code using discriminated union objects.\n */\nfunction formatStructuredPrompt(parts: PromptPartInput[]): string {\n if (parts.length === 0) {\n return '[]';\n }\n\n // Normalize parts to the new format\n const normalizedParts = parts.map(normalizePart);\n\n // Check if it's simple enough to be on one line (single short text part)\n if (normalizedParts.length === 1 && normalizedParts[0].type === 'text') {\n const content = normalizedParts[0].content || '';\n if (!content.includes('\\n') && content.length < 50) {\n return `[{ type: 'text', content: '${escapeString(content)}' }]`;\n }\n }\n\n // Multi-line format\n const formattedParts = normalizedParts.map(part => {\n if (part.type === 'text') {\n const content = part.content || '';\n // Use template literal for multi-line strings\n if (content.includes('\\n')) {\n return ` { type: 'text', content: \\`${escapeTemplateLiteral(content)}\\` }`;\n }\n return ` { type: 'text', content: '${escapeString(content)}' }`;\n } else if (part.type === 'include') {\n const promptName = part.prompt || '';\n return ` { type: 'include', prompt: '${escapeString(promptName)}' }`;\n }\n return ` // Unknown part type: ${(part as any).type}`;\n });\n\n return `[\\n${formattedParts.join(',\\n')},\\n ]`;\n}\n\n/**\n * Normalize a prompt part from legacy format to new format.\n * Legacy: { type: 'string', value: '...' } or { type: 'prompt', id: '...' }\n * New: { type: 'text', content: '...' } or { type: 'include', prompt: '...' }\n */\nfunction normalizePart(part: PromptPartInput): { type: 'text'; content: string } | { type: 'include'; prompt: string } {\n // Handle new format\n if (part.type === 'text') {\n return { type: 'text', content: part.content || '' };\n }\n if (part.type === 'include') {\n return { type: 'include', prompt: part.prompt || '' };\n }\n\n // Handle legacy format\n if (part.type === 'string') {\n return { type: 'text', content: part.value || '' };\n }\n if (part.type === 'prompt') {\n return { type: 'include', prompt: part.id || '' };\n }\n if (part.type === 'variable') {\n // Variables are converted to text with placeholder syntax\n return { type: 'text', content: `{{${part.value || ''}}}` };\n }\n\n // Fallback for unknown types\n return { type: 'text', content: '' };\n}\n","import type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Generate a TypeScript file for an agent definition.\n */\nexport function generateAgentFile(data: AgentDefinition): string {\n const lines = [\n `import { defineAgent } from '@standardagents/builder';`,\n '',\n `export default defineAgent({`,\n ` name: '${escapeString(data.name)}',`,\n ];\n\n // Only include title if explicitly provided (deprecated field)\n if (data.title) {\n lines.push(` title: '${escapeString(data.title)}',`);\n }\n\n if (data.type && data.type !== 'ai_human') {\n lines.push(` type: '${data.type}',`);\n }\n\n if (data.maxSessionTurns !== undefined) {\n lines.push(` maxSessionTurns: ${data.maxSessionTurns},`);\n }\n\n // Side A config\n lines.push(` sideA: ${formatSideConfig(data.sideA)},`);\n\n // Side B config (optional)\n if (data.sideB) {\n lines.push(` sideB: ${formatSideConfig(data.sideB)},`);\n }\n\n if (data.exposeAsTool !== undefined) {\n lines.push(` exposeAsTool: ${data.exposeAsTool},`);\n }\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n if (data.tags && data.tags.length > 0) {\n lines.push(` tags: ${JSON.stringify(data.tags)},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatSideConfig(config: AgentDefinition['sideA']): string {\n const parts: string[] = ['{'];\n\n if (config.label) {\n parts.push(` label: '${escapeString(config.label)}',`);\n }\n\n parts.push(` prompt: '${escapeString(config.prompt)}',`);\n\n if (config.stopOnResponse !== undefined) {\n parts.push(` stopOnResponse: ${config.stopOnResponse},`);\n }\n\n if (config.stopTool) {\n parts.push(` stopTool: '${escapeString(config.stopTool)}',`);\n }\n\n if (config.stopToolResponseProperty) {\n parts.push(` stopToolResponseProperty: '${escapeString(config.stopToolResponseProperty)}',`);\n }\n\n if (config.maxTurns !== undefined) {\n parts.push(` maxTurns: ${config.maxTurns},`);\n }\n\n if (config.endConversationTool) {\n parts.push(` endConversationTool: '${escapeString(config.endConversationTool)}',`);\n }\n\n if (config.manualStopCondition !== undefined) {\n parts.push(` manualStopCondition: ${config.manualStopCondition},`);\n }\n\n parts.push(' }');\n return parts.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * File persistence service for dev mode.\n *\n * This module provides filesystem operations for creating, updating, and deleting\n * model, prompt, and agent definition files. It runs in the Vite plugin context\n * (Node.js) where filesystem access is available.\n *\n * In production (Cloudflare Workers), these operations would be handled by\n * a different mechanism (e.g., GitHub API commits).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { generateModelFile } from '../generators/generateModelFile.js';\nimport { generatePromptFile, type PromptFileData } from '../generators/generatePromptFile.js';\nimport { generateAgentFile } from '../generators/generateAgentFile.js';\nimport type { ModelDefinition } from '../defineModel.js';\nimport type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Convert a model/prompt/agent name to a safe filename.\n * Handles characters that are invalid in filesystem paths:\n * - Replaces `/` and `\\` with `__` (path separators)\n * - Replaces `:` with `_` (invalid on Windows, used in model IDs like `:free`)\n * - Replaces `-` with `_` for consistency with existing conventions\n * - Replaces other problematic characters (`*`, `?`, `\"`, `<`, `>`, `|`) with `_`\n */\nexport function nameToFilename(name: string): string {\n return name\n .replace(/[/\\\\]/g, '__') // Path separators become double underscore\n .replace(/[:*?\"<>|]/g, '_') // Invalid filesystem characters become underscore\n .replace(/-/g, '_'); // Hyphens become underscore for consistency\n}\n\n/**\n * Get the file path for a model definition.\n */\nexport function getModelFilePath(modelsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(modelsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a model file already exists.\n */\nexport function modelExists(modelsDir: string, name: string): boolean {\n const filePath = getModelFilePath(modelsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Result of a persistence operation.\n */\nexport interface PersistenceResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\n/**\n * Save a model definition to a TypeScript file.\n *\n * @param modelsDir - The directory where models are stored\n * @param data - The model definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveModel(\n modelsDir: string,\n data: ModelDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure models directory exists\n if (!fs.existsSync(modelsDir)) {\n fs.mkdirSync(modelsDir, { recursive: true });\n }\n\n const filePath = getModelFilePath(modelsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file already exists: ${filePath}. Use update to modify existing models.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateModelFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save model',\n };\n }\n}\n\n/**\n * Delete a model definition file.\n *\n * @param modelsDir - The directory where models are stored\n * @param name - The model name\n * @returns Result of the operation\n */\nexport async function deleteModel(\n modelsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getModelFilePath(modelsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete model',\n };\n }\n}\n\n/**\n * Transform snake_case model data from the UI to camelCase for internal use.\n * The UI sends field names like `included_providers`, etc.\n * but the backend expects `includedProviders`, etc.\n *\n * Also strips price fields for OpenRouter models since those are returned\n * per-request by the OpenRouter API.\n */\nexport function transformModelData(data: any): any {\n const transformed: any = {};\n const isOpenRouter = data.provider === 'openrouter';\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n included_providers: 'includedProviders',\n input_price: 'inputPrice',\n output_price: 'outputPrice',\n cached_price: 'cachedPrice',\n };\n\n // Fields to skip for OpenRouter models (prices come from API per-request)\n const openRouterSkipFields = ['inputPrice', 'outputPrice', 'cachedPrice', 'input_price', 'output_price', 'cached_price'];\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Skip price fields for OpenRouter models\n if (isOpenRouter && openRouterSkipFields.includes(key)) continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n const transformedKey = fieldMappings[key];\n // Skip price fields for OpenRouter even after transformation\n if (isOpenRouter && openRouterSkipFields.includes(transformedKey)) continue;\n transformed[transformedKey] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'model', 'provider', etc.)\n transformed[key] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Validate model data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateModelData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Model name is required and must be a string';\n }\n\n if (!data.provider || typeof data.provider !== 'string') {\n return 'Model provider is required and must be a string';\n }\n\n const validProviders = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(data.provider)) {\n return `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(', ')}`;\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Model ID is required and must be a string';\n }\n\n // Validate optional numeric fields\n if (data.inputPrice !== undefined && typeof data.inputPrice !== 'number') {\n return 'inputPrice must be a number';\n }\n\n if (data.outputPrice !== undefined && typeof data.outputPrice !== 'number') {\n return 'outputPrice must be a number';\n }\n\n if (data.cachedPrice !== undefined && typeof data.cachedPrice !== 'number') {\n return 'cachedPrice must be a number';\n }\n\n // Validate fallbacks is an array of strings\n if (data.fallbacks !== undefined) {\n if (!Array.isArray(data.fallbacks)) {\n return 'fallbacks must be an array';\n }\n for (const fallback of data.fallbacks) {\n if (typeof fallback !== 'string') {\n return 'Each fallback must be a string (model name)';\n }\n }\n }\n\n // Validate includedProviders is an array of strings\n if (data.includedProviders !== undefined) {\n if (!Array.isArray(data.includedProviders)) {\n return 'includedProviders must be an array';\n }\n for (const provider of data.includedProviders) {\n if (typeof provider !== 'string') {\n return 'Each includedProvider must be a string';\n }\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Prompt Persistence\n// ============================================================================\n\n/**\n * Transform snake_case prompt data from the UI to camelCase for internal use.\n * The UI sends field names like `model_id`, `tool_description`, etc.\n * but the backend expects `model`, `toolDescription`, etc.\n */\nexport function transformPromptData(data: any): any {\n const transformed: any = {};\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n model_id: 'model',\n tool_description: 'toolDescription',\n expose_as_tool: 'exposeAsTool',\n required_schema: 'requiredSchema',\n include_chat: 'includeChat',\n include_past_tools: 'includePastTools',\n before_tool: 'beforeTool',\n after_tool: 'afterTool',\n parallel_tool_calls: 'parallelToolCalls',\n tool_choice: 'toolChoice',\n handoff_agents: 'handoffAgents',\n reasoning_effort: 'reasoningEffort',\n reasoning_max_tokens: 'reasoningMaxTokens',\n reasoning_exclude: 'reasoningExclude',\n include_reasoning: 'includeReasoning',\n };\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n transformed[fieldMappings[key]] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'prompt', 'tools', etc.)\n transformed[key] = value;\n }\n }\n\n // Build reasoning config if any reasoning fields are present\n if (\n transformed.reasoningEffort !== undefined ||\n transformed.reasoningMaxTokens !== undefined ||\n transformed.reasoningExclude !== undefined ||\n transformed.includeReasoning !== undefined\n ) {\n transformed.reasoning = {};\n if (transformed.reasoningEffort) {\n transformed.reasoning.effort = transformed.reasoningEffort;\n }\n if (transformed.reasoningMaxTokens) {\n transformed.reasoning.maxTokens = transformed.reasoningMaxTokens;\n }\n if (transformed.reasoningExclude !== undefined) {\n transformed.reasoning.exclude = transformed.reasoningExclude;\n }\n if (transformed.includeReasoning !== undefined) {\n transformed.reasoning.include = transformed.includeReasoning;\n }\n // Clean up the flat fields\n delete transformed.reasoningEffort;\n delete transformed.reasoningMaxTokens;\n delete transformed.reasoningExclude;\n delete transformed.includeReasoning;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for a prompt definition.\n */\nexport function getPromptFilePath(promptsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(promptsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a prompt file already exists.\n */\nexport function promptExists(promptsDir: string, name: string): boolean {\n const filePath = getPromptFilePath(promptsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save a prompt definition to a TypeScript file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param data - The prompt definition data (with JSON Schema for requiredSchema)\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function savePrompt(\n promptsDir: string,\n data: PromptFileData,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure prompts directory exists\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n const filePath = getPromptFilePath(promptsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${filePath}. Use update to modify existing prompts.`,\n };\n }\n\n // Generate the TypeScript file content (converts JSON Schema to Zod)\n const content = generatePromptFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save prompt',\n };\n }\n}\n\n/**\n * Delete a prompt definition file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param name - The prompt name\n * @returns Result of the operation\n */\nexport async function deletePrompt(\n promptsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getPromptFilePath(promptsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete prompt',\n };\n }\n}\n\n/**\n * Rename a prompt definition file and update its name property.\n * Since prompts contain Zod schemas that can't be easily regenerated from JSON Schema,\n * this function reads the file and updates the name property in place.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldName - The current prompt name\n * @param newName - The new prompt name\n * @returns Result of the operation\n */\nexport async function renamePrompt(\n promptsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getPromptFilePath(promptsDir, oldName);\n const newFilePath = getPromptFilePath(promptsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename prompt',\n };\n }\n}\n\n/**\n * Validate prompt data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validatePromptData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Prompt name is required and must be a string';\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Prompt model is required and must be a string';\n }\n\n // toolDescription is optional but should be string if provided\n if (data.toolDescription !== undefined && typeof data.toolDescription !== 'string') {\n return 'toolDescription must be a string';\n }\n\n // prompt content is optional but should be string if provided\n if (data.prompt !== undefined && typeof data.prompt !== 'string') {\n return 'prompt must be a string';\n }\n\n // Validate boolean fields (exposeAsTool removed - all prompts exposed by default)\n const booleanFields = ['includeChat', 'includePastTools', 'parallelToolCalls'];\n for (const field of booleanFields) {\n if (data[field] !== undefined && typeof data[field] !== 'boolean') {\n return `${field} must be a boolean`;\n }\n }\n\n // Validate toolChoice\n if (data.toolChoice !== undefined) {\n const validChoices = ['auto', 'none', 'required'];\n if (!validChoices.includes(data.toolChoice)) {\n return `Invalid toolChoice '${data.toolChoice}'. Must be one of: ${validChoices.join(', ')}`;\n }\n }\n\n // Validate tools is an array\n if (data.tools !== undefined && !Array.isArray(data.tools)) {\n return 'tools must be an array';\n }\n\n // Validate handoffAgents is an array\n if (data.handoffAgents !== undefined && !Array.isArray(data.handoffAgents)) {\n return 'handoffAgents must be an array';\n }\n\n // Validate reasoning config\n if (data.reasoning !== undefined) {\n if (typeof data.reasoning !== 'object') {\n return 'reasoning must be an object';\n }\n if (data.reasoning.effort !== undefined) {\n const validEfforts = ['low', 'medium', 'high'];\n if (!validEfforts.includes(data.reasoning.effort)) {\n return `Invalid reasoning.effort '${data.reasoning.effort}'. Must be one of: ${validEfforts.join(', ')}`;\n }\n }\n if (data.reasoning.maxTokens !== undefined && typeof data.reasoning.maxTokens !== 'number') {\n return 'reasoning.maxTokens must be a number';\n }\n }\n\n // requiredSchema is validated by the generatePromptFile function\n // (it handles JSON Schema to Zod conversion)\n\n return null;\n}\n\n// ============================================================================\n// Agent Persistence\n// ============================================================================\n\n/**\n * Transform snake_case agent data from the UI to camelCase for internal use.\n * The UI sends field names like `side_a_label`, `side_a_agent_prompt`, etc.\n * but the backend expects nested structures like `sideA.label`, `sideA.prompt`, etc.\n */\nexport function transformAgentData(data: any): any {\n const transformed: any = {\n name: data.name,\n };\n\n // title is deprecated but include if provided for backward compatibility\n if (data.title) {\n transformed.title = data.title;\n }\n\n // Type\n if (data.type) {\n transformed.type = data.type;\n }\n\n // Max session turns\n if (data.max_session_turns !== undefined) {\n transformed.maxSessionTurns = data.max_session_turns;\n }\n\n // Side A configuration\n transformed.sideA = {\n prompt: data.side_a_agent_prompt,\n };\n if (data.side_a_label) {\n transformed.sideA.label = data.side_a_label;\n }\n if (data.side_a_stop_on_response !== undefined) {\n transformed.sideA.stopOnResponse = data.side_a_stop_on_response;\n }\n if (data.side_a_stop_tool) {\n transformed.sideA.stopTool = data.side_a_stop_tool;\n }\n if (data.side_a_stop_tool_response_property) {\n transformed.sideA.stopToolResponseProperty = data.side_a_stop_tool_response_property;\n }\n if (data.side_a_max_turns !== undefined) {\n transformed.sideA.maxTurns = data.side_a_max_turns;\n }\n if (data.side_a_end_conversation_tool) {\n transformed.sideA.endConversationTool = data.side_a_end_conversation_tool;\n }\n if (data.side_a_manual_stop_condition !== undefined) {\n transformed.sideA.manualStopCondition = data.side_a_manual_stop_condition;\n }\n\n // Side B configuration (optional, for dual_ai)\n if (data.side_b_agent_prompt) {\n transformed.sideB = {\n prompt: data.side_b_agent_prompt,\n };\n if (data.side_b_label) {\n transformed.sideB.label = data.side_b_label;\n }\n if (data.side_b_stop_on_response !== undefined) {\n transformed.sideB.stopOnResponse = data.side_b_stop_on_response;\n }\n if (data.side_b_stop_tool) {\n transformed.sideB.stopTool = data.side_b_stop_tool;\n }\n if (data.side_b_stop_tool_response_property) {\n transformed.sideB.stopToolResponseProperty = data.side_b_stop_tool_response_property;\n }\n if (data.side_b_max_turns !== undefined) {\n transformed.sideB.maxTurns = data.side_b_max_turns;\n }\n if (data.side_b_end_conversation_tool) {\n transformed.sideB.endConversationTool = data.side_b_end_conversation_tool;\n }\n if (data.side_b_manual_stop_condition !== undefined) {\n transformed.sideB.manualStopCondition = data.side_b_manual_stop_condition;\n }\n }\n\n // Tool exposure\n if (data.expose_as_tool !== undefined) {\n transformed.exposeAsTool = data.expose_as_tool;\n }\n if (data.tool_description) {\n transformed.toolDescription = data.tool_description;\n }\n\n // Tags\n if (data.tags) {\n transformed.tags = data.tags;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for an agent definition.\n */\nexport function getAgentFilePath(agentsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(agentsDir, `${filename}.ts`);\n}\n\n/**\n * Check if an agent file already exists.\n */\nexport function agentExists(agentsDir: string, name: string): boolean {\n const filePath = getAgentFilePath(agentsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save an agent definition to a TypeScript file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param data - The agent definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveAgent(\n agentsDir: string,\n data: AgentDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure agents directory exists\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n const filePath = getAgentFilePath(agentsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${filePath}. Use update to modify existing agents.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateAgentFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save agent',\n };\n }\n}\n\n/**\n * Delete an agent definition file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param name - The agent name\n * @returns Result of the operation\n */\nexport async function deleteAgent(\n agentsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getAgentFilePath(agentsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete agent',\n };\n }\n}\n\n/**\n * Rename an agent definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldName - The current agent name\n * @param newName - The new agent name\n * @returns Result of the operation\n */\nexport async function renameAgent(\n agentsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getAgentFilePath(agentsDir, oldName);\n const newFilePath = getAgentFilePath(agentsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Agent file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename agent',\n };\n }\n}\n\n/**\n * Rename a model definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param modelsDir - The directory where models are stored\n * @param oldName - The current model name\n * @param newName - The new model name\n * @returns Result of the operation\n */\nexport async function renameModel(\n modelsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getModelFilePath(modelsDir, oldName);\n const newFilePath = getModelFilePath(modelsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Model file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Model file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename model',\n };\n }\n}\n\n// ============================================================================\n// Cascade Update Functions\n// ============================================================================\n\n/**\n * Update model references in all prompt files when a model is renamed.\n * Prompts reference models via the `model` field.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldModelName - The old model name\n * @param newModelName - The new model name\n * @returns Array of updated file paths\n */\nexport async function updateModelReferencesInPrompts(\n promptsDir: string,\n oldModelName: string,\n newModelName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match model: 'old_name' or model: \"old_name\"\n const modelRegex = new RegExp(`model:\\\\s*['\"]${escapeRegExp(oldModelName)}['\"]`, 'g');\n\n if (modelRegex.test(content)) {\n content = content.replace(modelRegex, `model: '${newModelName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in other prompt files when a prompt is renamed.\n * Prompts reference other prompts via the `tools` array (prompts exposed as tools).\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInPrompts(\n promptsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n let modified = false;\n\n // Match prompt references in tools array: 'old_name' or \"old_name\"\n // This is a simple string replacement within the tools array context\n const toolsArrayRegex = /tools:\\s*\\[([^\\]]*)\\]/gs;\n const newContent = content.replace(toolsArrayRegex, (match) => {\n const oldMatch = match;\n // Replace the prompt name within the tools array\n const promptRefRegex = new RegExp(`['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n const replaced = match.replace(promptRefRegex, `'${newPromptName}'`);\n if (replaced !== oldMatch) {\n modified = true;\n }\n return replaced;\n });\n\n if (modified) {\n await fs.promises.writeFile(filePath, newContent, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in agent files when a prompt is renamed.\n * Agents reference prompts via sideA.prompt and sideB.prompt fields.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInAgents(\n agentsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(agentsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match prompt: 'old_name' or prompt: \"old_name\" in sideA/sideB objects\n const promptRegex = new RegExp(`prompt:\\\\s*['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n\n if (promptRegex.test(content)) {\n content = content.replace(promptRegex, `prompt: '${newPromptName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Validate agent data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateAgentData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Agent name is required and must be a string';\n }\n\n // title is deprecated and optional - validate if provided\n if (data.title !== undefined && typeof data.title !== 'string') {\n return 'Agent title must be a string if provided';\n }\n\n // Validate type\n if (data.type !== undefined) {\n const validTypes = ['ai_human', 'dual_ai'];\n if (!validTypes.includes(data.type)) {\n return `Invalid type '${data.type}'. Must be one of: ${validTypes.join(', ')}`;\n }\n }\n\n // Validate sideA\n if (!data.sideA || typeof data.sideA !== 'object') {\n return 'sideA configuration is required';\n }\n\n if (!data.sideA.prompt || typeof data.sideA.prompt !== 'string') {\n return 'sideA.prompt is required and must be a string';\n }\n\n // Validate sideA optional fields\n if (data.sideA.label !== undefined && typeof data.sideA.label !== 'string') {\n return 'sideA.label must be a string';\n }\n\n if (data.sideA.stopOnResponse !== undefined && typeof data.sideA.stopOnResponse !== 'boolean') {\n return 'sideA.stopOnResponse must be a boolean';\n }\n\n if (data.sideA.stopTool !== undefined && typeof data.sideA.stopTool !== 'string') {\n return 'sideA.stopTool must be a string';\n }\n\n if (data.sideA.stopTool && !data.sideA.stopToolResponseProperty) {\n return 'sideA.stopToolResponseProperty is required when sideA.stopTool is set';\n }\n\n if (data.sideA.maxTurns !== undefined) {\n if (typeof data.sideA.maxTurns !== 'number' || data.sideA.maxTurns <= 0) {\n return 'sideA.maxTurns must be a positive number';\n }\n }\n\n // Validate dual_ai requires sideB\n if (data.type === 'dual_ai') {\n if (!data.sideB || typeof data.sideB !== 'object') {\n return 'sideB configuration is required for dual_ai type';\n }\n\n if (!data.sideB.prompt || typeof data.sideB.prompt !== 'string') {\n return 'sideB.prompt is required for dual_ai type';\n }\n\n // Validate sideB optional fields\n if (data.sideB.stopTool && !data.sideB.stopToolResponseProperty) {\n return 'sideB.stopToolResponseProperty is required when sideB.stopTool is set';\n }\n\n if (data.sideB.maxTurns !== undefined) {\n if (typeof data.sideB.maxTurns !== 'number' || data.sideB.maxTurns <= 0) {\n return 'sideB.maxTurns must be a positive number';\n }\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (data.exposeAsTool && !data.toolDescription) {\n return 'toolDescription is required when exposeAsTool is true';\n }\n\n // Validate maxSessionTurns\n if (data.maxSessionTurns !== undefined) {\n if (typeof data.maxSessionTurns !== 'number' || data.maxSessionTurns <= 0) {\n return 'maxSessionTurns must be a positive number';\n }\n }\n\n // Validate tags\n if (data.tags !== undefined) {\n if (!Array.isArray(data.tags)) {\n return 'tags must be an array';\n }\n for (const tag of data.tags) {\n if (typeof tag !== 'string') {\n return 'Each tag must be a string';\n }\n }\n }\n\n return null;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Plugin, ViteDevServer } from \"vite\";\nimport { generateTypes, getDefaultConfig, needsRegeneration } from \"./sdk/generateTypes.js\";\nimport {\n saveModel,\n deleteModel,\n renameModel,\n validateModelData,\n modelExists,\n transformModelData,\n savePrompt,\n deletePrompt,\n renamePrompt,\n validatePromptData,\n promptExists,\n transformPromptData,\n saveAgent,\n deleteAgent,\n validateAgentData,\n agentExists,\n transformAgentData,\n updateModelReferencesInPrompts,\n updatePromptReferencesInPrompts,\n updatePromptReferencesInAgents,\n} from \"./sdk/persistence/index.js\";\n\nconst VIRTUAL_TOOLS_ID = \"virtual:@standardagents-tools\";\nconst RESOLVED_VIRTUAL_TOOLS_ID = \"\\0\" + VIRTUAL_TOOLS_ID;\n\nconst VIRTUAL_ROUTES_ID = \"virtual:@standardagents-routes\";\nconst RESOLVED_VIRTUAL_ROUTES_ID = \"\\0\" + VIRTUAL_ROUTES_ID;\n\n// Legacy alias for backward compatibility\nconst VIRTUAL_ROUTER_ID = \"virtual:@standardagents/router\";\nconst RESOLVED_VIRTUAL_ROUTER_ID = \"\\0\" + VIRTUAL_ROUTER_ID;\n\nconst VIRTUAL_HOOKS_ID = \"virtual:@standardagents-hooks\";\nconst RESOLVED_VIRTUAL_HOOKS_ID = \"\\0\" + VIRTUAL_HOOKS_ID;\n\nconst VIRTUAL_CONFIG_ID = \"virtual:@standardagents-config\";\nconst RESOLVED_VIRTUAL_CONFIG_ID = \"\\0\" + VIRTUAL_CONFIG_ID;\n\nconst VIRTUAL_THREAD_API_ID = \"virtual:@standardagents-thread-api\";\nconst RESOLVED_VIRTUAL_THREAD_API_ID = \"\\0\" + VIRTUAL_THREAD_API_ID;\n\n// Virtual modules for models, prompts, and agents\nconst VIRTUAL_MODELS_ID = \"virtual:@standardagents-models\";\nconst RESOLVED_VIRTUAL_MODELS_ID = \"\\0\" + VIRTUAL_MODELS_ID;\n\nconst VIRTUAL_PROMPTS_ID = \"virtual:@standardagents-prompts\";\nconst RESOLVED_VIRTUAL_PROMPTS_ID = \"\\0\" + VIRTUAL_PROMPTS_ID;\n\nconst VIRTUAL_AGENTS_ID = \"virtual:@standardagents-agents\";\nconst RESOLVED_VIRTUAL_AGENTS_ID = \"\\0\" + VIRTUAL_AGENTS_ID;\n\n// Consolidated virtual module that provides DurableThread and DurableAgentBuilder\n// with methods already implemented (tools, hooks, models, prompts, agents)\nconst VIRTUAL_BUILDER_ID = \"virtual:@standardagents/builder\";\nconst RESOLVED_VIRTUAL_BUILDER_ID = \"\\0\" + VIRTUAL_BUILDER_ID;\n\n// API Routes functionality\nfunction scanApiDirectory(\n dir: string,\n baseRoute = \"\"\n): Array<{\n method: string;\n route: string;\n importPath: string;\n}> {\n const routes: Array<{ method: string; route: string; importPath: string }> =\n [];\n\n if (!fs.existsSync(dir)) {\n return routes;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Convert [param] to :param for rou3 dynamic routes in directory names\n const convertedDirName = entry.name.replace(/\\[([^\\]]+)\\]/g, ':$1');\n const subRoute = baseRoute + \"/\" + convertedDirName;\n routes.push(...scanApiDirectory(fullPath, subRoute));\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(/\\.ts$/, \"\");\n let method = \"\";\n let routePath = baseRoute;\n\n if (fileName.includes(\".\")) {\n const parts = fileName.split(\".\");\n const methodPart = parts[parts.length - 1].toUpperCase();\n if ([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(methodPart)) {\n method = methodPart;\n const pathPart = parts.slice(0, -1).join(\".\");\n if (pathPart !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = pathPart.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n\n const importPath =\n \"./\" + path.relative(process.cwd(), fullPath).replace(/\\\\/g, \"/\");\n\n routes.push({\n method,\n route: routePath || \"/\",\n importPath,\n });\n }\n }\n\n return routes;\n } catch (error) {\n console.error(`Error scanning API directory ${dir}:`, error);\n return [];\n }\n}\n\n// Tools functionality\nfunction isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*[a-z0-9]$/.test(str) || /^[a-z]$/.test(str);\n}\n\nfunction validateToolFile(filePath: string, fileName: string): string | null {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const hasDefaultExport = /export\\s+default\\s+defineTool/.test(content);\n\n if (!hasDefaultExport) {\n return `Tool file '${fileName}.ts' must have a default export using defineTool()`;\n }\n\n return null;\n } catch (error) {\n return `Failed to read tool file '${fileName}.ts'`;\n }\n}\n\nasync function scanToolsDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const tools: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return tools;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n let toolError: string | undefined;\n\n const validationError = validateToolFile(filePath, fileName);\n\n if (validationError) {\n toolError = validationError;\n console.error(`\\n❌ Tool validation error: ${validationError}`);\n }\n\n if (!isSnakeCase(fileName)) {\n const warning = `Tool name should be in snake_case format (e.g., 'log_name', 'send_email')`;\n if (toolError) {\n toolError += ` | ${warning}`;\n } else {\n toolError = warning;\n }\n console.warn(\n `\\n⚠️ Tool naming warning: '${fileName}' should be in snake_case format (e.g., 'log_name', 'send_email')`\n );\n }\n\n tools.push({ name: fileName, importPath, error: toolError });\n }\n }\n\n return tools;\n}\n\nasync function scanHooksDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string }>> {\n const hooks: Array<{ name: string; importPath: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return hooks;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n\n // Skip index.ts - it's a utility module, not a hook\n if (fileName === \"index\") {\n continue;\n }\n\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n hooks.push({ name: fileName, importPath });\n }\n }\n\n return hooks;\n}\n\n/**\n * Scan a directory for config definitions (models, prompts, or agents).\n * Extracts the name from the defineX() call in each file.\n */\nasync function scanConfigDirectory(\n dir: string,\n definePattern: RegExp\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const items: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return items;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n // Check for default export with define function\n const hasDefaultExport = definePattern.test(content);\n if (!hasDefaultExport) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `File must have a default export using the define function`,\n });\n continue;\n }\n\n // Extract name from defineX({ name: 'xxx', ... })\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n items.push({ name: nameMatch[1], importPath });\n } else {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Could not extract name from definition`,\n });\n }\n } catch (error) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Failed to read file: ${error}`,\n });\n }\n }\n }\n\n return items;\n}\n\nasync function scanModelsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineModel/);\n}\n\nasync function scanPromptsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+definePrompt/);\n}\n\nasync function scanAgentsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineAgent/);\n}\n\n/**\n * Parse JSON body from an incoming HTTP request (Node.js IncomingMessage).\n * Used by dev-mode API handlers that intercept requests before they reach workerd.\n */\nfunction parseRequestBody(req: import('http').IncomingMessage): Promise<any> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch (e) {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\nexport interface AgentPluginOptions {\n mountPoint?: string;\n toolsDir?: string;\n hooksDir?: string;\n apiDir?: string;\n modelsDir?: string;\n promptsDir?: string;\n agentsDir?: string;\n}\n\nexport function agentbuilder(options: AgentPluginOptions = {}): Plugin {\n // Normalize mount point: ensure leading slash, no trailing slash\n let mountPoint = options.mountPoint || \"/agents\";\n if (!mountPoint.startsWith(\"/\")) {\n mountPoint = \"/\" + mountPoint;\n }\n if (mountPoint.endsWith(\"/\") && mountPoint.length > 1) {\n mountPoint = mountPoint.slice(0, -1);\n }\n\n const toolsDir = options.toolsDir\n ? path.resolve(process.cwd(), options.toolsDir)\n : path.resolve(process.cwd(), \"agents/tools\");\n const hooksDir = options.hooksDir\n ? path.resolve(process.cwd(), options.hooksDir)\n : path.resolve(process.cwd(), \"agents/hooks\");\n const threadApiDir = options.apiDir\n ? path.resolve(process.cwd(), options.apiDir)\n : path.resolve(process.cwd(), \"agents/api\");\n const modelsDir = options.modelsDir\n ? path.resolve(process.cwd(), options.modelsDir)\n : path.resolve(process.cwd(), \"agents/models\");\n const promptsDir = options.promptsDir\n ? path.resolve(process.cwd(), options.promptsDir)\n : path.resolve(process.cwd(), \"agents/prompts\");\n const agentsDir = options.agentsDir\n ? path.resolve(process.cwd(), options.agentsDir)\n : path.resolve(process.cwd(), \"agents/agents\");\n const outputDir = path.resolve(process.cwd(), \".agents\");\n\n // Type generation configuration\n const typeGenConfig = {\n modelsDir,\n promptsDir,\n agentsDir,\n toolsDir,\n outputDir,\n };\n\n // Helper to regenerate types\n function regenerateTypes() {\n if (needsRegeneration(typeGenConfig)) {\n generateTypes(typeGenConfig);\n }\n }\n\n // Read and prepare rou3 code for inlining\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const rou3Path = path.join(__dirname, '../dist/rou3.js');\n let rou3Code = '';\n try {\n rou3Code = fs.readFileSync(rou3Path, 'utf-8')\n // Remove export statement\n .replace(/^export \\{[^}]+\\};?\\s*$/gm, '')\n // Remove sourcemap comments\n .replace(/\\/\\/# sourceMappingURL=.+$/gm, '')\n .trim();\n } catch (err) {\n console.warn('[vite-plugin-agent] Could not read rou3.js for inlining:', err);\n }\n\n let routesVersion = Math.random().toString(36).substring(7);\n\n // Helper to dynamically find the worker environment (non-client environment)\n // The actual environment name comes from the user's wrangler.jsonc 'name' property\n // and is transformed to snake_case by the Cloudflare Vite plugin\n function getWorkerEnvironment(server: ViteDevServer) {\n const envNames = Object.keys(server.environments);\n // Find the first environment that's not 'client' (the default client environment)\n const workerEnvName = envNames.find(name => name !== 'client');\n\n if (!workerEnvName) {\n console.warn('[vite-plugin-agent] Could not find worker environment');\n return null;\n }\n\n return server.environments[workerEnvName];\n }\n\n // Helper functions for module reloading\n function reloadToolsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const toolsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_TOOLS_ID\n );\n if (toolsModule) {\n workerEnv.reloadModule(toolsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:tools-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadRoutesModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routesModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTES_ID\n );\n if (routesModule) {\n routesVersion = Math.random().toString(36).substring(7);\n workerEnv.reloadModule(routesModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:routes-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadHooksModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const hooksModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_HOOKS_ID\n );\n if (hooksModule) {\n workerEnv.reloadModule(hooksModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:hooks-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadModelsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const modelsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODELS_ID\n );\n if (modelsModule) {\n await workerEnv.reloadModule(modelsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:models-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadPromptsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const promptsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_PROMPTS_ID\n );\n if (promptsModule) {\n await workerEnv.reloadModule(promptsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:prompts-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadAgentsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const agentsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_AGENTS_ID\n );\n if (agentsModule) {\n await workerEnv.reloadModule(agentsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:agents-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadRouterModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routerModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTER_ID\n );\n if (routerModule) {\n await workerEnv.reloadModule(routerModule);\n return true;\n }\n return false;\n }\n\n function handleFileChange(\n file: string,\n server: ViteDevServer\n ) {\n const isToolFile = file.startsWith(toolsDir) && file.endsWith(\".ts\");\n const isThreadApiFile = file.startsWith(threadApiDir) && file.endsWith(\".ts\");\n const isHookFile = file.startsWith(hooksDir) && file.endsWith(\".ts\");\n const isModelFile = file.startsWith(modelsDir) && file.endsWith(\".ts\");\n const isPromptFile = file.startsWith(promptsDir) && file.endsWith(\".ts\");\n const isAgentFile = file.startsWith(agentsDir) && file.endsWith(\".ts\");\n\n const isConfigFile = isModelFile || isPromptFile || isAgentFile;\n\n if (!isToolFile && !isThreadApiFile && !isHookFile && !isConfigFile) return;\n\n // Regenerate types when config files change\n if (isConfigFile || isToolFile) {\n regenerateTypes();\n }\n\n if (isToolFile) {\n reloadToolsModule(server);\n }\n\n if (isModelFile) {\n reloadModelsModule(server);\n }\n\n if (isPromptFile) {\n reloadPromptsModule(server);\n }\n\n if (isAgentFile) {\n reloadAgentsModule(server);\n }\n\n if (isThreadApiFile) {\n reloadRoutesModule(server);\n }\n\n if (isHookFile) {\n reloadHooksModule(server);\n }\n }\n\n return {\n name: \"vite-plugin-agent\",\n enforce: \"pre\" as const,\n\n config() {\n // EXCLUDE our packages from pre-bundling - they contain cloudflare:workers\n // imports that can't be resolved during Vite's dependency optimization phase.\n // The Cloudflare Vite plugin handles these specially in the worker environment.\n const depsToExclude = [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ];\n\n return {\n optimizeDeps: {\n // Exclude our packages from pre-bundling - they contain cloudflare:workers imports\n // that cannot be resolved during dependency optimization\n exclude: depsToExclude,\n },\n ssr: {\n // noExternal ensures Vite transforms these instead of leaving as external\n // The Cloudflare plugin handles the actual bundling and knows about cloudflare:workers\n noExternal: [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ],\n },\n };\n },\n\n // Apply exclusions to ALL environments including Cloudflare worker\n configEnvironment(name, config) {\n const depsToExclude = [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ];\n\n // Ensure these are excluded from optimization in all environments\n config.optimizeDeps = config.optimizeDeps || {};\n config.optimizeDeps.exclude = [\n ...(config.optimizeDeps.exclude || []),\n ...depsToExclude.filter(dep => !config.optimizeDeps?.exclude?.includes(dep)),\n ];\n },\n\n resolveId(id) {\n if (id === VIRTUAL_TOOLS_ID) {\n return RESOLVED_VIRTUAL_TOOLS_ID;\n }\n if (id === VIRTUAL_ROUTES_ID || id === VIRTUAL_ROUTER_ID) {\n return RESOLVED_VIRTUAL_ROUTES_ID;\n }\n if (id === VIRTUAL_HOOKS_ID) {\n return RESOLVED_VIRTUAL_HOOKS_ID;\n }\n if (id === VIRTUAL_CONFIG_ID) {\n return RESOLVED_VIRTUAL_CONFIG_ID;\n }\n if (id === VIRTUAL_THREAD_API_ID) {\n return RESOLVED_VIRTUAL_THREAD_API_ID;\n }\n if (id === VIRTUAL_MODELS_ID) {\n return RESOLVED_VIRTUAL_MODELS_ID;\n }\n if (id === VIRTUAL_PROMPTS_ID) {\n return RESOLVED_VIRTUAL_PROMPTS_ID;\n }\n if (id === VIRTUAL_AGENTS_ID) {\n return RESOLVED_VIRTUAL_AGENTS_ID;\n }\n if (id === VIRTUAL_BUILDER_ID) {\n return RESOLVED_VIRTUAL_BUILDER_ID;\n }\n },\n\n async load(id) {\n\n if (id === RESOLVED_VIRTUAL_TOOLS_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n const moduleCode = `// Virtual agent tools module\nexport const tools = {\n${toolsCode}\n};`;\n return moduleCode;\n }\n\n if (id === RESOLVED_VIRTUAL_ROUTES_ID) {\n // Scan user thread API directory\n const threadRoutes = scanApiDirectory(threadApiDir);\n\n // Generate user thread route registration code\n const threadRouteCode = threadRoutes\n .map(({ method, route, importPath }) => {\n const apiRoute = `/api/threads/:id${route}`;\n return ` addRoute(\n router,\n \"${method}\",\n \"${apiRoute}\",\n /* v${routesVersion} */ async () => (await import(\"${importPath}\")).default\n );`;\n })\n .join('\\n');\n\n return `// Inline rou3 router code (no external imports)\n${rou3Code}\n\nimport { registerBuiltInRoutes } from \"@standardagents/builder/built-in-routes\";\nimport { config } from \"virtual:@standardagents-config\";\nimport { tools } from \"virtual:@standardagents-tools\";\nimport { hooks } from \"virtual:@standardagents-hooks\";\nimport { models, modelNames } from \"virtual:@standardagents-models\";\nimport { prompts, promptNames } from \"virtual:@standardagents-prompts\";\nimport { agents, agentNames } from \"virtual:@standardagents-agents\";\nimport { requireAuth } from \"@standardagents/builder/runtime\";\n\nconst MOUNT_POINT = \"${mountPoint}\";\n\n// Routes that don't require authentication\nconst PUBLIC_ROUTES = [\n '/api/auth/login',\n '/api/auth/config',\n '/api/auth/oauth/github',\n '/api/auth/oauth/google',\n '/api/auth/oauth/github/callback',\n '/api/auth/oauth/google/callback'\n];\n\n// Check if a route is public (no auth required)\nfunction isPublicRoute(routePath) {\n // Exact match for auth routes\n if (PUBLIC_ROUTES.includes(routePath)) {\n return true;\n }\n\n // Thread routes are always public\n if (routePath.startsWith('/api/threads/') || routePath === '/api/threads') {\n return true;\n }\n\n return false;\n}\n\nexport async function router(request, env) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Check if request is under mount point\n if (!pathname.startsWith(MOUNT_POINT)) {\n return null;\n }\n\n // Strip mount point prefix for route matching, ensuring we keep the leading slash\n let routePath = pathname.slice(MOUNT_POINT.length) || \"/\";\n if (!routePath.startsWith('/')) {\n routePath = '/' + routePath;\n }\n\n // Handle API routes\n const router = createRouter();\n\n // Register built-in API routes with runtime data\n registerBuiltInRoutes(router, { config, tools, models, modelNames, prompts, promptNames, agents, agentNames });\n\n // Register user thread API routes\n${threadRouteCode}\n\n const routeMatch = findRoute(\n router,\n request.method.toUpperCase(),\n routePath\n );\n\n if (routeMatch) {\n // Check if authentication is required for this route\n const publicRoute = isPublicRoute(routePath);\n const isApiRoute = routePath.startsWith('/api/');\n\n let authContext = null;\n\n // Require authentication for all API routes except public ones\n if (isApiRoute && !publicRoute) {\n const authResult = await requireAuth(request, env);\n\n // If requireAuth returns a Response, it's an error (401)\n if (authResult instanceof Response) {\n return authResult;\n }\n\n authContext = authResult;\n }\n\n const controller = await routeMatch.data();\n const context = {\n req: request,\n params: routeMatch.params || {},\n env: env,\n url: url,\n config,\n tools,\n auth: authContext, // Add auth context to controller context\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // Serve UI for all other routes (SPA fallback)\n return serveUI(routePath, env);\n}\n\nasync function serveUI(pathname, env) {\n try {\n // Use Cloudflare Workers Assets binding (automatically created from wrangler assets config)\n if (env.ASSETS) {\n try {\n // Create a proper request for the asset path\n // Use a dummy origin since we only care about the path\n // Re-add mount point since pathname was stripped by router\n const assetUrl = \\`http://localhost\\${MOUNT_POINT}\\${pathname}\\`;\n let response = await env.ASSETS.fetch(assetUrl);\n\n // If not found, fall back to index.html for SPA routing\n const isIndexHtml = response.status === 404 || pathname === \"/\" || !pathname.includes(\".\");\n if (isIndexHtml) {\n response = await env.ASSETS.fetch(\\`http://localhost\\${MOUNT_POINT}/index.html\\`);\n\n // Transform HTML to use configured mount point\n if (response.status === 200) {\n const html = await response.text();\n // Replace default /agents/ paths with configured mount point\n const modifiedHtml = html.replace(/\\\\/agents\\\\//g, \\`\\${MOUNT_POINT}/\\`);\n return new Response(modifiedHtml, {\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n },\n });\n }\n }\n\n return response;\n } catch (assetError) {\n console.error(\"Error fetching from ASSETS:\", assetError);\n }\n }\n\n // Fallback: proxy to UI dev server if explicitly configured\n if (env.UI_DEV_SERVER) {\n const assetPath = pathname === \"/\" ? \"/index.html\" : pathname;\n const response = await fetch(\\`\\${env.UI_DEV_SERVER}\\${assetPath}\\`);\n return response;\n }\n\n // In production/dev, assets should be served by Cloudflare Workers automatically\n // This function only handles fallback cases\n return null;\n } catch (error) {\n console.error(\"Error serving UI:\", error);\n return null;\n }\n}\n\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_HOOKS_ID) {\n const hooks = await scanHooksDirectory(hooksDir);\n\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n return `// Virtual agent hooks module\nexport const hooks = {\n${hooksCode}\n};`;\n }\n\n if (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n // Get relative paths from cwd\n const relativeToolsDir = path.relative(process.cwd(), toolsDir).replace(/\\\\/g, \"/\");\n const relativeHooksDir = path.relative(process.cwd(), hooksDir).replace(/\\\\/g, \"/\");\n const relativeApiDir = path.relative(process.cwd(), threadApiDir).replace(/\\\\/g, \"/\");\n const relativeModelsDir = path.relative(process.cwd(), modelsDir).replace(/\\\\/g, \"/\");\n const relativePromptsDir = path.relative(process.cwd(), promptsDir).replace(/\\\\/g, \"/\");\n const relativeAgentsDir = path.relative(process.cwd(), agentsDir).replace(/\\\\/g, \"/\");\n\n return `// Virtual agent config module\nexport const config = {\n toolsDir: \"${relativeToolsDir}\",\n hooksDir: \"${relativeHooksDir}\",\n apiDir: \"${relativeApiDir}\",\n modelsDir: \"${relativeModelsDir}\",\n promptsDir: \"${relativePromptsDir}\",\n agentsDir: \"${relativeAgentsDir}\",\n mountPoint: \"${mountPoint}\",\n};`;\n }\n\n // Virtual modules for models, prompts, and agents\n if (id === RESOLVED_VIRTUAL_MODELS_ID) {\n const models = await scanModelsDirectory(modelsDir);\n\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent models module\nexport const models = {\n${modelsCode}\n};\n\nexport const modelNames = ${JSON.stringify(models.filter(m => !m.error).map(m => m.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_PROMPTS_ID) {\n const prompts = await scanPromptsDirectory(promptsDir);\n\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent prompts module\nexport const prompts = {\n${promptsCode}\n};\n\nexport const promptNames = ${JSON.stringify(prompts.filter(p => !p.error).map(p => p.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_AGENTS_ID) {\n const agents = await scanAgentsDirectory(agentsDir);\n\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent agents module\nexport const agents = {\n${agentsCode}\n};\n\nexport const agentNames = ${JSON.stringify(agents.filter(a => !a.error).map(a => a.name))};\n`;\n }\n\n // Consolidated virtual module: virtual:@standardagents/builder\n // Exports DurableThread and DurableAgentBuilder classes with methods already implemented\n if (id === RESOLVED_VIRTUAL_BUILDER_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n const hooks = await scanHooksDirectory(hooksDir);\n const models = await scanModelsDirectory(modelsDir);\n const prompts = await scanPromptsDirectory(promptsDir);\n const agents = await scanAgentsDirectory(agentsDir);\n\n // Helper to convert relative paths to absolute paths\n // Virtual modules need absolute paths since relative paths are resolved against the virtual module location\n const toAbsolutePath = (relativePath: string) => {\n if (relativePath.startsWith('./')) {\n return path.resolve(process.cwd(), relativePath).replace(/\\\\/g, '/');\n }\n return relativePath;\n };\n\n // Generate tools code\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate hooks code\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n const absPath = toAbsolutePath(importPath);\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n // Generate models code\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate prompts code\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate agents code\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Consolidated virtual module: virtual:@standardagents/builder\n// Provides DurableThread, DurableAgentBuilder, and router\nimport { DurableThread as _BaseDurableThread } from '@standardagents/builder/runtime';\nimport { DurableAgentBuilder as _BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n\n// Re-export router from virtual:@standardagents-routes\nexport { router } from 'virtual:@standardagents-routes';\n\n// Registry objects\nconst _tools = {\n${toolsCode}\n};\n\nconst _hooks = {\n${hooksCode}\n};\n\nconst _models = {\n${modelsCode}\n};\n\nconst _prompts = {\n${promptsCode}\n};\n\nconst _agents = {\n${agentsCode}\n};\n\n/**\n * DurableThread with all virtual module methods already implemented.\n * Simply extend this class in your agents/Thread.ts file.\n */\nexport class DurableThread extends _BaseDurableThread {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n\n/**\n * DurableAgentBuilder with all virtual module methods already implemented.\n * Simply extend this class in your agents/AgentBuilder.ts file.\n */\nexport class DurableAgentBuilder extends _BaseDurableAgentBuilder {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n`;\n }\n },\n\n buildStart() {\n // Generate types on startup\n regenerateTypes();\n\n // Watch all directories\n this.addWatchFile(toolsDir);\n this.addWatchFile(threadApiDir);\n this.addWatchFile(hooksDir);\n this.addWatchFile(modelsDir);\n this.addWatchFile(promptsDir);\n this.addWatchFile(agentsDir);\n },\n\n configureServer(server) {\n // Watch for new files being added\n server.watcher.on(\"add\", async (file) => {\n handleFileChange(file, server);\n });\n\n // Watch for files being deleted\n server.watcher.on(\"unlink\", (file) => {\n handleFileChange(file, server);\n });\n\n // Add middleware to serve AgentBuilder UI\n // This emulates how Cloudflare Workers Assets binding works in production\n server.middlewares.use(async (req, res, next) => {\n const url = req.url;\n\n // Check if request is under mount point\n if (!url || !url.startsWith(mountPoint)) {\n next();\n return;\n }\n\n // Strip mount point prefix, ensuring we keep the leading slash\n let pathWithoutMount = url.slice(mountPoint.length) || '/';\n if (!pathWithoutMount.startsWith('/')) {\n pathWithoutMount = '/' + pathWithoutMount;\n }\n\n // Handle dev-only API routes that require filesystem access\n // These endpoints write to the filesystem and must be handled in Node.js\n const method = req.method?.toUpperCase();\n\n // GET /api/models - List all models (handled here to read fresh from filesystem)\n if (pathWithoutMount === '/api/models' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const modelList = files.map((file: string) => {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getProvider = (c: string) => c.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getInputPrice = (c: string) => {\n const match = c.match(/inputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getOutputPrice = (c: string) => {\n const match = c.match(/outputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getCachedPrice = (c: string) => {\n const match = c.match(/cachedPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getIncludedProviders = (c: string) => {\n const match = c.match(/includedProviders:\\s*\\[([^\\]]*)\\]/);\n if (!match) return undefined;\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getFallbacks = (c: string) => {\n const match = c.match(/fallbacks:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const fallbacks = getFallbacks(content);\n const fallbackObjects = fallbacks.map((fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n }));\n\n return {\n id: name,\n name: name,\n provider: getProvider(content),\n model: getModel(content),\n input_price: getInputPrice(content),\n output_price: getOutputPrice(content),\n cached_price: getCachedPrice(content),\n included_providers: getIncludedProviders(content),\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading model ${file}:`, error);\n return null;\n }\n });\n\n const validModels = modelList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ models: validModels }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list models' }));\n return;\n }\n }\n\n // POST /api/models - Create a new model\n if (pathWithoutMount === '/api/models' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n const validationError = validateModelData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if model already exists\n if (modelExists(modelsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveModel(modelsDir, body, false);\n\n if (result.success) {\n // Reload the models virtual module to reflect the new model\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create model' }));\n return;\n }\n }\n\n // PUT /api/models/:name - Update an existing model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelPutMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelPutMatch && method === 'PUT') {\n try {\n const urlModelName = decodeURIComponent(modelPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlModelName;\n\n const validationError = validateModelData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n\n if (isNameChange) {\n // Rename the model file first\n const renameResult = await renameModel(modelsDir, urlModelName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update model references in all prompts\n updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);\n }\n\n // Save the updated model data\n const result = await saveModel(modelsDir, body, true);\n\n if (result.success) {\n // Reload the models virtual module to reflect the changes\n await reloadModelsModule(server);\n\n // If prompts were updated due to cascade, reload prompts module too\n if (updatedPrompts.length > 0) {\n await reloadPromptsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n // Small delay to ensure filesystem operations are fully flushed\n await new Promise(resolve => setTimeout(resolve, 100));\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlModelName, to: newName }, updatedPrompts }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update model' }));\n return;\n }\n }\n\n // DELETE /api/models/:name - Delete a model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelDeleteMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelDeleteMatch && method === 'DELETE') {\n try {\n const modelName = decodeURIComponent(modelDeleteMatch[1]);\n const result = await deleteModel(modelsDir, modelName);\n\n if (result.success) {\n // Reload the models virtual module to reflect the deletion\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: modelName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete model' }));\n return;\n }\n }\n\n // GET /api/prompts - List all prompts (read fresh from filesystem)\n if (pathWithoutMount === '/api/prompts' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(promptsDir)\n ? fs.readdirSync(promptsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n // Load models for lookup\n const modelFiles = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n const modelMap: Record<string, { name: string; provider: string }> = {};\n for (const file of modelFiles) {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n const name = content.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const provider = content.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n if (name) {\n modelMap[name] = { name, provider: provider || 'unknown' };\n }\n } catch (error) {\n // Skip failed models\n }\n }\n\n const promptList = files.map((file: string) => {\n try {\n const filePath = path.join(promptsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getToolDescription = (c: string) => c.match(/toolDescription:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getIncludeChat = (c: string) => c.match(/includeChat:\\s*(true|false)/)?.[1] === 'true';\n const getIncludePastTools = (c: string) => c.match(/includePastTools:\\s*(true|false)/)?.[1] === 'true';\n const getParallelToolCalls = (c: string) => c.match(/parallelToolCalls:\\s*(true|false)/)?.[1] === 'true';\n const getToolChoice = (c: string) => c.match(/toolChoice:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getBeforeTool = (c: string) => c.match(/beforeTool:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getAfterTool = (c: string) => c.match(/afterTool:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTools = (c: string) => {\n const match = c.match(/tools:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getHandoffAgents = (c: string) => {\n const match = c.match(/handoffAgents:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n // Extract prompt content - handle multi-line backtick strings\n const getPrompt = (c: string) => {\n // Try backtick string first (can be multi-line)\n const backtickMatch = c.match(/prompt:\\s*`([\\s\\S]*?)`/);\n if (backtickMatch) return backtickMatch[1];\n // Try single/double quoted string\n const quotedMatch = c.match(/prompt:\\s*['\"]([^'\"]*)['\"]/);\n if (quotedMatch) return quotedMatch[1];\n // Try array literal (StructuredPrompt)\n const arrayMatch = c.match(/prompt:\\s*(\\[[\\s\\S]*?\\])/);\n if (arrayMatch) return arrayMatch[1];\n return '';\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const modelId = getModel(content);\n const modelDef = modelId ? modelMap[modelId] : null;\n\n return {\n id: name,\n name: name,\n tool_description: getToolDescription(content) || '',\n prompt: getPrompt(content),\n required_schema: null, // Complex to parse, skip for now\n model_id: modelId || '',\n model_name: modelDef?.name || modelId || '',\n model_provider: modelDef?.provider || 'unknown',\n include_chat: getIncludeChat(content),\n include_past_tools: getIncludePastTools(content),\n parallel_tool_calls: getParallelToolCalls(content),\n tool_choice: getToolChoice(content) || 'auto',\n before_tool: getBeforeTool(content) || null,\n after_tool: getAfterTool(content) || null,\n tools: getTools(content),\n prompts: getHandoffAgents(content),\n reasoning: null, // Complex to parse\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading prompt ${file}:`, error);\n return null;\n }\n });\n\n const validPrompts = promptList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ prompts: validPrompts }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list prompts' }));\n return;\n }\n }\n\n // POST /api/prompts - Create a new prompt\n if (pathWithoutMount === '/api/prompts' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n const validationError = validatePromptData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if prompt already exists\n if (promptExists(promptsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Prompt '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await savePrompt(promptsDir, body, false);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the new prompt\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create prompt' }));\n return;\n }\n }\n\n // PUT /api/prompts/:name - Update an existing prompt\n const promptPutMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptPutMatch && method === 'PUT') {\n try {\n const urlPromptName = decodeURIComponent(promptPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlPromptName;\n\n const validationError = validatePromptData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n let updatedAgents: string[] = [];\n\n if (isNameChange) {\n // Rename the prompt file first\n const renameResult = await renamePrompt(promptsDir, urlPromptName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update prompt references in other prompts (tools array)\n updatedPrompts = await updatePromptReferencesInPrompts(promptsDir, urlPromptName, newName);\n\n // Cascade update: update prompt references in agents (defaultPrompt field)\n updatedAgents = await updatePromptReferencesInAgents(agentsDir, urlPromptName, newName);\n }\n\n // Save the updated prompt data (will overwrite the renamed file)\n const result = await savePrompt(promptsDir, body, true);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the changes\n await reloadPromptsModule(server);\n\n // If agents were updated due to cascade, reload agents module too\n if (updatedAgents.length > 0) {\n await reloadAgentsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlPromptName, to: newName }, updatedPrompts, updatedAgents }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update prompt' }));\n return;\n }\n }\n\n // DELETE /api/prompts/:name - Delete a prompt\n const promptDeleteMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptDeleteMatch && method === 'DELETE') {\n try {\n const promptName = decodeURIComponent(promptDeleteMatch[1]);\n const result = await deletePrompt(promptsDir, promptName);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the deletion\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: promptName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete prompt' }));\n return;\n }\n }\n\n // GET /api/agents - List all agents (read fresh from filesystem)\n if (pathWithoutMount === '/api/agents' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(agentsDir)\n ? fs.readdirSync(agentsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const agentList = files.map((file: string) => {\n try {\n const filePath = path.join(agentsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTitle = (c: string) => c.match(/title:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getType = (c: string) => c.match(/type:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getDefaultPrompt = (c: string) => c.match(/defaultPrompt:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getDefaultModel = (c: string) => c.match(/defaultModel:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTools = (c: string) => {\n const match = c.match(/tools:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n return {\n id: name,\n name: name,\n title: getTitle(content) || name,\n type: getType(content) || 'ai_human',\n default_prompt: getDefaultPrompt(content) || '',\n default_model: getDefaultModel(content) || '',\n tools: getTools(content),\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading agent ${file}:`, error);\n return null;\n }\n });\n\n const validAgents = agentList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ agents: validAgents }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list agents' }));\n return;\n }\n }\n\n // POST /api/agents - Create a new agent\n if (pathWithoutMount === '/api/agents' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n const validationError = validateAgentData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if agent already exists\n if (agentExists(agentsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Agent '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveAgent(agentsDir, body, false);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the new agent\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create agent' }));\n return;\n }\n }\n\n // PUT /api/agents/:name - Update an existing agent\n const agentPutMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentPutMatch && method === 'PUT') {\n try {\n const agentName = decodeURIComponent(agentPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n\n // Ensure the name in the body matches the URL (or use URL name)\n body.name = agentName;\n\n const validationError = validateAgentData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // For updates, the agent should exist (but we allow overwrite)\n const result = await saveAgent(agentsDir, body, true);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the changes\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update agent' }));\n return;\n }\n }\n\n // DELETE /api/agents/:name - Delete an agent\n const agentDeleteMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentDeleteMatch && method === 'DELETE') {\n try {\n const agentName = decodeURIComponent(agentDeleteMatch[1]);\n const result = await deleteAgent(agentsDir, agentName);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the deletion\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: agentName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete agent' }));\n return;\n }\n }\n\n // Let other API routes pass through to the worker\n if (pathWithoutMount.startsWith('/api/')) {\n next();\n return;\n }\n\n // Check for UI dev server proxy mode (for HMR during development)\n // Only proxy non-API routes (UI assets, SPA routes)\n const uiDevServer = process.env.UI_DEV_SERVER;\n if (uiDevServer && !pathWithoutMount.startsWith('/api/')) {\n // In HMR mode, proxy UI requests to the Vite dev server\n // pathWithoutMount already has leading slash (e.g., '/index.html')\n // UI dev server runs with VITE_BASE matching our mountPoint\n const targetUrl = `${uiDevServer}${pathWithoutMount}`;\n try {\n const proxyRes = await fetch(targetUrl);\n res.statusCode = proxyRes.status;\n\n // Forward response headers (except those that shouldn't be forwarded)\n proxyRes.headers.forEach((value, key) => {\n if (!['content-encoding', 'transfer-encoding'].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n const body = await proxyRes.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n } catch (error) {\n console.error('[agentbuilder] Failed to proxy to UI dev server:', error);\n // Fall through to static file serving as fallback\n }\n }\n\n // Check if this is a static asset request\n const isStaticAsset = pathWithoutMount.startsWith('/assets/') ||\n pathWithoutMount.startsWith('/vendor.js') ||\n pathWithoutMount.startsWith('/vue.js') ||\n pathWithoutMount.startsWith('/monaco.js') ||\n pathWithoutMount.startsWith('/index.js') ||\n pathWithoutMount.startsWith('/index.css') ||\n pathWithoutMount.match(/\\.(js|css|png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/);\n\n // For static assets, serve the actual file\n // For all other routes (including SPA routes like /login, /threads, etc.), serve index.html\n const shouldServeUI = true;\n\n if (shouldServeUI) {\n // Serve from the built client directory\n // Client is always at dist/client relative to package root\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n let filePath: string;\n if (isStaticAsset) {\n // For static assets, serve the actual file\n const cleanUrl = pathWithoutMount.split('?')[0];\n filePath = path.join(clientDir, cleanUrl);\n } else {\n // For all other routes (SPA routes), serve index.html\n filePath = path.join(clientDir, 'index.html');\n }\n\n try {\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath);\n\n // Inject mount point config into HTML\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n // Set appropriate MIME type\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.ttf': 'font/ttf',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n };\n\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n res.setHeader('Content-Type', contentType);\n res.end(content);\n return;\n }\n } catch (error) {\n console.error('Error serving AgentBuilder UI:', error);\n }\n }\n\n next();\n });\n },\n\n handleHotUpdate({ file, server }) {\n handleFileChange(file, server);\n },\n\n writeBundle(options, bundle) {\n // In production build, copy client files to user's dist directory\n // Files go to dist/client/{mountPath} to match ASSETS binding expectations\n const outDir = options.dir || 'dist';\n // Put client files in a 'client' subdirectory, preserving mountPath structure\n // This ensures ASSETS can find files at the expected paths (e.g., /agentbuilder/index.html)\n const mountPath = mountPoint.slice(1); // \"agentbuilder\" or \"\"\n const mountDir = mountPath\n ? path.join(outDir, '../client', mountPath) // dist/client/agentbuilder\n : path.join(outDir, '../client'); // dist/client\n\n // Locate the client directory\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n if (!fs.existsSync(clientDir)) {\n console.warn(`[agentbuilder] Client directory not found at ${clientDir}`);\n return;\n }\n\n // Create mount directory\n fs.mkdirSync(mountDir, { recursive: true });\n\n // Copy all client files recursively\n function copyRecursive(src: string, dest: string) {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyRecursive(srcPath, destPath);\n } else {\n let content = fs.readFileSync(srcPath);\n\n // Inject mount point config into index.html\n if (entry.name === 'index.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n fs.writeFileSync(destPath, content);\n }\n }\n }\n\n copyRecursive(clientDir, mountDir);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdk/generateTypes.ts","../src/sdk/generators/generateModelFile.ts","../src/sdk/generators/jsonSchemaToZod.ts","../src/sdk/generators/generatePromptFile.ts","../src/sdk/generators/generateAgentFile.ts","../src/sdk/persistence/index.ts","../src/plugin.ts"],"names":["fs","path","escapeString","options"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"plugin.js","sourcesContent":["/**\n * Type generation module for AgentBuilder.\n *\n * Generates TypeScript declaration files that provide compile-time\n * type safety for model, prompt, agent, and tool references.\n *\n * @module\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Configuration for directory scanning.\n */\nexport interface DirectoryConfig {\n modelsDir: string;\n promptsDir: string;\n agentsDir: string;\n toolsDir: string;\n outputDir: string;\n}\n\n/**\n * Content of the generated tsconfig.json for the .agents directory.\n */\nconst TSCONFIG_CONTENT = `{\n \"compilerOptions\": {\n \"composite\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"moduleResolution\": \"bundler\",\n \"module\": \"ESNext\",\n \"target\": \"ESNext\"\n },\n \"include\": [\"types.d.ts\", \"virtual-module.d.ts\"]\n}\n`;\n\n/**\n * Scan a directory for TypeScript files and extract the definition names.\n *\n * This function reads each .ts file and extracts the `name` property from\n * the defineX() call. It uses a simple regex pattern to avoid full parsing.\n *\n * @param dir - Directory to scan\n * @param useFilename - If true, use filename as the name (for tools that don't have name property)\n * @returns Array of definition names found\n */\nexport function scanForNames(dir: string, useFilename: boolean = false): string[] {\n const names: string[] = [];\n\n if (!fs.existsSync(dir)) {\n return names;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n if (useFilename) {\n // For tools: use the filename (without extension) as the tool name\n // Convert underscores to match convention (e.g., my_tool.ts -> my_tool)\n const toolName = entry.name.replace(/\\.ts$/, '');\n // Verify the file actually exports a tool (contains defineTool)\n if (content.includes('defineTool')) {\n names.push(toolName);\n }\n } else {\n // Extract name from defineX({ name: 'xxx', ... })\n // Matches: name: 'xxx' or name: \"xxx\"\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n names.push(nameMatch[1]);\n }\n }\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dir}:`, error);\n }\n\n return names;\n}\n\n/**\n * Generate interface properties from an array of string names.\n * Each name becomes a property with value `true`.\n *\n * @param names - Array of string names\n * @returns TypeScript interface properties string\n */\nfunction generateRegistryProperties(names: string[]): string {\n if (names.length === 0) {\n return '';\n }\n\n return names.map((n) => `'${n}': true;`).join('\\n ');\n}\n\n/**\n * Generate the types.d.ts content for the .agents directory.\n *\n * This generates a namespace augmentation that overrides the default `string`\n * types in the AgentBuilder namespace with specific union types based on\n * the user's defined models, prompts, agents, and tools.\n *\n * @param config - Directory configuration\n * @returns The generated TypeScript declaration content\n */\nexport function generateTypesContent(config: DirectoryConfig): string {\n const models = scanForNames(config.modelsDir);\n const prompts = scanForNames(config.promptsDir);\n const agents = scanForNames(config.agentsDir);\n // Tools use filename as name since defineTool doesn't have a name property\n const tools = scanForNames(config.toolsDir, true);\n\n // Generate the callables union from all three sources\n const callables = [...prompts, ...agents, ...tools];\n\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n// Generated at: ${new Date().toISOString()}\n//\n// This file augments the AgentBuilder namespace declared in @standardagents/builder\n// to provide type-safe references for your models, prompts, agents, and tools.\n\n/**\n * Augment the global AgentBuilder namespace with your project's specific types.\n * This provides autocomplete and type checking for model, prompt, agent, and tool references.\n *\n * Uses interface declaration merging with property keys to create union types.\n * Example: interface ModelRegistry { 'gpt-4o': true; } gives type Models = 'gpt-4o'\n */\ndeclare global {\n namespace AgentBuilder {\n /** Model names from agents/models/ */\n interface ModelRegistry {\n ${generateRegistryProperties(models)}\n }\n\n /** Prompt names from agents/prompts/ */\n interface PromptRegistry {\n ${generateRegistryProperties(prompts)}\n }\n\n /** Agent names from agents/agents/ */\n interface AgentRegistry {\n ${generateRegistryProperties(agents)}\n }\n\n /** Tool names from agents/tools/ */\n interface ToolRegistry {\n ${generateRegistryProperties(tools)}\n }\n\n /** All callable items (prompts, agents, tools) that can be used as tools */\n interface CallableRegistry {\n ${generateRegistryProperties(callables)}\n }\n }\n}\n\n// This export is required for TypeScript to treat this as a module\n// and allow the declare global to work properly\nexport {};\n`;\n}\n\n/**\n * Generate the virtual-module.d.ts content for the .agents directory.\n *\n * This provides type declarations for the virtual:@standardagents/builder module.\n * It must be in a separate file (without export {}) to work as an ambient module declaration.\n *\n * @returns The generated TypeScript declaration content\n */\nexport function generateVirtualModuleContent(): string {\n return `// Auto-generated by @standardagents/builder - DO NOT EDIT\n//\n// Type declarations for the virtual:@standardagents/builder module.\n// This file must NOT have any exports to work as an ambient module declaration.\n\n/**\n * Type declarations for the consolidated virtual module.\n * This module provides DurableThread and DurableAgentBuilder classes\n * with all virtual module methods (tools, hooks, models, prompts, agents)\n * already implemented, plus the router function.\n */\ndeclare module 'virtual:@standardagents/builder' {\n import type { DurableThread as BaseDurableThread } from '@standardagents/builder/runtime';\n import type { DurableAgentBuilder as BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n // ============================================================\n // Message Types\n // ============================================================\n\n export interface ThreadMessage {\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: 'success' | 'error' | null;\n log_id: string | null;\n created_at: number;\n silent: boolean;\n parent_id: string | null;\n depth: number;\n status: 'pending' | 'completed' | 'failed' | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n }\n\n export interface GetMessagesResult {\n messages: ThreadMessage[];\n total: number;\n hasMore: boolean;\n }\n\n // ============================================================\n // Log Types\n // ============================================================\n\n export interface ThreadLog {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: boolean;\n created_at: number;\n request_body: string | null;\n }\n\n export interface GetLogsResult {\n logs: ThreadLog[];\n total: number;\n hasMore: boolean;\n }\n\n export interface ThreadLogDetails extends ThreadLog {\n endpoint: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n tools_schema: string | null;\n message_history: string | null;\n system_prompt: string | null;\n errors: string | null;\n tool_results: string | null;\n }\n\n // ============================================================\n // Thread Metadata Types\n // ============================================================\n\n export interface ThreadMetaResult {\n thread: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n agent: {\n id: string;\n title: string;\n type: string;\n side_a_label?: string;\n side_b_label?: string;\n } | null;\n stats: {\n message_count: number;\n log_count: number;\n };\n }\n\n // ============================================================\n // DurableThread Class\n // ============================================================\n\n /**\n * DurableThread with all virtual module methods pre-implemented.\n * Extend this class in your agents/Thread.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * \\`\\`\\`\n */\n export class DurableThread extends BaseDurableThread {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Execution methods\n execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response>;\n sendMessage(\n threadId: string,\n content: string,\n role?: string\n ): Promise<Response>;\n stop(): Promise<Response>;\n shouldStop(): Promise<boolean>;\n\n // Message methods\n getMessages(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC',\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<GetMessagesResult>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n }>;\n }): Promise<{ success: boolean; count?: number; error?: string }>;\n\n // Log methods\n getLogs(\n limit?: number,\n offset?: number,\n order?: 'ASC' | 'DESC'\n ): Promise<GetLogsResult>;\n getLogDetails(logId: string): Promise<ThreadLogDetails>;\n\n // Thread management methods\n getThreadMeta(threadId: string): Promise<ThreadMetaResult>;\n updateThreadMeta(\n threadId: string,\n params: UpdateThreadParams\n ): Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n deleteThread(): Promise<{ success: boolean; message: string }>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // DurableAgentBuilder Types\n // ============================================================\n\n export interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n }\n\n export interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n\n export interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }\n\n export interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n }\n\n // ============================================================\n // DurableAgentBuilder Class\n // ============================================================\n\n /**\n * DurableAgentBuilder with all virtual module methods pre-implemented.\n * Extend this class in your agents/AgentBuilder.ts file.\n *\n * @example\n * \\`\\`\\`typescript\n * import { DurableAgentBuilder } from 'virtual:@standardagents/builder'\n *\n * export class AgentBuilder extends DurableAgentBuilder {}\n * \\`\\`\\`\n */\n export class DurableAgentBuilder extends BaseDurableAgentBuilder {\n // Virtual module registry methods\n tools(): Record<string, () => Promise<any>>;\n hooks(): Record<string, () => Promise<any>>;\n models(): Record<string, () => Promise<any>>;\n prompts(): Record<string, () => Promise<any>>;\n agents(): Record<string, () => Promise<any>>;\n\n // Lookup methods\n loadModel(name: string): Promise<any>;\n getModelNames(): string[];\n loadPrompt(name: string): Promise<any>;\n getPromptNames(): string[];\n loadAgent(name: string): Promise<any>;\n getAgentNames(): string[];\n\n // Thread registry methods\n createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n }): Promise<ThreadRegistryEntry>;\n getThread(id: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(id: string): Promise<boolean>;\n updateThreadAgent(id: string, agent_name: string): Promise<boolean>;\n updateThread(id: string, params: UpdateThreadParams): Promise<ThreadRegistryEntry | null>;\n getThreadStub(threadId: string): DurableObjectStub;\n\n // Provider methods\n getProvider(name: string): Promise<Provider | null>;\n setProvider(provider: Provider): Promise<void>;\n listProviders(): Promise<Provider[]>;\n deleteProvider(name: string): Promise<boolean>;\n\n // User methods\n getUserByUsername(username: string): Promise<User | null>;\n getUserById(id: string): Promise<User | null>;\n createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User>;\n hasUsers(): Promise<boolean>;\n listUsers(): Promise<Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>>;\n updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null>;\n deleteUser(id: string): Promise<boolean>;\n\n // Session methods\n createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string>;\n validateSession(tokenHash: string): Promise<{ user_id: string; expires_at: number } | null>;\n cleanupSessions(): Promise<number>;\n deleteSession(tokenHash: string): Promise<void>;\n\n // API key methods\n createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string>;\n validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null>;\n listApiKeys(userId: string): Promise<Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>>;\n deleteApiKey(id: string, userId: string): Promise<boolean>;\n\n // OAuth methods\n linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void>;\n findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null>;\n\n // Edit lock methods (for GitHub integration)\n acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean>;\n releaseEditLock(lockedBy: string): Promise<boolean>;\n getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>;\n setPendingChanges(changes: string): Promise<void>;\n\n // WebSocket/fetch handler\n fetch(request: Request): Promise<Response>;\n }\n\n // ============================================================\n // Router Function\n // ============================================================\n\n /**\n * Main router function for handling incoming requests.\n * Routes requests to the appropriate API endpoint or serves the UI.\n *\n * @example\n * \\`\\`\\`typescript\n * import { router } from 'virtual:@standardagents/builder'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const response = await router(request, env);\n * return response ?? new Response('Not Found', { status: 404 });\n * }\n * }\n * \\`\\`\\`\n */\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n}\n\n/**\n * Legacy alias for the router module.\n * @deprecated Use \\`import { router } from 'virtual:@standardagents/builder'\\` instead.\n */\ndeclare module 'virtual:@standardagents/router' {\n import type { ThreadEnv } from '@standardagents/builder/runtime';\n\n export function router<Env extends ThreadEnv = ThreadEnv>(\n request: Request,\n env: Env\n ): Promise<Response | null>;\n\n export { DurableThread } from 'virtual:@standardagents/builder';\n}\n`;\n}\n\n/**\n * Ensure a directory exists, creating it if necessary.\n *\n * @param dir - Directory path to ensure exists\n */\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Generate the .agents directory with type declarations.\n *\n * Creates or updates:\n * - .agents/types.d.ts - Type declarations for all definitions (with export {})\n * - .agents/virtual-module.d.ts - Virtual module declarations (ambient, no export)\n * - .agents/tsconfig.json - TypeScript configuration\n * - .agents/.gitignore - Ignore all generated files\n *\n * @param config - Directory configuration\n */\nexport function generateTypes(config: DirectoryConfig): void {\n ensureDir(config.outputDir);\n\n // Generate types.d.ts (global namespace augmentation - needs export {})\n const typesContent = generateTypesContent(config);\n fs.writeFileSync(path.join(config.outputDir, 'types.d.ts'), typesContent);\n\n // Generate virtual-module.d.ts (ambient module declaration - no export)\n const virtualModuleContent = generateVirtualModuleContent();\n fs.writeFileSync(path.join(config.outputDir, 'virtual-module.d.ts'), virtualModuleContent);\n\n // Generate tsconfig.json\n fs.writeFileSync(path.join(config.outputDir, 'tsconfig.json'), TSCONFIG_CONTENT);\n\n // Generate .gitignore to ignore all generated files\n fs.writeFileSync(path.join(config.outputDir, '.gitignore'), '*\\n');\n}\n\n/**\n * Check if type generation is needed based on file modification times.\n *\n * @param config - Directory configuration\n * @returns True if types need regeneration\n */\nexport function needsRegeneration(config: DirectoryConfig): boolean {\n const typesPath = path.join(config.outputDir, 'types.d.ts');\n\n // If types file doesn't exist, we need to generate\n if (!fs.existsSync(typesPath)) {\n return true;\n }\n\n const typesMtime = fs.statSync(typesPath).mtime;\n\n // Check if any source directory has newer files\n const dirs = [config.modelsDir, config.promptsDir, config.agentsDir, config.toolsDir];\n\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) {\n continue;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.ts')) {\n const filePath = path.join(dir, entry.name);\n const fileMtime = fs.statSync(filePath).mtime;\n if (fileMtime > typesMtime) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get default directory configuration based on a base directory.\n *\n * @param baseDir - Base directory (usually process.cwd())\n * @param options - Optional overrides for directory paths\n * @returns Complete directory configuration\n */\nexport function getDefaultConfig(\n baseDir: string,\n options: Partial<DirectoryConfig> = {}\n): DirectoryConfig {\n return {\n modelsDir: options.modelsDir ?? path.join(baseDir, 'agents/models'),\n promptsDir: options.promptsDir ?? path.join(baseDir, 'agents/prompts'),\n agentsDir: options.agentsDir ?? path.join(baseDir, 'agents/agents'),\n toolsDir: options.toolsDir ?? path.join(baseDir, 'agents/tools'),\n outputDir: options.outputDir ?? path.join(baseDir, '.agents'),\n };\n}\n","import type { ModelDefinition } from '../defineModel.js';\n\n/**\n * Generate a TypeScript file for a model definition.\n */\nexport function generateModelFile(data: ModelDefinition): string {\n const lines = [\n `import { defineModel } from '@standardagents/builder';`,\n '',\n `export default defineModel({`,\n ` name: '${escapeString(data.name)}',`,\n ` provider: '${escapeString(data.provider)}',`,\n ` model: '${escapeString(data.model)}',`,\n ];\n\n if (data.includedProviders && data.includedProviders.length > 0) {\n lines.push(` includedProviders: ${JSON.stringify(data.includedProviders)},`);\n }\n\n if (data.fallbacks && data.fallbacks.length > 0) {\n lines.push(` fallbacks: ${JSON.stringify(data.fallbacks)},`);\n }\n\n if (data.inputPrice !== undefined) {\n lines.push(` inputPrice: ${data.inputPrice},`);\n }\n\n if (data.outputPrice !== undefined) {\n lines.push(` outputPrice: ${data.outputPrice},`);\n }\n\n if (data.cachedPrice !== undefined) {\n lines.push(` cachedPrice: ${data.cachedPrice},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * Converts JSON Schema to Zod code string.\n *\n * This is used when saving prompts from the UI - the form editor works with\n * JSON Schema, but we need to generate Zod code for the TypeScript file.\n */\n\nexport interface JSONSchema {\n type?: string;\n description?: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n items?: JSONSchema;\n enum?: (string | number | boolean)[];\n anyOf?: JSONSchema[];\n oneOf?: JSONSchema[];\n allOf?: JSONSchema[];\n const?: any;\n default?: any;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n additionalProperties?: boolean | JSONSchema;\n nullable?: boolean;\n}\n\n/**\n * Convert a JSON Schema to Zod code string.\n *\n * @param schema - The JSON Schema to convert\n * @param indent - Current indentation level (for pretty printing)\n * @returns Zod code as a string\n *\n * @example\n * ```typescript\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', description: 'User name' },\n * age: { type: 'number' }\n * },\n * required: ['name']\n * };\n *\n * jsonSchemaToZod(schema);\n * // Returns: z.object({ name: z.string().describe('User name'), age: z.number().optional() })\n * ```\n */\nexport function jsonSchemaToZod(schema: JSONSchema, indent = 0): string {\n if (!schema || Object.keys(schema).length === 0) {\n return 'z.any()';\n }\n\n // Handle anyOf (union types)\n if (schema.anyOf && schema.anyOf.length > 0) {\n const types = schema.anyOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle oneOf (similar to anyOf for our purposes)\n if (schema.oneOf && schema.oneOf.length > 0) {\n const types = schema.oneOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n return `z.union([${types.join(', ')}])`;\n }\n\n // Handle allOf (intersection types - merge objects)\n if (schema.allOf && schema.allOf.length > 0) {\n const types = schema.allOf.map((s) => jsonSchemaToZod(s, indent));\n if (types.length === 1) {\n return types[0];\n }\n // For allOf, we use .and() to intersect\n return types.reduce((acc, t) => `${acc}.and(${t})`);\n }\n\n // Handle const\n if (schema.const !== undefined) {\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v) => JSON.stringify(v));\n if (values.length === 1) {\n return `z.literal(${values[0]})`;\n }\n return `z.enum([${values.join(', ')}])`;\n }\n\n // Handle by type\n switch (schema.type) {\n case 'string':\n return buildStringSchema(schema);\n\n case 'number':\n case 'integer':\n return buildNumberSchema(schema);\n\n case 'boolean':\n return addDescription('z.boolean()', schema.description);\n\n case 'null':\n return addDescription('z.null()', schema.description);\n\n case 'array':\n return buildArraySchema(schema, indent);\n\n case 'object':\n return buildObjectSchema(schema, indent);\n\n default:\n // No type specified - use any\n return 'z.any()';\n }\n}\n\nfunction buildStringSchema(schema: JSONSchema): string {\n let code = 'z.string()';\n\n // Add constraints\n if (schema.minLength !== undefined) {\n code += `.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n code += `.max(${schema.maxLength})`;\n }\n if (schema.pattern) {\n code += `.regex(/${escapeRegex(schema.pattern)}/)`;\n }\n\n // Handle format (common JSON Schema formats)\n if (schema.format) {\n switch (schema.format) {\n case 'email':\n code += '.email()';\n break;\n case 'uri':\n case 'url':\n code += '.url()';\n break;\n case 'uuid':\n code += '.uuid()';\n break;\n case 'date-time':\n code += '.datetime()';\n break;\n case 'date':\n code += '.date()';\n break;\n case 'time':\n code += '.time()';\n break;\n case 'ipv4':\n code += '.ip({ version: \"v4\" })';\n break;\n case 'ipv6':\n code += '.ip({ version: \"v6\" })';\n break;\n // Other formats are ignored\n }\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildNumberSchema(schema: JSONSchema): string {\n let code = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if (schema.minimum !== undefined) {\n code += `.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n code += `.max(${schema.maximum})`;\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction buildArraySchema(schema: JSONSchema, indent: number): string {\n const itemsSchema = schema.items ? jsonSchemaToZod(schema.items, indent) : 'z.any()';\n let code = `z.array(${itemsSchema})`;\n\n return addDescription(code, schema.description);\n}\n\nfunction buildObjectSchema(schema: JSONSchema, indent: number): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or object with any properties\n if (schema.additionalProperties === false) {\n return addDescription('z.object({})', schema.description);\n }\n return addDescription('z.record(z.any())', schema.description);\n }\n\n const required = new Set(schema.required || []);\n const spaces = ' '.repeat(indent + 1);\n const closingSpaces = ' '.repeat(indent);\n\n const props = Object.entries(schema.properties).map(([key, propSchema]) => {\n let propCode = jsonSchemaToZod(propSchema, indent + 1);\n\n // Handle nullable\n if (propSchema.nullable) {\n propCode += '.nullable()';\n }\n\n // Add optional() if not in required array\n if (!required.has(key)) {\n propCode += '.optional()';\n }\n\n // Handle default values\n if (propSchema.default !== undefined) {\n propCode += `.default(${JSON.stringify(propSchema.default)})`;\n }\n\n return `${spaces}${safePropertyKey(key)}: ${propCode}`;\n });\n\n const propsStr = props.join(',\\n');\n let code = `z.object({\\n${propsStr}\\n${closingSpaces}})`;\n\n // Handle additionalProperties\n if (schema.additionalProperties === false) {\n code += '.strict()';\n }\n\n return addDescription(code, schema.description);\n}\n\nfunction addDescription(code: string, description?: string): string {\n if (description) {\n return `${code}.describe(${JSON.stringify(description)})`;\n }\n return code;\n}\n\nfunction escapeRegex(pattern: string): string {\n // Escape forward slashes for regex literal\n return pattern.replace(/\\//g, '\\\\/');\n}\n\nfunction safePropertyKey(key: string): string {\n // Check if key is a valid JS identifier\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n // Otherwise quote it\n return JSON.stringify(key);\n}\n\n/**\n * Check if a JSON Schema is empty or trivial (no meaningful constraints).\n */\nexport function isEmptySchema(schema: JSONSchema | null | undefined): boolean {\n if (!schema) return true;\n if (Object.keys(schema).length === 0) return true;\n\n // A schema with only type: object and empty properties is considered empty\n if (\n schema.type === 'object' &&\n (!schema.properties || Object.keys(schema.properties).length === 0) &&\n (!schema.required || schema.required.length === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import type { PromptDefinition, PromptPart, StructuredPrompt } from '../definePrompt.js';\nimport { jsonSchemaToZod, isEmptySchema, type JSONSchema } from './jsonSchemaToZod.js';\n\n/**\n * Tool configuration from UI (snake_case).\n */\ninterface ToolConfigInput {\n name: string;\n include_text_response?: boolean;\n include_tool_calls?: boolean;\n include_errors?: boolean;\n init_user_message_property?: string | null;\n}\n\n/**\n * Prompt part as it comes from the UI/API.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt')\n */\ninterface PromptPartInput {\n // New format\n type: 'text' | 'include' | 'string' | 'prompt' | 'variable';\n content?: string; // For type: 'text'\n prompt?: string; // For type: 'include'\n // Legacy format\n value?: string; // For legacy type: 'string' or 'variable'\n id?: string; // For legacy type: 'prompt'\n label?: string; // Legacy UI field\n schema?: any; // Legacy field from UI, ignored\n}\n\n/**\n * Input data for generating a prompt file.\n * This can include JSON Schema for requiredSchema which will be converted to Zod.\n */\nexport interface PromptFileData {\n name: string;\n toolDescription?: string;\n /**\n * Prompt content can be:\n * - A plain string\n * - A structured array of prompt parts\n * - A JSON string of a structured array (legacy format from UI)\n */\n prompt?: string | PromptPartInput[];\n model: string;\n includeChat?: boolean;\n includePastTools?: boolean;\n parallelToolCalls?: boolean;\n toolChoice?: 'auto' | 'none' | 'required';\n tools?: (string | ToolConfigInput)[];\n handoffAgents?: string[];\n beforeTool?: string;\n afterTool?: string;\n reasoning?: {\n effort?: 'low' | 'medium' | 'high';\n maxTokens?: number;\n exclude?: boolean;\n include?: boolean;\n };\n /**\n * Required schema as JSON Schema (from the UI).\n * Will be converted to Zod code.\n */\n requiredSchema?: JSONSchema;\n}\n\n/**\n * Generate a TypeScript file for a prompt definition.\n *\n * @param data - Prompt data including JSON Schema for requiredSchema\n * @returns TypeScript code as a string\n */\nexport function generatePromptFile(data: PromptFileData): string {\n const hasSchema = data.requiredSchema && !isEmptySchema(data.requiredSchema);\n\n const lines = [`import { definePrompt } from '@standardagents/builder';`];\n\n // Add zod import if there's a requiredSchema with actual content\n if (hasSchema) {\n lines.push(`import { z } from 'zod';`);\n }\n\n lines.push('');\n lines.push(`export default definePrompt({`);\n lines.push(` name: '${escapeString(data.name)}',`);\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n // Prompt content - either plain string or structured array\n if (data.prompt !== undefined) {\n const promptCode = formatPromptContent(data.prompt);\n lines.push(` prompt: ${promptCode},`);\n }\n\n lines.push(` model: '${escapeString(data.model)}',`);\n\n // Note: exposeAsTool removed - all prompts are exposed as tools by default\n\n if (data.includeChat !== undefined) {\n lines.push(` includeChat: ${data.includeChat},`);\n }\n\n if (data.includePastTools !== undefined) {\n lines.push(` includePastTools: ${data.includePastTools},`);\n }\n\n if (data.parallelToolCalls !== undefined) {\n lines.push(` parallelToolCalls: ${data.parallelToolCalls},`);\n }\n\n if (data.toolChoice && data.toolChoice !== 'auto') {\n lines.push(` toolChoice: '${data.toolChoice}',`);\n }\n\n // Tools - can be strings or ToolConfig objects\n if (data.tools && data.tools.length > 0) {\n const toolsCode = formatToolsArray(data.tools);\n lines.push(` tools: ${toolsCode},`);\n }\n\n // Handoff agents - output as TypeScript array\n if (data.handoffAgents && data.handoffAgents.length > 0) {\n const agentsStr = data.handoffAgents.map(a => `'${escapeString(a)}'`).join(', ');\n lines.push(` handoffAgents: [${agentsStr}],`);\n }\n\n // Before/after tools\n if (data.beforeTool) {\n lines.push(` beforeTool: '${escapeString(data.beforeTool)}',`);\n }\n\n if (data.afterTool) {\n lines.push(` afterTool: '${escapeString(data.afterTool)}',`);\n }\n\n // Reasoning config - output as TypeScript object (no quoted keys)\n if (data.reasoning && hasNonNullProperties(data.reasoning)) {\n const reasoningCode = formatReasoningConfig(data.reasoning);\n lines.push(` reasoning: ${reasoningCode},`);\n }\n\n // RequiredSchema - convert JSON Schema to Zod code\n if (hasSchema) {\n const zodCode = jsonSchemaToZod(data.requiredSchema!, 1);\n lines.push(` requiredSchema: ${zodCode},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Check if an object has any non-null/non-undefined properties.\n */\nfunction hasNonNullProperties(obj: Record<string, any>): boolean {\n return Object.values(obj).some(v => v !== null && v !== undefined);\n}\n\n/**\n * Format the tools array as TypeScript code (not JSON).\n * Transforms snake_case properties from UI to camelCase for TypeScript.\n */\nfunction formatToolsArray(tools: (string | ToolConfigInput)[]): string {\n const formatted = tools.map(tool => {\n if (typeof tool === 'string') {\n return `'${escapeString(tool)}'`;\n }\n // Tool config object - transform to camelCase and format as TypeScript\n return formatToolConfig(tool);\n });\n\n if (formatted.length === 1) {\n return `[${formatted[0]}]`;\n }\n\n // Multi-line format for multiple tools\n const indented = formatted.map(t => ` ${t}`).join(',\\n');\n return `[\\n${indented}\\n ]`;\n}\n\n/**\n * Format a tool config object as TypeScript code.\n * Transforms snake_case to camelCase and omits null/default values.\n */\nfunction formatToolConfig(config: ToolConfigInput): string {\n const parts: string[] = [];\n\n parts.push(`name: '${escapeString(config.name)}'`);\n\n // Transform snake_case to camelCase and only include non-default values\n if (config.include_text_response !== undefined && config.include_text_response !== true) {\n parts.push(`includeTextResponse: ${config.include_text_response}`);\n }\n\n if (config.include_tool_calls !== undefined && config.include_tool_calls !== true) {\n parts.push(`includeToolCalls: ${config.include_tool_calls}`);\n }\n\n if (config.include_errors !== undefined && config.include_errors !== true) {\n parts.push(`includeErrors: ${config.include_errors}`);\n }\n\n if (config.init_user_message_property !== undefined && config.init_user_message_property !== null) {\n parts.push(`initUserMessageProperty: '${escapeString(config.init_user_message_property)}'`);\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\n/**\n * Format reasoning config as TypeScript code (not JSON).\n */\nfunction formatReasoningConfig(reasoning: PromptFileData['reasoning']): string {\n if (!reasoning) return '{}';\n\n const parts: string[] = [];\n\n if (reasoning.effort !== undefined && reasoning.effort !== null) {\n parts.push(`effort: '${reasoning.effort}'`);\n }\n\n if (reasoning.maxTokens !== undefined && reasoning.maxTokens !== null) {\n parts.push(`maxTokens: ${reasoning.maxTokens}`);\n }\n\n if (reasoning.exclude !== undefined && reasoning.exclude !== null) {\n parts.push(`exclude: ${reasoning.exclude}`);\n }\n\n if (reasoning.include !== undefined && reasoning.include !== null) {\n parts.push(`include: ${reasoning.include}`);\n }\n\n if (parts.length === 0) {\n return '{}';\n }\n\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\${/g, '\\\\${');\n}\n\n/**\n * Parse prompt content into an array of parts.\n * Returns null if it's a plain string, or the array of parts if structured.\n */\nfunction parsePromptContent(prompt: string | PromptPartInput[] | undefined): PromptPartInput[] | null {\n if (!prompt) return null;\n\n // Already an array\n if (Array.isArray(prompt)) {\n return prompt;\n }\n\n // Try to parse as JSON array (legacy format from UI)\n if (typeof prompt === 'string') {\n try {\n const parsed = JSON.parse(prompt);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, it's a plain string\n }\n }\n\n return null;\n}\n\n/**\n * Format prompt content as TypeScript code.\n * Plain strings use template literals, structured prompts use helper functions.\n */\nfunction formatPromptContent(prompt: string | PromptPartInput[] | undefined): string {\n if (!prompt) return \"''\";\n\n // Parse the prompt content\n const parts = parsePromptContent(prompt);\n\n // If it's a structured prompt (array), format it using helper functions\n if (parts !== null) {\n return formatStructuredPrompt(parts);\n }\n\n // Plain string - use template literal for multi-line\n if (typeof prompt === 'string') {\n if (prompt.includes('\\n')) {\n return `\\`${escapeTemplateLiteral(prompt)}\\``;\n }\n return `'${escapeString(prompt)}'`;\n }\n\n return \"''\";\n}\n\n/**\n * Format a structured prompt array as TypeScript code using discriminated union objects.\n */\nfunction formatStructuredPrompt(parts: PromptPartInput[]): string {\n if (parts.length === 0) {\n return '[]';\n }\n\n // Normalize parts to the new format\n const normalizedParts = parts.map(normalizePart);\n\n // Check if it's simple enough to be on one line (single short text part)\n if (normalizedParts.length === 1 && normalizedParts[0].type === 'text') {\n const content = normalizedParts[0].content || '';\n if (!content.includes('\\n') && content.length < 50) {\n return `[{ type: 'text', content: '${escapeString(content)}' }]`;\n }\n }\n\n // Multi-line format\n const formattedParts = normalizedParts.map(part => {\n if (part.type === 'text') {\n const content = part.content || '';\n // Use template literal for multi-line strings\n if (content.includes('\\n')) {\n return ` { type: 'text', content: \\`${escapeTemplateLiteral(content)}\\` }`;\n }\n return ` { type: 'text', content: '${escapeString(content)}' }`;\n } else if (part.type === 'include') {\n const promptName = part.prompt || '';\n return ` { type: 'include', prompt: '${escapeString(promptName)}' }`;\n }\n return ` // Unknown part type: ${(part as any).type}`;\n });\n\n return `[\\n${formattedParts.join(',\\n')},\\n ]`;\n}\n\n/**\n * Normalize a prompt part from legacy format to new format.\n * Legacy: { type: 'string', value: '...' } or { type: 'prompt', id: '...' }\n * New: { type: 'text', content: '...' } or { type: 'include', prompt: '...' }\n */\nfunction normalizePart(part: PromptPartInput): { type: 'text'; content: string } | { type: 'include'; prompt: string } {\n // Handle new format\n if (part.type === 'text') {\n return { type: 'text', content: part.content || '' };\n }\n if (part.type === 'include') {\n return { type: 'include', prompt: part.prompt || '' };\n }\n\n // Handle legacy format\n if (part.type === 'string') {\n return { type: 'text', content: part.value || '' };\n }\n if (part.type === 'prompt') {\n return { type: 'include', prompt: part.id || '' };\n }\n if (part.type === 'variable') {\n // Variables are converted to text with placeholder syntax\n return { type: 'text', content: `{{${part.value || ''}}}` };\n }\n\n // Fallback for unknown types\n return { type: 'text', content: '' };\n}\n","import type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Generate a TypeScript file for an agent definition.\n */\nexport function generateAgentFile(data: AgentDefinition): string {\n const lines = [\n `import { defineAgent } from '@standardagents/builder';`,\n '',\n `export default defineAgent({`,\n ` name: '${escapeString(data.name)}',`,\n ];\n\n // Only include title if explicitly provided (deprecated field)\n if (data.title) {\n lines.push(` title: '${escapeString(data.title)}',`);\n }\n\n if (data.type && data.type !== 'ai_human') {\n lines.push(` type: '${data.type}',`);\n }\n\n // Only include maxSessionTurns if it's a valid number (not null/undefined)\n if (data.maxSessionTurns !== undefined && data.maxSessionTurns !== null) {\n lines.push(` maxSessionTurns: ${data.maxSessionTurns},`);\n }\n\n // Side A config\n lines.push(` sideA: ${formatSideConfig(data.sideA)},`);\n\n // Side B config (optional)\n if (data.sideB) {\n lines.push(` sideB: ${formatSideConfig(data.sideB)},`);\n }\n\n if (data.exposeAsTool !== undefined) {\n lines.push(` exposeAsTool: ${data.exposeAsTool},`);\n }\n\n if (data.toolDescription) {\n lines.push(` toolDescription: '${escapeString(data.toolDescription)}',`);\n }\n\n if (data.tags && data.tags.length > 0) {\n lines.push(` tags: ${JSON.stringify(data.tags)},`);\n }\n\n lines.push(`});`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatSideConfig(config: AgentDefinition['sideA']): string {\n const parts: string[] = ['{'];\n\n if (config.label) {\n parts.push(` label: '${escapeString(config.label)}',`);\n }\n\n parts.push(` prompt: '${escapeString(config.prompt)}',`);\n\n if (config.stopOnResponse !== undefined) {\n parts.push(` stopOnResponse: ${config.stopOnResponse},`);\n }\n\n if (config.stopTool) {\n parts.push(` stopTool: '${escapeString(config.stopTool)}',`);\n }\n\n if (config.stopToolResponseProperty) {\n parts.push(` stopToolResponseProperty: '${escapeString(config.stopToolResponseProperty)}',`);\n }\n\n if (config.maxTurns !== undefined) {\n parts.push(` maxTurns: ${config.maxTurns},`);\n }\n\n if (config.endConversationTool) {\n parts.push(` endConversationTool: '${escapeString(config.endConversationTool)}',`);\n }\n\n if (config.manualStopCondition !== undefined) {\n parts.push(` manualStopCondition: ${config.manualStopCondition},`);\n }\n\n parts.push(' }');\n return parts.join('\\n');\n}\n\nfunction escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\\\/g, '\\\\\\\\');\n}\n","/**\n * File persistence service for dev mode.\n *\n * This module provides filesystem operations for creating, updating, and deleting\n * model, prompt, and agent definition files. It runs in the Vite plugin context\n * (Node.js) where filesystem access is available.\n *\n * In production (Cloudflare Workers), these operations would be handled by\n * a different mechanism (e.g., GitHub API commits).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { generateModelFile } from '../generators/generateModelFile.js';\nimport { generatePromptFile, type PromptFileData } from '../generators/generatePromptFile.js';\nimport { generateAgentFile } from '../generators/generateAgentFile.js';\nimport type { ModelDefinition } from '../defineModel.js';\nimport type { AgentDefinition } from '../defineAgent.js';\n\n/**\n * Convert a model/prompt/agent name to a safe filename.\n * Handles characters that are invalid in filesystem paths:\n * - Replaces `/` and `\\` with `__` (path separators)\n * - Replaces `:` with `_` (invalid on Windows, used in model IDs like `:free`)\n * - Replaces `-` with `_` for consistency with existing conventions\n * - Replaces other problematic characters (`*`, `?`, `\"`, `<`, `>`, `|`) with `_`\n */\nexport function nameToFilename(name: string): string {\n return name\n .replace(/[/\\\\]/g, '__') // Path separators become double underscore\n .replace(/[:*?\"<>|]/g, '_') // Invalid filesystem characters become underscore\n .replace(/-/g, '_'); // Hyphens become underscore for consistency\n}\n\n/**\n * Get the file path for a model definition.\n */\nexport function getModelFilePath(modelsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(modelsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a model file already exists.\n */\nexport function modelExists(modelsDir: string, name: string): boolean {\n const filePath = getModelFilePath(modelsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Result of a persistence operation.\n */\nexport interface PersistenceResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\n/**\n * Save a model definition to a TypeScript file.\n *\n * @param modelsDir - The directory where models are stored\n * @param data - The model definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveModel(\n modelsDir: string,\n data: ModelDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure models directory exists\n if (!fs.existsSync(modelsDir)) {\n fs.mkdirSync(modelsDir, { recursive: true });\n }\n\n const filePath = getModelFilePath(modelsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file already exists: ${filePath}. Use update to modify existing models.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateModelFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save model',\n };\n }\n}\n\n/**\n * Delete a model definition file.\n *\n * @param modelsDir - The directory where models are stored\n * @param name - The model name\n * @returns Result of the operation\n */\nexport async function deleteModel(\n modelsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getModelFilePath(modelsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Model file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete model',\n };\n }\n}\n\n/**\n * Transform snake_case model data from the UI to camelCase for internal use.\n * The UI sends field names like `included_providers`, etc.\n * but the backend expects `includedProviders`, etc.\n *\n * Also strips price fields for OpenRouter models since those are returned\n * per-request by the OpenRouter API.\n */\nexport function transformModelData(data: any): any {\n const transformed: any = {};\n const isOpenRouter = data.provider === 'openrouter';\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n included_providers: 'includedProviders',\n input_price: 'inputPrice',\n output_price: 'outputPrice',\n cached_price: 'cachedPrice',\n };\n\n // Fields to skip for OpenRouter models (prices come from API per-request)\n const openRouterSkipFields = ['inputPrice', 'outputPrice', 'cachedPrice', 'input_price', 'output_price', 'cached_price'];\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Skip price fields for OpenRouter models\n if (isOpenRouter && openRouterSkipFields.includes(key)) continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n const transformedKey = fieldMappings[key];\n // Skip price fields for OpenRouter even after transformation\n if (isOpenRouter && openRouterSkipFields.includes(transformedKey)) continue;\n transformed[transformedKey] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'model', 'provider', etc.)\n transformed[key] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Validate model data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateModelData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Model name is required and must be a string';\n }\n\n if (!data.provider || typeof data.provider !== 'string') {\n return 'Model provider is required and must be a string';\n }\n\n const validProviders = ['openai', 'openrouter', 'anthropic', 'google'];\n if (!validProviders.includes(data.provider)) {\n return `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(', ')}`;\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Model ID is required and must be a string';\n }\n\n // Validate optional numeric fields\n if (data.inputPrice !== undefined && typeof data.inputPrice !== 'number') {\n return 'inputPrice must be a number';\n }\n\n if (data.outputPrice !== undefined && typeof data.outputPrice !== 'number') {\n return 'outputPrice must be a number';\n }\n\n if (data.cachedPrice !== undefined && typeof data.cachedPrice !== 'number') {\n return 'cachedPrice must be a number';\n }\n\n // Validate fallbacks is an array of strings\n if (data.fallbacks !== undefined) {\n if (!Array.isArray(data.fallbacks)) {\n return 'fallbacks must be an array';\n }\n for (const fallback of data.fallbacks) {\n if (typeof fallback !== 'string') {\n return 'Each fallback must be a string (model name)';\n }\n }\n }\n\n // Validate includedProviders is an array of strings\n if (data.includedProviders !== undefined) {\n if (!Array.isArray(data.includedProviders)) {\n return 'includedProviders must be an array';\n }\n for (const provider of data.includedProviders) {\n if (typeof provider !== 'string') {\n return 'Each includedProvider must be a string';\n }\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Prompt Persistence\n// ============================================================================\n\n/**\n * Transform snake_case prompt data from the UI to camelCase for internal use.\n * The UI sends field names like `model_id`, `tool_description`, etc.\n * but the backend expects `model`, `toolDescription`, etc.\n */\nexport function transformPromptData(data: any): any {\n const transformed: any = {};\n\n // Direct mappings (snake_case -> camelCase)\n const fieldMappings: Record<string, string> = {\n model_id: 'model',\n tool_description: 'toolDescription',\n expose_as_tool: 'exposeAsTool',\n required_schema: 'requiredSchema',\n include_chat: 'includeChat',\n include_past_tools: 'includePastTools',\n before_tool: 'beforeTool',\n after_tool: 'afterTool',\n parallel_tool_calls: 'parallelToolCalls',\n tool_choice: 'toolChoice',\n handoff_agents: 'handoffAgents',\n reasoning_effort: 'reasoningEffort',\n reasoning_max_tokens: 'reasoningMaxTokens',\n reasoning_exclude: 'reasoningExclude',\n include_reasoning: 'includeReasoning',\n };\n\n for (const [key, value] of Object.entries(data)) {\n // Skip 'id' field as it's not needed for persistence\n if (key === 'id') continue;\n\n // Check if this is a snake_case field that needs transformation\n if (fieldMappings[key]) {\n transformed[fieldMappings[key]] = value;\n } else {\n // Keep the field as-is (handles camelCase fields and 'name', 'prompt', 'tools', etc.)\n transformed[key] = value;\n }\n }\n\n // Build reasoning config if any reasoning fields are present\n if (\n transformed.reasoningEffort !== undefined ||\n transformed.reasoningMaxTokens !== undefined ||\n transformed.reasoningExclude !== undefined ||\n transformed.includeReasoning !== undefined\n ) {\n transformed.reasoning = {};\n if (transformed.reasoningEffort) {\n transformed.reasoning.effort = transformed.reasoningEffort;\n }\n if (transformed.reasoningMaxTokens) {\n transformed.reasoning.maxTokens = transformed.reasoningMaxTokens;\n }\n if (transformed.reasoningExclude !== undefined) {\n transformed.reasoning.exclude = transformed.reasoningExclude;\n }\n if (transformed.includeReasoning !== undefined) {\n transformed.reasoning.include = transformed.includeReasoning;\n }\n // Clean up the flat fields\n delete transformed.reasoningEffort;\n delete transformed.reasoningMaxTokens;\n delete transformed.reasoningExclude;\n delete transformed.includeReasoning;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for a prompt definition.\n */\nexport function getPromptFilePath(promptsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(promptsDir, `${filename}.ts`);\n}\n\n/**\n * Check if a prompt file already exists.\n */\nexport function promptExists(promptsDir: string, name: string): boolean {\n const filePath = getPromptFilePath(promptsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save a prompt definition to a TypeScript file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param data - The prompt definition data (with JSON Schema for requiredSchema)\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function savePrompt(\n promptsDir: string,\n data: PromptFileData,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure prompts directory exists\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n const filePath = getPromptFilePath(promptsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${filePath}. Use update to modify existing prompts.`,\n };\n }\n\n // Generate the TypeScript file content (converts JSON Schema to Zod)\n const content = generatePromptFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save prompt',\n };\n }\n}\n\n/**\n * Delete a prompt definition file.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param name - The prompt name\n * @returns Result of the operation\n */\nexport async function deletePrompt(\n promptsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getPromptFilePath(promptsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete prompt',\n };\n }\n}\n\n/**\n * Rename a prompt definition file and update its name property.\n * Since prompts contain Zod schemas that can't be easily regenerated from JSON Schema,\n * this function reads the file and updates the name property in place.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldName - The current prompt name\n * @param newName - The new prompt name\n * @returns Result of the operation\n */\nexport async function renamePrompt(\n promptsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getPromptFilePath(promptsDir, oldName);\n const newFilePath = getPromptFilePath(promptsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Prompt file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Prompt file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename prompt',\n };\n }\n}\n\n/**\n * Validate prompt data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validatePromptData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Prompt name is required and must be a string';\n }\n\n if (!data.model || typeof data.model !== 'string') {\n return 'Prompt model is required and must be a string';\n }\n\n // toolDescription is optional but should be string if provided\n if (data.toolDescription !== undefined && typeof data.toolDescription !== 'string') {\n return 'toolDescription must be a string';\n }\n\n // prompt content is optional but should be string if provided\n if (data.prompt !== undefined && typeof data.prompt !== 'string') {\n return 'prompt must be a string';\n }\n\n // Validate boolean fields (exposeAsTool removed - all prompts exposed by default)\n const booleanFields = ['includeChat', 'includePastTools', 'parallelToolCalls'];\n for (const field of booleanFields) {\n if (data[field] !== undefined && typeof data[field] !== 'boolean') {\n return `${field} must be a boolean`;\n }\n }\n\n // Validate toolChoice\n if (data.toolChoice !== undefined) {\n const validChoices = ['auto', 'none', 'required'];\n if (!validChoices.includes(data.toolChoice)) {\n return `Invalid toolChoice '${data.toolChoice}'. Must be one of: ${validChoices.join(', ')}`;\n }\n }\n\n // Validate tools is an array\n if (data.tools !== undefined && !Array.isArray(data.tools)) {\n return 'tools must be an array';\n }\n\n // Validate handoffAgents is an array\n if (data.handoffAgents !== undefined && !Array.isArray(data.handoffAgents)) {\n return 'handoffAgents must be an array';\n }\n\n // Validate reasoning config\n if (data.reasoning !== undefined) {\n if (typeof data.reasoning !== 'object') {\n return 'reasoning must be an object';\n }\n if (data.reasoning.effort !== undefined) {\n const validEfforts = ['low', 'medium', 'high'];\n if (!validEfforts.includes(data.reasoning.effort)) {\n return `Invalid reasoning.effort '${data.reasoning.effort}'. Must be one of: ${validEfforts.join(', ')}`;\n }\n }\n if (data.reasoning.maxTokens !== undefined && typeof data.reasoning.maxTokens !== 'number') {\n return 'reasoning.maxTokens must be a number';\n }\n }\n\n // requiredSchema is validated by the generatePromptFile function\n // (it handles JSON Schema to Zod conversion)\n\n return null;\n}\n\n// ============================================================================\n// Agent Persistence\n// ============================================================================\n\n/**\n * Transform snake_case agent data from the UI to camelCase for internal use.\n * The UI sends field names like `side_a_label`, `side_a_agent_prompt`, etc.\n * but the backend expects nested structures like `sideA.label`, `sideA.prompt`, etc.\n */\nexport function transformAgentData(data: any): any {\n const transformed: any = {\n name: data.name,\n };\n\n // title is deprecated but include if provided for backward compatibility\n if (data.title) {\n transformed.title = data.title;\n }\n\n // Type\n if (data.type) {\n transformed.type = data.type;\n }\n\n // Max session turns\n if (data.max_session_turns !== undefined) {\n transformed.maxSessionTurns = data.max_session_turns;\n }\n\n // Side A configuration\n transformed.sideA = {\n prompt: data.side_a_agent_prompt,\n };\n if (data.side_a_label) {\n transformed.sideA.label = data.side_a_label;\n }\n if (data.side_a_stop_on_response !== undefined) {\n transformed.sideA.stopOnResponse = data.side_a_stop_on_response;\n }\n if (data.side_a_stop_tool) {\n transformed.sideA.stopTool = data.side_a_stop_tool;\n }\n if (data.side_a_stop_tool_response_property) {\n transformed.sideA.stopToolResponseProperty = data.side_a_stop_tool_response_property;\n }\n if (data.side_a_max_turns !== undefined) {\n transformed.sideA.maxTurns = data.side_a_max_turns;\n }\n if (data.side_a_end_conversation_tool) {\n transformed.sideA.endConversationTool = data.side_a_end_conversation_tool;\n }\n if (data.side_a_manual_stop_condition !== undefined) {\n transformed.sideA.manualStopCondition = data.side_a_manual_stop_condition;\n }\n\n // Side B configuration (optional, for dual_ai)\n if (data.side_b_agent_prompt) {\n transformed.sideB = {\n prompt: data.side_b_agent_prompt,\n };\n if (data.side_b_label) {\n transformed.sideB.label = data.side_b_label;\n }\n if (data.side_b_stop_on_response !== undefined) {\n transformed.sideB.stopOnResponse = data.side_b_stop_on_response;\n }\n if (data.side_b_stop_tool) {\n transformed.sideB.stopTool = data.side_b_stop_tool;\n }\n if (data.side_b_stop_tool_response_property) {\n transformed.sideB.stopToolResponseProperty = data.side_b_stop_tool_response_property;\n }\n if (data.side_b_max_turns !== undefined) {\n transformed.sideB.maxTurns = data.side_b_max_turns;\n }\n if (data.side_b_end_conversation_tool) {\n transformed.sideB.endConversationTool = data.side_b_end_conversation_tool;\n }\n if (data.side_b_manual_stop_condition !== undefined) {\n transformed.sideB.manualStopCondition = data.side_b_manual_stop_condition;\n }\n }\n\n // Tool exposure\n if (data.expose_as_tool !== undefined) {\n transformed.exposeAsTool = data.expose_as_tool;\n }\n if (data.tool_description) {\n transformed.toolDescription = data.tool_description;\n }\n\n // Tags\n if (data.tags) {\n transformed.tags = data.tags;\n }\n\n return transformed;\n}\n\n/**\n * Get the file path for an agent definition.\n */\nexport function getAgentFilePath(agentsDir: string, name: string): string {\n const filename = nameToFilename(name);\n return path.join(agentsDir, `${filename}.ts`);\n}\n\n/**\n * Check if an agent file already exists.\n */\nexport function agentExists(agentsDir: string, name: string): boolean {\n const filePath = getAgentFilePath(agentsDir, name);\n return fs.existsSync(filePath);\n}\n\n/**\n * Save an agent definition to a TypeScript file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param data - The agent definition data\n * @param overwrite - Whether to overwrite an existing file (for updates)\n * @returns Result of the operation\n */\nexport async function saveAgent(\n agentsDir: string,\n data: AgentDefinition,\n overwrite: boolean = false\n): Promise<PersistenceResult> {\n try {\n // Ensure agents directory exists\n if (!fs.existsSync(agentsDir)) {\n fs.mkdirSync(agentsDir, { recursive: true });\n }\n\n const filePath = getAgentFilePath(agentsDir, data.name);\n\n // Check if file already exists\n if (!overwrite && fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${filePath}. Use update to modify existing agents.`,\n };\n }\n\n // Generate the TypeScript file content\n const content = generateAgentFile(data);\n\n // Write the file\n await fs.promises.writeFile(filePath, content, 'utf-8');\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to save agent',\n };\n }\n}\n\n/**\n * Delete an agent definition file.\n *\n * @param agentsDir - The directory where agents are stored\n * @param name - The agent name\n * @returns Result of the operation\n */\nexport async function deleteAgent(\n agentsDir: string,\n name: string\n): Promise<PersistenceResult> {\n try {\n const filePath = getAgentFilePath(agentsDir, name);\n\n if (!fs.existsSync(filePath)) {\n return {\n success: false,\n error: `Agent file not found: ${filePath}`,\n };\n }\n\n await fs.promises.unlink(filePath);\n\n return {\n success: true,\n filePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to delete agent',\n };\n }\n}\n\n/**\n * Rename an agent definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldName - The current agent name\n * @param newName - The new agent name\n * @returns Result of the operation\n */\nexport async function renameAgent(\n agentsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getAgentFilePath(agentsDir, oldName);\n const newFilePath = getAgentFilePath(agentsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Agent file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Agent file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename agent',\n };\n }\n}\n\n/**\n * Rename a model definition file and update its name property.\n * This function reads the file and updates the name property in place.\n *\n * @param modelsDir - The directory where models are stored\n * @param oldName - The current model name\n * @param newName - The new model name\n * @returns Result of the operation\n */\nexport async function renameModel(\n modelsDir: string,\n oldName: string,\n newName: string\n): Promise<PersistenceResult> {\n try {\n const oldFilePath = getModelFilePath(modelsDir, oldName);\n const newFilePath = getModelFilePath(modelsDir, newName);\n\n if (!fs.existsSync(oldFilePath)) {\n return {\n success: false,\n error: `Model file not found: ${oldFilePath}`,\n };\n }\n\n if (fs.existsSync(newFilePath)) {\n return {\n success: false,\n error: `Model file already exists: ${newFilePath}`,\n };\n }\n\n // Read the current file content\n const content = await fs.promises.readFile(oldFilePath, 'utf-8');\n\n // Update the name property in the file content\n // Matches: name: 'old_name', or name: \"old_name\",\n const updatedContent = content.replace(\n /name:\\s*['\"]([^'\"]+)['\"]/,\n `name: '${newName}'`\n );\n\n // Write to the new file\n await fs.promises.writeFile(newFilePath, updatedContent, 'utf-8');\n\n // Delete the old file\n await fs.promises.unlink(oldFilePath);\n\n return {\n success: true,\n filePath: newFilePath,\n };\n } catch (error: any) {\n return {\n success: false,\n error: error.message || 'Failed to rename model',\n };\n }\n}\n\n// ============================================================================\n// Cascade Update Functions\n// ============================================================================\n\n/**\n * Update model references in all prompt files when a model is renamed.\n * Prompts reference models via the `model` field.\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldModelName - The old model name\n * @param newModelName - The new model name\n * @returns Array of updated file paths\n */\nexport async function updateModelReferencesInPrompts(\n promptsDir: string,\n oldModelName: string,\n newModelName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match model: 'old_name' or model: \"old_name\"\n const modelRegex = new RegExp(`model:\\\\s*['\"]${escapeRegExp(oldModelName)}['\"]`, 'g');\n\n if (modelRegex.test(content)) {\n content = content.replace(modelRegex, `model: '${newModelName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in other prompt files when a prompt is renamed.\n * Prompts reference other prompts via the `tools` array (prompts exposed as tools).\n *\n * @param promptsDir - The directory where prompts are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInPrompts(\n promptsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(promptsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(promptsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(promptsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n let modified = false;\n\n // Match prompt references in tools array: 'old_name' or \"old_name\"\n // This is a simple string replacement within the tools array context\n const toolsArrayRegex = /tools:\\s*\\[([^\\]]*)\\]/gs;\n const newContent = content.replace(toolsArrayRegex, (match) => {\n const oldMatch = match;\n // Replace the prompt name within the tools array\n const promptRefRegex = new RegExp(`['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n const replaced = match.replace(promptRefRegex, `'${newPromptName}'`);\n if (replaced !== oldMatch) {\n modified = true;\n }\n return replaced;\n });\n\n if (modified) {\n await fs.promises.writeFile(filePath, newContent, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Update prompt references in agent files when a prompt is renamed.\n * Agents reference prompts via sideA.prompt and sideB.prompt fields.\n *\n * @param agentsDir - The directory where agents are stored\n * @param oldPromptName - The old prompt name\n * @param newPromptName - The new prompt name\n * @returns Array of updated file paths\n */\nexport async function updatePromptReferencesInAgents(\n agentsDir: string,\n oldPromptName: string,\n newPromptName: string\n): Promise<string[]> {\n const updatedFiles: string[] = [];\n\n if (!fs.existsSync(agentsDir)) {\n return updatedFiles;\n }\n\n const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.ts'));\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n let content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Match prompt: 'old_name' or prompt: \"old_name\" in sideA/sideB objects\n const promptRegex = new RegExp(`prompt:\\\\s*['\"]${escapeRegExp(oldPromptName)}['\"]`, 'g');\n\n if (promptRegex.test(content)) {\n content = content.replace(promptRegex, `prompt: '${newPromptName}'`);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n updatedFiles.push(filePath);\n }\n }\n\n return updatedFiles;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Validate agent data before saving.\n * Returns an error message if invalid, or null if valid.\n */\nexport function validateAgentData(data: any): string | null {\n if (!data.name || typeof data.name !== 'string') {\n return 'Agent name is required and must be a string';\n }\n\n // title is deprecated and optional - validate if provided\n if (data.title !== undefined && typeof data.title !== 'string') {\n return 'Agent title must be a string if provided';\n }\n\n // Validate type\n if (data.type !== undefined) {\n const validTypes = ['ai_human', 'dual_ai'];\n if (!validTypes.includes(data.type)) {\n return `Invalid type '${data.type}'. Must be one of: ${validTypes.join(', ')}`;\n }\n }\n\n // Validate sideA\n if (!data.sideA || typeof data.sideA !== 'object') {\n return 'sideA configuration is required';\n }\n\n if (!data.sideA.prompt || typeof data.sideA.prompt !== 'string') {\n return 'sideA.prompt is required and must be a string';\n }\n\n // Validate sideA optional fields\n if (data.sideA.label !== undefined && typeof data.sideA.label !== 'string') {\n return 'sideA.label must be a string';\n }\n\n if (data.sideA.stopOnResponse !== undefined && typeof data.sideA.stopOnResponse !== 'boolean') {\n return 'sideA.stopOnResponse must be a boolean';\n }\n\n if (data.sideA.stopTool !== undefined && typeof data.sideA.stopTool !== 'string') {\n return 'sideA.stopTool must be a string';\n }\n\n if (data.sideA.stopTool && !data.sideA.stopToolResponseProperty) {\n return 'sideA.stopToolResponseProperty is required when sideA.stopTool is set';\n }\n\n if (data.sideA.maxTurns !== undefined) {\n if (typeof data.sideA.maxTurns !== 'number' || data.sideA.maxTurns <= 0) {\n return 'sideA.maxTurns must be a positive number';\n }\n }\n\n // Validate dual_ai requires sideB\n if (data.type === 'dual_ai') {\n if (!data.sideB || typeof data.sideB !== 'object') {\n return 'sideB configuration is required for dual_ai type';\n }\n\n if (!data.sideB.prompt || typeof data.sideB.prompt !== 'string') {\n return 'sideB.prompt is required for dual_ai type';\n }\n\n // Validate sideB optional fields\n if (data.sideB.stopTool && !data.sideB.stopToolResponseProperty) {\n return 'sideB.stopToolResponseProperty is required when sideB.stopTool is set';\n }\n\n if (data.sideB.maxTurns !== undefined) {\n if (typeof data.sideB.maxTurns !== 'number' || data.sideB.maxTurns <= 0) {\n return 'sideB.maxTurns must be a positive number';\n }\n }\n }\n\n // Validate exposeAsTool requires toolDescription\n if (data.exposeAsTool && !data.toolDescription) {\n return 'toolDescription is required when exposeAsTool is true';\n }\n\n // Validate maxSessionTurns (only applicable for dual_ai agents)\n // Skip validation if null/undefined (ai_human agents send null)\n if (data.maxSessionTurns !== undefined && data.maxSessionTurns !== null) {\n if (typeof data.maxSessionTurns !== 'number' || data.maxSessionTurns <= 0) {\n return 'maxSessionTurns must be a positive number';\n }\n }\n\n // Validate tags\n if (data.tags !== undefined) {\n if (!Array.isArray(data.tags)) {\n return 'tags must be an array';\n }\n for (const tag of data.tags) {\n if (typeof tag !== 'string') {\n return 'Each tag must be a string';\n }\n }\n }\n\n return null;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport { Plugin, ViteDevServer } from \"vite\";\n\nconst require = createRequire(import.meta.url);\nimport { generateTypes, getDefaultConfig, needsRegeneration } from \"./sdk/generateTypes.js\";\nimport {\n saveModel,\n deleteModel,\n renameModel,\n validateModelData,\n modelExists,\n transformModelData,\n savePrompt,\n deletePrompt,\n renamePrompt,\n validatePromptData,\n promptExists,\n transformPromptData,\n saveAgent,\n deleteAgent,\n validateAgentData,\n agentExists,\n transformAgentData,\n updateModelReferencesInPrompts,\n updatePromptReferencesInPrompts,\n updatePromptReferencesInAgents,\n} from \"./sdk/persistence/index.js\";\n\nconst VIRTUAL_TOOLS_ID = \"virtual:@standardagents-tools\";\nconst RESOLVED_VIRTUAL_TOOLS_ID = \"\\0\" + VIRTUAL_TOOLS_ID;\n\nconst VIRTUAL_ROUTES_ID = \"virtual:@standardagents-routes\";\nconst RESOLVED_VIRTUAL_ROUTES_ID = \"\\0\" + VIRTUAL_ROUTES_ID;\n\n// Legacy alias for backward compatibility\nconst VIRTUAL_ROUTER_ID = \"virtual:@standardagents/router\";\nconst RESOLVED_VIRTUAL_ROUTER_ID = \"\\0\" + VIRTUAL_ROUTER_ID;\n\nconst VIRTUAL_HOOKS_ID = \"virtual:@standardagents-hooks\";\nconst RESOLVED_VIRTUAL_HOOKS_ID = \"\\0\" + VIRTUAL_HOOKS_ID;\n\nconst VIRTUAL_CONFIG_ID = \"virtual:@standardagents-config\";\nconst RESOLVED_VIRTUAL_CONFIG_ID = \"\\0\" + VIRTUAL_CONFIG_ID;\n\nconst VIRTUAL_THREAD_API_ID = \"virtual:@standardagents-thread-api\";\nconst RESOLVED_VIRTUAL_THREAD_API_ID = \"\\0\" + VIRTUAL_THREAD_API_ID;\n\n// Virtual modules for models, prompts, and agents\nconst VIRTUAL_MODELS_ID = \"virtual:@standardagents-models\";\nconst RESOLVED_VIRTUAL_MODELS_ID = \"\\0\" + VIRTUAL_MODELS_ID;\n\nconst VIRTUAL_PROMPTS_ID = \"virtual:@standardagents-prompts\";\nconst RESOLVED_VIRTUAL_PROMPTS_ID = \"\\0\" + VIRTUAL_PROMPTS_ID;\n\nconst VIRTUAL_AGENTS_ID = \"virtual:@standardagents-agents\";\nconst RESOLVED_VIRTUAL_AGENTS_ID = \"\\0\" + VIRTUAL_AGENTS_ID;\n\n// Consolidated virtual module that provides DurableThread and DurableAgentBuilder\n// with methods already implemented (tools, hooks, models, prompts, agents)\nconst VIRTUAL_BUILDER_ID = \"virtual:@standardagents/builder\";\nconst RESOLVED_VIRTUAL_BUILDER_ID = \"\\0\" + VIRTUAL_BUILDER_ID;\n\n// API Routes functionality\nfunction scanApiDirectory(\n dir: string,\n baseRoute = \"\"\n): Array<{\n method: string;\n route: string;\n importPath: string;\n}> {\n const routes: Array<{ method: string; route: string; importPath: string }> =\n [];\n\n if (!fs.existsSync(dir)) {\n return routes;\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Convert [param] to :param for rou3 dynamic routes in directory names\n const convertedDirName = entry.name.replace(/\\[([^\\]]+)\\]/g, ':$1');\n const subRoute = baseRoute + \"/\" + convertedDirName;\n routes.push(...scanApiDirectory(fullPath, subRoute));\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(/\\.ts$/, \"\");\n let method = \"\";\n let routePath = baseRoute;\n\n if (fileName.includes(\".\")) {\n const parts = fileName.split(\".\");\n const methodPart = parts[parts.length - 1].toUpperCase();\n if ([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(methodPart)) {\n method = methodPart;\n const pathPart = parts.slice(0, -1).join(\".\");\n if (pathPart !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = pathPart.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n } else {\n if (fileName !== \"index\") {\n // Convert [param] to :param for rou3 dynamic routes\n const convertedPath = fileName.replace(/\\[([^\\]]+)\\]/g, ':$1');\n routePath += \"/\" + convertedPath;\n }\n }\n\n const importPath =\n \"./\" + path.relative(process.cwd(), fullPath).replace(/\\\\/g, \"/\");\n\n routes.push({\n method,\n route: routePath || \"/\",\n importPath,\n });\n }\n }\n\n return routes;\n } catch (error) {\n console.error(`Error scanning API directory ${dir}:`, error);\n return [];\n }\n}\n\n// Tools functionality\nfunction isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*[a-z0-9]$/.test(str) || /^[a-z]$/.test(str);\n}\n\nfunction validateToolFile(filePath: string, fileName: string): string | null {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const hasDefaultExport = /export\\s+default\\s+defineTool/.test(content);\n\n if (!hasDefaultExport) {\n return `Tool file '${fileName}.ts' must have a default export using defineTool()`;\n }\n\n return null;\n } catch (error) {\n return `Failed to read tool file '${fileName}.ts'`;\n }\n}\n\nasync function scanToolsDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const tools: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return tools;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n let toolError: string | undefined;\n\n const validationError = validateToolFile(filePath, fileName);\n\n if (validationError) {\n toolError = validationError;\n console.error(`\\n❌ Tool validation error: ${validationError}`);\n }\n\n if (!isSnakeCase(fileName)) {\n const warning = `Tool name should be in snake_case format (e.g., 'log_name', 'send_email')`;\n if (toolError) {\n toolError += ` | ${warning}`;\n } else {\n toolError = warning;\n }\n console.warn(\n `\\n⚠️ Tool naming warning: '${fileName}' should be in snake_case format (e.g., 'log_name', 'send_email')`\n );\n }\n\n tools.push({ name: fileName, importPath, error: toolError });\n }\n }\n\n return tools;\n}\n\nasync function scanHooksDirectory(\n dir: string\n): Promise<Array<{ name: string; importPath: string }>> {\n const hooks: Array<{ name: string; importPath: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return hooks;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const fileName = entry.name.replace(\".ts\", \"\");\n\n // Skip index.ts - it's a utility module, not a hook\n if (fileName === \"index\") {\n continue;\n }\n\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n hooks.push({ name: fileName, importPath });\n }\n }\n\n return hooks;\n}\n\n/**\n * Scan a directory for config definitions (models, prompts, or agents).\n * Extracts the name from the defineX() call in each file.\n */\nasync function scanConfigDirectory(\n dir: string,\n definePattern: RegExp\n): Promise<Array<{ name: string; importPath: string; error?: string }>> {\n const items: Array<{ name: string; importPath: string; error?: string }> = [];\n\n if (!fs.existsSync(dir)) {\n return items;\n }\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n const filePath = path.join(dir, entry.name);\n const importPath =\n \"./\" + path.relative(process.cwd(), filePath).replace(/\\\\/g, \"/\");\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n // Check for default export with define function\n const hasDefaultExport = definePattern.test(content);\n if (!hasDefaultExport) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `File must have a default export using the define function`,\n });\n continue;\n }\n\n // Extract name from defineX({ name: 'xxx', ... })\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n if (nameMatch) {\n items.push({ name: nameMatch[1], importPath });\n } else {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Could not extract name from definition`,\n });\n }\n } catch (error) {\n items.push({\n name: entry.name.replace(\".ts\", \"\"),\n importPath,\n error: `Failed to read file: ${error}`,\n });\n }\n }\n }\n\n return items;\n}\n\nasync function scanModelsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineModel/);\n}\n\nasync function scanPromptsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+definePrompt/);\n}\n\nasync function scanAgentsDirectory(dir: string) {\n return scanConfigDirectory(dir, /export\\s+default\\s+defineAgent/);\n}\n\n/**\n * Parse JSON body from an incoming HTTP request (Node.js IncomingMessage).\n * Used by dev-mode API handlers that intercept requests before they reach workerd.\n */\nfunction parseRequestBody(req: import('http').IncomingMessage): Promise<any> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch (e) {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\nexport interface AgentPluginOptions {\n mountPoint?: string;\n toolsDir?: string;\n hooksDir?: string;\n apiDir?: string;\n modelsDir?: string;\n promptsDir?: string;\n agentsDir?: string;\n}\n\nexport function agentbuilder(options: AgentPluginOptions = {}): Plugin {\n // Normalize mount point: ensure leading slash, no trailing slash\n let mountPoint = options.mountPoint || \"/agents\";\n if (!mountPoint.startsWith(\"/\")) {\n mountPoint = \"/\" + mountPoint;\n }\n if (mountPoint.endsWith(\"/\") && mountPoint.length > 1) {\n mountPoint = mountPoint.slice(0, -1);\n }\n\n const toolsDir = options.toolsDir\n ? path.resolve(process.cwd(), options.toolsDir)\n : path.resolve(process.cwd(), \"agents/tools\");\n const hooksDir = options.hooksDir\n ? path.resolve(process.cwd(), options.hooksDir)\n : path.resolve(process.cwd(), \"agents/hooks\");\n const threadApiDir = options.apiDir\n ? path.resolve(process.cwd(), options.apiDir)\n : path.resolve(process.cwd(), \"agents/api\");\n const modelsDir = options.modelsDir\n ? path.resolve(process.cwd(), options.modelsDir)\n : path.resolve(process.cwd(), \"agents/models\");\n const promptsDir = options.promptsDir\n ? path.resolve(process.cwd(), options.promptsDir)\n : path.resolve(process.cwd(), \"agents/prompts\");\n const agentsDir = options.agentsDir\n ? path.resolve(process.cwd(), options.agentsDir)\n : path.resolve(process.cwd(), \"agents/agents\");\n const outputDir = path.resolve(process.cwd(), \".agents\");\n\n // Type generation configuration\n const typeGenConfig = {\n modelsDir,\n promptsDir,\n agentsDir,\n toolsDir,\n outputDir,\n };\n\n // Helper to regenerate types\n function regenerateTypes() {\n if (needsRegeneration(typeGenConfig)) {\n generateTypes(typeGenConfig);\n }\n }\n\n // Read and prepare rou3 code for inlining\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const rou3Path = path.join(__dirname, '../dist/rou3.js');\n let rou3Code = '';\n try {\n rou3Code = fs.readFileSync(rou3Path, 'utf-8')\n // Remove export statement\n .replace(/^export \\{[^}]+\\};?\\s*$/gm, '')\n // Remove sourcemap comments\n .replace(/\\/\\/# sourceMappingURL=.+$/gm, '')\n .trim();\n } catch (err) {\n console.warn('[vite-plugin-agent] Could not read rou3.js for inlining:', err);\n }\n\n let routesVersion = Math.random().toString(36).substring(7);\n\n // Helper to dynamically find the worker environment (non-client environment)\n // The actual environment name comes from the user's wrangler.jsonc 'name' property\n // and is transformed to snake_case by the Cloudflare Vite plugin\n function getWorkerEnvironment(server: ViteDevServer) {\n const envNames = Object.keys(server.environments);\n // Find the first environment that's not 'client' (the default client environment)\n const workerEnvName = envNames.find(name => name !== 'client');\n\n if (!workerEnvName) {\n console.warn('[vite-plugin-agent] Could not find worker environment');\n return null;\n }\n\n return server.environments[workerEnvName];\n }\n\n // Helper functions for module reloading\n function reloadToolsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const toolsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_TOOLS_ID\n );\n if (toolsModule) {\n workerEnv.reloadModule(toolsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:tools-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadRoutesModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routesModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTES_ID\n );\n if (routesModule) {\n routesVersion = Math.random().toString(36).substring(7);\n workerEnv.reloadModule(routesModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:routes-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n function reloadHooksModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const hooksModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_HOOKS_ID\n );\n if (hooksModule) {\n workerEnv.reloadModule(hooksModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:hooks-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadModelsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const modelsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODELS_ID\n );\n if (modelsModule) {\n await workerEnv.reloadModule(modelsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:models-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadPromptsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const promptsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_PROMPTS_ID\n );\n if (promptsModule) {\n await workerEnv.reloadModule(promptsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:prompts-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadAgentsModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const agentsModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_AGENTS_ID\n );\n if (agentsModule) {\n await workerEnv.reloadModule(agentsModule);\n server.ws.send({\n type: \"custom\",\n event: \"agent:agents-updated\",\n data: { timestamp: Date.now() },\n });\n return true;\n }\n return false;\n }\n\n async function reloadRouterModule(server: ViteDevServer) {\n const workerEnv = getWorkerEnvironment(server);\n if (!workerEnv) return false;\n\n const routerModule = workerEnv.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_ROUTER_ID\n );\n if (routerModule) {\n await workerEnv.reloadModule(routerModule);\n return true;\n }\n return false;\n }\n\n function handleFileChange(\n file: string,\n server: ViteDevServer\n ) {\n const isToolFile = file.startsWith(toolsDir) && file.endsWith(\".ts\");\n const isThreadApiFile = file.startsWith(threadApiDir) && file.endsWith(\".ts\");\n const isHookFile = file.startsWith(hooksDir) && file.endsWith(\".ts\");\n const isModelFile = file.startsWith(modelsDir) && file.endsWith(\".ts\");\n const isPromptFile = file.startsWith(promptsDir) && file.endsWith(\".ts\");\n const isAgentFile = file.startsWith(agentsDir) && file.endsWith(\".ts\");\n\n const isConfigFile = isModelFile || isPromptFile || isAgentFile;\n\n if (!isToolFile && !isThreadApiFile && !isHookFile && !isConfigFile) return;\n\n // Regenerate types when config files change\n if (isConfigFile || isToolFile) {\n regenerateTypes();\n }\n\n if (isToolFile) {\n reloadToolsModule(server);\n }\n\n if (isModelFile) {\n reloadModelsModule(server);\n }\n\n if (isPromptFile) {\n reloadPromptsModule(server);\n }\n\n if (isAgentFile) {\n reloadAgentsModule(server);\n }\n\n if (isThreadApiFile) {\n reloadRoutesModule(server);\n }\n\n if (isHookFile) {\n reloadHooksModule(server);\n }\n }\n\n return {\n name: \"vite-plugin-agent\",\n enforce: \"pre\" as const,\n\n config() {\n // EXCLUDE our packages from pre-bundling - they contain cloudflare:workers\n // imports that can't be resolved during Vite's dependency optimization phase.\n // The Cloudflare Vite plugin handles these specially in the worker environment.\n const depsToExclude = [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n '@standardagents/builder/image-processing',\n // WASM image processing deps - must be excluded to avoid pre-bundle cache issues\n '@cf-wasm/photon',\n '@cf-wasm/photon/workerd',\n '@jsquash/avif',\n '@jsquash/jpeg',\n '@jsquash/png',\n '@jsquash/webp',\n '@standardagents/sip',\n ];\n\n // INCLUDE common dependencies that are used by the builder package\n // This prevents dynamic discovery during dev which causes cache invalidation errors\n const depsToInclude = [\n 'zod',\n 'openai',\n ];\n\n return {\n optimizeDeps: {\n // Exclude our packages from pre-bundling - they contain cloudflare:workers imports\n // that cannot be resolved during dependency optimization\n exclude: depsToExclude,\n // Include common deps upfront to prevent re-optimization during dev\n include: depsToInclude,\n },\n ssr: {\n // noExternal ensures Vite transforms these instead of leaving as external\n // The Cloudflare plugin handles the actual bundling and knows about cloudflare:workers\n noExternal: [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n ],\n },\n };\n },\n\n // Apply exclusions and inclusions to ALL environments including Cloudflare worker\n configEnvironment(name, config) {\n const depsToExclude = [\n '@standardagents/builder',\n '@standardagents/builder/runtime',\n '@standardagents/builder/built-in-routes',\n '@standardagents/builder/image-processing',\n // WASM image processing deps\n '@cf-wasm/photon',\n '@cf-wasm/photon/workerd',\n '@jsquash/avif',\n '@jsquash/jpeg',\n '@jsquash/png',\n '@jsquash/webp',\n '@standardagents/sip',\n ];\n\n // Include common deps upfront to prevent re-optimization during dev\n const depsToInclude = [\n 'zod',\n 'openai',\n ];\n\n // Ensure these are excluded from optimization in all environments\n config.optimizeDeps = config.optimizeDeps || {};\n config.optimizeDeps.exclude = [\n ...(config.optimizeDeps.exclude || []),\n ...depsToExclude.filter(dep => !config.optimizeDeps?.exclude?.includes(dep)),\n ];\n config.optimizeDeps.include = [\n ...(config.optimizeDeps.include || []),\n ...depsToInclude.filter(dep => !config.optimizeDeps?.include?.includes(dep)),\n ];\n },\n\n resolveId(id) {\n if (id === VIRTUAL_TOOLS_ID) {\n return RESOLVED_VIRTUAL_TOOLS_ID;\n }\n if (id === VIRTUAL_ROUTES_ID || id === VIRTUAL_ROUTER_ID) {\n return RESOLVED_VIRTUAL_ROUTES_ID;\n }\n if (id === VIRTUAL_HOOKS_ID) {\n return RESOLVED_VIRTUAL_HOOKS_ID;\n }\n if (id === VIRTUAL_CONFIG_ID) {\n return RESOLVED_VIRTUAL_CONFIG_ID;\n }\n if (id === VIRTUAL_THREAD_API_ID) {\n return RESOLVED_VIRTUAL_THREAD_API_ID;\n }\n if (id === VIRTUAL_MODELS_ID) {\n return RESOLVED_VIRTUAL_MODELS_ID;\n }\n if (id === VIRTUAL_PROMPTS_ID) {\n return RESOLVED_VIRTUAL_PROMPTS_ID;\n }\n if (id === VIRTUAL_AGENTS_ID) {\n return RESOLVED_VIRTUAL_AGENTS_ID;\n }\n if (id === VIRTUAL_BUILDER_ID) {\n return RESOLVED_VIRTUAL_BUILDER_ID;\n }\n },\n\n async load(id) {\n\n if (id === RESOLVED_VIRTUAL_TOOLS_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n const moduleCode = `// Virtual agent tools module\nexport const tools = {\n${toolsCode}\n};`;\n return moduleCode;\n }\n\n if (id === RESOLVED_VIRTUAL_ROUTES_ID) {\n // Scan user thread API directory\n const threadRoutes = scanApiDirectory(threadApiDir);\n\n // Generate user thread route registration code\n const threadRouteCode = threadRoutes\n .map(({ method, route, importPath }) => {\n const apiRoute = `/api/threads/:id${route}`;\n return ` addRoute(\n router,\n \"${method}\",\n \"${apiRoute}\",\n /* v${routesVersion} */ async () => (await import(\"${importPath}\")).default\n );`;\n })\n .join('\\n');\n\n return `// Inline rou3 router code (no external imports)\n${rou3Code}\n\nimport { registerBuiltInRoutes } from \"@standardagents/builder/built-in-routes\";\nimport { config } from \"virtual:@standardagents-config\";\nimport { tools } from \"virtual:@standardagents-tools\";\nimport { hooks } from \"virtual:@standardagents-hooks\";\nimport { models, modelNames } from \"virtual:@standardagents-models\";\nimport { prompts, promptNames } from \"virtual:@standardagents-prompts\";\nimport { agents, agentNames } from \"virtual:@standardagents-agents\";\nimport { requireAuth } from \"@standardagents/builder/runtime\";\n\nconst MOUNT_POINT = \"${mountPoint}\";\n\n// Routes that don't require authentication\nconst PUBLIC_ROUTES = [\n '/api/auth/login',\n '/api/auth/config',\n '/api/auth/oauth/github',\n '/api/auth/oauth/google',\n '/api/auth/oauth/github/callback',\n '/api/auth/oauth/google/callback'\n];\n\n// Check if a route is public (no auth required)\nfunction isPublicRoute(routePath) {\n // Exact match for auth routes\n if (PUBLIC_ROUTES.includes(routePath)) {\n return true;\n }\n\n // Thread routes are always public\n if (routePath.startsWith('/api/threads/') || routePath === '/api/threads') {\n return true;\n }\n\n return false;\n}\n\nexport async function router(request, env) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Check if request is under mount point\n if (!pathname.startsWith(MOUNT_POINT)) {\n return null;\n }\n\n // Strip mount point prefix for route matching, ensuring we keep the leading slash\n let routePath = pathname.slice(MOUNT_POINT.length) || \"/\";\n if (!routePath.startsWith('/')) {\n routePath = '/' + routePath;\n }\n\n // Handle API routes\n const router = createRouter();\n\n // Register built-in API routes with runtime data\n registerBuiltInRoutes(router, { config, tools, models, modelNames, prompts, promptNames, agents, agentNames });\n\n // Register user thread API routes\n${threadRouteCode}\n\n const routeMatch = findRoute(\n router,\n request.method.toUpperCase(),\n routePath\n );\n\n if (routeMatch) {\n // Check if authentication is required for this route\n const publicRoute = isPublicRoute(routePath);\n const isApiRoute = routePath.startsWith('/api/');\n\n let authContext = null;\n\n // Require authentication for all API routes except public ones\n if (isApiRoute && !publicRoute) {\n const authResult = await requireAuth(request, env);\n\n // If requireAuth returns a Response, it's an error (401)\n if (authResult instanceof Response) {\n return authResult;\n }\n\n authContext = authResult;\n }\n\n const controller = await routeMatch.data();\n const context = {\n req: request,\n params: routeMatch.params || {},\n env: env,\n url: url,\n config,\n tools,\n auth: authContext, // Add auth context to controller context\n };\n const result = await controller(context);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // Serve UI for all other routes (SPA fallback)\n return serveUI(routePath, env);\n}\n\nasync function serveUI(pathname, env) {\n try {\n // Use Cloudflare Workers Assets binding (automatically created from wrangler assets config)\n if (env.ASSETS) {\n try {\n // Create a proper request for the asset path\n // Use a dummy origin since we only care about the path\n // Re-add mount point since pathname was stripped by router\n const assetUrl = \\`http://localhost\\${MOUNT_POINT}\\${pathname}\\`;\n let response = await env.ASSETS.fetch(assetUrl);\n\n // If not found, fall back to index.html for SPA routing\n const isIndexHtml = response.status === 404 || pathname === \"/\" || !pathname.includes(\".\");\n if (isIndexHtml) {\n response = await env.ASSETS.fetch(\\`http://localhost\\${MOUNT_POINT}/index.html\\`);\n\n // Transform HTML to use configured mount point\n if (response.status === 200) {\n const html = await response.text();\n // Replace default /agents/ paths with configured mount point\n const modifiedHtml = html.replace(/\\\\/agents\\\\//g, \\`\\${MOUNT_POINT}/\\`);\n return new Response(modifiedHtml, {\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n },\n });\n }\n }\n\n return response;\n } catch (assetError) {\n console.error(\"Error fetching from ASSETS:\", assetError);\n }\n }\n\n // Fallback: proxy to UI dev server if explicitly configured\n if (env.UI_DEV_SERVER) {\n const assetPath = pathname === \"/\" ? \"/index.html\" : pathname;\n const response = await fetch(\\`\\${env.UI_DEV_SERVER}\\${assetPath}\\`);\n return response;\n }\n\n // In production/dev, assets should be served by Cloudflare Workers automatically\n // This function only handles fallback cases\n return null;\n } catch (error) {\n console.error(\"Error serving UI:\", error);\n return null;\n }\n}\n\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_HOOKS_ID) {\n const hooks = await scanHooksDirectory(hooksDir);\n\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n return `// Virtual agent hooks module\nexport const hooks = {\n${hooksCode}\n};`;\n }\n\n if (id === RESOLVED_VIRTUAL_CONFIG_ID) {\n // Get relative paths from cwd\n const relativeToolsDir = path.relative(process.cwd(), toolsDir).replace(/\\\\/g, \"/\");\n const relativeHooksDir = path.relative(process.cwd(), hooksDir).replace(/\\\\/g, \"/\");\n const relativeApiDir = path.relative(process.cwd(), threadApiDir).replace(/\\\\/g, \"/\");\n const relativeModelsDir = path.relative(process.cwd(), modelsDir).replace(/\\\\/g, \"/\");\n const relativePromptsDir = path.relative(process.cwd(), promptsDir).replace(/\\\\/g, \"/\");\n const relativeAgentsDir = path.relative(process.cwd(), agentsDir).replace(/\\\\/g, \"/\");\n\n return `// Virtual agent config module\nexport const config = {\n toolsDir: \"${relativeToolsDir}\",\n hooksDir: \"${relativeHooksDir}\",\n apiDir: \"${relativeApiDir}\",\n modelsDir: \"${relativeModelsDir}\",\n promptsDir: \"${relativePromptsDir}\",\n agentsDir: \"${relativeAgentsDir}\",\n mountPoint: \"${mountPoint}\",\n};`;\n }\n\n // Virtual modules for models, prompts, and agents\n if (id === RESOLVED_VIRTUAL_MODELS_ID) {\n const models = await scanModelsDirectory(modelsDir);\n\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent models module\nexport const models = {\n${modelsCode}\n};\n\nexport const modelNames = ${JSON.stringify(models.filter(m => !m.error).map(m => m.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_PROMPTS_ID) {\n const prompts = await scanPromptsDirectory(promptsDir);\n\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent prompts module\nexport const prompts = {\n${promptsCode}\n};\n\nexport const promptNames = ${JSON.stringify(prompts.filter(p => !p.error).map(p => p.name))};\n`;\n }\n\n if (id === RESOLVED_VIRTUAL_AGENTS_ID) {\n const agents = await scanAgentsDirectory(agentsDir);\n\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${importPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Virtual agent agents module\nexport const agents = {\n${agentsCode}\n};\n\nexport const agentNames = ${JSON.stringify(agents.filter(a => !a.error).map(a => a.name))};\n`;\n }\n\n // Consolidated virtual module: virtual:@standardagents/builder\n // Exports DurableThread and DurableAgentBuilder classes with methods already implemented\n if (id === RESOLVED_VIRTUAL_BUILDER_ID) {\n const tools = await scanToolsDirectory(toolsDir);\n const hooks = await scanHooksDirectory(hooksDir);\n const models = await scanModelsDirectory(modelsDir);\n const prompts = await scanPromptsDirectory(promptsDir);\n const agents = await scanAgentsDirectory(agentsDir);\n\n // Helper to convert relative paths to absolute paths\n // Virtual modules need absolute paths since relative paths are resolved against the virtual module location\n const toAbsolutePath = (relativePath: string) => {\n if (relativePath.startsWith('./')) {\n return path.resolve(process.cwd(), relativePath).replace(/\\\\/g, '/');\n }\n return relativePath;\n };\n\n // Generate tools code\n const toolsCode = tools\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => [\"${escapedError}\", null, async () => ({ status: \"error\", error: \"Tool validation failed\" })],`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import tool ${name}:', error);\n return [\"Failed to load tool: \" + error.message, null, async () => ({ status: \"error\", error: \"Import failed\" })];\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate hooks code\n const hooksCode = hooks\n .map(({ name, importPath }) => {\n const absPath = toAbsolutePath(importPath);\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('[Hooks] Failed to import hook ${name}:', error);\n return null;\n }\n },`;\n })\n .join(\"\\n\");\n\n // Generate models code\n const modelsCode = models\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import model ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate prompts code\n const promptsCode = prompts\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import prompt ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n // Generate agents code\n const agentsCode = agents\n .map(({ name, importPath, error }) => {\n const absPath = toAbsolutePath(importPath);\n if (error) {\n const escapedError = error.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n return ` \"${name}\": async () => { throw new Error(\"${escapedError}\"); },`;\n } else {\n return ` \"${name}\": async () => {\n try {\n return (await import(\"${absPath}\")).default;\n } catch (error) {\n console.error('Failed to import agent ${name}:', error);\n throw error;\n }\n },`;\n }\n })\n .join(\"\\n\");\n\n return `// Consolidated virtual module: virtual:@standardagents/builder\n// Provides DurableThread, DurableAgentBuilder, and router\nimport { DurableThread as _BaseDurableThread } from '@standardagents/builder/runtime';\nimport { DurableAgentBuilder as _BaseDurableAgentBuilder } from '@standardagents/builder/runtime';\n\n// Import sip WASM module and initializer\n// Static import allows workerd to pre-compile the WASM at bundle time\nimport _sipWasm from '@standardagents/sip/dist/sip.wasm';\nimport { initWithWasmModule as _initSipWasm } from '@standardagents/sip';\n\n// Re-export router from virtual:@standardagents-routes\nexport { router } from 'virtual:@standardagents-routes';\n\n// Registry objects\nconst _tools = {\n${toolsCode}\n};\n\nconst _hooks = {\n${hooksCode}\n};\n\nconst _models = {\n${modelsCode}\n};\n\nconst _prompts = {\n${promptsCode}\n};\n\nconst _agents = {\n${agentsCode}\n};\n\n/**\n * DurableThread with all virtual module methods already implemented.\n * Simply extend this class in your agents/Thread.ts file.\n */\nexport class DurableThread extends _BaseDurableThread {\n constructor(ctx, env) {\n super(ctx, env);\n // Initialize sip WASM in DO constructor\n // blockConcurrencyWhile ensures WASM is ready before handling any requests\n // Pass the statically imported WASM module for workerd to pre-compile\n ctx.blockConcurrencyWhile(async () => {\n await _initSipWasm(_sipWasm);\n });\n }\n\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n\n/**\n * DurableAgentBuilder with all virtual module methods already implemented.\n * Simply extend this class in your agents/AgentBuilder.ts file.\n */\nexport class DurableAgentBuilder extends _BaseDurableAgentBuilder {\n tools() {\n return _tools;\n }\n\n hooks() {\n return _hooks;\n }\n\n models() {\n return _models;\n }\n\n prompts() {\n return _prompts;\n }\n\n agents() {\n return _agents;\n }\n}\n`;\n }\n },\n\n buildStart() {\n // Generate types on startup\n regenerateTypes();\n\n // Watch all directories\n this.addWatchFile(toolsDir);\n this.addWatchFile(threadApiDir);\n this.addWatchFile(hooksDir);\n this.addWatchFile(modelsDir);\n this.addWatchFile(promptsDir);\n this.addWatchFile(agentsDir);\n },\n\n configureServer(server) {\n // Watch for new files being added\n server.watcher.on(\"add\", async (file) => {\n handleFileChange(file, server);\n });\n\n // Watch for files being deleted\n server.watcher.on(\"unlink\", (file) => {\n handleFileChange(file, server);\n });\n\n // Add middleware to serve AgentBuilder UI\n // This emulates how Cloudflare Workers Assets binding works in production\n server.middlewares.use(async (req, res, next) => {\n const url = req.url;\n\n // Check if request is under mount point\n if (!url || !url.startsWith(mountPoint)) {\n next();\n return;\n }\n\n // Strip mount point prefix, ensuring we keep the leading slash\n let pathWithoutMount = url.slice(mountPoint.length) || '/';\n if (!pathWithoutMount.startsWith('/')) {\n pathWithoutMount = '/' + pathWithoutMount;\n }\n\n // Handle dev-only API routes that require filesystem access\n // These endpoints write to the filesystem and must be handled in Node.js\n const method = req.method?.toUpperCase();\n\n // GET /api/models - List all models (handled here to read fresh from filesystem)\n if (pathWithoutMount === '/api/models' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const modelList = files.map((file: string) => {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getProvider = (c: string) => c.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getInputPrice = (c: string) => {\n const match = c.match(/inputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getOutputPrice = (c: string) => {\n const match = c.match(/outputPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getCachedPrice = (c: string) => {\n const match = c.match(/cachedPrice:\\s*([\\d.]+)/);\n return match ? parseFloat(match[1]) : undefined;\n };\n const getIncludedProviders = (c: string) => {\n const match = c.match(/includedProviders:\\s*\\[([^\\]]*)\\]/);\n if (!match) return undefined;\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getFallbacks = (c: string) => {\n const match = c.match(/fallbacks:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const fallbacks = getFallbacks(content);\n const fallbackObjects = fallbacks.map((fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n }));\n\n return {\n id: name,\n name: name,\n provider: getProvider(content),\n model: getModel(content),\n input_price: getInputPrice(content),\n output_price: getOutputPrice(content),\n cached_price: getCachedPrice(content),\n included_providers: getIncludedProviders(content),\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading model ${file}:`, error);\n return null;\n }\n });\n\n const validModels = modelList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ models: validModels }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list models' }));\n return;\n }\n }\n\n // POST /api/models - Create a new model\n if (pathWithoutMount === '/api/models' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n const validationError = validateModelData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if model already exists\n if (modelExists(modelsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Model '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveModel(modelsDir, body, false);\n\n if (result.success) {\n // Reload the models virtual module to reflect the new model\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create model' }));\n return;\n }\n }\n\n // PUT /api/models/:name - Update an existing model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelPutMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelPutMatch && method === 'PUT') {\n try {\n const urlModelName = decodeURIComponent(modelPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformModelData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlModelName;\n\n const validationError = validateModelData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n\n if (isNameChange) {\n // Rename the model file first\n const renameResult = await renameModel(modelsDir, urlModelName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update model references in all prompts\n updatedPrompts = await updateModelReferencesInPrompts(promptsDir, urlModelName, newName);\n }\n\n // Save the updated model data\n const result = await saveModel(modelsDir, body, true);\n\n if (result.success) {\n // Reload the models virtual module to reflect the changes\n await reloadModelsModule(server);\n\n // If prompts were updated due to cascade, reload prompts module too\n if (updatedPrompts.length > 0) {\n await reloadPromptsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n // Small delay to ensure filesystem operations are fully flushed\n await new Promise(resolve => setTimeout(resolve, 100));\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n model: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlModelName, to: newName }, updatedPrompts }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update model' }));\n return;\n }\n }\n\n // DELETE /api/models/:name - Delete a model\n // Use (.+) to capture model names with slashes (e.g., x-ai/grok-4-fast)\n const modelDeleteMatch = pathWithoutMount.match(/^\\/api\\/models\\/(.+)$/);\n if (modelDeleteMatch && method === 'DELETE') {\n try {\n const modelName = decodeURIComponent(modelDeleteMatch[1]);\n const result = await deleteModel(modelsDir, modelName);\n\n if (result.success) {\n // Reload the models virtual module to reflect the deletion\n await reloadModelsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: modelName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete model' }));\n return;\n }\n }\n\n // GET /api/prompts - List all prompts (read fresh from filesystem)\n if (pathWithoutMount === '/api/prompts' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(promptsDir)\n ? fs.readdirSync(promptsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n // Load models for lookup\n const modelFiles = fs.existsSync(modelsDir)\n ? fs.readdirSync(modelsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n const modelMap: Record<string, { name: string; provider: string }> = {};\n for (const file of modelFiles) {\n try {\n const filePath = path.join(modelsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n const name = content.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const provider = content.match(/provider:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n if (name) {\n modelMap[name] = { name, provider: provider || 'unknown' };\n }\n } catch (error) {\n // Skip failed models\n }\n }\n\n const promptList = files.map((file: string) => {\n try {\n const filePath = path.join(promptsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getToolDescription = (c: string) => c.match(/toolDescription:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getModel = (c: string) => c.match(/model:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getIncludeChat = (c: string) => c.match(/includeChat:\\s*(true|false)/)?.[1] === 'true';\n const getIncludePastTools = (c: string) => c.match(/includePastTools:\\s*(true|false)/)?.[1] === 'true';\n const getParallelToolCalls = (c: string) => c.match(/parallelToolCalls:\\s*(true|false)/)?.[1] === 'true';\n const getToolChoice = (c: string) => c.match(/toolChoice:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getBeforeTool = (c: string) => c.match(/beforeTool:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getAfterTool = (c: string) => c.match(/afterTool:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTools = (c: string) => {\n const match = c.match(/tools:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n const getHandoffAgents = (c: string) => {\n const match = c.match(/handoffAgents:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n // Extract prompt content - handle multi-line backtick strings\n const getPrompt = (c: string) => {\n // Try backtick string first (can be multi-line)\n const backtickMatch = c.match(/prompt:\\s*`([\\s\\S]*?)`/);\n if (backtickMatch) return backtickMatch[1];\n // Try single/double quoted string\n const quotedMatch = c.match(/prompt:\\s*['\"]([^'\"]*)['\"]/);\n if (quotedMatch) return quotedMatch[1];\n // Try array literal (StructuredPrompt)\n const arrayMatch = c.match(/prompt:\\s*(\\[[\\s\\S]*?\\])/);\n if (arrayMatch) return arrayMatch[1];\n return '';\n };\n\n const name = getName(content);\n if (!name) return null;\n\n const modelId = getModel(content);\n const modelDef = modelId ? modelMap[modelId] : null;\n\n return {\n id: name,\n name: name,\n tool_description: getToolDescription(content) || '',\n prompt: getPrompt(content),\n required_schema: null, // Complex to parse, skip for now\n model_id: modelId || '',\n model_name: modelDef?.name || modelId || '',\n model_provider: modelDef?.provider || 'unknown',\n include_chat: getIncludeChat(content),\n include_past_tools: getIncludePastTools(content),\n parallel_tool_calls: getParallelToolCalls(content),\n tool_choice: getToolChoice(content) || 'auto',\n before_tool: getBeforeTool(content) || null,\n after_tool: getAfterTool(content) || null,\n tools: getTools(content),\n prompts: getHandoffAgents(content),\n reasoning: null, // Complex to parse\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading prompt ${file}:`, error);\n return null;\n }\n });\n\n const validPrompts = promptList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ prompts: validPrompts }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list prompts' }));\n return;\n }\n }\n\n // POST /api/prompts - Create a new prompt\n if (pathWithoutMount === '/api/prompts' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n const validationError = validatePromptData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if prompt already exists\n if (promptExists(promptsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Prompt '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await savePrompt(promptsDir, body, false);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the new prompt\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create prompt' }));\n return;\n }\n }\n\n // PUT /api/prompts/:name - Update an existing prompt\n const promptPutMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptPutMatch && method === 'PUT') {\n try {\n const urlPromptName = decodeURIComponent(promptPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformPromptData(rawBody);\n\n // Check if name in body differs from URL (name change requested)\n const newName = body.name;\n const isNameChange = newName && newName !== urlPromptName;\n\n const validationError = validatePromptData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n let updatedPrompts: string[] = [];\n let updatedAgents: string[] = [];\n\n if (isNameChange) {\n // Rename the prompt file first\n const renameResult = await renamePrompt(promptsDir, urlPromptName, newName);\n if (!renameResult.success) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: renameResult.error }));\n return;\n }\n\n // Cascade update: update prompt references in other prompts (tools array)\n updatedPrompts = await updatePromptReferencesInPrompts(promptsDir, urlPromptName, newName);\n\n // Cascade update: update prompt references in agents (defaultPrompt field)\n updatedAgents = await updatePromptReferencesInAgents(agentsDir, urlPromptName, newName);\n }\n\n // Save the updated prompt data (will overwrite the renamed file)\n const result = await savePrompt(promptsDir, body, true);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the changes\n await reloadPromptsModule(server);\n\n // If agents were updated due to cascade, reload agents module too\n if (updatedAgents.length > 0) {\n await reloadAgentsModule(server);\n }\n\n // Reload router to pick up new module bindings\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n prompt: body,\n filePath: result.filePath,\n ...(isNameChange && { renamed: { from: urlPromptName, to: newName }, updatedPrompts, updatedAgents }),\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update prompt' }));\n return;\n }\n }\n\n // DELETE /api/prompts/:name - Delete a prompt\n const promptDeleteMatch = pathWithoutMount.match(/^\\/api\\/prompts\\/([^/]+)$/);\n if (promptDeleteMatch && method === 'DELETE') {\n try {\n const promptName = decodeURIComponent(promptDeleteMatch[1]);\n const result = await deletePrompt(promptsDir, promptName);\n\n if (result.success) {\n // Reload the prompts virtual module to reflect the deletion\n await reloadPromptsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: promptName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete prompt' }));\n return;\n }\n }\n\n // GET /api/agents - List all agents (read fresh from filesystem)\n if (pathWithoutMount === '/api/agents' && method === 'GET') {\n try {\n const fs = await import('node:fs');\n const files = fs.existsSync(agentsDir)\n ? fs.readdirSync(agentsDir).filter((f: string) => f.endsWith('.ts'))\n : [];\n\n const agentList = files.map((file: string) => {\n try {\n const filePath = path.join(agentsDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Parse values from the TypeScript file using regex\n const getName = (c: string) => c.match(/name:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTitle = (c: string) => c.match(/title:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getType = (c: string) => c.match(/type:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getDefaultPrompt = (c: string) => c.match(/defaultPrompt:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getDefaultModel = (c: string) => c.match(/defaultModel:\\s*['\"]([^'\"]+)['\"]/)?.[1];\n const getTools = (c: string) => {\n const match = c.match(/tools:\\s*\\[([^\\]]*)\\]/);\n if (!match) return [];\n const items = match[1].match(/['\"]([^'\"]+)['\"]/g);\n return items ? items.map(s => s.replace(/['\"]/g, '')) : [];\n };\n\n const name = getName(content);\n if (!name) return null;\n\n return {\n id: name,\n name: name,\n title: getTitle(content) || name,\n type: getType(content) || 'ai_human',\n default_prompt: getDefaultPrompt(content) || '',\n default_model: getDefaultModel(content) || '',\n tools: getTools(content),\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading agent ${file}:`, error);\n return null;\n }\n });\n\n const validAgents = agentList.filter(Boolean);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ agents: validAgents }));\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to list agents' }));\n return;\n }\n }\n\n // POST /api/agents - Create a new agent\n if (pathWithoutMount === '/api/agents' && method === 'POST') {\n try {\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n const validationError = validateAgentData(body);\n\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // Check if agent already exists\n if (agentExists(agentsDir, body.name)) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `Agent '${body.name}' already exists. Use PUT to update.` }));\n return;\n }\n\n const result = await saveAgent(agentsDir, body, false);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the new agent\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to create agent' }));\n return;\n }\n }\n\n // PUT /api/agents/:name - Update an existing agent\n const agentPutMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentPutMatch && method === 'PUT') {\n try {\n const agentName = decodeURIComponent(agentPutMatch[1]);\n const rawBody = await parseRequestBody(req);\n // Transform snake_case from UI to camelCase for internal use\n const body = transformAgentData(rawBody);\n\n // Ensure the name in the body matches the URL (or use URL name)\n body.name = agentName;\n\n const validationError = validateAgentData(body);\n if (validationError) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: validationError }));\n return;\n }\n\n // For updates, the agent should exist (but we allow overwrite)\n const result = await saveAgent(agentsDir, body, true);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the changes\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n agent: body,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to update agent' }));\n return;\n }\n }\n\n // DELETE /api/agents/:name - Delete an agent\n const agentDeleteMatch = pathWithoutMount.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentDeleteMatch && method === 'DELETE') {\n try {\n const agentName = decodeURIComponent(agentDeleteMatch[1]);\n const result = await deleteAgent(agentsDir, agentName);\n\n if (result.success) {\n // Reload the agents virtual module to reflect the deletion\n await reloadAgentsModule(server);\n await reloadRouterModule(server);\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({\n success: true,\n deleted: agentName,\n filePath: result.filePath,\n }));\n } else {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n }\n return;\n } catch (error: any) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: error.message || 'Failed to delete agent' }));\n return;\n }\n }\n\n // Let other API routes pass through to the worker\n if (pathWithoutMount.startsWith('/api/')) {\n next();\n return;\n }\n\n // Check for UI dev server proxy mode (for HMR during development)\n // Only proxy non-API routes (UI assets, SPA routes)\n const uiDevServer = process.env.UI_DEV_SERVER;\n if (uiDevServer && !pathWithoutMount.startsWith('/api/')) {\n // In HMR mode, proxy UI requests to the Vite dev server\n // pathWithoutMount already has leading slash (e.g., '/index.html')\n // UI dev server runs with VITE_BASE matching our mountPoint\n const targetUrl = `${uiDevServer}${pathWithoutMount}`;\n try {\n const proxyRes = await fetch(targetUrl);\n res.statusCode = proxyRes.status;\n\n // Forward response headers (except those that shouldn't be forwarded)\n proxyRes.headers.forEach((value, key) => {\n if (!['content-encoding', 'transfer-encoding'].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n const body = await proxyRes.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n } catch (error) {\n console.error('[agentbuilder] Failed to proxy to UI dev server:', error);\n // Fall through to static file serving as fallback\n }\n }\n\n // Check if this is a static asset request\n const isStaticAsset = pathWithoutMount.startsWith('/assets/') ||\n pathWithoutMount.startsWith('/vendor.js') ||\n pathWithoutMount.startsWith('/vue.js') ||\n pathWithoutMount.startsWith('/monaco.js') ||\n pathWithoutMount.startsWith('/index.js') ||\n pathWithoutMount.startsWith('/index.css') ||\n pathWithoutMount.match(/\\.(js|css|png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/);\n\n // For static assets, serve the actual file\n // For all other routes (including SPA routes like /login, /threads, etc.), serve index.html\n const shouldServeUI = true;\n\n if (shouldServeUI) {\n // Serve from the built client directory\n // Client is always at dist/client relative to package root\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n let filePath: string;\n if (isStaticAsset) {\n // For static assets, serve the actual file\n const cleanUrl = pathWithoutMount.split('?')[0];\n filePath = path.join(clientDir, cleanUrl);\n } else {\n // For all other routes (SPA routes), serve index.html\n filePath = path.join(clientDir, 'index.html');\n }\n\n try {\n if (fs.existsSync(filePath)) {\n let content = fs.readFileSync(filePath);\n\n // Inject mount point config into HTML\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n // Set appropriate MIME type\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.ttf': 'font/ttf',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n };\n\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n res.setHeader('Content-Type', contentType);\n res.end(content);\n return;\n }\n } catch (error) {\n console.error('Error serving AgentBuilder UI:', error);\n }\n }\n\n next();\n });\n },\n\n handleHotUpdate({ file, server }) {\n handleFileChange(file, server);\n },\n\n writeBundle(options, bundle) {\n // In production build, copy client files to user's dist directory\n // Files go to dist/client/{mountPath} to match ASSETS binding expectations\n const outDir = options.dir || 'dist';\n // Put client files in a 'client' subdirectory, preserving mountPath structure\n // This ensures ASSETS can find files at the expected paths (e.g., /agentbuilder/index.html)\n const mountPath = mountPoint.slice(1); // \"agentbuilder\" or \"\"\n const mountDir = mountPath\n ? path.join(outDir, '../client', mountPath) // dist/client/agentbuilder\n : path.join(outDir, '../client'); // dist/client\n\n // Locate the client directory\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const isInDist = currentDir.endsWith('dist');\n const clientDir = path.resolve(\n currentDir,\n isInDist ? './client' : '../dist/client'\n );\n\n if (!fs.existsSync(clientDir)) {\n console.warn(`[agentbuilder] Client directory not found at ${clientDir}`);\n return;\n }\n\n // Create mount directory\n fs.mkdirSync(mountDir, { recursive: true });\n\n // Copy all client files recursively\n function copyRecursive(src: string, dest: string) {\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fs.mkdirSync(destPath, { recursive: true });\n copyRecursive(srcPath, destPath);\n } else {\n let content = fs.readFileSync(srcPath);\n\n // Inject mount point config into index.html\n if (entry.name === 'index.html') {\n const configScript = `<script>window.__AGENTBUILDER_CONFIG__ = { mountPoint: \"${mountPoint}\" };</script>`;\n let htmlContent = content.toString();\n\n // Transform asset paths from default /agents/ to configured mount point\n // Handle special case where mountPoint is '/' to avoid double slashes\n const assetPrefix = mountPoint === '/' ? '/' : `${mountPoint}/`;\n htmlContent = htmlContent.replace(/\\/agents\\//g, assetPrefix);\n\n // Inject config\n htmlContent = htmlContent.replace('</head>', `${configScript}</head>`);\n\n content = Buffer.from(htmlContent);\n }\n\n fs.writeFileSync(destPath, content);\n }\n }\n }\n\n copyRecursive(clientDir, mountDir);\n },\n };\n}\n"]}
|