veryfront 0.0.73 → 0.0.75

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/types/agent.ts", "../../../src/ai/providers/openai.ts", "../../../src/core/errors/veryfront-error.ts", "../../../src/core/utils/runtime-guards.ts", "../../../src/core/utils/logger/env.ts", "../../../src/core/utils/logger/logger.ts", "../../../src/ai/providers/base.ts", "../../../src/ai/providers/anthropic.ts", "../../../src/ai/providers/google.ts", "../../../src/platform/compat/runtime.ts", "../../../src/platform/compat/process.ts", "../../../src/ai/providers/factory.ts", "../../../src/ai/utils/zod-json-schema.ts", "../../../src/ai/utils/tool.ts", "../../../src/ai/runtime/platform.ts", "../../../src/ai/mcp/resource.ts", "../../../src/ai/mcp/prompt.ts", "../../../src/ai/mcp/registry.ts", "../../../src/ai/agent/composition.ts", "../../../src/core/config/schema.ts", "../../../src/core/config/loader.ts", "../../../deno.json", "../../../src/core/utils/version.ts", "../../../src/core/utils/constants/cdn.ts", "../../../src/core/config/defaults.ts", "../../../src/core/utils/constants/server.ts", "../../../src/platform/adapters/mock.ts", "../../../src/platform/compat/fs.ts", "../../../src/platform/compat/path-helper.ts", "../../../src/ai/utils/discovery.ts", "../../../src/ai/utils/id.ts", "../../../src/ai/agent/memory.ts", "../../../src/core/utils/constants/cache.ts", "../../../src/core/utils/constants/http.ts", "../../../src/core/utils/constants/hmr.ts", "../../../src/core/utils/constants/network.ts", "../../../src/core/utils/paths.ts", "../../../src/core/utils/bundle-manifest.ts", "../../../src/observability/tracing/config.ts", "../../../src/observability/tracing/span-operations.ts", "../../../src/observability/tracing/context-propagation.ts", "../../../src/observability/tracing/manager.ts", "../../../src/observability/tracing/index.ts", "../../../src/ai/agent/runtime.ts", "../../../src/ai/agent/factory.ts", "../../../src/ai/index.ts", "../../../src/ai/adapters/ai-sdk.ts", "../../../src/ai/utils/setup.ts", "../../../src/ai/mcp/server.ts", "../../../src/ai/production/rate-limit/limiter.ts", "../../../src/ai/production/cache/cache.ts", "../../../src/ai/production/cost-tracking/tracker.ts", "../../../src/ai/production/security/validator.ts", "../../../src/ai/workflow/types.ts", "../../../src/ai/workflow/dsl/workflow.ts", "../../../src/ai/workflow/dsl/step.ts", "../../../src/ai/workflow/dsl/parallel.ts", "../../../src/ai/workflow/dsl/branch.ts", "../../../src/ai/workflow/dsl/wait.ts", "../../../src/ai/workflow/backends/types.ts", "../../../src/ai/workflow/backends/memory.ts", "../../../src/ai/workflow/executor/dag-executor.ts", "../../../src/ai/workflow/executor/checkpoint-manager.ts", "../../../src/ai/workflow/executor/step-executor.ts", "../../../src/ai/workflow/executor/workflow-executor.ts", "../../../src/ai/workflow/runtime/approval-manager.ts", "../../../src/ai/workflow/api/workflow-client.ts", "../../../src/ai/workflow/react/use-workflow.ts", "../../../src/ai/workflow/react/use-approval.ts", "../../../src/ai/workflow/react/use-workflow-list.ts", "../../../src/ai/workflow/react/use-workflow-start.ts"],
4
- "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Agent type definitions\n */\n\nimport type { Tool } from \"./tool.ts\";\nimport type { Platform } from \"../runtime/platform.ts\";\nimport type { Memory } from \"../agent/memory.ts\";\n\n/**\n * Supported AI model providers\n */\nexport type ModelProvider = \"openai\" | \"anthropic\" | \"google\" | \"local\";\n\n/**\n * Model configuration string format: \"provider/model-name\"\n * Examples: \"openai/gpt-4\", \"anthropic/claude-3-5-sonnet\"\n */\nexport type ModelString = string;\n\n/**\n * Agent memory configuration\n */\nexport interface MemoryConfig {\n /** Memory type */\n type: \"conversation\" | \"buffer\" | \"summary\";\n\n /** Maximum tokens to store in memory */\n maxTokens?: number;\n\n /** Maximum messages to store */\n maxMessages?: number;\n}\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"idle\"\n | \"thinking\"\n | \"tool_execution\"\n | \"streaming\"\n | \"completed\"\n | \"error\";\n\n/**\n * Agent configuration options\n */\nexport interface AgentConfig {\n /** Unique agent identifier (optional, inferred from filename) */\n id?: string;\n\n /** Model to use (format: \"provider/model-name\") */\n model: ModelString;\n\n /** System prompt or prompt template ID */\n system: string | (() => string) | (() => Promise<string>);\n\n /** Tools available to the agent. Use `true` to enable all discovered tools, or specify individual tools. */\n tools?: true | Record<string, Tool | boolean>;\n\n /** Maximum agent steps before stopping */\n maxSteps?: number;\n\n /** Enable streaming responses */\n streaming?: boolean;\n\n /** Memory configuration */\n memory?: MemoryConfig;\n\n /** Middleware functions */\n middleware?: AgentMiddleware[];\n\n /** Edge-specific configuration */\n edge?: EdgeConfig;\n\n /** Multi-modal support */\n multimodal?: {\n vision?: boolean;\n audio?: boolean;\n };\n}\n\n/**\n * Edge deployment configuration\n */\nexport interface EdgeConfig {\n /** Enable edge optimizations */\n enabled: boolean;\n\n /** Maximum steps for edge (overrides maxSteps) */\n maxSteps?: number;\n\n /** Timeout in milliseconds */\n timeoutMs?: number;\n\n /** Force streaming */\n streaming?: boolean;\n}\n\n/**\n * Agent middleware function\n */\nexport type AgentMiddleware = (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n) => Promise<AgentResponse>;\n\n/**\n * Agent execution context\n */\nexport interface AgentContext {\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model?: string;\n\n /** Input messages or prompt */\n input: string | Message[];\n\n /** Additional context data */\n data?: Record<string, unknown>;\n\n /** Current platform */\n platform: Platform;\n\n /** Request metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Tool call part with args (runtime/server format)\n * Uses `tool-${toolName}` pattern (e.g., \"tool-weather\")\n */\nexport interface ToolCallPartWithArgs {\n type: `tool-${string}`;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Tool call part with input (useChat/client format)\n * Uses `tool-${toolName}` pattern (e.g., \"tool-weather\")\n */\nexport interface ToolCallPartWithInput {\n type: `tool-${string}`;\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Tool call part (AI SDK v5 format)\n * Supports both 'args' (runtime) and 'input' (useChat) field names\n */\nexport type ToolCallPart = ToolCallPartWithArgs | ToolCallPartWithInput;\n\n/**\n * Tool result part (AI SDK v5 format)\n */\nexport interface ToolResultPart {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n}\n\n/**\n * Message part types (AI SDK v5 format)\n * Tool calls use `tool-${toolName}` pattern (e.g., \"tool-weather\")\n * Legacy \"tool-call\" type also supported for backwards compatibility\n */\nexport type MessagePart =\n | { type: \"text\"; text: string }\n | ToolCallPart\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args: Record<string, unknown> }\n | ToolResultPart;\n\n/**\n * Message in a conversation (AI SDK v5 format)\n */\nexport interface Message {\n /** Message ID */\n id: string;\n\n /** Message role */\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n\n /** Message parts (v5 format) */\n parts: MessagePart[];\n\n /** Timestamp */\n timestamp?: number;\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Helper to extract text content from message parts\n */\nexport function getTextFromParts(parts: MessagePart[]): string {\n return parts\n .filter((p): p is MessagePart & { type: \"text\" } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Type guard to check if a tool call part has 'args' field\n */\nexport function hasArgs(part: ToolCallPart): part is ToolCallPartWithArgs {\n return \"args\" in part && part.args !== undefined;\n}\n\n/**\n * Type guard to check if a tool call part has 'input' field\n */\nexport function hasInput(part: ToolCallPart): part is ToolCallPartWithInput {\n return \"input\" in part && part.input !== undefined;\n}\n\n/**\n * Extract tool arguments from a tool call part.\n * Supports both 'args' (runtime/server) and 'input' (useChat/client) formats.\n * Throws if neither field is present.\n */\nexport function getToolArguments(part: ToolCallPart): Record<string, unknown> {\n if (\"args\" in part && part.args !== undefined) {\n return part.args;\n }\n if (\"input\" in part && part.input !== undefined) {\n return part.input;\n }\n // Access properties before TypeScript narrows to never\n const toolName = (part as ToolCallPartWithArgs).toolName;\n const toolCallId = (part as ToolCallPartWithArgs).toolCallId;\n throw new Error(\n `Tool call part for \"${toolName}\" (${toolCallId}) missing both 'args' and 'input' fields`,\n );\n}\n\n/**\n * Tool call emitted during streaming responses.\n * Matches provider streaming payload shape and is parsed into arguments.\n */\nexport interface StreamToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n/**\n * Tool invocation during agent execution\n */\nexport interface ToolCall {\n /** Tool call ID */\n id: string;\n\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args: Record<string, unknown>;\n\n /** Tool execution status */\n status: \"pending\" | \"executing\" | \"completed\" | \"error\";\n\n /** Tool result */\n result?: unknown;\n\n /** Error if tool execution failed */\n error?: string;\n\n /** Execution time in milliseconds */\n executionTime?: number;\n}\n\n/**\n * Agent response\n */\nexport interface AgentResponse {\n /** Generated text */\n text: string;\n\n /** Messages in the conversation */\n messages: Message[];\n\n /** Tool calls made during execution */\n toolCalls: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text (if available) */\n thinking?: string;\n\n /** Usage statistics */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result object returned by agent.stream()\n * Provides toDataStreamResponse() for Vercel AI SDK compatible streaming\n */\nexport interface AgentStreamResult {\n /**\n * Convert the stream to a Response object for streaming responses\n * Compatible with Vercel AI SDK's toDataStreamResponse()\n */\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response;\n}\n\n/**\n * Agent instance (returned by agent() function)\n */\nexport interface Agent {\n /** Agent ID */\n id: string;\n\n /** Agent configuration */\n config: AgentConfig;\n\n /**\n * Generate a response (non-streaming)\n */\n generate(input: {\n input: string | Message[];\n context?: Record<string, unknown>;\n }): Promise<AgentResponse>;\n\n /**\n * Stream a response\n * Returns an AgentStreamResult which extends ReadableStream and adds toDataStreamResponse()\n */\n stream(input: {\n input?: string;\n messages?: Message[];\n context?: Record<string, unknown>;\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n }): Promise<AgentStreamResult>;\n\n /**\n * Respond to an HTTP request\n */\n respond(request: Request): Promise<Response>;\n\n /**\n * Get memory instance\n */\n getMemory(): Memory;\n\n /**\n * Get memory statistics\n */\n getMemoryStats(): Promise<{\n totalMessages: number;\n estimatedTokens: number;\n type: string;\n }>;\n\n /**\n * Clear agent memory\n */\n clearMemory(): Promise<void>;\n}\n", "/**\n * OpenAI provider implementation\n */\n\nimport { z } from \"zod\";\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { CompletionRequest, CompletionResponse, OpenAIConfig } from \"../types/provider.ts\";\n\nconst OpenAIToolCallSchema = z.object({\n id: z.string(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n});\n\nconst OpenAIResponseSchema = z.object({\n choices: z.array(z.object({\n message: z.object({\n content: z.string().nullable().optional(),\n tool_calls: z.array(OpenAIToolCallSchema).optional(),\n }),\n finish_reason: z.string(),\n })).min(1),\n usage: z.object({\n prompt_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n total_tokens: z.number().optional(),\n }).optional(),\n});\n\nexport class OpenAIProvider extends BaseProvider {\n name = \"openai\";\n private apiKey: string;\n private baseURL: string;\n private organizationId?: string;\n\n constructor(config: OpenAIConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://api.openai.com/v1\";\n this.organizationId = config.organizationId;\n }\n\n protected getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Authorization\": `Bearer ${this.apiKey}`,\n };\n\n if (this.organizationId) {\n headers[\"OpenAI-Organization\"] = this.organizationId;\n }\n\n return headers;\n }\n\n protected getEndpoint(path: string): string {\n return `${this.baseURL}${path}`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n stream: request.stream || false,\n };\n\n if (request.system) {\n // Add system message at the beginning\n body.messages = [\n { role: \"system\", content: request.system },\n ...request.messages,\n ];\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n // Disable parallel tool calls to avoid streaming JSON corruption\n // when multiple tool calls are made simultaneously\n body.parallel_tool_calls = false;\n }\n\n return body;\n }\n\n protected transformResponse(response: unknown): CompletionResponse {\n const parsed = OpenAIResponseSchema.safeParse(response);\n\n if (!parsed.success) {\n throw toError(createError({\n type: \"agent\",\n message: `OpenAI: Invalid response format: ${parsed.error.message}`,\n }));\n }\n\n const data = parsed.data;\n const choice = data.choices[0];\n\n if (!choice) {\n throw toError(createError({\n type: \"agent\",\n message: \"OpenAI: No choices in response (unexpected)\",\n }));\n }\n\n const message = choice.message;\n\n const toolCalls = message.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n text: message.content || \"\",\n toolCalls,\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n finishReason: this.mapFinishReason(choice.finish_reason),\n };\n }\n\n private mapFinishReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool_calls\";\n case \"content_filter\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n }\n}\n", "export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nclass ConsoleLogger implements Logger {\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n ) {}\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(`[${this.prefix}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN: ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR: ${message}`, ...args);\n }\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);\n throw error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n", "/**\n * Base provider implementation\n *\n * All provider implementations extend this base class\n */\n\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type {\n CompletionRequest,\n CompletionResponse,\n Provider,\n ProviderConfig,\n} from \"../types/provider.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { z } from \"zod\";\n\nconst OpenAIStreamChunkSchema = z.object({\n choices: z.array(z.object({\n delta: z.object({\n content: z.string().optional().nullable(),\n tool_calls: z.array(z.object({\n index: z.number().optional(),\n id: z.string().optional(),\n function: z.object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n }).optional(),\n })).optional(),\n }),\n finish_reason: z.string().nullable(),\n })).min(1),\n});\n\nexport abstract class BaseProvider implements Provider {\n abstract name: string;\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n this.validateConfig();\n }\n\n /**\n * Validate provider configuration\n */\n protected validateConfig(): void {\n if (!this.config.apiKey) {\n throw toError(createError({\n type: \"agent\",\n message: `${this.name}: API key is required`,\n }));\n }\n }\n\n /**\n * Get headers for API requests\n */\n protected abstract getHeaders(): Record<string, string>;\n\n /**\n * Get API endpoint URL\n */\n protected abstract getEndpoint(path: string): string;\n\n /**\n * Transform request to provider-specific format\n */\n protected abstract transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown>;\n\n /**\n * Transform provider response to standard format\n */\n protected abstract transformResponse(\n response: unknown,\n ): CompletionResponse;\n\n /**\n * Complete a prompt (non-streaming)\n */\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const endpoint = this.getEndpoint(\"/chat/completions\");\n const headers = this.getHeaders();\n const body = this.transformRequest({ ...request, stream: false });\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n ...headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw toError(createError({\n type: \"agent\",\n message: `${this.name} API error (${response.status}): ${error}`,\n }));\n }\n\n const data = await response.json();\n return this.transformResponse(data);\n }\n\n /**\n * Stream a completion\n */\n async stream(request: CompletionRequest): Promise<ReadableStream> {\n const endpoint = this.getEndpoint(\"/chat/completions\");\n const headers = this.getHeaders();\n const body = this.transformRequest({ ...request, stream: true });\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n ...headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw toError(createError({\n type: \"agent\",\n message: `${this.name} API error (${response.status}): ${error}`,\n }));\n }\n\n if (!response.body) {\n throw toError(createError({\n type: \"agent\",\n message: `${this.name}: No response body for streaming`,\n }));\n }\n\n return this.transformStream(response.body);\n }\n\n /**\n * Transform provider stream to standard format\n *\n * Emits JSON chunks with the following structure:\n * - { type: \"content\", content: string }\n * - { type: \"tool_call_start\", toolCall: { id, name, index } }\n * - { type: \"tool_call_delta\", id, arguments }\n * - { type: \"finish\", finishReason }\n */\n protected transformStream(stream: ReadableStream): ReadableStream {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n\n // Track tool calls being accumulated\n const toolCalls = new Map<number, {\n id?: string;\n name?: string;\n arguments: string;\n }>();\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n const raw = JSON.parse(data);\n const result = OpenAIStreamChunkSchema.safeParse(raw);\n\n if (!result.success) {\n // agentLogger.debug(\"Skipping invalid stream chunk schema\", result.error);\n continue;\n }\n\n const choice = result.data.choices[0];\n\n if (!choice) continue;\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n\n // Handle text content\n if (delta?.content) {\n const contentChunk = JSON.stringify({\n type: \"content\",\n content: delta.content,\n });\n controller.enqueue(encoder.encode(contentChunk + \"\\n\"));\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n const index = toolCall.index ?? 0;\n\n if (!toolCalls.has(index)) {\n toolCalls.set(index, { arguments: \"\" });\n }\n\n const tc = toolCalls.get(index)!;\n\n // Tool call start (has id and name)\n if (toolCall.id) {\n tc.id = toolCall.id;\n }\n\n if (toolCall.function?.name) {\n tc.name = toolCall.function.name;\n\n // Emit tool call start event\n const startChunk = JSON.stringify({\n type: \"tool_call_start\",\n toolCall: {\n id: tc.id,\n name: tc.name,\n index,\n },\n });\n controller.enqueue(encoder.encode(startChunk + \"\\n\"));\n }\n\n // Accumulate arguments\n if (toolCall.function?.arguments) {\n tc.arguments += toolCall.function.arguments;\n\n // Emit delta event\n const deltaChunk = JSON.stringify({\n type: \"tool_call_delta\",\n id: tc.id,\n index,\n arguments: toolCall.function.arguments,\n });\n controller.enqueue(encoder.encode(deltaChunk + \"\\n\"));\n }\n }\n }\n\n // Handle finish reason\n if (finishReason) {\n // Emit complete tool calls\n if (finishReason === \"tool_calls\" || finishReason === \"function_call\") {\n for (const [index, tc] of toolCalls.entries()) {\n const completeChunk = JSON.stringify({\n type: \"tool_call_complete\",\n toolCall: {\n id: tc.id!,\n name: tc.name!,\n index,\n arguments: tc.arguments,\n },\n });\n controller.enqueue(encoder.encode(completeChunk + \"\\n\"));\n }\n }\n\n // Emit finish event\n const finishChunk = JSON.stringify({\n type: \"finish\",\n finishReason,\n });\n controller.enqueue(encoder.encode(finishChunk + \"\\n\"));\n }\n } catch (e) {\n // Skip invalid JSON\n agentLogger.warn(\"Failed to parse stream chunk:\", e);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n}\n", "/**\n * Anthropic provider implementation\n */\n\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { AnthropicConfig, CompletionRequest, CompletionResponse } from \"../types/provider.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\n\n/**\n * Anthropic content block types\n */\ninterface AnthropicTextContent {\n type: \"text\";\n text: string;\n}\n\ninterface AnthropicToolUseContent {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface AnthropicToolResultContent {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\ntype AnthropicContentBlock =\n | AnthropicTextContent\n | AnthropicToolUseContent\n | AnthropicToolResultContent;\n\n/**\n * Anthropic message types\n */\ninterface AnthropicMessage {\n role: \"user\" | \"assistant\";\n content: string | AnthropicContentBlock[];\n}\n\n/**\n * Anthropic API response\n */\ninterface AnthropicResponse {\n content: AnthropicContentBlock[];\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n stop_reason: string;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n name = \"anthropic\";\n private apiKey: string;\n private baseURL: string;\n\n constructor(config: AnthropicConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://api.anthropic.com\";\n }\n\n protected getHeaders(): Record<string, string> {\n return {\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n };\n }\n\n protected getEndpoint(_path: string): string {\n // Anthropic uses /v1/messages endpoint\n return `${this.baseURL}/v1/messages`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n // Transform messages to Anthropic format\n // Anthropic doesn't support \"tool\" role - tool results must be sent as \"user\" messages\n const transformedMessages = request.messages.map((msg): AnthropicMessage => {\n if (msg.role === \"tool\") {\n // Convert tool result message to user message with tool_result content block\n if (!msg.tool_call_id) {\n throw toError(createError({\n type: \"agent\",\n message: \"Tool result message missing tool_call_id\",\n }));\n }\n return {\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ],\n };\n }\n\n // Transform assistant messages with tool_calls to Anthropic format\n if (msg.role === \"assistant\" && msg.tool_calls && msg.tool_calls.length > 0) {\n const content: AnthropicContentBlock[] = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({\n type: \"text\",\n text: msg.content,\n });\n }\n\n // Add tool use blocks (runtime sends OpenAI-format tool_calls)\n for (const toolCall of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: typeof toolCall.function.arguments === \"string\"\n ? JSON.parse(toolCall.function.arguments)\n : toolCall.function.arguments,\n });\n }\n\n return {\n role: \"assistant\",\n content,\n };\n }\n\n // For all other assistant messages, ensure only role and content are sent\n if (msg.role === \"assistant\") {\n return {\n role: \"assistant\",\n content: msg.content,\n };\n }\n\n // For user messages, only send role and content\n if (msg.role === \"user\") {\n return {\n role: \"user\",\n content: msg.content,\n };\n }\n\n // Fallback for any other message types - cast to unknown format\n return msg as unknown as AnthropicMessage;\n });\n\n // Debug: Log transformed messages\n agentLogger.debug(\n \"Anthropic transformRequest - transformed messages:\",\n JSON.stringify(transformedMessages, null, 2),\n );\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages: transformedMessages,\n stream: request.stream || false,\n };\n\n // Anthropic requires system prompt as separate field\n if (request.system) {\n body.system = request.system;\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n } else {\n // Anthropic requires max_tokens\n body.max_tokens = 4096;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters,\n }));\n }\n\n return body;\n }\n\n protected transformResponse(response: AnthropicResponse): CompletionResponse {\n const content = response.content;\n\n if (!content || !Array.isArray(content)) {\n throw toError(createError({\n type: \"config\",\n message: \"Anthropic: Invalid response format\",\n }));\n }\n\n // Extract text content\n const textContent = content\n .filter((c): c is AnthropicTextContent => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n\n // Extract tool calls\n const toolCalls = content\n .filter((c): c is AnthropicToolUseContent => c.type === \"tool_use\")\n .map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.input,\n }));\n\n return {\n text: textContent,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: {\n promptTokens: response.usage?.input_tokens || 0,\n completionTokens: response.usage?.output_tokens || 0,\n totalTokens: (response.usage?.input_tokens || 0) +\n (response.usage?.output_tokens || 0),\n },\n finishReason: this.mapStopReason(response.stop_reason),\n };\n }\n\n private mapStopReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"end_turn\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool_calls\";\n case \"stop_sequence\":\n return \"stop\";\n default:\n return \"stop\";\n }\n }\n\n /**\n * Override stream transformation for Anthropic's specific format\n */\n protected override transformStream(stream: ReadableStream): ReadableStream {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n\n // Capture mapStopReason method reference before entering ReadableStream context\n const mapStopReason = this.mapStopReason.bind(this);\n\n // Track tool calls being accumulated\n const toolCalls = new Map<number, {\n id?: string;\n name?: string;\n input: string;\n }>();\n\n let currentBlockIndex = 0;\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n\n // Anthropic stream event types:\n // - message_start: Contains model, role, usage\n // - content_block_start: Start of content/tool_use block\n // - content_block_delta: Text or tool input deltas\n // - content_block_stop: End of block\n // - message_delta: Contains stop_reason, usage delta\n // - message_stop: End of message\n\n if (parsed.type === \"message_start\") {\n // Extract and emit initial usage (input tokens)\n if (parsed.message?.usage) {\n const usageEvent = JSON.stringify({\n type: \"usage\",\n usage: {\n promptTokens: parsed.message.usage.input_tokens || 0,\n completionTokens: parsed.message.usage.output_tokens || 0,\n totalTokens: (parsed.message.usage.input_tokens || 0) +\n (parsed.message.usage.output_tokens || 0),\n },\n });\n controller.enqueue(encoder.encode(usageEvent + \"\\n\"));\n }\n } else if (parsed.type === \"content_block_start\") {\n const block = parsed.content_block;\n\n // Track tool use blocks\n if (block?.type === \"tool_use\") {\n const index = parsed.index ?? currentBlockIndex;\n currentBlockIndex = index;\n\n toolCalls.set(index, {\n id: block.id,\n name: block.name,\n input: \"\",\n });\n\n // Emit tool call start event\n const startEvent = JSON.stringify({\n type: \"tool_call_start\",\n toolCall: {\n id: block.id,\n name: block.name,\n index,\n },\n });\n controller.enqueue(encoder.encode(startEvent + \"\\n\"));\n }\n } else if (parsed.type === \"content_block_delta\") {\n const delta = parsed.delta;\n\n // Handle text content deltas\n if (delta?.type === \"text_delta\" && delta.text) {\n const contentEvent = JSON.stringify({\n type: \"content\",\n content: delta.text,\n });\n controller.enqueue(encoder.encode(contentEvent + \"\\n\"));\n }\n\n // Handle tool input deltas\n if (delta?.type === \"input_json_delta\" && delta.partial_json) {\n const index = parsed.index ?? currentBlockIndex;\n const tc = toolCalls.get(index);\n\n if (tc) {\n tc.input += delta.partial_json;\n\n // Emit tool call delta event\n const deltaEvent = JSON.stringify({\n type: \"tool_call_delta\",\n id: tc.id,\n index,\n arguments: delta.partial_json,\n });\n controller.enqueue(encoder.encode(deltaEvent + \"\\n\"));\n }\n }\n } else if (parsed.type === \"message_delta\") {\n // Extract and emit usage delta (output tokens)\n if (parsed.usage) {\n const usageDeltaEvent = JSON.stringify({\n type: \"usage\",\n usage: {\n promptTokens: 0, // Only output tokens in delta\n completionTokens: parsed.usage.output_tokens || 0,\n totalTokens: parsed.usage.output_tokens || 0,\n },\n });\n controller.enqueue(encoder.encode(usageDeltaEvent + \"\\n\"));\n }\n\n // Handle stop reason\n if (parsed.delta?.stop_reason) {\n const stopReason = parsed.delta.stop_reason;\n\n // Emit complete tool calls if stop reason is tool_use\n if (stopReason === \"tool_use\") {\n for (const [index, tc] of toolCalls.entries()) {\n const completeEvent = JSON.stringify({\n type: \"tool_call_complete\",\n toolCall: {\n id: tc.id!,\n name: tc.name!,\n index,\n arguments: tc.input,\n },\n });\n controller.enqueue(encoder.encode(completeEvent + \"\\n\"));\n }\n }\n\n // Map Anthropic stop reason to our format\n const finishReason = mapStopReason(stopReason);\n\n // Emit finish event\n const finishEvent = JSON.stringify({\n type: \"finish\",\n finishReason,\n });\n controller.enqueue(encoder.encode(finishEvent + \"\\n\"));\n }\n }\n } catch (e) {\n // Skip invalid JSON\n agentLogger.warn(\"Failed to parse stream chunk:\", e);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n}\n", "/**\n * Google AI provider implementation\n */\n\nimport { z } from \"zod\";\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { CompletionRequest, CompletionResponse, GoogleConfig } from \"../types/provider.ts\";\n\nconst GoogleToolCallSchema = z.object({\n id: z.string(),\n function: z.object({\n name: z.string(),\n arguments: z.union([z.string(), z.record(z.unknown())]),\n }),\n});\n\nconst GoogleResponseSchema = z.object({\n choices: z.array(z.object({\n message: z.object({\n content: z.string().nullable().optional(),\n tool_calls: z.array(GoogleToolCallSchema).optional(),\n }),\n finish_reason: z.string(),\n })).min(1),\n usage: z.object({\n prompt_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n total_tokens: z.number().optional(),\n }).optional(),\n});\n\nexport class GoogleProvider extends BaseProvider {\n name = \"google\";\n private apiKey: string;\n private baseURL: string;\n\n constructor(config: GoogleConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://generativelanguage.googleapis.com/v1beta\";\n }\n\n protected getHeaders(): Record<string, string> {\n return {\n \"x-goog-api-key\": this.apiKey,\n };\n }\n\n protected getEndpoint(_path: string): string {\n // Google uses OpenAI-compatible format\n return `${this.baseURL}/chat/completions`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n stream: request.stream || false,\n };\n\n if (request.system) {\n body.system = request.system;\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n }\n\n return body;\n }\n\n protected transformResponse(response: unknown): CompletionResponse {\n const parsed = GoogleResponseSchema.safeParse(response);\n\n if (!parsed.success) {\n throw toError(createError({\n type: \"agent\",\n message: `Google: Invalid response format: ${parsed.error.message}`,\n }));\n }\n\n const data = parsed.data;\n const choice = data.choices[0];\n\n if (!choice) {\n throw toError(createError({\n type: \"agent\",\n message: \"Google: No choices in response (unexpected)\",\n }));\n }\n\n const message = choice.message;\n\n return {\n text: message.content || \"\",\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: typeof tc.function.arguments === \"string\"\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments,\n })),\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n finishReason: this.mapFinishReason(choice.finish_reason),\n };\n }\n\n private mapFinishReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n case \"max_tokens\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool_calls\";\n case \"content_filter\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n }\n}\n", "export const isDeno = typeof Deno !== \"undefined\" && typeof Deno.version === \"object\";\nexport const isNode =\n typeof (globalThis as { process?: { versions?: { node?: string } } }).process !== \"undefined\" &&\n (globalThis as { process?: { versions?: { node?: string } } }).process?.versions?.node !==\n undefined;\nexport const isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\nexport const isCloudflare = typeof globalThis !== \"undefined\" && \"caches\" in globalThis &&\n \"WebSocketPair\" in globalThis;\n\n/**\n * Detect if running in Node.js (vs Deno)\n * Use this function instead of the constant when runtime detection needs to happen\n * at call time (e.g., when bundled with esbuild's __esm lazy initialization pattern)\n */\nexport function isNodeRuntime(): boolean {\n // deno-lint-ignore no-explicit-any\n const _global = globalThis as any;\n // Check Deno.version to distinguish real Deno from the npm build shim\n const isRealDeno = typeof Deno !== \"undefined\" && typeof Deno.version === \"object\";\n return !isRealDeno && typeof _global.process !== \"undefined\" &&\n !!_global.process?.versions?.node;\n}\n", "import { isDeno as IS_DENO } from \"./runtime.ts\";\n\nconst nodeProcess = (globalThis as { process?: typeof import(\"node:process\") }).process;\nconst hasNodeProcess = !!nodeProcess?.versions?.node;\n\nexport function getArgs(): string[] {\n if (IS_DENO) {\n return Deno.args;\n }\n if (hasNodeProcess) {\n return nodeProcess!.argv.slice(2);\n }\n return [];\n}\n\nexport function exit(code?: number): never {\n if (IS_DENO) {\n Deno.exit(code);\n }\n if (hasNodeProcess) {\n nodeProcess!.exit(code);\n }\n throw new Error(\"exit() is not supported in this runtime\");\n}\n\nexport function cwd(): string {\n if (IS_DENO) {\n return Deno.cwd();\n }\n if (hasNodeProcess) {\n return nodeProcess!.cwd();\n }\n throw new Error(\"cwd() is not supported in this runtime\");\n}\n\nexport function chdir(directory: string): void {\n if (IS_DENO) {\n Deno.chdir(directory);\n } else {\n if (hasNodeProcess) {\n nodeProcess!.chdir(directory);\n return;\n }\n throw new Error(\"chdir() is not supported in this runtime\");\n }\n}\n\nexport function env(): Record<string, string> {\n if (IS_DENO) {\n return Deno.env.toObject();\n }\n if (hasNodeProcess) {\n return nodeProcess!.env as Record<string, string>;\n }\n return {};\n}\n\nexport function getEnv(key: string): string | undefined {\n if (IS_DENO) {\n return Deno.env.get(key);\n }\n if (hasNodeProcess) {\n return nodeProcess!.env[key];\n }\n return undefined;\n}\n\n/**\n * Get an environment variable or throw if not set\n * @throws Error if the environment variable is not set\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\nexport function setEnv(key: string, value: string): void {\n if (IS_DENO) {\n Deno.env.set(key, value);\n } else {\n if (hasNodeProcess) {\n nodeProcess!.env[key] = value;\n return;\n }\n throw new Error(\"setEnv() is not supported in this runtime\");\n }\n}\n\nexport function deleteEnv(key: string): void {\n if (IS_DENO) {\n Deno.env.delete(key);\n } else {\n if (hasNodeProcess) {\n delete nodeProcess!.env[key];\n return;\n }\n throw new Error(\"deleteEnv() is not supported in this runtime\");\n }\n}\n\nexport function pid(): number {\n if (IS_DENO) {\n return Deno.pid;\n }\n if (hasNodeProcess) {\n return nodeProcess!.pid;\n }\n return 0;\n}\n\nexport function ppid(): number {\n if (IS_DENO && \"ppid\" in Deno) {\n return Deno.ppid || 0;\n }\n if (hasNodeProcess) {\n return nodeProcess!.ppid || 0;\n }\n return 0;\n}\n\nexport function memoryUsage(): {\n rss: number;\n heapTotal: number;\n heapUsed: number;\n external: number;\n} {\n if (IS_DENO) {\n const usage = Deno.memoryUsage();\n return {\n rss: usage.rss,\n heapTotal: usage.heapTotal,\n heapUsed: usage.heapUsed,\n external: usage.external,\n };\n }\n\n if (!hasNodeProcess) {\n throw new Error(\"memoryUsage() is not supported in this runtime\");\n }\n\n const usage = nodeProcess!.memoryUsage();\n return {\n rss: usage.rss,\n heapTotal: usage.heapTotal,\n heapUsed: usage.heapUsed,\n external: usage.external || 0,\n };\n}\n\n/**\n * Check if stdin is a TTY (terminal)\n */\nexport function isInteractive(): boolean {\n if (IS_DENO) {\n return Deno.stdin.isTerminal();\n }\n if (hasNodeProcess) {\n return nodeProcess!.stdin.isTTY ?? false;\n }\n return false;\n}\n\n/**\n * Get network interfaces\n */\nexport async function getNetworkInterfaces(): Promise<\n Array<{ name: string; address: string; family: \"IPv4\" | \"IPv6\" }>\n> {\n if (IS_DENO) {\n const interfaces = Deno.networkInterfaces();\n return interfaces.map((iface) => ({\n name: iface.name,\n address: iface.address,\n family: iface.family as \"IPv4\" | \"IPv6\",\n }));\n }\n\n if (!hasNodeProcess) {\n throw new Error(\"networkInterfaces() is not supported in this runtime\");\n }\n\n const os = await import(\"node:os\");\n const interfaces = os.networkInterfaces();\n const result: Array<{ name: string; address: string; family: \"IPv4\" | \"IPv6\" }> = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (!addrs) continue;\n for (const addr of addrs) {\n result.push({\n name,\n address: addr.address,\n family: addr.family as \"IPv4\" | \"IPv6\",\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n if (IS_DENO) {\n return `Deno ${Deno.version.deno}`;\n }\n if (\"Bun\" in globalThis) {\n return `Bun ${(globalThis as unknown as { Bun: { version: string } }).Bun.version}`;\n }\n if (hasNodeProcess) {\n return `Node.js ${nodeProcess!.version}`;\n }\n return \"unknown\";\n}\n\n/**\n * Register a signal handler (SIGINT, SIGTERM) for graceful shutdown\n */\nexport function onSignal(signal: \"SIGINT\" | \"SIGTERM\", handler: () => void): void {\n if (IS_DENO) {\n Deno.addSignalListener(signal, handler);\n } else if (hasNodeProcess) {\n nodeProcess!.on(signal, handler);\n }\n}\n\n/**\n * Unreference a timer to prevent it from keeping the process alive\n */\nexport function unrefTimer(timerId: ReturnType<typeof setInterval>): void {\n if (IS_DENO) {\n Deno.unrefTimer(timerId as number);\n } else if (timerId && typeof timerId === \"object\" && \"unref\" in timerId) {\n (timerId as { unref: () => void }).unref();\n }\n}\n\n/**\n * Get the executable path of the current runtime\n */\nexport function execPath(): string {\n if (IS_DENO) {\n return Deno.execPath();\n }\n if (hasNodeProcess) {\n return nodeProcess!.execPath;\n }\n return \"\";\n}\n\n/**\n * Get process uptime in seconds\n * Returns OS uptime on Deno, process uptime on Node.js\n */\nexport function uptime(): number {\n if (IS_DENO) {\n // Deno.osUptime() returns system uptime in seconds\n return Deno.osUptime?.() ?? 0;\n }\n if (hasNodeProcess) {\n // process.uptime() returns process uptime in seconds\n return nodeProcess!.uptime?.() ?? 0;\n }\n return 0;\n}\n\n/**\n * Get stdout stream for writing\n * Returns null if not available (e.g., in browser/workers)\n */\nexport function getStdout(): { write: (data: string) => void } | null {\n if (IS_DENO) {\n const encoder = new TextEncoder();\n return {\n write: (data: string) => {\n Deno.stdout.writeSync(encoder.encode(data));\n },\n };\n }\n if (hasNodeProcess && nodeProcess!.stdout) {\n return {\n write: (data: string) => {\n nodeProcess!.stdout.write(data);\n },\n };\n }\n return null;\n}\n\n// Cached Node.js modules for synchronous prompt\nlet cachedNodeFs: typeof import(\"node:fs\") | null = null;\n\n/**\n * Synchronous prompt function that works across Deno and Node.js\n * Displays a message and reads user input from stdin\n */\nexport function promptSync(message?: string): string | null {\n if (IS_DENO) {\n // Deno has a built-in prompt() function\n return prompt(message);\n }\n\n if (hasNodeProcess) {\n // Print the message\n if (message) {\n nodeProcess!.stdout.write(message + \" \");\n }\n\n // Lazy load fs module\n if (!cachedNodeFs) {\n // Dynamic import converted to sync require for bundling\n // @ts-ignore - dynamic require for Node.js\n cachedNodeFs = globalThis.require?.(\"node:fs\") || null;\n if (!cachedNodeFs) {\n // Try alternative approach\n try {\n // @ts-ignore: __require is injected by bundlers for Node.js require\n cachedNodeFs = __require(\"node:fs\");\n } catch {\n return null;\n }\n }\n }\n\n if (!cachedNodeFs) {\n return null;\n }\n\n // Read synchronously using fs\n // This works by reading from file descriptor 0 (stdin)\n // Use Uint8Array for cross-platform compatibility\n const bufferSize = 1024;\n const uint8Array = new Uint8Array(bufferSize);\n let input = \"\";\n\n try {\n // Read from stdin (fd 0) synchronously\n const bytesRead = cachedNodeFs.readSync(0, uint8Array, 0, bufferSize, null);\n if (bytesRead > 0) {\n const decoder = new TextDecoder(\"utf-8\");\n input = decoder.decode(uint8Array.subarray(0, bytesRead)).trim();\n }\n } catch {\n // If stdin is not available or EOF, return null\n return null;\n }\n\n return input || null;\n }\n\n return null;\n}\n", "/**\n * Provider factory and registry\n */\n\nimport type { Provider, ProvidersConfig } from \"../types/provider.ts\";\nimport { OpenAIProvider } from \"./openai.ts\";\nimport { AnthropicProvider } from \"./anthropic.ts\";\nimport { GoogleProvider } from \"./google.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\n/**\n * Provider registry\n */\nclass ProviderRegistry {\n private providers = new Map<string, Provider>();\n private config: ProvidersConfig = {};\n private autoInitialized = false;\n\n /**\n * Auto-initialize providers from environment variables\n * This is called lazily when a provider is first requested\n */\n private autoInitializeFromEnv(): void {\n if (this.autoInitialized) return;\n this.autoInitialized = true;\n\n // Initialize OpenAI from OPENAI_API_KEY\n const openaiKey = getEnv(\"OPENAI_API_KEY\");\n if (openaiKey && !this.providers.has(\"openai\")) {\n try {\n const provider = new OpenAIProvider({\n apiKey: openaiKey,\n baseURL: getEnv(\"OPENAI_BASE_URL\"),\n organizationId: getEnv(\"OPENAI_ORGANIZATION_ID\"),\n });\n this.providers.set(\"openai\", provider);\n agentLogger.debug(\"Auto-initialized OpenAI provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize OpenAI provider:\", error);\n }\n }\n\n // Initialize Anthropic from ANTHROPIC_API_KEY\n const anthropicKey = getEnv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey && !this.providers.has(\"anthropic\")) {\n try {\n const provider = new AnthropicProvider({\n apiKey: anthropicKey,\n baseURL: getEnv(\"ANTHROPIC_BASE_URL\"),\n });\n this.providers.set(\"anthropic\", provider);\n agentLogger.debug(\"Auto-initialized Anthropic provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize Anthropic provider:\", error);\n }\n }\n\n // Initialize Google from GOOGLE_API_KEY or GOOGLE_GENERATIVE_AI_API_KEY\n const googleKey = getEnv(\"GOOGLE_API_KEY\") || getEnv(\"GOOGLE_GENERATIVE_AI_API_KEY\");\n if (googleKey && !this.providers.has(\"google\")) {\n try {\n const provider = new GoogleProvider({\n apiKey: googleKey,\n });\n this.providers.set(\"google\", provider);\n agentLogger.debug(\"Auto-initialized Google provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize Google provider:\", error);\n }\n }\n }\n\n /**\n * Initialize providers from configuration\n */\n initialize(config: ProvidersConfig): void {\n this.config = config;\n\n // Initialize OpenAI\n if (config.openai) {\n try {\n const provider = new OpenAIProvider(config.openai);\n this.providers.set(\"openai\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize OpenAI provider:\", error);\n }\n }\n\n // Initialize Anthropic\n if (config.anthropic) {\n try {\n const provider = new AnthropicProvider(config.anthropic);\n this.providers.set(\"anthropic\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize Anthropic provider:\", error);\n }\n }\n\n // Initialize Google\n if (config.google) {\n try {\n const provider = new GoogleProvider(config.google);\n this.providers.set(\"google\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize Google provider:\", error);\n }\n }\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): Provider {\n // Auto-initialize from environment variables if not already done\n this.autoInitializeFromEnv();\n\n const provider = this.providers.get(name);\n\n if (!provider) {\n throw toError(createError({\n type: \"agent\",\n message: `Provider \"${name}\" not found. Available providers: ${\n Array.from(this.providers.keys()).join(\", \")\n }`,\n }));\n }\n\n return provider;\n }\n\n /**\n * Get provider from model string (format: \"provider/model-name\")\n */\n getProviderFromModel(modelString: string): {\n provider: Provider;\n model: string;\n } {\n const parts = modelString.split(\"/\");\n\n if (parts.length !== 2) {\n throw toError(createError({\n type: \"config\",\n message:\n `Invalid model string format: \"${modelString}\". Expected format: \"provider/model-name\" (e.g., \"openai/gpt-4\")`,\n }));\n }\n\n const providerName = parts[0];\n const modelName = parts[1];\n\n if (!providerName || !modelName) {\n throw toError(createError({\n type: \"config\",\n message:\n `Invalid model string format: \"${modelString}\". Both provider and model name are required.`,\n }));\n }\n\n const provider = this.getProvider(providerName);\n\n return { provider, model: modelName };\n }\n\n /**\n * Get default provider\n */\n getDefaultProvider(): Provider {\n const defaultName = this.config.default || \"openai\";\n return this.getProvider(defaultName);\n }\n\n /**\n * Check if a provider is available\n */\n hasProvider(name: string): boolean {\n this.autoInitializeFromEnv();\n return this.providers.has(name);\n }\n\n /**\n * Get all available provider names\n */\n getAvailableProviders(): string[] {\n this.autoInitializeFromEnv();\n return Array.from(this.providers.keys());\n }\n\n /**\n * Clear all providers (for testing)\n */\n clear(): void {\n this.providers.clear();\n this.config = {};\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROVIDER_REGISTRY_KEY = \"__veryfront_provider_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalProvider = globalThis as any;\nexport const providerRegistry: ProviderRegistry = _globalProvider[PROVIDER_REGISTRY_KEY] ||=\n new ProviderRegistry();\n\n/**\n * Initialize providers with configuration\n */\nexport function initializeProviders(config: ProvidersConfig): void {\n providerRegistry.initialize(config);\n}\n\n/**\n * Get a provider by name\n */\nexport function getProvider(name: string): Provider {\n return providerRegistry.getProvider(name);\n}\n\n/**\n * Get provider from model string\n */\nexport function getProviderFromModel(modelString: string): {\n provider: Provider;\n model: string;\n} {\n return providerRegistry.getProviderFromModel(modelString);\n}\n", "import type { z } from \"zod\";\nimport { ZodFirstPartyTypeKind } from \"zod\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\n\nexport function zodToJsonSchema(schema: z.ZodTypeAny): JsonSchema {\n // Guard against invalid schemas (can happen with different zod instances in npm bundle)\n if (!schema || typeof schema !== \"object\" || !(\"_def\" in schema)) {\n throw new Error(\"Invalid Zod schema: missing _def property\");\n }\n\n const details = unwrapSchema(schema);\n const json = convert(details.schema);\n if (details.nullable) {\n return { anyOf: [json, { type: \"null\" }] };\n }\n return json;\n}\n\nexport function isOptionalSchema(schema: z.ZodTypeAny): boolean {\n const { optional } = unwrapSchema(schema);\n return optional;\n}\n\nfunction convert(schema: z.ZodTypeAny): JsonSchema {\n switch (schema._def.typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return { type: \"string\" };\n case ZodFirstPartyTypeKind.ZodNumber:\n return { type: \"number\" };\n case ZodFirstPartyTypeKind.ZodBoolean:\n return { type: \"boolean\" };\n case ZodFirstPartyTypeKind.ZodBigInt:\n return { type: \"integer\" };\n case ZodFirstPartyTypeKind.ZodLiteral: {\n const literal = (schema as z.ZodLiteral<unknown>)._def.value;\n return {\n const: literal,\n type: typeof literal === \"string\"\n ? \"string\"\n : typeof literal === \"number\"\n ? \"number\"\n : typeof literal === \"boolean\"\n ? \"boolean\"\n : undefined,\n };\n }\n case ZodFirstPartyTypeKind.ZodEnum:\n return {\n type: \"string\",\n enum: (schema as z.ZodEnum<[string, ...string[]]>)._def.values,\n };\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return {\n enum: Object.values((schema as z.ZodNativeEnum<any>)._def.values).filter(\n (value) => typeof value !== \"number\",\n ),\n };\n case ZodFirstPartyTypeKind.ZodObject: {\n const obj = schema as z.ZodObject<any>;\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n // Access shape - it might be a function (lazy getter) or an object\n const shape = typeof obj._def.shape === \"function\" ? obj._def.shape() : obj._def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const zodSchema = value as z.ZodTypeAny;\n properties[key] = zodToJsonSchema(zodSchema);\n if (!isOptionalSchema(zodSchema)) {\n required.push(key);\n }\n }\n\n const json: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) {\n json.required = required;\n }\n return json;\n }\n case ZodFirstPartyTypeKind.ZodArray: {\n const array = schema as z.ZodArray<z.ZodTypeAny>;\n return {\n type: \"array\",\n items: zodToJsonSchema(array._def.type),\n };\n }\n case ZodFirstPartyTypeKind.ZodTuple: {\n const tuple = schema as z.ZodTuple;\n return {\n type: \"array\",\n prefixItems: tuple._def.items.map((item) => zodToJsonSchema(item)),\n minItems: tuple._def.items.length,\n maxItems: tuple._def.items.length,\n };\n }\n case ZodFirstPartyTypeKind.ZodUnion: {\n const union = schema as z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;\n return {\n anyOf: union._def.options.map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n const union = schema as z.ZodDiscriminatedUnion<string, z.ZodObject<any>[]>;\n return {\n anyOf: Array.from(union._def.options.values()).map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodRecord:\n return {\n type: \"object\",\n additionalProperties: zodToJsonSchema((schema as z.ZodRecord<any>)._def.valueType),\n };\n case ZodFirstPartyTypeKind.ZodDefault: {\n const def = schema as z.ZodDefault<z.ZodTypeAny>;\n const inner = zodToJsonSchema(def._def.innerType);\n const defaultValue = def._def.defaultValue();\n if (typeof inner === \"object\" && !(\"anyOf\" in inner)) {\n inner.default = defaultValue;\n }\n return inner;\n }\n case ZodFirstPartyTypeKind.ZodLazy:\n return convert((schema as z.ZodLazy<any>)._def.getter());\n case ZodFirstPartyTypeKind.ZodEffects:\n return convert((schema as z.ZodEffects<any>)._def.schema);\n default:\n return { type: \"object\" };\n }\n}\n\nfunction unwrapSchema(schema: z.ZodTypeAny) {\n let current: z.ZodTypeAny = schema;\n let nullable = false;\n let optional = false;\n\n while (true) {\n switch (current._def.typeName) {\n case ZodFirstPartyTypeKind.ZodNullable:\n nullable = true;\n current = (current as z.ZodNullable<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodOptional:\n optional = true;\n current = (current as z.ZodOptional<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodEffects:\n current = (current as z.ZodEffects<any>)._def.schema;\n continue;\n default:\n return { schema: current, nullable, optional };\n }\n }\n}\n", "import type { Tool, ToolConfig, ToolDefinition, ToolExecutionContext } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"./zod-json-schema.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create a tool\n *\n * @example\n * ```typescript\n * import { tool } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * const results = await searchWeb(query);\n * return results;\n * },\n * });\n * ```\n */\nexport function tool<TInput = any, TOutput = any>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const id = config.id || generateToolId();\n\n // Check if we have a valid zod schema (has _def property)\n const hasValidZodSchema = config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"_def\" in config.inputSchema &&\n (config.inputSchema as { _def?: { typeName?: string } })._def?.typeName;\n\n // Pre-convert Zod schema to JSON Schema immediately\n // This happens BEFORE any bundling, in a clean environment\n let inputSchemaJson: JsonSchema | undefined;\n if (hasValidZodSchema) {\n try {\n inputSchemaJson = zodToJsonSchema(config.inputSchema);\n agentLogger.info(\n `[TOOL] Pre-converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch (error) {\n agentLogger.warn(`[TOOL] Failed to pre-convert schema for \"${id}\":`, error);\n // Continue without pre-converted schema - will fall back to runtime conversion\n }\n } else {\n // Try to introspect the schema from external zod instance\n const externalSchema = config.inputSchema as {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, unknown>) | Record<string, unknown>;\n };\n };\n\n if (externalSchema?._def?.shape) {\n try {\n const shape = typeof externalSchema._def.shape === \"function\"\n ? externalSchema._def.shape()\n : externalSchema._def.shape;\n\n // Build JSON Schema from shape inspection\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n // Default to string type for unknown schemas\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n required: Object.keys(properties),\n };\n agentLogger.info(\n `[TOOL] Introspected schema for \"${id}\" from external zod: ${\n Object.keys(properties).length\n } properties`,\n );\n } catch {\n inputSchemaJson = { type: \"object\", properties: {} };\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" could not be introspected. Using empty schema.`,\n );\n }\n } else {\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" is not a valid Zod schema (different zod instance?). ` +\n `Skipping pre-conversion. Input validation may be limited.`,\n );\n // Create a basic schema from inspection if possible\n inputSchemaJson = { type: \"object\", properties: {} };\n }\n }\n\n return {\n id,\n type: \"function\" as const,\n description: config.description,\n inputSchema: config.inputSchema,\n inputSchemaJson, // Store pre-converted schema\n execute: async (input: TInput, context?: ToolExecutionContext) => {\n // Validate input if zod schema is available\n if (hasValidZodSchema) {\n try {\n config.inputSchema.parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n } else if (\n config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"parse\" in config.inputSchema &&\n typeof (config.inputSchema as { parse?: unknown }).parse === \"function\"\n ) {\n // Try to use parse method if available (external zod instance)\n try {\n (config.inputSchema as { parse: (input: unknown) => void }).parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n }\n\n // Execute tool\n return await config.execute(input, context);\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Configuration for dynamic tools where input/output types are unknown at compile time\n */\nexport interface DynamicToolConfig {\n /** Tool identifier (optional, auto-generated if not provided) */\n id?: string;\n\n /** Tool description for the AI model */\n description: string;\n\n /**\n * Input schema - any Zod schema is accepted. For dynamic tools where the input shape\n * is truly unknown at compile time, it is recommended to use z.unknown(), z.any(),\n * or z.object({}). A schema is still required for validation even though types are unknown.\n */\n inputSchema: unknown;\n\n /**\n * Tool execution function - input is typed as unknown and must be validated/cast at runtime\n */\n execute: (\n input: unknown,\n context?: ToolExecutionContext,\n ) => Promise<unknown> | unknown;\n\n /**\n * Optional conversion function that maps the tool result to an output\n * that can be used by the language model\n */\n toModelOutput?: (output: unknown) => unknown;\n\n /** MCP configuration */\n mcp?: {\n /** Expose via MCP */\n enabled?: boolean;\n /** Require authentication */\n requiresAuth?: boolean;\n /** Cache policy */\n cachePolicy?: \"no-cache\" | \"cache\" | \"cache-first\";\n };\n}\n\n/**\n * Create a dynamic tool where input/output types are not known at compile time.\n *\n * Use this for:\n * - MCP (Model Context Protocol) tools without schemas\n * - User-defined functions loaded at runtime\n * - Tools loaded from external sources or databases\n * - Dynamic tool generation based on user input\n *\n * @example\n * ```typescript\n * import { dynamicTool } from 'veryfront/ai';\n * import { z } from 'zod';\n *\n * export const customTool = dynamicTool({\n * description: 'Execute a custom user-defined function',\n * inputSchema: z.object({}),\n * execute: async (input) => {\n * // input is typed as 'unknown' - validate/cast at runtime\n * const { action, parameters } = input as any;\n * return { result: `Executed ${action}` };\n * },\n * });\n * ```\n */\nexport function dynamicTool(config: DynamicToolConfig): Tool<unknown, unknown> {\n const id = config.id || generateToolId();\n\n // Try to convert schema to JSON Schema if possible\n let inputSchemaJson: JsonSchema | undefined;\n\n // Check if it's a zod-like schema with _def\n const zodLikeSchema = config.inputSchema as {\n _def?: { typeName?: string; shape?: (() => Record<string, unknown>) | Record<string, unknown> };\n };\n\n if (zodLikeSchema?._def?.typeName) {\n try {\n // deno-lint-ignore no-explicit-any\n inputSchemaJson = zodToJsonSchema(config.inputSchema as any);\n agentLogger.info(\n `[DYNAMIC_TOOL] Converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch {\n // For z.unknown() or z.any(), create a permissive schema\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using permissive schema for \"${id}\"`);\n }\n } else if (zodLikeSchema?._def?.shape) {\n // Try to introspect shape\n try {\n const shape = typeof zodLikeSchema._def.shape === \"function\"\n ? zodLikeSchema._def.shape()\n : zodLikeSchema._def.shape;\n\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n additionalProperties: true,\n };\n agentLogger.info(`[DYNAMIC_TOOL] Introspected schema for \"${id}\"`);\n } catch {\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n }\n } else {\n // Fully dynamic - accept anything\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using fully dynamic schema for \"${id}\"`);\n }\n\n return {\n id,\n type: \"dynamic\" as const,\n description: config.description,\n inputSchema: config.inputSchema as any,\n inputSchemaJson,\n execute: async (input: unknown, context?: ToolExecutionContext) => {\n // For dynamic tools, we skip input validation entirely.\n // The tool implementation is responsible for runtime validation.\n const result = await config.execute(input, context);\n\n // Apply output transformation if provided\n if (config.toModelOutput) {\n return config.toModelOutput(result);\n }\n\n return result;\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate a unique tool ID\n */\nlet toolIdCounter = 0;\nfunction generateToolId(): string {\n return `tool_${Date.now()}_${toolIdCounter++}`;\n}\n\n/**\n * Tool registry for managing tools\n */\nclass ToolRegistryClass {\n private tools = new Map<string, Tool>();\n\n register(id: string, toolInstance: Tool): void {\n if (this.tools.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Tool \"${id}\" is already registered. Overwriting.`);\n }\n\n this.tools.set(id, toolInstance);\n }\n\n /**\n * Get a tool by ID\n */\n get(id: string): Tool | undefined {\n return this.tools.get(id);\n }\n\n /**\n * Check if a tool exists\n */\n has(id: string): boolean {\n return this.tools.has(id);\n }\n\n /**\n * Get all tool IDs\n */\n getAllIds(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * Get all tools\n */\n getAll(): Map<string, Tool> {\n return new Map(this.tools);\n }\n\n /**\n * Clear all tools (for testing)\n */\n clear(): void {\n this.tools.clear();\n }\n\n getToolsForProvider(): ToolDefinition[] {\n return Array.from(this.tools.values()).map(toolToProviderDefinition);\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst TOOL_REGISTRY_KEY = \"__veryfront_tool_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalTool = globalThis as any;\nexport const toolRegistry: ToolRegistryClass = _globalTool[TOOL_REGISTRY_KEY] ||=\n new ToolRegistryClass();\n\nexport function toolToProviderDefinition(tool: Tool): ToolDefinition {\n // Use pre-converted JSON Schema if available (preferred)\n // Fall back to runtime conversion if needed\n const jsonSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n agentLogger.info(\n `[TOOL] Using ${\n tool.inputSchemaJson ? \"pre-converted\" : \"runtime-converted\"\n } schema for \"${tool.id}\"`,\n );\n\n return {\n name: tool.id,\n description: tool.description,\n parameters: jsonSchema,\n };\n}\n\n/**\n * Execute a tool by ID\n */\nexport async function executeTool(\n toolId: string,\n input: unknown,\n context?: ToolExecutionContext,\n): Promise<unknown> {\n const tool = toolRegistry.get(toolId);\n\n if (!tool) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" not found`,\n }));\n }\n\n try {\n const result = await tool.execute(input, context);\n return result;\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" execution failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n}\n\nexport { zodToJsonSchema } from \"./zod-json-schema.ts\";\n", "/**\n * Platform Detection and Runtime Abstractions\n *\n * Detects the current JavaScript runtime and provides platform-specific\n * capabilities and constraints.\n *\n * Supported platforms:\n * - Deno\n * - Node.js\n * - Bun\n * - Cloudflare Workers\n */\n\nexport type Platform = \"deno\" | \"node\" | \"bun\" | \"cloudflare-workers\" | \"unknown\";\n\nexport interface PlatformCapabilities {\n /** Can run MCP server (requires TCP server support) */\n canRunMCPServer: boolean;\n\n /** Maximum agent steps before timeout risk */\n maxAgentSteps: number;\n\n /** CPU time limit in milliseconds */\n cpuTimeLimit: number | null;\n\n /** Memory limit in MB */\n memoryLimit: number | null;\n\n /** Supports file system access */\n hasFileSystem: boolean;\n\n /** Supports long-running tasks */\n supportsLongRunning: boolean;\n\n /** Recommended for streaming */\n streamingRecommended: boolean;\n\n /** Platform display name */\n displayName: string;\n}\n\n/**\n * Detects the current JavaScript runtime platform\n */\nexport function detectPlatform(): Platform {\n // Check for Deno\n // @ts-ignore - Deno global may not exist\n if (typeof Deno !== \"undefined\" && Deno.version?.deno) {\n return \"deno\";\n }\n\n // Check for Bun\n // @ts-ignore - Bun global may not exist\n if (typeof Bun !== \"undefined\" && Bun.version) {\n return \"bun\";\n }\n\n // Check for Cloudflare Workers\n // @ts-ignore - caches global specific to CF Workers\n if (\n typeof caches !== \"undefined\" && typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\"\n ) {\n return \"cloudflare-workers\";\n }\n\n // Check for Node.js\n const globalProcess = (globalThis as any).process;\n if (\n typeof globalProcess !== \"undefined\" &&\n globalProcess.versions?.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Gets platform capabilities for the current or specified platform\n */\nexport function getPlatformCapabilities(platform?: Platform): PlatformCapabilities {\n const detectedPlatform = platform || detectPlatform();\n\n switch (detectedPlatform) {\n case \"deno\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null, // No hard limit\n memoryLimit: null, // System dependent\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Deno\",\n };\n\n case \"node\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null,\n memoryLimit: null,\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Node.js\",\n };\n\n case \"bun\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null,\n memoryLimit: null,\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Bun\",\n };\n\n case \"cloudflare-workers\":\n return {\n canRunMCPServer: false, // CF Workers cannot run TCP servers\n maxAgentSteps: 3, // Conservative limit for 30s CPU time\n cpuTimeLimit: 30000, // 30 seconds\n memoryLimit: 128, // 128 MB\n hasFileSystem: false,\n supportsLongRunning: false,\n streamingRecommended: true, // Required for good UX\n displayName: \"Cloudflare Workers\",\n };\n\n default:\n return {\n canRunMCPServer: false,\n maxAgentSteps: 5,\n cpuTimeLimit: 60000,\n memoryLimit: 512,\n hasFileSystem: false,\n supportsLongRunning: false,\n streamingRecommended: true,\n displayName: \"Unknown Platform\",\n };\n }\n}\n\n/**\n * Checks if the current platform supports a specific capability\n */\nexport function supportsCapability(capability: keyof PlatformCapabilities): boolean {\n const capabilities = getPlatformCapabilities();\n const value = capabilities[capability];\n\n // Handle boolean capabilities\n if (typeof value === \"boolean\") {\n return value;\n }\n\n // Handle numeric capabilities (non-zero means supported)\n if (typeof value === \"number\") {\n return value > 0;\n }\n\n return false;\n}\n\n/**\n * Gets a warning message if the current platform has constraints\n */\nexport function getPlatformWarnings(): string[] {\n const platform = detectPlatform();\n const capabilities = getPlatformCapabilities(platform);\n const warnings: string[] = [];\n\n if (!capabilities.canRunMCPServer) {\n warnings.push(\n `MCP server cannot run on ${capabilities.displayName}. Deploy MCP server to a different platform.`,\n );\n }\n\n if (capabilities.maxAgentSteps < 10) {\n warnings.push(\n `${capabilities.displayName} has limited agent steps (${capabilities.maxAgentSteps}). Use simple agents only.`,\n );\n }\n\n if (capabilities.cpuTimeLimit !== null && capabilities.cpuTimeLimit < 60000) {\n warnings.push(\n `${capabilities.displayName} has CPU time limit of ${capabilities.cpuTimeLimit}ms. Enable streaming for better UX.`,\n );\n }\n\n if (!capabilities.hasFileSystem) {\n warnings.push(\n `${capabilities.displayName} has no file system access. Avoid file-based tools.`,\n );\n }\n\n return warnings;\n}\n\nexport interface CompatibilityConfig {\n maxSteps?: number;\n streaming?: boolean;\n requiresFileSystem?: boolean;\n requiresMCP?: boolean;\n}\n\nexport function validatePlatformCompatibility(\n config: CompatibilityConfig,\n platform?: Platform,\n): {\n compatible: boolean;\n errors: string[];\n warnings: string[];\n} {\n const capabilities = getPlatformCapabilities(platform);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check max steps\n if (config.maxSteps && config.maxSteps > capabilities.maxAgentSteps) {\n if (capabilities.maxAgentSteps === Infinity) {\n // No limit, all good\n } else {\n errors.push(\n `Agent maxSteps (${config.maxSteps}) exceeds platform limit (${capabilities.maxAgentSteps})`,\n );\n }\n }\n\n // Check file system requirement\n if (config.requiresFileSystem && !capabilities.hasFileSystem) {\n errors.push(\n `Agent requires file system but ${capabilities.displayName} doesn't support it`,\n );\n }\n\n // Check MCP requirement\n if (config.requiresMCP && !capabilities.canRunMCPServer) {\n errors.push(\n `Agent requires MCP server but ${capabilities.displayName} cannot run it`,\n );\n }\n\n // Check streaming recommendation\n if (!config.streaming && capabilities.streamingRecommended) {\n warnings.push(\n `Streaming is recommended on ${capabilities.displayName} for better user experience`,\n );\n }\n\n return {\n compatible: errors.length === 0,\n errors,\n warnings,\n };\n}\n", "/**\n * MCP Resource factory and utilities\n */\n\nimport type { Resource, ResourceConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP resource\n *\n * @example\n * ```typescript\n * import { resource } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default resource({\n * description: 'Get user profile',\n * paramsSchema: z.object({\n * userId: z.string(),\n * }),\n * load: async ({ userId }) => {\n * return await db.users.findUnique({ where: { id: userId } });\n * },\n * });\n * ```\n */\nexport function resource<TParams = any, TData = any>(\n config: ResourceConfig<TParams, TData>,\n): Resource<TParams, TData> {\n // Generate pattern if not provided\n const pattern = config.pattern || generateResourcePattern();\n\n // Generate ID from pattern\n const id = patternToId(pattern);\n\n return {\n id,\n pattern,\n description: config.description,\n paramsSchema: config.paramsSchema,\n load: async (params: TParams) => {\n // Validate params\n try {\n config.paramsSchema.parse(params);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource \"${id}\" params validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n\n return await config.load(params);\n },\n subscribe: config.subscribe,\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate resource pattern fallback\n * Note: In practice, resources should explicitly define their pattern.\n * Auto-discovery is handled by the discovery.ts module which scans\n * the filesystem and extracts patterns from resource definitions.\n */\nfunction generateResourcePattern(): string {\n return `/resource_${Date.now()}`;\n}\n\n/**\n * Convert path pattern to ID\n * Example: \"/users/:userId/profile\" -> \"users_userId_profile\"\n */\nfunction patternToId(pattern: string): string {\n return pattern\n .replace(/^\\//, \"\")\n .replace(/\\//g, \"_\")\n .replace(/:/g, \"\");\n}\n\n/**\n * Resource registry\n */\nclass ResourceRegistryClass {\n private resources = new Map<string, Resource>();\n\n /**\n * Register a resource\n */\n register(id: string, resourceInstance: Resource): void {\n if (this.resources.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Resource \"${id}\" is already registered. Overwriting.`);\n }\n\n this.resources.set(id, resourceInstance);\n }\n\n /**\n * Get a resource by ID\n */\n get(id: string): Resource | undefined {\n return this.resources.get(id);\n }\n\n /**\n * Get resource by pattern matching\n */\n findByPattern(uri: string): Resource | undefined {\n for (const resource of this.resources.values()) {\n if (this.matchesPattern(uri, resource.pattern)) {\n return resource;\n }\n }\n return undefined;\n }\n\n /**\n * Check if URI matches pattern\n * Uses regex-based pattern matching with named capture groups.\n * Supports Express-style patterns like \"/users/:userId/profile\"\n */\n private matchesPattern(uri: string, pattern: string): boolean {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n return patternRegex.test(uri);\n }\n\n /**\n * Extract params from URI using pattern\n */\n extractParams(uri: string, pattern: string): Record<string, string> {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n const match = uri.match(patternRegex);\n\n return match?.groups || {};\n }\n\n /**\n * Get all resources\n */\n getAll(): Map<string, Resource> {\n return new Map(this.resources);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n this.resources.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst RESOURCE_REGISTRY_KEY = \"__veryfront_resource_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalResource = globalThis as any;\nexport const resourceRegistry: ResourceRegistryClass = _globalResource[RESOURCE_REGISTRY_KEY] ||=\n new ResourceRegistryClass();\n", "/**\n * MCP Prompt factory and utilities\n */\n\nimport type { Prompt, PromptConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP prompt template\n *\n * @example\n * ```typescript\n * import { prompt } from 'veryfront/ai';\n\n *\n * export default prompt({\n * description: 'Customer support prompt',\n * content: 'You are a helpful customer support agent...',\n * });\n * ```\n */\nexport function prompt(config: PromptConfig): Prompt {\n const id = config.id || generatePromptId();\n\n return {\n id,\n description: config.description,\n\n async getContent(\n variables?: Record<string, unknown>,\n ): Promise<string> {\n // If static content\n if (config.content) {\n return interpolateVariables(config.content, variables || {});\n }\n\n // If dynamic generator\n if (config.generate) {\n return await config.generate(variables || {});\n }\n\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" has no content or generator`,\n }));\n },\n };\n}\n\n/**\n * Generate a unique prompt ID\n */\nlet promptIdCounter = 0;\nfunction generatePromptId(): string {\n return `prompt_${Date.now()}_${promptIdCounter++}`;\n}\n\n/**\n * Interpolate variables in prompt template\n * Replaces {variableName} with actual values\n */\nfunction interpolateVariables(\n template: string,\n variables: Record<string, unknown>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Prompt registry\n */\nclass PromptRegistryClass {\n private prompts = new Map<string, Prompt>();\n\n /**\n * Register a prompt\n */\n register(id: string, promptInstance: Prompt): void {\n if (this.prompts.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Prompt \"${id}\" is already registered. Overwriting.`);\n }\n\n this.prompts.set(id, promptInstance);\n }\n\n /**\n * Get a prompt by ID\n */\n get(id: string): Prompt | undefined {\n return this.prompts.get(id);\n }\n\n /**\n * Get prompt content by ID\n */\n async getContent(\n id: string,\n variables?: Record<string, unknown>,\n ): Promise<string> {\n const promptInstance = this.get(id);\n\n if (!promptInstance) {\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" not found`,\n }));\n }\n\n return await promptInstance.getContent(variables);\n }\n\n /**\n * Get all prompts\n */\n getAll(): Map<string, Prompt> {\n return new Map(this.prompts);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n this.prompts.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROMPT_REGISTRY_KEY = \"__veryfront_prompt_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalPrompt = globalThis as any;\nexport const promptRegistry: PromptRegistryClass = _globalPrompt[PROMPT_REGISTRY_KEY] ||=\n new PromptRegistryClass();\n", "/**\n * MCP Registry - Central registry for all MCP resources\n */\n\nimport type { MCPRegistry } from \"../types/mcp.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { toolRegistry } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\n\n/**\n * Get the global MCP registry\n */\nexport function getMCPRegistry(): MCPRegistry {\n return {\n tools: toolRegistry.getAll(),\n resources: resourceRegistry.getAll(),\n prompts: promptRegistry.getAll(),\n };\n}\n\n/**\n * Register a tool in the MCP registry\n */\nexport function registerTool(id: string, tool: Tool): void {\n toolRegistry.register(id, tool);\n}\n\n/**\n * Register a resource in the MCP registry\n */\nexport function registerResource(id: string, resource: Resource): void {\n resourceRegistry.register(id, resource);\n}\n\n/**\n * Register a prompt in the MCP registry\n */\nexport function registerPrompt(id: string, promptInstance: Prompt): void {\n promptRegistry.register(id, promptInstance);\n}\n\n/**\n * Get MCP registry stats\n */\nexport function getMCPStats(): {\n tools: number;\n resources: number;\n prompts: number;\n total: number;\n} {\n const registry = getMCPRegistry();\n\n return {\n tools: registry.tools.size,\n resources: registry.resources.size,\n prompts: registry.prompts.size,\n total: registry.tools.size + registry.resources.size + registry.prompts.size,\n };\n}\n\n/**\n * Clear all MCP registries (for testing)\n */\nexport function clearMCPRegistry(): void {\n toolRegistry.clear();\n resourceRegistry.clear();\n promptRegistry.clear();\n}\n", "/**\n * Agent Composition Utilities\n *\n * Enables agents to orchestrate other agents for complex workflows\n */\n\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport { z } from \"zod\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\n\n/**\n * Convert an agent to a tool that can be called by other agents\n *\n * @example\n * ```typescript\n * import { agent, agentAsTool } from 'veryfront/ai';\n *\n * const researchAgent = agent({\n * model: 'gpt-4',\n * system: 'You are a research assistant',\n * });\n *\n * const writerAgent = agent({\n * model: 'gpt-4',\n * system: 'You are a content writer',\n * });\n *\n * const orchestrator = agent({\n * model: 'gpt-4',\n * system: 'You coordinate research and writing',\n * tools: {\n * research: agentAsTool(researchAgent, 'Research a topic'),\n * write: agentAsTool(writerAgent, 'Write content'),\n * },\n * });\n * ```\n */\nexport function agentAsTool(\n agent: Agent,\n description: string,\n): Tool {\n return {\n id: `agent_${agent.id}`,\n type: \"function\",\n description,\n inputSchema: z.object({\n input: z.string().describe(\"Input for the agent\"),\n }),\n async execute({ input }) {\n const response = await agent.generate({ input });\n return {\n text: response.text,\n toolCalls: response.toolCalls.length,\n status: response.status,\n };\n },\n };\n}\n\n/**\n * Create a multi-agent workflow\n *\n * @example\n * ```typescript\n * import { createWorkflow } from 'veryfront/ai';\n *\n * const workflow = createWorkflow({\n * steps: [\n * { agent: researchAgent, name: 'research' },\n * { agent: writerAgent, name: 'write' },\n * { agent: editorAgent, name: 'edit' },\n * ],\n * });\n *\n * const result = await workflow.execute('Write about AI');\n * ```\n */\nexport interface WorkflowStep {\n /** Agent to execute */\n agent: Agent;\n\n /** Step name */\n name: string;\n\n /** Transform output before passing to next step */\n transform?: (output: string) => string | Promise<string>;\n\n /** Condition to skip this step */\n skip?: (context: Record<string, unknown>) => boolean | Promise<boolean>;\n}\n\nexport interface WorkflowConfig {\n /** Workflow steps */\n steps: WorkflowStep[];\n\n /** Initial context */\n initialContext?: Record<string, unknown>;\n}\n\nexport interface WorkflowResult {\n /** Final output */\n output: string;\n\n /** Results from each step */\n steps: Array<{\n name: string;\n output: string;\n skipped: boolean;\n }>;\n\n /** Combined context */\n context: Record<string, unknown>;\n}\n\n/**\n * Create a multi-agent workflow\n */\nexport function createWorkflow(config: WorkflowConfig) {\n return {\n async execute(input: string): Promise<WorkflowResult> {\n const result: WorkflowResult = {\n output: input,\n steps: [],\n context: { ...config.initialContext },\n };\n\n for (const step of config.steps) {\n // Check if step should be skipped\n if (step.skip && (await step.skip(result.context))) {\n result.steps.push({\n name: step.name,\n output: \"\",\n skipped: true,\n });\n continue;\n }\n\n // Execute agent\n const response = await step.agent.generate({\n input: result.output,\n context: result.context,\n });\n\n // Transform output if needed\n let output = response.text;\n if (step.transform) {\n output = await step.transform(output);\n }\n\n // Update result\n result.output = output;\n result.steps.push({\n name: step.name,\n output,\n skipped: false,\n });\n\n // Update context\n result.context[step.name] = output;\n }\n\n return result;\n },\n };\n}\n\n/**\n * Agent registry for composition and multi-agent workflows\n *\n * Note: This registry is primarily used for agent-to-agent orchestration.\n * For API routes, agents should be imported directly to ensure they are\n * bundled with the route and available at runtime.\n */\nclass AgentRegistryClass {\n private agents = new Map<string, Agent>();\n\n /**\n * Register an agent\n */\n register(id: string, agent: Agent): void {\n if (this.agents.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Agent \"${id}\" is already registered. Overwriting.`);\n }\n this.agents.set(id, agent);\n agentLogger.debug(`Registered agent: ${id}`);\n }\n\n /**\n * Get an agent by ID\n */\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n /**\n * Check if an agent exists\n */\n has(id: string): boolean {\n return this.agents.has(id);\n }\n\n /**\n * Get all agent IDs\n */\n getAllIds(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get all agents as a Map\n */\n getAll(): Map<string, Agent> {\n return new Map(this.agents);\n }\n\n /**\n * Clear all agents (for testing)\n */\n clear(): void {\n this.agents.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst AGENT_REGISTRY_KEY = \"__veryfront_agent_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalAgent = globalThis as any;\nexport const agentRegistry: AgentRegistryClass = _globalAgent[AGENT_REGISTRY_KEY] ||=\n new AgentRegistryClass();\n\n// Export class for type usage\nexport { AgentRegistryClass };\n\n/**\n * Register an agent for use by other agents\n */\nexport function registerAgent(id: string, agent: Agent): void {\n agentRegistry.register(id, agent);\n}\n\n/**\n * Get an agent by ID from the registry.\n * Returns undefined if agent not found.\n */\nexport function getAgent(id: string): Agent | undefined {\n return agentRegistry.get(id);\n}\n\n/**\n * Get all registered agent IDs\n */\nexport function getAllAgentIds(): string[] {\n return agentRegistry.getAllIds();\n}\n\n/**\n * Get all registered agents as tools\n */\nexport function getAgentsAsTools(descriptions?: Record<string, string>): Record<string, Tool> {\n const tools: Record<string, Tool> = {};\n\n for (const [id, agent] of agentRegistry.getAll()) {\n const description = descriptions?.[id] || `Call ${id} agent`;\n tools[id] = agentAsTool(agent, description);\n }\n\n return tools;\n}\n", "import { z } from \"zod\";\nimport type { VeryfrontConfig } from \"./types.ts\";\nimport { type ConfigContext, createError, toError } from \"../errors/veryfront-error.ts\";\n\nconst corsSchema = z.union([z.boolean(), z.object({ origin: z.string().optional() }).strict()]);\n\nexport const veryfrontConfigSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n experimental: z.object({\n esmLayouts: z.boolean().optional(),\n precompileMDX: z.boolean().optional(),\n }).partial().optional(),\n router: z.enum([\"app\", \"pages\"]).optional(),\n defaultLayout: z.string().optional(),\n theme: z\n .object({ colors: z.record(z.string()).optional() })\n .partial()\n .optional(),\n build: z\n .object({\n outDir: z.string().optional(),\n trailingSlash: z.boolean().optional(),\n esbuild: z\n .object({\n wasmURL: z.string().url().optional(),\n worker: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n cache: z\n .object({\n dir: z.string().optional(),\n bundleManifest: z\n .object({\n type: z.enum([\"redis\", \"kv\", \"memory\"]).optional(),\n redisUrl: z.string().optional(),\n keyPrefix: z.string().optional(),\n ttl: z.number().int().positive().optional(),\n enabled: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n dev: z\n .object({\n port: z.number().int().positive().optional(),\n host: z.string().optional(),\n open: z.boolean().optional(),\n hmr: z.boolean().optional(),\n components: z.array(z.string()).optional(),\n })\n .partial()\n .optional(),\n resolve: z\n .object({\n importMap: z\n .object({\n imports: z.record(z.string()).optional(),\n scopes: z.record(z.record(z.string())).optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n security: z\n .object({\n csp: z.record(z.array(z.string())).optional(),\n remoteHosts: z.array(z.string().url()).optional(),\n cors: corsSchema.optional(),\n coop: z.enum([\"same-origin\", \"same-origin-allow-popups\", \"unsafe-none\"]).optional(),\n corp: z.enum([\"same-origin\", \"same-site\", \"cross-origin\"]).optional(),\n coep: z.enum([\"require-corp\", \"unsafe-none\"]).optional(),\n })\n .partial()\n .optional(),\n middleware: z\n .object({\n custom: z.array(z.function()).optional(),\n })\n .partial()\n .optional(),\n theming: z\n .object({\n brandName: z.string().optional(),\n logoHtml: z.string().optional(),\n })\n .partial()\n .optional(),\n assetPipeline: z\n .object({\n images: z\n .object({\n enabled: z.boolean().optional(),\n formats: z.array(z.enum([\"webp\", \"avif\", \"jpeg\", \"png\"])).optional(),\n sizes: z.array(z.number().int().positive()).optional(),\n quality: z.number().int().min(1).max(100).optional(),\n inputDir: z.string().optional(),\n outputDir: z.string().optional(),\n preserveOriginal: z.boolean().optional(),\n })\n .partial()\n .optional(),\n css: z\n .object({\n enabled: z.boolean().optional(),\n minify: z.boolean().optional(),\n autoprefixer: z.boolean().optional(),\n purge: z.boolean().optional(),\n criticalCSS: z.boolean().optional(),\n inputDir: z.string().optional(),\n outputDir: z.string().optional(),\n browsers: z.array(z.string()).optional(),\n purgeContent: z.array(z.string()).optional(),\n sourceMap: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n observability: z\n .object({\n tracing: z\n .object({\n enabled: z.boolean().optional(),\n exporter: z.enum([\"jaeger\", \"zipkin\", \"otlp\", \"console\"]).optional(),\n endpoint: z.string().optional(),\n serviceName: z.string().optional(),\n sampleRate: z.number().min(0).max(1).optional(),\n })\n .partial()\n .optional(),\n metrics: z\n .object({\n enabled: z.boolean().optional(),\n exporter: z.enum([\"prometheus\", \"otlp\", \"console\"]).optional(),\n endpoint: z.string().optional(),\n prefix: z.string().optional(),\n collectInterval: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n fs: z\n .object({\n type: z.enum([\"local\", \"veryfront-api\", \"memory\"]).optional(),\n local: z\n .object({\n baseDir: z.string().optional(),\n })\n .partial()\n .optional(),\n veryfront: z\n .object({\n apiBaseUrl: z.string().url(),\n apiToken: z.string(),\n projectSlug: z.string(),\n cache: z\n .object({\n enabled: z.boolean().optional(),\n ttl: z.number().int().positive().optional(),\n maxSize: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n retry: z\n .object({\n maxRetries: z.number().int().min(0).optional(),\n initialDelay: z.number().int().positive().optional(),\n maxDelay: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n memory: z\n .object({\n files: z.record(z.union([z.string(), z.instanceof(Uint8Array)])).optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n client: z\n .object({\n moduleResolution: z.enum([\"cdn\", \"self-hosted\", \"bundled\"]).optional(),\n cdn: z\n .object({\n provider: z.enum([\"esm.sh\", \"unpkg\", \"jsdelivr\"]).optional(),\n versions: z\n .union([\n z.literal(\"auto\"),\n z.object({\n react: z.string().optional(),\n veryfront: z.string().optional(),\n }),\n ])\n .optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n })\n .partial();\n\nexport type VeryfrontConfigInput = z.input<typeof veryfrontConfigSchema>;\n\nexport function validateVeryfrontConfig(input: unknown): VeryfrontConfig {\n const parsed = veryfrontConfigSchema.safeParse(input);\n if (!parsed.success) {\n const first = parsed.error.issues[0];\n const path = first?.path?.length ? first.path.join(\".\") : \"<root>\";\n const expected = first?.message || String(first);\n let hint = \"\";\n if (String(path).includes(\"security.cors\")) {\n hint = \" Expected boolean or { origin?: string }.\";\n }\n\n const context: ConfigContext = {\n field: path,\n expected: expected + hint,\n value: input,\n };\n\n throw toError(\n createError({\n type: \"config\",\n message: `Invalid veryfront.config at ${path}: ${expected}.${hint}`,\n context,\n }),\n );\n }\n return parsed.data as VeryfrontConfig;\n}\n\nexport function findUnknownTopLevelKeys(input: Record<string, unknown>): string[] {\n const known = new Set([\n \"title\",\n \"description\",\n \"experimental\",\n \"router\",\n \"defaultLayout\",\n \"theme\",\n \"build\",\n \"cache\",\n \"dev\",\n \"resolve\",\n \"security\",\n \"middleware\",\n \"theming\",\n \"assetPipeline\",\n \"observability\",\n \"fs\",\n \"client\",\n ]);\n return Object.keys(input).filter((k) => !known.has(k));\n}\n", "import type { VeryfrontConfig } from \"./types.ts\";\nimport { findUnknownTopLevelKeys, validateVeryfrontConfig } from \"./schema.ts\";\nimport { join } from \"std/path/mod.ts\";\nimport type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport { serverLogger } from \"@veryfront/utils/logger/logger.ts\";\nimport { getReactImportMap, REACT_DEFAULT_VERSION } from \"@veryfront/utils/constants/cdn.ts\";\nimport { DEFAULT_CACHE_DIR } from \"@veryfront/utils/constants/server.ts\";\nimport { DEFAULT_PORT } from \"./defaults.ts\";\n\nexport type { VeryfrontConfig } from \"./types.ts\";\n\nfunction getDefaultImportMapForConfig() {\n return { imports: getReactImportMap(REACT_DEFAULT_VERSION) };\n}\n\nconst DEFAULT_CONFIG: Partial<VeryfrontConfig> = {\n title: \"Veryfront App\",\n description: \"Built with Veryfront\",\n experimental: {\n esmLayouts: true,\n },\n router: undefined,\n defaultLayout: undefined,\n theme: {\n colors: {\n primary: \"#3B82F6\",\n },\n },\n build: {\n outDir: \"dist\",\n trailingSlash: false,\n esbuild: {\n wasmURL: \"https://deno.land/x/esbuild@v0.20.1/esbuild.wasm\",\n worker: false,\n },\n },\n cache: {\n dir: DEFAULT_CACHE_DIR,\n render: {\n type: \"memory\",\n ttl: undefined,\n maxEntries: 500,\n kvPath: undefined,\n redisUrl: undefined,\n redisKeyPrefix: undefined,\n },\n },\n dev: {\n port: DEFAULT_PORT,\n host: \"localhost\",\n open: false,\n },\n resolve: {\n importMap: getDefaultImportMapForConfig(),\n },\n client: {\n moduleResolution: \"cdn\",\n cdn: {\n provider: \"esm.sh\",\n versions: \"auto\",\n },\n },\n};\n\nconst configCacheByProject = new Map<string, { revision: number; config: VeryfrontConfig }>();\nlet cacheRevision = 0;\n\nfunction validateCorsConfig(userConfig: unknown): void {\n if (!userConfig || typeof userConfig !== \"object\") {\n return;\n }\n const config = userConfig as Record<string, unknown>;\n const security = config.security as Record<string, unknown> | undefined;\n const cors = security?.cors;\n if (!cors || typeof cors !== \"object\" || Array.isArray(cors)) {\n return;\n }\n\n const corsObj = cors as Record<string, unknown>;\n const origin = corsObj.origin;\n if (origin !== undefined && typeof origin !== \"string\") {\n throw new ConfigValidationError(\n \"security.cors.origin must be a string. Expected boolean or { origin?: string }\",\n );\n }\n}\n\nfunction validateConfigShape(userConfig: unknown): void {\n validateVeryfrontConfig(userConfig);\n const unknown = typeof userConfig === \"object\" && userConfig\n ? findUnknownTopLevelKeys(userConfig as Record<string, unknown>)\n : [];\n if (unknown.length > 0) {\n serverLogger.warn(`Unknown config keys: ${unknown.join(\", \")}. These will be ignored.`);\n }\n}\n\nfunction mergeConfigs(userConfig: Partial<VeryfrontConfig>): VeryfrontConfig {\n const merged: VeryfrontConfig = {\n ...DEFAULT_CONFIG,\n ...userConfig,\n dev: {\n ...DEFAULT_CONFIG.dev,\n ...userConfig.dev,\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...userConfig.theme,\n },\n build: {\n ...DEFAULT_CONFIG.build,\n ...userConfig.build,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...userConfig.cache,\n },\n resolve: {\n ...DEFAULT_CONFIG.resolve,\n ...userConfig.resolve,\n },\n client: {\n ...DEFAULT_CONFIG.client,\n ...userConfig.client,\n cdn: {\n ...DEFAULT_CONFIG.client?.cdn,\n ...userConfig.client?.cdn,\n },\n },\n } as VeryfrontConfig;\n\n if (merged.resolve) {\n const defaultMap = DEFAULT_CONFIG.resolve?.importMap;\n const userMap = userConfig.resolve?.importMap;\n\n if (defaultMap || userMap) {\n merged.resolve.importMap = {\n imports: {\n ...(defaultMap?.imports ?? {}),\n ...(userMap?.imports ?? {}),\n },\n scopes: {\n ...(defaultMap?.scopes ?? {}),\n ...(userMap?.scopes ?? {}),\n },\n };\n }\n }\n\n return merged;\n}\n\nclass ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigValidationError\";\n }\n}\n\nasync function loadAndMergeConfig(\n configPath: string,\n projectDir: string,\n): Promise<VeryfrontConfig | null> {\n try {\n const configUrl = `file://${configPath}?t=${Date.now()}-${crypto.randomUUID()}`;\n const configModule = await import(configUrl);\n const userConfig = configModule.default || configModule;\n\n if (userConfig === null || typeof userConfig !== \"object\" || Array.isArray(userConfig)) {\n throw new ConfigValidationError(\n `Expected object, received ${userConfig === null ? \"null\" : typeof userConfig}`,\n );\n }\n\n validateCorsConfig(userConfig);\n validateConfigShape(userConfig);\n\n const merged = mergeConfigs(userConfig);\n configCacheByProject.set(projectDir, { revision: cacheRevision, config: merged });\n return merged;\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.startsWith(\"Invalid veryfront.config\")) {\n throw error;\n }\n\n throw error;\n }\n}\n\nexport async function getConfig(\n projectDir: string,\n adapter: RuntimeAdapter,\n): Promise<VeryfrontConfig> {\n const cached = configCacheByProject.get(projectDir);\n if (cached && cached.revision === cacheRevision) return cached.config;\n\n const configFiles = [\"veryfront.config.js\", \"veryfront.config.ts\", \"veryfront.config.mjs\"];\n\n for (const configFile of configFiles) {\n const configPath = join(projectDir, configFile);\n\n const exists = await adapter.fs.exists(configPath);\n if (!exists) continue;\n\n try {\n const merged = await loadAndMergeConfig(configPath, projectDir);\n if (merged) return merged;\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.startsWith(\"Invalid veryfront.config\")) {\n throw error;\n }\n\n // Only log at debug level - this is expected when .ts exists but .js is tried first\n const errorMessage = error instanceof Error ? error.message : String(error);\n serverLogger.debug(`[CONFIG] Failed to load ${configFile}, trying next config file:`, {\n error: errorMessage,\n });\n\n continue;\n }\n }\n\n const defaultConfig = DEFAULT_CONFIG as VeryfrontConfig;\n configCacheByProject.set(projectDir, { revision: cacheRevision, config: defaultConfig });\n return defaultConfig;\n}\n\nexport function clearConfigCache() {\n configCacheByProject.clear();\n cacheRevision++;\n}\n", "{\n \"name\": \"veryfront\",\n \"version\": \"0.0.73\",\n \"nodeModulesDir\": \"auto\",\n \"exclude\": [\n \"npm/\",\n \"dist/\",\n \"coverage/\",\n \"scripts/\",\n \"examples/\",\n \"src/cli/templates/files/\",\n \"src/cli/templates/integrations/\"\n ],\n \"exports\": {\n \".\": \"./src/index.ts\",\n \"./cli\": \"./src/cli/main.ts\",\n \"./server\": \"./src/server/index.ts\",\n \"./middleware\": \"./src/middleware/index.ts\",\n \"./components\": \"./src/react/components/index.ts\",\n \"./data\": \"./src/data/index.ts\",\n \"./config\": \"./src/core/config/index.ts\",\n \"./platform\": \"./src/platform/index.ts\",\n \"./ai\": \"./src/ai/index.ts\",\n \"./ai/client\": \"./src/ai/client.ts\",\n \"./ai/react\": \"./src/ai/react/index.ts\",\n \"./ai/primitives\": \"./src/ai/react/primitives/index.ts\",\n \"./ai/components\": \"./src/ai/react/components/index.ts\",\n \"./ai/production\": \"./src/ai/production/index.ts\",\n \"./ai/dev\": \"./src/ai/dev/index.ts\",\n \"./ai/workflow\": \"./src/ai/workflow/index.ts\",\n \"./ai/workflow/react\": \"./src/ai/workflow/react/index.ts\",\n \"./oauth\": \"./src/core/oauth/index.ts\",\n \"./oauth/providers\": \"./src/core/oauth/providers/index.ts\",\n \"./oauth/handlers\": \"./src/core/oauth/handlers/index.ts\",\n \"./oauth/token-store\": \"./src/core/oauth/token-store/index.ts\"\n },\n \"imports\": {\n \"@veryfront\": \"./src/index.ts\",\n \"@veryfront/\": \"./src/\",\n \"@veryfront/ai\": \"./src/ai/index.ts\",\n \"@veryfront/ai/\": \"./src/ai/\",\n \"@veryfront/platform\": \"./src/platform/index.ts\",\n \"@veryfront/platform/\": \"./src/platform/\",\n \"@veryfront/types\": \"./src/core/types/index.ts\",\n \"@veryfront/types/\": \"./src/core/types/\",\n \"@veryfront/utils\": \"./src/core/utils/index.ts\",\n \"@veryfront/utils/\": \"./src/core/utils/\",\n \"@veryfront/middleware\": \"./src/middleware/index.ts\",\n \"@veryfront/middleware/\": \"./src/middleware/\",\n \"@veryfront/errors\": \"./src/core/errors/index.ts\",\n \"@veryfront/errors/\": \"./src/core/errors/\",\n \"@veryfront/config\": \"./src/core/config/index.ts\",\n \"@veryfront/config/\": \"./src/core/config/\",\n \"@veryfront/observability\": \"./src/observability/index.ts\",\n \"@veryfront/observability/\": \"./src/observability/\",\n \"@veryfront/routing\": \"./src/routing/index.ts\",\n \"@veryfront/routing/\": \"./src/routing/\",\n \"@veryfront/transforms\": \"./src/build/transforms/index.ts\",\n \"@veryfront/transforms/\": \"./src/build/transforms/\",\n \"@veryfront/data\": \"./src/data/index.ts\",\n \"@veryfront/data/\": \"./src/data/\",\n \"@veryfront/security\": \"./src/security/index.ts\",\n \"@veryfront/security/\": \"./src/security/\",\n \"@veryfront/components\": \"./src/react/components/index.ts\",\n \"@veryfront/react\": \"./src/react/index.ts\",\n \"@veryfront/react/\": \"./src/react/\",\n \"@veryfront/html\": \"./src/html/index.ts\",\n \"@veryfront/html/\": \"./src/html/\",\n \"@veryfront/rendering\": \"./src/rendering/index.ts\",\n \"@veryfront/rendering/\": \"./src/rendering/\",\n \"@veryfront/build\": \"./src/build/index.ts\",\n \"@veryfront/build/\": \"./src/build/\",\n \"@veryfront/server\": \"./src/server/index.ts\",\n \"@veryfront/server/\": \"./src/server/\",\n \"@veryfront/modules\": \"./src/module-system/index.ts\",\n \"@veryfront/modules/\": \"./src/module-system/\",\n \"@veryfront/compat/console\": \"./src/platform/compat/console/index.ts\",\n \"@veryfront/compat/\": \"./src/platform/compat/\",\n \"@veryfront/oauth\": \"./src/core/oauth/index.ts\",\n \"@veryfront/oauth/\": \"./src/core/oauth/\",\n \"std/\": \"https://deno.land/std@0.220.0/\",\n \"@std/path\": \"https://deno.land/std@0.220.0/path/mod.ts\",\n \"@std/testing/bdd.ts\": \"https://deno.land/std@0.220.0/testing/bdd.ts\",\n \"@std/expect\": \"https://deno.land/std@0.220.0/expect/mod.ts\",\n \"csstype\": \"https://esm.sh/csstype@3.2.3\",\n \"@types/react\": \"https://esm.sh/@types/react@18.3.27?deps=csstype@3.2.3\",\n \"@types/react-dom\": \"https://esm.sh/@types/react-dom@18.3.7?deps=csstype@3.2.3\",\n \"react\": \"https://esm.sh/react@18.3.1\",\n \"react-dom\": \"https://esm.sh/react-dom@18.3.1\",\n \"react-dom/server\": \"https://esm.sh/react-dom@18.3.1/server\",\n \"react-dom/client\": \"https://esm.sh/react-dom@18.3.1/client\",\n \"react/jsx-runtime\": \"https://esm.sh/react@18.3.1/jsx-runtime\",\n \"react/jsx-dev-runtime\": \"https://esm.sh/react@18.3.1/jsx-dev-runtime\",\n \"@mdx-js/mdx\": \"npm:@mdx-js/mdx@3.0.0\",\n \"@mdx-js/react\": \"npm:@mdx-js/react@3.0.0\",\n \"unist-util-visit\": \"npm:unist-util-visit@5.0.0\",\n \"mdast-util-to-string\": \"npm:mdast-util-to-string@4.0.0\",\n \"github-slugger\": \"npm:github-slugger@2.0.0\",\n \"remark-gfm\": \"npm:remark-gfm@4.0.1\",\n \"remark-frontmatter\": \"npm:remark-frontmatter@5.0.0\",\n \"rehype-highlight\": \"npm:rehype-highlight@7.0.2\",\n \"rehype-slug\": \"npm:rehype-slug@6.0.0\",\n \"esbuild\": \"https://deno.land/x/esbuild@v0.20.1/wasm.js\",\n \"esbuild/mod.js\": \"https://deno.land/x/esbuild@v0.20.1/mod.js\",\n \"es-module-lexer\": \"npm:es-module-lexer@1.5.0\",\n \"zod\": \"npm:zod@3.23.8\",\n \"mime-types\": \"npm:mime-types@2.1.35\",\n \"mdast\": \"npm:@types/mdast@4.0.3\",\n \"hast\": \"npm:@types/hast@3.0.3\",\n \"unist\": \"npm:@types/unist@3.0.2\",\n \"unified\": \"npm:unified@11.0.5\",\n \"ai\": \"https://esm.sh/ai@5.0.76?deps=react@18.3.1,react-dom@18.3.1\",\n \"ai/react\": \"https://esm.sh/@ai-sdk/react@2.0.1?deps=react@18.3.1,react-dom@18.3.1\",\n \"@ai-sdk/react\": \"https://esm.sh/@ai-sdk/react@2.0.1?deps=react@18.3.1,react-dom@18.3.1\",\n \"@ai-sdk/openai\": \"https://esm.sh/@ai-sdk/openai@2.0.1\",\n \"@ai-sdk/anthropic\": \"https://esm.sh/@ai-sdk/anthropic@2.0.1\",\n \"unocss\": \"https://esm.sh/unocss@0.59.0\",\n \"@unocss/core\": \"https://esm.sh/@unocss/core@0.59.0\",\n \"@unocss/preset-wind\": \"https://esm.sh/@unocss/preset-wind@0.59.0\",\n \"redis\": \"npm:redis\",\n \"pg\": \"npm:pg\",\n \"@opentelemetry/api\": \"npm:@opentelemetry/api@1\",\n \"@opentelemetry/core\": \"npm:@opentelemetry/core@1\"\n },\n \"compilerOptions\": {\n \"jsx\": \"react-jsx\",\n \"jsxImportSource\": \"react\",\n \"strict\": true,\n \"noImplicitAny\": true,\n \"noUncheckedIndexedAccess\": true,\n \"types\": [],\n \"lib\": [\n \"deno.window\",\n \"dom\",\n \"dom.iterable\",\n \"dom.asynciterable\",\n \"deno.ns\"\n ]\n },\n \"tasks\": {\n \"setup\": \"deno run --allow-all scripts/setup.ts\",\n \"dev\": \"deno run --allow-all --no-lock --unstable-net --unstable-worker-options src/cli/main.ts dev\",\n \"build\": \"deno compile --allow-all --output ../../bin/veryfront src/cli/main.ts\",\n \"build:npm\": \"deno run -A scripts/build-npm.ts\",\n \"release\": \"deno run -A scripts/release.ts\",\n \"test\": \"DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --unstable-worker-options --unstable-net\",\n \"test:unit\": \"DENO_JOBS=1 deno test --parallel --allow-all --v8-flags=--max-old-space-size=8192 --ignore=tests --unstable-worker-options --unstable-net\",\n \"test:integration\": \"DENO_JOBS=1 deno test --parallel --fail-fast --allow-all tests --unstable-worker-options --unstable-net\",\n \"test:coverage\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --unstable-worker-options --unstable-net || exit 1\",\n \"test:coverage:unit\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --ignore=tests --unstable-worker-options --unstable-net || exit 1\",\n \"test:coverage:integration\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage tests --unstable-worker-options --unstable-net || exit 1\",\n \"coverage:report\": \"deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --lcov > coverage/lcov.info && deno run --allow-read scripts/check-coverage.ts 80\",\n \"coverage:html\": \"deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --html\",\n \"lint\": \"DENO_NO_PACKAGE_JSON=1 deno lint src/\",\n \"fmt\": \"deno fmt src/\",\n \"typecheck\": \"deno check src/index.ts src/cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/build/transforms/index.ts src/core/config/index.ts src/core/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/module-system/index.ts\",\n \"docs:check-links\": \"deno run -A scripts/check-doc-links.ts\",\n \"lint:ban-console\": \"deno run --allow-read scripts/ban-console.ts\",\n \"lint:ban-deep-imports\": \"deno run --allow-read scripts/ban-deep-imports.ts\",\n \"lint:ban-internal-root-imports\": \"deno run --allow-read scripts/ban-internal-root-imports.ts\",\n \"lint:check-awaits\": \"deno run --allow-read scripts/check-unawaited-promises.ts\",\n \"lint:platform\": \"deno run --allow-read scripts/lint-platform-agnostic.ts\",\n \"check:circular\": \"deno run -A jsr:@cunarist/deno-circular-deps src/index.ts\"\n },\n \"lint\": {\n \"include\": [\n \"src/**/*.ts\",\n \"src/**/*.tsx\"\n ],\n \"exclude\": [\n \"dist/\",\n \"coverage/\"\n ],\n \"rules\": {\n \"tags\": [\n \"recommended\"\n ],\n \"include\": [\n \"ban-untagged-todo\"\n ],\n \"exclude\": [\n \"no-explicit-any\",\n \"no-process-global\",\n \"no-console\"\n ]\n }\n },\n \"fmt\": {\n \"include\": [\n \"src/**/*.ts\",\n \"src/**/*.tsx\"\n ],\n \"exclude\": [\n \"dist/\",\n \"coverage/\"\n ],\n \"options\": {\n \"useTabs\": false,\n \"lineWidth\": 100,\n \"indentWidth\": 2,\n \"semiColons\": true,\n \"singleQuote\": false,\n \"proseWrap\": \"preserve\"\n }\n }\n}\n", "import denoConfig from \"../../../deno.json\" with { type: \"json\" };\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\nexport const VERSION: string = getEnv(\"VERYFRONT_VERSION\") ||\n (typeof denoConfig.version === \"string\" ? denoConfig.version : \"0.0.0\");\n", "export const ESM_CDN_BASE = \"https://esm.sh\";\n\nexport const JSDELIVR_CDN_BASE = \"https://cdn.jsdelivr.net\";\n\nexport const DENO_STD_BASE = \"https://deno.land\";\n\nexport const REACT_VERSION_17 = \"17.0.2\";\nexport const REACT_VERSION_18_2 = \"18.2.0\";\nexport const REACT_VERSION_18_3 = \"18.3.1\";\nexport const REACT_VERSION_19_RC = \"19.0.0-rc.0\";\nexport const REACT_VERSION_19 = \"19.1.1\";\n\nexport const REACT_DEFAULT_VERSION = REACT_VERSION_18_3;\n\nexport function getReactCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}`;\n}\n\nexport function getReactDOMCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}`;\n}\n\nexport function getReactDOMClientCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}/client`;\n}\n\nexport function getReactDOMServerCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}/server`;\n}\n\nexport function getReactJSXRuntimeCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}/jsx-runtime`;\n}\n\nexport function getReactJSXDevRuntimeCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}/jsx-dev-runtime`;\n}\n\nexport function getReactImportMap(version: string = REACT_DEFAULT_VERSION): Record<string, string> {\n return {\n react: getReactCDNUrl(version),\n \"react-dom\": getReactDOMCDNUrl(version),\n \"react-dom/client\": getReactDOMClientCDNUrl(version),\n \"react-dom/server\": getReactDOMServerCDNUrl(version),\n \"react/jsx-runtime\": getReactJSXRuntimeCDNUrl(version),\n \"react/jsx-dev-runtime\": getReactJSXDevRuntimeCDNUrl(version),\n };\n}\n\nexport const DEFAULT_ALLOWED_CDN_HOSTS = [ESM_CDN_BASE, DENO_STD_BASE];\n\nexport const DENO_STD_VERSION = \"0.220.0\";\n\nexport function getDenoStdNodeBase(): string {\n return `${DENO_STD_BASE}/std@${DENO_STD_VERSION}/node`;\n}\n\n// UnoCSS constants\nexport const UNOCSS_VERSION = \"0.59.0\";\n\nexport function getUnoCSSTailwindResetUrl(): string {\n return `${ESM_CDN_BASE}/@unocss/reset@${UNOCSS_VERSION}/tailwind.css`;\n}\n\n// Veryfront package version - derived from deno.json (single source of truth)\nexport { VERSION as VERYFRONT_VERSION } from \"../version.ts\";\n", "/**\n * Default port for veryfront dev server.\n * This is the single source of truth for the default port.\n */\nexport const DEFAULT_PORT = 3000;\n\nexport const DEFAULT_TIMEOUT_MS = 5000;\n\nexport const SSR_TIMEOUT_MS = 10000;\n\nexport const SANDBOX_TIMEOUT_MS = 5000;\n\nexport const DEFAULT_CACHE_MAX_SIZE = 100;\n\nexport const defaultConfig = {\n server: {\n port: DEFAULT_PORT,\n hostname: \"0.0.0.0\",\n },\n\n timeouts: {\n default: DEFAULT_TIMEOUT_MS,\n api: 30000,\n ssr: SSR_TIMEOUT_MS,\n hmr: 30000,\n sandbox: SANDBOX_TIMEOUT_MS,\n },\n\n cache: {\n jit: {\n maxSize: DEFAULT_CACHE_MAX_SIZE,\n tempDirPrefix: \"vf-bundle-\",\n },\n },\n\n metrics: {\n ssrBoundaries: [5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000],\n },\n} as const;\n\nexport const DEFAULT_PREFETCH_DELAY_MS = 100;\n\nexport const DEFAULT_METRICS_COLLECT_INTERVAL_MS = 60000;\n\nexport const DURATION_HISTOGRAM_BOUNDARIES_MS = [\n 5,\n 10,\n 25,\n 50,\n 75,\n 100,\n 250,\n 500,\n 750,\n 1000,\n 2500,\n 5000,\n 7500,\n 10000,\n];\n\nexport const SIZE_HISTOGRAM_BOUNDARIES_KB = [\n 1,\n 5,\n 10,\n 25,\n 50,\n 100,\n 250,\n 500,\n 1000,\n 2500,\n 5000,\n 10000,\n];\n\nexport const DEFAULT_REDIS_SCAN_COUNT = 100;\n\nexport const DEFAULT_REDIS_BATCH_DELETE_SIZE = 1000;\n\nexport const PAGE_TRANSITION_DELAY_MS = 150;\n\nexport type DefaultConfig = typeof defaultConfig;\n", "/**\n * Centralized server endpoints and paths registry\n *\n * All internal veryfront URLs should be defined here as the single source of truth.\n * This prevents hardcoding URLs across the codebase and makes refactoring easier.\n */\n\n// Re-export DEFAULT_PORT from config/defaults.ts (the single source of truth)\nexport { DEFAULT_PORT } from \"@veryfront/config/defaults.ts\";\n\n/** Default port for development dashboard */\nexport const DEFAULT_DASHBOARD_PORT = 3002;\n\n/** Internal URL prefix for all veryfront endpoints */\nexport const INTERNAL_PREFIX = \"/_veryfront\" as const;\n\n/**\n * All internal veryfront URL path prefixes (directories)\n */\nexport const INTERNAL_PATH_PREFIXES = {\n /** React Server Components endpoints */\n RSC: `${INTERNAL_PREFIX}/rsc/`,\n /** File system access endpoints (base64 encoded paths) */\n FS: `${INTERNAL_PREFIX}/fs/`,\n /** Virtual module system */\n MODULES: `${INTERNAL_PREFIX}/modules/`,\n /** Generated page modules */\n PAGES: `${INTERNAL_PREFIX}/pages/`,\n /** Data JSON endpoints */\n DATA: `${INTERNAL_PREFIX}/data/`,\n /** Library modules (AI SDK, etc.) */\n LIB: `${INTERNAL_PREFIX}/lib/`,\n /** Chunk assets */\n CHUNKS: `${INTERNAL_PREFIX}/chunks/`,\n /** Client component modules */\n CLIENT: `${INTERNAL_PREFIX}/client/`,\n} as const;\n\n/**\n * Specific internal endpoint URLs\n */\nexport const INTERNAL_ENDPOINTS = {\n // Development endpoints\n HMR_RUNTIME: `${INTERNAL_PREFIX}/hmr-runtime.js`,\n HMR: `${INTERNAL_PREFIX}/hmr.js`,\n HYDRATE: `${INTERNAL_PREFIX}/hydrate.js`,\n ERROR_OVERLAY: `${INTERNAL_PREFIX}/error-overlay.js`,\n DEV_LOADER: `${INTERNAL_PREFIX}/dev-loader.js`,\n CLIENT_LOG: `${INTERNAL_PREFIX}/log`,\n\n // Production endpoints\n CLIENT_JS: `${INTERNAL_PREFIX}/client.js`,\n ROUTER_JS: `${INTERNAL_PREFIX}/router.js`,\n PREFETCH_JS: `${INTERNAL_PREFIX}/prefetch.js`,\n MANIFEST_JSON: `${INTERNAL_PREFIX}/manifest.json`,\n APP_JS: `${INTERNAL_PREFIX}/app.js`,\n\n // RSC endpoints\n RSC_CLIENT: `${INTERNAL_PREFIX}/rsc/client.js`,\n RSC_MANIFEST: `${INTERNAL_PREFIX}/rsc/manifest`,\n RSC_STREAM: `${INTERNAL_PREFIX}/rsc/stream`,\n RSC_PAYLOAD: `${INTERNAL_PREFIX}/rsc/payload`,\n RSC_RENDER: `${INTERNAL_PREFIX}/rsc/render`,\n RSC_PAGE: `${INTERNAL_PREFIX}/rsc/page`,\n RSC_MODULE: `${INTERNAL_PREFIX}/rsc/module`,\n RSC_DOM: `${INTERNAL_PREFIX}/rsc/dom.js`,\n RSC_HYDRATOR: `${INTERNAL_PREFIX}/rsc/hydrator.js`,\n RSC_HYDRATE_CLIENT: `${INTERNAL_PREFIX}/rsc/hydrate-client.js`,\n\n // Library module endpoints\n LIB_AI_REACT: `${INTERNAL_PREFIX}/lib/ai/react.js`,\n LIB_AI_COMPONENTS: `${INTERNAL_PREFIX}/lib/ai/components.js`,\n LIB_AI_PRIMITIVES: `${INTERNAL_PREFIX}/lib/ai/primitives.js`,\n} as const;\n\n/**\n * Build output directory paths (relative)\n */\nexport const BUILD_DIRS = {\n /** Main build output directory */\n ROOT: \"_veryfront\",\n /** Chunks directory */\n CHUNKS: \"_veryfront/chunks\",\n /** Data directory */\n DATA: \"_veryfront/data\",\n /** Assets directory */\n ASSETS: \"_veryfront/assets\",\n} as const;\n\n/**\n * Local project directory paths (relative to project root)\n * These are .gitignore'd directories for caching and temporary files\n */\nexport const PROJECT_DIRS = {\n /** Base veryfront internal directory */\n ROOT: \".veryfront\",\n /** Cache directory for build artifacts, transforms, etc. */\n CACHE: \".veryfront/cache\",\n /** KV store directory */\n KV: \".veryfront/kv\",\n /** Log files directory */\n LOGS: \".veryfront/logs\",\n /** Temporary files directory */\n TMP: \".veryfront/tmp\",\n} as const;\n\n/** Default cache directory path */\nexport const DEFAULT_CACHE_DIR = PROJECT_DIRS.CACHE;\n\n/**\n * Helper to check if a pathname is an internal veryfront endpoint\n */\nexport function isInternalEndpoint(pathname: string): boolean {\n return pathname.startsWith(INTERNAL_PREFIX + \"/\");\n}\n\n/**\n * Helper to check if a pathname is a static asset (has extension or is internal)\n */\nexport function isStaticAsset(pathname: string): boolean {\n return pathname.includes(\".\") || isInternalEndpoint(pathname);\n}\n\n/**\n * Normalize a chunk path to include the base prefix\n */\nexport function normalizeChunkPath(\n filename: string,\n basePath: string = INTERNAL_PATH_PREFIXES.CHUNKS,\n): string {\n if (filename.startsWith(\"/\")) {\n return filename;\n }\n return `${basePath.replace(/\\/$/, \"\")}/${filename}`;\n}\n\n// Re-export for backward compatibility\nexport const DEV_SERVER_ENDPOINTS = {\n HMR_RUNTIME: INTERNAL_ENDPOINTS.HMR_RUNTIME,\n ERROR_OVERLAY: INTERNAL_ENDPOINTS.ERROR_OVERLAY,\n} as const;\n", "import { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { RuntimeAdapter } from \"./base.ts\";\n\nexport interface MockRuntimeAdapter extends RuntimeAdapter {\n fs: RuntimeAdapter[\"fs\"] & {\n files: Map<string, string>;\n directories: Set<string>;\n };\n}\n\n/**\n * Mock RuntimeAdapter for testing\n *\n * Provides an in-memory filesystem and environment for unit testing.\n * This adapter is useful for testing code that depends on the filesystem\n * without requiring actual file I/O.\n *\n * @example\n * ```typescript\n * const adapter = createMockAdapter();\n * adapter.fs.files.set(\"/project/pages/index.tsx\", \"export default () => <div>Home</div>\");\n * const content = await adapter.fs.readFile(\"/project/pages/index.tsx\");\n * ```\n */\n\n/**\n * Creates a mock RuntimeAdapter for testing\n *\n * The mock adapter uses in-memory Map and Set for file storage:\n * - `files`: Map<string, string> for file contents\n * - `directories`: Set<string> for tracking directories\n * - `envVars`: Map<string, string> for environment variables\n */\nexport function createMockAdapter(): MockRuntimeAdapter {\n const files = new Map<string, string>();\n const directories = new Set<string>();\n const envVars = new Map<string, string>();\n\n return {\n id: \"memory\" as const,\n name: \"mock\",\n /** @deprecated Use `id` instead */\n platform: \"memory\" as const,\n capabilities: {\n typescript: false,\n jsx: false,\n http2: false,\n websocket: false,\n workers: false,\n fileWatching: false,\n shell: false,\n kvStore: false,\n writableFs: true, // In-memory writes work\n },\n serve: (_handler, _options) => {\n return Promise.resolve({\n stop: () => Promise.resolve(),\n addr: { hostname: \"localhost\", port: 8000 },\n });\n },\n fs: {\n files,\n directories,\n readFile: (path: string) => {\n const content = files.get(path);\n if (!content) {\n throw toError(createError({\n type: \"file\",\n message: `File not found: ${path}`,\n }));\n }\n return Promise.resolve(content);\n },\n readFileBytes: (path: string) => {\n const content = files.get(path);\n if (!content) {\n throw toError(createError({\n type: \"file\",\n message: `File not found: ${path}`,\n }));\n }\n return Promise.resolve(new TextEncoder().encode(content));\n },\n writeFile: (path: string, content: string) => {\n files.set(path, content);\n return Promise.resolve();\n },\n exists: (path: string) => {\n if (files.has(path)) return Promise.resolve(true);\n if (directories.has(path)) return Promise.resolve(true);\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) return Promise.resolve(true);\n }\n return Promise.resolve(false);\n },\n readDir: async function* (path: string) {\n const entries = new Map<string, { isFile: boolean; isDirectory: boolean }>();\n\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) {\n const relativePath = filePath.slice(path.length + 1);\n const parts = relativePath.split(\"/\");\n const name = parts[0]!;\n\n if (!entries.has(name)) {\n entries.set(name, {\n isFile: parts.length === 1,\n isDirectory: parts.length > 1,\n });\n }\n }\n }\n\n for (const [name, meta] of entries.entries()) {\n yield { name, ...meta, isSymlink: false };\n }\n },\n stat: (path: string) => {\n if (files.has(path)) {\n const content = files.get(path)!;\n return Promise.resolve({\n size: content.length,\n isFile: true,\n isDirectory: false,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n\n if (directories.has(path)) {\n return Promise.resolve({\n size: 0,\n isFile: false,\n isDirectory: true,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) {\n return Promise.resolve({\n size: 0,\n isFile: false,\n isDirectory: true,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n }\n\n return Promise.reject(new Error(`Path not found: ${path}`));\n },\n mkdir: (_path: string) => Promise.resolve(),\n remove: (_path: string) => Promise.resolve(),\n makeTempDir: (prefix: string) =>\n Promise.resolve(`/tmp/${prefix}-${Math.random().toString(36).slice(2)}`),\n watch: () => ({\n async *[Symbol.asyncIterator]() {\n yield { kind: \"any\", paths: [] };\n },\n close: () => {},\n }),\n },\n env: {\n get: (key: string) => envVars.get(key),\n set: (key: string, value: string) => envVars.set(key, value),\n toObject: () => Object.fromEntries(envVars),\n },\n server: {\n upgradeWebSocket: (_request) => {\n throw new Error(\n \"WebSocket upgrade not available in mock adapter. \" +\n \"The mock adapter is designed for unit testing filesystem and environment operations. \" +\n \"For WebSocket testing, use integration tests with the actual Deno/Node/Bun adapter, \" +\n \"or mock the WebSocket behavior at a higher level in your tests.\",\n );\n },\n },\n features: {\n websocket: false,\n http2: false,\n workers: false,\n jsx: false,\n typescript: false,\n },\n };\n}\n", "/**\n * Cross-platform filesystem abstraction for CLI commands and standalone utilities.\n *\n * This module provides a synchronous-style API for filesystem operations that works\n * across Deno, Node.js, and Bun runtimes. It's designed for CLI commands and scripts\n * where you don't have access to a RuntimeAdapter context.\n *\n * For server/rendering contexts where you have an adapter, prefer using adapter.fs directly:\n * ```ts\n * const adapter = await getAdapter();\n * const content = await adapter.fs.readFile(path);\n * ```\n *\n * For CLI commands and standalone utilities, use createFileSystem():\n * ```ts\n * import { createFileSystem } from \"@veryfront/platform/compat/fs.ts\";\n * const fs = createFileSystem();\n * const content = await fs.readTextFile(path);\n * ```\n *\n * @module\n */\n\nimport type { FileInfo } from \"@veryfront/platform/adapters/base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport { isDeno, isNode } from \"./runtime.ts\";\n\n/**\n * Cross-platform filesystem interface for CLI commands and standalone utilities.\n * Compatible with RuntimeAdapter.fs (FileSystemAdapter) for easy interoperability.\n */\nexport interface FileSystem {\n readTextFile(path: string): Promise<string>;\n readFile(path: string): Promise<Uint8Array>; // Changed to Uint8Array for binary\n writeTextFile(path: string, data: string): Promise<void>;\n writeFile(path: string, data: Uint8Array): Promise<void>; // Changed to Uint8Array for binary\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileInfo>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readDir(path: string): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n makeTempDir(options?: { prefix?: string }): Promise<string>; // New for temp dirs\n}\n\n// ============================================================================\n// Node.js Implementation\n// ============================================================================\n\ninterface NodeFsPromises {\n readFile(\n path: string,\n options?: { encoding?: string; flag?: string } | string,\n ): Promise<string | Uint8Array>;\n writeFile(\n path: string,\n data: string | Uint8Array,\n options?: { encoding?: string; flag?: string } | string,\n ): Promise<void>;\n access(path: string, mode?: number): Promise<void>;\n stat(path: string): Promise<{\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n size: number;\n mtime: Date;\n }>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string, options: { withFileTypes: true }): Promise<\n Array<{\n name: string;\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n }>\n >;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n}\n\nclass NodeFileSystem implements FileSystem {\n private fs: NodeFsPromises | null = null;\n private os: typeof import(\"node:os\") | null = null;\n private path: typeof import(\"node:path\") | null = null;\n private initialized = false;\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n if (!isNode) {\n throw toError(createError({\n type: \"not_supported\",\n message: \"Node.js fs modules not available\",\n feature: \"Node.js\",\n }));\n }\n\n // Use dynamic ESM imports for Node.js modules\n const [fsModule, osModule, pathModule] = await Promise.all([\n import(\"node:fs/promises\"),\n import(\"node:os\"),\n import(\"node:path\"),\n ]);\n\n this.fs = fsModule as unknown as NodeFsPromises;\n this.os = osModule;\n this.path = pathModule;\n this.initialized = true;\n }\n\n async readTextFile(path: string): Promise<string> {\n await this.ensureInitialized();\n return await (this.fs!.readFile(path, { encoding: \"utf8\" }) as Promise<string>);\n }\n\n async readFile(path: string): Promise<Uint8Array> {\n await this.ensureInitialized();\n return await (this.fs!.readFile(path) as Promise<Uint8Array>);\n }\n\n async writeTextFile(path: string, data: string): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.writeFile(path, data, { encoding: \"utf8\" });\n }\n\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.writeFile(path, data);\n }\n\n async exists(path: string): Promise<boolean> {\n await this.ensureInitialized();\n try {\n await this.fs!.access(path);\n return true;\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileInfo> {\n await this.ensureInitialized();\n const stat = await this.fs!.stat(path);\n return {\n isFile: stat.isFile(),\n isDirectory: stat.isDirectory(),\n isSymlink: stat.isSymbolicLink(),\n size: stat.size,\n mtime: stat.mtime,\n };\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.mkdir(path, { recursive: options?.recursive ?? false });\n }\n\n async *readDir(\n path: string,\n ): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }> {\n await this.ensureInitialized();\n const entries = await this.fs!.readdir(path, { withFileTypes: true });\n for (const entry of entries) {\n yield {\n name: entry.name,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n };\n }\n }\n\n async remove(path: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureInitialized();\n // Node.js fs.rm requires force for recursive deletion of non-empty directories\n await this.fs!.rm(path, {\n recursive: options?.recursive ?? false,\n force: options?.recursive ?? false,\n });\n }\n\n async makeTempDir(options?: { prefix?: string }): Promise<string> {\n await this.ensureInitialized();\n const tempDir = this.path!.join(\n this.os!.tmpdir(),\n `${options?.prefix ?? \"tmp-\"}${Math.random().toString(36).substring(2, 8)}`,\n );\n await this.fs!.mkdir(tempDir, { recursive: true });\n return tempDir;\n }\n}\n\n// ============================================================================\n// Deno Implementation\n// ============================================================================\n\nclass DenoFileSystem implements FileSystem {\n async readTextFile(path: string): Promise<string> {\n // @ts-ignore - Deno global\n return await Deno.readTextFile(path);\n }\n\n async readFile(path: string): Promise<Uint8Array> {\n // @ts-ignore - Deno global\n return await Deno.readFile(path);\n }\n\n async writeTextFile(path: string, data: string): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.writeTextFile(path, data);\n }\n\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.writeFile(path, data);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n // @ts-ignore - Deno global\n await Deno.stat(path);\n return true;\n } catch (error: any) {\n // @ts-ignore - Deno global\n if (error instanceof Deno.errors.NotFound) {\n return false;\n }\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileInfo> {\n // @ts-ignore - Deno global\n const stat = await Deno.stat(path);\n return {\n isFile: stat.isFile,\n isDirectory: stat.isDirectory,\n isSymlink: stat.isSymlink,\n size: stat.size,\n mtime: stat.mtime,\n };\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.mkdir(path, { recursive: options?.recursive ?? false });\n }\n\n async *readDir(\n path: string,\n ): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }> {\n // @ts-ignore - Deno global\n for await (const entry of Deno.readDir(path)) {\n yield {\n name: entry.name,\n isFile: entry.isFile,\n isDirectory: entry.isDirectory,\n };\n }\n }\n\n async remove(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.remove(path, { recursive: options?.recursive ?? false });\n }\n\n async makeTempDir(options?: { prefix?: string }): Promise<string> {\n // @ts-ignore - Deno global\n return await Deno.makeTempDir({ prefix: options?.prefix });\n }\n}\n\n/**\n * Create a cross-platform filesystem instance for CLI commands and standalone utilities.\n *\n * Use this for CLI commands that don't have access to a RuntimeAdapter context:\n * ```ts\n * const fs = createFileSystem();\n * const content = await fs.readTextFile(path);\n * await fs.writeTextFile(outputPath, result);\n * ```\n *\n * For server/rendering contexts, prefer using adapter.fs directly.\n *\n * Note: For npm package, always uses Node.js fs APIs for cross-platform compatibility.\n */\nexport function createFileSystem(): FileSystem {\n if (isDeno) {\n return new DenoFileSystem();\n } else {\n // Node.js or Bun\n return new NodeFileSystem();\n }\n}\n", "// Conditional imports for path module\nimport nodePath from \"node:path\";\nimport type { PlatformPath } from \"node:path\";\n\n// Use node:path for Node.js or import Deno's std/path for Deno\nlet pathMod: PlatformPath | null = null;\n\n// Initialize path module synchronously for Node.js\n// @ts-ignore - Deno global\nif (typeof Deno === \"undefined\") {\n pathMod = nodePath;\n} else {\n // Deno environment - start loading asynchronously but don't await\n // @ts-ignore - Deno global\n import(\"std/path/mod.ts\").then((mod) => {\n pathMod = mod as unknown as PlatformPath;\n });\n}\n\n// Helper to get path module, ensuring it's loaded\nfunction getPathMod(): PlatformPath {\n if (pathMod) return pathMod;\n // In Deno, if pathMod is not yet loaded, use Node.js path as temporary fallback\n // This should rarely happen as the import is fast\n return nodePath;\n}\n\n// Re-export common path functions with proper types\nexport const basename = (path: string, suffix?: string): string =>\n getPathMod().basename(path, suffix);\nexport const dirname = (path: string): string => getPathMod().dirname(path);\nexport const fromFileUrl = (url: string | URL): string => {\n const mod = getPathMod();\n // @ts-ignore - Deno path module has fromFileUrl\n if (mod && typeof (mod as any).fromFileUrl === \"function\") {\n // @ts-ignore - Deno path module has fromFileUrl\n return (mod as any).fromFileUrl(url);\n }\n // Fallback for Node.js where fromFileUrl might not be directly available\n // This uses URL parsing which is generally cross-platform\n const urlObj = typeof url === \"string\" ? new URL(url) : url;\n return urlObj.pathname;\n};\nexport const join = (...paths: string[]): string => getPathMod().join(...paths);\nexport const relative = (from: string, to: string): string => getPathMod().relative(from, to);\nexport const resolve = (...paths: string[]): string => getPathMod().resolve(...paths);\nexport const extname = (path: string): string => getPathMod().extname(path);\nexport const isAbsolute = (path: string): boolean => getPathMod().isAbsolute(path);\n// Export sep - uses getter function to ensure pathMod is resolved\nexport const sep: string = nodePath.sep;\n", "/**\n * Auto-discovery system for AI components\n *\n * Scans ai/ directories and automatically registers:\n * - Tools (ai/tools/)\n * - Agents (ai/agents/)\n * - Resources (ai/resources/)\n * - Prompts (ai/prompts/)\n */\n\nimport { detectPlatform } from \"../runtime/platform.ts\";\nimport type { Platform } from \"../runtime/platform.ts\";\nimport { registerPrompt, registerResource, registerTool } from \"../mcp/registry.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport type { Agent } from \"../types/agent.ts\";\nimport { registerAgent } from \"../agent/composition.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { getConfig } from \"../../core/config/loader.ts\";\nimport { createMockAdapter } from \"../../platform/adapters/mock.ts\";\nimport type { FileSystemAdapter } from \"../../platform/adapters/base.ts\";\nimport { isDeno } from \"../../platform/compat/runtime.ts\";\nimport { createFileSystem } from \"../../platform/compat/fs.ts\";\nimport * as pathHelper from \"../../platform/compat/path-helper.ts\";\n\ninterface FileDiscoveryContext {\n platform: Platform;\n /** Optional filesystem adapter for cross-platform support */\n fsAdapter?: FileSystemAdapter;\n /** Cached node dependencies (lazy loaded) */\n nodeDeps?: {\n fs: typeof import(\"node:fs\");\n path: typeof import(\"node:path\");\n };\n /** Base directory for the project (needed for Node.js transpilation) */\n baseDir?: string;\n}\n\n/** Cache for transpiled modules to avoid re-transpiling the same file */\nconst transpileCache = new Map<string, unknown>();\n\n/**\n * Create an esbuild plugin for loading files from fsAdapter (Veryfront Cloud).\n * This allows esbuild to properly resolve and bundle relative imports from remote storage.\n *\n * The plugin intercepts relative imports (./foo or ../foo), resolves them to absolute paths,\n * and loads the file content from the fsAdapter instead of the local filesystem.\n */\nfunction createFsAdapterPlugin(fsAdapter: FileSystemAdapter) {\n // Cache existence checks to avoid repeated remote calls\n const existsCache = new Map<string, boolean>();\n\n async function checkExists(filePath: string): Promise<boolean> {\n if (existsCache.has(filePath)) {\n return existsCache.get(filePath)!;\n }\n const exists = await fsAdapter.exists(filePath);\n existsCache.set(filePath, exists);\n return exists;\n }\n\n // Try to resolve a path with various extensions\n async function resolveWithExtensions(basePath: string): Promise<string | null> {\n // If path already has an extension, use it directly\n if (/\\.(ts|tsx|js|jsx|mjs|json)$/i.test(basePath)) {\n if (await checkExists(basePath)) {\n return basePath;\n }\n return null;\n }\n\n // Try common TypeScript/JavaScript extensions\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"];\n for (const ext of extensions) {\n const fullPath = basePath + ext;\n if (await checkExists(fullPath)) {\n return fullPath;\n }\n }\n\n // Try index files (for directory imports)\n for (const ext of extensions) {\n const indexPath = pathHelper.join(basePath, `index${ext}`);\n if (await checkExists(indexPath)) {\n return indexPath;\n }\n }\n\n return null;\n }\n\n return {\n name: \"veryfront-fsadapter\",\n // deno-lint-ignore no-explicit-any\n setup(build: any) {\n // Intercept relative imports (./foo or ../foo)\n build.onResolve(\n { filter: /^\\.\\.?\\// },\n async (args: { path: string; importer: string; resolveDir: string }) => {\n // Resolve path relative to importer's directory\n const importerDir = args.importer ? pathHelper.dirname(args.importer) : args.resolveDir;\n const basePath = pathHelper.resolve(importerDir, args.path);\n\n // Try to find the file with various extensions\n const resolvedPath = await resolveWithExtensions(basePath);\n if (resolvedPath) {\n return {\n path: resolvedPath,\n namespace: \"fsadapter\",\n };\n }\n\n // File not found - return error\n return {\n errors: [{\n text: `Could not resolve \"${args.path}\" from \"${importerDir}\" via fsAdapter`,\n }],\n };\n },\n );\n\n // Load files from fsAdapter\n build.onLoad(\n { filter: /.*/, namespace: \"fsadapter\" },\n async (args: { path: string }) => {\n try {\n const content = await fsAdapter.readFile(args.path);\n const ext = pathHelper.extname(args.path).toLowerCase();\n const loader = ext === \".tsx\"\n ? \"tsx\"\n : ext === \".jsx\"\n ? \"jsx\"\n : ext === \".ts\"\n ? \"ts\"\n : \"js\";\n\n return {\n contents: content,\n loader,\n // Set resolveDir for nested imports from this file\n resolveDir: pathHelper.dirname(args.path),\n };\n } catch (error) {\n return {\n errors: [{\n text: `Failed to load \"${args.path}\" from fsAdapter: ${error}`,\n }],\n };\n }\n },\n );\n },\n };\n}\n\n/**\n * Import a TypeScript module in a platform-aware way.\n * - Deno: Transpile to rewrite npm package imports, then import natively\n * - Node.js: Transpile with esbuild, then import\n * - Node.js + fsAdapter: Use esbuild plugin to load from remote storage\n */\nasync function importModule(\n file: string,\n context: FileDiscoveryContext,\n): Promise<unknown> {\n // Check cache first\n const cacheKey = file;\n if (transpileCache.has(cacheKey)) {\n return transpileCache.get(cacheKey);\n }\n\n const filePath = file.replace(\"file://\", \"\");\n\n // Read the source file - use fsAdapter if available (Veryfront Cloud), otherwise local fs\n let source: string;\n try {\n if (context.fsAdapter) {\n source = await context.fsAdapter.readFile(filePath);\n } else {\n const fs = createFileSystem();\n source = await fs.readTextFile(filePath);\n }\n } catch (error) {\n throw new Error(`Failed to read file ${filePath}: ${error}`);\n }\n\n // Determine loader based on file extension\n const isTsx = filePath.endsWith(\".tsx\");\n const isJsx = filePath.endsWith(\".jsx\");\n const loader = isTsx ? \"tsx\" : isJsx ? \"jsx\" : filePath.endsWith(\".ts\") ? \"ts\" : \"js\";\n\n // Transpile with esbuild\n const { build } = await import(\"esbuild\");\n\n // Get the directory containing the file for resolving relative imports\n const fileDir = pathHelper.dirname(filePath);\n\n // In Deno, esbuild runs as WASM which doesn't support plugins.\n // We mark relative imports as external and let Deno's native TS support handle them.\n const relativeImports: string[] = [];\n if (isDeno) {\n const relativeImportPattern = /from\\s+[\"'](\\.\\.[^\"']+)[\"']/g;\n let match;\n while ((match = relativeImportPattern.exec(source)) !== null) {\n if (match[1]) {\n relativeImports.push(match[1]);\n }\n }\n }\n\n // In Node.js with fsAdapter, use plugin to load relative imports from remote storage.\n // This properly bundles all dependencies instead of marking them external.\n const usePlugin = !isDeno && !!context.fsAdapter;\n const plugins = usePlugin ? [createFsAdapterPlugin(context.fsAdapter!)] : [];\n\n const result = await build({\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"neutral\",\n target: \"es2022\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n resolveExtensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"],\n plugins,\n external: [\n \"ai\",\n \"ai/*\",\n \"@ai-sdk/*\",\n \"zod\",\n \"node:*\",\n \"veryfront\",\n \"veryfront/*\",\n \"@opentelemetry/*\",\n \"path\",\n // Only mark relative imports as external in Deno (plugin handles them in Node.js)\n ...relativeImports,\n ],\n stdin: {\n contents: source,\n loader,\n resolveDir: fileDir,\n sourcefile: filePath,\n },\n });\n\n if (result.errors && result.errors.length > 0) {\n const first = result.errors[0]?.text || \"unknown error\";\n throw new Error(`Failed to transpile ${filePath}: ${first}`);\n }\n\n const js = result.outputFiles?.[0]?.text ?? \"export {}\";\n\n // Use local filesystem for temp files\n const localFs = createFileSystem();\n const tempDir = await localFs.makeTempDir({ prefix: \"vf-discovery-\" });\n const tempFile = pathHelper.join(tempDir, \"module.mjs\");\n\n // Rewrite package imports based on platform\n // - Deno: npm: specifiers + file:// for relative imports\n // - Node.js: resolve packages to file:// URLs from node_modules\n let transformedCode: string;\n if (isDeno) {\n transformedCode = rewriteForDeno(js, fileDir);\n } else {\n transformedCode = await rewriteDiscoveryImports(js, context.baseDir || \".\", localFs, fileDir);\n }\n\n await localFs.writeTextFile(tempFile, transformedCode);\n\n try {\n const module = await import(`file://${tempFile}?v=${Date.now()}`);\n transpileCache.set(cacheKey, module);\n return module;\n } finally {\n await localFs.remove(tempDir, { recursive: true });\n }\n}\n\n/**\n * Rewrite imports for Deno (use npm: specifiers and resolve relative imports)\n */\nfunction rewriteForDeno(code: string, fileDir: string): string {\n let transformed = code;\n\n // Rewrite external packages to npm: specifiers\n const npmPackages = [\n { pattern: /from\\s+[\"']ai[\"']/g, replacement: 'from \"npm:ai\"' },\n { pattern: /from\\s+[\"']ai\\/([^\"']+)[\"']/g, replacement: 'from \"npm:ai/$1\"' },\n { pattern: /from\\s+[\"']@ai-sdk\\/([^\"']+)[\"']/g, replacement: 'from \"npm:@ai-sdk/$1\"' },\n { pattern: /from\\s+[\"']zod[\"']/g, replacement: 'from \"npm:zod\"' },\n { pattern: /import\\s*\\(\\s*[\"']ai[\"']\\s*\\)/g, replacement: 'import(\"npm:ai\")' },\n { pattern: /import\\s*\\(\\s*[\"']zod[\"']\\s*\\)/g, replacement: 'import(\"npm:zod\")' },\n ];\n\n for (const { pattern, replacement } of npmPackages) {\n transformed = transformed.replace(pattern, replacement);\n }\n\n // Rewrite relative imports to absolute file:// URLs\n // This handles imports like \"../../lib/github-client.ts\" that were marked external\n transformed = transformed.replace(\n /from\\s+[\"'](\\.\\.\\/[^\"']+)[\"']/g,\n (_match, relativePath: string) => {\n const absolutePath = pathHelper.resolve(fileDir, relativePath);\n return `from \"file://${absolutePath}\"`;\n },\n );\n\n return transformed;\n}\n\n/**\n * Rewrite external imports to absolute paths for Node.js compatibility\n */\nasync function rewriteDiscoveryImports(\n code: string,\n projectDir: string,\n fs: ReturnType<typeof createFileSystem>,\n fileDir: string,\n): Promise<string> {\n let transformed = code;\n\n try {\n const { pathToFileURL } = await import(\"node:url\");\n\n // Rewrite relative imports to absolute file:// URLs\n // This handles imports like \"../../lib/github-client\" that were marked external in Deno\n transformed = transformed.replace(\n /from\\s+[\"'](\\.\\.\\/[^\"']+)[\"']/g,\n (_match, relativePath: string) => {\n const absolutePath = pathHelper.resolve(fileDir, relativePath);\n return `from \"${pathToFileURL(absolutePath).href}\"`;\n },\n );\n\n // Helper to resolve a package to absolute file:// URL\n const resolvePackageToFileUrl = async (packageName: string): Promise<string | null> => {\n const packagePath = pathHelper.join(projectDir, \"node_modules\", packageName);\n const packageJsonPath = pathHelper.join(packagePath, \"package.json\");\n\n try {\n const pkgJson = JSON.parse(await fs.readTextFile(packageJsonPath));\n let entryPoint: string | undefined;\n\n if (pkgJson.exports) {\n const dotExport = pkgJson.exports[\".\"];\n if (typeof dotExport === \"string\") {\n entryPoint = dotExport;\n } else if (dotExport?.import) {\n entryPoint = dotExport.import;\n } else if (dotExport?.default) {\n entryPoint = dotExport.default;\n }\n }\n\n if (!entryPoint) {\n entryPoint = pkgJson.module || pkgJson.main || \"index.js\";\n }\n\n if (!entryPoint) {\n return null;\n }\n\n const resolvedPath = pathHelper.join(packagePath, entryPoint);\n return pathToFileURL(resolvedPath).href;\n } catch {\n return null;\n }\n };\n\n // List of external packages that need to be resolved\n const externalPackagesToResolve = [\n \"zod\",\n \"ai\",\n \"@ai-sdk/anthropic\",\n \"@ai-sdk/openai\",\n \"@ai-sdk/google\",\n \"@ai-sdk/mistral\",\n \"@ai-sdk/provider\",\n \"@ai-sdk/provider-utils\",\n ];\n\n for (const pkg of externalPackagesToResolve) {\n const escapedPkg = pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const staticImportRegex = new RegExp(`from\\\\s+[\"']${escapedPkg}[\"']`, \"g\");\n if (staticImportRegex.test(transformed)) {\n const resolvedUrl = await resolvePackageToFileUrl(pkg);\n if (resolvedUrl) {\n transformed = transformed.replace(staticImportRegex, `from \"${resolvedUrl}\"`);\n }\n }\n\n const dynamicImportRegex = new RegExp(`import\\\\s*\\\\(\\\\s*[\"']${escapedPkg}[\"']\\\\s*\\\\)`, \"g\");\n if (dynamicImportRegex.test(transformed)) {\n const resolvedUrl = await resolvePackageToFileUrl(pkg);\n if (resolvedUrl) {\n transformed = transformed.replace(dynamicImportRegex, `import(\"${resolvedUrl}\")`);\n }\n }\n }\n\n // Resolve veryfront imports\n const vfPackagePath = pathHelper.join(projectDir, \"node_modules\", \"veryfront\");\n const vfPackageJsonPath = pathHelper.join(vfPackagePath, \"package.json\");\n\n let exportsMap: Record<string, { import?: string }> = {};\n try {\n const pkgJson = JSON.parse(await fs.readTextFile(vfPackageJsonPath));\n exportsMap = pkgJson.exports || {};\n } catch {\n // Ignore - veryfront may not be in node_modules\n }\n\n transformed = transformed.replace(\n /from\\s+[\"'](veryfront\\/[^\"']+)[\"']/g,\n (_match, fullSpecifier: string) => {\n const subpath = \"./\" + fullSpecifier.replace(\"veryfront/\", \"\");\n const exportEntry = exportsMap[subpath];\n if (exportEntry?.import) {\n const resolvedPath = pathHelper.join(vfPackagePath, exportEntry.import);\n return `from \"${pathToFileURL(resolvedPath).href}\"`;\n }\n return _match;\n },\n );\n\n transformed = transformed.replace(\n /from\\s+[\"']veryfront[\"']/g,\n () => {\n const exportEntry = exportsMap[\".\"];\n if (exportEntry?.import) {\n const resolvedPath = pathHelper.join(vfPackagePath, exportEntry.import);\n return `from \"${pathToFileURL(resolvedPath).href}\"`;\n }\n return 'from \"veryfront\"';\n },\n );\n } catch {\n // If node:url import fails, return code as-is\n }\n\n return transformed;\n}\n\nexport interface DiscoveryConfig {\n /** Base directory (usually project root) */\n baseDir: string;\n\n /** AI directory (relative to baseDir) */\n aiDir?: string;\n\n /** Tool directories */\n toolDirs?: string[];\n\n /** Agent directories */\n agentDirs?: string[];\n\n /** Resource directories */\n resourceDirs?: string[];\n\n /** Prompt directories */\n promptDirs?: string[];\n\n /** Enable verbose logging */\n verbose?: boolean;\n\n /** Optional filesystem adapter for cross-platform support (Cloudflare Workers, etc.) */\n fsAdapter?: FileSystemAdapter;\n}\n\nexport interface DiscoveryResult {\n tools: Map<string, Tool>;\n agents: Map<string, Agent>;\n resources: Map<string, Resource>;\n prompts: Map<string, Prompt>;\n errors: Array<{ file: string; error: Error }>;\n}\n\n/**\n * Discover and register all AI components\n */\nexport async function discoverAll(\n config: DiscoveryConfig,\n): Promise<DiscoveryResult> {\n let aiDir = config.aiDir;\n const baseDir = config.baseDir;\n\n if (!aiDir) {\n try {\n const adapter = createMockAdapter();\n const projectConfig = await getConfig(baseDir, adapter);\n aiDir = projectConfig.directories?.ai || \"ai\";\n } catch {\n aiDir = \"ai\";\n }\n }\n\n const context: FileDiscoveryContext = {\n platform: detectPlatform(),\n fsAdapter: config.fsAdapter,\n baseDir,\n };\n\n const result: DiscoveryResult = {\n tools: new Map(),\n agents: new Map(),\n resources: new Map(),\n prompts: new Map(),\n errors: [],\n };\n\n const toolDirs = config.toolDirs || [`${aiDir}/tools`];\n for (const dir of toolDirs) {\n await discoverTools(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const agentDirs = config.agentDirs || [`${aiDir}/agents`];\n for (const dir of agentDirs) {\n await discoverAgents(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const resourceDirs = config.resourceDirs || [`${aiDir}/resources`];\n for (const dir of resourceDirs) {\n await discoverResources(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const promptDirs = config.promptDirs || [`${aiDir}/prompts`];\n for (const dir of promptDirs) {\n await discoverPrompts(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n return result;\n}\n\n/**\n * Discover tools in a directory\n */\nasync function discoverTools(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} tool files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const tool = (module as { default?: Tool }).default as Tool;\n\n if (!tool || typeof tool.execute !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid tool`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const toolWithId = { ...tool, id };\n registerTool(id, toolWithId);\n result.tools.set(id, toolWithId);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered tool: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover agents in a directory\n */\nasync function discoverAgents(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} agent files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const agent = (module as { default?: Agent }).default as Agent;\n\n if (!agent || typeof agent.generate !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid agent`);\n }\n continue;\n }\n\n const id = agent.id || filenameToId(file);\n\n // Register in the global agent registry\n registerAgent(id, agent);\n result.agents.set(id, agent);\n\n // Track the file path for index generation\n trackAgentPath(id, file);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered agent: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover resources in a directory\n */\nasync function discoverResources(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} resource files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const resource = (module as { default?: Resource }).default as Resource;\n\n if (!resource || typeof resource.load !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid resource`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const pattern = filePathToPattern(file, dir);\n const resourceWithMeta = { ...resource, id, pattern };\n registerResource(id, resourceWithMeta);\n result.resources.set(id, resourceWithMeta);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered resource: ${id} (${pattern})`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover prompts in a directory\n */\nasync function discoverPrompts(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} prompt files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const promptInstance = (module as { default?: Prompt }).default as Prompt;\n\n if (!promptInstance || typeof promptInstance.getContent !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid prompt`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const promptWithId = { ...promptInstance, id };\n registerPrompt(id, promptWithId);\n result.prompts.set(id, promptWithId);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered prompt: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Find all TypeScript files in a directory (recursively)\n */\nasync function findTypeScriptFiles(\n dir: string,\n context: FileDiscoveryContext,\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n if (context.fsAdapter) {\n const exists = await context.fsAdapter.exists(dir);\n if (!exists) {\n return files;\n }\n\n for await (const entry of context.fsAdapter.readDir(dir)) {\n const filePath = `${dir}/${entry.name}`;\n\n if (entry.isFile && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n files.push(`file://${filePath}`);\n } else if (entry.isDirectory) {\n const subFiles = await findTypeScriptFiles(filePath, context);\n files.push(...subFiles);\n }\n }\n } else {\n const { fs, path } = await getNodeDeps(context);\n\n if (!fs || !path) {\n return files;\n }\n\n if (!fs.existsSync(dir)) {\n return files;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n\n if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n files.push(`file://${path.resolve(filePath)}`);\n } else if (entry.isDirectory()) {\n const subFiles = await findTypeScriptFiles(filePath, context);\n files.push(...subFiles);\n }\n }\n }\n } catch {\n // Directory doesn't exist or is not accessible\n return files;\n }\n\n return files;\n}\n\nasync function getNodeDeps(context: FileDiscoveryContext) {\n if (context.nodeDeps) {\n return context.nodeDeps;\n }\n\n if (context.fsAdapter) {\n context.nodeDeps = {\n fs: {} as unknown as typeof import(\"node:fs\"),\n path: {} as unknown as typeof import(\"node:path\"),\n };\n return context.nodeDeps;\n }\n\n const [fsModule, pathModule] = await Promise.all([\n import(\"node:fs\"),\n import(\"node:path\"),\n ]);\n\n context.nodeDeps = {\n fs: fsModule,\n path: pathModule,\n };\n\n return context.nodeDeps;\n}\n\n/**\n * Convert filename to camelCase ID\n */\nfunction filenameToId(filePath: string): string {\n const filename = filePath.split(\"/\").pop()?.replace(/\\.(ts|tsx|js|jsx)$/, \"\") || \"\";\n\n return filename\n .replace(/[-_](.)/g, (_, char) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n/**\n * Convert file path to resource pattern\n */\nfunction filePathToPattern(filePath: string, baseDir: string): string {\n const cleanPath = filePath.replace(\"file://\", \"\");\n\n let pattern = cleanPath\n .replace(baseDir, \"\")\n .replace(/\\.(ts|tsx|js|jsx)$/, \"\");\n\n pattern = pattern.replace(/\\[(\\w+)\\]/g, \":$1\");\n pattern = pattern.replace(/^\\/+/, \"\");\n pattern = \"/\" + pattern;\n\n return pattern;\n}\n\n/**\n * Tracked agent file paths for index generation\n */\nconst discoveredAgentPaths = new Map<string, string>();\n\n/**\n * Generate an index file that exports all discovered agents\n * This allows API routes to import agents from a known location\n *\n * @example\n * // Generated file: ai/.generated/agents.ts\n * export { default as assistant } from '../agents/assistant';\n *\n * // Usage in API route:\n * import { assistant } from '../../ai/.generated/agents';\n */\nexport async function generateAgentIndex(\n baseDir: string,\n aiDir: string = \"ai\",\n): Promise<void> {\n const generatedDir = `${baseDir}/${aiDir}/.generated`;\n const indexPath = `${generatedDir}/agents.ts`;\n\n // Ensure the .generated directory exists\n try {\n const [fsModule, pathModule] = await Promise.all([\n import(\"node:fs\"),\n import(\"node:path\"),\n ]);\n\n if (!fsModule.existsSync(generatedDir)) {\n fsModule.mkdirSync(generatedDir, { recursive: true });\n }\n\n // Generate the index file content\n const lines: string[] = [\n \"/**\",\n \" * Auto-generated by veryfront\",\n \" * Do not edit manually - this file is regenerated on each dev server start\",\n \" */\",\n \"\",\n ];\n\n // Add exports for each discovered agent\n for (const [id, filePath] of discoveredAgentPaths) {\n // Convert absolute path to relative from .generated directory\n const cleanPath = filePath.replace(\"file://\", \"\");\n const relativePath = pathModule.relative(generatedDir, cleanPath)\n .replace(/\\.(ts|tsx|js|jsx)$/, \"\");\n\n lines.push(`export { default as ${id} } from '${relativePath}';`);\n }\n\n // Add an agents object for runtime lookup\n lines.push(\"\");\n lines.push(\"// Runtime lookup object\");\n const agentIds = Array.from(discoveredAgentPaths.keys());\n if (agentIds.length > 0) {\n lines.push(`import { ${agentIds.join(\", \")} } from './agents';`);\n lines.push(\"\");\n lines.push(\"export const agents = {\");\n for (const id of agentIds) {\n lines.push(` ${id},`);\n }\n lines.push(\"} as const;\");\n } else {\n lines.push(\"export const agents = {} as const;\");\n }\n\n lines.push(\"\");\n\n // Write the file\n fsModule.writeFileSync(indexPath, lines.join(\"\\n\"));\n agentLogger.debug(`[Discovery] Generated agent index: ${indexPath}`);\n } catch (error) {\n agentLogger.debug(`[Discovery] Could not generate agent index: ${error}`);\n }\n}\n\n/**\n * Track agent file path during discovery\n */\nfunction trackAgentPath(id: string, filePath: string): void {\n discoveredAgentPaths.set(id, filePath);\n}\n\n/**\n * Clear tracked agent paths (for re-discovery)\n */\nexport function clearTrackedAgents(): void {\n discoveredAgentPaths.clear();\n}\n\n/**\n * Clear the transpile cache (for HMR/development)\n */\nexport function clearTranspileCache(): void {\n transpileCache.clear();\n}\n", "/**\n * ID generation utilities following AI SDK best practices\n *\n * AI SDK uses nanoid internally with these defaults:\n * - 16 character alphanumeric string (a-zA-Z0-9)\n * - Dash separator for prefixed IDs\n *\n * @module veryfront/ai/utils/id\n */\n\n// URL-safe alphabet matching nanoid default (no special chars for simplicity)\nconst ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/**\n * Generate a random alphanumeric string\n */\nfunction randomString(length: number): string {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += ALPHABET[bytes[i]! % ALPHABET.length];\n }\n return result;\n}\n\n/**\n * Generate a unique ID with optional prefix\n *\n * Follows AI SDK generateId pattern:\n * - 16 character alphanumeric string by default\n * - Optional prefix with dash separator (AI SDK default)\n *\n * @example\n * ```ts\n * generateId() // \"a1B2c3D4e5F6g7H8\"\n * generateId(\"msg\") // \"msg-a1B2c3D4e5F6g7H8\"\n * generateId(\"text\") // \"text-a1B2c3D4e5F6g7H8\"\n * ```\n */\nexport function generateId(prefix?: string): string {\n const id = randomString(16);\n\n if (prefix) {\n return `${prefix}-${id}`;\n }\n\n return id;\n}\n\n/**\n * Create an ID generator with a fixed prefix and optional configuration\n *\n * @example\n * ```ts\n * const generateMessageId = createIdGenerator({ prefix: \"msg\" });\n * generateMessageId() // \"msg-a1B2c3D4e5F6g7H8\"\n *\n * const generateShortId = createIdGenerator({ prefix: \"user\", size: 8 });\n * generateShortId() // \"user-a1B2c3D4\"\n * ```\n */\nexport function createIdGenerator(options: {\n prefix?: string;\n separator?: string;\n size?: number;\n}): () => string {\n const { prefix, separator = \"-\", size = 16 } = options;\n\n return () => {\n const id = randomString(size);\n if (prefix) {\n return `${prefix}${separator}${id}`;\n }\n return id;\n };\n}\n", "/**\n * Agent Memory System\n *\n * Manages conversation history with different strategies:\n * - Conversation: Keep all messages\n * - Buffer: Keep last N messages\n * - Summary: Summarize old messages to save tokens\n */\n\nimport { getTextFromParts, type MemoryConfig, type Message } from \"../types/agent.ts\";\n\n/**\n * Memory interface\n */\nexport interface Memory {\n /**\n * Add a message to memory\n */\n add(message: Message): Promise<void>;\n\n /**\n * Get messages for the current context\n */\n getMessages(): Promise<Message[]>;\n\n /**\n * Clear all messages\n */\n clear(): Promise<void>;\n\n /**\n * Get memory stats\n */\n getStats(): Promise<MemoryStats>;\n}\n\n/**\n * Memory statistics\n */\nexport interface MemoryStats {\n /** Total messages stored */\n totalMessages: number;\n\n /** Estimated token count */\n estimatedTokens: number;\n\n /** Memory type */\n type: string;\n}\n\n/**\n * Conversation Memory - Keeps all messages\n */\nexport class ConversationMemory implements Memory {\n private messages: Message[] = [];\n private config: MemoryConfig;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n }\n\n async add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Trim if max messages exceeded\n if (\n this.config.maxMessages &&\n this.messages.length > this.config.maxMessages\n ) {\n this.messages = this.messages.slice(-this.config.maxMessages);\n }\n\n // Trim if max tokens exceeded\n if (this.config.maxTokens) {\n await this.trimToTokenLimit();\n }\n }\n\n getMessages(): Promise<Message[]> {\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n return Promise.resolve();\n }\n\n getStats(): Promise<MemoryStats> {\n return Promise.resolve({\n totalMessages: this.messages.length,\n estimatedTokens: this.estimateTokens(this.messages),\n type: \"conversation\",\n });\n }\n\n private trimToTokenLimit(): Promise<void> {\n if (!this.config.maxTokens) return Promise.resolve();\n\n let tokenCount = this.estimateTokens(this.messages);\n\n // Remove oldest messages until under limit\n while (\n tokenCount > this.config.maxTokens &&\n this.messages.length > 1\n ) {\n this.messages.shift();\n tokenCount = this.estimateTokens(this.messages);\n }\n return Promise.resolve();\n }\n\n private estimateTokens(messages: Message[]): number {\n // Rough estimation: ~4 characters per token\n const totalChars = messages.reduce(\n (sum, msg) => sum + getTextFromParts(msg.parts).length,\n 0,\n );\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Buffer Memory - Keeps last N messages\n */\nexport class BufferMemory implements Memory {\n private messages: Message[] = [];\n private config: MemoryConfig;\n private bufferSize: number;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n this.bufferSize = config.maxMessages || 10;\n }\n\n add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Keep only last N messages\n if (this.messages.length > this.bufferSize) {\n this.messages = this.messages.slice(-this.bufferSize);\n }\n return Promise.resolve();\n }\n\n getMessages(): Promise<Message[]> {\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n return Promise.resolve();\n }\n\n getStats(): Promise<MemoryStats> {\n return Promise.resolve({\n totalMessages: this.messages.length,\n estimatedTokens: this.estimateTokens(this.messages),\n type: \"buffer\",\n });\n }\n\n private estimateTokens(messages: Message[]): number {\n const totalChars = messages.reduce(\n (sum, msg) => sum + getTextFromParts(msg.parts).length,\n 0,\n );\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Summary Memory - Summarizes old messages\n * (Simplified version - full implementation would use LLM for summarization)\n */\nexport class SummaryMemory implements Memory {\n private messages: Message[] = [];\n private summary: string = \"\";\n private config: MemoryConfig;\n private summaryThreshold: number;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n this.summaryThreshold = config.maxMessages || 20;\n }\n\n async add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Summarize if threshold exceeded\n if (this.messages.length > this.summaryThreshold) {\n await this.summarizeOldMessages();\n }\n }\n\n getMessages(): Promise<Message[]> {\n // If we have a summary, include it as first message\n if (this.summary) {\n return Promise.resolve([\n {\n id: \"summary\",\n role: \"system\",\n parts: [{ type: \"text\", text: `Previous conversation summary:\\n${this.summary}` }],\n timestamp: Date.now(),\n },\n ...this.messages,\n ]);\n }\n\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n this.summary = \"\";\n return Promise.resolve();\n }\n\n async getStats(): Promise<MemoryStats> {\n const allMessages = await this.getMessages();\n return {\n totalMessages: allMessages.length,\n estimatedTokens: this.estimateTokens(allMessages),\n type: \"summary\",\n };\n }\n\n private summarizeOldMessages(): Promise<void> {\n // Take first half of messages for summarization\n const toSummarize = this.messages.slice(0, Math.floor(this.messages.length / 2));\n const remaining = this.messages.slice(Math.floor(this.messages.length / 2));\n\n // Simple summarization (in production, use LLM)\n const topics = toSummarize\n .filter((m) => m.role === \"user\")\n .map((m) => getTextFromParts(m.parts).substring(0, 50))\n .join(\"; \");\n\n this.summary = `Discussed: ${topics}`;\n this.messages = remaining;\n return Promise.resolve();\n }\n\n private estimateTokens(messages: Message[]): number {\n const totalChars = messages.reduce((sum, msg) => sum + getTextFromParts(msg.parts).length, 0) +\n this.summary.length;\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Create memory instance based on config\n */\nexport function createMemory(config: MemoryConfig): Memory {\n switch (config.type) {\n case \"conversation\":\n return new ConversationMemory(config);\n\n case \"buffer\":\n return new BufferMemory(config);\n\n case \"summary\":\n return new SummaryMemory(config);\n\n default:\n return new ConversationMemory(config);\n }\n}\n\n/**\n * Memory persistence interface (for future implementation)\n */\nexport interface MemoryPersistence {\n save(agentId: string, messages: Message[]): Promise<void>;\n load(agentId: string): Promise<Message[]>;\n clear(agentId: string): Promise<void>;\n}\n", "export const SECONDS_PER_MINUTE = 60;\n\nexport const MINUTES_PER_HOUR = 60;\n\nexport const HOURS_PER_DAY = 24;\n\nexport const MS_PER_SECOND = 1000;\n\nexport const DEFAULT_LRU_MAX_ENTRIES = 100;\n\nexport const COMPONENT_LOADER_MAX_ENTRIES = 100;\nexport const COMPONENT_LOADER_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const MDX_RENDERER_MAX_ENTRIES = 200;\nexport const MDX_RENDERER_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const RENDERER_CORE_MAX_ENTRIES = 100;\nexport const RENDERER_CORE_TTL_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const TSX_LAYOUT_MAX_ENTRIES = 50;\nexport const TSX_LAYOUT_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const DATA_FETCHING_MAX_ENTRIES = 200;\nexport const DATA_FETCHING_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const MDX_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE *\n MS_PER_SECOND;\nexport const MDX_CACHE_TTL_DEVELOPMENT_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const BUNDLE_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR *\n SECONDS_PER_MINUTE * MS_PER_SECOND;\nexport const BUNDLE_CACHE_TTL_DEVELOPMENT_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const BUNDLE_MANIFEST_PROD_TTL_MS = 7 * HOURS_PER_DAY * MINUTES_PER_HOUR *\n SECONDS_PER_MINUTE * MS_PER_SECOND;\nexport const BUNDLE_MANIFEST_DEV_TTL_MS = MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const RSC_MANIFEST_CACHE_TTL_MS = 5000;\n\nexport const SERVER_ACTION_DEFAULT_TTL_SEC = MINUTES_PER_HOUR * SECONDS_PER_MINUTE;\n\nexport const DENO_KV_SAFE_SIZE_LIMIT_BYTES = 64_000;\n\nexport const HTTP_CACHE_SHORT_MAX_AGE_SEC = 60;\nexport const HTTP_CACHE_MEDIUM_MAX_AGE_SEC = 3600;\nexport const HTTP_CACHE_LONG_MAX_AGE_SEC = 31536000;\n\nexport const ONE_DAY_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const CACHE_CLEANUP_INTERVAL_MS = 60000;\n\nexport const LRU_DEFAULT_MAX_ENTRIES = 1000;\n\nexport const LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;\n\nexport const CLEANUP_INTERVAL_MULTIPLIER = 2;\n", "export const KB_IN_BYTES = 1024;\n\nexport const HTTP_MODULE_FETCH_TIMEOUT_MS = 2500;\n\nexport const HMR_RECONNECT_DELAY_MS = 1000;\n\nexport const HMR_RELOAD_DELAY_MS = 1000;\n\nexport const HMR_FILE_WATCHER_DEBOUNCE_MS = 100;\n\nexport const HMR_KEEP_ALIVE_INTERVAL_MS = 30000;\n\nexport const DASHBOARD_RECONNECT_DELAY_MS = 3000;\n\nexport const SERVER_FUNCTION_DEFAULT_TIMEOUT_MS = 30000;\n\nexport const PREFETCH_MAX_SIZE_BYTES = 200 * KB_IN_BYTES;\n\nexport const PREFETCH_DEFAULT_TIMEOUT_MS = 10000;\n\nexport const PREFETCH_DEFAULT_DELAY_MS = 200;\n\nexport const HTTP_OK = 200;\n\nexport const HTTP_NO_CONTENT = 204;\n\nexport const HTTP_CREATED = 201;\n\nexport const HTTP_REDIRECT_FOUND = 302;\n\nexport const HTTP_NOT_MODIFIED = 304;\n\nexport const HTTP_BAD_REQUEST = 400;\n\nexport const HTTP_UNAUTHORIZED = 401;\n\nexport const HTTP_FORBIDDEN = 403;\n\nexport const HTTP_NOT_FOUND = 404;\n\nexport const HTTP_METHOD_NOT_ALLOWED = 405;\n\nexport const HTTP_GONE = 410;\n\nexport const HTTP_PAYLOAD_TOO_LARGE = 413;\n\nexport const HTTP_URI_TOO_LONG = 414;\n\nexport const HTTP_TOO_MANY_REQUESTS = 429;\n\nexport const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;\n\nexport const HTTP_SERVER_ERROR = 500;\n\nexport const HTTP_INTERNAL_SERVER_ERROR = 500;\n\nexport const HTTP_BAD_GATEWAY = 502;\n\nexport const HTTP_NOT_IMPLEMENTED = 501;\n\nexport const HTTP_UNAVAILABLE = 503;\n\nexport const HTTP_NETWORK_CONNECT_TIMEOUT = 599;\n\nexport const HTTP_STATUS_SUCCESS_MIN = 200;\n\nexport const HTTP_STATUS_REDIRECT_MIN = 300;\n\nexport const HTTP_STATUS_CLIENT_ERROR_MIN = 400;\n\nexport const HTTP_STATUS_SERVER_ERROR_MIN = 500;\n\nexport const HTTP_CONTENT_TYPES = {\n JS: \"application/javascript; charset=utf-8\",\n JSON: \"application/json; charset=utf-8\",\n HTML: \"text/html; charset=utf-8\",\n CSS: \"text/css; charset=utf-8\",\n TEXT: \"text/plain; charset=utf-8\",\n} as const;\n\nimport { MS_PER_SECOND, SECONDS_PER_MINUTE } from \"./cache.ts\";\n\nexport const MS_PER_MINUTE = 60000;\n\nexport { MS_PER_SECOND, SECONDS_PER_MINUTE };\n\nexport const HTTP_CONTENT_TYPE_IMAGE_PNG = \"image/png\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_JPEG = \"image/jpeg\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_WEBP = \"image/webp\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_AVIF = \"image/avif\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_SVG = \"image/svg+xml\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_GIF = \"image/gif\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_ICO = \"image/x-icon\";\n", "import { KB_IN_BYTES } from \"./http.ts\";\n\nexport const HMR_MAX_MESSAGE_SIZE_BYTES = 1024 * KB_IN_BYTES;\n\nexport const HMR_MAX_MESSAGES_PER_MINUTE = 100;\n\nexport const HMR_CLIENT_RELOAD_DELAY_MS = 3000;\n\nexport const HMR_PORT_OFFSET = 1;\n\nexport const HMR_RATE_LIMIT_WINDOW_MS = 60000;\n\nexport const HMR_CLOSE_NORMAL = 1000;\n\nexport const HMR_CLOSE_RATE_LIMIT = 1008;\n\nexport const HMR_CLOSE_MESSAGE_TOO_LARGE = 1009;\n\nexport const HMR_MESSAGE_TYPES = {\n CONNECTED: \"connected\",\n UPDATE: \"update\",\n RELOAD: \"reload\",\n PING: \"ping\",\n PONG: \"pong\",\n} as const;\n\nexport function isValidHMRMessageType(type: string): type is keyof typeof HMR_MESSAGE_TYPES {\n return Object.values(HMR_MESSAGE_TYPES).includes(\n type as typeof HMR_MESSAGE_TYPES[keyof typeof HMR_MESSAGE_TYPES],\n );\n}\n", "export const DEFAULT_DEV_SERVER_PORT = 3000;\nexport const DEFAULT_REDIS_PORT = 6379;\nexport const DEFAULT_API_SERVER_PORT = 8080;\nexport const DEFAULT_PREVIEW_SERVER_PORT = 5000;\nexport const DEFAULT_METRICS_PORT = 9000;\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * 1024;\n\nexport const DEFAULT_IMAGE_THUMBNAIL_SIZE = 256;\nexport const DEFAULT_IMAGE_SMALL_SIZE = 512;\nexport const DEFAULT_IMAGE_LARGE_SIZE = 2048;\n\nexport const RESPONSIVE_IMAGE_WIDTH_XS = 320;\nexport const RESPONSIVE_IMAGE_WIDTH_SM = 640;\nexport const RESPONSIVE_IMAGE_WIDTH_MD = 1024;\nexport const RESPONSIVE_IMAGE_WIDTH_LG = 1920;\n\nexport const RESPONSIVE_IMAGE_WIDTHS = [\n RESPONSIVE_IMAGE_WIDTH_XS,\n RESPONSIVE_IMAGE_WIDTH_SM,\n RESPONSIVE_IMAGE_WIDTH_MD,\n RESPONSIVE_IMAGE_WIDTH_LG,\n] as const;\n\nexport const MAX_CHUNK_SIZE_KB = 4096;\n\nexport const MIN_PORT = 1;\n\nexport const MAX_PORT = 65535;\n\nexport const DEFAULT_SERVER_PORT = 8000;\n", "/**\n * Project directory paths and file extensions\n *\n * For internal veryfront URL endpoints, see ./constants/server.ts\n */\n\nimport {\n BUILD_DIRS,\n INTERNAL_ENDPOINTS,\n INTERNAL_PATH_PREFIXES,\n INTERNAL_PREFIX,\n} from \"./constants/server.ts\";\n\nexport const PATHS = {\n PAGES_DIR: \"pages\",\n COMPONENTS_DIR: \"components\",\n PUBLIC_DIR: \"public\",\n STYLES_DIR: \"styles\",\n DIST_DIR: \"dist\",\n CONFIG_FILE: \"veryfront.config.js\",\n} as const;\n\n/**\n * @deprecated Use INTERNAL_PREFIX, INTERNAL_ENDPOINTS, INTERNAL_PATH_PREFIXES from ./constants/server.ts\n */\nexport const VERYFRONT_PATHS = {\n INTERNAL_PREFIX: INTERNAL_PREFIX,\n BUILD_DIR: BUILD_DIRS.ROOT,\n CHUNKS_DIR: BUILD_DIRS.CHUNKS,\n DATA_DIR: BUILD_DIRS.DATA,\n ASSETS_DIR: BUILD_DIRS.ASSETS,\n HMR_RUNTIME: INTERNAL_ENDPOINTS.HMR_RUNTIME,\n CLIENT_JS: INTERNAL_ENDPOINTS.CLIENT_JS,\n ROUTER_JS: INTERNAL_ENDPOINTS.ROUTER_JS,\n ERROR_OVERLAY: INTERNAL_ENDPOINTS.ERROR_OVERLAY,\n} as const;\n\nexport const FILE_EXTENSIONS = {\n MDX: [\".mdx\", \".md\"],\n SCRIPT: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n STYLE: [\".css\", \".scss\", \".sass\"],\n ALL: [\".mdx\", \".md\", \".tsx\", \".ts\", \".jsx\", \".js\", \".css\"],\n} as const;\n\n// Re-export for convenience\nexport { BUILD_DIRS, INTERNAL_ENDPOINTS, INTERNAL_PATH_PREFIXES, INTERNAL_PREFIX };\n", "import { serverLogger as logger } from \"./logger/index.ts\";\n\nexport interface BundleMetadata {\n hash: string;\n codeHash: string;\n size: number;\n compiledAt: number;\n source: string;\n mode: \"development\" | \"production\";\n meta?: {\n type?: \"mdx\" | \"component\" | \"layout\" | \"provider\";\n depsHash?: string;\n reactVersion?: string;\n };\n}\n\nexport interface BundleCode {\n code: string;\n sourceMap?: string;\n css?: string;\n}\n\nexport interface BundleManifestStore {\n getBundleMetadata(key: string): Promise<BundleMetadata | undefined>;\n\n setBundleMetadata(key: string, metadata: BundleMetadata, ttlMs?: number): Promise<void>;\n\n getBundleCode(hash: string): Promise<BundleCode | undefined>;\n\n setBundleCode(hash: string, code: BundleCode, ttlMs?: number): Promise<void>;\n\n deleteBundle(key: string): Promise<void>;\n\n invalidateSource(source: string): Promise<number>;\n\n clear(): Promise<void>;\n\n isAvailable(): Promise<boolean>;\n\n getStats(): Promise<{\n totalBundles: number;\n totalSize: number;\n oldestBundle?: number;\n newestBundle?: number;\n }>;\n}\n\nexport class InMemoryBundleManifestStore implements BundleManifestStore {\n private metadata = new Map<string, { value: BundleMetadata; expiry?: number }>();\n private code = new Map<string, { value: BundleCode; expiry?: number }>();\n private sourceIndex = new Map<string, Set<string>>();\n\n getBundleMetadata(key: string): Promise<BundleMetadata | undefined> {\n const entry = this.metadata.get(key);\n if (!entry) return Promise.resolve(undefined);\n if (entry.expiry && Date.now() > entry.expiry) {\n this.metadata.delete(key);\n return Promise.resolve(undefined);\n }\n return Promise.resolve(entry.value);\n }\n\n setBundleMetadata(key: string, metadata: BundleMetadata, ttlMs?: number): Promise<void> {\n const expiry = ttlMs ? Date.now() + ttlMs : undefined;\n this.metadata.set(key, { value: metadata, expiry });\n\n if (!this.sourceIndex.has(metadata.source)) {\n this.sourceIndex.set(metadata.source, new Set());\n }\n this.sourceIndex.get(metadata.source)!.add(key);\n return Promise.resolve();\n }\n\n getBundleCode(hash: string): Promise<BundleCode | undefined> {\n const entry = this.code.get(hash);\n if (!entry) return Promise.resolve(undefined);\n if (entry.expiry && Date.now() > entry.expiry) {\n this.code.delete(hash);\n return Promise.resolve(undefined);\n }\n return Promise.resolve(entry.value);\n }\n\n setBundleCode(hash: string, code: BundleCode, ttlMs?: number): Promise<void> {\n const expiry = ttlMs ? Date.now() + ttlMs : undefined;\n this.code.set(hash, { value: code, expiry });\n return Promise.resolve();\n }\n\n async deleteBundle(key: string): Promise<void> {\n const metadata = await this.getBundleMetadata(key);\n this.metadata.delete(key);\n if (metadata) {\n this.code.delete(metadata.codeHash);\n const sourceKeys = this.sourceIndex.get(metadata.source);\n if (sourceKeys) {\n sourceKeys.delete(key);\n if (sourceKeys.size === 0) {\n this.sourceIndex.delete(metadata.source);\n }\n }\n }\n }\n\n async invalidateSource(source: string): Promise<number> {\n const keys = this.sourceIndex.get(source);\n if (!keys) return 0;\n\n let count = 0;\n for (const key of Array.from(keys)) {\n await this.deleteBundle(key);\n count++;\n }\n this.sourceIndex.delete(source);\n return count;\n }\n\n clear(): Promise<void> {\n this.metadata.clear();\n this.code.clear();\n this.sourceIndex.clear();\n return Promise.resolve();\n }\n\n isAvailable(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n getStats(): Promise<{\n totalBundles: number;\n totalSize: number;\n oldestBundle?: number;\n newestBundle?: number;\n }> {\n let totalSize = 0;\n let oldest: number | undefined;\n let newest: number | undefined;\n\n for (const { value } of this.metadata.values()) {\n totalSize += value.size;\n if (!oldest || value.compiledAt < oldest) oldest = value.compiledAt;\n if (!newest || value.compiledAt > newest) newest = value.compiledAt;\n }\n\n return Promise.resolve({\n totalBundles: this.metadata.size,\n totalSize,\n oldestBundle: oldest,\n newestBundle: newest,\n });\n }\n}\n\nlet manifestStore: BundleManifestStore = new InMemoryBundleManifestStore();\n\nexport function setBundleManifestStore(store: BundleManifestStore): void {\n manifestStore = store;\n logger.info(\"[bundle-manifest] Bundle manifest store configured\", {\n type: store.constructor.name,\n });\n}\n\nexport function getBundleManifestStore(): BundleManifestStore {\n return manifestStore;\n}\n\nexport { computeCodeHash, computeContentHash } from \"./hash-utils.ts\";\n", "import type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport type { TracingConfig } from \"./types.ts\";\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\nconst DEFAULT_CONFIG: TracingConfig = {\n enabled: false,\n exporter: \"console\",\n serviceName: \"veryfront\",\n sampleRate: 1.0,\n debug: false,\n};\n\nexport function loadConfig(\n config: Partial<TracingConfig> = {},\n adapter?: RuntimeAdapter,\n): TracingConfig {\n const finalConfig = { ...DEFAULT_CONFIG, ...config };\n\n if (adapter?.env) {\n applyEnvFromAdapter(finalConfig, adapter.env);\n } else {\n applyEnvFromDeno(finalConfig);\n }\n\n return finalConfig;\n}\n\nfunction applyEnvFromAdapter(\n config: TracingConfig,\n envAdapter: RuntimeAdapter[\"env\"],\n): void {\n if (!envAdapter) return;\n\n const otelEnabled = envAdapter.get(\"OTEL_TRACES_ENABLED\");\n const veryfrontOtel = envAdapter.get(\"VERYFRONT_OTEL\");\n const serviceName = envAdapter.get(\"OTEL_SERVICE_NAME\");\n\n config.enabled = otelEnabled === \"true\" ||\n veryfrontOtel === \"1\" ||\n config.enabled;\n\n if (serviceName) config.serviceName = serviceName;\n\n const otlpEndpoint = envAdapter.get(\"OTEL_EXPORTER_OTLP_ENDPOINT\");\n const tracesEndpoint = envAdapter.get(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\");\n config.endpoint = otlpEndpoint || tracesEndpoint || config.endpoint;\n\n const exporterType = envAdapter.get(\"OTEL_TRACES_EXPORTER\");\n if (isValidExporter(exporterType)) {\n config.exporter = exporterType;\n }\n}\n\nfunction applyEnvFromDeno(config: TracingConfig): void {\n try {\n // Use platform abstraction for cross-platform env access\n config.enabled = getEnv(\"OTEL_TRACES_ENABLED\") === \"true\" ||\n getEnv(\"VERYFRONT_OTEL\") === \"1\" ||\n config.enabled;\n\n config.serviceName = getEnv(\"OTEL_SERVICE_NAME\") || config.serviceName;\n config.endpoint = getEnv(\"OTEL_EXPORTER_OTLP_ENDPOINT\") ||\n getEnv(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\") ||\n config.endpoint;\n\n const exporterType = getEnv(\"OTEL_TRACES_EXPORTER\");\n if (isValidExporter(exporterType)) {\n config.exporter = exporterType;\n }\n } catch {\n // Environment access may fail in some runtimes\n }\n}\n\nfunction isValidExporter(value: string | undefined): value is TracingConfig[\"exporter\"] {\n return value === \"jaeger\" || value === \"zipkin\" || value === \"otlp\" || value === \"console\";\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { Span, SpanKind } from \"./types.ts\";\nimport type { OpenTelemetryAPI, SpanOptions } from \"./types.ts\";\n\nexport class SpanOperations {\n constructor(\n private api: OpenTelemetryAPI,\n private tracer: import(\"./types.ts\").Tracer,\n ) {}\n\n startSpan(name: string, options: SpanOptions = {}): Span | null {\n try {\n const spanKind = this.mapSpanKind(options.kind);\n\n const span = this.tracer.startSpan(name, {\n kind: spanKind,\n attributes: options.attributes || {},\n }, options.parent as import(\"./types.ts\").Context | undefined);\n\n return span;\n } catch (error) {\n logger.debug(\"[tracing] Failed to start span\", { name, error });\n return null;\n }\n }\n\n endSpan(span: Span | null, error?: Error): void {\n if (!span) return;\n\n try {\n if (error) {\n span.recordException(error);\n span.setStatus({\n code: this.api.SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: this.api.SpanStatusCode.OK });\n }\n span.end();\n } catch (err) {\n logger.debug(\"[tracing] Failed to end span\", err);\n }\n }\n\n setAttributes(span: Span | null, attributes: Record<string, string | number | boolean>): void {\n if (!span) return;\n\n try {\n span.setAttributes(attributes);\n } catch (error) {\n logger.debug(\"[tracing] Failed to set span attributes\", error);\n }\n }\n\n addEvent(\n span: Span | null,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n if (!span) return;\n\n try {\n span.addEvent(name, attributes);\n } catch (error) {\n logger.debug(\"[tracing] Failed to add span event\", error);\n }\n }\n\n createChildSpan(parentSpan: Span | null, name: string, options: SpanOptions = {}): Span | null {\n if (!parentSpan) return this.startSpan(name, options);\n\n try {\n const parentContext = this.api.trace.setSpan(this.api.context.active(), parentSpan);\n return this.startSpan(name, { ...options, parent: parentContext });\n } catch (error) {\n logger.debug(\"[tracing] Failed to create child span\", error);\n return null;\n }\n }\n\n private mapSpanKind(kind?: SpanOptions[\"kind\"]): SpanKind {\n if (!kind) return this.api.SpanKind.INTERNAL;\n\n const kindMap: Record<string, SpanKind> = {\n \"internal\": this.api.SpanKind.INTERNAL,\n \"server\": this.api.SpanKind.SERVER,\n \"client\": this.api.SpanKind.CLIENT,\n \"producer\": this.api.SpanKind.PRODUCER,\n \"consumer\": this.api.SpanKind.CONSUMER,\n };\n\n return kindMap[kind.toLowerCase()] || this.api.SpanKind.INTERNAL;\n }\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { Context, OpenTelemetryAPI, Span, TextMapPropagator } from \"./types.ts\";\n\nexport class ContextPropagation {\n constructor(\n private api: OpenTelemetryAPI,\n private propagator: TextMapPropagator,\n ) {}\n\n extractContext(headers: Headers): Context | undefined {\n try {\n const carrier: Record<string, string> = {};\n headers.forEach((value, key) => {\n carrier[key] = value;\n });\n\n return this.api.propagation.extract(this.api.context.active(), carrier);\n } catch (error) {\n logger.debug(\"[tracing] Failed to extract context from headers\", error);\n return undefined;\n }\n }\n\n injectContext(context: Context, headers: Headers): void {\n try {\n const carrier: Record<string, string> = {};\n this.api.propagation.inject(context, carrier);\n\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value);\n }\n } catch (error) {\n logger.debug(\"[tracing] Failed to inject context into headers\", error);\n }\n }\n\n getActiveContext(): Context | undefined {\n try {\n return this.api.context.active();\n } catch (error) {\n logger.debug(\"[tracing] Failed to get active context\", error);\n return undefined;\n }\n }\n\n async withActiveSpan<T>(span: Span | null, fn: () => Promise<T>): Promise<T> {\n if (!span) return await fn();\n\n return await this.api.context.with(\n this.api.trace.setSpan(this.api.context.active(), span),\n fn,\n );\n }\n\n withSpan<T>(\n name: string,\n fn: (span: Span | null) => T,\n startSpan: (name: string) => Span | null,\n endSpan: (span: Span | null, error?: Error) => void,\n ): T {\n const span = startSpan(name);\n\n try {\n const result = fn(span);\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n }\n\n async withSpanAsync<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n startSpan: (name: string) => Span | null,\n endSpan: (span: Span | null, error?: Error) => void,\n ): Promise<T> {\n const span = startSpan(name);\n\n try {\n const result = await fn(span);\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n }\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport type { OpenTelemetryAPI, TracingConfig, TracingState } from \"./types.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { SpanOperations } from \"./span-operations.ts\";\nimport { ContextPropagation } from \"./context-propagation.ts\";\n\nclass TracingManager {\n private state: TracingState = {\n initialized: false,\n tracer: null,\n api: null,\n propagator: null,\n };\n\n private spanOps: SpanOperations | null = null;\n private contextProp: ContextPropagation | null = null;\n\n async initialize(config: Partial<TracingConfig> = {}, adapter?: RuntimeAdapter): Promise<void> {\n if (this.state.initialized) {\n logger.debug(\"[tracing] Already initialized\");\n return;\n }\n\n const finalConfig = loadConfig(config, adapter);\n\n if (!finalConfig.enabled) {\n logger.debug(\"[tracing] Tracing disabled\");\n this.state.initialized = true;\n return;\n }\n\n try {\n await this.initializeTracer(finalConfig);\n this.state.initialized = true;\n\n logger.info(\"[tracing] OpenTelemetry tracing initialized\", {\n exporter: finalConfig.exporter,\n serviceName: finalConfig.serviceName,\n endpoint: finalConfig.endpoint,\n });\n } catch (error) {\n logger.warn(\"[tracing] Failed to initialize OpenTelemetry tracing\", error);\n this.state.initialized = true;\n }\n }\n\n private async initializeTracer(config: TracingConfig): Promise<void> {\n const api = await import(\"@opentelemetry/api\") as OpenTelemetryAPI;\n this.state.api = api;\n\n this.state.tracer = api.trace.getTracer(config.serviceName || \"veryfront\", \"0.1.0\");\n\n const { W3CTraceContextPropagator } = await import(\"@opentelemetry/core\");\n const propagator = new W3CTraceContextPropagator();\n this.state.propagator = propagator;\n api.propagation.setGlobalPropagator(propagator);\n\n if (this.state.api && this.state.tracer) {\n this.spanOps = new SpanOperations(this.state.api, this.state.tracer);\n }\n\n if (this.state.api && this.state.propagator) {\n this.contextProp = new ContextPropagation(this.state.api, this.state.propagator);\n }\n }\n\n isEnabled(): boolean {\n return this.state.initialized && this.state.tracer !== null;\n }\n\n getSpanOperations(): SpanOperations | null {\n return this.spanOps;\n }\n\n getContextPropagation(): ContextPropagation | null {\n return this.contextProp;\n }\n\n getState(): TracingState {\n return this.state;\n }\n\n shutdown(): void {\n if (!this.state.initialized) return;\n\n try {\n logger.info(\"[tracing] Tracing shutdown initiated\");\n } catch (error) {\n logger.warn(\"[tracing] Error during tracing shutdown\", error);\n }\n }\n}\n\nexport const tracingManager = new TracingManager();\n", "import type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport { tracingManager } from \"./manager.ts\";\nimport type { Context, Span, SpanOptions, TracingConfig } from \"./types.ts\";\n\nexport type { Context, Span, SpanOptions, TracingConfig } from \"./types.ts\";\nexport { loadConfig } from \"./config.ts\";\nexport { SpanOperations } from \"./span-operations.ts\";\nexport { ContextPropagation } from \"./context-propagation.ts\";\nexport { SpanNames } from \"./span-names.ts\";\n\nexport async function initTracing(\n config: Partial<TracingConfig> = {},\n adapter?: RuntimeAdapter,\n): Promise<void> {\n await tracingManager.initialize(config, adapter);\n}\n\nexport function isTracingEnabled(): boolean {\n return tracingManager.isEnabled();\n}\n\nexport function shutdownTracing(): void {\n tracingManager.shutdown();\n}\n\nexport function getTracingState() {\n return tracingManager.getState();\n}\n\nconst getSpanOps = () => tracingManager.getSpanOperations();\nconst getContextProp = () => tracingManager.getContextPropagation();\n\nexport function startSpan(name: string, options: SpanOptions = {}): Span | null {\n return getSpanOps()?.startSpan(name, options) ?? null;\n}\n\nexport function endSpan(span: Span | null, error?: Error): void {\n getSpanOps()?.endSpan(span, error);\n}\n\nexport function setSpanAttributes(\n span: Span | null,\n attributes: Record<string, string | number | boolean>,\n): void {\n getSpanOps()?.setAttributes(span, attributes);\n}\n\nexport function addSpanEvent(\n span: Span | null,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n): void {\n getSpanOps()?.addEvent(span, name, attributes);\n}\n\nexport function createChildSpan(\n parentSpan: Span | null,\n name: string,\n options: SpanOptions = {},\n): Span | null {\n return getSpanOps()?.createChildSpan(parentSpan, name, options) ?? null;\n}\n\nexport function extractContext(headers: Headers): Context | undefined {\n return getContextProp()?.extractContext(headers);\n}\n\nexport function injectContext(context: Context, headers: Headers): void {\n getContextProp()?.injectContext(context, headers);\n}\n\nexport function getActiveContext(): Context | undefined {\n return getContextProp()?.getActiveContext();\n}\n\nexport async function withActiveSpan<T>(span: Span | null, fn: () => Promise<T>): Promise<T> {\n const contextProp = getContextProp();\n if (!contextProp) return await fn();\n return await contextProp.withActiveSpan(span, fn);\n}\n\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n options: SpanOptions = {},\n): Promise<T> {\n const contextProp = getContextProp();\n const spanOps = getSpanOps();\n\n if (!contextProp || !spanOps) return await fn(null);\n\n return await contextProp.withSpanAsync(\n name,\n fn,\n (n) => spanOps.startSpan(n, options),\n (s, e) => spanOps.endSpan(s, e),\n );\n}\n\nexport function withSpanSync<T>(\n name: string,\n fn: (span: Span | null) => T,\n options: SpanOptions = {},\n): T {\n const contextProp = getContextProp();\n const spanOps = getSpanOps();\n\n if (!contextProp || !spanOps) return fn(null);\n\n return contextProp.withSpan(\n name,\n fn,\n (n) => spanOps.startSpan(n, options),\n (s, e) => spanOps.endSpan(s, e),\n );\n}\n\nexport { tracingManager } from \"./manager.ts\";\n", "/**\n * Agent Runtime - Core execution engine\n *\n * Handles agent execution with:\n * - Multi-step reasoning (agent loop)\n * - Tool calling and execution\n * - Streaming responses\n * - Memory management\n * - Middleware execution\n */\n\nimport {\n type AgentConfig,\n type AgentContext,\n type AgentResponse,\n type AgentStatus,\n getTextFromParts,\n getToolArguments,\n type Message,\n type MessagePart,\n type ToolCall,\n type ToolCallPart,\n type ToolResultPart,\n} from \"../types/agent.ts\";\nimport type { ToolDefinition } from \"../types/tool.ts\";\nimport type { Provider } from \"../types/provider.ts\";\nimport { getProviderFromModel } from \"../providers/factory.ts\";\nimport { executeTool, generateId, toolRegistry, toolToProviderDefinition } from \"../utils/index.ts\";\nimport { detectPlatform, getPlatformCapabilities } from \"../runtime/platform.ts\";\nimport { createMemory, type Memory } from \"./memory.ts\";\nimport { serverLogger as logger } from \"@veryfront/utils\";\nimport { addSpanEvent, setSpanAttributes, withSpan } from \"../../observability/tracing/index.ts\";\nimport { z } from \"zod\";\n\nconst AgentStreamEventSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"content\"),\n content: z.string(),\n }),\n z.object({\n type: z.literal(\"tool_call_start\"),\n toolCall: z.object({\n id: z.string(),\n name: z.string(),\n }),\n }),\n z.object({\n type: z.literal(\"tool_call_delta\"),\n id: z.string(),\n arguments: z.string(),\n }),\n z.object({\n type: z.literal(\"tool_call_complete\"),\n toolCall: z.object({\n id: z.string(),\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n z.object({\n type: z.literal(\"finish\"),\n finishReason: z.string().nullable(),\n }),\n z.object({\n type: z.literal(\"usage\"),\n usage: z.object({\n promptTokens: z.number().optional(),\n completionTokens: z.number().optional(),\n totalTokens: z.number().optional(),\n }),\n }),\n]);\n\ntype AgentStreamEvent = z.infer<typeof AgentStreamEventSchema>;\n\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_TEMPERATURE = 0.7;\n\n/**\n * Provider message format\n */\ninterface ProviderMessage {\n role: string;\n content: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Convert v5 Message to provider format.\n * Empty parts array results in empty content string, which is valid for\n * providers (e.g., assistant message with only tool calls, no text).\n */\nfunction convertMessageToProvider(msg: Message): ProviderMessage {\n const content = getTextFromParts(msg.parts);\n\n const providerMsg: ProviderMessage = {\n role: msg.role,\n content,\n };\n\n // Extract tool calls from parts\n // AI SDK v5 uses tool-${toolName} pattern (e.g., \"tool-weather\")\n // Also support legacy \"tool-call\" for backwards compatibility\n // Exclude \"tool-result\" which also starts with \"tool-\"\n const toolCallParts = msg.parts.filter(\n (p): p is ToolCallPart | (MessagePart & { type: \"tool-call\" }) =>\n p.type === \"tool-call\" || (p.type.startsWith(\"tool-\") && p.type !== \"tool-result\"),\n );\n if (toolCallParts.length > 0) {\n providerMsg.tool_calls = toolCallParts.map((tc) => ({\n id: tc.toolCallId,\n type: \"function\",\n function: {\n name: tc.toolName,\n // Use type-safe helper to extract args/input (throws if missing)\n arguments: JSON.stringify(getToolArguments(tc as ToolCallPart)),\n },\n }));\n }\n\n // Extract tool result info from parts\n const toolResultPart = msg.parts.find(\n (p): p is ToolResultPart => p.type === \"tool-result\",\n );\n if (toolResultPart && msg.role === \"tool\") {\n providerMsg.tool_call_id = toolResultPart.toolCallId;\n providerMsg.content = JSON.stringify(toolResultPart.result);\n }\n\n return providerMsg;\n}\n\nexport class AgentRuntime {\n private id: string;\n private config: AgentConfig;\n private memory: Memory;\n private status: AgentStatus = \"idle\";\n\n constructor(id: string, config: AgentConfig) {\n this.id = id;\n this.config = config;\n\n const memoryConfig = config.memory || { type: \"conversation\", maxTokens: 4000 };\n this.memory = createMemory(memoryConfig);\n }\n\n /**\n * Generate a response (non-streaming)\n */\n async generate(\n input: string | Message[],\n context?: Record<string, unknown>,\n ): Promise<AgentResponse> {\n return await withSpan(\"agent.generate\", async (span) => {\n setSpanAttributes(span, {\n \"agent.id\": this.id,\n \"agent.model\": this.config.model,\n });\n\n const inputMessages = this.normalizeInput(input);\n\n for (const msg of inputMessages) {\n await this.memory.add(msg);\n }\n\n const messages = await this.memory.getMessages();\n const systemPrompt = await this.resolveSystemPrompt();\n const { provider, model } = getProviderFromModel(this.config.model);\n\n const agentContext: AgentContext = {\n agentId: this.id,\n model: this.config.model,\n input: inputMessages,\n data: context,\n platform: detectPlatform(),\n };\n\n if (this.config.middleware && this.config.middleware.length > 0) {\n return await this.executeMiddleware(agentContext, async () => {\n return await this.executeAgentLoop(\n provider,\n model,\n systemPrompt,\n messages,\n );\n });\n }\n\n return await this.executeAgentLoop(\n provider,\n model,\n systemPrompt,\n messages,\n );\n });\n }\n\n /**\n * Stream a response\n * Returns a ReadableStream compatible with Vercel AI SDK Data Stream Protocol\n */\n async stream(\n messages: Message[],\n context?: Record<string, unknown>,\n callbacks?: {\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n },\n ): Promise<ReadableStream> {\n for (const msg of messages) {\n await this.memory.add(msg);\n }\n\n const memoryMessages = await this.memory.getMessages();\n const systemPrompt = await this.resolveSystemPrompt();\n const { provider, model } = getProviderFromModel(this.config.model);\n\n const encoder = new TextEncoder();\n\n // Build tool execution context - merge user context with agent context\n const toolContext = {\n agentId: this.id,\n ...context,\n };\n\n // Generate a unique text part ID for UI message stream\n const textPartId = generateId(\"text\");\n\n return new ReadableStream({\n start: async (controller) => {\n try {\n this.status = \"streaming\";\n\n // Send start event (UI Message Stream Protocol v5)\n const messageId = `msg-${Date.now().toString(36)}-${\n Math.random().toString(36).slice(2, 8)\n }`;\n const startEvent = JSON.stringify({ type: \"start\", messageId });\n controller.enqueue(encoder.encode(`data: ${startEvent}\\n\\n`));\n\n // Send text-start event with ID\n const textStartEvent = JSON.stringify({\n type: \"text-start\",\n id: textPartId,\n });\n controller.enqueue(encoder.encode(`data: ${textStartEvent}\\n\\n`));\n\n await this.executeAgentLoopStreaming(\n provider,\n model,\n systemPrompt,\n memoryMessages,\n controller,\n encoder,\n callbacks,\n textPartId,\n toolContext,\n );\n\n // Send text-end event (UI Message Stream Protocol v5)\n const textEndEvent = JSON.stringify({\n type: \"text-end\",\n id: textPartId,\n });\n controller.enqueue(encoder.encode(`data: ${textEndEvent}\\n\\n`));\n\n // Send finish event (UI Message Stream Protocol v5)\n const finishEvent = JSON.stringify({ type: \"finish\" });\n controller.enqueue(encoder.encode(`data: ${finishEvent}\\n\\n`));\n\n controller.close();\n } catch (error) {\n this.status = \"error\";\n\n const errorEvent = JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n controller.enqueue(encoder.encode(`data: ${errorEvent}\\n\\n`));\n\n controller.close();\n }\n },\n });\n }\n\n /**\n * Execute agent loop (with tool calling)\n */\n private async executeAgentLoop(\n provider: Provider,\n model: string,\n systemPrompt: string,\n messages: Message[],\n ): Promise<AgentResponse> {\n return await withSpan(\"agent.execution_loop\", async (loopSpan) => {\n const capabilities = getPlatformCapabilities();\n const maxSteps = this.getMaxSteps(capabilities.maxAgentSteps);\n\n const toolCalls: ToolCall[] = [];\n const currentMessages = [...messages];\n const totalUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n for (let step = 0; step < maxSteps; step++) {\n this.status = \"thinking\";\n addSpanEvent(loopSpan, \"step_start\", { step });\n\n const tools = this.getAvailableTools();\n\n const response = await withSpan(\"agent.provider_complete\", async (span) => {\n setSpanAttributes(span, {\n model,\n \"messages.count\": currentMessages.length,\n });\n return await provider.complete({\n model,\n system: systemPrompt,\n messages: currentMessages.map((m) => convertMessageToProvider(m)),\n tools: tools.length > 0 ? tools : undefined,\n maxTokens: this.config.memory?.maxTokens || DEFAULT_MAX_TOKENS,\n temperature: DEFAULT_TEMPERATURE,\n });\n });\n\n totalUsage.promptTokens += response.usage.promptTokens;\n totalUsage.completionTokens += response.usage.completionTokens;\n totalUsage.totalTokens += response.usage.totalTokens;\n\n // Build parts array for v5 Message\n const assistantParts: MessagePart[] = [];\n if (response.text) {\n assistantParts.push({ type: \"text\", text: response.text });\n }\n if (response.toolCalls) {\n for (const tc of response.toolCalls) {\n // Use AI SDK v5 tool-${toolName} pattern\n assistantParts.push({\n type: `tool-${tc.name}`,\n toolCallId: tc.id,\n toolName: tc.name,\n args: tc.arguments,\n });\n }\n }\n\n const assistantMessage: Message = {\n id: `msg_${Date.now()}_${step}`,\n role: \"assistant\",\n parts: assistantParts,\n timestamp: Date.now(),\n };\n currentMessages.push(assistantMessage);\n await this.memory.add(assistantMessage);\n\n if (response.toolCalls && response.toolCalls.length > 0) {\n this.status = \"tool_execution\";\n addSpanEvent(loopSpan, \"tool_execution_start\", {\n count: response.toolCalls.length,\n });\n\n for (const tc of response.toolCalls) {\n const toolCall: ToolCall = {\n id: tc.id,\n name: tc.name,\n args: tc.arguments,\n status: \"pending\",\n };\n\n await withSpan(\"agent.tool_execute\", async (toolSpan) => {\n setSpanAttributes(toolSpan, {\n \"tool.name\": tc.name,\n \"tool.id\": tc.id,\n });\n\n try {\n toolCall.status = \"executing\";\n const startTime = Date.now();\n\n const result = await executeTool(tc.name, tc.arguments, {\n agentId: this.id,\n });\n\n toolCall.status = \"completed\";\n toolCall.result = result;\n toolCall.executionTime = Date.now() - startTime;\n\n const toolResultMessage: Message = {\n id: `tool_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result,\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(toolResultMessage);\n await this.memory.add(toolResultMessage);\n } catch (error) {\n toolCall.status = \"error\";\n toolCall.error = error instanceof Error ? error.message : String(error);\n setSpanAttributes(toolSpan, { \"error\": true, \"error.message\": toolCall.error });\n\n const errorMessage: Message = {\n id: `tool_error_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result: { error: toolCall.error },\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(errorMessage);\n await this.memory.add(errorMessage);\n }\n\n toolCalls.push(toolCall);\n });\n }\n\n continue;\n }\n\n this.status = \"completed\";\n addSpanEvent(loopSpan, \"loop_complete\");\n\n return {\n text: response.text,\n messages: currentMessages,\n toolCalls,\n status: this.status,\n usage: totalUsage,\n };\n }\n\n this.status = \"completed\";\n addSpanEvent(loopSpan, \"max_steps_reached\", { maxSteps });\n\n const lastMsg = currentMessages[currentMessages.length - 1];\n return {\n text: lastMsg ? getTextFromParts(lastMsg.parts) : \"\",\n messages: currentMessages,\n toolCalls,\n status: this.status,\n usage: totalUsage,\n metadata: {\n warning: `Max steps (${maxSteps}) reached`,\n },\n };\n });\n }\n\n /**\n * Execute agent loop with streaming\n * Uses Vercel AI SDK UI Message Stream Protocol v5 format\n */\n private async executeAgentLoopStreaming(\n provider: Provider,\n model: string,\n systemPrompt: string,\n messages: Message[],\n controller: ReadableStreamDefaultController,\n encoder: TextEncoder,\n callbacks?: {\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n },\n textPartId?: string,\n toolContext?: Record<string, unknown>,\n ): Promise<AgentResponse> {\n const capabilities = getPlatformCapabilities();\n const maxSteps = this.getMaxSteps(capabilities.maxAgentSteps);\n\n const toolCalls: ToolCall[] = [];\n const currentMessages = [...messages];\n const totalUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n for (let step = 0; step < maxSteps; step++) {\n // Send start-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const startStepEvent = JSON.stringify({ type: \"start-step\" });\n controller.enqueue(encoder.encode(`data: ${startStepEvent}\\n\\n`));\n\n const tools = this.getAvailableTools();\n\n const stream = await provider.stream({\n model,\n system: systemPrompt,\n messages: currentMessages.map((m) => convertMessageToProvider(m)),\n tools: tools.length > 0 ? tools : undefined,\n maxTokens: this.config.memory?.maxTokens || DEFAULT_MAX_TOKENS,\n temperature: DEFAULT_TEMPERATURE,\n });\n\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n let finishReason: string | null = null;\n\n const streamToolCalls = new Map<string, {\n id: string;\n name: string;\n arguments: string;\n }>();\n\n const parseStreamToolArgs = (\n rawArgs: string | Record<string, unknown>,\n ): { args: Record<string, unknown>; error?: string } => {\n try {\n const parsed = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return { args: parsed as Record<string, unknown> };\n }\n return { args: {}, error: \"Tool call arguments must be a JSON object\" };\n } catch (error) {\n return {\n args: {},\n error: error instanceof Error ? error.message : String(error),\n };\n }\n };\n\n const recordToolError = async (toolCall: ToolCall, errorStr: string) => {\n toolCall.status = \"error\";\n toolCall.error = errorStr;\n toolCalls.push(toolCall);\n\n // Send tool-output-error event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const errorTool = toolRegistry.get(toolCall.name);\n const errorIsDynamic = errorTool?.type === \"dynamic\";\n const errorData = JSON.stringify({\n type: \"tool-output-error\",\n toolCallId: toolCall.id,\n errorText: errorStr,\n ...(errorIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n\n const errorMessage: Message = {\n id: `tool_error_${toolCall.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n result: { error: errorStr },\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(errorMessage);\n await this.memory.add(errorMessage);\n };\n\n // Vercel AI SDK Data Stream Protocol event handler\n const handleEvent = (event: AgentStreamEvent) => {\n switch (event.type) {\n case \"content\": {\n accumulatedText += event.content;\n\n // Use Vercel AI SDK UI Message Stream Protocol v5 format\n const textDeltaEvent = JSON.stringify({\n type: \"text-delta\",\n id: textPartId,\n delta: event.content,\n });\n controller.enqueue(encoder.encode(`data: ${textDeltaEvent}\\n\\n`));\n\n if (callbacks?.onChunk) {\n callbacks.onChunk(event.content);\n }\n break;\n }\n\n case \"tool_call_start\":\n if (event.toolCall?.id) {\n streamToolCalls.set(event.toolCall.id, {\n id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: \"\",\n });\n\n // Send tool-input-start event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const startTool = toolRegistry.get(event.toolCall.name);\n const startIsDynamic = startTool?.type === \"dynamic\";\n const toolStartEvent = JSON.stringify({\n type: \"tool-input-start\",\n toolCallId: event.toolCall.id,\n toolName: event.toolCall.name,\n ...(startIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolStartEvent}\\n\\n`));\n }\n break;\n\n case \"tool_call_delta\":\n if (event.id && streamToolCalls.has(event.id)) {\n const tc = streamToolCalls.get(event.id)!;\n tc.arguments += event.arguments;\n\n // Send tool-input-delta event (AI SDK v5 UI Message Stream Protocol)\n const toolDeltaEvent = JSON.stringify({\n type: \"tool-input-delta\",\n toolCallId: event.id,\n inputTextDelta: event.arguments,\n });\n controller.enqueue(encoder.encode(`data: ${toolDeltaEvent}\\n\\n`));\n }\n break;\n\n case \"tool_call_complete\":\n if (event.toolCall?.id) {\n streamToolCalls.set(event.toolCall.id, {\n id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: event.toolCall.arguments,\n });\n\n // Send tool-input-available event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const completeTool = toolRegistry.get(event.toolCall.name);\n const completeIsDynamic = completeTool?.type === \"dynamic\";\n const { args } = parseStreamToolArgs(event.toolCall.arguments);\n const toolCallEvent = JSON.stringify({\n type: \"tool-input-available\",\n toolCallId: event.toolCall.id,\n toolName: event.toolCall.name,\n input: args,\n ...(completeIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolCallEvent}\\n\\n`));\n }\n break;\n\n case \"finish\":\n finishReason = event.finishReason;\n break;\n\n case \"usage\":\n if (event.usage) {\n totalUsage.promptTokens += event.usage.promptTokens || 0;\n totalUsage.completionTokens += event.usage.completionTokens || 0;\n totalUsage.totalTokens += event.usage.totalTokens || 0;\n }\n break;\n }\n };\n\n let partial = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n partial += decoder.decode(value, { stream: true });\n const segments = partial.split(\"\\n\");\n partial = segments.pop() ?? \"\";\n const lines = segments.filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const rawEvent = JSON.parse(line);\n const parseResult = AgentStreamEventSchema.safeParse(rawEvent);\n\n if (parseResult.success) {\n handleEvent(parseResult.data);\n } else {\n logger.warn(\"[AGENT] Invalid stream event received:\", parseResult.error);\n }\n } catch (e) {\n logger.warn(\"[AGENT] Failed to parse stream line:\", e);\n continue;\n }\n }\n }\n\n if (partial.trim()) {\n try {\n const rawEvent = JSON.parse(partial);\n const parseResult = AgentStreamEventSchema.safeParse(rawEvent);\n if (parseResult.success) {\n handleEvent(parseResult.data);\n }\n } catch {\n // Ignore trailing partial\n }\n }\n\n // Build v5 parts array\n const streamParts: MessagePart[] = [];\n if (accumulatedText) {\n streamParts.push({ type: \"text\", text: accumulatedText });\n }\n if (streamToolCalls.size > 0) {\n for (const tc of streamToolCalls.values()) {\n const { args, error } = parseStreamToolArgs(tc.arguments);\n if (error) {\n logger.warn(\"[AGENT] Failed to parse streamed tool arguments\", {\n toolCallId: tc.id,\n error,\n });\n }\n // Use AI SDK v5 tool-${toolName} pattern\n streamParts.push({\n type: `tool-${tc.name}`,\n toolCallId: tc.id,\n toolName: tc.name,\n args,\n });\n }\n }\n\n const assistantMessage: Message = {\n id: `msg_${Date.now()}_${step}`,\n role: \"assistant\",\n parts: streamParts,\n timestamp: Date.now(),\n };\n\n currentMessages.push(assistantMessage);\n await this.memory.add(assistantMessage);\n\n if (finishReason === \"tool_calls\" && streamToolCalls.size > 0) {\n this.status = \"tool_execution\";\n\n for (const tc of streamToolCalls.values()) {\n const { args, error: argError } = parseStreamToolArgs(tc.arguments);\n const toolCall: ToolCall = {\n id: tc.id,\n name: tc.name,\n args,\n status: \"pending\",\n };\n\n if (argError) {\n logger.warn(\"[AGENT] Invalid streamed tool arguments\", {\n toolCallId: tc.id,\n error: argError,\n });\n // Send tool-input-error event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const inputErrorTool = toolRegistry.get(tc.name);\n const inputErrorIsDynamic = inputErrorTool?.type === \"dynamic\";\n const inputErrorEvent = JSON.stringify({\n type: \"tool-input-error\",\n toolCallId: tc.id,\n errorText: `Invalid tool arguments: ${argError}`,\n ...(inputErrorIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${inputErrorEvent}\\n\\n`));\n await recordToolError(toolCall, `Invalid tool arguments: ${argError}`);\n continue;\n }\n\n try {\n toolCall.status = \"executing\";\n const startTime = Date.now();\n\n if (callbacks?.onToolCall) {\n callbacks.onToolCall(toolCall);\n }\n\n // Note: tool-input-available was already sent during streaming\n // Proceed directly to tool execution\n\n const result = await executeTool(tc.name, toolCall.args, {\n agentId: this.id,\n ...toolContext,\n });\n\n toolCall.status = \"completed\";\n toolCall.result = result;\n toolCall.executionTime = Date.now() - startTime;\n toolCalls.push(toolCall);\n\n // Send tool-output-available event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const outputTool = toolRegistry.get(tc.name);\n const outputIsDynamic = outputTool?.type === \"dynamic\";\n const toolResultEvent = JSON.stringify({\n type: \"tool-output-available\",\n toolCallId: toolCall.id,\n output: result,\n ...(outputIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolResultEvent}\\n\\n`));\n\n const toolResultMessage: Message = {\n id: `tool_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result,\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(toolResultMessage);\n await this.memory.add(toolResultMessage);\n } catch (error) {\n const errorStr = error instanceof Error ? error.message : String(error);\n await recordToolError(toolCall, errorStr);\n }\n }\n\n // Send finish-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const finishStepToolsEvent = JSON.stringify({ type: \"finish-step\" });\n controller.enqueue(encoder.encode(`data: ${finishStepToolsEvent}\\n\\n`));\n\n this.status = \"thinking\";\n continue;\n }\n\n // Send finish-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const finishStepEvent = JSON.stringify({ type: \"finish-step\" });\n controller.enqueue(encoder.encode(`data: ${finishStepEvent}\\n\\n`));\n\n break;\n }\n\n const lastMessage = currentMessages[currentMessages.length - 1];\n return {\n text: lastMessage ? getTextFromParts(lastMessage.parts) : \"\",\n messages: currentMessages,\n toolCalls,\n status: \"completed\",\n usage: totalUsage,\n };\n }\n\n /**\n * Execute middleware chain\n */\n private executeMiddleware(\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> {\n const middleware = this.config.middleware || [];\n\n if (middleware.length === 0) {\n return next();\n }\n\n let index = 0;\n const dispatch = (): Promise<AgentResponse> => {\n if (index >= middleware.length) {\n return next();\n }\n\n const currentMiddleware = middleware[index++];\n if (!currentMiddleware) {\n return next();\n }\n return currentMiddleware(context, dispatch);\n };\n\n return dispatch();\n }\n\n private getAvailableTools(): ToolDefinition[] {\n if (!this.config.tools) {\n return [];\n }\n\n const tools: ToolDefinition[] = [];\n\n // When tools === true, load ALL tools from the registry\n if (this.config.tools === true) {\n const allTools = toolRegistry.getAll();\n logger.debug(`[AGENT] Loading all ${allTools.size} tools from registry`);\n for (const [name, tool] of allTools) {\n const def = toolToProviderDefinition(tool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n return tools;\n }\n\n // Otherwise, load specific tools from the config\n for (const [name, entry] of Object.entries(this.config.tools)) {\n if (entry === true) {\n const tool = toolRegistry.get(name);\n if (tool) {\n const def = toolToProviderDefinition(tool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n continue;\n }\n\n if (entry && typeof entry === \"object\") {\n const inlineTool = entry.id === name ? entry : { ...entry, id: name };\n const def = toolToProviderDefinition(inlineTool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n }\n\n return tools;\n }\n\n /**\n * Resolve system prompt (handle string or function)\n */\n private async resolveSystemPrompt(): Promise<string> {\n const system = this.config.system;\n\n if (typeof system === \"string\") {\n return system;\n }\n\n if (typeof system === \"function\") {\n return await system();\n }\n\n return \"You are a helpful AI assistant.\";\n }\n\n /**\n * Normalize input to messages array (v5 format with parts)\n */\n private normalizeInput(input: string | Message[]): Message[] {\n if (typeof input === \"string\") {\n return [\n {\n id: `msg_${Date.now()}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input }],\n timestamp: Date.now(),\n },\n ];\n }\n\n return input.map((msg) => ({\n ...msg,\n id: msg.id || `msg_${Date.now()}`,\n timestamp: msg.timestamp || Date.now(),\n }));\n }\n\n /**\n * Get max steps considering edge config and platform limits\n */\n private getMaxSteps(platformLimit: number): number {\n // Edge config takes precedence\n if (this.config.edge?.enabled && this.config.edge.maxSteps) {\n return Math.min(this.config.edge.maxSteps, platformLimit);\n }\n\n // Use agent config\n if (this.config.maxSteps) {\n return Math.min(this.config.maxSteps, platformLimit);\n }\n\n // Default\n return Math.min(20, platformLimit);\n }\n\n /**\n * Get memory instance (for advanced use cases)\n */\n getMemory(): Memory {\n return this.memory;\n }\n\n /**\n * Get memory stats\n */\n async getMemoryStats() {\n return await this.memory.getStats();\n }\n\n /**\n * Clear agent memory\n */\n async clearMemory(): Promise<void> {\n await this.memory.clear();\n }\n}\n", "/**\n * Agent factory\n */\n\nimport type { Agent, AgentConfig, AgentResponse, Message, ToolCall } from \"../types/agent.ts\";\nimport { AgentRuntime } from \"./runtime.ts\";\nimport { detectPlatform, validatePlatformCompatibility } from \"../runtime/platform.ts\";\nimport { registerTool } from \"../mcp/registry.ts\";\nimport { agentRegistry } from \"./composition.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Result object returned by agent.stream()\n * Provides toDataStreamResponse() for Vercel AI SDK compatible streaming\n */\nexport interface AgentStreamResult {\n /**\n * Convert the stream to a Response object for streaming responses\n * Compatible with Vercel AI SDK's toDataStreamResponse()\n */\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response;\n}\n\n/**\n * Create an AgentStreamResult from a ReadableStream\n * Returns Vercel AI SDK compatible streaming response\n */\nfunction createAgentStreamResult(stream: ReadableStream): AgentStreamResult {\n return {\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response {\n return new Response(stream, {\n status: options?.status ?? 200,\n statusText: options?.statusText,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n // Required header for Vercel AI SDK Data Stream Protocol v1\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n ...options?.headers,\n },\n });\n },\n };\n}\n\n/**\n * Create an agent\n *\n * @example\n * ```typescript\n * import { agent } from 'veryfront/ai';\n\n *\n * export default agent({\n * model: 'openai/gpt-4',\n * system: 'You are a helpful assistant',\n * tools: {\n * searchWeb: true,\n * },\n * });\n * ```\n */\nexport function agent(config: AgentConfig): Agent {\n const id = config.id || generateAgentId();\n\n // Register tools if config.tools is a Record (not `true` for all tools)\n if (config.tools && config.tools !== true) {\n for (const [name, entry] of Object.entries(config.tools)) {\n if (entry && typeof entry === \"object\") {\n const normalizedTool = entry.id === name ? entry : { ...entry, id: name };\n registerTool(normalizedTool.id, normalizedTool);\n config.tools[name] = normalizedTool;\n }\n }\n }\n\n const platform = detectPlatform();\n const compatibility = validatePlatformCompatibility({\n maxSteps: config.maxSteps,\n streaming: config.streaming,\n requiresFileSystem: false,\n requiresMCP: false,\n }, platform);\n\n if (!compatibility.compatible) {\n throw toError(createError({\n type: \"agent\",\n message: `Agent \"${id}\" is not compatible with current platform:\\n${\n compatibility.errors.join(\"\\n\")\n }`,\n }));\n }\n\n if (compatibility.warnings.length > 0) {\n agentLogger.warn(\n `Agent \"${id}\" warnings:\\n${compatibility.warnings.join(\"\\n\")}`,\n );\n }\n\n const runtime = new AgentRuntime(id, config);\n\n const agentInstance: Agent = {\n id,\n config,\n\n generate(input: {\n input: string | Message[];\n context?: Record<string, unknown>;\n }): Promise<AgentResponse> {\n return runtime.generate(input.input, input.context);\n },\n\n async stream(input: {\n input?: string;\n messages?: Message[];\n context?: Record<string, unknown>;\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n }): Promise<AgentStreamResult> {\n const inputMessages: Message[] = input.input\n ? [{\n id: `msg_${Date.now()}`,\n role: \"user\" as const,\n parts: [{ type: \"text\", text: input.input }],\n }]\n : input.messages || [];\n\n const stream = await runtime.stream(inputMessages, input.context, {\n onToolCall: input.onToolCall,\n onChunk: input.onChunk,\n });\n\n return createAgentStreamResult(stream);\n },\n\n async respond(request: Request): Promise<Response> {\n const body = await request.json();\n const messages = body.messages || [];\n const stream = await runtime.stream(messages, body.context);\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n // Required header for Vercel AI SDK Data Stream Protocol v1\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n },\n });\n },\n\n getMemory() {\n return runtime.getMemory();\n },\n\n getMemoryStats() {\n return runtime.getMemoryStats();\n },\n\n clearMemory() {\n return runtime.clearMemory();\n },\n };\n\n agentRegistry.register(id, agentInstance);\n\n return agentInstance;\n}\n\n/**\n * Generate a unique agent ID\n */\nlet agentIdCounter = 0;\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${agentIdCounter++}`;\n}\n", "/**\n * Veryfront AI Module\n *\n * This is the 16th module of Veryfront, providing AI-native capabilities:\n * - Agent runtime with tool execution\n * - MCP (Model Context Protocol) server integration\n * - Provider integrations (OpenAI, Anthropic, etc.)\n * - Multi-runtime support (Deno, Node.js, Bun, Cloudflare Workers)\n *\n * @module veryfront/ai\n * @example\n * ```typescript\n * // Create an agent\n * import { agent, tool } from 'veryfront/ai';\n * import { z } from 'zod';\n *\n * // Define a tool\n * export const searchTool = tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * return await searchWeb(query);\n * },\n * });\n *\n * // Define an agent\n * export const myAgent = agent({\n * model: 'openai/gpt-4',\n * system: 'You are a helpful assistant',\n * tools: {\n * searchWeb: searchTool,\n * },\n * });\n *\n * // Use the agent\n * const response = await myAgent.generate({\n * input: 'What is the weather today?',\n * });\n * ```\n */\n\n// ============================================================================\n// Public API - Factory Functions\n// ============================================================================\n\n/**\n * Create an agent\n */\nexport { agent } from \"./agent/factory.ts\";\n\n/**\n * Create a tool\n */\nexport { dynamicTool, tool } from \"./utils/tool.ts\";\n\nexport type { DynamicToolConfig } from \"./utils/tool.ts\";\n\n/**\n * Re-export zod for schema definitions\n * This allows users to import z from 'veryfront/ai' without needing separate zod import\n * which ensures compatibility across Deno, Node.js, and other runtimes\n */\nexport { z } from \"zod\";\n\n/**\n * Create an MCP resource\n */\nexport { resource } from \"./mcp/resource.ts\";\n\n/**\n * Create an MCP prompt template\n */\nexport { prompt } from \"./mcp/prompt.ts\";\n\n// ============================================================================\n// Public API - Provider Management\n// ============================================================================\n\nexport { getProvider, getProviderFromModel, initializeProviders } from \"./providers/factory.ts\";\n\n// ============================================================================\n// Public API - Platform Detection\n// ============================================================================\n\nexport {\n detectPlatform,\n getPlatformCapabilities,\n getPlatformWarnings,\n supportsCapability,\n validatePlatformCompatibility,\n} from \"./runtime/platform.ts\";\n\n// ============================================================================\n// Public API - Registries\n// ============================================================================\n\nexport {\n getMCPRegistry,\n getMCPStats,\n registerPrompt,\n registerResource,\n registerTool,\n} from \"./mcp/registry.ts\";\n\nexport { toolRegistry } from \"./utils/tool.ts\";\nexport { resourceRegistry } from \"./mcp/resource.ts\";\nexport { promptRegistry } from \"./mcp/prompt.ts\";\nexport { agentRegistry, getAgent, getAllAgentIds, registerAgent } from \"./agent/composition.ts\";\n\n// ============================================================================\n// Public API - Agent Composition\n// ============================================================================\n\nexport { agentAsTool, createWorkflow, getAgentsAsTools } from \"./agent/composition.ts\";\n\nexport type { WorkflowConfig, WorkflowResult, WorkflowStep } from \"./agent/composition.ts\";\n\n// ============================================================================\n// Public API - Memory\n// ============================================================================\n\nexport { BufferMemory, ConversationMemory, createMemory, SummaryMemory } from \"./agent/memory.ts\";\n\nexport type { Memory, MemoryPersistence, MemoryStats } from \"./agent/memory.ts\";\n\n// ============================================================================\n// Public API - Auto-Discovery & Setup\n// ============================================================================\n\nexport { discoverAll } from \"./utils/discovery.ts\";\nexport type { DiscoveryConfig, DiscoveryResult } from \"./utils/discovery.ts\";\n\nexport { setupAI, type SetupAIOptions, type SetupAIResult } from \"./utils/setup.ts\";\n\n// ============================================================================\n// Public API - MCP Server\n// ============================================================================\n\nexport { createMCPServer, MCPServer } from \"./mcp/server.ts\";\n\n// ============================================================================\n// Public API - AI SDK Integration (Recommended)\n// ============================================================================\n\n// Client-only exports (useChat, useCompletion, etc.) are now available at:\n// import { useChat, useCompletion } from \"veryfront/ai/client\";\n// This prevents server-side bundling issues\n\n// Re-export AI SDK core functions\n// - Text generation: generateText, streamText\n// - Structured data: generateObject, streamObject\n// - Message conversion: convertToModelMessages\n// - Embeddings: embed, embedMany\n// - Utilities: createIdGenerator, smoothStream, cosineSimilarity\n// - Tool helper: aiTool (renamed from 'tool' to avoid conflict with veryfront's tool)\n// - Experimental: experimental_generateImage, experimental_generateSpeech, experimental_transcribe\nexport {\n convertToModelMessages,\n cosineSimilarity,\n createIdGenerator,\n embed,\n embedMany,\n experimental_generateImage,\n experimental_generateSpeech,\n experimental_transcribe,\n generateObject,\n generateText,\n smoothStream,\n streamObject,\n streamText,\n tool as aiTool,\n} from \"ai\";\n\n// Re-export AI SDK providers (30+ providers available)\nexport { openai } from \"@ai-sdk/openai\";\nexport { anthropic } from \"@ai-sdk/anthropic\";\n\n// AI SDK adapter utilities\nexport {\n aiSDKModel,\n isAISDKModel,\n toAISDKTool,\n toAISDKTools,\n useAISDK,\n} from \"./adapters/ai-sdk.ts\";\n\n// ============================================================================\n// Public API - Custom Providers (Advanced - For Special Cases)\n// ============================================================================\n\n// For users who want to implement custom providers:\n// - Internal/proprietary APIs\n// - OpenAI-compatible endpoints (Ollama, vLLM)\n// - Custom authentication flows\n// - Educational purposes\n\nexport { BaseProvider } from \"./providers/base.ts\";\nexport { OpenAIProvider } from \"./providers/openai.ts\";\nexport { AnthropicProvider } from \"./providers/anthropic.ts\";\nexport { GoogleProvider } from \"./providers/google.ts\";\n\n// ============================================================================\n// Public API - Production Features\n// ============================================================================\n\nexport {\n cacheMiddleware,\n COMMON_BLOCKED_PATTERNS,\n costTrackingMiddleware,\n // Caching\n createCache,\n // Cost tracking\n createCostTracker,\n // Rate limiting\n createRateLimiter,\n InputValidator,\n OutputFilter,\n rateLimitMiddleware,\n // Security\n securityMiddleware,\n} from \"./production/index.ts\";\n\nexport type {\n CacheConfig,\n CacheEntry,\n CostConfig,\n RateLimitConfig,\n RateLimitResult,\n SecurityConfig,\n SecurityViolation,\n UsageRecord,\n UsageSummary,\n} from \"./production/index.ts\";\n\n// ============================================================================\n// Public API - Durable Workflows\n// ============================================================================\n\n// Re-export workflow module\n// Full workflow API available at: import { ... } from \"veryfront/ai/workflow\";\nexport {\n branch,\n createWorkflowClient,\n // Backend\n MemoryBackend,\n parallel,\n step,\n waitForApproval,\n // DSL builders\n workflow,\n // Client\n WorkflowClient,\n} from \"./workflow/index.ts\";\n\nexport type {\n Checkpoint,\n PendingApproval,\n // Backend\n WorkflowBackend,\n // Client\n WorkflowClientConfig,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowHandle,\n WorkflowNode,\n WorkflowRun,\n // Core types\n WorkflowStatus,\n} from \"./workflow/index.ts\";\n\n// ============================================================================\n// Public API - Types\n// ============================================================================\n\nexport type {\n // Agent types\n Agent,\n AgentConfig,\n AgentContext,\n AgentMiddleware,\n AgentResponse,\n AgentStatus,\n AnthropicConfig,\n CompletionRequest,\n CompletionResponse,\n EdgeConfig,\n GoogleConfig,\n MCPRegistry,\n MCPServerConfig,\n MemoryConfig,\n Message,\n ModelProvider,\n ModelString,\n OpenAIConfig,\n // Platform types\n Platform,\n PlatformCapabilities,\n Prompt,\n PromptConfig,\n // Provider types\n Provider,\n ProviderConfig,\n ProvidersConfig,\n // MCP types\n Resource,\n ResourceConfig,\n // Tool types\n Tool,\n ToolCall,\n ToolConfig,\n ToolExecutionContext,\n ToolType,\n} from \"./types/index.ts\";\n", "import type { Tool } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"../utils/zod-json-schema.ts\";\n\nconst MODEL_BRAND = \"ai-sdk-model\";\n\nexport interface AISDKModelWrapper<Model = unknown> {\n __type: typeof MODEL_BRAND;\n model: Model;\n}\n\nexport function aiSDKModel<Model = unknown>(model: Model): AISDKModelWrapper<Model> {\n return { __type: MODEL_BRAND, model };\n}\n\nexport function isAISDKModel(value: unknown): value is AISDKModelWrapper {\n return Boolean(\n value && typeof value === \"object\" && (value as AISDKModelWrapper).__type === MODEL_BRAND,\n );\n}\n\nexport const useAISDK = aiSDKModel;\n\n/**\n * Get JSON Schema from a tool, preferring pre-converted schema if available\n */\nfunction getToolSchema(tool: Tool): JsonSchema {\n // Use pre-converted JSON Schema if available (set during tool() creation)\n // This is the preferred path - no zod schema needed at runtime\n if (tool.inputSchemaJson) {\n return tool.inputSchemaJson;\n }\n\n // Runtime conversion - may fail if zod schema is not properly initialized\n // This can happen when the user's zod instance differs from the bundled one\n try {\n if (tool.inputSchema && typeof tool.inputSchema === \"object\") {\n // Check for zod schema markers\n const schema = tool.inputSchema as { _def?: { typeName?: string } };\n if (schema._def && schema._def.typeName) {\n return zodToJsonSchema(tool.inputSchema);\n }\n }\n } catch {\n // Schema conversion failed - fall through to fallback\n }\n\n // Fallback: empty object schema\n return { type: \"object\", properties: {} };\n}\n\nexport function toAISDKTool(tool: Tool) {\n return {\n type: \"function\" as const,\n function: {\n name: tool.id,\n description: tool.description,\n parameters: getToolSchema(tool),\n },\n };\n}\n\nexport function toAISDKTools(tools: Record<string, Tool>) {\n const aiTools: Record<\n string,\n { description: string; parameters: JsonSchema; execute: Tool[\"execute\"] }\n > = {};\n\n for (const [name, tool] of Object.entries(tools)) {\n aiTools[name] = {\n description: tool.description,\n parameters: getToolSchema(tool),\n execute: tool.execute,\n };\n }\n\n return aiTools;\n}\n\nexport const AI_SDK_ADAPTER_VERSION = \"1.0.0\";\nexport const AI_SDK_SUPPORTED_VERSION = \"3.x\";\n", "import type { Tool } from \"../types/tool.ts\";\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { discoverAll, type DiscoveryConfig } from \"./discovery.ts\";\nimport { toolRegistry } from \"./tool.ts\";\nimport { registerAgent } from \"../agent/composition.ts\";\nimport { registerResource } from \"../mcp/registry.ts\";\nimport { registerPrompt } from \"../mcp/registry.ts\";\nimport { toAISDKTools } from \"../adapters/ai-sdk.ts\";\nimport { cwd } from \"../../platform/compat/process.ts\";\nimport { createFileSystem } from \"../../platform/compat/fs.ts\";\nimport { cliLogger as logger } from \"@veryfront/utils\";\n\nconst fs = createFileSystem();\n\nexport interface SetupAIOptions {\n /**\n * Base directory for AI discovery.\n * @default process.cwd() or Deno.cwd()\n */\n baseDir?: string;\n\n /**\n * Path to AI manifest file (for pre-built discovery).\n * If provided, skips filesystem scanning.\n */\n manifestPath?: string;\n\n /**\n * AI directory name (relative to baseDir).\n * @default \"ai\"\n */\n aiDir?: string;\n\n /**\n * Manually register tools instead of discovery.\n */\n tools?: Record<string, Tool>;\n\n /**\n * Manually register agents instead of discovery.\n */\n agents?: Record<string, Agent>;\n\n /**\n * Manually register resources instead of discovery.\n */\n resources?: Record<string, Resource>;\n\n /**\n * Manually register prompts instead of discovery.\n */\n prompts?: Record<string, Prompt>;\n\n /**\n * Enable verbose logging during setup.\n * @default false\n */\n verbose?: boolean;\n\n /**\n * Skip filesystem discovery entirely (use only manual registrations).\n * @default false\n */\n skipDiscovery?: boolean;\n}\n\nexport interface SetupAIResult {\n /**\n * All registered tools\n */\n tools: Map<string, Tool>;\n\n /**\n * All registered agents\n */\n agents: Map<string, Agent>;\n\n /**\n * All registered resources\n */\n resources: Map<string, Resource>;\n\n /**\n * All registered prompts\n */\n prompts: Map<string, Prompt>;\n\n /**\n * Get a specific tool by ID\n */\n getTool(id: string): Tool | undefined;\n\n /**\n * Get a specific agent by ID\n */\n getAgent(id: string): Agent | undefined;\n\n /**\n * Get all tools as an array\n */\n getTools(): Tool[];\n\n /**\n * Get all agents as an array\n */\n getAgents(): Agent[];\n\n /**\n * Convert all tools to AI SDK format\n * Use with generateText(), streamText(), etc.\n */\n toAISDKTools(): ReturnType<typeof toAISDKTools>;\n\n /**\n * Any errors encountered during discovery\n */\n errors: Array<{ file: string; error: Error }>;\n}\n\n/**\n * Set up AI with zero configuration.\n *\n * This function:\n * 1. Detects the runtime (Deno, Node.js, Bun)\n * 2. Discovers AI components from the filesystem or manifest\n * 3. Registers all discovered tools, agents, resources, and prompts\n * 4. Returns an easy-to-use API for accessing them\n *\n * @example\n * ```typescript\n * // Simplest usage - zero config\n * const ai = await setupAI();\n *\n * // With custom options\n * const ai = await setupAI({\n * baseDir: \"./my-project\",\n * aiDir: \"src/ai\",\n * verbose: true,\n * });\n *\n * // With manual tool registration (no filesystem discovery)\n * const ai = await setupAI({\n * skipDiscovery: true,\n * tools: {\n * searchWeb: mySearchTool,\n * sendEmail: myEmailTool,\n * },\n * });\n * ```\n */\nexport async function setupAI(options: SetupAIOptions = {}): Promise<SetupAIResult> {\n const {\n baseDir = cwd(),\n aiDir = \"ai\",\n tools: manualTools = {},\n agents: manualAgents = {},\n resources: manualResources = {},\n prompts: manualPrompts = {},\n verbose = false,\n skipDiscovery = false,\n manifestPath,\n } = options;\n\n // Result containers\n const tools = new Map<string, Tool>();\n const agents = new Map<string, Agent>();\n const resources = new Map<string, Resource>();\n const prompts = new Map<string, Prompt>();\n const errors: Array<{ file: string; error: Error }> = [];\n\n // Step 1: Load from manifest if provided\n if (manifestPath) {\n try {\n const manifest = await fs.readTextFile(manifestPath).then(JSON.parse);\n if (manifest.tools) {\n for (const [id, tool] of Object.entries(manifest.tools)) {\n tools.set(id, tool as Tool);\n toolRegistry.register(id, tool as Tool);\n }\n }\n if (manifest.agents) {\n for (const [id, agent] of Object.entries(manifest.agents)) {\n agents.set(id, agent as Agent);\n registerAgent(id, agent as Agent);\n }\n }\n if (manifest.resources) {\n for (const [id, resource] of Object.entries(manifest.resources)) {\n resources.set(id, resource as Resource);\n registerResource(id, resource as Resource);\n }\n }\n if (manifest.prompts) {\n for (const [id, prompt] of Object.entries(manifest.prompts)) {\n prompts.set(id, prompt as Prompt);\n registerPrompt(id, prompt as Prompt);\n }\n }\n if (verbose) {\n logger.info(`[setupAI] Loaded manifest: ${tools.size} tools, ${agents.size} agents`);\n }\n } catch (error) {\n errors.push({\n file: manifestPath,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n // Step 2: Discover from filesystem (unless skipped)\n if (!skipDiscovery && !manifestPath) {\n const discoveryConfig: DiscoveryConfig = {\n baseDir,\n aiDir,\n verbose,\n };\n\n try {\n const discovered = await discoverAll(discoveryConfig);\n\n // Merge discovered items\n for (const [id, tool] of discovered.tools) {\n tools.set(id, tool);\n }\n for (const [id, agent] of discovered.agents) {\n agents.set(id, agent);\n }\n for (const [id, resource] of discovered.resources) {\n resources.set(id, resource);\n }\n for (const [id, prompt] of discovered.prompts) {\n prompts.set(id, prompt);\n }\n errors.push(...discovered.errors);\n\n if (verbose) {\n logger.info(`[setupAI] Discovered: ${tools.size} tools, ${agents.size} agents`);\n }\n } catch (error) {\n // Discovery failed - might be expected if no ai/ directory\n if (verbose) {\n logger.info(`[setupAI] Discovery skipped: ${error}`);\n }\n }\n }\n\n // Step 3: Register manual items (override discovered ones)\n for (const [id, tool] of Object.entries(manualTools)) {\n tools.set(id, tool);\n toolRegistry.register(id, tool);\n }\n for (const [id, agent] of Object.entries(manualAgents)) {\n agents.set(id, agent);\n registerAgent(id, agent);\n }\n for (const [id, resource] of Object.entries(manualResources)) {\n resources.set(id, resource);\n registerResource(id, resource);\n }\n for (const [id, prompt] of Object.entries(manualPrompts)) {\n prompts.set(id, prompt);\n registerPrompt(id, prompt);\n }\n\n // Create the result object with helper methods\n const result: SetupAIResult = {\n tools,\n agents,\n resources,\n prompts,\n errors,\n\n getTool(id: string) {\n return tools.get(id);\n },\n\n getAgent(id: string) {\n return agents.get(id);\n },\n\n getTools() {\n return Array.from(tools.values());\n },\n\n getAgents() {\n return Array.from(agents.values());\n },\n\n toAISDKTools() {\n // Convert Map to Record for toAISDKTools\n const toolsRecord: Record<string, Tool> = {};\n for (const [id, tool] of tools) {\n toolsRecord[id] = tool;\n }\n return toAISDKTools(toolsRecord);\n },\n };\n\n return result;\n}\n", "/**\n * MCP Server Implementation\n *\n * Implements the Model Context Protocol (MCP) specification\n * Exposes tools, resources, and prompts via JSON-RPC 2.0\n */\n\nimport { getMCPRegistry } from \"./registry.ts\";\nimport { executeTool, zodToJsonSchema } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\nimport type { MCPServerConfig } from \"../types/mcp.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * JSON-RPC 2.0 Params type\n */\ntype JSONRPCParams = Record<string, unknown> | unknown[];\n\n/**\n * JSON-RPC 2.0 Request\n */\ninterface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: JSONRPCParams;\n}\n\n/**\n * JSON-RPC 2.0 Response\n */\ninterface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * MCP Server\n */\nexport class MCPServer {\n private config: MCPServerConfig;\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n }\n\n /**\n * Handle JSON-RPC request\n */\n async handleRequest(request: JSONRPCRequest): Promise<JSONRPCResponse> {\n try {\n const result = await this.dispatch(request.method, request.params);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n /**\n * Dispatch request to appropriate handler\n */\n private dispatch(method: string, params: JSONRPCParams | undefined): Promise<unknown> {\n switch (method) {\n // Tool methods\n case \"tools/list\":\n return this.listTools();\n\n case \"tools/call\":\n return this.callTool(params);\n\n // Resource methods\n case \"resources/list\":\n return this.listResources();\n\n case \"resources/read\":\n return this.readResource(params);\n\n // Prompt methods\n case \"prompts/list\":\n return this.listPrompts();\n\n case \"prompts/get\":\n return this.getPrompt(params);\n\n // Server info\n case \"initialize\":\n return this.initialize(params);\n\n default:\n throw toError(createError({\n type: \"agent\",\n message: `Unknown method: ${method}`,\n }));\n }\n }\n\n /**\n * Initialize connection\n */\n private initialize(_params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n return Promise.resolve({\n protocolVersion: \"2024-11-05\",\n serverInfo: {\n name: \"veryfront-mcp\",\n version: \"0.1.0\",\n },\n capabilities: {\n tools: {},\n resources: { subscribe: true },\n prompts: {},\n },\n });\n }\n\n /**\n * List all available tools\n */\n private listTools(): Promise<{ tools: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const tools: Array<Record<string, unknown>> = [];\n\n for (const [id, tool] of registry.tools.entries()) {\n // Only expose tools with MCP enabled\n if (tool.mcp?.enabled !== false) {\n // Use pre-converted schema or convert at runtime\n const inputSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n tools.push({\n name: id,\n description: tool.description,\n inputSchema,\n });\n }\n }\n\n return Promise.resolve({ tools });\n }\n\n /**\n * Call a tool\n */\n private async callTool(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { name, arguments: args } = paramsObj || {};\n\n if (!name) {\n throw toError(createError({\n type: \"agent\",\n message: \"Tool name is required\",\n }));\n }\n\n const result = await executeTool(name as string, args);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n\n /**\n * List all available resources\n */\n private listResources(): Promise<{ resources: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const resources: Array<Record<string, unknown>> = [];\n\n for (const [id, resource] of registry.resources.entries()) {\n resources.push({\n uri: resource.pattern,\n name: id,\n description: resource.description,\n mimeType: \"application/json\",\n });\n }\n\n return Promise.resolve({ resources });\n }\n\n /**\n * Read a resource\n */\n private async readResource(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { uri } = paramsObj || {};\n\n if (!uri) {\n throw toError(createError({\n type: \"agent\",\n message: \"Resource URI is required\",\n }));\n }\n\n const resource = resourceRegistry.findByPattern(uri as string);\n\n if (!resource) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource not found: ${uri}`,\n }));\n }\n\n // Extract params from URI\n const resourceParams = resourceRegistry.extractParams(uri as string, resource.pattern);\n\n // Load resource data\n const data = await resource.load(resourceParams);\n\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n /**\n * List all available prompts\n */\n private listPrompts(): Promise<{ prompts: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const prompts: Array<Record<string, unknown>> = [];\n\n for (const [id, promptInstance] of registry.prompts.entries()) {\n prompts.push({\n name: id,\n description: promptInstance.description,\n });\n }\n\n return Promise.resolve({ prompts });\n }\n\n /**\n * Get a prompt\n */\n private async getPrompt(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { name, arguments: args } = paramsObj || {};\n\n if (!name) {\n throw toError(createError({\n type: \"agent\",\n message: \"Prompt name is required\",\n }));\n }\n\n const content = await promptRegistry.getContent(\n name as string,\n args as Record<string, unknown> | undefined,\n );\n\n return {\n description: `Prompt: ${name}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: content,\n },\n },\n ],\n };\n }\n\n /**\n * Create HTTP handler for MCP server\n */\n createHTTPHandler(): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n // Handle CORS\n if (request.method === \"OPTIONS\") {\n return this.handleCORS();\n }\n\n // Validate auth\n if (this.config.auth && this.config.auth.type !== \"none\") {\n const authorized = await this.validateAuth(request);\n if (!authorized) {\n return new Response(\"Unauthorized\", { status: 401 });\n }\n }\n\n // Parse JSON-RPC request\n try {\n const rpcRequest: JSONRPCRequest = await request.json();\n const rpcResponse = await this.handleRequest(rpcRequest);\n\n return new Response(JSON.stringify(rpcResponse), {\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.getCORSHeaders(),\n },\n });\n } catch {\n return new Response(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32700,\n message: \"Parse error\",\n },\n }),\n {\n status: 400,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n }\n };\n }\n\n /**\n * Validate authentication\n */\n private async validateAuth(request: Request): Promise<boolean> {\n if (!this.config.auth || this.config.auth.type === \"none\") {\n return true;\n }\n\n const authHeader = request.headers.get(\"Authorization\");\n\n if (!authHeader) {\n return false;\n }\n\n if (this.config.auth.type === \"bearer\") {\n const token = authHeader.replace(\"Bearer \", \"\");\n\n if (this.config.auth.validate) {\n return await this.config.auth.validate(token);\n }\n\n return false;\n }\n\n return false;\n }\n\n /**\n * Handle CORS preflight\n */\n private handleCORS(): Response {\n return new Response(null, {\n status: 204,\n headers: this.getCORSHeaders(),\n });\n }\n\n /**\n * Get CORS headers\n */\n private getCORSHeaders(): Record<string, string> {\n if (!this.config.cors?.enabled) {\n return {};\n }\n\n const origins = this.config.cors.origins || [\"*\"];\n\n return {\n \"Access-Control-Allow-Origin\": origins[0] || \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n };\n }\n}\n\n/**\n * Create an MCP server instance\n */\nexport function createMCPServer(config: MCPServerConfig): MCPServer {\n return new MCPServer(config);\n}\n", "import { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Rate Limiting System\n *\n * Prevents abuse and ensures fair usage of AI resources.\n * Supports multiple strategies: fixed window, sliding window, token bucket.\n */\n\nexport interface RateLimitConfig {\n /** Strategy type */\n strategy: \"fixed-window\" | \"sliding-window\" | \"token-bucket\";\n\n /** Maximum requests */\n maxRequests: number;\n\n /** Time window in milliseconds */\n windowMs: number;\n\n /** Identifier function (e.g., user ID, IP address) */\n identify?: (context: Record<string, unknown>) => string;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface RateLimitResult {\n /** Allowed or not */\n allowed: boolean;\n\n /** Requests remaining */\n remaining: number;\n\n /** Reset time (timestamp) */\n resetAt: number;\n\n /** Retry after (seconds) */\n retryAfter?: number;\n}\n\n/**\n * Fixed Window Rate Limiter\n */\nclass FixedWindowLimiter {\n private requests = new Map<string, { count: number; resetAt: number }>();\n private config: RateLimitConfig;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n const entry = this.requests.get(identifier);\n\n // No previous requests or window expired\n if (!entry || now >= entry.resetAt) {\n const resetAt = now + this.config.windowMs;\n\n this.requests.set(identifier, {\n count: 1,\n resetAt,\n });\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - 1,\n resetAt,\n };\n }\n\n // Within window\n if (entry.count < this.config.maxRequests) {\n entry.count++;\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - entry.count,\n resetAt: entry.resetAt,\n };\n }\n\n // Limit exceeded\n return {\n allowed: false,\n remaining: 0,\n resetAt: entry.resetAt,\n retryAfter: Math.ceil((entry.resetAt - now) / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.requests.delete(identifier);\n }\n\n clear(): void {\n this.requests.clear();\n }\n}\n\n/**\n * Token Bucket Rate Limiter (more flexible)\n */\nclass TokenBucketLimiter {\n private buckets = new Map<\n string,\n { tokens: number; lastRefill: number }\n >();\n private config: RateLimitConfig;\n private refillRate: number;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n // Refill rate: tokens per millisecond\n this.refillRate = config.maxRequests / config.windowMs;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n\n // Initialize bucket if not exists\n if (!bucket) {\n bucket = {\n tokens: this.config.maxRequests - 1,\n lastRefill: now,\n };\n this.buckets.set(identifier, bucket);\n\n return {\n allowed: true,\n remaining: bucket.tokens,\n resetAt: now + this.config.windowMs,\n };\n }\n\n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * this.refillRate;\n\n bucket.tokens = Math.min(\n this.config.maxRequests,\n bucket.tokens + tokensToAdd,\n );\n bucket.lastRefill = now;\n\n // Check if we have tokens\n if (bucket.tokens >= 1) {\n bucket.tokens--;\n\n return {\n allowed: true,\n remaining: Math.floor(bucket.tokens),\n resetAt: now + this.config.windowMs,\n };\n }\n\n // No tokens available\n const timeUntilToken = (1 - bucket.tokens) / this.refillRate;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt: now + this.config.windowMs,\n retryAfter: Math.ceil(timeUntilToken / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.buckets.delete(identifier);\n }\n\n clear(): void {\n this.buckets.clear();\n }\n}\n\n/**\n * Create a rate limiter\n */\nexport function createRateLimiter(config: RateLimitConfig) {\n let limiter: FixedWindowLimiter | TokenBucketLimiter;\n\n switch (config.strategy) {\n case \"fixed-window\":\n limiter = new FixedWindowLimiter(config);\n break;\n case \"token-bucket\":\n limiter = new TokenBucketLimiter(config);\n break;\n case \"sliding-window\":\n // Use token bucket as approximation for sliding window\n limiter = new TokenBucketLimiter(config);\n break;\n default:\n limiter = new FixedWindowLimiter(config);\n }\n\n return {\n /**\n * Check if request is allowed\n */\n check(context?: Record<string, unknown>): RateLimitResult {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n return limiter.check(identifier);\n },\n\n /**\n * Reset rate limit for identifier\n */\n reset(context?: Record<string, unknown>): void {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n limiter.reset(identifier);\n },\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n limiter.clear();\n },\n };\n}\n\n/**\n * Create rate limit middleware for agents\n */\nexport function rateLimitMiddleware(config: RateLimitConfig) {\n const limiter = createRateLimiter(config);\n\n return <T>(context: Record<string, unknown>, next: () => Promise<T>): Promise<T> => {\n const result = limiter.check(context);\n\n if (!result.allowed) {\n throw toError(createError({\n type: \"agent\",\n message: config.errorMessage ||\n `Rate limit exceeded. Try again in ${result.retryAfter} seconds.`,\n }));\n }\n\n return next();\n };\n}\n", "/**\n * Response Caching System\n *\n * Cache agent responses to reduce API calls and improve performance.\n */\n\nimport type { AgentResponse } from \"../../types/agent.ts\";\n\nexport interface CacheConfig {\n /** Cache strategy */\n strategy: \"memory\" | \"lru\" | \"ttl\";\n\n /** Maximum cache size (for LRU) */\n maxSize?: number;\n\n /** Time to live in milliseconds (for TTL) */\n ttl?: number;\n\n /** Generate cache key */\n keyGenerator?: (input: string, context?: Record<string, unknown>) => string;\n}\n\nexport interface CacheEntry {\n /** Cached response */\n response: AgentResponse;\n\n /** Timestamp when cached */\n cachedAt: number;\n\n /** Expiration timestamp (for TTL) */\n expiresAt?: number;\n\n /** Access count */\n accessCount: number;\n\n /** Last accessed timestamp */\n lastAccessedAt: number;\n}\n\n/**\n * Memory Cache (simple in-memory storage)\n */\nclass MemoryCache {\n private cache = new Map<string, CacheEntry>();\n\n set(key: string, response: AgentResponse): void {\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * LRU Cache (Least Recently Used eviction)\n */\nclass LRUCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n set(key: string, response: AgentResponse): void {\n // If key exists, delete it first (will re-add to end)\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // If at max size, remove least recently used (first entry)\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Move to end (mark as recently used)\n this.cache.delete(key);\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n this.cache.set(key, entry);\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * TTL Cache (Time To Live eviction)\n */\nclass TTLCache {\n private cache = new Map<string, CacheEntry>();\n private ttl: number;\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(ttl: number = 300000) {\n this.ttl = ttl;\n this.startCleanup();\n }\n\n set(key: string, response: AgentResponse): void {\n const now = Date.now();\n\n this.cache.set(key, {\n response,\n cachedAt: now,\n expiresAt: now + this.ttl,\n accessCount: 0,\n lastAccessedAt: now,\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.cache.clear();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }, 60000);\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(config: CacheConfig) {\n let cache: MemoryCache | LRUCache | TTLCache;\n\n switch (config.strategy) {\n case \"memory\":\n cache = new MemoryCache();\n break;\n case \"lru\":\n cache = new LRUCache(config.maxSize || 100);\n break;\n case \"ttl\":\n cache = new TTLCache(config.ttl || 300000);\n break;\n default:\n cache = new MemoryCache();\n }\n\n const keyGenerator = config.keyGenerator || ((input: string) => `cache_${hashString(input)}`);\n\n return {\n /**\n * Get cached response\n */\n get(input: string, context?: Record<string, unknown>): AgentResponse | null {\n const key = keyGenerator(input, context);\n return cache.get(key);\n },\n\n /**\n * Set cached response\n */\n set(input: string, response: AgentResponse, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.set(key, response);\n },\n\n /**\n * Check if cached\n */\n has(input: string, context?: Record<string, unknown>): boolean {\n const key = keyGenerator(input, context);\n return cache.has(key);\n },\n\n /**\n * Delete cached entry\n */\n delete(input: string, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.delete(key);\n },\n\n /**\n * Clear all cache\n */\n clear(): void {\n cache.clear();\n },\n\n /**\n * Get cache size\n */\n size(): number {\n return cache.size();\n },\n };\n}\n\n/**\n * Simple string hash function\n */\nfunction hashString(str: string): string {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Cache middleware for agents\n */\nexport function cacheMiddleware(config: CacheConfig) {\n const cache = createCache(config);\n\n return async (\n context: Record<string, unknown>,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n // Check cache\n const cached = cache.get(inputString, context);\n\n if (cached) {\n return {\n ...cached,\n metadata: {\n ...cached.metadata,\n fromCache: true,\n cachedAt: Date.now(),\n },\n };\n }\n\n // Execute and cache\n const result = await next();\n cache.set(inputString, result, context);\n\n return result;\n };\n}\n", "/**\n * Cost Tracking System\n *\n * Track API usage and costs for monitoring and billing.\n */\n\nimport type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface CostConfig {\n /** Provider pricing (per 1M tokens) */\n pricing: {\n [provider: string]: {\n input: number; // Cost per 1M input tokens\n output: number; // Cost per 1M output tokens\n };\n };\n\n /** Budget limits */\n limits?: {\n daily?: number;\n monthly?: number;\n };\n\n /** Callback when limit exceeded */\n onLimitExceeded?: (usage: UsageSummary) => void;\n}\n\nexport interface UsageRecord {\n /** Timestamp */\n timestamp: number;\n\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model: string;\n\n /** Provider */\n provider: string;\n\n /** Token usage */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Estimated cost */\n cost: number;\n\n /** User/session identifier */\n userId?: string;\n}\n\nexport interface UsageSummary {\n /** Total requests */\n requests: number;\n\n /** Total tokens */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Total cost */\n cost: number;\n\n /** Cost by provider */\n byProvider: Record<\n string,\n {\n requests: number;\n tokens: number;\n cost: number;\n }\n >;\n\n /** Period */\n period: {\n start: number;\n end: number;\n };\n}\n\n/**\n * Cost Tracker\n */\nclass CostTracker {\n private records: UsageRecord[] = [];\n private config: CostConfig;\n private dailyTotal = 0;\n private monthlyTotal = 0;\n private lastDayReset = Date.now();\n private lastMonthReset = Date.now();\n private resetInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: CostConfig) {\n this.config = config;\n this.startPeriodicReset();\n }\n\n /**\n * Track an agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n if (!response.usage) {\n agentLogger.warn(\"No usage data in response, cannot track costs\");\n return this.createEmptyRecord(agentId, model);\n }\n\n // Parse provider from model string\n const provider = model.split(\"/\")[0] || \"unknown\";\n\n // Calculate cost\n const cost = this.calculateCost(\n provider,\n response.usage.promptTokens,\n response.usage.completionTokens,\n );\n\n // Create record\n const record: UsageRecord = {\n timestamp: Date.now(),\n agentId,\n model,\n provider,\n tokens: {\n prompt: response.usage.promptTokens,\n completion: response.usage.completionTokens,\n total: response.usage.totalTokens,\n },\n cost,\n userId,\n };\n\n // Add to records\n this.records.push(record);\n\n // Update totals\n this.dailyTotal += cost;\n this.monthlyTotal += cost;\n\n // Check limits\n this.checkLimits();\n\n return record;\n }\n\n /**\n * Calculate cost based on token usage\n */\n private calculateCost(\n provider: string,\n inputTokens: number,\n outputTokens: number,\n ): number {\n const pricing = this.config.pricing[provider];\n\n if (!pricing) {\n agentLogger.warn(`No pricing configured for provider: ${provider}`);\n return 0;\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n }\n\n /**\n * Get usage summary for a period\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n const relevantRecords = this.records.filter(\n (r) => r.timestamp >= start && r.timestamp <= end,\n );\n\n const summary: UsageSummary = {\n requests: relevantRecords.length,\n tokens: {\n prompt: 0,\n completion: 0,\n total: 0,\n },\n cost: 0,\n byProvider: {},\n period: { start, end },\n };\n\n for (const record of relevantRecords) {\n summary.tokens.prompt += record.tokens.prompt;\n summary.tokens.completion += record.tokens.completion;\n summary.tokens.total += record.tokens.total;\n summary.cost += record.cost;\n\n if (!summary.byProvider[record.provider]) {\n summary.byProvider[record.provider] = {\n requests: 0,\n tokens: 0,\n cost: 0,\n };\n }\n\n const providerStats = summary.byProvider[record.provider]!;\n providerStats.requests++;\n providerStats.tokens += record.tokens.total;\n providerStats.cost += record.cost;\n }\n\n return summary;\n }\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n const now = Date.now();\n const dayStart = now - 24 * 60 * 60 * 1000;\n return this.getSummary(dayStart, now);\n }\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n const now = Date.now();\n const monthStart = now - 30 * 24 * 60 * 60 * 1000;\n return this.getSummary(monthStart, now);\n }\n\n /**\n * Check if limits are exceeded\n */\n private checkLimits(): void {\n if (this.config.limits?.daily && this.dailyTotal > this.config.limits.daily) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getDailySummary());\n }\n }\n\n if (\n this.config.limits?.monthly &&\n this.monthlyTotal > this.config.limits.monthly\n ) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getMonthlySummary());\n }\n }\n }\n\n private startPeriodicReset(): void {\n this.resetInterval = setInterval(() => {\n const now = Date.now();\n\n if (now - this.lastDayReset >= 24 * 60 * 60 * 1000) {\n this.dailyTotal = 0;\n this.lastDayReset = now;\n }\n\n if (now - this.lastMonthReset >= 30 * 24 * 60 * 60 * 1000) {\n this.monthlyTotal = 0;\n this.lastMonthReset = now;\n }\n }, 60000);\n }\n\n destroy(): void {\n if (this.resetInterval) {\n clearInterval(this.resetInterval);\n this.resetInterval = null;\n }\n this.records = [];\n }\n\n /**\n * Create empty record\n */\n private createEmptyRecord(agentId: string, model: string): UsageRecord {\n return {\n timestamp: Date.now(),\n agentId,\n model,\n provider: model.split(\"/\")[0] || \"unknown\",\n tokens: { prompt: 0, completion: 0, total: 0 },\n cost: 0,\n };\n }\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return [...this.records];\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records = [];\n this.dailyTotal = 0;\n this.monthlyTotal = 0;\n }\n}\n\n/**\n * Create a cost tracker\n */\nexport function createCostTracker(config: CostConfig) {\n const tracker = new CostTracker(config);\n\n return {\n /**\n * Track agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n return tracker.track(agentId, model, response, userId);\n },\n\n /**\n * Get usage summary\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n return tracker.getSummary(startTime, endTime);\n },\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n return tracker.getDailySummary();\n },\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n return tracker.getMonthlySummary();\n },\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return tracker.getAllRecords();\n },\n\n /**\n * Clear all data\n */\n clear(): void {\n tracker.clear();\n },\n };\n}\n\n/**\n * Cost tracking middleware for agents\n */\nexport function costTrackingMiddleware(config: CostConfig) {\n const tracker = createCostTracker(config);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const result = await next();\n\n // Track cost\n tracker.track(\n context.agentId,\n context.model || \"unknown\",\n result,\n (context.data as Record<string, unknown>)?.userId as string | undefined,\n );\n\n return result;\n };\n}\n", "import type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Input Validation and Output Filtering\n *\n * Security features to prevent prompt injection, data leakage, and harmful content.\n */\n\nexport interface SecurityConfig {\n /** Input validation rules */\n input?: {\n /** Maximum input length */\n maxLength?: number;\n\n /** Blocked patterns (regex) */\n blockedPatterns?: RegExp[];\n\n /** Sanitize input */\n sanitize?: boolean;\n\n /** Custom validator */\n validate?: (input: string) => boolean | Promise<boolean>;\n };\n\n /** Output filtering rules */\n output?: {\n /** Blocked patterns in output */\n blockedPatterns?: RegExp[];\n\n /** Filter PII (Personal Identifiable Information) */\n filterPII?: boolean;\n\n /** Custom filter */\n filter?: (output: string) => string | Promise<string>;\n };\n\n /** Action when violation detected */\n onViolation?: (violation: SecurityViolation) => void;\n}\n\nexport interface SecurityViolation {\n /** Violation type */\n type: \"input\" | \"output\";\n\n /** Violation reason */\n reason: string;\n\n /** Original content */\n content: string;\n\n /** Matched pattern (if any) */\n pattern?: RegExp;\n}\n\n/**\n * Common blocked patterns\n */\nexport const COMMON_BLOCKED_PATTERNS = {\n /** Prompt injection attempts */\n promptInjection: [\n /ignore\\s+previous\\s+instructions/i,\n /ignore\\s+all\\s+previous\\s+prompts/i,\n /you\\s+are\\s+now\\s+a/i,\n /pretend\\s+you\\s+are/i,\n /system:\\s*/i,\n /<\\|im_start\\|>/i,\n /<\\|im_end\\|>/i,\n ],\n\n /** Potential data exfiltration */\n dataExfiltration: [\n /password/i,\n /api[_\\s-]?key/i,\n /secret/i,\n /token/i,\n /credit\\s+card/i,\n ],\n\n /** SQL injection patterns */\n sqlInjection: [\n /(\\bUNION\\b|\\bSELECT\\b).*\\bFROM\\b/i,\n /;\\s*(DROP|DELETE|UPDATE|INSERT)/i,\n ],\n\n /** XSS patterns */\n xss: [\n /<script[^>]*>.*?<\\/script>/gi,\n /javascript:/i,\n /on\\w+\\s*=/i, // Event handlers\n ],\n};\n\n/**\n * PII patterns (email, phone, SSN, etc.)\n */\nconst PII_PATTERNS = {\n email: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n phone: /\\b(\\+\\d{1,3}[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g,\n ssn: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n creditCard: /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g,\n};\n\n/**\n * Input Validator\n */\nexport class InputValidator {\n private config: SecurityConfig[\"input\"];\n\n constructor(config?: SecurityConfig[\"input\"]) {\n this.config = config || {};\n }\n\n /**\n * Validate input\n */\n async validate(input: string): Promise<{\n valid: boolean;\n sanitized?: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n\n // Check length\n if (this.config?.maxLength && input.length > this.config.maxLength) {\n violations.push({\n type: \"input\",\n reason: `Input exceeds maximum length of ${this.config.maxLength}`,\n content: input.substring(0, 100) + \"...\",\n });\n }\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(input)) {\n violations.push({\n type: \"input\",\n reason: \"Input matches blocked pattern\",\n content: input,\n pattern,\n });\n }\n }\n }\n\n // Custom validation\n if (this.config?.validate) {\n const customValid = await this.config.validate(input);\n if (!customValid) {\n violations.push({\n type: \"input\",\n reason: \"Custom validation failed\",\n content: input,\n });\n }\n }\n\n // Sanitize if requested\n let sanitized = input;\n if (this.config?.sanitize) {\n sanitized = this.sanitizeInput(input);\n }\n\n return {\n valid: violations.length === 0,\n sanitized: this.config?.sanitize ? sanitized : undefined,\n violations,\n };\n }\n\n /**\n * Sanitize input (remove potentially harmful content)\n */\n private sanitizeInput(input: string): string {\n let sanitized = input;\n\n // Remove script tags\n sanitized = sanitized.replace(/<script[^>]*>.*?<\\/script>/gi, \"\");\n\n // Remove event handlers\n sanitized = sanitized.replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, \"\");\n\n // Remove javascript: protocol\n sanitized = sanitized.replace(/javascript:/gi, \"\");\n\n return sanitized;\n }\n}\n\n/**\n * Output Filter\n */\nexport class OutputFilter {\n private config: SecurityConfig[\"output\"];\n\n constructor(config?: SecurityConfig[\"output\"]) {\n this.config = config || {};\n }\n\n /**\n * Filter output\n */\n async filter(output: string): Promise<{\n filtered: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n let filtered = output;\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(filtered)) {\n violations.push({\n type: \"output\",\n reason: \"Output contains blocked pattern\",\n content: filtered,\n pattern,\n });\n\n // Redact matched content\n filtered = filtered.replace(pattern, \"[REDACTED]\");\n }\n }\n }\n\n // Filter PII\n if (this.config?.filterPII) {\n filtered = this.filterPII(filtered);\n }\n\n // Custom filter\n if (this.config?.filter) {\n filtered = await this.config.filter(filtered);\n }\n\n return { filtered, violations };\n }\n\n /**\n * Filter PII from output\n */\n private filterPII(output: string): string {\n let filtered = output;\n\n // Replace email addresses\n filtered = filtered.replace(PII_PATTERNS.email, \"[EMAIL]\");\n\n // Replace phone numbers\n filtered = filtered.replace(PII_PATTERNS.phone, \"[PHONE]\");\n\n // Replace SSN\n filtered = filtered.replace(PII_PATTERNS.ssn, \"[SSN]\");\n\n // Replace credit card numbers\n filtered = filtered.replace(PII_PATTERNS.creditCard, \"[CREDIT_CARD]\");\n\n return filtered;\n }\n}\n\n/**\n * Create security middleware for agents\n */\nexport function securityMiddleware(config: SecurityConfig) {\n const inputValidator = new InputValidator(config.input);\n const outputFilter = new OutputFilter(config.output);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n // Validate input\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n const inputValidation = await inputValidator.validate(inputString);\n\n if (!inputValidation.valid) {\n // Report violations\n inputValidation.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n\n const firstViolation = inputValidation.violations[0];\n throw toError(createError({\n type: \"agent\",\n message: `Input validation failed: ${firstViolation?.reason || \"Unknown reason\"}`,\n }));\n }\n\n // Execute with sanitized input if applicable\n if (inputValidation.sanitized) {\n context.input = inputValidation.sanitized;\n }\n\n // Execute\n const result = await next();\n\n // Filter output\n const outputFiltering = await outputFilter.filter(result.text);\n\n if (outputFiltering.violations.length > 0) {\n // Report violations\n outputFiltering.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n }\n\n // Return filtered result\n return {\n ...result,\n text: outputFiltering.filtered,\n };\n };\n}\n", "/**\n * Veryfront Workflow Types\n *\n * Core type definitions for durable, DAG-based agentic workflows\n */\n\nimport type { z } from \"zod\";\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { BlobRef, BlobStorage } from \"./blob/types.ts\";\n\n// ============================================================================\n// Workflow Status\n// ============================================================================\n\n/**\n * Status of a workflow run\n */\nexport type WorkflowStatus =\n | \"pending\" // Created but not started\n | \"running\" // Currently executing\n | \"waiting\" // Paused, waiting for approval/event\n | \"completed\" // Successfully finished\n | \"failed\" // Failed with error\n | \"cancelled\"; // Cancelled by user\n\n/**\n * Status of a single node in the workflow\n */\nexport type NodeStatus =\n | \"pending\" // Not yet executed\n | \"running\" // Currently executing\n | \"completed\" // Successfully finished\n | \"failed\" // Failed with error\n | \"skipped\"; // Skipped due to condition\n\n// ============================================================================\n// Workflow Node Types\n// ============================================================================\n\n/**\n * Types of nodes in a workflow DAG\n */\nexport type WorkflowNodeType =\n | \"step\" // Single agent or tool execution\n | \"parallel\" // Parallel execution of multiple nodes\n | \"map\" // Dynamic fan-out/map-reduce\n | \"branch\" // Conditional branching\n | \"wait\" // Wait for approval or event\n | \"subWorkflow\"; // Nested workflow execution\n\n/**\n * Retry configuration for a step\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxAttempts?: number;\n /** Backoff strategy */\n backoff?: \"fixed\" | \"linear\" | \"exponential\";\n /** Initial delay in milliseconds */\n initialDelay?: number;\n /** Maximum delay between retries */\n maxDelay?: number;\n}\n\n/**\n * Base configuration for all workflow nodes\n */\nexport interface BaseNodeConfig {\n /** Whether to checkpoint after this node */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for this node */\n timeout?: string | number;\n /** Condition to skip this node */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Step node configuration (agent or tool execution)\n */\nexport interface StepNodeConfig extends BaseNodeConfig {\n type: \"step\";\n /** Agent ID or agent instance to execute */\n agent?: string | Agent;\n /** Tool ID or tool instance to execute */\n tool?: string | Tool | undefined;\n /** Input for the agent/tool - can be static or computed from context */\n input?:\n | string\n | Record<string, unknown>\n | ((context: WorkflowContext) => unknown);\n}\n\n/**\n * Parallel node configuration (concurrent execution)\n */\nexport interface ParallelNodeConfig extends BaseNodeConfig {\n type: \"parallel\";\n /** Nodes to execute in parallel */\n nodes: WorkflowNode[];\n /** How to handle parallel completion */\n strategy?: \"all\" | \"race\" | \"allSettled\";\n}\n\n/**\n * Branch node configuration (conditional execution)\n */\nexport interface BranchNodeConfig extends BaseNodeConfig {\n type: \"branch\";\n /** Condition to evaluate */\n condition: (context: WorkflowContext) => boolean | Promise<boolean>;\n /** Nodes to execute if condition is true */\n then: WorkflowNode[];\n /** Nodes to execute if condition is false */\n else?: WorkflowNode[];\n}\n\n/**\n * Wait node configuration (approval or event)\n */\nexport interface WaitNodeConfig extends BaseNodeConfig {\n type: \"wait\";\n /** Type of wait */\n waitType: \"approval\" | \"event\";\n /** Message to display for approval */\n message?: string;\n /** Payload to include with approval request */\n payload?: unknown | ((context: WorkflowContext) => unknown);\n /** Allowed approvers (email or user IDs) */\n approvers?: string[];\n /** Event name to wait for (for event type) */\n eventName?: string;\n}\n\n/**\n * Sub-workflow node configuration\n */\nexport interface SubWorkflowNodeConfig extends BaseNodeConfig {\n type: \"subWorkflow\";\n /** Workflow ID or workflow definition to execute */\n workflow: string | WorkflowDefinition;\n /** Input for the sub-workflow */\n input?: unknown | ((context: WorkflowContext) => unknown);\n /** Transform the sub-workflow output */\n output?: (result: unknown) => unknown;\n}\n\n/**\n * Map node configuration (dynamic fan-out)\n */\nexport interface MapNodeConfig extends BaseNodeConfig {\n type: \"map\";\n /** Collection to iterate over (array) */\n items: unknown[] | ((context: WorkflowContext) => unknown[] | Promise<unknown[]>);\n /** Node or workflow to execute for each item */\n processor: WorkflowNode | WorkflowDefinition;\n /** Maximum concurrent executions */\n concurrency?: number;\n}\n\n/**\n * Union of all node configurations\n */\nexport type WorkflowNodeConfig =\n | StepNodeConfig\n | ParallelNodeConfig\n | MapNodeConfig\n | BranchNodeConfig\n | WaitNodeConfig\n | SubWorkflowNodeConfig;\n\n/**\n * A node in the workflow DAG\n */\nexport interface WorkflowNode {\n /** Unique node ID within the workflow */\n id: string;\n /** Node configuration */\n config: WorkflowNodeConfig;\n /** Dependencies (node IDs that must complete before this node) */\n dependsOn?: string[];\n}\n\n// ============================================================================\n// Workflow Definition\n// ============================================================================\n\n/**\n * Workflow context - accumulated data during execution\n */\nexport interface WorkflowContext {\n /** Input provided when workflow was started */\n input: unknown;\n /** Results from each completed node, keyed by node ID */\n [nodeId: string]: unknown;\n}\n\n/**\n * Helper to resolve BlobRefs into actual content.\n */\nexport interface BlobResolver {\n /** Get blob content as text. */\n getText(ref: BlobRef): Promise<string | null>;\n /** Get blob content as Uint8Array. */\n getBytes(ref: BlobRef): Promise<Uint8Array | null>;\n /** Get blob content as ReadableStream. */\n getStream(ref: BlobRef): Promise<ReadableStream | null>;\n /** Get blob metadata. */\n stat(ref: BlobRef): Promise<BlobRef | null>;\n /** Delete blob data. */\n delete(ref: BlobRef): Promise<void>;\n}\n\n/**\n * Step builder function context\n */\nexport interface StepBuilderContext<TInput = unknown> {\n /** Original workflow input */\n input: TInput;\n /** Accumulated context from previous steps */\n context: WorkflowContext;\n /** Blob storage access (if configured) */\n blobStorage?: BlobStorage;\n /** Helper to resolve BlobRefs to content */\n blob?: BlobResolver;\n}\n\n/**\n * Workflow definition\n */\nexport interface WorkflowDefinition<\n TInput = unknown,\n TOutput = unknown,\n> {\n /** Unique workflow identifier */\n id: string;\n /** Optional description */\n description?: string;\n /** Optional version */\n version?: string;\n /** Input validation schema */\n inputSchema?: z.ZodSchema<TInput>;\n /** Output validation schema */\n outputSchema?: z.ZodSchema<TOutput>;\n /** Default retry configuration for all steps */\n retry?: RetryConfig;\n /** Default timeout for the entire workflow */\n timeout?: string | number;\n /** Workflow steps - can be static or dynamic based on input */\n steps:\n | WorkflowNode[]\n | ((context: StepBuilderContext<TInput>) => WorkflowNode[]);\n /** Error handler */\n onError?: (error: Error, context: WorkflowContext) => void | Promise<void>;\n /** Completion handler */\n onComplete?: (\n result: TOutput,\n context: WorkflowContext,\n ) => void | Promise<void>;\n}\n\n// ============================================================================\n// Workflow Run State\n// ============================================================================\n\n/**\n * State of a single node during execution\n */\nexport interface NodeState {\n /** Node ID */\n nodeId: string;\n /** Current status */\n status: NodeStatus;\n /** Input provided to the node */\n input?: unknown;\n /** Output produced by the node */\n output?: unknown;\n /** Error message if failed */\n error?: string;\n /** Current attempt number (for retries) */\n attempt: number;\n /** When execution started */\n startedAt?: Date;\n /** When execution completed */\n completedAt?: Date;\n}\n\n/**\n * Checkpoint for workflow resume\n */\nexport interface Checkpoint {\n /** Unique checkpoint ID */\n id: string;\n /** Node ID where checkpoint was created */\n nodeId: string;\n /** When checkpoint was created */\n timestamp: Date;\n /** Context at checkpoint time */\n context: WorkflowContext;\n /** Node states at checkpoint time */\n nodeStates: Record<string, NodeState>;\n}\n\n/**\n * Pending approval request\n */\nexport interface PendingApproval {\n /** Unique approval ID */\n id: string;\n /** Node ID that requested approval */\n nodeId: string;\n /** Message for the approver */\n message: string;\n /** Payload with context for the approver */\n payload: unknown;\n /** Allowed approvers (if restricted) */\n approvers?: string[];\n /** When approval was requested */\n requestedAt: Date;\n /** When approval expires */\n expiresAt?: Date;\n /** Current approval status */\n status: \"pending\" | \"approved\" | \"rejected\" | \"expired\";\n /** Who approved/rejected */\n decidedBy?: string;\n /** When decision was made */\n decidedAt?: Date;\n /** Optional comment from approver */\n comment?: string;\n}\n\n/**\n * Workflow run - tracks execution of a workflow instance\n */\nexport interface WorkflowRun<TInput = unknown, TOutput = unknown> {\n /** Unique run ID */\n id: string;\n /** Workflow definition ID */\n workflowId: string;\n /** Workflow version */\n version?: string;\n /** Current status */\n status: WorkflowStatus;\n /** Input provided when started */\n input: TInput;\n /** Final output (when completed) */\n output?: TOutput;\n\n // Execution state\n /** State of each node in the workflow */\n nodeStates: Record<string, NodeState>;\n /** Currently executing node IDs */\n currentNodes: string[];\n /** Accumulated context */\n context: WorkflowContext;\n\n // Durability\n /** Checkpoints for resume */\n checkpoints: Checkpoint[];\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n // Error state\n /** Error information if failed */\n error?: {\n message: string;\n stack?: string;\n nodeId?: string;\n };\n\n // Timing\n /** When run was created */\n createdAt: Date;\n /** When execution started */\n startedAt?: Date;\n /** When execution completed */\n completedAt?: Date;\n}\n\n// ============================================================================\n// Approval Decision\n// ============================================================================\n\n/**\n * Decision on a pending approval\n */\nexport interface ApprovalDecision {\n /** Whether the approval was granted */\n approved: boolean;\n /** Who made the decision */\n approver: string;\n /** Optional comment */\n comment?: string;\n}\n\n// ============================================================================\n// Workflow Job (for queue-based execution)\n// ============================================================================\n\n/**\n * Job for queue-based workflow execution\n */\nexport interface WorkflowJob {\n /** Run ID */\n runId: string;\n /** Workflow ID */\n workflowId: string;\n /** Input data */\n input: unknown;\n /** Priority (higher = more urgent) */\n priority?: number;\n /** When job was created */\n createdAt: Date;\n}\n\n// ============================================================================\n// Run Filter (for querying runs)\n// ============================================================================\n\n/**\n * Filter options for listing workflow runs\n */\nexport interface RunFilter {\n /** Filter by workflow ID */\n workflowId?: string;\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n /** Filter by creation date (after) */\n createdAfter?: Date;\n /** Filter by creation date (before) */\n createdBefore?: Date;\n /** Maximum number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n// ============================================================================\n// Duration parsing utility type\n// ============================================================================\n\n/**\n * Duration string format: \"1h\", \"30m\", \"2d\", etc.\n */\nexport type DurationString = string;\n\n/**\n * Parse duration string to milliseconds\n *\n * @throws Error if duration is invalid, zero, or negative\n */\nexport function parseDuration(duration: string | number): number {\n if (typeof duration === \"number\") {\n if (duration < 0) {\n throw new Error(`Duration cannot be negative: ${duration}`);\n }\n return duration;\n }\n\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n\n const value = match[1];\n const unit = match[2];\n\n if (!value || !unit) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n\n const num = parseFloat(value);\n\n // Reject zero and negative values\n if (num <= 0) {\n throw new Error(`Duration must be positive: ${duration}`);\n }\n\n switch (unit) {\n case \"ms\":\n return num;\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60 * 1000;\n case \"h\":\n return num * 60 * 60 * 1000;\n case \"d\":\n return num * 24 * 60 * 60 * 1000;\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Validate retry configuration\n *\n * @throws Error if retry config has invalid values\n */\nexport function validateRetryConfig(config: RetryConfig): void {\n if (config.maxAttempts !== undefined) {\n if (!Number.isInteger(config.maxAttempts) || config.maxAttempts < 1) {\n throw new Error(`maxAttempts must be a positive integer, got: ${config.maxAttempts}`);\n }\n }\n\n if (config.initialDelay !== undefined) {\n if (config.initialDelay < 0) {\n throw new Error(`initialDelay cannot be negative: ${config.initialDelay}`);\n }\n }\n\n if (config.maxDelay !== undefined) {\n if (config.maxDelay < 0) {\n throw new Error(`maxDelay cannot be negative: ${config.maxDelay}`);\n }\n }\n\n if (config.initialDelay !== undefined && config.maxDelay !== undefined) {\n if (config.initialDelay > config.maxDelay) {\n throw new Error(\n `initialDelay (${config.initialDelay}) cannot be greater than maxDelay (${config.maxDelay})`,\n );\n }\n }\n\n if (config.backoff !== undefined) {\n const validBackoffs = [\"fixed\", \"linear\", \"exponential\"];\n if (!validBackoffs.includes(config.backoff)) {\n throw new Error(\n `Invalid backoff strategy: ${config.backoff}. Must be one of: ${validBackoffs.join(\", \")}`,\n );\n }\n }\n}\n\n/**\n * Generate a unique ID for workflow runs, nodes, etc.\n */\nexport function generateId(prefix: string = \"wf\"): string {\n const randomPart = crypto.randomUUID().slice(0, 12);\n return `${prefix}_${randomPart}`;\n}\n", "/**\n * Workflow DSL Builder\n *\n * Main factory function for creating durable workflows\n */\n\nimport type { z } from \"zod\";\nimport type {\n RetryConfig,\n StepBuilderContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a workflow\n */\nexport interface WorkflowOptions<TInput = unknown, TOutput = unknown> {\n /** Unique workflow identifier */\n id: string;\n /** Optional description */\n description?: string;\n /** Optional version */\n version?: string;\n /** Input validation schema (Zod) */\n inputSchema?: z.ZodSchema<TInput>;\n /** Output validation schema (Zod) */\n outputSchema?: z.ZodSchema<TOutput>;\n /** Default retry configuration for all steps */\n retry?: RetryConfig;\n /** Default timeout for the entire workflow */\n timeout?: string | number;\n /**\n * Workflow steps - can be:\n * - An array of WorkflowNode\n * - A function that returns an array based on input\n */\n steps:\n | WorkflowNode[]\n | ((context: StepBuilderContext<TInput>) => WorkflowNode[]);\n /** Error handler called when workflow fails */\n onError?: (error: Error, context: WorkflowContext) => void | Promise<void>;\n /** Completion handler called when workflow succeeds */\n onComplete?: (\n result: TOutput,\n context: WorkflowContext,\n ) => void | Promise<void>;\n}\n\n/**\n * Created workflow with execution methods\n */\nexport interface Workflow<TInput = unknown, TOutput = unknown> {\n /** Workflow definition */\n definition: WorkflowDefinition<TInput, TOutput>;\n /** Workflow ID */\n id: string;\n /** Workflow version */\n version?: string;\n}\n\n/**\n * Create a durable workflow definition\n *\n * @example\n * ```typescript\n * import { workflow, step, parallel, branch, waitForApproval } from 'veryfront/ai/workflow';\n * import { z } from 'zod';\n *\n * export default workflow({\n * id: 'content-pipeline',\n * description: 'Generate and publish content with human review',\n *\n * inputSchema: z.object({\n * topic: z.string(),\n * requiresApproval: z.boolean().default(true),\n * }),\n *\n * timeout: '2h',\n *\n * steps: ({ input }) => [\n * // Research phase\n * step('research', {\n * agent: 'researcher',\n * input: `Research: ${input.topic}`,\n * }),\n *\n * // Generate content in parallel\n * parallel('generate', [\n * step('write-article', { agent: 'writer' }),\n * step('create-images', { tool: 'imageGenerator' }),\n * ]),\n *\n * // Optional approval gate\n * branch('approval-gate', {\n * condition: () => input.requiresApproval,\n * then: [\n * waitForApproval('human-review', {\n * timeout: '24h',\n * message: 'Please review the content',\n * }),\n * ],\n * }),\n *\n * // Publish\n * step('publish', { agent: 'publisher' }),\n * ],\n *\n * onComplete: async (result, context) => {\n * console.log('Workflow completed:', result);\n * },\n *\n * onError: async (error, context) => {\n * console.error('Workflow failed:', error);\n * },\n * });\n * ```\n */\nexport function workflow<TInput = unknown, TOutput = unknown>(\n options: WorkflowOptions<TInput, TOutput>,\n): Workflow<TInput, TOutput> {\n // Validate required fields\n if (!options.id) {\n throw new Error(\"Workflow must have an 'id'\");\n }\n\n if (!options.steps) {\n throw new Error(`Workflow \"${options.id}\" must have 'steps'`);\n }\n\n // Create the workflow definition\n const definition: WorkflowDefinition<TInput, TOutput> = {\n id: options.id,\n description: options.description,\n version: options.version,\n inputSchema: options.inputSchema,\n outputSchema: options.outputSchema,\n retry: options.retry,\n timeout: options.timeout,\n steps: options.steps,\n onError: options.onError,\n onComplete: options.onComplete,\n };\n\n return {\n definition,\n id: options.id,\n version: options.version,\n };\n}\n\n/**\n * Helper to build linear dependencies between nodes\n *\n * Takes an array of nodes and returns them with dependsOn set\n * so each node depends on the previous one.\n */\nexport function sequence(...nodes: WorkflowNode[]): WorkflowNode[] {\n return nodes.map((node, index) => {\n if (index === 0) {\n return node;\n }\n const prevNode = nodes[index - 1];\n return {\n ...node,\n dependsOn: prevNode ? [prevNode.id] : undefined,\n };\n });\n}\n\n/**\n * Create a DAG-based workflow with explicit dependencies\n *\n * @example\n * ```typescript\n * import { dag, workflow } from 'veryfront/ai/workflow';\n *\n * export default workflow({\n * id: 'data-pipeline',\n * steps: dag({\n * 'fetch': step('fetch', { tool: 'dataFetcher' }),\n * 'validate': step('validate', { agent: 'validator' }).dependsOn('fetch'),\n * 'transform-a': step('transform-a', { tool: 'transformerA' }).dependsOn('validate'),\n * 'transform-b': step('transform-b', { tool: 'transformerB' }).dependsOn('validate'),\n * 'aggregate': step('aggregate', { agent: 'aggregator' }).dependsOn('transform-a', 'transform-b'),\n * }),\n * });\n * ```\n */\nexport function dag(\n nodes: Record<string, WorkflowNode | { node: WorkflowNode; dependsOn: string[] }>,\n): WorkflowNode[] {\n const result: WorkflowNode[] = [];\n const seenIds = new Set<string>();\n\n for (const [id, value] of Object.entries(nodes)) {\n let nodeId: string;\n let node: WorkflowNode;\n\n if (\"node\" in value && \"dependsOn\" in value) {\n // Object with explicit dependencies\n nodeId = value.node.id || id;\n node = {\n ...value.node,\n id: nodeId,\n dependsOn: value.dependsOn,\n };\n } else {\n // Plain WorkflowNode\n const workflowNode = value as WorkflowNode;\n nodeId = workflowNode.id || id;\n node = {\n ...workflowNode,\n id: nodeId,\n };\n }\n\n // Check for duplicate IDs\n if (seenIds.has(nodeId)) {\n throw new Error(`Duplicate node ID detected in dag: \"${nodeId}\"`);\n }\n seenIds.add(nodeId);\n\n result.push(node);\n }\n\n return result;\n}\n\n/**\n * Helper to add dependencies to a node\n */\nexport function dependsOn(\n node: WorkflowNode,\n ...dependencies: string[]\n): WorkflowNode {\n return {\n ...node,\n dependsOn: [...(node.dependsOn || []), ...dependencies],\n };\n}\n", "/**\n * Step DSL Builder\n *\n * Creates step nodes for agent or tool execution\n */\n\nimport type { Agent } from \"../../types/agent.ts\";\nimport type { Tool } from \"../../types/tool.ts\";\nimport type {\n BaseNodeConfig,\n RetryConfig,\n StepNodeConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a step node\n */\nexport interface StepOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Agent ID or agent instance to execute */\n agent?: string | Agent;\n /** Tool ID or tool instance to execute */\n tool?: string | Tool | undefined;\n /** Input for the agent/tool */\n input?:\n | string\n | Record<string, unknown>\n | ((context: WorkflowContext) => unknown);\n /** Whether to checkpoint after this step (default: true for agents) */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for this step */\n timeout?: string | number;\n /** Condition to skip this step */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a step node for agent or tool execution\n *\n * @example\n * ```typescript\n * // Agent step\n * step('research', {\n * agent: 'researcher',\n * input: 'Research AI safety',\n * checkpoint: true,\n * })\n *\n * // Tool step\n * step('fetch-data', {\n * tool: 'dataFetcher',\n * input: { url: 'https://api.example.com/data' },\n * })\n *\n * // Dynamic input from context\n * step('write', {\n * agent: 'writer',\n * input: (ctx) => ctx['research'].output,\n * })\n * ```\n */\nexport function step(id: string, options: StepOptions): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n // Validate that either agent or tool is specified\n if (!options.agent && !options.tool) {\n throw new Error(`Step \"${id}\" must specify either 'agent' or 'tool'`);\n }\n\n if (options.agent && options.tool) {\n throw new Error(`Step \"${id}\" cannot specify both 'agent' and 'tool'`);\n }\n\n // Default checkpoint to true for agent steps\n const shouldCheckpoint = options.checkpoint ?? !!options.agent;\n\n const config: StepNodeConfig = {\n type: \"step\",\n agent: options.agent,\n tool: options.tool,\n input: options.input,\n checkpoint: shouldCheckpoint,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a step that executes an agent\n * Convenience wrapper around step()\n */\nexport function agentStep(\n id: string,\n agent: string | Agent,\n options?: Omit<StepOptions, \"agent\" | \"tool\">,\n): WorkflowNode {\n return step(id, { ...options, agent });\n}\n\n/**\n * Create a step that executes a tool\n * Convenience wrapper around step()\n */\nexport function toolStep(\n id: string,\n tool: string | Tool,\n options?: Omit<StepOptions, \"agent\" | \"tool\">,\n): WorkflowNode {\n return step(id, { ...options, tool });\n}\n", "/**\n * Parallel DSL Builder\n *\n * Creates parallel nodes for concurrent execution\n */\n\nimport type {\n BaseNodeConfig,\n ParallelNodeConfig,\n RetryConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a parallel node\n */\nexport interface ParallelOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** How to handle parallel completion */\n strategy?: \"all\" | \"race\" | \"allSettled\";\n /** Whether to checkpoint after all parallel steps complete */\n checkpoint?: boolean;\n /** Retry configuration for the parallel group */\n retry?: RetryConfig;\n /** Timeout for all parallel steps */\n timeout?: string | number;\n /** Condition to skip this parallel group */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a parallel node for concurrent execution of multiple steps\n *\n * @example\n * ```typescript\n * // Execute multiple agents in parallel\n * parallel('analyze', [\n * step('security-scan', { agent: 'securityAgent' }),\n * step('code-quality', { agent: 'codeReviewAgent' }),\n * step('test-coverage', { tool: 'coverageAnalyzer' }),\n * ])\n *\n * // Race condition - first to complete wins\n * parallel('fast-response', [\n * step('gpt4', { agent: 'gpt4Agent' }),\n * step('claude', { agent: 'claudeAgent' }),\n * ], { strategy: 'race' })\n *\n * // Continue even if some fail\n * parallel('optional-checks', [\n * step('lint', { tool: 'linter' }),\n * step('typecheck', { tool: 'typechecker' }),\n * ], { strategy: 'allSettled' })\n * ```\n */\nexport function parallel(\n id: string,\n nodes: WorkflowNode[],\n options: ParallelOptions = {},\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!nodes || nodes.length === 0) {\n throw new Error(`Parallel node \"${id}\" must have at least one child node`);\n }\n\n // Generate unique IDs for child nodes if they're nested under this parallel\n // Also validate child node IDs\n const prefixedNodes = nodes.map((node, index) => {\n if (!node.id || typeof node.id !== \"string\") {\n throw new Error(`Child node at index ${index} in parallel \"${id}\" has invalid ID`);\n }\n return {\n ...node,\n id: node.id.startsWith(`${id}/`) ? node.id : `${id}/${node.id}`,\n };\n });\n\n const config: ParallelNodeConfig = {\n type: \"parallel\",\n nodes: prefixedNodes,\n strategy: options.strategy ?? \"all\",\n checkpoint: options.checkpoint ?? true,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n", "/**\n * Branch DSL Builder\n *\n * Creates conditional branch nodes for workflow control flow\n */\n\nimport type {\n BaseNodeConfig,\n BranchNodeConfig,\n RetryConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a branch node\n */\nexport interface BranchOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Condition to evaluate */\n condition: (context: WorkflowContext) => boolean | Promise<boolean>;\n /** Nodes to execute if condition is true */\n then: WorkflowNode[];\n /** Nodes to execute if condition is false (optional) */\n else?: WorkflowNode[];\n /** Whether to checkpoint after branching */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for the entire branch */\n timeout?: string | number;\n /** Condition to skip the entire branch */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a conditional branch node\n *\n * @example\n * ```typescript\n * // Simple if-then branch\n * branch('approval-gate', {\n * condition: (ctx) => ctx.input.requiresApproval,\n * then: [\n * waitForApproval('human-review', { timeout: '24h' }),\n * ],\n * })\n *\n * // If-then-else branch\n * branch('quality-check', {\n * condition: async (ctx) => {\n * const score = ctx['analyze'].output.score;\n * return score >= 0.8;\n * },\n * then: [\n * step('publish', { agent: 'publisher' }),\n * ],\n * else: [\n * step('revise', { agent: 'editor' }),\n * step('reanalyze', { agent: 'analyzer' }),\n * ],\n * })\n * ```\n */\nexport function branch(id: string, options: BranchOptions): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!options.condition) {\n throw new Error(`Branch \"${id}\" must specify a condition`);\n }\n\n if (!options.then || options.then.length === 0) {\n throw new Error(`Branch \"${id}\" must have at least one 'then' node`);\n }\n\n // Prefix child node IDs for proper namespacing\n const prefixThenNodes = options.then.map((node) => ({\n ...node,\n id: node.id.startsWith(`${id}/then/`) ? node.id : `${id}/then/${node.id}`,\n }));\n\n const prefixElseNodes = options.else?.map((node) => ({\n ...node,\n id: node.id.startsWith(`${id}/else/`) ? node.id : `${id}/else/${node.id}`,\n }));\n\n const config: BranchNodeConfig = {\n type: \"branch\",\n condition: options.condition,\n then: prefixThenNodes,\n else: prefixElseNodes,\n checkpoint: options.checkpoint ?? false,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a branch that only executes if condition is true (no else)\n * Convenience wrapper around branch()\n */\nexport function when(\n id: string,\n condition: (context: WorkflowContext) => boolean | Promise<boolean>,\n nodes: WorkflowNode[],\n): WorkflowNode {\n return branch(id, { condition, then: nodes });\n}\n\n/**\n * Create a branch that only executes if condition is false\n * Convenience wrapper around branch()\n */\nexport function unless(\n id: string,\n condition: (context: WorkflowContext) => boolean | Promise<boolean>,\n nodes: WorkflowNode[],\n): WorkflowNode {\n return branch(id, {\n condition: async (ctx) => !(await condition(ctx)),\n then: nodes,\n });\n}\n", "/**\n * Wait DSL Builder\n *\n * Creates wait nodes for approvals and external events\n */\n\nimport type {\n BaseNodeConfig,\n RetryConfig,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a wait-for-approval node\n */\nexport interface WaitForApprovalOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Message to display to the approver */\n message?: string;\n /** Payload to include with the approval request */\n payload?: unknown | ((context: WorkflowContext) => unknown);\n /** Timeout for the approval (e.g., \"24h\", \"7d\") */\n timeout?: string | number;\n /** Restrict approval to specific users */\n approvers?: string[];\n /** Retry configuration (for timeout/retry scenarios) */\n retry?: RetryConfig;\n /** Condition to skip this approval */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a wait-for-approval node\n *\n * This pauses the workflow until a human approves or rejects.\n * The workflow can be resumed via the approval API.\n *\n * @example\n * ```typescript\n * // Basic approval\n * waitForApproval('content-review', {\n * message: 'Please review the generated content',\n * timeout: '24h',\n * })\n *\n * // Approval with payload for context\n * waitForApproval('deployment-approval', {\n * message: 'Approve deployment to production?',\n * payload: (ctx) => ({\n * changes: ctx['summarize'].output,\n * riskLevel: ctx['analyze'].output.riskLevel,\n * }),\n * approvers: ['ops@company.com', 'lead@company.com'],\n * timeout: '48h',\n * })\n * ```\n */\nexport function waitForApproval(\n id: string,\n options: WaitForApprovalOptions = {},\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"approval\",\n message: options.message ?? \"Approval required\",\n payload: options.payload,\n approvers: options.approvers,\n timeout: options.timeout,\n // Always checkpoint before waiting\n checkpoint: true,\n retry: options.retry,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Options for creating a wait-for-event node\n */\nexport interface WaitForEventOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Event name to wait for */\n eventName: string;\n /** Timeout for the event (e.g., \"1h\", \"7d\") */\n timeout?: string | number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Condition to skip this wait */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a wait-for-event node\n *\n * This pauses the workflow until an external event is received.\n * Events can be sent via the workflow event API.\n *\n * @example\n * ```typescript\n * // Wait for external webhook\n * waitForEvent('payment-confirmation', {\n * eventName: 'payment.completed',\n * timeout: '30m',\n * })\n *\n * // Wait for manual trigger\n * waitForEvent('manual-continue', {\n * eventName: 'workflow.continue',\n * })\n * ```\n */\nexport function waitForEvent(\n id: string,\n options: WaitForEventOptions,\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!options.eventName) {\n throw new Error(`waitForEvent \"${id}\" must specify an eventName`);\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"event\",\n eventName: options.eventName,\n timeout: options.timeout,\n // Always checkpoint before waiting\n checkpoint: true,\n retry: options.retry,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a simple delay/sleep node\n *\n * @example\n * ```typescript\n * // Wait for 5 minutes between steps\n * delay('cooldown', '5m')\n * ```\n */\nexport function delay(id: string, duration: string | number): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"event\",\n eventName: \"__delay__\",\n timeout: duration,\n checkpoint: false, // No need to checkpoint for simple delays\n };\n\n return {\n id,\n config,\n };\n}\n", "/**\n * Workflow Backend Interface\n *\n * Defines the contract for workflow persistence and execution backends.\n * Implementations can be:\n * - MemoryBackend (development)\n * - RedisBackend (production)\n * - TemporalAdapter (enterprise)\n * - InngestAdapter (serverless)\n * - CloudflareAdapter (edge)\n */\n\nimport type {\n ApprovalDecision,\n Checkpoint,\n PendingApproval,\n RunFilter,\n WorkflowJob,\n WorkflowRun,\n WorkflowStatus as _WorkflowStatus,\n} from \"../types.ts\";\n\n/**\n * Backend configuration options\n */\nexport interface BackendConfig {\n /** Connection URL (for Redis, Postgres, etc.) */\n url?: string;\n /** Key prefix for namespacing */\n prefix?: string;\n /** Default TTL for runs (in milliseconds) */\n defaultTtl?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Lock information for distributed execution\n */\nexport interface Lock {\n /** Lock identifier */\n lockId: string;\n /** Run ID that owns the lock */\n runId: string;\n /** When lock was acquired */\n acquiredAt: Date;\n /** When lock expires */\n expiresAt: Date;\n}\n\n/**\n * Workflow backend interface\n *\n * All backend implementations must implement this interface.\n * Optional methods (marked with ?) can be omitted for simpler backends.\n */\nexport interface WorkflowBackend {\n // =========================================================================\n // Run Management\n // =========================================================================\n\n /**\n * Create a new workflow run\n */\n createRun(run: WorkflowRun): Promise<void>;\n\n /**\n * Get a workflow run by ID\n */\n getRun(runId: string): Promise<WorkflowRun | null>;\n\n /**\n * Update a workflow run\n */\n updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void>;\n\n /**\n * Delete a workflow run\n */\n deleteRun?(runId: string): Promise<void>;\n\n /**\n * List workflow runs with optional filters\n */\n listRuns(filter: RunFilter): Promise<WorkflowRun[]>;\n\n /**\n * Count workflow runs matching filter\n */\n countRuns?(filter: RunFilter): Promise<number>;\n\n // =========================================================================\n // Checkpointing\n // =========================================================================\n\n /**\n * Save a checkpoint for a workflow run\n */\n saveCheckpoint(runId: string, checkpoint: Checkpoint): Promise<void>;\n\n /**\n * Get the latest checkpoint for a workflow run\n */\n getLatestCheckpoint(runId: string): Promise<Checkpoint | null>;\n\n /**\n * Get all checkpoints for a workflow run\n */\n getCheckpoints?(runId: string): Promise<Checkpoint[]>;\n\n /**\n * Delete a specific checkpoint\n */\n deleteCheckpoint?(runId: string, checkpointId: string): Promise<void>;\n\n /**\n * Delete multiple checkpoints by ID\n */\n deleteCheckpoints?(runId: string, checkpointIds: string[]): Promise<void>;\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n /**\n * Save a pending approval request\n */\n savePendingApproval(\n runId: string,\n approval: PendingApproval,\n ): Promise<void>;\n\n /**\n * Get all pending approvals for a workflow run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]>;\n\n /**\n * Get a specific pending approval\n */\n getPendingApproval?(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null>;\n\n /**\n * Update an approval with a decision\n */\n updateApproval(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void>;\n\n /**\n * List all pending approvals across workflows\n */\n listPendingApprovals?(filter?: {\n workflowId?: string;\n approver?: string;\n status?: \"pending\" | \"expired\";\n }): Promise<Array<{ runId: string; approval: PendingApproval }>>;\n\n // =========================================================================\n // Queue Operations (optional - for distributed execution)\n // =========================================================================\n\n /**\n * Enqueue a workflow job for processing\n */\n enqueue?(job: WorkflowJob): Promise<void>;\n\n /**\n * Dequeue the next workflow job\n */\n dequeue?(): Promise<WorkflowJob | null>;\n\n /**\n * Acknowledge job completion\n */\n acknowledge?(runId: string): Promise<void>;\n\n /**\n * Negative acknowledge - return job to queue\n */\n nack?(runId: string): Promise<void>;\n\n // =========================================================================\n // Distributed Locking (optional - for distributed execution)\n // =========================================================================\n\n /**\n * Acquire a lock for exclusive workflow execution\n * Returns true if lock was acquired, false if already locked\n */\n acquireLock?(runId: string, duration: number): Promise<boolean>;\n\n /**\n * Release a lock\n */\n releaseLock?(runId: string): Promise<void>;\n\n /**\n * Extend lock duration\n */\n extendLock?(runId: string, duration: number): Promise<boolean>;\n\n /**\n * Check if a lock is held\n */\n isLocked?(runId: string): Promise<boolean>;\n\n // =========================================================================\n // Events (optional - for event-driven workflows)\n // =========================================================================\n\n /**\n * Publish an event that waiting workflows can receive\n */\n publishEvent?(\n eventName: string,\n payload: unknown,\n options?: {\n runId?: string; // Target specific run\n workflowId?: string; // Target specific workflow type\n },\n ): Promise<void>;\n\n /**\n * Subscribe to events for a workflow run\n * Returns an async iterator of events\n */\n subscribeEvents?(runId: string): AsyncIterable<{\n eventName: string;\n payload: unknown;\n timestamp: Date;\n }>;\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n /**\n * Initialize the backend (connect to database, etc.)\n */\n initialize?(): Promise<void>;\n\n /**\n * Check if the backend is healthy\n */\n healthCheck?(): Promise<boolean>;\n\n /**\n * Cleanup and close connections\n */\n destroy(): Promise<void>;\n}\n\n/**\n * Backend with queue capabilities\n * Type guard for checking if backend supports queueing\n */\nexport function hasQueueSupport(\n backend: WorkflowBackend,\n): backend is\n & WorkflowBackend\n & Required<Pick<WorkflowBackend, \"enqueue\" | \"dequeue\" | \"acknowledge\">> {\n return (\n typeof backend.enqueue === \"function\" &&\n typeof backend.dequeue === \"function\" &&\n typeof backend.acknowledge === \"function\"\n );\n}\n\n/**\n * Backend with locking capabilities\n * Type guard for checking if backend supports distributed locking\n */\nexport function hasLockSupport(\n backend: WorkflowBackend,\n): backend is WorkflowBackend & Required<Pick<WorkflowBackend, \"acquireLock\" | \"releaseLock\">> {\n return (\n typeof backend.acquireLock === \"function\" &&\n typeof backend.releaseLock === \"function\"\n );\n}\n\n/**\n * Backend with event capabilities\n * Type guard for checking if backend supports events\n */\nexport function hasEventSupport(\n backend: WorkflowBackend,\n): backend is\n & WorkflowBackend\n & Required<Pick<WorkflowBackend, \"publishEvent\" | \"subscribeEvents\">> {\n return (\n typeof backend.publishEvent === \"function\" &&\n typeof backend.subscribeEvents === \"function\"\n );\n}\n", "/**\n * Memory Workflow Backend\n *\n * In-memory implementation of WorkflowBackend for development and testing.\n * Data is NOT persisted across restarts.\n */\n\nimport type {\n ApprovalDecision,\n Checkpoint,\n PendingApproval,\n RunFilter,\n WorkflowJob,\n WorkflowRun,\n} from \"../types.ts\";\nimport type { BackendConfig, WorkflowBackend } from \"./types.ts\";\n\n/**\n * Memory backend configuration\n */\nexport interface MemoryBackendConfig extends BackendConfig {\n /** Maximum queue size (default: 10000) */\n maxQueueSize?: number;\n}\n\n/** Default max queue size */\nconst DEFAULT_MAX_QUEUE_SIZE = 10000;\n\n/**\n * In-memory workflow backend\n *\n * @example\n * ```typescript\n * import { MemoryBackend } from 'veryfront/ai/workflow/backends/memory';\n *\n * const backend = new MemoryBackend();\n * ```\n */\nexport class MemoryBackend implements WorkflowBackend {\n private runs = new Map<string, WorkflowRun>();\n private checkpoints = new Map<string, Checkpoint[]>();\n private approvals = new Map<string, PendingApproval[]>();\n private queue: WorkflowJob[] = [];\n private locks = new Map<string, { lockId: string; expiresAt: number }>();\n private config: MemoryBackendConfig;\n\n constructor(config: MemoryBackendConfig = {}) {\n this.config = {\n prefix: \"wf:\",\n debug: false,\n maxQueueSize: DEFAULT_MAX_QUEUE_SIZE,\n ...config,\n };\n }\n\n // =========================================================================\n // Run Management\n // =========================================================================\n\n createRun(run: WorkflowRun): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Creating run: ${run.id}`);\n }\n this.runs.set(run.id, structuredClone(run));\n return Promise.resolve();\n }\n\n getRun(runId: string): Promise<WorkflowRun | null> {\n const run = this.runs.get(runId);\n return Promise.resolve(run ? structuredClone(run) : null);\n }\n\n updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void> {\n const run = this.runs.get(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Updating run: ${runId}`, patch);\n }\n\n // Deep merge the patch\n const updated = {\n ...run,\n ...patch,\n // Deep merge specific fields\n nodeStates: { ...run.nodeStates, ...patch.nodeStates },\n context: { ...run.context, ...patch.context },\n };\n\n this.runs.set(runId, updated);\n return Promise.resolve();\n }\n\n deleteRun(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.checkpoints.delete(runId);\n this.approvals.delete(runId);\n return Promise.resolve();\n }\n\n listRuns(filter: RunFilter): Promise<WorkflowRun[]> {\n let runs = Array.from(this.runs.values());\n\n // Apply filters\n if (filter.workflowId) {\n runs = runs.filter((r) => r.workflowId === filter.workflowId);\n }\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n runs = runs.filter((r) => statuses.includes(r.status));\n }\n\n if (filter.createdAfter) {\n runs = runs.filter((r) => r.createdAt >= filter.createdAfter!);\n }\n\n if (filter.createdBefore) {\n runs = runs.filter((r) => r.createdAt <= filter.createdBefore!);\n }\n\n // Sort by creation date (newest first)\n runs.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n // Apply pagination (offset and limit together)\n const start = filter.offset ?? 0;\n const end = filter.limit ? start + filter.limit : undefined;\n runs = runs.slice(start, end);\n\n return Promise.resolve(runs.map((r) => structuredClone(r)));\n }\n\n async countRuns(filter: RunFilter): Promise<number> {\n const runs = await this.listRuns({ ...filter, limit: undefined, offset: undefined });\n return runs.length;\n }\n\n // =========================================================================\n // Checkpointing\n // =========================================================================\n\n saveCheckpoint(runId: string, checkpoint: Checkpoint): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Saving checkpoint: ${checkpoint.id} for run ${runId}`);\n }\n\n const existing = this.checkpoints.get(runId) || [];\n existing.push(structuredClone(checkpoint));\n this.checkpoints.set(runId, existing);\n return Promise.resolve();\n }\n\n getLatestCheckpoint(runId: string): Promise<Checkpoint | null> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints || checkpoints.length === 0) {\n return Promise.resolve(null);\n }\n\n // Return the most recent checkpoint\n const latest = checkpoints[checkpoints.length - 1];\n return Promise.resolve(latest ? structuredClone(latest) : null);\n }\n\n getCheckpoints(runId: string): Promise<Checkpoint[]> {\n const checkpoints = this.checkpoints.get(runId) || [];\n return Promise.resolve(checkpoints.map((c) => structuredClone(c)));\n }\n\n deleteCheckpoint(runId: string, checkpointId: string): Promise<void> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints) {\n return Promise.resolve();\n }\n\n const index = checkpoints.findIndex((c) => c.id === checkpointId);\n if (index !== -1) {\n checkpoints.splice(index, 1);\n if (this.config.debug) {\n console.log(`[MemoryBackend] Deleted checkpoint: ${checkpointId}`);\n }\n }\n return Promise.resolve();\n }\n\n deleteCheckpoints(runId: string, checkpointIds: string[]): Promise<void> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints) {\n return Promise.resolve();\n }\n\n const idsToDelete = new Set(checkpointIds);\n const filtered = checkpoints.filter((c) => !idsToDelete.has(c.id));\n this.checkpoints.set(runId, filtered);\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Deleted ${checkpointIds.length} checkpoints`);\n }\n return Promise.resolve();\n }\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n savePendingApproval(\n runId: string,\n approval: PendingApproval,\n ): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Saving approval: ${approval.id} for run ${runId}`);\n }\n\n const existing = this.approvals.get(runId) || [];\n existing.push(structuredClone(approval));\n this.approvals.set(runId, existing);\n return Promise.resolve();\n }\n\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n const approvals = this.approvals.get(runId) || [];\n return Promise.resolve(\n approvals\n .filter((a) => a.status === \"pending\")\n .map((a) => structuredClone(a)),\n );\n }\n\n getPendingApproval(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null> {\n const approvals = this.approvals.get(runId) || [];\n const approval = approvals.find((a) => a.id === approvalId);\n return Promise.resolve(approval ? structuredClone(approval) : null);\n }\n\n updateApproval(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void> {\n const approvals = this.approvals.get(runId);\n if (!approvals) {\n throw new Error(`No approvals found for run: ${runId}`);\n }\n\n const approval = approvals.find((a) => a.id === approvalId);\n if (!approval) {\n throw new Error(`Approval not found: ${approvalId}`);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Updating approval: ${approvalId}`, decision);\n }\n\n approval.status = decision.approved ? \"approved\" : \"rejected\";\n approval.decidedBy = decision.approver;\n approval.decidedAt = new Date();\n approval.comment = decision.comment;\n return Promise.resolve();\n }\n\n listPendingApprovals(filter?: {\n workflowId?: string;\n approver?: string;\n status?: \"pending\" | \"expired\";\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n const result: Array<{ runId: string; approval: PendingApproval }> = [];\n\n for (const [runId, approvals] of this.approvals) {\n const run = this.runs.get(runId);\n if (!run) continue;\n\n if (filter?.workflowId && run.workflowId !== filter.workflowId) {\n continue;\n }\n\n for (const approval of approvals) {\n // Check status\n if (filter?.status === \"pending\" && approval.status !== \"pending\") {\n continue;\n }\n\n if (filter?.status === \"expired\") {\n const isExpired = approval.expiresAt && new Date() > approval.expiresAt;\n if (!isExpired) continue;\n }\n\n // Check approver\n if (\n filter?.approver &&\n approval.approvers &&\n !approval.approvers.includes(filter.approver)\n ) {\n continue;\n }\n\n result.push({ runId, approval: structuredClone(approval) });\n }\n }\n\n return Promise.resolve(result);\n }\n\n // =========================================================================\n // Queue Operations\n // =========================================================================\n\n enqueue(job: WorkflowJob): Promise<void> {\n // Check queue size limit\n const maxSize = this.config.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;\n if (this.queue.length >= maxSize) {\n return Promise.reject(\n new Error(`Queue full (max: ${maxSize}). Cannot enqueue job: ${job.runId}`),\n );\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Enqueueing job: ${job.runId}`);\n }\n\n // Insert based on priority (higher priority first)\n const priority = job.priority ?? 0;\n const insertIndex = this.queue.findIndex((j) => (j.priority ?? 0) < priority);\n\n if (insertIndex === -1) {\n this.queue.push(structuredClone(job));\n } else {\n this.queue.splice(insertIndex, 0, structuredClone(job));\n }\n return Promise.resolve();\n }\n\n dequeue(): Promise<WorkflowJob | null> {\n const job = this.queue.shift();\n return Promise.resolve(job ? structuredClone(job) : null);\n }\n\n acknowledge(runId: string): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Acknowledging job: ${runId}`);\n }\n // For memory backend, acknowledgment is a no-op\n // The job is already removed from queue on dequeue\n return Promise.resolve();\n }\n\n async nack(runId: string): Promise<void> {\n // Re-enqueue the job\n const run = await this.getRun(runId);\n if (run) {\n await this.enqueue({\n runId: run.id,\n workflowId: run.workflowId,\n input: run.input,\n createdAt: new Date(),\n });\n }\n }\n\n // =========================================================================\n // Distributed Locking\n // =========================================================================\n\n acquireLock(runId: string, duration: number): Promise<boolean> {\n const existing = this.locks.get(runId);\n const now = Date.now();\n\n // If lock exists and hasn't expired, fail to acquire\n if (existing && existing.expiresAt > now) {\n return Promise.resolve(false);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Acquiring lock for: ${runId}`);\n }\n\n this.locks.set(runId, {\n lockId: crypto.randomUUID(),\n expiresAt: now + duration,\n });\n\n return Promise.resolve(true);\n }\n\n releaseLock(runId: string): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Releasing lock for: ${runId}`);\n }\n this.locks.delete(runId);\n return Promise.resolve();\n }\n\n extendLock(runId: string, duration: number): Promise<boolean> {\n const existing = this.locks.get(runId);\n const now = Date.now();\n\n if (!existing || existing.expiresAt <= now) {\n return Promise.resolve(false);\n }\n\n existing.expiresAt = now + duration;\n return Promise.resolve(true);\n }\n\n isLocked(runId: string): Promise<boolean> {\n const existing = this.locks.get(runId);\n return Promise.resolve(!!existing && existing.expiresAt > Date.now());\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n initialize(): Promise<void> {\n if (this.config.debug) {\n console.log(\"[MemoryBackend] Initialized\");\n }\n return Promise.resolve();\n }\n\n healthCheck(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n destroy(): Promise<void> {\n this.runs.clear();\n this.checkpoints.clear();\n this.approvals.clear();\n this.queue = [];\n this.locks.clear();\n\n if (this.config.debug) {\n console.log(\"[MemoryBackend] Destroyed\");\n }\n return Promise.resolve();\n }\n\n // =========================================================================\n // Development Helpers\n // =========================================================================\n\n /**\n * Get statistics about the backend (for debugging)\n */\n getStats(): {\n runs: number;\n checkpoints: number;\n approvals: number;\n queueLength: number;\n locks: number;\n } {\n let totalCheckpoints = 0;\n let totalApprovals = 0;\n\n for (const checkpoints of this.checkpoints.values()) {\n totalCheckpoints += checkpoints.length;\n }\n\n for (const approvals of this.approvals.values()) {\n totalApprovals += approvals.length;\n }\n\n return {\n runs: this.runs.size,\n checkpoints: totalCheckpoints,\n approvals: totalApprovals,\n queueLength: this.queue.length,\n locks: this.locks.size,\n };\n }\n\n /**\n * Clear all data (for testing)\n */\n clear(): Promise<void> {\n this.runs.clear();\n this.checkpoints.clear();\n this.approvals.clear();\n this.queue = [];\n this.locks.clear();\n return Promise.resolve();\n }\n}\n", "/**\n * DAG Executor\n *\n * Executes workflow DAGs with proper dependency ordering and parallel execution\n */\n\nimport type {\n BranchNodeConfig,\n Checkpoint,\n MapNodeConfig,\n NodeState,\n ParallelNodeConfig,\n SubWorkflowNodeConfig,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n WorkflowNodeConfig,\n WorkflowRun,\n} from \"../types.ts\";\nimport { generateId } from \"../types.ts\";\nimport type { StepExecutor } from \"./step-executor.ts\";\nimport type { CheckpointManager } from \"./checkpoint-manager.ts\";\n\n/**\n * DAG executor configuration\n */\nexport interface DAGExecutorConfig {\n /** Step executor for running individual steps */\n stepExecutor: StepExecutor;\n /** Checkpoint manager for durability */\n checkpointManager?: CheckpointManager;\n /** Maximum concurrent parallel executions */\n maxConcurrency?: number;\n /** Callback when node execution starts */\n onNodeStart?: (nodeId: string) => void;\n /** Callback when node execution completes */\n onNodeComplete?: (nodeId: string, state: NodeState) => void;\n /** Callback when waiting for approval/event */\n onWaiting?: (nodeId: string, waitConfig: WaitNodeConfig) => void;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Result of DAG execution\n */\nexport interface DAGExecutionResult {\n /** Whether the DAG completed successfully */\n completed: boolean;\n /** Whether the DAG is waiting (for approval/event) */\n waiting: boolean;\n /** Node that is waiting (if waiting) */\n waitingNode?: string;\n /** Final context after execution */\n context: WorkflowContext;\n /** Final node states */\n nodeStates: Record<string, NodeState>;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * DAG Executor class\n *\n * Responsible for executing workflow DAGs with:\n * - Topological ordering for dependencies\n * - Parallel execution of independent nodes\n * - Support for branching and conditional logic\n * - Checkpointing for durability\n */\nexport class DAGExecutor {\n private config: DAGExecutorConfig;\n\n constructor(config: DAGExecutorConfig) {\n this.config = {\n maxConcurrency: 10,\n debug: false,\n ...config,\n };\n }\n\n /**\n * Execute a workflow DAG\n */\n async execute(\n nodes: WorkflowNode[],\n run: WorkflowRun,\n startFromNode?: string,\n ): Promise<DAGExecutionResult> {\n const context = { ...run.context };\n const nodeStates = { ...run.nodeStates };\n\n // Build dependency graph\n const { adjList, inDegree, nodeMap } = this.buildGraph(nodes);\n\n // Update in-degrees for nodes whose dependencies are already completed\n // This handles resuming from checkpoints\n for (const [nodeId, state] of Object.entries(nodeStates)) {\n if (state.status === \"completed\" || state.status === \"skipped\") {\n // Decrement in-degree for all dependents of this completed node\n for (const dependent of adjList.get(nodeId) || []) {\n const currentDegree = inDegree.get(dependent) ?? 0;\n if (currentDegree > 0) {\n inDegree.set(dependent, currentDegree - 1);\n }\n }\n }\n }\n\n // Validate DAG (no cycles)\n if (this.hasCycle(nodes, adjList)) {\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: \"Workflow DAG contains cycles\",\n };\n }\n\n // Find starting nodes\n let ready: string[];\n if (startFromNode) {\n // Resume from specific node\n ready = [startFromNode];\n } else {\n // Start from nodes with no dependencies that haven't been completed\n ready = this.getReadyNodes(inDegree, nodeStates);\n }\n\n // Execute nodes in topological order\n while (ready.length > 0) {\n // Execute ready nodes in parallel (respecting max concurrency)\n const batch = ready.slice(0, this.config.maxConcurrency);\n ready = ready.slice(this.config.maxConcurrency);\n\n const results = await Promise.allSettled(\n batch.map((nodeId) => this.executeNode(nodeMap.get(nodeId)!, context, nodeStates)),\n );\n\n // Process results\n for (let i = 0; i < batch.length; i++) {\n const nodeId = batch[i]!;\n const result = results[i]!;\n\n if (result.status === \"fulfilled\") {\n const nodeResult = result.value;\n\n // Update node state\n nodeStates[nodeId] = nodeResult.state;\n Object.assign(context, nodeResult.contextUpdates);\n\n // Handle waiting state\n if (nodeResult.waiting) {\n return {\n completed: false,\n waiting: true,\n waitingNode: nodeId,\n context,\n nodeStates,\n };\n }\n\n // Checkpoint if configured\n const nodeConfig = nodeMap.get(nodeId);\n if (\n nodeResult.state.status === \"completed\" &&\n nodeConfig && this.shouldCheckpoint(nodeConfig)\n ) {\n await this.checkpoint(run.id, nodeId, context, nodeStates);\n }\n\n // Check if node failed (step returned success: false)\n if (nodeResult.state.status === \"failed\") {\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: `Node \"${nodeId}\" failed: ${nodeResult.state.error || \"Unknown error\"}`,\n };\n }\n\n // Update ready nodes based on completed dependencies\n if (nodeResult.state.status === \"completed\" || nodeResult.state.status === \"skipped\") {\n for (const dependent of adjList.get(nodeId) || []) {\n const newDegree = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDegree);\n }\n }\n } else {\n // Node execution failed\n const error = result.reason instanceof Error\n ? result.reason.message\n : String(result.reason);\n\n nodeStates[nodeId] = {\n nodeId,\n status: \"failed\",\n error,\n attempt: (nodeStates[nodeId]?.attempt || 0) + 1,\n completedAt: new Date(),\n };\n\n // Fail fast - don't continue with other nodes\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: `Node \"${nodeId}\" failed: ${error}`,\n };\n }\n }\n\n // Get newly ready nodes\n const newReady = this.getReadyNodes(inDegree, nodeStates);\n ready = [...ready, ...newReady];\n }\n\n return {\n completed: true,\n waiting: false,\n context,\n nodeStates,\n };\n }\n\n /**\n * Execute a single node\n */\n private async executeNode(\n node: WorkflowNode,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const nodeId = node.id;\n\n // Check if node is already completed (resuming from checkpoint)\n const existingState = nodeStates[nodeId];\n if (existingState?.status === \"completed\") {\n return { state: existingState, contextUpdates: {}, waiting: false };\n }\n\n this.config.onNodeStart?.(nodeId);\n\n // Check if should skip\n if (node.config.skip && (await node.config.skip(context))) {\n const state = this.config.stepExecutor.createSkippedState(nodeId);\n this.config.onNodeComplete?.(nodeId, state);\n return { state, contextUpdates: {}, waiting: false };\n }\n\n // Execute based on node type\n const config = node.config;\n\n switch (config.type) {\n case \"step\":\n return await this.executeStepNode(node, context);\n\n case \"parallel\":\n return await this.executeParallelNode(node, config, context, nodeStates);\n\n case \"map\":\n return await this.executeMapNode(node, config as MapNodeConfig, context, nodeStates);\n\n case \"branch\":\n return await this.executeBranchNode(node, config as BranchNodeConfig, context, nodeStates);\n\n case \"wait\":\n return await this.executeWaitNode(node, config as WaitNodeConfig, context);\n\n case \"subWorkflow\":\n return await this.executeSubWorkflowNode(\n node,\n config as SubWorkflowNodeConfig,\n context,\n nodeStates,\n );\n\n default:\n throw new Error(\n `Unknown node type \"${(config as WorkflowNodeConfig).type}\" for node \"${node.id}\". ` +\n `Valid types are: step, parallel, map, branch, wait, subWorkflow`,\n );\n }\n }\n\n /**\n * Execute a map node (dynamic fan-out)\n */\n private async executeMapNode(\n node: WorkflowNode,\n config: MapNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // 1. Resolve items collection\n const items = typeof config.items === \"function\" ? await config.items(context) : config.items;\n\n if (!Array.isArray(items)) {\n throw new Error(`Map node \"${node.id}\" items must be an array`);\n }\n\n if (items.length === 0) {\n // Empty collection, done immediately\n const state: NodeState = {\n nodeId: node.id,\n status: \"completed\",\n output: [],\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: new Date(),\n };\n return { state, contextUpdates: { [node.id]: [] }, waiting: false };\n }\n\n // 2. Generate child nodes for each item\n const childNodes: WorkflowNode[] = [];\n\n // Check if processor is a WorkflowDefinition or a single node\n const isWorkflowDef = (p: any): p is WorkflowDefinition => !!p.steps;\n\n // We'll map each item to a set of nodes\n // For simplicity in this implementation, if processor is a single node, we clone it.\n // If it's a workflow def, we'd need to expand it (similar to subworkflow).\n // Here we assume it's a single node structure for the \"map\" pattern or a simple chain.\n // To support complex subworkflows per item, best to wrap in a SubWorkflowNode.\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const childId = `${node.id}_${i}`;\n\n let childNode: WorkflowNode;\n\n if (isWorkflowDef(config.processor)) {\n // Create a SubWorkflow node for this item\n childNode = {\n id: childId,\n config: {\n type: \"subWorkflow\",\n workflow: config.processor,\n input: item,\n retry: config.retry,\n checkpoint: false, // Don't checkpoint individual map items by default\n } as SubWorkflowNodeConfig,\n };\n } else {\n // Clone the single processor node\n // We must override the input to be the current item\n const processorConfig = { ...config.processor.config } as any;\n\n // If it's a step node, ensure input receives the item\n if (processorConfig.type === \"step\") {\n processorConfig.input = item;\n }\n\n childNode = {\n id: childId,\n config: processorConfig,\n };\n }\n\n childNodes.push(childNode);\n }\n\n // 3. Execute child nodes\n // We use a temporary DAG execution for these nodes\n // The maxConcurrency from config overrides default\n const originalConcurrency = this.config.maxConcurrency;\n if (config.concurrency) {\n this.config.maxConcurrency = config.concurrency;\n }\n\n try {\n const result = await this.execute(childNodes, {\n id: `${node.id}_map`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {}, // Start fresh for map iteration\n currentNodes: [],\n context: { ...context }, // Pass copy of context so they can read global state\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states into parent for visibility\n Object.assign(nodeStates, result.nodeStates);\n\n // Collect outputs in order\n const outputs = childNodes.map((child) => {\n const childState = result.nodeStates[child.id];\n return childState?.output;\n });\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: outputs,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.completed ? { [node.id]: outputs } : {},\n waiting: result.waiting,\n };\n } finally {\n // Restore concurrency setting\n this.config.maxConcurrency = originalConcurrency!;\n }\n }\n\n /**\n * Execute a sub-workflow node\n */\n private async executeSubWorkflowNode(\n node: WorkflowNode,\n config: SubWorkflowNodeConfig,\n context: WorkflowContext,\n _nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // 1. Resolve workflow definition\n let workflowDef: WorkflowDefinition;\n if (typeof config.workflow === \"string\") {\n throw new Error(\n \"Resolving workflow by ID is not yet supported in this execution context. Pass the WorkflowDefinition object.\",\n );\n } else {\n workflowDef = config.workflow;\n }\n\n // 2. Resolve input\n const input = typeof config.input === \"function\"\n ? await config.input(context)\n : (config.input ?? context.input);\n\n // 3. Expand steps (handle dynamic steps builder)\n let steps: WorkflowNode[];\n if (typeof workflowDef.steps === \"function\") {\n steps = workflowDef.steps({\n input,\n context,\n });\n } else {\n steps = workflowDef.steps;\n }\n\n // 4. Execute sub-workflow\n // We create a new isolated run context for the subworkflow\n const subRunId = `${node.id}_sub_${generateId()}`;\n\n // Execute recursively\n const result = await this.execute(steps, {\n id: subRunId,\n workflowId: workflowDef.id,\n status: \"running\",\n input,\n nodeStates: {},\n currentNodes: [],\n context: {\n input, // Subworkflow starts with fresh context scoped to its input\n // We do NOT inherit parent context to ensure isolation,\n // unless explicitly passed via input.\n },\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // 5. Process result\n let finalOutput = result.context; // Default output is the final context\n\n // If sub-workflow has explicit output transformation\n if (result.completed && config.output) {\n finalOutput = config.output(result.context) as any;\n }\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: finalOutput,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.completed ? { [node.id]: finalOutput } : {},\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a step node\n */\n private async executeStepNode(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const result = await this.config.stepExecutor.execute(node, context);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.success ? \"completed\" : \"failed\",\n input: context.input,\n output: result.output,\n error: result.error,\n attempt: 1,\n startedAt: new Date(Date.now() - result.executionTime),\n completedAt: new Date(),\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.success ? { [node.id]: result.output } : {},\n waiting: false,\n };\n }\n\n /**\n * Execute a parallel node\n */\n private async executeParallelNode(\n node: WorkflowNode,\n config: ParallelNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // Execute child nodes using DAG executor recursively\n const result = await this.execute(config.nodes, {\n id: `${node.id}_parallel`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {},\n currentNodes: [],\n context,\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states\n Object.assign(nodeStates, result.nodeStates);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: result.context,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.context,\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a branch node\n */\n private async executeBranchNode(\n node: WorkflowNode,\n config: BranchNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // Evaluate condition\n const conditionResult = await config.condition(context);\n\n // Select branch to execute\n const branchNodes = conditionResult ? config.then : (config.else || []);\n\n if (branchNodes.length === 0) {\n // No nodes to execute\n const state: NodeState = {\n nodeId: node.id,\n status: \"completed\",\n output: { branch: conditionResult ? \"then\" : \"else\", skipped: true },\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: new Date(),\n };\n\n return { state, contextUpdates: {}, waiting: false };\n }\n\n // Execute branch nodes\n const result = await this.execute(branchNodes, {\n id: `${node.id}_branch`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {},\n currentNodes: [],\n context,\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states\n Object.assign(nodeStates, result.nodeStates);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: {\n branch: conditionResult ? \"then\" : \"else\",\n result: result.context,\n },\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.context,\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a wait node (approval or event)\n */\n private async executeWaitNode(\n node: WorkflowNode,\n config: WaitNodeConfig,\n context: WorkflowContext,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n // Notify that we're waiting\n this.config.onWaiting?.(node.id, config);\n\n const state: NodeState = {\n nodeId: node.id,\n status: \"running\",\n input: {\n type: config.waitType,\n message: config.message,\n payload: typeof config.payload === \"function\"\n ? await config.payload(context)\n : config.payload,\n },\n attempt: 1,\n startedAt: new Date(),\n };\n\n // Signal that workflow is now waiting\n return {\n state,\n contextUpdates: {},\n waiting: true,\n };\n }\n\n /**\n * Build dependency graph from nodes\n */\n private buildGraph(nodes: WorkflowNode[]): {\n adjList: Map<string, string[]>;\n inDegree: Map<string, number>;\n nodeMap: Map<string, WorkflowNode>;\n } {\n const adjList = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n const nodeMap = new Map<string, WorkflowNode>();\n\n // Initialize\n for (const node of nodes) {\n adjList.set(node.id, []);\n inDegree.set(node.id, 0);\n nodeMap.set(node.id, node);\n }\n\n // Build edges from dependencies\n for (const node of nodes) {\n for (const dep of node.dependsOn || []) {\n if (!adjList.has(dep)) {\n throw new Error(\n `Node \"${node.id}\" depends on unknown node \"${dep}\"`,\n );\n }\n adjList.get(dep)!.push(node.id);\n inDegree.set(node.id, inDegree.get(node.id)! + 1);\n }\n }\n\n // Also handle implicit sequential dependencies (nodes without explicit deps)\n // If no dependencies specified (undefined), assume sequential order\n // If dependsOn is explicitly set (even to []), respect that choice\n let prevNodeId: string | null = null;\n for (const node of nodes) {\n // Only add implicit deps if:\n // 1. dependsOn is undefined (not explicitly set)\n // 2. No other node explicitly depends on this node\n // 3. This node has no incoming edges yet\n if (node.dependsOn === undefined && prevNodeId) {\n const isDependent = this.hasAnyDependents(nodes, node.id);\n const currentInDegree = inDegree.get(node.id) ?? 0;\n\n if (!isDependent && currentInDegree === 0) {\n // This node is \"floating\" - no explicit deps and nothing depends on it\n // Create implicit dependency on previous node\n adjList.get(prevNodeId)!.push(node.id);\n inDegree.set(node.id, inDegree.get(node.id)! + 1);\n }\n }\n prevNodeId = node.id;\n }\n\n return { adjList, inDegree, nodeMap };\n }\n\n /**\n * Check if any node explicitly depends on the given node\n */\n private hasAnyDependents(nodes: WorkflowNode[], nodeId: string): boolean {\n return nodes.some((n) => n.dependsOn?.includes(nodeId));\n }\n\n /**\n * Get nodes that are ready to execute\n */\n private getReadyNodes(\n inDegree: Map<string, number>,\n nodeStates: Record<string, NodeState>,\n ): string[] {\n const ready: string[] = [];\n\n for (const [nodeId, degree] of inDegree) {\n // Node is ready if:\n // 1. No remaining dependencies (in-degree = 0)\n // 2. Not already completed/running/failed\n const state = nodeStates[nodeId];\n const isReady = degree === 0 &&\n (!state || state.status === \"pending\");\n\n if (isReady) {\n ready.push(nodeId);\n }\n }\n\n return ready;\n }\n\n /**\n * Check if DAG has cycles (using DFS)\n */\n private hasCycle(\n nodes: WorkflowNode[],\n adjList: Map<string, string[]>,\n ): boolean {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (nodeId: string): boolean => {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n\n for (const neighbor of adjList.get(nodeId) || []) {\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true;\n } else if (recursionStack.has(neighbor)) {\n return true;\n }\n }\n\n recursionStack.delete(nodeId);\n return false;\n };\n\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n if (dfs(node.id)) return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if node should be checkpointed\n */\n private shouldCheckpoint(node: WorkflowNode): boolean {\n return node.config.checkpoint ?? false;\n }\n\n /**\n * Create a checkpoint\n */\n private async checkpoint(\n runId: string,\n nodeId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n if (!this.config.checkpointManager) {\n return;\n }\n\n const checkpoint: Checkpoint = {\n id: generateId(\"cp\"),\n nodeId,\n timestamp: new Date(),\n context: structuredClone(context),\n nodeStates: structuredClone(nodeStates),\n };\n\n await this.config.checkpointManager.save(runId, checkpoint);\n }\n}\n", "/**\n * Checkpoint Manager\n *\n * Handles workflow state checkpointing for durability and resume\n */\n\nimport type { Checkpoint, NodeState, WorkflowContext, WorkflowNode } from \"../types.ts\";\nimport { generateId } from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\n\n/**\n * Checkpoint manager configuration\n */\nexport interface CheckpointManagerConfig {\n /** Backend for persisting checkpoints */\n backend: WorkflowBackend;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Resume information returned when resuming from checkpoint\n */\nexport interface ResumeInfo {\n /** Checkpoint to resume from */\n checkpoint: Checkpoint;\n /** Node to start execution from */\n startFromNode: string;\n /** Restored context */\n context: WorkflowContext;\n /** Restored node states */\n nodeStates: Record<string, NodeState>;\n}\n\n/**\n * Checkpoint Manager class\n *\n * Responsible for:\n * - Saving checkpoints after step completion\n * - Loading checkpoints for resume\n * - Determining resume points\n */\nexport class CheckpointManager {\n private config: CheckpointManagerConfig;\n\n constructor(config: CheckpointManagerConfig) {\n this.config = {\n debug: false,\n ...config,\n };\n }\n\n /**\n * Save a checkpoint for a workflow run\n */\n async save(runId: string, checkpoint: Checkpoint): Promise<void> {\n if (this.config.debug) {\n console.log(`[CheckpointManager] Saving checkpoint ${checkpoint.id} for run ${runId}`);\n }\n\n await this.config.backend.saveCheckpoint(runId, checkpoint);\n }\n\n /**\n * Create and save a checkpoint\n */\n async createCheckpoint(\n runId: string,\n nodeId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<Checkpoint> {\n const checkpoint: Checkpoint = {\n id: generateId(\"cp\"),\n nodeId,\n timestamp: new Date(),\n context: structuredClone(context),\n nodeStates: structuredClone(nodeStates),\n };\n\n await this.save(runId, checkpoint);\n\n return checkpoint;\n }\n\n /**\n * Get the latest checkpoint for a workflow run\n */\n async getLatest(runId: string): Promise<Checkpoint | null> {\n return await this.config.backend.getLatestCheckpoint(runId);\n }\n\n /**\n * Get all checkpoints for a workflow run\n */\n async getAll(runId: string): Promise<Checkpoint[]> {\n if (this.config.backend.getCheckpoints) {\n return await this.config.backend.getCheckpoints(runId);\n }\n\n // Fallback: just return latest if getCheckpoints not implemented\n const latest = await this.getLatest(runId);\n return latest ? [latest] : [];\n }\n\n /**\n * Prepare resume information from a checkpoint\n */\n async prepareResume(\n runId: string,\n nodes: WorkflowNode[],\n fromCheckpoint?: string,\n ): Promise<ResumeInfo | null> {\n let checkpoint: Checkpoint | null;\n\n if (fromCheckpoint) {\n // Find specific checkpoint\n const all = await this.getAll(runId);\n checkpoint = all.find((c) => c.id === fromCheckpoint) || null;\n } else {\n // Use latest checkpoint\n checkpoint = await this.getLatest(runId);\n }\n\n if (!checkpoint) {\n return null;\n }\n\n // Find next node to execute after checkpoint\n const startFromNode = this.findNextNode(nodes, checkpoint);\n\n if (!startFromNode) {\n // No more nodes to execute\n return null;\n }\n\n return {\n checkpoint,\n startFromNode,\n context: structuredClone(checkpoint.context),\n nodeStates: structuredClone(checkpoint.nodeStates),\n };\n }\n\n /**\n * Find the next node to execute after a checkpoint\n */\n private findNextNode(\n nodes: WorkflowNode[],\n checkpoint: Checkpoint,\n ): string | null {\n const completedNodeId = checkpoint.nodeId;\n const nodeStates = checkpoint.nodeStates;\n\n // Build node lookup\n const nodeIndex = new Map<string, number>();\n nodes.forEach((node, index) => nodeIndex.set(node.id, index));\n\n // Find the checkpoint node's position\n const checkpointIndex = nodeIndex.get(completedNodeId);\n if (checkpointIndex === undefined) {\n // Checkpoint node not found, start from beginning\n const firstNode = nodes[0];\n return firstNode?.id ?? null;\n }\n\n // Look for the first incomplete node after the checkpoint\n for (let i = checkpointIndex + 1; i < nodes.length; i++) {\n const node = nodes[i];\n if (!node) continue;\n\n const state = nodeStates[node.id];\n\n // Find first node that hasn't completed\n if (!state || state.status === \"pending\") {\n return node.id;\n }\n }\n\n // Also check nodes that depend on the checkpoint node\n for (const node of nodes) {\n if (node.dependsOn?.includes(completedNodeId)) {\n const state = nodeStates[node.id];\n if (!state || state.status === \"pending\") {\n return node.id;\n }\n }\n }\n\n // No incomplete nodes found\n return null;\n }\n\n /**\n * Determine if a node should be checkpointed\n */\n shouldCheckpoint(node: WorkflowNode): boolean {\n const config = node.config;\n\n // Explicit checkpoint configuration\n if (config.checkpoint !== undefined) {\n return config.checkpoint;\n }\n\n // Default checkpointing rules:\n // - Always checkpoint after agent steps\n // - Always checkpoint before wait/approval\n // - Checkpoint after parallel completion\n switch (config.type) {\n case \"step\":\n // Checkpoint agent steps, but not tool steps by default\n return \"agent\" in config && !!config.agent;\n\n case \"wait\":\n // Always checkpoint before waiting\n return true;\n\n case \"parallel\":\n // Checkpoint after all parallel steps complete\n return true;\n\n case \"branch\":\n // Don't checkpoint branches by default\n return false;\n\n case \"subWorkflow\":\n // Always checkpoint after sub-workflow\n return true;\n\n default:\n return false;\n }\n }\n\n /**\n * Clean up old checkpoints (keep only the most recent N)\n */\n async cleanup(runId: string, keepCount: number = 5): Promise<void> {\n const all = await this.getAll(runId);\n\n if (all.length <= keepCount) {\n return;\n }\n\n // Sort by timestamp (newest first)\n all.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n // Get checkpoints to delete (all except the newest keepCount)\n const toDelete = all.slice(keepCount);\n const idsToDelete = toDelete.map((c) => c.id);\n\n if (idsToDelete.length === 0) {\n return;\n }\n\n if (this.config.debug) {\n console.log(\n `[CheckpointManager] Cleaning up ${idsToDelete.length} old checkpoints for run ${runId}`,\n );\n }\n\n // Use batch delete if available, otherwise delete one by one\n if (this.config.backend.deleteCheckpoints) {\n await this.config.backend.deleteCheckpoints(runId, idsToDelete);\n } else if (this.config.backend.deleteCheckpoint) {\n for (const id of idsToDelete) {\n await this.config.backend.deleteCheckpoint(runId, id);\n }\n }\n // If neither method is available, cleanup is a no-op\n }\n}\n", "/**\n * Step Executor\n *\n * Executes individual workflow steps (agents and tools)\n */\n\nimport type { Agent, AgentResponse } from \"../../types/agent.ts\";\nimport type { Tool } from \"../../types/tool.ts\";\nimport type { NodeState, StepNodeConfig, WorkflowContext, WorkflowNode } from \"../types.ts\";\nimport { parseDuration } from \"../types.ts\";\nimport type { BlobStorage } from \"../blob/types.ts\";\n\n/** Default timeout for workflow steps (5 minutes) */\nconst DEFAULT_STEP_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * Agent registry for looking up agents by ID\n */\nexport interface AgentRegistry {\n get(id: string): Agent | undefined;\n /** Optional: List all registered agent IDs (for error messages) */\n list?(): string[];\n}\n\n/**\n * Tool registry for looking up tools by ID\n */\nexport interface ToolRegistry {\n get(id: string): Tool | undefined;\n /** Optional: List all registered tool IDs (for error messages) */\n list?(): string[];\n}\n\n/**\n * Step executor configuration\n */\nexport interface StepExecutorConfig {\n /** Agent registry for looking up agents */\n agentRegistry?: AgentRegistry;\n /** Tool registry for looking up tools */\n toolRegistry?: ToolRegistry;\n /** Default timeout for steps (in milliseconds) */\n defaultTimeout?: number;\n /** Blob storage access */\n blobStorage?: BlobStorage;\n /** Callback when step starts */\n onStepStart?: (nodeId: string, input: unknown) => void;\n /** Callback when step completes */\n onStepComplete?: (nodeId: string, output: unknown) => void;\n /** Callback when step fails */\n onStepError?: (nodeId: string, error: Error) => void;\n}\n\n/**\n * Result of executing a step\n */\nexport interface StepResult {\n /** Whether the step succeeded */\n success: boolean;\n /** Output from the step (if successful) */\n output?: unknown;\n /** Error message (if failed) */\n error?: string;\n /** Execution time in milliseconds */\n executionTime: number;\n}\n\n/**\n * Step Executor class\n *\n * Responsible for executing individual workflow steps by invoking\n * the appropriate agent or tool.\n */\nexport class StepExecutor {\n private config: StepExecutorConfig;\n\n constructor(config: StepExecutorConfig = {}) {\n this.config = {\n defaultTimeout: DEFAULT_STEP_TIMEOUT_MS,\n ...config,\n };\n }\n\n /**\n * Execute a step node\n */\n async execute(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<StepResult> {\n const startTime = Date.now();\n const config = node.config as StepNodeConfig;\n\n if (config.type !== \"step\") {\n throw new Error(\n `StepExecutor can only execute 'step' nodes, but node \"${node.id}\" has type '${config.type}'. ` +\n `This is likely a bug in the DAG executor routing.`,\n );\n }\n\n try {\n // Notify start\n const resolvedInput = await this.resolveInput(config.input, context);\n this.config.onStepStart?.(node.id, resolvedInput);\n\n // Execute with timeout\n const timeout = config.timeout ? parseDuration(config.timeout) : this.config.defaultTimeout!;\n\n const output = await this.executeWithTimeout(\n () => this.executeStep(config, resolvedInput, context),\n timeout,\n node.id,\n );\n\n // Notify completion\n this.config.onStepComplete?.(node.id, output);\n\n return {\n success: true,\n output,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Notify error\n this.config.onStepError?.(node.id, error as Error);\n\n return {\n success: false,\n error: errorMessage,\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Resolve step input from context\n */\n private async resolveInput(\n input: StepNodeConfig[\"input\"],\n context: WorkflowContext,\n ): Promise<unknown> {\n if (input === undefined) {\n // Default to the original workflow input\n return context.input;\n }\n\n if (typeof input === \"function\") {\n return await input(context);\n }\n\n return input;\n }\n\n /**\n * Execute step with timeout\n *\n * Uses Promise.race() to properly handle timeout cleanup.\n * The timeout is always cleared in the finally block to prevent memory leaks.\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeout: number,\n nodeId: string,\n ): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Step \"${nodeId}\" timed out after ${timeout}ms`));\n }, timeout);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Execute the actual step (agent or tool)\n */\n private async executeStep(\n config: StepNodeConfig,\n input: unknown,\n context: WorkflowContext,\n ): Promise<unknown> {\n if (config.agent) {\n return await this.executeAgent(config.agent, input, context);\n }\n\n if (config.tool) {\n return await this.executeTool(config.tool, input);\n }\n\n throw new Error(\"Step must have either 'agent' or 'tool' specified\");\n }\n\n /**\n * Execute an agent\n */\n private async executeAgent(\n agent: string | Agent,\n input: unknown,\n context: WorkflowContext,\n ): Promise<unknown> {\n // Resolve agent from registry if string\n const resolvedAgent = typeof agent === \"string\" ? this.getAgent(agent) : agent;\n\n // Prepare input for agent\n const agentInput = typeof input === \"string\" ? input : JSON.stringify(input);\n\n // Execute agent\n const response: AgentResponse = await resolvedAgent.generate({\n input: agentInput,\n context,\n });\n\n // Return the agent's response\n return {\n text: response.text,\n toolCalls: response.toolCalls,\n status: response.status,\n usage: response.usage,\n };\n }\n\n /**\n * Execute a tool\n */\n private async executeTool(\n tool: string | Tool,\n input: unknown,\n ): Promise<unknown> {\n // Resolve tool from registry if string\n const resolvedTool = typeof tool === \"string\" ? this.getTool(tool) : tool;\n\n // Execute tool\n const result = await resolvedTool.execute(\n input as Record<string, unknown>,\n {\n agentId: \"workflow\",\n blobStorage: this.config.blobStorage,\n },\n );\n\n return result;\n }\n\n /**\n * Get agent from registry\n */\n private getAgent(id: string): Agent {\n if (!this.config.agentRegistry) {\n throw new Error(\n `Agent registry not configured. Cannot resolve agent \"${id}\"`,\n );\n }\n\n const agent = this.config.agentRegistry.get(id);\n if (!agent) {\n const available = this.config.agentRegistry.list?.() ?? [];\n const suggestion = available.length > 0\n ? ` Available agents: ${available.slice(0, 5).join(\", \")}${\n available.length > 5 ? \"...\" : \"\"\n }`\n : \" No agents are registered.\";\n throw new Error(`Agent not found: \"${id}\".${suggestion}`);\n }\n\n return agent;\n }\n\n /**\n * Get tool from registry\n */\n private getTool(id: string): Tool {\n if (!this.config.toolRegistry) {\n throw new Error(\n `Tool registry not configured. Cannot resolve tool \"${id}\"`,\n );\n }\n\n const tool = this.config.toolRegistry.get(id);\n if (!tool) {\n const available = this.config.toolRegistry.list?.() ?? [];\n const suggestion = available.length > 0\n ? ` Available tools: ${available.slice(0, 5).join(\", \")}${\n available.length > 5 ? \"...\" : \"\"\n }`\n : \" No tools are registered.\";\n throw new Error(`Tool not found: \"${id}\".${suggestion}`);\n }\n\n return tool;\n }\n\n /**\n * Check if a step should be skipped\n */\n async shouldSkip(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<boolean> {\n const config = node.config;\n\n if (!config.skip) {\n return false;\n }\n\n return await config.skip(context);\n }\n\n /**\n * Create initial node state\n */\n createInitialState(nodeId: string): NodeState {\n return {\n nodeId,\n status: \"pending\",\n attempt: 0,\n };\n }\n\n /**\n * Update node state for running\n */\n createRunningState(nodeId: string, input: unknown, attempt: number): NodeState {\n return {\n nodeId,\n status: \"running\",\n input,\n attempt,\n startedAt: new Date(),\n };\n }\n\n /**\n * Update node state for completion\n *\n * @param result - The step execution result\n * @param previousState - The previous node state (contains nodeId)\n */\n createCompletedState(\n result: StepResult,\n previousState: NodeState,\n ): NodeState {\n if (result.success) {\n return {\n ...previousState,\n status: \"completed\",\n output: result.output,\n completedAt: new Date(),\n };\n }\n\n return {\n ...previousState,\n status: \"failed\",\n error: result.error,\n completedAt: new Date(),\n };\n }\n\n /**\n * Update node state for skip\n */\n createSkippedState(nodeId: string): NodeState {\n return {\n nodeId,\n status: \"skipped\",\n attempt: 0,\n completedAt: new Date(),\n };\n }\n}\n", "/**\n * Workflow Executor\n *\n * Main orchestrator for executing durable workflows\n */\n\nimport type {\n BlobResolver,\n NodeState,\n StepBuilderContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n WorkflowRun,\n WorkflowStatus,\n} from \"../types.ts\";\nimport { generateId, parseDuration } from \"../types.ts\";\nimport { hasLockSupport, type WorkflowBackend } from \"../backends/types.ts\";\nimport { DAGExecutor } from \"./dag-executor.ts\";\nimport { CheckpointManager } from \"./checkpoint-manager.ts\";\nimport { StepExecutor, type StepExecutorConfig } from \"./step-executor.ts\";\nimport type { BlobStorage } from \"../blob/types.ts\";\n\n/**\n * Workflow executor configuration\n */\nexport interface WorkflowExecutorConfig {\n /** Backend for persistence */\n backend: WorkflowBackend;\n /** Blob storage for large data */\n blobStorage?: BlobStorage;\n /** Step executor configuration */\n stepExecutor?: StepExecutorConfig;\n /** Maximum concurrent parallel executions */\n maxConcurrency?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Lock duration in milliseconds for distributed execution (default: 30000) */\n lockDuration?: number;\n /** Enable distributed locking (default: true if backend supports it) */\n enableLocking?: boolean;\n /** Callback when workflow starts */\n onStart?: (run: WorkflowRun) => void;\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n /** Callback when workflow fails */\n onError?: (run: WorkflowRun, error: Error) => void;\n /** Callback when workflow is waiting */\n onWaiting?: (run: WorkflowRun, nodeId: string) => void;\n}\n\n/**\n * Handle for a running workflow\n */\nexport interface WorkflowHandle<TOutput = unknown> {\n /** Run ID */\n runId: string;\n /** Get current status */\n status(): Promise<WorkflowRun>;\n /** Wait for completion and get result */\n result(): Promise<TOutput>;\n /** Cancel the workflow */\n cancel(): Promise<void>;\n}\n\n/**\n * Workflow Executor class\n *\n * Main entry point for executing workflows. Handles:\n * - Starting new workflow runs\n * - Resuming from checkpoints\n * - Coordinating DAG execution\n * - Managing workflow lifecycle\n */\nexport class WorkflowExecutor {\n private config: WorkflowExecutorConfig;\n private stepExecutor: StepExecutor;\n private checkpointManager: CheckpointManager;\n private dagExecutor: DAGExecutor;\n private workflows = new Map<string, WorkflowDefinition<any, any>>();\n private blobResolver?: BlobResolver;\n\n /** Default lock duration: 30 seconds */\n private static readonly DEFAULT_LOCK_DURATION = 30000;\n\n constructor(config: WorkflowExecutorConfig) {\n this.config = {\n maxConcurrency: 10,\n debug: false,\n lockDuration: WorkflowExecutor.DEFAULT_LOCK_DURATION,\n ...config,\n };\n\n // Initialize components\n this.stepExecutor = new StepExecutor({\n ...this.config.stepExecutor,\n blobStorage: this.config.blobStorage,\n });\n\n this.checkpointManager = new CheckpointManager({\n backend: this.config.backend,\n debug: this.config.debug,\n });\n\n this.dagExecutor = new DAGExecutor({\n stepExecutor: this.stepExecutor,\n checkpointManager: this.checkpointManager,\n maxConcurrency: this.config.maxConcurrency,\n debug: this.config.debug,\n // onWaiting is intentionally a no-op here - waiting state is handled\n // by executeAsync() after DAG execution returns with waiting: true\n onWaiting: () => {},\n });\n\n if (this.config.blobStorage) {\n const bs = this.config.blobStorage;\n this.blobResolver = {\n getText: (ref) => ref.__kind === \"blob\" ? bs.getText(ref.id) : Promise.resolve(null),\n getBytes: (ref) => ref.__kind === \"blob\" ? bs.getBytes(ref.id) : Promise.resolve(null),\n getStream: (ref) => ref.__kind === \"blob\" ? bs.getStream(ref.id) : Promise.resolve(null),\n stat: (ref) => ref.__kind === \"blob\" ? bs.stat(ref.id) : Promise.resolve(null),\n delete: (ref) => ref.__kind === \"blob\" ? bs.delete(ref.id) : Promise.resolve(undefined),\n };\n }\n }\n\n /**\n * Register a workflow definition\n */\n register<TInput, TOutput>(workflow: WorkflowDefinition<TInput, TOutput>): void {\n this.workflows.set(workflow.id, workflow);\n }\n\n /**\n * Get a registered workflow\n */\n getWorkflow(id: string): WorkflowDefinition<any, any> | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Start a new workflow run\n */\n async start<TInput, TOutput>(\n workflowId: string,\n input: TInput,\n options?: { runId?: string },\n ): Promise<WorkflowHandle<TOutput>> {\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${workflowId}`);\n }\n\n // Validate input if schema provided\n if (workflow.inputSchema) {\n workflow.inputSchema.parse(input);\n }\n\n // Create run\n const run: WorkflowRun<TInput, TOutput> = {\n id: options?.runId || generateId(\"run\"),\n workflowId,\n version: workflow.version,\n status: \"pending\",\n input,\n nodeStates: {},\n currentNodes: [],\n context: { input },\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n };\n\n // Persist run\n await this.config.backend.createRun(run);\n\n // Start execution asynchronously\n this.executeAsync(run.id).catch((error) => {\n console.error(`Workflow ${run.id} failed:`, error);\n });\n\n return this.createHandle<TOutput>(run.id);\n }\n\n /**\n * Resume a paused/waiting workflow\n */\n async resume(runId: string, fromCheckpoint?: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status !== \"waiting\" && run.status !== \"pending\") {\n throw new Error(\n `Cannot resume workflow run \"${runId}\": current status is \"${run.status}\". ` +\n `Only runs in \"waiting\" or \"pending\" status can be resumed.`,\n );\n }\n\n // Get workflow definition\n const workflow = this.workflows.get(run.workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${run.workflowId}`);\n }\n\n // Get nodes\n const nodes = this.resolveNodes(workflow, run.context);\n\n // Get resume point\n const resumeInfo = await this.checkpointManager.prepareResume(\n runId,\n nodes,\n fromCheckpoint,\n );\n\n // If an explicit checkpoint was requested but not found, throw error\n if (fromCheckpoint && !resumeInfo) {\n throw new Error(\n `Checkpoint \"${fromCheckpoint}\" not found for run \"${runId}\". ` +\n `Cannot resume from non-existent checkpoint.`,\n );\n }\n\n if (resumeInfo) {\n // Update run state from checkpoint\n await this.config.backend.updateRun(runId, {\n status: \"running\",\n context: resumeInfo.context,\n nodeStates: resumeInfo.nodeStates,\n });\n }\n\n // Resume execution\n await this.executeAsync(runId, resumeInfo?.startFromNode);\n }\n\n /**\n * Execute a workflow run asynchronously\n *\n * Uses distributed locking (when backend supports it) to prevent\n * concurrent execution of the same workflow run.\n */\n async executeAsync(runId: string, startFromNode?: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Get workflow definition\n const workflow = this.workflows.get(run.workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${run.workflowId}`);\n }\n\n // Try to acquire lock if backend supports it and locking is enabled\n const useLocking = this.config.enableLocking !== false &&\n hasLockSupport(this.config.backend);\n const lockDuration = this.config.lockDuration!;\n\n if (useLocking) {\n const acquired = await this.config.backend.acquireLock!(runId, lockDuration);\n if (!acquired) {\n throw new Error(\n `Cannot execute workflow run \"${runId}\": another worker is already executing it. ` +\n `This can happen when multiple workers try to execute the same run concurrently.`,\n );\n }\n\n if (this.config.debug) {\n console.log(`[WorkflowExecutor] Acquired lock for run: ${runId}`);\n }\n }\n\n try {\n // Update status to running\n await this.config.backend.updateRun(runId, {\n status: \"running\",\n startedAt: run.startedAt || new Date(),\n });\n\n // Notify start\n const updatedRun = await this.config.backend.getRun(runId);\n this.config.onStart?.(updatedRun!);\n\n // Resolve workflow nodes\n const nodes = this.resolveNodes(workflow, run.context);\n\n // Execute with timeout if configured\n const result = await this.executeWithTimeout(\n () => this.dagExecutor.execute(nodes, run as WorkflowRun, startFromNode),\n workflow.timeout,\n );\n\n // Update run based on result\n if (result.completed) {\n // Workflow completed successfully\n const finalRun = await this.completeRun(\n runId,\n result.context,\n result.nodeStates,\n );\n\n // Validate output if schema provided\n if (workflow.outputSchema) {\n workflow.outputSchema.parse(finalRun.output);\n }\n\n // Call completion handler\n await workflow.onComplete?.(finalRun.output, finalRun.context);\n this.config.onComplete?.(finalRun);\n } else if (result.waiting) {\n // Workflow is waiting for approval/event\n await this.pauseRun(\n runId,\n result.waitingNode!,\n result.context,\n result.nodeStates,\n );\n\n const pausedRun = await this.config.backend.getRun(runId);\n this.config.onWaiting?.(pausedRun!, result.waitingNode!);\n } else {\n // Workflow failed\n const error = new Error(result.error || \"Unknown error\");\n await this.failRun(runId, error, result.context, result.nodeStates);\n\n await workflow.onError?.(error, result.context);\n this.config.onError?.(run, error);\n }\n } catch (error) {\n // Unexpected error during execution\n const err = error instanceof Error ? error : new Error(String(error));\n await this.failRun(runId, err, run.context, run.nodeStates);\n\n await workflow.onError?.(err, run.context);\n this.config.onError?.(run, err);\n\n throw error;\n } finally {\n // Always release lock when done\n if (useLocking) {\n await this.config.backend.releaseLock!(runId);\n\n if (this.config.debug) {\n console.log(`[WorkflowExecutor] Released lock for run: ${runId}`);\n }\n }\n }\n }\n\n /**\n * Resolve workflow nodes from definition\n */\n private resolveNodes(\n workflow: WorkflowDefinition,\n context: WorkflowContext,\n ): WorkflowNode[] {\n let nodes: WorkflowNode[];\n\n if (Array.isArray(workflow.steps)) {\n nodes = workflow.steps;\n } else {\n // Dynamic steps - call the function\n if (!this.config.blobStorage) {\n // Warn if blobStorage is missing but dynamic steps might need it?\n // For now, we allow it to be undefined if user doesn't use it.\n }\n\n const builderContext: StepBuilderContext = {\n input: context.input,\n context,\n blobStorage: this.config.blobStorage,\n blob: this.blobResolver,\n };\n nodes = workflow.steps(builderContext);\n }\n\n // Validate resolved nodes\n this.validateNodes(nodes, workflow.id);\n\n return nodes;\n }\n\n /**\n * Validate workflow nodes\n */\n private validateNodes(nodes: WorkflowNode[], workflowId: string): void {\n if (!Array.isArray(nodes)) {\n throw new Error(`Workflow \"${workflowId}\" steps must resolve to an array`);\n }\n\n if (nodes.length === 0) {\n throw new Error(`Workflow \"${workflowId}\" must have at least one step`);\n }\n\n const seenIds = new Set<string>();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (!node) {\n throw new Error(`Workflow \"${workflowId}\" has undefined node at index ${i}`);\n }\n\n if (!node.id || typeof node.id !== \"string\") {\n throw new Error(`Workflow \"${workflowId}\" node at index ${i} has invalid ID`);\n }\n\n if (seenIds.has(node.id)) {\n throw new Error(`Workflow \"${workflowId}\" has duplicate node ID: \"${node.id}\"`);\n }\n seenIds.add(node.id);\n\n if (!node.config || typeof node.config !== \"object\") {\n throw new Error(`Workflow \"${workflowId}\" node \"${node.id}\" has invalid config`);\n }\n\n if (!node.config.type) {\n throw new Error(`Workflow \"${workflowId}\" node \"${node.id}\" config missing type`);\n }\n }\n }\n\n /**\n * Execute with optional timeout\n *\n * Uses Promise.race() to properly handle timeout cleanup.\n * The timeout is always cleared in the finally block to prevent memory leaks.\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeout?: string | number,\n ): Promise<T> {\n if (!timeout) {\n return fn();\n }\n\n const timeoutMs = parseDuration(timeout);\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Workflow timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Mark run as completed\n */\n private async completeRun(\n runId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<WorkflowRun> {\n // Determine output (last node's output or accumulated context)\n const output = this.determineOutput(context);\n\n await this.config.backend.updateRun(runId, {\n status: \"completed\" as WorkflowStatus,\n output,\n context,\n nodeStates,\n completedAt: new Date(),\n });\n\n return (await this.config.backend.getRun(runId))!;\n }\n\n /**\n * Mark run as failed\n */\n private async failRun(\n runId: string,\n error: Error,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n await this.config.backend.updateRun(runId, {\n status: \"failed\" as WorkflowStatus,\n context,\n nodeStates,\n error: {\n message: error.message,\n stack: error.stack,\n },\n completedAt: new Date(),\n });\n }\n\n /**\n * Mark run as waiting\n */\n private async pauseRun(\n runId: string,\n waitingNode: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n await this.config.backend.updateRun(runId, {\n status: \"waiting\" as WorkflowStatus,\n currentNodes: [waitingNode],\n context,\n nodeStates,\n });\n }\n\n /**\n * Determine workflow output from context\n */\n private determineOutput(context: WorkflowContext): unknown {\n // Remove 'input' and return the rest as output\n const { input: _input, ...rest } = context;\n return rest;\n }\n\n /**\n * Create a handle for a workflow run\n */\n private createHandle<TOutput>(runId: string): WorkflowHandle<TOutput> {\n return {\n runId,\n status: () => this.config.backend.getRun(runId) as Promise<WorkflowRun>,\n result: () => this.waitForResult<TOutput>(runId),\n cancel: () => this.cancel(runId),\n };\n }\n\n /**\n * Wait for workflow result\n */\n private async waitForResult<TOutput>(\n runId: string,\n pollInterval: number = 1000,\n ): Promise<TOutput> {\n while (true) {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status === \"completed\") {\n return run.output as TOutput;\n }\n\n if (run.status === \"failed\") {\n throw new Error(run.error?.message || \"Workflow failed\");\n }\n\n if (run.status === \"cancelled\") {\n throw new Error(\"Workflow was cancelled\");\n }\n\n // Wait before polling again\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n\n /**\n * Cancel a workflow run\n */\n async cancel(runId: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status === \"completed\" || run.status === \"failed\") {\n throw new Error(\n `Cannot cancel workflow run \"${runId}\": run has already ${run.status}. ` +\n `Only active runs (pending, running, waiting) can be cancelled.`,\n );\n }\n\n await this.config.backend.updateRun(runId, {\n status: \"cancelled\" as WorkflowStatus,\n completedAt: new Date(),\n });\n }\n\n /**\n * Get workflow run status\n */\n getStatus(runId: string): Promise<WorkflowRun | null> {\n return this.config.backend.getRun(runId);\n }\n\n /**\n * List workflow runs\n */\n listRuns(options?: {\n workflowId?: string;\n status?: WorkflowStatus | WorkflowStatus[];\n limit?: number;\n }): Promise<WorkflowRun[]> {\n return this.config.backend.listRuns({\n workflowId: options?.workflowId,\n status: options?.status,\n limit: options?.limit,\n });\n }\n}\n", "/**\n * Approval Manager\n *\n * Handles human-in-the-loop approval workflows\n */\n\nimport type {\n ApprovalDecision,\n PendingApproval,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowRun,\n} from \"../types.ts\";\nimport { generateId, parseDuration } from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\nimport type { WorkflowExecutor } from \"../executor/workflow-executor.ts\";\n\n/**\n * Approval notification callback\n */\nexport type ApprovalNotifier = (\n approval: PendingApproval,\n run: WorkflowRun,\n) => Promise<void>;\n\n/**\n * Approval manager configuration\n */\nexport interface ApprovalManagerConfig {\n /** Backend for persistence */\n backend: WorkflowBackend;\n /** Workflow executor for resuming after approval */\n executor?: WorkflowExecutor;\n /** Notification callback */\n notifier?: ApprovalNotifier;\n /** Check expired approvals interval (ms) */\n expirationCheckInterval?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Approval request result\n */\nexport interface ApprovalRequest {\n /** Approval ID */\n approvalId: string;\n /** Run ID */\n runId: string;\n /** Node ID */\n nodeId: string;\n /** Message for approver */\n message: string;\n /** Payload with context */\n payload: unknown;\n /** When approval expires */\n expiresAt?: Date;\n}\n\n/**\n * Approval Manager class\n *\n * Responsible for:\n * - Creating pending approvals\n * - Processing approval decisions\n * - Resuming workflows after approval\n * - Handling approval timeouts\n */\nexport class ApprovalManager {\n private config: ApprovalManagerConfig;\n private expirationTimer?: ReturnType<typeof setInterval>;\n private destroyed = false;\n\n constructor(config: ApprovalManagerConfig) {\n this.config = {\n expirationCheckInterval: 60000, // Check every minute\n debug: false,\n ...config,\n };\n\n // Start expiration checker if interval is set\n if (this.config.expirationCheckInterval && this.config.expirationCheckInterval > 0) {\n this.startExpirationChecker();\n }\n }\n\n /**\n * Create a pending approval request\n */\n async createApproval(\n run: WorkflowRun,\n nodeId: string,\n waitConfig: WaitNodeConfig,\n context: WorkflowContext,\n ): Promise<ApprovalRequest> {\n // Resolve payload if it's a function\n const payload = typeof waitConfig.payload === \"function\"\n ? await waitConfig.payload(context)\n : waitConfig.payload;\n\n // Calculate expiration\n const expiresAt = waitConfig.timeout\n ? new Date(Date.now() + parseDuration(waitConfig.timeout))\n : undefined;\n\n const approval: PendingApproval = {\n id: generateId(\"apr\"),\n nodeId,\n message: waitConfig.message || \"Approval required\",\n payload,\n approvers: waitConfig.approvers,\n requestedAt: new Date(),\n expiresAt,\n status: \"pending\",\n };\n\n if (this.config.debug) {\n console.log(`[ApprovalManager] Creating approval ${approval.id} for run ${run.id}`);\n }\n\n // Save to backend\n await this.config.backend.savePendingApproval(run.id, approval);\n\n // Notify approvers\n if (this.config.notifier) {\n try {\n await this.config.notifier(approval, run);\n } catch (error) {\n console.error(`[ApprovalManager] Failed to notify approvers:`, error);\n }\n }\n\n return {\n approvalId: approval.id,\n runId: run.id,\n nodeId,\n message: approval.message,\n payload: approval.payload,\n expiresAt: approval.expiresAt,\n };\n }\n\n /**\n * Get pending approval by ID\n */\n async getApproval(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null> {\n if (this.config.backend.getPendingApproval) {\n return this.config.backend.getPendingApproval(runId, approvalId);\n }\n\n // Fallback: get all and find\n const all = await this.config.backend.getPendingApprovals(runId);\n return all.find((a) => a.id === approvalId) || null;\n }\n\n /**\n * Get all pending approvals for a run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n return this.config.backend.getPendingApprovals(runId);\n }\n\n /**\n * Process an approval decision\n */\n async processDecision(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void> {\n if (this.config.debug) {\n console.log(\n `[ApprovalManager] Processing decision for ${approvalId}: ${\n decision.approved ? \"approved\" : \"rejected\"\n }`,\n );\n }\n\n // Get the approval\n const approval = await this.getApproval(runId, approvalId);\n if (!approval) {\n throw new Error(`Approval not found: ${approvalId}`);\n }\n\n // Check if already decided\n if (approval.status !== \"pending\") {\n throw new Error(`Approval already processed: ${approval.status}`);\n }\n\n // Check if expired\n if (approval.expiresAt && new Date() > approval.expiresAt) {\n throw new Error(\"Approval has expired\");\n }\n\n // Check if approver is authorized\n if (\n approval.approvers &&\n approval.approvers.length > 0 &&\n !approval.approvers.includes(decision.approver)\n ) {\n throw new Error(\"Not authorized to approve this request\");\n }\n\n // Update the approval\n await this.config.backend.updateApproval(runId, approvalId, decision);\n\n // Get the run\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Update run context with approval result\n const updatedContext = {\n ...run.context,\n [approval.nodeId]: {\n approved: decision.approved,\n approver: decision.approver,\n comment: decision.comment,\n decidedAt: new Date().toISOString(),\n },\n };\n\n // Update node state\n const updatedNodeStates = {\n ...run.nodeStates,\n [approval.nodeId]: {\n nodeId: approval.nodeId,\n status: \"completed\" as const,\n output: {\n approved: decision.approved,\n approver: decision.approver,\n comment: decision.comment,\n },\n attempt: 1,\n completedAt: new Date(),\n },\n };\n\n await this.config.backend.updateRun(runId, {\n context: updatedContext,\n nodeStates: updatedNodeStates,\n });\n\n // Resume workflow if approved and executor is available\n if (decision.approved && this.config.executor) {\n try {\n await this.config.executor.resume(runId);\n } catch (error) {\n console.error(`[ApprovalManager] Failed to resume workflow:`, error);\n throw error;\n }\n } else if (!decision.approved) {\n // If rejected, fail the workflow\n await this.config.backend.updateRun(runId, {\n status: \"failed\",\n error: {\n message: `Approval \"${approvalId}\" was rejected${\n decision.comment ? `: ${decision.comment}` : \"\"\n }`,\n },\n completedAt: new Date(),\n });\n }\n }\n\n /**\n * Approve an approval request\n */\n async approve(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n await this.processDecision(runId, approvalId, {\n approved: true,\n approver,\n comment,\n });\n }\n\n /**\n * Reject an approval request\n */\n async reject(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n await this.processDecision(runId, approvalId, {\n approved: false,\n approver,\n comment,\n });\n }\n\n /**\n * List all pending approvals across workflows\n */\n listAllPending(filter?: {\n workflowId?: string;\n approver?: string;\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n if (this.config.backend.listPendingApprovals) {\n return this.config.backend.listPendingApprovals({\n ...filter,\n status: \"pending\",\n });\n }\n\n // Fallback: not supported by backend\n console.warn(\n \"[ApprovalManager] listPendingApprovals not supported by backend\",\n );\n return Promise.resolve([]);\n }\n\n /**\n * Check and expire stale approvals\n */\n async checkExpiredApprovals(): Promise<void> {\n // Guard against post-stop execution\n if (this.destroyed) {\n return;\n }\n\n if (!this.config.backend.listPendingApprovals) {\n return;\n }\n\n const pending = await this.config.backend.listPendingApprovals({\n status: \"pending\",\n });\n\n const now = new Date();\n\n for (const { runId, approval } of pending) {\n if (approval.expiresAt && now > approval.expiresAt) {\n if (this.config.debug) {\n console.log(`[ApprovalManager] Expiring approval ${approval.id}`);\n }\n\n // Mark as expired\n await this.config.backend.updateApproval(runId, approval.id, {\n approved: false,\n approver: \"system\",\n comment: \"Approval expired\",\n });\n\n // Fail the workflow\n await this.config.backend.updateRun(runId, {\n status: \"failed\",\n error: {\n message: `Approval \"${approval.id}\" expired`,\n },\n completedAt: new Date(),\n });\n }\n }\n }\n\n /**\n * Start the expiration checker timer\n */\n private startExpirationChecker(): void {\n this.expirationTimer = setInterval(() => {\n this.checkExpiredApprovals().catch((error) => {\n console.error(`[ApprovalManager] Expiration check failed:`, error);\n });\n }, this.config.expirationCheckInterval);\n }\n\n /**\n * Stop the approval manager\n */\n stop(): void {\n this.destroyed = true;\n if (this.expirationTimer) {\n clearInterval(this.expirationTimer);\n this.expirationTimer = undefined;\n }\n }\n}\n", "/**\n * Workflow Client\n *\n * High-level API for interacting with workflows\n */\n\nimport type {\n PendingApproval,\n RunFilter,\n WorkflowDefinition,\n WorkflowRun,\n WorkflowStatus,\n} from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\nimport { MemoryBackend } from \"../backends/memory.ts\";\nimport {\n WorkflowExecutor,\n type WorkflowExecutorConfig,\n type WorkflowHandle,\n} from \"../executor/workflow-executor.ts\";\nimport { ApprovalManager, type ApprovalManagerConfig } from \"../runtime/approval-manager.ts\";\nimport type { Workflow } from \"../dsl/workflow.ts\";\n\n/**\n * Workflow client configuration\n */\nexport interface WorkflowClientConfig {\n /** Backend for persistence (default: MemoryBackend) */\n backend?: WorkflowBackend;\n /** Executor configuration */\n executor?: Partial<WorkflowExecutorConfig>;\n /** Approval manager configuration */\n approval?: Partial<ApprovalManagerConfig>;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Workflow Client class\n *\n * The main entry point for working with workflows.\n * Provides a simple API for:\n * - Registering workflow definitions\n * - Starting and managing workflow runs\n * - Handling approvals\n */\nexport class WorkflowClient {\n private backend: WorkflowBackend;\n private executor: WorkflowExecutor;\n private approvalManager: ApprovalManager;\n private debug: boolean;\n\n constructor(config: WorkflowClientConfig = {}) {\n this.debug = config.debug ?? false;\n this.backend = config.backend ?? new MemoryBackend({ debug: this.debug });\n\n // Initialize executor\n this.executor = new WorkflowExecutor({\n backend: this.backend,\n debug: this.debug,\n ...config.executor,\n });\n\n // Initialize approval manager\n this.approvalManager = new ApprovalManager({\n backend: this.backend,\n executor: this.executor,\n debug: this.debug,\n ...config.approval,\n });\n }\n\n // =========================================================================\n // Workflow Registration\n // =========================================================================\n\n /**\n * Register a workflow definition\n */\n register(\n workflow: Workflow | WorkflowDefinition,\n ): void {\n const definition = \"definition\" in workflow ? workflow.definition : workflow;\n\n this.executor.register(definition as WorkflowDefinition);\n\n if (this.debug) {\n console.log(`[WorkflowClient] Registered workflow: ${definition.id}`);\n }\n }\n\n /**\n * Register multiple workflows\n */\n registerAll(\n workflows: Array<Workflow | WorkflowDefinition>,\n ): void {\n for (const workflow of workflows) {\n this.register(workflow);\n }\n }\n\n // =========================================================================\n // Workflow Execution\n // =========================================================================\n\n /**\n * Start a new workflow run\n *\n * @example\n * ```typescript\n * const handle = await client.start('content-pipeline', {\n * topic: 'AI Safety',\n * requiresApproval: true,\n * });\n *\n * const result = await handle.result();\n * ```\n */\n start<TInput, TOutput = unknown>(\n workflowId: string,\n input: TInput,\n options?: { runId?: string },\n ): Promise<WorkflowHandle<TOutput>> {\n return this.executor.start<TInput, TOutput>(workflowId, input, options);\n }\n\n /**\n * Resume a paused/waiting workflow\n */\n resume(runId: string): Promise<void> {\n return this.executor.resume(runId);\n }\n\n /**\n * Cancel a workflow run\n */\n cancel(runId: string): Promise<void> {\n return this.executor.cancel(runId);\n }\n\n // =========================================================================\n // Run Management\n // =========================================================================\n\n /**\n * Get a workflow run by ID\n */\n getRun(runId: string): Promise<WorkflowRun | null> {\n return this.backend.getRun(runId);\n }\n\n /**\n * List workflow runs\n */\n listRuns(filter?: RunFilter): Promise<WorkflowRun[]> {\n return this.backend.listRuns(filter ?? {});\n }\n\n /**\n * Get runs by status\n */\n getRunsByStatus(\n status: WorkflowStatus | WorkflowStatus[],\n limit?: number,\n ): Promise<WorkflowRun[]> {\n return this.backend.listRuns({ status, limit });\n }\n\n /**\n * Get runs for a specific workflow\n */\n getRunsForWorkflow(\n workflowId: string,\n limit?: number,\n ): Promise<WorkflowRun[]> {\n return this.backend.listRuns({ workflowId, limit });\n }\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n /**\n * Get pending approvals for a run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n return this.approvalManager.getPendingApprovals(runId);\n }\n\n /**\n * Approve an approval request\n *\n * @example\n * ```typescript\n * await client.approve(runId, approvalId, 'user@example.com', 'Looks good!');\n * ```\n */\n approve(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n return this.approvalManager.approve(runId, approvalId, approver, comment);\n }\n\n /**\n * Reject an approval request\n */\n reject(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n return this.approvalManager.reject(runId, approvalId, approver, comment);\n }\n\n /**\n * List all pending approvals across workflows\n */\n listAllPendingApprovals(filter?: {\n workflowId?: string;\n approver?: string;\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n return this.approvalManager.listAllPending(filter);\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n /**\n * Get the underlying backend\n */\n getBackend(): WorkflowBackend {\n return this.backend;\n }\n\n /**\n * Get the underlying executor\n */\n getExecutor(): WorkflowExecutor {\n return this.executor;\n }\n\n /**\n * Get the underlying approval manager\n */\n getApprovalManager(): ApprovalManager {\n return this.approvalManager;\n }\n\n /**\n * Cleanup and shutdown\n */\n async destroy(): Promise<void> {\n this.approvalManager.stop();\n await this.backend.destroy();\n\n if (this.debug) {\n console.log(\"[WorkflowClient] Destroyed\");\n }\n }\n}\n\n/**\n * Create a workflow client with default configuration\n */\nexport function createWorkflowClient(\n config?: WorkflowClientConfig,\n): WorkflowClient {\n return new WorkflowClient(config);\n}\n", "/**\n * useWorkflow Hook\n *\n * React hook for tracking and interacting with workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflow } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowDashboard({ runId }: { runId: string }) {\n * const {\n * run,\n * status,\n * progress,\n * currentNodes,\n * pendingApprovals,\n * cancel,\n * retry,\n * isLoading,\n * error,\n * } = useWorkflow({ runId });\n *\n * return (\n * <div>\n * <h2>Status: {status}</h2>\n * <p>Progress: {progress}%</p>\n * {pendingApprovals.length > 0 && (\n * <p>{pendingApprovals.length} approvals pending</p>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NodeState, PendingApproval, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflow hook\n */\nexport interface UseWorkflowOptions {\n /** Run ID to track */\n runId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Polling interval in ms (defaults to 2000) */\n pollInterval?: number;\n\n /** Enable automatic polling */\n autoRefresh?: boolean;\n\n /** Callback when status changes */\n onStatusChange?: (status: WorkflowStatus, previousStatus: WorkflowStatus) => void;\n\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n\n /** Callback when workflow fails */\n onError?: (error: Error, run?: WorkflowRun) => void;\n\n /** Callback when approval is required */\n onApprovalRequired?: (approval: PendingApproval) => void;\n}\n\n/**\n * Result from useWorkflow hook\n */\nexport interface UseWorkflowResult {\n /** The workflow run data */\n run: WorkflowRun | null;\n\n /** Current workflow status */\n status: WorkflowStatus;\n\n /** Progress percentage (0-100) */\n progress: number;\n\n /** Currently executing node IDs */\n currentNodes: string[];\n\n /** Node states by node ID */\n nodeStates: Record<string, NodeState>;\n\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n /** Refresh the workflow data */\n refresh: () => Promise<void>;\n\n /** Cancel the workflow */\n cancel: () => Promise<void>;\n\n /** Retry a failed workflow */\n retry: () => Promise<void>;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useWorkflow - Track and interact with a workflow run\n */\nexport function useWorkflow(options: UseWorkflowOptions): UseWorkflowResult {\n const {\n runId,\n apiBase = \"/api/workflows\",\n pollInterval = 2000,\n autoRefresh = true,\n onStatusChange,\n onComplete,\n onError,\n onApprovalRequired,\n } = options;\n\n const [run, setRun] = useState<WorkflowRun | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const previousStatusRef = useRef<WorkflowStatus | null>(null);\n const previousApprovalsRef = useRef<Set<string>>(new Set());\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Fetch workflow data\n */\n const fetchRun = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}`, {\n signal: abortControllerRef.current?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow: ${response.status}`);\n }\n\n const data = await response.json();\n const workflowRun = data as WorkflowRun;\n\n // Check for status changes\n if (previousStatusRef.current && previousStatusRef.current !== workflowRun.status) {\n onStatusChange?.(workflowRun.status, previousStatusRef.current);\n }\n previousStatusRef.current = workflowRun.status;\n\n // Check for completion\n if (workflowRun.status === \"completed\") {\n onComplete?.(workflowRun);\n }\n\n // Check for failures\n if (workflowRun.status === \"failed\") {\n const failedError = new Error(\"Workflow failed\");\n onError?.(failedError, workflowRun);\n }\n\n // Check for new approvals\n if (workflowRun.pendingApprovals) {\n for (const approval of workflowRun.pendingApprovals) {\n if (approval.status === \"pending\" && !previousApprovalsRef.current.has(approval.id)) {\n previousApprovalsRef.current.add(approval.id);\n onApprovalRequired?.(approval);\n }\n }\n }\n\n setRun(workflowRun);\n setError(null);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n }\n }, [runId, apiBase, onStatusChange, onComplete, onError, onApprovalRequired]);\n\n /**\n * Initial fetch and polling setup\n */\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n };\n\n doFetch();\n\n // Set up polling for active workflows\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (autoRefresh) {\n intervalId = setInterval(() => {\n // Only poll if workflow is still active\n const currentStatus = previousStatusRef.current;\n if (currentStatus && ![\"completed\", \"failed\", \"cancelled\"].includes(currentStatus)) {\n fetchRun();\n }\n }, pollInterval);\n }\n\n return () => {\n abortControllerRef.current?.abort();\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [runId, autoRefresh, pollInterval, fetchRun]);\n\n /**\n * Refresh workflow data\n */\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n }, [fetchRun]);\n\n /**\n * Cancel the workflow\n */\n const cancel = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/cancel`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to cancel workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const cancelError = err instanceof Error ? err : new Error(String(err));\n setError(cancelError);\n throw cancelError;\n }\n }, [runId, apiBase, refresh]);\n\n /**\n * Retry a failed workflow\n */\n const retry = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/retry`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to retry workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const retryError = err instanceof Error ? err : new Error(String(err));\n setError(retryError);\n throw retryError;\n }\n }, [runId, apiBase, refresh]);\n\n // Calculate progress\n const calculateProgress = (): number => {\n if (!run?.nodeStates) return 0;\n\n const states = Object.values(run.nodeStates);\n if (states.length === 0) return 0;\n\n const completed = states.filter(\n (s) => s.status === \"completed\" || s.status === \"skipped\",\n ).length;\n\n return Math.round((completed / states.length) * 100);\n };\n\n return {\n run,\n status: run?.status ?? \"pending\",\n progress: calculateProgress(),\n currentNodes: run?.currentNodes ?? [],\n nodeStates: run?.nodeStates ?? {},\n pendingApprovals: run?.pendingApprovals?.filter((a) => a.status === \"pending\") ?? [],\n refresh,\n cancel,\n retry,\n isLoading,\n error,\n };\n}\n", "/**\n * useApproval Hook\n *\n * React hook for handling workflow approval interactions.\n *\n * @example\n * ```tsx\n * import { useApproval } from 'veryfront/ai/workflow/react';\n *\n * function ApprovalUI({ runId, approvalId }: Props) {\n * const {\n * approval,\n * approve,\n * reject,\n * isSubmitting,\n * error,\n * } = useApproval({ runId, approvalId });\n *\n * if (!approval) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <h3>{approval.message}</h3>\n * <p>Requested by: {approval.stepId}</p>\n * <button onClick={() => approve('Looks good!')}>\n * Approve\n * </button>\n * <button onClick={() => reject('Needs changes')}>\n * Reject\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ApprovalDecision, PendingApproval } from \"../types.ts\";\n\n/**\n * Options for useApproval hook\n */\nexport interface UseApprovalOptions {\n /** Workflow run ID */\n runId: string;\n\n /** Approval ID */\n approvalId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Current user/approver name */\n approver?: string;\n\n /** Callback on successful approval/rejection */\n onDecision?: (decision: ApprovalDecision) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useApproval hook\n */\nexport interface UseApprovalResult {\n /** The approval data */\n approval: PendingApproval | null;\n\n /** Approve the request */\n approve: (comment?: string) => Promise<void>;\n\n /** Reject the request */\n reject: (comment?: string) => Promise<void>;\n\n /** Submit a custom decision */\n submitDecision: (decision: ApprovalDecision) => Promise<void>;\n\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n\n /** Loading state for initial fetch */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether the approval is still pending */\n isPending: boolean;\n\n /** Whether the approval has been resolved */\n isResolved: boolean;\n}\n\n/**\n * useApproval - Handle workflow approval interactions\n */\nexport function useApproval(options: UseApprovalOptions): UseApprovalResult {\n const {\n runId,\n approvalId,\n apiBase = \"/api/workflows\",\n approver = \"unknown\",\n onDecision,\n onError,\n } = options;\n\n const [approval, setApproval] = useState<PendingApproval | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch approval data\n */\n useEffect(() => {\n const fetchApproval = async () => {\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch approval: ${response.status}`);\n }\n\n const data = await response.json();\n setApproval(data as PendingApproval);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (runId && approvalId) {\n fetchApproval();\n }\n }, [runId, approvalId, apiBase, onError]);\n\n /**\n * Submit a decision\n */\n const submitDecision = useCallback(\n async (decision: ApprovalDecision) => {\n if (!runId || !approvalId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(decision),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to submit decision: ${response.status}`);\n }\n\n // Update local state\n setApproval((prev) =>\n prev\n ? {\n ...prev,\n status: decision.approved ? \"approved\" : \"rejected\",\n resolvedAt: new Date(),\n resolvedBy: decision.approver,\n comment: decision.comment,\n }\n : null\n );\n\n onDecision?.(decision);\n } catch (err) {\n const submitError = err instanceof Error ? err : new Error(String(err));\n setError(submitError);\n onError?.(submitError);\n throw submitError;\n } finally {\n setIsSubmitting(false);\n }\n },\n [runId, approvalId, apiBase, onDecision, onError],\n );\n\n /**\n * Approve the request\n */\n const approve = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: true,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n /**\n * Reject the request\n */\n const reject = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: false,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n return {\n approval,\n approve,\n reject,\n submitDecision,\n isSubmitting,\n isLoading,\n error,\n isPending: approval?.status === \"pending\",\n isResolved: approval?.status !== \"pending\",\n };\n}\n", "/**\n * useWorkflowList Hook\n *\n * React hook for listing and filtering workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowList } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowList() {\n * const {\n * runs,\n * isLoading,\n * hasMore,\n * loadMore,\n * setFilter,\n * } = useWorkflowList({\n * workflowId: 'content-pipeline',\n * status: 'running',\n * });\n *\n * return (\n * <div>\n * {runs.map(run => (\n * <div key={run.id}>\n * {run.id} - {run.status}\n * </div>\n * ))}\n * {hasMore && (\n * <button onClick={loadMore}>Load More</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { RunFilter, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflowList hook\n */\nexport interface UseWorkflowListOptions {\n /** Filter by workflow ID */\n workflowId?: string;\n\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n\n /** Filter runs created after this date */\n createdAfter?: Date;\n\n /** Filter runs created before this date */\n createdBefore?: Date;\n\n /** Page size (defaults to 20) */\n pageSize?: number;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Enable automatic refresh */\n autoRefresh?: boolean;\n\n /** Refresh interval in ms (defaults to 5000) */\n refreshInterval?: number;\n}\n\n/**\n * Result from useWorkflowList hook\n */\nexport interface UseWorkflowListResult {\n /** List of workflow runs */\n runs: WorkflowRun[];\n\n /** Total count (if available) */\n totalCount?: number;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether there are more results */\n hasMore: boolean;\n\n /** Load more results */\n loadMore: () => Promise<void>;\n\n /** Refresh the list */\n refresh: () => Promise<void>;\n\n /** Update the filter */\n setFilter: (filter: Partial<UseWorkflowListOptions>) => void;\n\n /** Current filter */\n filter: RunFilter;\n}\n\n/**\n * useWorkflowList - List and filter workflow runs\n */\nexport function useWorkflowList(\n options: UseWorkflowListOptions = {},\n): UseWorkflowListResult {\n const {\n workflowId,\n status,\n createdAfter,\n createdBefore,\n pageSize = 20,\n apiBase = \"/api/workflows\",\n autoRefresh = false,\n refreshInterval = 5000,\n } = options;\n\n const [runs, setRuns] = useState<WorkflowRun[]>([]);\n const [totalCount, setTotalCount] = useState<number | undefined>();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [cursor, setCursor] = useState<string | undefined>();\n\n const [filter, setFilterState] = useState<RunFilter>({\n workflowId,\n status,\n createdAfter,\n createdBefore,\n limit: pageSize,\n });\n\n /**\n * Build query string from filter\n */\n const buildQueryString = useCallback(\n (filterToUse: RunFilter, cursorToUse?: string): string => {\n const params = new URLSearchParams();\n\n if (filterToUse.workflowId) {\n params.set(\"workflowId\", filterToUse.workflowId);\n }\n\n if (filterToUse.status) {\n const statuses = Array.isArray(filterToUse.status)\n ? filterToUse.status\n : [filterToUse.status];\n statuses.forEach((s) => params.append(\"status\", s));\n }\n\n if (filterToUse.createdAfter) {\n params.set(\"createdAfter\", filterToUse.createdAfter.toISOString());\n }\n\n if (filterToUse.createdBefore) {\n params.set(\"createdBefore\", filterToUse.createdBefore.toISOString());\n }\n\n if (filterToUse.limit) {\n params.set(\"limit\", String(filterToUse.limit));\n }\n\n if (cursorToUse) {\n params.set(\"cursor\", cursorToUse);\n }\n\n return params.toString();\n },\n [],\n );\n\n /**\n * Fetch runs\n */\n const fetchRuns = useCallback(\n async (append: boolean = false) => {\n try {\n const queryString = buildQueryString(filter, append ? cursor : undefined);\n const response = await fetch(`${apiBase}/runs?${queryString}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch runs: ${response.status}`);\n }\n\n const data = await response.json();\n const fetchedRuns = (data.runs || data) as WorkflowRun[];\n const nextCursor = data.cursor;\n const total = data.totalCount;\n\n if (append) {\n setRuns((prev) => [...prev, ...fetchedRuns]);\n } else {\n setRuns(fetchedRuns);\n }\n\n setCursor(nextCursor);\n setHasMore(!!nextCursor || fetchedRuns.length === filter.limit);\n setTotalCount(total);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n }\n },\n [apiBase, filter, cursor, buildQueryString],\n );\n\n /**\n * Initial fetch\n */\n useEffect(() => {\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n };\n\n doFetch();\n }, [filter]); // Re-fetch when filter changes\n\n /**\n * Auto-refresh setup\n */\n useEffect(() => {\n if (!autoRefresh) return;\n\n const intervalId = setInterval(() => {\n fetchRuns(false);\n }, refreshInterval);\n\n return () => clearInterval(intervalId);\n }, [autoRefresh, refreshInterval, fetchRuns]);\n\n /**\n * Load more results\n */\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading) return;\n setIsLoading(true);\n await fetchRuns(true);\n setIsLoading(false);\n }, [hasMore, isLoading, fetchRuns]);\n\n /**\n * Refresh the list\n */\n const refresh = useCallback(async () => {\n setCursor(undefined);\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n }, [fetchRuns]);\n\n /**\n * Update filter\n */\n const setFilter = useCallback(\n (newFilter: Partial<UseWorkflowListOptions>) => {\n setCursor(undefined); // Reset pagination\n setFilterState((prev) => ({\n ...prev,\n workflowId: newFilter.workflowId ?? prev.workflowId,\n status: newFilter.status ?? prev.status,\n createdAfter: newFilter.createdAfter ?? prev.createdAfter,\n createdBefore: newFilter.createdBefore ?? prev.createdBefore,\n limit: newFilter.pageSize ?? prev.limit,\n }));\n },\n [],\n );\n\n return {\n runs,\n totalCount,\n isLoading,\n error,\n hasMore,\n loadMore,\n refresh,\n setFilter,\n filter,\n };\n}\n", "/**\n * useWorkflowStart Hook\n *\n * React hook for starting workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowStart } from 'veryfront/ai/workflow/react';\n *\n * function StartWorkflowButton() {\n * const { start, isStarting, error, lastRunId } = useWorkflowStart({\n * workflowId: 'content-pipeline',\n * onStart: (runId) => {\n * console.log('Started:', runId);\n * },\n * });\n *\n * return (\n * <button\n * onClick={() => start({ topic: 'AI Safety' })}\n * disabled={isStarting}\n * >\n * {isStarting ? 'Starting...' : 'Start Workflow'}\n * </button>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useState } from \"react\";\n\n/**\n * Options for useWorkflowStart hook\n */\nexport interface UseWorkflowStartOptions {\n /** Workflow ID to start */\n workflowId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Callback when workflow starts successfully */\n onStart?: (runId: string) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useWorkflowStart hook\n */\nexport interface UseWorkflowStartResult<TInput = unknown> {\n /** Start a new workflow run */\n start: (input: TInput) => Promise<string>;\n\n /** Whether a start is in progress */\n isStarting: boolean;\n\n /** Last started run ID */\n lastRunId: string | null;\n\n /** Error state */\n error: Error | null;\n\n /** Reset error state */\n resetError: () => void;\n}\n\n/**\n * useWorkflowStart - Start new workflow runs\n */\nexport function useWorkflowStart<TInput = unknown>(\n options: UseWorkflowStartOptions,\n): UseWorkflowStartResult<TInput> {\n const { workflowId, apiBase = \"/api/workflows\", onStart, onError } = options;\n\n const [isStarting, setIsStarting] = useState(false);\n const [lastRunId, setLastRunId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Start a new workflow run\n */\n const start = useCallback(\n async (input: TInput): Promise<string> => {\n setIsStarting(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBase}/${workflowId}/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message || `Failed to start workflow: ${response.status}`,\n );\n }\n\n const data = await response.json();\n const runId = data.runId || data.id;\n\n setLastRunId(runId);\n onStart?.(runId);\n\n return runId;\n } catch (err) {\n const startError = err instanceof Error ? err : new Error(String(err));\n setError(startError);\n onError?.(startError);\n throw startError;\n } finally {\n setIsStarting(false);\n }\n },\n [workflowId, apiBase, onStart, onError],\n );\n\n /**\n * Reset error state\n */\n const resetError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n start,\n isStarting,\n lastRunId,\n error,\n resetError,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["z", "logger", "z", "tool", "tool", "z", "z", "tool", "hasNodeProcess", "hasNodeProcess", "hasNodeProcess", "tool", "resource", "prompt", "tool", "resource", "z", "agent", "z", "step", "agent", "z", "z", "join", "join", "fs", "tool", "agent", "resource", "DEFAULT_CONFIG", "z", "step", "tool", "z", "tool", "tool", "agent", "resource", "prompt", "tool", "resource", "tool", "generateId", "generateId", "state", "generateId", "agent", "tool", "workflow", "generateId", "resolve", "generateId", "workflow", "useCallback", "useEffect", "useState", "useCallback", "useEffect", "useState", "useCallback", "useState"]
3
+ "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/types/agent.ts", "../../../src/ai/providers/openai.ts", "../../../src/core/errors/veryfront-error.ts", "../../../src/core/utils/runtime-guards.ts", "../../../src/core/utils/logger/env.ts", "../../../src/core/utils/logger/logger.ts", "../../../src/ai/providers/base.ts", "../../../src/ai/providers/anthropic.ts", "../../../src/ai/providers/google.ts", "../../../src/platform/compat/runtime.ts", "../../../src/platform/compat/process.ts", "../../../src/ai/providers/factory.ts", "../../../src/ai/utils/zod-json-schema.ts", "../../../src/ai/utils/tool.ts", "../../../src/ai/runtime/platform.ts", "../../../src/ai/mcp/resource.ts", "../../../src/ai/mcp/prompt.ts", "../../../src/ai/mcp/registry.ts", "../../../src/ai/agent/composition.ts", "../../../src/core/config/schema.ts", "../../../src/core/config/loader.ts", "../../../deno.json", "../../../src/core/utils/version.ts", "../../../src/core/utils/constants/cdn.ts", "../../../src/core/config/defaults.ts", "../../../src/core/utils/constants/server.ts", "../../../src/platform/compat/fs.ts", "../../../src/platform/adapters/mock.ts", "../../../src/platform/compat/path-helper.ts", "../../../src/ai/utils/discovery.ts", "../../../src/ai/utils/id.ts", "../../../src/ai/agent/memory.ts", "../../../src/core/utils/constants/cache.ts", "../../../src/core/utils/constants/http.ts", "../../../src/core/utils/constants/hmr.ts", "../../../src/core/utils/constants/network.ts", "../../../src/core/utils/paths.ts", "../../../src/core/utils/bundle-manifest.ts", "../../../src/core/utils/perf-timer.ts", "../../../src/observability/tracing/config.ts", "../../../src/observability/tracing/span-operations.ts", "../../../src/observability/tracing/context-propagation.ts", "../../../src/observability/tracing/manager.ts", "../../../src/observability/tracing/index.ts", "../../../src/ai/config/defaults.ts", "../../../src/ai/agent/streaming/stream-events.ts", "../../../src/ai/agent/message-converter.ts", "../../../src/ai/agent/runtime.ts", "../../../src/ai/agent/factory.ts", "../../../src/ai/index.ts", "../../../src/ai/adapters/ai-sdk.ts", "../../../src/ai/utils/setup.ts", "../../../src/ai/mcp/server.ts", "../../../src/ai/production/rate-limit/limiter.ts", "../../../src/ai/production/cache/cache.ts", "../../../src/ai/production/cost-tracking/tracker.ts", "../../../src/ai/production/security/validator.ts", "../../../src/ai/workflow/types.ts", "../../../src/ai/workflow/dsl/workflow.ts", "../../../src/ai/workflow/dsl/step.ts", "../../../src/ai/workflow/dsl/parallel.ts", "../../../src/ai/workflow/dsl/branch.ts", "../../../src/ai/workflow/dsl/wait.ts", "../../../src/ai/workflow/backends/types.ts", "../../../src/ai/workflow/backends/memory.ts", "../../../src/ai/workflow/executor/dag-executor.ts", "../../../src/ai/workflow/executor/checkpoint-manager.ts", "../../../src/ai/workflow/executor/step-executor.ts", "../../../src/ai/workflow/executor/workflow-executor.ts", "../../../src/ai/workflow/runtime/approval-manager.ts", "../../../src/ai/workflow/api/workflow-client.ts", "../../../src/ai/workflow/react/use-workflow.ts", "../../../src/ai/workflow/react/use-approval.ts", "../../../src/ai/workflow/react/use-workflow-list.ts", "../../../src/ai/workflow/react/use-workflow-start.ts"],
4
+ "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Agent type definitions\n */\n\nimport type { Tool } from \"./tool.ts\";\nimport type { Platform } from \"../runtime/platform.ts\";\nimport type { Memory } from \"../agent/memory.ts\";\n\n/**\n * Supported AI model providers\n */\nexport type ModelProvider = \"openai\" | \"anthropic\" | \"google\" | \"local\";\n\n/**\n * Model configuration string format: \"provider/model-name\"\n * Examples: \"openai/gpt-4\", \"anthropic/claude-3-5-sonnet\"\n */\nexport type ModelString = string;\n\n/**\n * Agent memory configuration\n */\nexport interface MemoryConfig {\n /** Memory type */\n type: \"conversation\" | \"buffer\" | \"summary\" | \"redis\";\n\n /** Maximum tokens to store in memory */\n maxTokens?: number;\n\n /** Maximum messages to store */\n maxMessages?: number;\n}\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"idle\"\n | \"thinking\"\n | \"tool_execution\"\n | \"streaming\"\n | \"completed\"\n | \"error\";\n\n/**\n * Agent configuration options\n */\nexport interface AgentConfig {\n /** Unique agent identifier (optional, inferred from filename) */\n id?: string;\n\n /** Model to use (format: \"provider/model-name\") */\n model: ModelString;\n\n /** System prompt or prompt template ID */\n system: string | (() => string) | (() => Promise<string>);\n\n /** Tools available to the agent. Use `true` to enable all discovered tools, or specify individual tools. */\n tools?: true | Record<string, Tool | boolean>;\n\n /** Maximum agent steps before stopping */\n maxSteps?: number;\n\n /** Enable streaming responses */\n streaming?: boolean;\n\n /** Memory configuration */\n memory?: MemoryConfig;\n\n /** Middleware functions */\n middleware?: AgentMiddleware[];\n\n /** Edge-specific configuration */\n edge?: EdgeConfig;\n\n /** Multi-modal support */\n multimodal?: {\n vision?: boolean;\n audio?: boolean;\n };\n}\n\n/**\n * Edge deployment configuration\n */\nexport interface EdgeConfig {\n /** Enable edge optimizations */\n enabled: boolean;\n\n /** Maximum steps for edge (overrides maxSteps) */\n maxSteps?: number;\n\n /** Timeout in milliseconds */\n timeoutMs?: number;\n\n /** Force streaming */\n streaming?: boolean;\n}\n\n/**\n * Agent middleware function\n */\nexport type AgentMiddleware = (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n) => Promise<AgentResponse>;\n\n/**\n * Agent execution context\n */\nexport interface AgentContext {\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model?: string;\n\n /** Input messages or prompt */\n input: string | Message[];\n\n /** Additional context data */\n data?: Record<string, unknown>;\n\n /** Current platform */\n platform: Platform;\n\n /** Request metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Tool call part with args (runtime/server format)\n * Uses `tool-${toolName}` pattern (e.g., \"tool-weather\")\n */\nexport interface ToolCallPartWithArgs {\n type: `tool-${string}`;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Tool call part with input (useChat/client format)\n * Uses `tool-${toolName}` pattern (e.g., \"tool-weather\")\n */\nexport interface ToolCallPartWithInput {\n type: `tool-${string}`;\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Tool call part (AI SDK v5 format)\n * Supports both 'args' (runtime) and 'input' (useChat) field names\n */\nexport type ToolCallPart = ToolCallPartWithArgs | ToolCallPartWithInput;\n\n/**\n * Tool result part (AI SDK v5 format)\n */\nexport interface ToolResultPart {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n}\n\n/**\n * Message part types (AI SDK v5 format)\n * Tool calls use `tool-${toolName}` pattern (e.g., \"tool-weather\")\n * Legacy \"tool-call\" type also supported for backwards compatibility\n */\nexport type MessagePart =\n | { type: \"text\"; text: string }\n | ToolCallPart\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args: Record<string, unknown> }\n | ToolResultPart;\n\n/**\n * Message in a conversation (AI SDK v5 format)\n */\nexport interface Message {\n /** Message ID */\n id: string;\n\n /** Message role */\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n\n /** Message parts (v5 format) */\n parts: MessagePart[];\n\n /** Timestamp */\n timestamp?: number;\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Helper to extract text content from message parts\n */\nexport function getTextFromParts(parts: MessagePart[]): string {\n return parts\n .filter((p): p is MessagePart & { type: \"text\" } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Type guard to check if a tool call part has 'args' field\n */\nexport function hasArgs(part: ToolCallPart): part is ToolCallPartWithArgs {\n return \"args\" in part && part.args !== undefined;\n}\n\n/**\n * Type guard to check if a tool call part has 'input' field\n */\nexport function hasInput(part: ToolCallPart): part is ToolCallPartWithInput {\n return \"input\" in part && part.input !== undefined;\n}\n\n/**\n * Extract tool arguments from a tool call part.\n * Supports both 'args' (runtime/server) and 'input' (useChat/client) formats.\n * Throws if neither field is present.\n */\nexport function getToolArguments(part: ToolCallPart): Record<string, unknown> {\n if (\"args\" in part && part.args !== undefined) {\n return part.args;\n }\n if (\"input\" in part && part.input !== undefined) {\n return part.input;\n }\n // Access properties before TypeScript narrows to never\n const toolName = (part as ToolCallPartWithArgs).toolName;\n const toolCallId = (part as ToolCallPartWithArgs).toolCallId;\n throw new Error(\n `Tool call part for \"${toolName}\" (${toolCallId}) missing both 'args' and 'input' fields`,\n );\n}\n\n/**\n * Tool call emitted during streaming responses.\n * Matches provider streaming payload shape and is parsed into arguments.\n */\nexport interface StreamToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n/**\n * Tool invocation during agent execution\n */\nexport interface ToolCall {\n /** Tool call ID */\n id: string;\n\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args: Record<string, unknown>;\n\n /** Tool execution status */\n status: \"pending\" | \"executing\" | \"completed\" | \"error\";\n\n /** Tool result */\n result?: unknown;\n\n /** Error if tool execution failed */\n error?: string;\n\n /** Execution time in milliseconds */\n executionTime?: number;\n}\n\n/**\n * Agent response\n */\nexport interface AgentResponse {\n /** Generated text */\n text: string;\n\n /** Messages in the conversation */\n messages: Message[];\n\n /** Tool calls made during execution */\n toolCalls: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text (if available) */\n thinking?: string;\n\n /** Usage statistics */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result object returned by agent.stream()\n * Provides toDataStreamResponse() for Vercel AI SDK compatible streaming\n */\nexport interface AgentStreamResult {\n /**\n * Convert the stream to a Response object for streaming responses\n * Compatible with Vercel AI SDK's toDataStreamResponse()\n */\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response;\n}\n\n/**\n * Agent instance (returned by agent() function)\n */\nexport interface Agent {\n /** Agent ID */\n id: string;\n\n /** Agent configuration */\n config: AgentConfig;\n\n /**\n * Generate a response (non-streaming)\n */\n generate(input: {\n input: string | Message[];\n context?: Record<string, unknown>;\n }): Promise<AgentResponse>;\n\n /**\n * Stream a response\n * Returns an AgentStreamResult which extends ReadableStream and adds toDataStreamResponse()\n */\n stream(input: {\n input?: string;\n messages?: Message[];\n context?: Record<string, unknown>;\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n }): Promise<AgentStreamResult>;\n\n /**\n * Respond to an HTTP request\n */\n respond(request: Request): Promise<Response>;\n\n /**\n * Get memory instance\n */\n getMemory(): Memory;\n\n /**\n * Get memory statistics\n */\n getMemoryStats(): Promise<{\n totalMessages: number;\n estimatedTokens: number;\n type: string;\n }>;\n\n /**\n * Clear agent memory\n */\n clearMemory(): Promise<void>;\n}\n", "/**\n * OpenAI provider implementation\n */\n\nimport { z } from \"zod\";\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { CompletionRequest, CompletionResponse, OpenAIConfig } from \"../types/provider.ts\";\n\nconst OpenAIToolCallSchema = z.object({\n id: z.string(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n});\n\nconst OpenAIResponseSchema = z.object({\n choices: z.array(z.object({\n message: z.object({\n content: z.string().nullable().optional(),\n tool_calls: z.array(OpenAIToolCallSchema).optional(),\n }),\n finish_reason: z.string(),\n })).min(1),\n usage: z.object({\n prompt_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n total_tokens: z.number().optional(),\n }).optional(),\n});\n\nexport class OpenAIProvider extends BaseProvider {\n name = \"openai\";\n private apiKey: string;\n private baseURL: string;\n private organizationId?: string;\n\n constructor(config: OpenAIConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://api.openai.com/v1\";\n this.organizationId = config.organizationId;\n }\n\n protected getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Authorization\": `Bearer ${this.apiKey}`,\n };\n\n if (this.organizationId) {\n headers[\"OpenAI-Organization\"] = this.organizationId;\n }\n\n return headers;\n }\n\n protected getEndpoint(path: string): string {\n return `${this.baseURL}${path}`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n stream: request.stream || false,\n };\n\n if (request.system) {\n // Add system message at the beginning\n body.messages = [\n { role: \"system\", content: request.system },\n ...request.messages,\n ];\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n // Disable parallel tool calls to avoid streaming JSON corruption\n // when multiple tool calls are made simultaneously\n body.parallel_tool_calls = false;\n }\n\n return body;\n }\n\n protected transformResponse(response: unknown): CompletionResponse {\n const parsed = OpenAIResponseSchema.safeParse(response);\n\n if (!parsed.success) {\n throw toError(createError({\n type: \"agent\",\n message: `OpenAI: Invalid response format: ${parsed.error.message}`,\n }));\n }\n\n const data = parsed.data;\n const choice = data.choices[0];\n\n if (!choice) {\n throw toError(createError({\n type: \"agent\",\n message: \"OpenAI: No choices in response (unexpected)\",\n }));\n }\n\n const message = choice.message;\n\n const toolCalls = message.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n text: message.content || \"\",\n toolCalls,\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n finishReason: this.mapFinishReason(choice.finish_reason),\n };\n }\n\n private mapFinishReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool_calls\";\n case \"content_filter\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n }\n}\n", "export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?:\n | \"parse\"\n | \"transform\"\n | \"bundle\"\n | \"optimize\"\n | \"dependency-resolution\"\n | \"circuit-breaker\";\n /** Number of failures (for circuit breaker) */\n failures?: number;\n /** Missing dependencies list */\n missing?: Array<{ specifier: string; fromFile: string; reason: string }>;\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable, isProductionEnvironment } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport type LogFormat = \"text\" | \"json\";\n\n/**\n * Structured log entry for JSON output.\n * Fields are designed for easy Grafana/Loki filtering.\n */\nexport interface LogEntry {\n timestamp: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n service: string;\n message: string;\n // Optional structured context\n context?: Record<string, unknown>;\n // Error details if applicable\n error?: {\n name: string;\n message: string;\n stack?: string;\n };\n // Request context (when available)\n requestId?: string;\n traceId?: string;\n projectSlug?: string;\n // Duration for timed operations\n durationMs?: number;\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n /**\n * Create a child logger with additional context bound to all log entries.\n */\n child(context: Record<string, unknown>): Logger;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\nlet cachedLogFormat: LogFormat | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nfunction resolveLogFormat(force = false): LogFormat {\n if (force || cachedLogFormat === undefined) {\n cachedLogFormat = getDefaultFormat();\n }\n return cachedLogFormat;\n}\n\n/**\n * Determine log format from environment.\n * Defaults to JSON in production for Grafana compatibility.\n */\nfunction getDefaultFormat(): LogFormat {\n const envFormat = getEnvironmentVariable(\"LOG_FORMAT\");\n if (envFormat === \"json\" || envFormat === \"text\") {\n return envFormat;\n }\n // Default to JSON in production for structured logging\n return isProductionEnvironment() ? \"json\" : \"text\";\n}\n\n/**\n * Serialize error object for structured logging.\n */\nfunction serializeError(err: unknown): LogEntry[\"error\"] | undefined {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n stack: err.stack,\n };\n }\n if (err !== undefined && err !== null) {\n return {\n name: \"UnknownError\",\n message: String(err),\n };\n }\n return undefined;\n}\n\n/**\n * Extract context from variadic args.\n * First object argument becomes context, errors are handled specially.\n */\nfunction extractContext(\n args: unknown[],\n): { context?: Record<string, unknown>; error?: LogEntry[\"error\"] } {\n let context: Record<string, unknown> | undefined;\n let error: LogEntry[\"error\"] | undefined;\n\n for (const arg of args) {\n if (arg instanceof Error) {\n error = serializeError(arg);\n } else if (typeof arg === \"object\" && arg !== null && !Array.isArray(arg)) {\n context = { ...context, ...(arg as Record<string, unknown>) };\n }\n }\n\n return { context, error };\n}\n\nclass ConsoleLogger implements Logger {\n private boundContext: Record<string, unknown> = {};\n\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n private format: LogFormat = resolveLogFormat(),\n boundContext?: Record<string, unknown>,\n ) {\n if (boundContext) {\n this.boundContext = boundContext;\n }\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n setFormat(format: LogFormat): void {\n this.format = format;\n }\n\n getFormat(): LogFormat {\n return this.format;\n }\n\n /**\n * Create a child logger with additional bound context.\n */\n child(context: Record<string, unknown>): Logger {\n return new ConsoleLogger(this.prefix, this.level, this.format, {\n ...this.boundContext,\n ...context,\n });\n }\n\n private formatJson(\n level: LogEntry[\"level\"],\n message: string,\n args: unknown[],\n ): string {\n const { context, error } = extractContext(args);\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n service: this.prefix.toLowerCase(),\n message,\n };\n\n // Merge bound context with call-time context\n const mergedContext = { ...this.boundContext, ...context };\n if (Object.keys(mergedContext).length > 0) {\n // Extract known fields to top level for easier Grafana filtering\n if (\"requestId\" in mergedContext) {\n entry.requestId = String(mergedContext.requestId);\n delete mergedContext.requestId;\n }\n if (\"traceId\" in mergedContext) {\n entry.traceId = String(mergedContext.traceId);\n delete mergedContext.traceId;\n }\n if (\"projectSlug\" in mergedContext) {\n entry.projectSlug = String(mergedContext.projectSlug);\n delete mergedContext.projectSlug;\n }\n if (\"durationMs\" in mergedContext) {\n entry.durationMs = Number(mergedContext.durationMs);\n delete mergedContext.durationMs;\n }\n\n if (Object.keys(mergedContext).length > 0) {\n entry.context = mergedContext;\n }\n }\n\n if (error) {\n entry.error = error;\n }\n\n return JSON.stringify(entry);\n }\n\n private log(\n level: LogEntry[\"level\"],\n logLevel: LogLevel,\n consoleFn: (...args: unknown[]) => void,\n message: string,\n args: unknown[],\n ): void {\n if (this.level > logLevel) return;\n\n if (this.format === \"json\") {\n consoleFn(this.formatJson(level, message, args));\n } else {\n const prefix = level === \"info\" ? \"\" : ` ${level.toUpperCase()}:`;\n consoleFn(`[${this.prefix}]${prefix} ${message}`, ...args);\n }\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.log(\"debug\", LogLevel.DEBUG, console.debug, message, args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.log(\"info\", LogLevel.INFO, console.log, message, args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.log(\"warn\", LogLevel.WARN, console.warn, message, args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.log(\"error\", LogLevel.ERROR, console.error, message, args);\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const durationMs = performance.now() - start;\n this.debug(`${label} completed`, { durationMs: Math.round(durationMs) });\n return result;\n } catch (error) {\n const durationMs = performance.now() - start;\n this.error(`${label} failed`, { durationMs: Math.round(durationMs) }, error);\n throw error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\nexport const proxyLogger = createLogger(\"PROXY\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n const updatedFormat = resolveLogFormat(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n instance.setFormat(updatedFormat);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n\n/**\n * Create a logger for a specific request context.\n * Useful for binding request-specific metadata to all logs.\n */\nexport function createRequestLogger(\n baseLogger: Logger,\n requestContext: {\n requestId?: string;\n traceId?: string;\n projectSlug?: string;\n },\n): Logger {\n return baseLogger.child(requestContext);\n}\n", "/**\n * Base provider implementation\n *\n * All provider implementations extend this base class\n */\n\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type {\n CompletionRequest,\n CompletionResponse,\n Provider,\n ProviderConfig,\n} from \"../types/provider.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { z } from \"zod\";\n\n/**\n * Schema for OpenAI streaming response chunks\n */\nconst OpenAIStreamChunkSchema = z.object({\n choices: z.array(z.object({\n delta: z.object({\n content: z.string().optional().nullable(),\n tool_calls: z.array(z.object({\n index: z.number().optional(),\n id: z.string().optional(),\n function: z.object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n }).optional(),\n })).optional(),\n }),\n finish_reason: z.string().nullable(),\n })).min(1),\n});\n\n/**\n * Schema for OpenAI non-streaming completion response\n */\nconst OpenAICompletionResponseSchema = z.object({\n id: z.string(),\n choices: z.array(z.object({\n message: z.object({\n role: z.string(),\n content: z.string().nullable().optional(),\n tool_calls: z.array(z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n })).optional(),\n }),\n finish_reason: z.string().nullable(),\n })).min(1),\n usage: z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n }).optional(),\n});\n\nexport abstract class BaseProvider implements Provider {\n abstract name: string;\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n this.validateConfig();\n }\n\n /**\n * Validate provider configuration\n */\n protected validateConfig(): void {\n if (!this.config.apiKey) {\n throw toError(createError({\n type: \"agent\",\n message: `${this.name}: API key is required`,\n }));\n }\n }\n\n /**\n * Get headers for API requests\n */\n protected abstract getHeaders(): Record<string, string>;\n\n /**\n * Get API endpoint URL\n */\n protected abstract getEndpoint(path: string): string;\n\n /**\n * Transform request to provider-specific format\n */\n protected abstract transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown>;\n\n /**\n * Transform provider response to standard format\n */\n protected abstract transformResponse(\n response: unknown,\n ): CompletionResponse;\n\n /**\n * Complete a prompt (non-streaming)\n */\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const endpoint = this.getEndpoint(\"/chat/completions\");\n const headers = this.getHeaders();\n const body = this.transformRequest({ ...request, stream: false });\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n ...headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw toError(createError({\n type: \"agent\",\n message: `${this.name} API error (${response.status}): ${error}`,\n }));\n }\n\n const data = await response.json();\n\n // Validate response structure\n const parseResult = OpenAICompletionResponseSchema.safeParse(data);\n if (!parseResult.success) {\n agentLogger.warn(`${this.name}: Invalid response structure`, {\n errors: parseResult.error.flatten(),\n });\n throw toError(createError({\n type: \"agent\",\n message: `${this.name}: Invalid response structure from provider`,\n }));\n }\n\n return this.transformResponse(parseResult.data);\n }\n\n /**\n * Stream a completion\n */\n async stream(request: CompletionRequest): Promise<ReadableStream> {\n const endpoint = this.getEndpoint(\"/chat/completions\");\n const headers = this.getHeaders();\n const body = this.transformRequest({ ...request, stream: true });\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n ...headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw toError(createError({\n type: \"agent\",\n message: `${this.name} API error (${response.status}): ${error}`,\n }));\n }\n\n if (!response.body) {\n throw toError(createError({\n type: \"agent\",\n message: `${this.name}: No response body for streaming`,\n }));\n }\n\n return this.transformStream(response.body);\n }\n\n /**\n * Transform provider stream to standard format\n *\n * Emits JSON chunks with the following structure:\n * - { type: \"content\", content: string }\n * - { type: \"tool_call_start\", toolCall: { id, name, index } }\n * - { type: \"tool_call_delta\", id, arguments }\n * - { type: \"finish\", finishReason }\n */\n protected transformStream(stream: ReadableStream): ReadableStream {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n\n // Track tool calls being accumulated\n const toolCalls = new Map<number, {\n id?: string;\n name?: string;\n arguments: string;\n }>();\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n const raw = JSON.parse(data);\n const result = OpenAIStreamChunkSchema.safeParse(raw);\n\n if (!result.success) {\n // agentLogger.debug(\"Skipping invalid stream chunk schema\", result.error);\n continue;\n }\n\n const choice = result.data.choices[0];\n\n if (!choice) continue;\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n\n // Handle text content\n if (delta?.content) {\n const contentChunk = JSON.stringify({\n type: \"content\",\n content: delta.content,\n });\n controller.enqueue(encoder.encode(contentChunk + \"\\n\"));\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n const index = toolCall.index ?? 0;\n\n if (!toolCalls.has(index)) {\n toolCalls.set(index, { arguments: \"\" });\n }\n\n const tc = toolCalls.get(index)!;\n\n // Tool call start (has id and name)\n if (toolCall.id) {\n tc.id = toolCall.id;\n }\n\n if (toolCall.function?.name) {\n tc.name = toolCall.function.name;\n\n // Emit tool call start event\n const startChunk = JSON.stringify({\n type: \"tool_call_start\",\n toolCall: {\n id: tc.id,\n name: tc.name,\n index,\n },\n });\n controller.enqueue(encoder.encode(startChunk + \"\\n\"));\n }\n\n // Accumulate arguments\n if (toolCall.function?.arguments) {\n tc.arguments += toolCall.function.arguments;\n\n // Emit delta event\n const deltaChunk = JSON.stringify({\n type: \"tool_call_delta\",\n id: tc.id,\n index,\n arguments: toolCall.function.arguments,\n });\n controller.enqueue(encoder.encode(deltaChunk + \"\\n\"));\n }\n }\n }\n\n // Handle finish reason\n if (finishReason) {\n // Emit complete tool calls\n if (finishReason === \"tool_calls\" || finishReason === \"function_call\") {\n for (const [index, tc] of toolCalls.entries()) {\n const completeChunk = JSON.stringify({\n type: \"tool_call_complete\",\n toolCall: {\n id: tc.id!,\n name: tc.name!,\n index,\n arguments: tc.arguments,\n },\n });\n controller.enqueue(encoder.encode(completeChunk + \"\\n\"));\n }\n }\n\n // Emit finish event\n const finishChunk = JSON.stringify({\n type: \"finish\",\n finishReason,\n });\n controller.enqueue(encoder.encode(finishChunk + \"\\n\"));\n }\n } catch (e) {\n // Skip invalid JSON\n agentLogger.warn(\"Failed to parse stream chunk:\", e);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n}\n", "/**\n * Anthropic provider implementation\n */\n\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { AnthropicConfig, CompletionRequest, CompletionResponse } from \"../types/provider.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\n\n/**\n * Anthropic content block types\n */\ninterface AnthropicTextContent {\n type: \"text\";\n text: string;\n}\n\ninterface AnthropicToolUseContent {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface AnthropicToolResultContent {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\ntype AnthropicContentBlock =\n | AnthropicTextContent\n | AnthropicToolUseContent\n | AnthropicToolResultContent;\n\n/**\n * Anthropic message types\n */\ninterface AnthropicMessage {\n role: \"user\" | \"assistant\";\n content: string | AnthropicContentBlock[];\n}\n\n/**\n * Anthropic API response\n */\ninterface AnthropicResponse {\n content: AnthropicContentBlock[];\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n stop_reason: string;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n name = \"anthropic\";\n private apiKey: string;\n private baseURL: string;\n\n constructor(config: AnthropicConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://api.anthropic.com\";\n }\n\n protected getHeaders(): Record<string, string> {\n return {\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n };\n }\n\n protected getEndpoint(_path: string): string {\n // Anthropic uses /v1/messages endpoint\n return `${this.baseURL}/v1/messages`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n // Transform messages to Anthropic format\n // Anthropic doesn't support \"tool\" role - tool results must be sent as \"user\" messages\n const transformedMessages = request.messages.map((msg): AnthropicMessage => {\n if (msg.role === \"tool\") {\n // Convert tool result message to user message with tool_result content block\n if (!msg.tool_call_id) {\n throw toError(createError({\n type: \"agent\",\n message: \"Tool result message missing tool_call_id\",\n }));\n }\n return {\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ],\n };\n }\n\n // Transform assistant messages with tool_calls to Anthropic format\n if (msg.role === \"assistant\" && msg.tool_calls && msg.tool_calls.length > 0) {\n const content: AnthropicContentBlock[] = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({\n type: \"text\",\n text: msg.content,\n });\n }\n\n // Add tool use blocks (runtime sends OpenAI-format tool_calls)\n for (const toolCall of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: typeof toolCall.function.arguments === \"string\"\n ? JSON.parse(toolCall.function.arguments)\n : toolCall.function.arguments,\n });\n }\n\n return {\n role: \"assistant\",\n content,\n };\n }\n\n // For all other assistant messages, ensure only role and content are sent\n if (msg.role === \"assistant\") {\n return {\n role: \"assistant\",\n content: msg.content,\n };\n }\n\n // For user messages, only send role and content\n if (msg.role === \"user\") {\n return {\n role: \"user\",\n content: msg.content,\n };\n }\n\n // Fallback for any other message types - cast to unknown format\n return msg as unknown as AnthropicMessage;\n });\n\n // Debug: Log transformed messages\n agentLogger.debug(\n \"Anthropic transformRequest - transformed messages:\",\n JSON.stringify(transformedMessages, null, 2),\n );\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages: transformedMessages,\n stream: request.stream || false,\n };\n\n // Anthropic requires system prompt as separate field\n if (request.system) {\n body.system = request.system;\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n } else {\n // Anthropic requires max_tokens\n body.max_tokens = 4096;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters,\n }));\n }\n\n return body;\n }\n\n protected transformResponse(response: AnthropicResponse): CompletionResponse {\n const content = response.content;\n\n if (!content || !Array.isArray(content)) {\n throw toError(createError({\n type: \"config\",\n message: \"Anthropic: Invalid response format\",\n }));\n }\n\n // Extract text content\n const textContent = content\n .filter((c): c is AnthropicTextContent => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n\n // Extract tool calls\n const toolCalls = content\n .filter((c): c is AnthropicToolUseContent => c.type === \"tool_use\")\n .map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.input,\n }));\n\n return {\n text: textContent,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: {\n promptTokens: response.usage?.input_tokens || 0,\n completionTokens: response.usage?.output_tokens || 0,\n totalTokens: (response.usage?.input_tokens || 0) +\n (response.usage?.output_tokens || 0),\n },\n finishReason: this.mapStopReason(response.stop_reason),\n };\n }\n\n private mapStopReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"end_turn\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool_calls\";\n case \"stop_sequence\":\n return \"stop\";\n default:\n return \"stop\";\n }\n }\n\n /**\n * Override stream transformation for Anthropic's specific format\n */\n protected override transformStream(stream: ReadableStream): ReadableStream {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n\n // Capture mapStopReason method reference before entering ReadableStream context\n const mapStopReason = this.mapStopReason.bind(this);\n\n // Track tool calls being accumulated\n const toolCalls = new Map<number, {\n id?: string;\n name?: string;\n input: string;\n }>();\n\n let currentBlockIndex = 0;\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n\n // Anthropic stream event types:\n // - message_start: Contains model, role, usage\n // - content_block_start: Start of content/tool_use block\n // - content_block_delta: Text or tool input deltas\n // - content_block_stop: End of block\n // - message_delta: Contains stop_reason, usage delta\n // - message_stop: End of message\n\n if (parsed.type === \"message_start\") {\n // Extract and emit initial usage (input tokens)\n if (parsed.message?.usage) {\n const usageEvent = JSON.stringify({\n type: \"usage\",\n usage: {\n promptTokens: parsed.message.usage.input_tokens || 0,\n completionTokens: parsed.message.usage.output_tokens || 0,\n totalTokens: (parsed.message.usage.input_tokens || 0) +\n (parsed.message.usage.output_tokens || 0),\n },\n });\n controller.enqueue(encoder.encode(usageEvent + \"\\n\"));\n }\n } else if (parsed.type === \"content_block_start\") {\n const block = parsed.content_block;\n\n // Track tool use blocks\n if (block?.type === \"tool_use\") {\n const index = parsed.index ?? currentBlockIndex;\n currentBlockIndex = index;\n\n toolCalls.set(index, {\n id: block.id,\n name: block.name,\n input: \"\",\n });\n\n // Emit tool call start event\n const startEvent = JSON.stringify({\n type: \"tool_call_start\",\n toolCall: {\n id: block.id,\n name: block.name,\n index,\n },\n });\n controller.enqueue(encoder.encode(startEvent + \"\\n\"));\n }\n } else if (parsed.type === \"content_block_delta\") {\n const delta = parsed.delta;\n\n // Handle text content deltas\n if (delta?.type === \"text_delta\" && delta.text) {\n const contentEvent = JSON.stringify({\n type: \"content\",\n content: delta.text,\n });\n controller.enqueue(encoder.encode(contentEvent + \"\\n\"));\n }\n\n // Handle tool input deltas\n if (delta?.type === \"input_json_delta\" && delta.partial_json) {\n const index = parsed.index ?? currentBlockIndex;\n const tc = toolCalls.get(index);\n\n if (tc) {\n tc.input += delta.partial_json;\n\n // Emit tool call delta event\n const deltaEvent = JSON.stringify({\n type: \"tool_call_delta\",\n id: tc.id,\n index,\n arguments: delta.partial_json,\n });\n controller.enqueue(encoder.encode(deltaEvent + \"\\n\"));\n }\n }\n } else if (parsed.type === \"message_delta\") {\n // Extract and emit usage delta (output tokens)\n if (parsed.usage) {\n const usageDeltaEvent = JSON.stringify({\n type: \"usage\",\n usage: {\n promptTokens: 0, // Only output tokens in delta\n completionTokens: parsed.usage.output_tokens || 0,\n totalTokens: parsed.usage.output_tokens || 0,\n },\n });\n controller.enqueue(encoder.encode(usageDeltaEvent + \"\\n\"));\n }\n\n // Handle stop reason\n if (parsed.delta?.stop_reason) {\n const stopReason = parsed.delta.stop_reason;\n\n // Emit complete tool calls if stop reason is tool_use\n if (stopReason === \"tool_use\") {\n for (const [index, tc] of toolCalls.entries()) {\n const completeEvent = JSON.stringify({\n type: \"tool_call_complete\",\n toolCall: {\n id: tc.id!,\n name: tc.name!,\n index,\n arguments: tc.input,\n },\n });\n controller.enqueue(encoder.encode(completeEvent + \"\\n\"));\n }\n }\n\n // Map Anthropic stop reason to our format\n const finishReason = mapStopReason(stopReason);\n\n // Emit finish event\n const finishEvent = JSON.stringify({\n type: \"finish\",\n finishReason,\n });\n controller.enqueue(encoder.encode(finishEvent + \"\\n\"));\n }\n }\n } catch (e) {\n // Skip invalid JSON\n agentLogger.warn(\"Failed to parse stream chunk:\", e);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n}\n", "/**\n * Google AI provider implementation\n */\n\nimport { z } from \"zod\";\nimport { BaseProvider } from \"./base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { CompletionRequest, CompletionResponse, GoogleConfig } from \"../types/provider.ts\";\n\nconst GoogleToolCallSchema = z.object({\n id: z.string(),\n function: z.object({\n name: z.string(),\n arguments: z.union([z.string(), z.record(z.unknown())]),\n }),\n});\n\nconst GoogleResponseSchema = z.object({\n choices: z.array(z.object({\n message: z.object({\n content: z.string().nullable().optional(),\n tool_calls: z.array(GoogleToolCallSchema).optional(),\n }),\n finish_reason: z.string(),\n })).min(1),\n usage: z.object({\n prompt_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n total_tokens: z.number().optional(),\n }).optional(),\n});\n\nexport class GoogleProvider extends BaseProvider {\n name = \"google\";\n private apiKey: string;\n private baseURL: string;\n\n constructor(config: GoogleConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL || \"https://generativelanguage.googleapis.com/v1beta\";\n }\n\n protected getHeaders(): Record<string, string> {\n return {\n \"x-goog-api-key\": this.apiKey,\n };\n }\n\n protected getEndpoint(_path: string): string {\n // Google uses OpenAI-compatible format\n return `${this.baseURL}/chat/completions`;\n }\n\n protected transformRequest(\n request: CompletionRequest,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n stream: request.stream || false,\n };\n\n if (request.system) {\n body.system = request.system;\n }\n\n if (request.maxTokens) {\n body.max_tokens = request.maxTokens;\n }\n\n if (request.temperature !== undefined) {\n body.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n body.top_p = request.topP;\n }\n\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n }\n\n return body;\n }\n\n protected transformResponse(response: unknown): CompletionResponse {\n const parsed = GoogleResponseSchema.safeParse(response);\n\n if (!parsed.success) {\n throw toError(createError({\n type: \"agent\",\n message: `Google: Invalid response format: ${parsed.error.message}`,\n }));\n }\n\n const data = parsed.data;\n const choice = data.choices[0];\n\n if (!choice) {\n throw toError(createError({\n type: \"agent\",\n message: \"Google: No choices in response (unexpected)\",\n }));\n }\n\n const message = choice.message;\n\n return {\n text: message.content || \"\",\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: typeof tc.function.arguments === \"string\"\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments,\n })),\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n finishReason: this.mapFinishReason(choice.finish_reason),\n };\n }\n\n private mapFinishReason(reason: string): CompletionResponse[\"finishReason\"] {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n case \"max_tokens\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool_calls\";\n case \"content_filter\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n }\n}\n", "export const isDeno = typeof Deno !== \"undefined\" && typeof Deno.version === \"object\";\nexport const isNode =\n typeof (globalThis as { process?: { versions?: { node?: string } } }).process !== \"undefined\" &&\n (globalThis as { process?: { versions?: { node?: string } } }).process?.versions?.node !==\n undefined;\nexport const isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\nexport const isCloudflare = typeof globalThis !== \"undefined\" && \"caches\" in globalThis &&\n \"WebSocketPair\" in globalThis;\n\n/**\n * Detect if running in Node.js (vs Deno)\n * Use this function instead of the constant when runtime detection needs to happen\n * at call time (e.g., when bundled with esbuild's __esm lazy initialization pattern)\n */\nexport function isNodeRuntime(): boolean {\n // deno-lint-ignore no-explicit-any\n const _global = globalThis as any;\n // Check Deno.version to distinguish real Deno from the npm build shim\n const isRealDeno = typeof Deno !== \"undefined\" && typeof Deno.version === \"object\";\n return !isRealDeno && typeof _global.process !== \"undefined\" &&\n !!_global.process?.versions?.node;\n}\n", "import { isDeno as IS_DENO } from \"./runtime.ts\";\n\nconst nodeProcess = (globalThis as { process?: typeof import(\"node:process\") }).process;\nconst hasNodeProcess = !!nodeProcess?.versions?.node;\n\nexport function getArgs(): string[] {\n if (IS_DENO) {\n return Deno.args;\n }\n if (hasNodeProcess) {\n return nodeProcess!.argv.slice(2);\n }\n return [];\n}\n\nexport function exit(code?: number): never {\n if (IS_DENO) {\n Deno.exit(code);\n }\n if (hasNodeProcess) {\n nodeProcess!.exit(code);\n }\n throw new Error(\"exit() is not supported in this runtime\");\n}\n\nexport function cwd(): string {\n if (IS_DENO) {\n return Deno.cwd();\n }\n if (hasNodeProcess) {\n return nodeProcess!.cwd();\n }\n throw new Error(\"cwd() is not supported in this runtime\");\n}\n\nexport function chdir(directory: string): void {\n if (IS_DENO) {\n Deno.chdir(directory);\n } else {\n if (hasNodeProcess) {\n nodeProcess!.chdir(directory);\n return;\n }\n throw new Error(\"chdir() is not supported in this runtime\");\n }\n}\n\nexport function env(): Record<string, string> {\n if (IS_DENO) {\n return Deno.env.toObject();\n }\n if (hasNodeProcess) {\n return nodeProcess!.env as Record<string, string>;\n }\n return {};\n}\n\nexport function getEnv(key: string): string | undefined {\n if (IS_DENO) {\n return Deno.env.get(key);\n }\n if (hasNodeProcess) {\n return nodeProcess!.env[key];\n }\n return undefined;\n}\n\n/**\n * Get an environment variable or throw if not set\n * @throws Error if the environment variable is not set\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\nexport function setEnv(key: string, value: string): void {\n if (IS_DENO) {\n Deno.env.set(key, value);\n } else {\n if (hasNodeProcess) {\n nodeProcess!.env[key] = value;\n return;\n }\n throw new Error(\"setEnv() is not supported in this runtime\");\n }\n}\n\nexport function deleteEnv(key: string): void {\n if (IS_DENO) {\n Deno.env.delete(key);\n } else {\n if (hasNodeProcess) {\n delete nodeProcess!.env[key];\n return;\n }\n throw new Error(\"deleteEnv() is not supported in this runtime\");\n }\n}\n\nexport function pid(): number {\n if (IS_DENO) {\n return Deno.pid;\n }\n if (hasNodeProcess) {\n return nodeProcess!.pid;\n }\n return 0;\n}\n\nexport function ppid(): number {\n if (IS_DENO && \"ppid\" in Deno) {\n return Deno.ppid || 0;\n }\n if (hasNodeProcess) {\n return nodeProcess!.ppid || 0;\n }\n return 0;\n}\n\nexport function memoryUsage(): {\n rss: number;\n heapTotal: number;\n heapUsed: number;\n external: number;\n} {\n if (IS_DENO) {\n const usage = Deno.memoryUsage();\n return {\n rss: usage.rss,\n heapTotal: usage.heapTotal,\n heapUsed: usage.heapUsed,\n external: usage.external,\n };\n }\n\n if (!hasNodeProcess) {\n throw new Error(\"memoryUsage() is not supported in this runtime\");\n }\n\n const usage = nodeProcess!.memoryUsage();\n return {\n rss: usage.rss,\n heapTotal: usage.heapTotal,\n heapUsed: usage.heapUsed,\n external: usage.external || 0,\n };\n}\n\n/**\n * Check if stdin is a TTY (terminal)\n */\nexport function isInteractive(): boolean {\n if (IS_DENO) {\n return Deno.stdin.isTerminal();\n }\n if (hasNodeProcess) {\n return nodeProcess!.stdin.isTTY ?? false;\n }\n return false;\n}\n\n/**\n * Get network interfaces\n */\nexport async function getNetworkInterfaces(): Promise<\n Array<{ name: string; address: string; family: \"IPv4\" | \"IPv6\" }>\n> {\n if (IS_DENO) {\n const interfaces = Deno.networkInterfaces();\n return interfaces.map((iface) => ({\n name: iface.name,\n address: iface.address,\n family: iface.family as \"IPv4\" | \"IPv6\",\n }));\n }\n\n if (!hasNodeProcess) {\n throw new Error(\"networkInterfaces() is not supported in this runtime\");\n }\n\n const os = await import(\"node:os\");\n const interfaces = os.networkInterfaces();\n const result: Array<{ name: string; address: string; family: \"IPv4\" | \"IPv6\" }> = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (!addrs) continue;\n for (const addr of addrs) {\n result.push({\n name,\n address: addr.address,\n family: addr.family as \"IPv4\" | \"IPv6\",\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n if (IS_DENO) {\n return `Deno ${Deno.version.deno}`;\n }\n if (\"Bun\" in globalThis) {\n return `Bun ${(globalThis as unknown as { Bun: { version: string } }).Bun.version}`;\n }\n if (hasNodeProcess) {\n return `Node.js ${nodeProcess!.version}`;\n }\n return \"unknown\";\n}\n\n/**\n * Register a signal handler (SIGINT, SIGTERM) for graceful shutdown\n */\nexport function onSignal(signal: \"SIGINT\" | \"SIGTERM\", handler: () => void): void {\n if (IS_DENO) {\n Deno.addSignalListener(signal, handler);\n } else if (hasNodeProcess) {\n nodeProcess!.on(signal, handler);\n }\n}\n\n/**\n * Register global error handlers for uncaught exceptions and unhandled promise rejections.\n * These handlers prevent the process from crashing due to application code errors.\n *\n * IMPORTANT: These handlers should be registered early in the application lifecycle\n * to catch errors that escape try/catch blocks.\n *\n * @param onError - Callback invoked with the error. Return true to prevent process exit.\n */\nexport function onGlobalError(\n onError: (error: Error, type: \"uncaughtException\" | \"unhandledRejection\") => boolean | void,\n): void {\n if (IS_DENO) {\n // Deno uses global event listeners\n globalThis.addEventListener(\"error\", (event) => {\n const error = event.error instanceof Error ? event.error : new Error(String(event.error));\n const shouldPreventExit = onError(error, \"uncaughtException\");\n if (shouldPreventExit) {\n event.preventDefault();\n }\n });\n\n globalThis.addEventListener(\"unhandledrejection\", (event) => {\n const error = event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n const shouldPreventExit = onError(error, \"unhandledRejection\");\n if (shouldPreventExit) {\n event.preventDefault();\n }\n });\n } else if (hasNodeProcess) {\n // Node.js uses process event handlers\n nodeProcess!.on(\"uncaughtException\", (error: Error) => {\n onError(error, \"uncaughtException\");\n // Note: In Node.js, uncaughtException doesn't exit by default if handler is registered\n });\n\n nodeProcess!.on(\"unhandledRejection\", (reason: unknown) => {\n const error = reason instanceof Error ? reason : new Error(String(reason));\n onError(error, \"unhandledRejection\");\n });\n }\n}\n\n/**\n * Unreference a timer to prevent it from keeping the process alive\n */\nexport function unrefTimer(timerId: ReturnType<typeof setInterval>): void {\n if (IS_DENO) {\n Deno.unrefTimer(timerId as number);\n } else if (timerId && typeof timerId === \"object\" && \"unref\" in timerId) {\n (timerId as { unref: () => void }).unref();\n }\n}\n\n/**\n * Get the executable path of the current runtime\n */\nexport function execPath(): string {\n if (IS_DENO) {\n return Deno.execPath();\n }\n if (hasNodeProcess) {\n return nodeProcess!.execPath;\n }\n return \"\";\n}\n\n/**\n * Get process uptime in seconds\n * Returns OS uptime on Deno, process uptime on Node.js\n */\nexport function uptime(): number {\n if (IS_DENO) {\n // Deno.osUptime() returns system uptime in seconds\n return Deno.osUptime?.() ?? 0;\n }\n if (hasNodeProcess) {\n // process.uptime() returns process uptime in seconds\n return nodeProcess!.uptime?.() ?? 0;\n }\n return 0;\n}\n\n/**\n * Get stdout stream for writing\n * Returns null if not available (e.g., in browser/workers)\n */\nexport function getStdout(): { write: (data: string) => void } | null {\n if (IS_DENO) {\n const encoder = new TextEncoder();\n return {\n write: (data: string) => {\n Deno.stdout.writeSync(encoder.encode(data));\n },\n };\n }\n if (hasNodeProcess && nodeProcess!.stdout) {\n return {\n write: (data: string) => {\n nodeProcess!.stdout.write(data);\n },\n };\n }\n return null;\n}\n\n// Cached Node.js modules for synchronous prompt\nlet cachedNodeFs: typeof import(\"node:fs\") | null = null;\n\n/**\n * Synchronous prompt function that works across Deno and Node.js\n * Displays a message and reads user input from stdin\n */\nexport function promptSync(message?: string): string | null {\n if (IS_DENO) {\n // Deno has a built-in prompt() function\n return prompt(message);\n }\n\n if (hasNodeProcess) {\n // Print the message\n if (message) {\n nodeProcess!.stdout.write(message + \" \");\n }\n\n // Lazy load fs module\n if (!cachedNodeFs) {\n // Dynamic import converted to sync require for bundling\n // @ts-ignore - dynamic require for Node.js\n cachedNodeFs = globalThis.require?.(\"node:fs\") || null;\n if (!cachedNodeFs) {\n // Try alternative approach\n try {\n // @ts-ignore: __require is injected by bundlers for Node.js require\n cachedNodeFs = __require(\"node:fs\");\n } catch {\n return null;\n }\n }\n }\n\n if (!cachedNodeFs) {\n return null;\n }\n\n // Read synchronously using fs\n // This works by reading from file descriptor 0 (stdin)\n // Use Uint8Array for cross-platform compatibility\n const bufferSize = 1024;\n const uint8Array = new Uint8Array(bufferSize);\n let input = \"\";\n\n try {\n // Read from stdin (fd 0) synchronously\n const bytesRead = cachedNodeFs.readSync(0, uint8Array, 0, bufferSize, null);\n if (bytesRead > 0) {\n const decoder = new TextDecoder(\"utf-8\");\n input = decoder.decode(uint8Array.subarray(0, bytesRead)).trim();\n }\n } catch {\n // If stdin is not available or EOF, return null\n return null;\n }\n\n return input || null;\n }\n\n return null;\n}\n", "/**\n * Provider factory and registry\n */\n\nimport type { Provider, ProvidersConfig } from \"../types/provider.ts\";\nimport { OpenAIProvider } from \"./openai.ts\";\nimport { AnthropicProvider } from \"./anthropic.ts\";\nimport { GoogleProvider } from \"./google.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\n/**\n * Provider registry\n */\nclass ProviderRegistry {\n private providers = new Map<string, Provider>();\n private config: ProvidersConfig = {};\n private autoInitialized = false;\n\n /**\n * Auto-initialize providers from environment variables\n * This is called lazily when a provider is first requested\n */\n private autoInitializeFromEnv(): void {\n if (this.autoInitialized) return;\n this.autoInitialized = true;\n\n // Initialize OpenAI from OPENAI_API_KEY\n const openaiKey = getEnv(\"OPENAI_API_KEY\");\n if (openaiKey && !this.providers.has(\"openai\")) {\n try {\n const provider = new OpenAIProvider({\n apiKey: openaiKey,\n baseURL: getEnv(\"OPENAI_BASE_URL\"),\n organizationId: getEnv(\"OPENAI_ORGANIZATION_ID\"),\n });\n this.providers.set(\"openai\", provider);\n agentLogger.debug(\"Auto-initialized OpenAI provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize OpenAI provider:\", error);\n }\n }\n\n // Initialize Anthropic from ANTHROPIC_API_KEY\n const anthropicKey = getEnv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey && !this.providers.has(\"anthropic\")) {\n try {\n const provider = new AnthropicProvider({\n apiKey: anthropicKey,\n baseURL: getEnv(\"ANTHROPIC_BASE_URL\"),\n });\n this.providers.set(\"anthropic\", provider);\n agentLogger.debug(\"Auto-initialized Anthropic provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize Anthropic provider:\", error);\n }\n }\n\n // Initialize Google from GOOGLE_API_KEY or GOOGLE_GENERATIVE_AI_API_KEY\n const googleKey = getEnv(\"GOOGLE_API_KEY\") || getEnv(\"GOOGLE_GENERATIVE_AI_API_KEY\");\n if (googleKey && !this.providers.has(\"google\")) {\n try {\n const provider = new GoogleProvider({\n apiKey: googleKey,\n });\n this.providers.set(\"google\", provider);\n agentLogger.debug(\"Auto-initialized Google provider from environment\");\n } catch (error) {\n agentLogger.warn(\"Failed to auto-initialize Google provider:\", error);\n }\n }\n }\n\n /**\n * Initialize providers from configuration\n */\n initialize(config: ProvidersConfig): void {\n this.config = config;\n\n // Initialize OpenAI\n if (config.openai) {\n try {\n const provider = new OpenAIProvider(config.openai);\n this.providers.set(\"openai\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize OpenAI provider:\", error);\n }\n }\n\n // Initialize Anthropic\n if (config.anthropic) {\n try {\n const provider = new AnthropicProvider(config.anthropic);\n this.providers.set(\"anthropic\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize Anthropic provider:\", error);\n }\n }\n\n // Initialize Google\n if (config.google) {\n try {\n const provider = new GoogleProvider(config.google);\n this.providers.set(\"google\", provider);\n } catch (error) {\n agentLogger.warn(\"Failed to initialize Google provider:\", error);\n }\n }\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): Provider {\n // Auto-initialize from environment variables if not already done\n this.autoInitializeFromEnv();\n\n const provider = this.providers.get(name);\n\n if (!provider) {\n throw toError(createError({\n type: \"agent\",\n message: `Provider \"${name}\" not found. Available providers: ${\n Array.from(this.providers.keys()).join(\", \")\n }`,\n }));\n }\n\n return provider;\n }\n\n /**\n * Get provider from model string (format: \"provider/model-name\")\n */\n getProviderFromModel(modelString: string): {\n provider: Provider;\n model: string;\n } {\n const parts = modelString.split(\"/\");\n\n if (parts.length !== 2) {\n throw toError(createError({\n type: \"config\",\n message:\n `Invalid model string format: \"${modelString}\". Expected format: \"provider/model-name\" (e.g., \"openai/gpt-4\")`,\n }));\n }\n\n const providerName = parts[0];\n const modelName = parts[1];\n\n if (!providerName || !modelName) {\n throw toError(createError({\n type: \"config\",\n message:\n `Invalid model string format: \"${modelString}\". Both provider and model name are required.`,\n }));\n }\n\n const provider = this.getProvider(providerName);\n\n return { provider, model: modelName };\n }\n\n /**\n * Get default provider\n */\n getDefaultProvider(): Provider {\n const defaultName = this.config.default || \"openai\";\n return this.getProvider(defaultName);\n }\n\n /**\n * Check if a provider is available\n */\n hasProvider(name: string): boolean {\n this.autoInitializeFromEnv();\n return this.providers.has(name);\n }\n\n /**\n * Get all available provider names\n */\n getAvailableProviders(): string[] {\n this.autoInitializeFromEnv();\n return Array.from(this.providers.keys());\n }\n\n /**\n * Clear all providers (for testing)\n */\n clear(): void {\n this.providers.clear();\n this.config = {};\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROVIDER_REGISTRY_KEY = \"__veryfront_provider_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalProvider = globalThis as any;\nexport const providerRegistry: ProviderRegistry = _globalProvider[PROVIDER_REGISTRY_KEY] ||=\n new ProviderRegistry();\n\n/**\n * Initialize providers with configuration\n */\nexport function initializeProviders(config: ProvidersConfig): void {\n providerRegistry.initialize(config);\n}\n\n/**\n * Get a provider by name\n */\nexport function getProvider(name: string): Provider {\n return providerRegistry.getProvider(name);\n}\n\n/**\n * Get provider from model string\n */\nexport function getProviderFromModel(modelString: string): {\n provider: Provider;\n model: string;\n} {\n return providerRegistry.getProviderFromModel(modelString);\n}\n", "import type { z } from \"zod\";\nimport { ZodFirstPartyTypeKind } from \"zod\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\n\nexport function zodToJsonSchema(schema: z.ZodTypeAny): JsonSchema {\n // Guard against invalid schemas (can happen with different zod instances in npm bundle)\n if (!schema || typeof schema !== \"object\" || !(\"_def\" in schema)) {\n throw new Error(\"Invalid Zod schema: missing _def property\");\n }\n\n const details = unwrapSchema(schema);\n const json = convert(details.schema);\n if (details.nullable) {\n return { anyOf: [json, { type: \"null\" }] };\n }\n return json;\n}\n\nexport function isOptionalSchema(schema: z.ZodTypeAny): boolean {\n const { optional } = unwrapSchema(schema);\n return optional;\n}\n\nfunction convert(schema: z.ZodTypeAny): JsonSchema {\n switch (schema._def.typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return { type: \"string\" };\n case ZodFirstPartyTypeKind.ZodNumber:\n return { type: \"number\" };\n case ZodFirstPartyTypeKind.ZodBoolean:\n return { type: \"boolean\" };\n case ZodFirstPartyTypeKind.ZodBigInt:\n return { type: \"integer\" };\n case ZodFirstPartyTypeKind.ZodLiteral: {\n const literal = (schema as z.ZodLiteral<unknown>)._def.value;\n return {\n const: literal,\n type: typeof literal === \"string\"\n ? \"string\"\n : typeof literal === \"number\"\n ? \"number\"\n : typeof literal === \"boolean\"\n ? \"boolean\"\n : undefined,\n };\n }\n case ZodFirstPartyTypeKind.ZodEnum:\n return {\n type: \"string\",\n enum: (schema as z.ZodEnum<[string, ...string[]]>)._def.values,\n };\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return {\n enum: Object.values((schema as z.ZodNativeEnum<any>)._def.values).filter(\n (value) => typeof value !== \"number\",\n ),\n };\n case ZodFirstPartyTypeKind.ZodObject: {\n const obj = schema as z.ZodObject<any>;\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n // Access shape - it might be a function (lazy getter) or an object\n const shape = typeof obj._def.shape === \"function\" ? obj._def.shape() : obj._def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const zodSchema = value as z.ZodTypeAny;\n properties[key] = zodToJsonSchema(zodSchema);\n if (!isOptionalSchema(zodSchema)) {\n required.push(key);\n }\n }\n\n const json: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) {\n json.required = required;\n }\n return json;\n }\n case ZodFirstPartyTypeKind.ZodArray: {\n const array = schema as z.ZodArray<z.ZodTypeAny>;\n return {\n type: \"array\",\n items: zodToJsonSchema(array._def.type),\n };\n }\n case ZodFirstPartyTypeKind.ZodTuple: {\n const tuple = schema as z.ZodTuple;\n return {\n type: \"array\",\n prefixItems: tuple._def.items.map((item) => zodToJsonSchema(item)),\n minItems: tuple._def.items.length,\n maxItems: tuple._def.items.length,\n };\n }\n case ZodFirstPartyTypeKind.ZodUnion: {\n const union = schema as z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;\n return {\n anyOf: union._def.options.map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n const union = schema as z.ZodDiscriminatedUnion<string, z.ZodObject<any>[]>;\n return {\n anyOf: Array.from(union._def.options.values()).map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodRecord:\n return {\n type: \"object\",\n additionalProperties: zodToJsonSchema((schema as z.ZodRecord<any>)._def.valueType),\n };\n case ZodFirstPartyTypeKind.ZodDefault: {\n const def = schema as z.ZodDefault<z.ZodTypeAny>;\n const inner = zodToJsonSchema(def._def.innerType);\n const defaultValue = def._def.defaultValue();\n if (typeof inner === \"object\" && !(\"anyOf\" in inner)) {\n inner.default = defaultValue;\n }\n return inner;\n }\n case ZodFirstPartyTypeKind.ZodLazy:\n return convert((schema as z.ZodLazy<any>)._def.getter());\n case ZodFirstPartyTypeKind.ZodEffects:\n return convert((schema as z.ZodEffects<any>)._def.schema);\n default:\n return { type: \"object\" };\n }\n}\n\nfunction unwrapSchema(schema: z.ZodTypeAny) {\n let current: z.ZodTypeAny = schema;\n let nullable = false;\n let optional = false;\n\n while (true) {\n switch (current._def.typeName) {\n case ZodFirstPartyTypeKind.ZodNullable:\n nullable = true;\n current = (current as z.ZodNullable<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodOptional:\n optional = true;\n current = (current as z.ZodOptional<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodEffects:\n current = (current as z.ZodEffects<any>)._def.schema;\n continue;\n default:\n return { schema: current, nullable, optional };\n }\n }\n}\n", "import type { Tool, ToolConfig, ToolDefinition, ToolExecutionContext } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"./zod-json-schema.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create a tool\n *\n * @example\n * ```typescript\n * import { tool } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * const results = await searchWeb(query);\n * return results;\n * },\n * });\n * ```\n */\nexport function tool<TInput = any, TOutput = any>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const id = config.id || generateToolId();\n\n // Check if we have a valid zod schema (has _def property)\n const hasValidZodSchema = config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"_def\" in config.inputSchema &&\n (config.inputSchema as { _def?: { typeName?: string } })._def?.typeName;\n\n // Pre-convert Zod schema to JSON Schema immediately\n // This happens BEFORE any bundling, in a clean environment\n let inputSchemaJson: JsonSchema | undefined;\n if (hasValidZodSchema) {\n try {\n inputSchemaJson = zodToJsonSchema(config.inputSchema);\n agentLogger.info(\n `[TOOL] Pre-converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch (error) {\n agentLogger.warn(`[TOOL] Failed to pre-convert schema for \"${id}\":`, error);\n // Continue without pre-converted schema - will fall back to runtime conversion\n }\n } else {\n // Try to introspect the schema from external zod instance\n const externalSchema = config.inputSchema as {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, unknown>) | Record<string, unknown>;\n };\n };\n\n if (externalSchema?._def?.shape) {\n try {\n const shape = typeof externalSchema._def.shape === \"function\"\n ? externalSchema._def.shape()\n : externalSchema._def.shape;\n\n // Build JSON Schema from shape inspection\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n // Default to string type for unknown schemas\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n required: Object.keys(properties),\n };\n agentLogger.info(\n `[TOOL] Introspected schema for \"${id}\" from external zod: ${\n Object.keys(properties).length\n } properties`,\n );\n } catch {\n inputSchemaJson = { type: \"object\", properties: {} };\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" could not be introspected. Using empty schema.`,\n );\n }\n } else {\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" is not a valid Zod schema (different zod instance?). ` +\n `Skipping pre-conversion. Input validation may be limited.`,\n );\n // Create a basic schema from inspection if possible\n inputSchemaJson = { type: \"object\", properties: {} };\n }\n }\n\n return {\n id,\n type: \"function\" as const,\n description: config.description,\n inputSchema: config.inputSchema,\n inputSchemaJson, // Store pre-converted schema\n execute: async (input: TInput, context?: ToolExecutionContext) => {\n // Validate input if zod schema is available\n if (hasValidZodSchema) {\n try {\n config.inputSchema.parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n } else if (\n config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"parse\" in config.inputSchema &&\n typeof (config.inputSchema as { parse?: unknown }).parse === \"function\"\n ) {\n // Try to use parse method if available (external zod instance)\n try {\n (config.inputSchema as { parse: (input: unknown) => void }).parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n }\n\n // Execute tool\n return await config.execute(input, context);\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Configuration for dynamic tools where input/output types are unknown at compile time\n */\nexport interface DynamicToolConfig {\n /** Tool identifier (optional, auto-generated if not provided) */\n id?: string;\n\n /** Tool description for the AI model */\n description: string;\n\n /**\n * Input schema - any Zod schema is accepted. For dynamic tools where the input shape\n * is truly unknown at compile time, it is recommended to use z.unknown(), z.any(),\n * or z.object({}). A schema is still required for validation even though types are unknown.\n */\n inputSchema: unknown;\n\n /**\n * Tool execution function - input is typed as unknown and must be validated/cast at runtime\n */\n execute: (\n input: unknown,\n context?: ToolExecutionContext,\n ) => Promise<unknown> | unknown;\n\n /**\n * Optional conversion function that maps the tool result to an output\n * that can be used by the language model\n */\n toModelOutput?: (output: unknown) => unknown;\n\n /** MCP configuration */\n mcp?: {\n /** Expose via MCP */\n enabled?: boolean;\n /** Require authentication */\n requiresAuth?: boolean;\n /** Cache policy */\n cachePolicy?: \"no-cache\" | \"cache\" | \"cache-first\";\n };\n}\n\n/**\n * Create a dynamic tool where input/output types are not known at compile time.\n *\n * Use this for:\n * - MCP (Model Context Protocol) tools without schemas\n * - User-defined functions loaded at runtime\n * - Tools loaded from external sources or databases\n * - Dynamic tool generation based on user input\n *\n * @example\n * ```typescript\n * import { dynamicTool } from 'veryfront/ai';\n * import { z } from 'zod';\n *\n * export const customTool = dynamicTool({\n * description: 'Execute a custom user-defined function',\n * inputSchema: z.object({}),\n * execute: async (input) => {\n * // input is typed as 'unknown' - validate/cast at runtime\n * const { action, parameters } = input as any;\n * return { result: `Executed ${action}` };\n * },\n * });\n * ```\n */\nexport function dynamicTool(config: DynamicToolConfig): Tool<unknown, unknown> {\n const id = config.id || generateToolId();\n\n // Try to convert schema to JSON Schema if possible\n let inputSchemaJson: JsonSchema | undefined;\n\n // Check if it's a zod-like schema with _def\n const zodLikeSchema = config.inputSchema as {\n _def?: { typeName?: string; shape?: (() => Record<string, unknown>) | Record<string, unknown> };\n };\n\n if (zodLikeSchema?._def?.typeName) {\n try {\n // deno-lint-ignore no-explicit-any\n inputSchemaJson = zodToJsonSchema(config.inputSchema as any);\n agentLogger.info(\n `[DYNAMIC_TOOL] Converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch {\n // For z.unknown() or z.any(), create a permissive schema\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using permissive schema for \"${id}\"`);\n }\n } else if (zodLikeSchema?._def?.shape) {\n // Try to introspect shape\n try {\n const shape = typeof zodLikeSchema._def.shape === \"function\"\n ? zodLikeSchema._def.shape()\n : zodLikeSchema._def.shape;\n\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n additionalProperties: true,\n };\n agentLogger.info(`[DYNAMIC_TOOL] Introspected schema for \"${id}\"`);\n } catch {\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n }\n } else {\n // Fully dynamic - accept anything\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using fully dynamic schema for \"${id}\"`);\n }\n\n return {\n id,\n type: \"dynamic\" as const,\n description: config.description,\n inputSchema: config.inputSchema as any,\n inputSchemaJson,\n execute: async (input: unknown, context?: ToolExecutionContext) => {\n // For dynamic tools, we skip input validation entirely.\n // The tool implementation is responsible for runtime validation.\n const result = await config.execute(input, context);\n\n // Apply output transformation if provided\n if (config.toModelOutput) {\n return config.toModelOutput(result);\n }\n\n return result;\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate a unique tool ID\n */\nlet toolIdCounter = 0;\nfunction generateToolId(): string {\n return `tool_${Date.now()}_${toolIdCounter++}`;\n}\n\n/**\n * Tool registry for managing tools\n */\nclass ToolRegistryClass {\n private tools = new Map<string, Tool>();\n\n register(id: string, toolInstance: Tool): void {\n if (this.tools.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Tool \"${id}\" is already registered. Overwriting.`);\n }\n\n this.tools.set(id, toolInstance);\n }\n\n /**\n * Get a tool by ID\n */\n get(id: string): Tool | undefined {\n return this.tools.get(id);\n }\n\n /**\n * Check if a tool exists\n */\n has(id: string): boolean {\n return this.tools.has(id);\n }\n\n /**\n * Get all tool IDs\n */\n getAllIds(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * Get all tools\n */\n getAll(): Map<string, Tool> {\n return new Map(this.tools);\n }\n\n /**\n * Clear all tools (for testing)\n */\n clear(): void {\n this.tools.clear();\n }\n\n getToolsForProvider(): ToolDefinition[] {\n return Array.from(this.tools.values()).map(toolToProviderDefinition);\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst TOOL_REGISTRY_KEY = \"__veryfront_tool_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalTool = globalThis as any;\nexport const toolRegistry: ToolRegistryClass = _globalTool[TOOL_REGISTRY_KEY] ||=\n new ToolRegistryClass();\n\nexport function toolToProviderDefinition(tool: Tool): ToolDefinition {\n // Use pre-converted JSON Schema if available (preferred)\n // Fall back to runtime conversion if needed\n const jsonSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n agentLogger.info(\n `[TOOL] Using ${\n tool.inputSchemaJson ? \"pre-converted\" : \"runtime-converted\"\n } schema for \"${tool.id}\"`,\n );\n\n return {\n name: tool.id,\n description: tool.description,\n parameters: jsonSchema,\n };\n}\n\n/**\n * Execute a tool by ID\n */\nexport async function executeTool(\n toolId: string,\n input: unknown,\n context?: ToolExecutionContext,\n): Promise<unknown> {\n const tool = toolRegistry.get(toolId);\n\n if (!tool) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" not found`,\n }));\n }\n\n try {\n const result = await tool.execute(input, context);\n return result;\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" execution failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n}\n\nexport { zodToJsonSchema } from \"./zod-json-schema.ts\";\n", "/**\n * Platform Detection and Runtime Abstractions\n *\n * Detects the current JavaScript runtime and provides platform-specific\n * capabilities and constraints.\n *\n * Supported platforms:\n * - Deno\n * - Node.js\n * - Bun\n * - Cloudflare Workers\n */\n\nexport type Platform = \"deno\" | \"node\" | \"bun\" | \"cloudflare-workers\" | \"unknown\";\n\nexport interface PlatformCapabilities {\n /** Can run MCP server (requires TCP server support) */\n canRunMCPServer: boolean;\n\n /** Maximum agent steps before timeout risk */\n maxAgentSteps: number;\n\n /** CPU time limit in milliseconds */\n cpuTimeLimit: number | null;\n\n /** Memory limit in MB */\n memoryLimit: number | null;\n\n /** Supports file system access */\n hasFileSystem: boolean;\n\n /** Supports long-running tasks */\n supportsLongRunning: boolean;\n\n /** Recommended for streaming */\n streamingRecommended: boolean;\n\n /** Platform display name */\n displayName: string;\n}\n\n/**\n * Detects the current JavaScript runtime platform\n */\nexport function detectPlatform(): Platform {\n // Check for Deno\n // @ts-ignore - Deno global may not exist\n if (typeof Deno !== \"undefined\" && Deno.version?.deno) {\n return \"deno\";\n }\n\n // Check for Bun\n // @ts-ignore - Bun global may not exist\n if (typeof Bun !== \"undefined\" && Bun.version) {\n return \"bun\";\n }\n\n // Check for Cloudflare Workers\n // @ts-ignore - caches global specific to CF Workers\n if (\n typeof caches !== \"undefined\" && typeof navigator !== \"undefined\" &&\n navigator.userAgent === \"Cloudflare-Workers\"\n ) {\n return \"cloudflare-workers\";\n }\n\n // Check for Node.js\n const globalProcess = (globalThis as any).process;\n if (\n typeof globalProcess !== \"undefined\" &&\n globalProcess.versions?.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Gets platform capabilities for the current or specified platform\n */\nexport function getPlatformCapabilities(platform?: Platform): PlatformCapabilities {\n const detectedPlatform = platform || detectPlatform();\n\n switch (detectedPlatform) {\n case \"deno\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null, // No hard limit\n memoryLimit: null, // System dependent\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Deno\",\n };\n\n case \"node\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null,\n memoryLimit: null,\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Node.js\",\n };\n\n case \"bun\":\n return {\n canRunMCPServer: true,\n maxAgentSteps: Infinity,\n cpuTimeLimit: null,\n memoryLimit: null,\n hasFileSystem: true,\n supportsLongRunning: true,\n streamingRecommended: false,\n displayName: \"Bun\",\n };\n\n case \"cloudflare-workers\":\n return {\n canRunMCPServer: false, // CF Workers cannot run TCP servers\n maxAgentSteps: 3, // Conservative limit for 30s CPU time\n cpuTimeLimit: 30000, // 30 seconds\n memoryLimit: 128, // 128 MB\n hasFileSystem: false,\n supportsLongRunning: false,\n streamingRecommended: true, // Required for good UX\n displayName: \"Cloudflare Workers\",\n };\n\n default:\n return {\n canRunMCPServer: false,\n maxAgentSteps: 5,\n cpuTimeLimit: 60000,\n memoryLimit: 512,\n hasFileSystem: false,\n supportsLongRunning: false,\n streamingRecommended: true,\n displayName: \"Unknown Platform\",\n };\n }\n}\n\n/**\n * Checks if the current platform supports a specific capability\n */\nexport function supportsCapability(capability: keyof PlatformCapabilities): boolean {\n const capabilities = getPlatformCapabilities();\n const value = capabilities[capability];\n\n // Handle boolean capabilities\n if (typeof value === \"boolean\") {\n return value;\n }\n\n // Handle numeric capabilities (non-zero means supported)\n if (typeof value === \"number\") {\n return value > 0;\n }\n\n return false;\n}\n\n/**\n * Gets a warning message if the current platform has constraints\n */\nexport function getPlatformWarnings(): string[] {\n const platform = detectPlatform();\n const capabilities = getPlatformCapabilities(platform);\n const warnings: string[] = [];\n\n if (!capabilities.canRunMCPServer) {\n warnings.push(\n `MCP server cannot run on ${capabilities.displayName}. Deploy MCP server to a different platform.`,\n );\n }\n\n if (capabilities.maxAgentSteps < 10) {\n warnings.push(\n `${capabilities.displayName} has limited agent steps (${capabilities.maxAgentSteps}). Use simple agents only.`,\n );\n }\n\n if (capabilities.cpuTimeLimit !== null && capabilities.cpuTimeLimit < 60000) {\n warnings.push(\n `${capabilities.displayName} has CPU time limit of ${capabilities.cpuTimeLimit}ms. Enable streaming for better UX.`,\n );\n }\n\n if (!capabilities.hasFileSystem) {\n warnings.push(\n `${capabilities.displayName} has no file system access. Avoid file-based tools.`,\n );\n }\n\n return warnings;\n}\n\nexport interface CompatibilityConfig {\n maxSteps?: number;\n streaming?: boolean;\n requiresFileSystem?: boolean;\n requiresMCP?: boolean;\n}\n\nexport function validatePlatformCompatibility(\n config: CompatibilityConfig,\n platform?: Platform,\n): {\n compatible: boolean;\n errors: string[];\n warnings: string[];\n} {\n const capabilities = getPlatformCapabilities(platform);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check max steps\n if (config.maxSteps && config.maxSteps > capabilities.maxAgentSteps) {\n if (capabilities.maxAgentSteps === Infinity) {\n // No limit, all good\n } else {\n errors.push(\n `Agent maxSteps (${config.maxSteps}) exceeds platform limit (${capabilities.maxAgentSteps})`,\n );\n }\n }\n\n // Check file system requirement\n if (config.requiresFileSystem && !capabilities.hasFileSystem) {\n errors.push(\n `Agent requires file system but ${capabilities.displayName} doesn't support it`,\n );\n }\n\n // Check MCP requirement\n if (config.requiresMCP && !capabilities.canRunMCPServer) {\n errors.push(\n `Agent requires MCP server but ${capabilities.displayName} cannot run it`,\n );\n }\n\n // Check streaming recommendation\n if (!config.streaming && capabilities.streamingRecommended) {\n warnings.push(\n `Streaming is recommended on ${capabilities.displayName} for better user experience`,\n );\n }\n\n return {\n compatible: errors.length === 0,\n errors,\n warnings,\n };\n}\n", "/**\n * MCP Resource factory and utilities\n */\n\nimport type { Resource, ResourceConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP resource\n *\n * @example\n * ```typescript\n * import { resource } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default resource({\n * description: 'Get user profile',\n * paramsSchema: z.object({\n * userId: z.string(),\n * }),\n * load: async ({ userId }) => {\n * return await db.users.findUnique({ where: { id: userId } });\n * },\n * });\n * ```\n */\nexport function resource<TParams = any, TData = any>(\n config: ResourceConfig<TParams, TData>,\n): Resource<TParams, TData> {\n // Generate pattern if not provided\n const pattern = config.pattern || generateResourcePattern();\n\n // Generate ID from pattern\n const id = patternToId(pattern);\n\n return {\n id,\n pattern,\n description: config.description,\n paramsSchema: config.paramsSchema,\n load: async (params: TParams) => {\n // Validate params\n try {\n config.paramsSchema.parse(params);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource \"${id}\" params validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n\n return await config.load(params);\n },\n subscribe: config.subscribe,\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate resource pattern fallback\n * Note: In practice, resources should explicitly define their pattern.\n * Auto-discovery is handled by the discovery.ts module which scans\n * the filesystem and extracts patterns from resource definitions.\n */\nfunction generateResourcePattern(): string {\n return `/resource_${Date.now()}`;\n}\n\n/**\n * Convert path pattern to ID\n * Example: \"/users/:userId/profile\" -> \"users_userId_profile\"\n */\nfunction patternToId(pattern: string): string {\n return pattern\n .replace(/^\\//, \"\")\n .replace(/\\//g, \"_\")\n .replace(/:/g, \"\");\n}\n\n/**\n * Resource registry\n */\nclass ResourceRegistryClass {\n private resources = new Map<string, Resource>();\n\n /**\n * Register a resource\n */\n register(id: string, resourceInstance: Resource): void {\n if (this.resources.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Resource \"${id}\" is already registered. Overwriting.`);\n }\n\n this.resources.set(id, resourceInstance);\n }\n\n /**\n * Get a resource by ID\n */\n get(id: string): Resource | undefined {\n return this.resources.get(id);\n }\n\n /**\n * Get resource by pattern matching\n */\n findByPattern(uri: string): Resource | undefined {\n for (const resource of this.resources.values()) {\n if (this.matchesPattern(uri, resource.pattern)) {\n return resource;\n }\n }\n return undefined;\n }\n\n /**\n * Check if URI matches pattern\n * Uses regex-based pattern matching with named capture groups.\n * Supports Express-style patterns like \"/users/:userId/profile\"\n */\n private matchesPattern(uri: string, pattern: string): boolean {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n return patternRegex.test(uri);\n }\n\n /**\n * Extract params from URI using pattern\n */\n extractParams(uri: string, pattern: string): Record<string, string> {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n const match = uri.match(patternRegex);\n\n return match?.groups || {};\n }\n\n /**\n * Get all resources\n */\n getAll(): Map<string, Resource> {\n return new Map(this.resources);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n this.resources.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst RESOURCE_REGISTRY_KEY = \"__veryfront_resource_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalResource = globalThis as any;\nexport const resourceRegistry: ResourceRegistryClass = _globalResource[RESOURCE_REGISTRY_KEY] ||=\n new ResourceRegistryClass();\n", "/**\n * MCP Prompt factory and utilities\n */\n\nimport type { Prompt, PromptConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP prompt template\n *\n * @example\n * ```typescript\n * import { prompt } from 'veryfront/ai';\n\n *\n * export default prompt({\n * description: 'Customer support prompt',\n * content: 'You are a helpful customer support agent...',\n * });\n * ```\n */\nexport function prompt(config: PromptConfig): Prompt {\n const id = config.id || generatePromptId();\n\n return {\n id,\n description: config.description,\n\n async getContent(\n variables?: Record<string, unknown>,\n ): Promise<string> {\n // If static content\n if (config.content) {\n return interpolateVariables(config.content, variables || {});\n }\n\n // If dynamic generator\n if (config.generate) {\n return await config.generate(variables || {});\n }\n\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" has no content or generator`,\n }));\n },\n };\n}\n\n/**\n * Generate a unique prompt ID\n */\nlet promptIdCounter = 0;\nfunction generatePromptId(): string {\n return `prompt_${Date.now()}_${promptIdCounter++}`;\n}\n\n/**\n * Interpolate variables in prompt template\n * Replaces {variableName} with actual values\n */\nfunction interpolateVariables(\n template: string,\n variables: Record<string, unknown>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Prompt registry\n */\nclass PromptRegistryClass {\n private prompts = new Map<string, Prompt>();\n\n /**\n * Register a prompt\n */\n register(id: string, promptInstance: Prompt): void {\n if (this.prompts.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Prompt \"${id}\" is already registered. Overwriting.`);\n }\n\n this.prompts.set(id, promptInstance);\n }\n\n /**\n * Get a prompt by ID\n */\n get(id: string): Prompt | undefined {\n return this.prompts.get(id);\n }\n\n /**\n * Get prompt content by ID\n */\n async getContent(\n id: string,\n variables?: Record<string, unknown>,\n ): Promise<string> {\n const promptInstance = this.get(id);\n\n if (!promptInstance) {\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" not found`,\n }));\n }\n\n return await promptInstance.getContent(variables);\n }\n\n /**\n * Get all prompts\n */\n getAll(): Map<string, Prompt> {\n return new Map(this.prompts);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n this.prompts.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROMPT_REGISTRY_KEY = \"__veryfront_prompt_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalPrompt = globalThis as any;\nexport const promptRegistry: PromptRegistryClass = _globalPrompt[PROMPT_REGISTRY_KEY] ||=\n new PromptRegistryClass();\n", "/**\n * MCP Registry - Central registry for all MCP resources\n */\n\nimport type { MCPRegistry } from \"../types/mcp.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { toolRegistry } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\n\n/**\n * Get the global MCP registry\n */\nexport function getMCPRegistry(): MCPRegistry {\n return {\n tools: toolRegistry.getAll(),\n resources: resourceRegistry.getAll(),\n prompts: promptRegistry.getAll(),\n };\n}\n\n/**\n * Register a tool in the MCP registry\n */\nexport function registerTool(id: string, tool: Tool): void {\n toolRegistry.register(id, tool);\n}\n\n/**\n * Register a resource in the MCP registry\n */\nexport function registerResource(id: string, resource: Resource): void {\n resourceRegistry.register(id, resource);\n}\n\n/**\n * Register a prompt in the MCP registry\n */\nexport function registerPrompt(id: string, promptInstance: Prompt): void {\n promptRegistry.register(id, promptInstance);\n}\n\n/**\n * Get MCP registry stats\n */\nexport function getMCPStats(): {\n tools: number;\n resources: number;\n prompts: number;\n total: number;\n} {\n const registry = getMCPRegistry();\n\n return {\n tools: registry.tools.size,\n resources: registry.resources.size,\n prompts: registry.prompts.size,\n total: registry.tools.size + registry.resources.size + registry.prompts.size,\n };\n}\n\n/**\n * Clear all MCP registries (for testing)\n */\nexport function clearMCPRegistry(): void {\n toolRegistry.clear();\n resourceRegistry.clear();\n promptRegistry.clear();\n}\n", "/**\n * Agent Composition Utilities\n *\n * Enables agents to orchestrate other agents for complex workflows\n */\n\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport { z } from \"zod\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\n\n/**\n * Convert an agent to a tool that can be called by other agents\n *\n * @example\n * ```typescript\n * import { agent, agentAsTool } from 'veryfront/ai';\n *\n * const researchAgent = agent({\n * model: 'gpt-4',\n * system: 'You are a research assistant',\n * });\n *\n * const writerAgent = agent({\n * model: 'gpt-4',\n * system: 'You are a content writer',\n * });\n *\n * const orchestrator = agent({\n * model: 'gpt-4',\n * system: 'You coordinate research and writing',\n * tools: {\n * research: agentAsTool(researchAgent, 'Research a topic'),\n * write: agentAsTool(writerAgent, 'Write content'),\n * },\n * });\n * ```\n */\nexport function agentAsTool(\n agent: Agent,\n description: string,\n): Tool {\n return {\n id: `agent_${agent.id}`,\n type: \"function\",\n description,\n inputSchema: z.object({\n input: z.string().describe(\"Input for the agent\"),\n }),\n async execute({ input }) {\n const response = await agent.generate({ input });\n return {\n text: response.text,\n toolCalls: response.toolCalls.length,\n status: response.status,\n };\n },\n };\n}\n\n/**\n * Create a multi-agent workflow\n *\n * @example\n * ```typescript\n * import { createWorkflow } from 'veryfront/ai';\n *\n * const workflow = createWorkflow({\n * steps: [\n * { agent: researchAgent, name: 'research' },\n * { agent: writerAgent, name: 'write' },\n * { agent: editorAgent, name: 'edit' },\n * ],\n * });\n *\n * const result = await workflow.execute('Write about AI');\n * ```\n */\nexport interface WorkflowStep {\n /** Agent to execute */\n agent: Agent;\n\n /** Step name */\n name: string;\n\n /** Transform output before passing to next step */\n transform?: (output: string) => string | Promise<string>;\n\n /** Condition to skip this step */\n skip?: (context: Record<string, unknown>) => boolean | Promise<boolean>;\n}\n\nexport interface WorkflowConfig {\n /** Workflow steps */\n steps: WorkflowStep[];\n\n /** Initial context */\n initialContext?: Record<string, unknown>;\n}\n\nexport interface WorkflowResult {\n /** Final output */\n output: string;\n\n /** Results from each step */\n steps: Array<{\n name: string;\n output: string;\n skipped: boolean;\n }>;\n\n /** Combined context */\n context: Record<string, unknown>;\n}\n\n/**\n * Create a multi-agent workflow\n */\nexport function createWorkflow(config: WorkflowConfig) {\n return {\n async execute(input: string): Promise<WorkflowResult> {\n const result: WorkflowResult = {\n output: input,\n steps: [],\n context: { ...config.initialContext },\n };\n\n for (const step of config.steps) {\n // Check if step should be skipped\n if (step.skip && (await step.skip(result.context))) {\n result.steps.push({\n name: step.name,\n output: \"\",\n skipped: true,\n });\n continue;\n }\n\n // Execute agent\n const response = await step.agent.generate({\n input: result.output,\n context: result.context,\n });\n\n // Transform output if needed\n let output = response.text;\n if (step.transform) {\n output = await step.transform(output);\n }\n\n // Update result\n result.output = output;\n result.steps.push({\n name: step.name,\n output,\n skipped: false,\n });\n\n // Update context\n result.context[step.name] = output;\n }\n\n return result;\n },\n };\n}\n\n/**\n * Agent registry for composition and multi-agent workflows\n *\n * Note: This registry is primarily used for agent-to-agent orchestration.\n * For API routes, agents should be imported directly to ensure they are\n * bundled with the route and available at runtime.\n */\nclass AgentRegistryClass {\n private agents = new Map<string, Agent>();\n\n /**\n * Register an agent\n */\n register(id: string, agent: Agent): void {\n if (this.agents.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Agent \"${id}\" is already registered. Overwriting.`);\n }\n this.agents.set(id, agent);\n agentLogger.debug(`Registered agent: ${id}`);\n }\n\n /**\n * Get an agent by ID\n */\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n /**\n * Check if an agent exists\n */\n has(id: string): boolean {\n return this.agents.has(id);\n }\n\n /**\n * Get all agent IDs\n */\n getAllIds(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get all agents as a Map\n */\n getAll(): Map<string, Agent> {\n return new Map(this.agents);\n }\n\n /**\n * Clear all agents (for testing)\n */\n clear(): void {\n this.agents.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst AGENT_REGISTRY_KEY = \"__veryfront_agent_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalAgent = globalThis as any;\nexport const agentRegistry: AgentRegistryClass = _globalAgent[AGENT_REGISTRY_KEY] ||=\n new AgentRegistryClass();\n\n// Export class for type usage\nexport { AgentRegistryClass };\n\n/**\n * Register an agent for use by other agents\n */\nexport function registerAgent(id: string, agent: Agent): void {\n agentRegistry.register(id, agent);\n}\n\n/**\n * Get an agent by ID from the registry.\n * Returns undefined if agent not found.\n */\nexport function getAgent(id: string): Agent | undefined {\n return agentRegistry.get(id);\n}\n\n/**\n * Get all registered agent IDs\n */\nexport function getAllAgentIds(): string[] {\n return agentRegistry.getAllIds();\n}\n\n/**\n * Get all registered agents as tools\n */\nexport function getAgentsAsTools(descriptions?: Record<string, string>): Record<string, Tool> {\n const tools: Record<string, Tool> = {};\n\n for (const [id, agent] of agentRegistry.getAll()) {\n const description = descriptions?.[id] || `Call ${id} agent`;\n tools[id] = agentAsTool(agent, description);\n }\n\n return tools;\n}\n", "import { z } from \"zod\";\nimport type { VeryfrontConfig } from \"./types.ts\";\nimport { type ConfigContext, createError, toError } from \"../errors/veryfront-error.ts\";\n\nconst corsSchema = z.union([z.boolean(), z.object({ origin: z.string().optional() }).strict()]);\n\nexport const veryfrontConfigSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n experimental: z.object({\n esmLayouts: z.boolean().optional(),\n precompileMDX: z.boolean().optional(),\n }).partial().optional(),\n router: z.enum([\"app\", \"pages\"]).optional(),\n defaultLayout: z.string().optional(),\n layout: z.string().optional(),\n provider: z.string().optional(),\n app: z.string().optional(),\n theme: z\n .object({ colors: z.record(z.string()).optional() })\n .partial()\n .optional(),\n build: z\n .object({\n outDir: z.string().optional(),\n trailingSlash: z.boolean().optional(),\n esbuild: z\n .object({\n wasmURL: z.string().url().optional(),\n worker: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n cache: z\n .object({\n dir: z.string().optional(),\n bundleManifest: z\n .object({\n type: z.enum([\"redis\", \"kv\", \"memory\"]).optional(),\n redisUrl: z.string().optional(),\n keyPrefix: z.string().optional(),\n ttl: z.number().int().positive().optional(),\n enabled: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n dev: z\n .object({\n port: z.number().int().positive().optional(),\n host: z.string().optional(),\n open: z.boolean().optional(),\n hmr: z.boolean().optional(),\n components: z.array(z.string()).optional(),\n })\n .partial()\n .optional(),\n resolve: z\n .object({\n importMap: z\n .object({\n imports: z.record(z.string()).optional(),\n scopes: z.record(z.record(z.string())).optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n security: z\n .object({\n csp: z.record(z.array(z.string())).optional(),\n remoteHosts: z.array(z.string().url()).optional(),\n cors: corsSchema.optional(),\n coop: z.enum([\"same-origin\", \"same-origin-allow-popups\", \"unsafe-none\"]).optional(),\n corp: z.enum([\"same-origin\", \"same-site\", \"cross-origin\"]).optional(),\n coep: z.enum([\"require-corp\", \"unsafe-none\"]).optional(),\n })\n .partial()\n .optional(),\n middleware: z\n .object({\n custom: z.array(z.function()).optional(),\n })\n .partial()\n .optional(),\n theming: z\n .object({\n brandName: z.string().optional(),\n logoHtml: z.string().optional(),\n })\n .partial()\n .optional(),\n assetPipeline: z\n .object({\n images: z\n .object({\n enabled: z.boolean().optional(),\n formats: z.array(z.enum([\"webp\", \"avif\", \"jpeg\", \"png\"])).optional(),\n sizes: z.array(z.number().int().positive()).optional(),\n quality: z.number().int().min(1).max(100).optional(),\n inputDir: z.string().optional(),\n outputDir: z.string().optional(),\n preserveOriginal: z.boolean().optional(),\n })\n .partial()\n .optional(),\n css: z\n .object({\n enabled: z.boolean().optional(),\n minify: z.boolean().optional(),\n autoprefixer: z.boolean().optional(),\n purge: z.boolean().optional(),\n criticalCSS: z.boolean().optional(),\n inputDir: z.string().optional(),\n outputDir: z.string().optional(),\n browsers: z.array(z.string()).optional(),\n purgeContent: z.array(z.string()).optional(),\n sourceMap: z.boolean().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n observability: z\n .object({\n tracing: z\n .object({\n enabled: z.boolean().optional(),\n exporter: z.enum([\"jaeger\", \"zipkin\", \"otlp\", \"console\"]).optional(),\n endpoint: z.string().optional(),\n serviceName: z.string().optional(),\n sampleRate: z.number().min(0).max(1).optional(),\n })\n .partial()\n .optional(),\n metrics: z\n .object({\n enabled: z.boolean().optional(),\n exporter: z.enum([\"prometheus\", \"otlp\", \"console\"]).optional(),\n endpoint: z.string().optional(),\n prefix: z.string().optional(),\n collectInterval: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n fs: z\n .object({\n type: z.enum([\"local\", \"veryfront-api\", \"memory\"]).optional(),\n local: z\n .object({\n baseDir: z.string().optional(),\n })\n .partial()\n .optional(),\n veryfront: z\n .object({\n apiBaseUrl: z.string().url(),\n apiToken: z.string(),\n projectSlug: z.string(),\n proxyMode: z.boolean().optional(),\n productionMode: z.boolean().optional(),\n cache: z\n .object({\n enabled: z.boolean().optional(),\n ttl: z.number().int().positive().optional(),\n maxSize: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n retry: z\n .object({\n maxRetries: z.number().int().min(0).optional(),\n initialDelay: z.number().int().positive().optional(),\n maxDelay: z.number().int().positive().optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n memory: z\n .object({\n files: z.record(z.union([z.string(), z.instanceof(Uint8Array)])).optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n client: z\n .object({\n moduleResolution: z.enum([\"cdn\", \"self-hosted\", \"bundled\"]).optional(),\n cdn: z\n .object({\n provider: z.enum([\"esm.sh\", \"unpkg\", \"jsdelivr\"]).optional(),\n versions: z\n .union([\n z.literal(\"auto\"),\n z.object({\n react: z.string().optional(),\n veryfront: z.string().optional(),\n }),\n ])\n .optional(),\n })\n .partial()\n .optional(),\n })\n .partial()\n .optional(),\n })\n .partial();\n\nexport type VeryfrontConfigInput = z.input<typeof veryfrontConfigSchema>;\n\nexport function validateVeryfrontConfig(input: unknown): VeryfrontConfig {\n const parsed = veryfrontConfigSchema.safeParse(input);\n if (!parsed.success) {\n const first = parsed.error.issues[0];\n const path = first?.path?.length ? first.path.join(\".\") : \"<root>\";\n const expected = first?.message || String(first);\n let hint = \"\";\n if (String(path).includes(\"security.cors\")) {\n hint = \" Expected boolean or { origin?: string }.\";\n }\n\n const context: ConfigContext = {\n field: path,\n expected: expected + hint,\n value: input,\n };\n\n throw toError(\n createError({\n type: \"config\",\n message: `Invalid veryfront.config at ${path}: ${expected}.${hint}`,\n context,\n }),\n );\n }\n return parsed.data as VeryfrontConfig;\n}\n\nexport function findUnknownTopLevelKeys(input: Record<string, unknown>): string[] {\n const known = new Set([\n \"title\",\n \"description\",\n \"experimental\",\n \"router\",\n \"defaultLayout\",\n \"layout\",\n \"provider\",\n \"app\",\n \"theme\",\n \"build\",\n \"cache\",\n \"dev\",\n \"resolve\",\n \"security\",\n \"middleware\",\n \"theming\",\n \"assetPipeline\",\n \"observability\",\n \"fs\",\n \"client\",\n ]);\n return Object.keys(input).filter((k) => !known.has(k));\n}\n", "import type { VeryfrontConfig } from \"./types.ts\";\nimport { findUnknownTopLevelKeys, validateVeryfrontConfig } from \"./schema.ts\";\nimport { dirname, join } from \"std/path/mod.ts\";\nimport type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport { serverLogger } from \"@veryfront/utils/logger/logger.ts\";\nimport { getReactImportMap, REACT_DEFAULT_VERSION } from \"@veryfront/utils/constants/cdn.ts\";\nimport { DEFAULT_CACHE_DIR } from \"@veryfront/utils/constants/server.ts\";\nimport { DEFAULT_PORT } from \"./defaults.ts\";\nimport { createFileSystem } from \"../../platform/compat/fs.ts\";\n\nexport type { VeryfrontConfig } from \"./types.ts\";\n\nfunction getDefaultImportMapForConfig() {\n return { imports: getReactImportMap(REACT_DEFAULT_VERSION) };\n}\n\nconst DEFAULT_CONFIG: Partial<VeryfrontConfig> = {\n title: \"Veryfront App\",\n description: \"Built with Veryfront\",\n experimental: {\n esmLayouts: true,\n },\n router: undefined,\n defaultLayout: undefined,\n theme: {\n colors: {\n primary: \"#3B82F6\",\n },\n },\n build: {\n outDir: \"dist\",\n trailingSlash: false,\n esbuild: {\n wasmURL: \"https://deno.land/x/esbuild@v0.20.1/esbuild.wasm\",\n worker: false,\n },\n },\n cache: {\n dir: DEFAULT_CACHE_DIR,\n render: {\n type: \"memory\",\n ttl: undefined,\n maxEntries: 500,\n kvPath: undefined,\n redisUrl: undefined,\n redisKeyPrefix: undefined,\n },\n },\n dev: {\n port: DEFAULT_PORT,\n host: \"localhost\",\n open: false,\n },\n resolve: {\n importMap: getDefaultImportMapForConfig(),\n },\n client: {\n moduleResolution: \"cdn\",\n cdn: {\n provider: \"esm.sh\",\n versions: \"auto\",\n },\n },\n};\n\nconst configCacheByProject = new Map<string, { revision: number; config: VeryfrontConfig }>();\nlet cacheRevision = 0;\n\nfunction validateCorsConfig(userConfig: unknown): void {\n if (!userConfig || typeof userConfig !== \"object\") {\n return;\n }\n const config = userConfig as Record<string, unknown>;\n const security = config.security as Record<string, unknown> | undefined;\n const cors = security?.cors;\n if (!cors || typeof cors !== \"object\" || Array.isArray(cors)) {\n return;\n }\n\n const corsObj = cors as Record<string, unknown>;\n const origin = corsObj.origin;\n if (origin !== undefined && typeof origin !== \"string\") {\n throw new ConfigValidationError(\n \"security.cors.origin must be a string. Expected boolean or { origin?: string }\",\n );\n }\n}\n\nfunction validateConfigShape(userConfig: unknown): void {\n validateVeryfrontConfig(userConfig);\n const unknown = typeof userConfig === \"object\" && userConfig\n ? findUnknownTopLevelKeys(userConfig as Record<string, unknown>)\n : [];\n if (unknown.length > 0) {\n serverLogger.warn(`Unknown config keys: ${unknown.join(\", \")}. These will be ignored.`);\n }\n}\n\nfunction mergeConfigs(userConfig: Partial<VeryfrontConfig>): VeryfrontConfig {\n const merged: VeryfrontConfig = {\n ...DEFAULT_CONFIG,\n ...userConfig,\n dev: {\n ...DEFAULT_CONFIG.dev,\n ...userConfig.dev,\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...userConfig.theme,\n },\n build: {\n ...DEFAULT_CONFIG.build,\n ...userConfig.build,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...userConfig.cache,\n },\n resolve: {\n ...DEFAULT_CONFIG.resolve,\n ...userConfig.resolve,\n },\n client: {\n ...DEFAULT_CONFIG.client,\n ...userConfig.client,\n cdn: {\n ...DEFAULT_CONFIG.client?.cdn,\n ...userConfig.client?.cdn,\n },\n },\n } as VeryfrontConfig;\n\n if (merged.resolve) {\n const defaultMap = DEFAULT_CONFIG.resolve?.importMap;\n const userMap = userConfig.resolve?.importMap;\n\n if (defaultMap || userMap) {\n merged.resolve.importMap = {\n imports: {\n ...(defaultMap?.imports ?? {}),\n ...(userMap?.imports ?? {}),\n },\n scopes: {\n ...(defaultMap?.scopes ?? {}),\n ...(userMap?.scopes ?? {}),\n },\n };\n }\n }\n\n return merged;\n}\n\nclass ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigValidationError\";\n }\n}\n\n/**\n * Check if the adapter is using a virtual filesystem (e.g., Veryfront API)\n * Supports both single-project (VeryfrontFSAdapter) and multi-project (MultiProjectFSAdapter) modes\n */\nfunction isVirtualFilesystem(adapter: RuntimeAdapter): boolean {\n const wrappedAdapter = (adapter?.fs as { fsAdapter?: unknown })?.fsAdapter;\n const adapterName = (wrappedAdapter as { constructor?: { name?: string } })?.constructor?.name;\n return adapterName === \"VeryfrontFSAdapter\" || adapterName === \"MultiProjectFSAdapter\";\n}\n\n/**\n * Load config from virtual filesystem by transpiling TypeScript content\n */\nasync function loadConfigFromVirtualFS(\n configPath: string,\n projectDir: string,\n adapter: RuntimeAdapter,\n): Promise<VeryfrontConfig | null> {\n const fs = createFileSystem();\n\n // Read config content via adapter\n const content = await adapter.fs.readFile(configPath);\n const source = typeof content === \"string\" ? content : new TextDecoder().decode(content);\n\n serverLogger.debug(`[CONFIG] Loading config from virtual FS: ${configPath}`);\n\n // Determine loader based on extension\n const isTsx = configPath.endsWith(\".tsx\");\n const loader = isTsx ? \"tsx\" : configPath.endsWith(\".ts\") ? \"ts\" : \"js\";\n\n // Transpile TypeScript to JavaScript using esbuild\n const { build } = await import(\"esbuild\");\n\n const result = await build({\n bundle: false, // Config files shouldn't need bundling\n write: false,\n format: \"esm\",\n platform: \"neutral\",\n target: \"es2022\",\n stdin: {\n contents: source,\n loader,\n resolveDir: dirname(configPath),\n sourcefile: configPath,\n },\n });\n\n if (result.errors && result.errors.length > 0) {\n const first = result.errors[0]?.text || \"unknown error\";\n throw new ConfigValidationError(`Failed to transpile config: ${first}`);\n }\n\n const js = result.outputFiles?.[0]?.text ?? \"export default {}\";\n\n // Write to temp file and import\n const tempDir = await fs.makeTempDir({ prefix: \"vf-config-\" });\n const tempFile = join(tempDir, \"config.mjs\");\n\n try {\n await fs.writeTextFile(tempFile, js);\n const configModule = await import(`file://${tempFile}?v=${Date.now()}`);\n const userConfig = configModule.default || configModule;\n\n if (userConfig === null || typeof userConfig !== \"object\" || Array.isArray(userConfig)) {\n throw new ConfigValidationError(\n `Expected object, received ${userConfig === null ? \"null\" : typeof userConfig}`,\n );\n }\n\n validateCorsConfig(userConfig);\n validateConfigShape(userConfig);\n\n const merged = mergeConfigs(userConfig);\n configCacheByProject.set(projectDir, { revision: cacheRevision, config: merged });\n return merged;\n } finally {\n await fs.remove(tempDir, { recursive: true });\n }\n}\n\nasync function loadAndMergeConfig(\n configPath: string,\n projectDir: string,\n adapter: RuntimeAdapter,\n): Promise<VeryfrontConfig | null> {\n // Check if using virtual filesystem\n if (isVirtualFilesystem(adapter)) {\n return loadConfigFromVirtualFS(configPath, projectDir, adapter);\n }\n\n // Local filesystem - use direct import\n try {\n const configUrl = `file://${configPath}?t=${Date.now()}-${crypto.randomUUID()}`;\n const configModule = await import(configUrl);\n const userConfig = configModule.default || configModule;\n\n if (userConfig === null || typeof userConfig !== \"object\" || Array.isArray(userConfig)) {\n throw new ConfigValidationError(\n `Expected object, received ${userConfig === null ? \"null\" : typeof userConfig}`,\n );\n }\n\n validateCorsConfig(userConfig);\n validateConfigShape(userConfig);\n\n const merged = mergeConfigs(userConfig);\n configCacheByProject.set(projectDir, { revision: cacheRevision, config: merged });\n return merged;\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.startsWith(\"Invalid veryfront.config\")) {\n throw error;\n }\n\n throw error;\n }\n}\n\nexport async function getConfig(\n projectDir: string,\n adapter: RuntimeAdapter,\n): Promise<VeryfrontConfig> {\n const cached = configCacheByProject.get(projectDir);\n if (cached && cached.revision === cacheRevision) return cached.config;\n\n const configFiles = [\"veryfront.config.js\", \"veryfront.config.ts\", \"veryfront.config.mjs\"];\n\n for (const configFile of configFiles) {\n const configPath = join(projectDir, configFile);\n\n const exists = await adapter.fs.exists(configPath);\n if (!exists) continue;\n\n try {\n const merged = await loadAndMergeConfig(configPath, projectDir, adapter);\n if (merged) return merged;\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.startsWith(\"Invalid veryfront.config\")) {\n throw error;\n }\n\n // Only log at debug level - this is expected when .ts exists but .js is tried first\n const errorMessage = error instanceof Error ? error.message : String(error);\n serverLogger.debug(`[CONFIG] Failed to load ${configFile}, trying next config file:`, {\n error: errorMessage,\n });\n\n continue;\n }\n }\n\n const defaultConfig = DEFAULT_CONFIG as VeryfrontConfig;\n configCacheByProject.set(projectDir, { revision: cacheRevision, config: defaultConfig });\n return defaultConfig;\n}\n\nexport function clearConfigCache() {\n configCacheByProject.clear();\n cacheRevision++;\n}\n", "{\n \"name\": \"veryfront\",\n \"version\": \"0.0.75\",\n \"nodeModulesDir\": \"auto\",\n \"exclude\": [\n \"npm/\",\n \"dist/\",\n \"coverage/\",\n \"scripts/\",\n \"examples/\",\n \"src/cli/templates/files/\",\n \"src/cli/templates/integrations/\"\n ],\n \"exports\": {\n \".\": \"./src/index.ts\",\n \"./cli\": \"./src/cli/main.ts\",\n \"./server\": \"./src/server/index.ts\",\n \"./middleware\": \"./src/middleware/index.ts\",\n \"./components\": \"./src/react/components/index.ts\",\n \"./data\": \"./src/data/index.ts\",\n \"./config\": \"./src/core/config/index.ts\",\n \"./platform\": \"./src/platform/index.ts\",\n \"./ai\": \"./src/ai/index.ts\",\n \"./ai/client\": \"./src/ai/client.ts\",\n \"./ai/react\": \"./src/ai/react/index.ts\",\n \"./ai/primitives\": \"./src/ai/react/primitives/index.ts\",\n \"./ai/components\": \"./src/ai/react/components/index.ts\",\n \"./ai/production\": \"./src/ai/production/index.ts\",\n \"./ai/dev\": \"./src/ai/dev/index.ts\",\n \"./ai/workflow\": \"./src/ai/workflow/index.ts\",\n \"./ai/workflow/react\": \"./src/ai/workflow/react/index.ts\",\n \"./oauth\": \"./src/core/oauth/index.ts\",\n \"./oauth/providers\": \"./src/core/oauth/providers/index.ts\",\n \"./oauth/handlers\": \"./src/core/oauth/handlers/index.ts\",\n \"./oauth/token-store\": \"./src/core/oauth/token-store/index.ts\",\n \"./head\": \"./src/exports/head.ts\",\n \"./router\": \"./src/exports/router.ts\",\n \"./context\": \"./src/exports/context.ts\",\n \"./fonts\": \"./src/exports/fonts.ts\"\n },\n \"imports\": {\n \"@veryfront\": \"./src/index.ts\",\n \"@veryfront/\": \"./src/\",\n \"@veryfront/ai\": \"./src/ai/index.ts\",\n \"@veryfront/ai/\": \"./src/ai/\",\n \"@veryfront/platform\": \"./src/platform/index.ts\",\n \"@veryfront/platform/\": \"./src/platform/\",\n \"@veryfront/types\": \"./src/core/types/index.ts\",\n \"@veryfront/types/\": \"./src/core/types/\",\n \"@veryfront/utils\": \"./src/core/utils/index.ts\",\n \"@veryfront/utils/\": \"./src/core/utils/\",\n \"@veryfront/middleware\": \"./src/middleware/index.ts\",\n \"@veryfront/middleware/\": \"./src/middleware/\",\n \"@veryfront/errors\": \"./src/core/errors/index.ts\",\n \"@veryfront/errors/\": \"./src/core/errors/\",\n \"@veryfront/config\": \"./src/core/config/index.ts\",\n \"@veryfront/config/\": \"./src/core/config/\",\n \"@veryfront/observability\": \"./src/observability/index.ts\",\n \"@veryfront/observability/\": \"./src/observability/\",\n \"@veryfront/routing\": \"./src/routing/index.ts\",\n \"@veryfront/routing/\": \"./src/routing/\",\n \"@veryfront/transforms\": \"./src/build/transforms/index.ts\",\n \"@veryfront/transforms/\": \"./src/build/transforms/\",\n \"@veryfront/data\": \"./src/data/index.ts\",\n \"@veryfront/data/\": \"./src/data/\",\n \"@veryfront/security\": \"./src/security/index.ts\",\n \"@veryfront/security/\": \"./src/security/\",\n \"@veryfront/components\": \"./src/react/components/index.ts\",\n \"@veryfront/react\": \"./src/react/index.ts\",\n \"@veryfront/react/\": \"./src/react/\",\n \"@veryfront/html\": \"./src/html/index.ts\",\n \"@veryfront/html/\": \"./src/html/\",\n \"@veryfront/rendering\": \"./src/rendering/index.ts\",\n \"@veryfront/rendering/\": \"./src/rendering/\",\n \"@veryfront/build\": \"./src/build/index.ts\",\n \"@veryfront/build/\": \"./src/build/\",\n \"@veryfront/server\": \"./src/server/index.ts\",\n \"@veryfront/server/\": \"./src/server/\",\n \"@veryfront/modules\": \"./src/module-system/index.ts\",\n \"@veryfront/modules/\": \"./src/module-system/\",\n \"@veryfront/compat/console\": \"./src/platform/compat/console/index.ts\",\n \"@veryfront/compat/\": \"./src/platform/compat/\",\n \"@veryfront/oauth\": \"./src/core/oauth/index.ts\",\n \"@veryfront/oauth/\": \"./src/core/oauth/\",\n \"std/\": \"https://deno.land/std@0.220.0/\",\n \"@std/path\": \"https://deno.land/std@0.220.0/path/mod.ts\",\n \"@std/testing/bdd.ts\": \"https://deno.land/std@0.220.0/testing/bdd.ts\",\n \"@std/expect\": \"https://deno.land/std@0.220.0/expect/mod.ts\",\n \"csstype\": \"https://esm.sh/csstype@3.2.3\",\n \"@types/react\": \"https://esm.sh/@types/react@18.3.27?deps=csstype@3.2.3\",\n \"@types/react-dom\": \"https://esm.sh/@types/react-dom@18.3.7?deps=csstype@3.2.3\",\n \"react\": \"npm:react@18.3.1\",\n \"react-dom\": \"npm:react-dom@18.3.1\",\n \"react-dom/server\": \"npm:react-dom@18.3.1/server\",\n \"react-dom/client\": \"npm:react-dom@18.3.1/client\",\n \"react/jsx-runtime\": \"npm:react@18.3.1/jsx-runtime\",\n \"react/jsx-dev-runtime\": \"npm:react@18.3.1/jsx-dev-runtime\",\n \"@mdx-js/mdx\": \"npm:@mdx-js/mdx@3.0.0\",\n \"@mdx-js/react\": \"npm:@mdx-js/react@3.0.0\",\n \"unist-util-visit\": \"npm:unist-util-visit@5.0.0\",\n \"mdast-util-to-string\": \"npm:mdast-util-to-string@4.0.0\",\n \"github-slugger\": \"npm:github-slugger@2.0.0\",\n \"remark-gfm\": \"npm:remark-gfm@4.0.1\",\n \"remark-frontmatter\": \"npm:remark-frontmatter@5.0.0\",\n \"rehype-highlight\": \"npm:rehype-highlight@7.0.2\",\n \"rehype-slug\": \"npm:rehype-slug@6.0.0\",\n \"esbuild\": \"npm:esbuild@0.20.2\",\n \"esbuild/mod.js\": \"npm:esbuild@0.20.2\",\n \"es-module-lexer\": \"npm:es-module-lexer@1.5.0\",\n \"zod\": \"npm:zod@3.25.76\",\n \"mime-types\": \"npm:mime-types@2.1.35\",\n \"mdast\": \"npm:@types/mdast@4.0.3\",\n \"hast\": \"npm:@types/hast@3.0.3\",\n \"unist\": \"npm:@types/unist@3.0.2\",\n \"unified\": \"npm:unified@11.0.5\",\n \"ai\": \"npm:ai@5.0.76\",\n \"ai/react\": \"npm:@ai-sdk/react@2.0.1\",\n \"@ai-sdk/react\": \"npm:@ai-sdk/react@2.0.1\",\n \"@ai-sdk/openai\": \"https://esm.sh/@ai-sdk/openai@2.0.1\",\n \"@ai-sdk/anthropic\": \"https://esm.sh/@ai-sdk/anthropic@2.0.1\",\n \"unocss\": \"https://esm.sh/unocss@0.59.0\",\n \"@unocss/core\": \"https://esm.sh/@unocss/core@0.59.0\",\n \"@unocss/preset-wind\": \"https://esm.sh/@unocss/preset-wind@0.59.0\",\n \"next-themes\": \"npm:next-themes@0.4\",\n \"redis\": \"npm:redis\",\n \"pg\": \"npm:pg\",\n \"@opentelemetry/api\": \"npm:@opentelemetry/api@1\",\n \"@opentelemetry/core\": \"npm:@opentelemetry/core@1\",\n \"@opentelemetry/sdk-trace-base\": \"npm:@opentelemetry/sdk-trace-base@1\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"npm:@opentelemetry/exporter-trace-otlp-http@0.57\",\n \"@opentelemetry/resources\": \"npm:@opentelemetry/resources@1\",\n \"@opentelemetry/semantic-conventions\": \"npm:@opentelemetry/semantic-conventions@1\",\n \"@babel/parser\": \"npm:@babel/parser@7.26.3\",\n \"@babel/traverse\": \"npm:@babel/traverse@7.26.3\",\n \"@babel/generator\": \"npm:@babel/generator@7.26.3\",\n \"@babel/types\": \"npm:@babel/types@7.26.3\"\n },\n \"compilerOptions\": {\n \"jsx\": \"react-jsx\",\n \"jsxImportSource\": \"react\",\n \"strict\": true,\n \"noImplicitAny\": true,\n \"noUncheckedIndexedAccess\": true,\n \"types\": [\"npm:@types/react@18\"],\n \"lib\": [\n \"deno.window\",\n \"dom\",\n \"dom.iterable\",\n \"dom.asynciterable\",\n \"deno.ns\"\n ]\n },\n \"tasks\": {\n \"setup\": \"deno run --allow-all scripts/setup.ts\",\n \"dev\": \"deno run --allow-all --no-lock --unstable-net --unstable-worker-options src/cli/main.ts dev\",\n \"build\": \"deno compile --allow-all --output ../../bin/veryfront src/cli/main.ts\",\n \"build:npm\": \"deno run -A scripts/build-npm.ts\",\n \"release\": \"deno run -A scripts/release.ts\",\n \"test\": \"VF_DISABLE_LRU_INTERVAL=1 DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --unstable-worker-options --unstable-net\",\n \"test:unit\": \"VF_DISABLE_LRU_INTERVAL=1 DENO_JOBS=1 deno test --parallel --allow-all --v8-flags=--max-old-space-size=8192 --ignore=tests,src/ai/workflow/__tests__ --unstable-worker-options --unstable-net\",\n \"test:integration\": \"VF_DISABLE_LRU_INTERVAL=1 DENO_JOBS=1 deno test --parallel --fail-fast --allow-all tests --unstable-worker-options --unstable-net\",\n \"test:coverage\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --unstable-worker-options --unstable-net || exit 1\",\n \"test:coverage:unit\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --ignore=tests --unstable-worker-options --unstable-net || exit 1\",\n \"test:coverage:integration\": \"rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage tests --unstable-worker-options --unstable-net || exit 1\",\n \"coverage:report\": \"deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --lcov > coverage/lcov.info && deno run --allow-read scripts/check-coverage.ts 80\",\n \"coverage:html\": \"deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --html\",\n \"lint\": \"DENO_NO_PACKAGE_JSON=1 deno lint src/\",\n \"fmt\": \"deno fmt src/\",\n \"typecheck\": \"deno check src/index.ts src/cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/build/transforms/index.ts src/core/config/index.ts src/core/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/module-system/index.ts\",\n \"docs:check-links\": \"deno run -A scripts/check-doc-links.ts\",\n \"lint:ban-console\": \"deno run --allow-read scripts/ban-console.ts\",\n \"lint:ban-deep-imports\": \"deno run --allow-read scripts/ban-deep-imports.ts\",\n \"lint:ban-internal-root-imports\": \"deno run --allow-read scripts/ban-internal-root-imports.ts\",\n \"lint:check-awaits\": \"deno run --allow-read scripts/check-unawaited-promises.ts\",\n \"lint:platform\": \"deno run --allow-read scripts/lint-platform-agnostic.ts\",\n \"check:circular\": \"deno run -A jsr:@cunarist/deno-circular-deps src/index.ts\"\n },\n \"lint\": {\n \"include\": [\n \"src/**/*.ts\",\n \"src/**/*.tsx\"\n ],\n \"exclude\": [\n \"dist/\",\n \"coverage/\"\n ],\n \"rules\": {\n \"tags\": [\n \"recommended\"\n ],\n \"include\": [\n \"ban-untagged-todo\"\n ],\n \"exclude\": [\n \"no-explicit-any\",\n \"no-process-global\",\n \"no-console\"\n ]\n }\n },\n \"fmt\": {\n \"include\": [\n \"src/**/*.ts\",\n \"src/**/*.tsx\"\n ],\n \"exclude\": [\n \"dist/\",\n \"coverage/\"\n ],\n \"options\": {\n \"useTabs\": false,\n \"lineWidth\": 100,\n \"indentWidth\": 2,\n \"semiColons\": true,\n \"singleQuote\": false,\n \"proseWrap\": \"preserve\"\n }\n }\n}\n", "import denoConfig from \"../../../deno.json\" with { type: \"json\" };\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\nexport const VERSION: string = getEnv(\"VERYFRONT_VERSION\") ||\n (typeof denoConfig.version === \"string\" ? denoConfig.version : \"0.0.0\");\n\nexport const SERVER_START_TIME: number = Date.now();\n\nexport interface BuildVersion {\n framework: string;\n serverStart: number;\n projectUpdated?: string;\n}\n\nexport function createBuildVersion(projectUpdatedAt?: string): BuildVersion {\n return {\n framework: VERSION,\n serverStart: SERVER_START_TIME,\n projectUpdated: projectUpdatedAt,\n };\n}\n", "export const ESM_CDN_BASE = \"https://esm.sh\";\n\nexport const JSDELIVR_CDN_BASE = \"https://cdn.jsdelivr.net\";\n\nexport const DENO_STD_BASE = \"https://deno.land\";\n\nexport const REACT_VERSION_17 = \"17.0.2\";\nexport const REACT_VERSION_18_2 = \"18.2.0\";\nexport const REACT_VERSION_18_3 = \"18.3.1\";\nexport const REACT_VERSION_19_RC = \"19.0.0-rc.0\";\nexport const REACT_VERSION_19 = \"19.1.1\";\n\nexport const REACT_DEFAULT_VERSION = REACT_VERSION_18_3;\n\nexport function getReactCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}`;\n}\n\nexport function getReactDOMCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}`;\n}\n\nexport function getReactDOMClientCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}/client`;\n}\n\nexport function getReactDOMServerCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react-dom@${version}/server`;\n}\n\nexport function getReactJSXRuntimeCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}/jsx-runtime`;\n}\n\nexport function getReactJSXDevRuntimeCDNUrl(version: string = REACT_DEFAULT_VERSION): string {\n return `${ESM_CDN_BASE}/react@${version}/jsx-dev-runtime`;\n}\n\nexport function getReactImportMap(version: string = REACT_DEFAULT_VERSION): Record<string, string> {\n return {\n react: getReactCDNUrl(version),\n \"react-dom\": getReactDOMCDNUrl(version),\n \"react-dom/client\": getReactDOMClientCDNUrl(version),\n \"react-dom/server\": getReactDOMServerCDNUrl(version),\n \"react/jsx-runtime\": getReactJSXRuntimeCDNUrl(version),\n \"react/jsx-dev-runtime\": getReactJSXDevRuntimeCDNUrl(version),\n };\n}\n\nexport const DEFAULT_ALLOWED_CDN_HOSTS = [ESM_CDN_BASE, DENO_STD_BASE];\n\nexport const DENO_STD_VERSION = \"0.220.0\";\n\nexport function getDenoStdNodeBase(): string {\n return `${DENO_STD_BASE}/std@${DENO_STD_VERSION}/node`;\n}\n\n// Tailwind CSS constants - unified version for all imports\nexport const TAILWIND_VERSION = \"4.1.8\";\n\n// UnoCSS constants\nexport const UNOCSS_VERSION = \"0.59.0\";\n\nexport function getUnoCSSTailwindResetUrl(): string {\n return `${ESM_CDN_BASE}/@unocss/reset@${UNOCSS_VERSION}/tailwind.css`;\n}\n\n// Veryfront package version - derived from deno.json (single source of truth)\nexport { VERSION as VERYFRONT_VERSION } from \"../version.ts\";\n", "/**\n * Default port for veryfront dev server.\n * This is the single source of truth for the default port.\n */\nexport const DEFAULT_PORT = 3000;\n\nexport const DEFAULT_TIMEOUT_MS = 5000;\n\nexport const SSR_TIMEOUT_MS = 10000;\n\nexport const SANDBOX_TIMEOUT_MS = 5000;\n\nexport const DEFAULT_CACHE_MAX_SIZE = 100;\n\nexport const defaultConfig = {\n server: {\n port: DEFAULT_PORT,\n hostname: \"0.0.0.0\",\n },\n\n timeouts: {\n default: DEFAULT_TIMEOUT_MS,\n api: 30000,\n ssr: SSR_TIMEOUT_MS,\n hmr: 30000,\n sandbox: SANDBOX_TIMEOUT_MS,\n },\n\n cache: {\n jit: {\n maxSize: DEFAULT_CACHE_MAX_SIZE,\n tempDirPrefix: \"vf-bundle-\",\n },\n },\n\n metrics: {\n ssrBoundaries: [5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000],\n },\n} as const;\n\nexport const DEFAULT_PREFETCH_DELAY_MS = 100;\n\nexport const DEFAULT_METRICS_COLLECT_INTERVAL_MS = 60000;\n\nexport const DURATION_HISTOGRAM_BOUNDARIES_MS = [\n 5,\n 10,\n 25,\n 50,\n 75,\n 100,\n 250,\n 500,\n 750,\n 1000,\n 2500,\n 5000,\n 7500,\n 10000,\n];\n\nexport const SIZE_HISTOGRAM_BOUNDARIES_KB = [\n 1,\n 5,\n 10,\n 25,\n 50,\n 100,\n 250,\n 500,\n 1000,\n 2500,\n 5000,\n 10000,\n];\n\nexport const DEFAULT_REDIS_SCAN_COUNT = 100;\n\nexport const DEFAULT_REDIS_BATCH_DELETE_SIZE = 1000;\n\nexport const PAGE_TRANSITION_DELAY_MS = 150;\n\nexport type DefaultConfig = typeof defaultConfig;\n", "/**\n * Centralized server endpoints and paths registry\n *\n * All internal veryfront URLs should be defined here as the single source of truth.\n * This prevents hardcoding URLs across the codebase and makes refactoring easier.\n */\n\n// Re-export DEFAULT_PORT from config/defaults.ts (the single source of truth)\nexport { DEFAULT_PORT } from \"@veryfront/config/defaults.ts\";\n\n/** Default port for development dashboard */\nexport const DEFAULT_DASHBOARD_PORT = 3002;\n\n/** Internal URL prefix for all veryfront endpoints */\nexport const INTERNAL_PREFIX = \"/_veryfront\" as const;\n\n/**\n * All internal veryfront URL path prefixes (directories)\n */\nexport const INTERNAL_PATH_PREFIXES = {\n /** React Server Components endpoints */\n RSC: `${INTERNAL_PREFIX}/rsc/`,\n /** File system access endpoints (base64 encoded paths) */\n FS: `${INTERNAL_PREFIX}/fs/`,\n /** Virtual module system */\n MODULES: `${INTERNAL_PREFIX}/modules/`,\n /** Generated page modules */\n PAGES: `${INTERNAL_PREFIX}/pages/`,\n /** Data JSON endpoints */\n DATA: `${INTERNAL_PREFIX}/data/`,\n /** Library modules (AI SDK, etc.) */\n LIB: `${INTERNAL_PREFIX}/lib/`,\n /** Chunk assets */\n CHUNKS: `${INTERNAL_PREFIX}/chunks/`,\n /** Client component modules */\n CLIENT: `${INTERNAL_PREFIX}/client/`,\n} as const;\n\n/**\n * Specific internal endpoint URLs\n */\nexport const INTERNAL_ENDPOINTS = {\n // Development endpoints\n HMR_RUNTIME: `${INTERNAL_PREFIX}/hmr-runtime.js`,\n HMR: `${INTERNAL_PREFIX}/hmr.js`,\n HYDRATE: `${INTERNAL_PREFIX}/hydrate.js`,\n ERROR_OVERLAY: `${INTERNAL_PREFIX}/error-overlay.js`,\n DEV_LOADER: `${INTERNAL_PREFIX}/dev-loader.js`,\n CLIENT_LOG: `${INTERNAL_PREFIX}/log`,\n\n // Production endpoints\n CLIENT_JS: `${INTERNAL_PREFIX}/client.js`,\n ROUTER_JS: `${INTERNAL_PREFIX}/router.js`,\n PREFETCH_JS: `${INTERNAL_PREFIX}/prefetch.js`,\n MANIFEST_JSON: `${INTERNAL_PREFIX}/manifest.json`,\n APP_JS: `${INTERNAL_PREFIX}/app.js`,\n\n // RSC endpoints\n RSC_CLIENT: `${INTERNAL_PREFIX}/rsc/client.js`,\n RSC_MANIFEST: `${INTERNAL_PREFIX}/rsc/manifest`,\n RSC_STREAM: `${INTERNAL_PREFIX}/rsc/stream`,\n RSC_PAYLOAD: `${INTERNAL_PREFIX}/rsc/payload`,\n RSC_RENDER: `${INTERNAL_PREFIX}/rsc/render`,\n RSC_PAGE: `${INTERNAL_PREFIX}/rsc/page`,\n RSC_MODULE: `${INTERNAL_PREFIX}/rsc/module`,\n RSC_DOM: `${INTERNAL_PREFIX}/rsc/dom.js`,\n RSC_HYDRATOR: `${INTERNAL_PREFIX}/rsc/hydrator.js`,\n RSC_HYDRATE_CLIENT: `${INTERNAL_PREFIX}/rsc/hydrate-client.js`,\n\n // Library module endpoints\n LIB_AI_REACT: `${INTERNAL_PREFIX}/lib/ai/react.js`,\n LIB_AI_COMPONENTS: `${INTERNAL_PREFIX}/lib/ai/components.js`,\n LIB_AI_PRIMITIVES: `${INTERNAL_PREFIX}/lib/ai/primitives.js`,\n} as const;\n\n/**\n * Build output directory paths (relative)\n */\nexport const BUILD_DIRS = {\n /** Main build output directory */\n ROOT: \"_veryfront\",\n /** Chunks directory */\n CHUNKS: \"_veryfront/chunks\",\n /** Data directory */\n DATA: \"_veryfront/data\",\n /** Assets directory */\n ASSETS: \"_veryfront/assets\",\n} as const;\n\n/**\n * Local project directory paths (relative to project root)\n * These are .gitignore'd directories for caching and temporary files\n */\nexport const PROJECT_DIRS = {\n /** Base veryfront internal directory */\n ROOT: \".veryfront\",\n /** Cache directory for build artifacts, transforms, etc. */\n CACHE: \".veryfront/cache\",\n /** KV store directory */\n KV: \".veryfront/kv\",\n /** Log files directory */\n LOGS: \".veryfront/logs\",\n /** Temporary files directory */\n TMP: \".veryfront/tmp\",\n} as const;\n\n/** Default cache directory path */\nexport const DEFAULT_CACHE_DIR = PROJECT_DIRS.CACHE;\n\n/**\n * Helper to check if a pathname is an internal veryfront endpoint\n */\nexport function isInternalEndpoint(pathname: string): boolean {\n return pathname.startsWith(INTERNAL_PREFIX + \"/\");\n}\n\n/**\n * Helper to check if a pathname is a static asset (has extension or is internal)\n */\nexport function isStaticAsset(pathname: string): boolean {\n return pathname.includes(\".\") || isInternalEndpoint(pathname);\n}\n\n/**\n * Normalize a chunk path to include the base prefix\n */\nexport function normalizeChunkPath(\n filename: string,\n basePath: string = INTERNAL_PATH_PREFIXES.CHUNKS,\n): string {\n if (filename.startsWith(\"/\")) {\n return filename;\n }\n return `${basePath.replace(/\\/$/, \"\")}/${filename}`;\n}\n\n// Re-export for backward compatibility\nexport const DEV_SERVER_ENDPOINTS = {\n HMR_RUNTIME: INTERNAL_ENDPOINTS.HMR_RUNTIME,\n ERROR_OVERLAY: INTERNAL_ENDPOINTS.ERROR_OVERLAY,\n} as const;\n", "/**\n * Cross-platform filesystem abstraction for CLI commands and standalone utilities.\n *\n * This module provides a synchronous-style API for filesystem operations that works\n * across Deno, Node.js, and Bun runtimes. It's designed for CLI commands and scripts\n * where you don't have access to a RuntimeAdapter context.\n *\n * For server/rendering contexts where you have an adapter, prefer using adapter.fs directly:\n * ```ts\n * const adapter = await getAdapter();\n * const content = await adapter.fs.readFile(path);\n * ```\n *\n * For CLI commands and standalone utilities, use createFileSystem():\n * ```ts\n * import { createFileSystem } from \"@veryfront/platform/compat/fs.ts\";\n * const fs = createFileSystem();\n * const content = await fs.readTextFile(path);\n * ```\n *\n * @module\n */\n\nimport type { FileInfo } from \"@veryfront/platform/adapters/base.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport { isDeno, isNode } from \"./runtime.ts\";\n\n/**\n * Cross-platform filesystem interface for CLI commands and standalone utilities.\n * Compatible with RuntimeAdapter.fs (FileSystemAdapter) for easy interoperability.\n */\nexport interface FileSystem {\n readTextFile(path: string): Promise<string>;\n readFile(path: string): Promise<Uint8Array>; // Changed to Uint8Array for binary\n writeTextFile(path: string, data: string): Promise<void>;\n writeFile(path: string, data: Uint8Array): Promise<void>; // Changed to Uint8Array for binary\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileInfo>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readDir(path: string): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n makeTempDir(options?: { prefix?: string }): Promise<string>; // New for temp dirs\n}\n\n// ============================================================================\n// Node.js Implementation\n// ============================================================================\n\ninterface NodeFsPromises {\n readFile(\n path: string,\n options?: { encoding?: string; flag?: string } | string,\n ): Promise<string | Uint8Array>;\n writeFile(\n path: string,\n data: string | Uint8Array,\n options?: { encoding?: string; flag?: string } | string,\n ): Promise<void>;\n access(path: string, mode?: number): Promise<void>;\n stat(path: string): Promise<{\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n size: number;\n mtime: Date;\n }>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string, options: { withFileTypes: true }): Promise<\n Array<{\n name: string;\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n }>\n >;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n}\n\nclass NodeFileSystem implements FileSystem {\n private fs: NodeFsPromises | null = null;\n private os: typeof import(\"node:os\") | null = null;\n private path: typeof import(\"node:path\") | null = null;\n private initialized = false;\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n if (!isNode) {\n throw toError(createError({\n type: \"not_supported\",\n message: \"Node.js fs modules not available\",\n feature: \"Node.js\",\n }));\n }\n\n // Use dynamic ESM imports for Node.js modules\n const [fsModule, osModule, pathModule] = await Promise.all([\n import(\"node:fs/promises\"),\n import(\"node:os\"),\n import(\"node:path\"),\n ]);\n\n this.fs = fsModule as unknown as NodeFsPromises;\n this.os = osModule;\n this.path = pathModule;\n this.initialized = true;\n }\n\n async readTextFile(path: string): Promise<string> {\n await this.ensureInitialized();\n return await (this.fs!.readFile(path, { encoding: \"utf8\" }) as Promise<string>);\n }\n\n async readFile(path: string): Promise<Uint8Array> {\n await this.ensureInitialized();\n return await (this.fs!.readFile(path) as Promise<Uint8Array>);\n }\n\n async writeTextFile(path: string, data: string): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.writeFile(path, data, { encoding: \"utf8\" });\n }\n\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.writeFile(path, data);\n }\n\n async exists(path: string): Promise<boolean> {\n await this.ensureInitialized();\n try {\n await this.fs!.access(path);\n return true;\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileInfo> {\n await this.ensureInitialized();\n const stat = await this.fs!.stat(path);\n return {\n isFile: stat.isFile(),\n isDirectory: stat.isDirectory(),\n isSymlink: stat.isSymbolicLink(),\n size: stat.size,\n mtime: stat.mtime,\n };\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureInitialized();\n await this.fs!.mkdir(path, { recursive: options?.recursive ?? false });\n }\n\n async *readDir(\n path: string,\n ): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }> {\n await this.ensureInitialized();\n const entries = await this.fs!.readdir(path, { withFileTypes: true });\n for (const entry of entries) {\n yield {\n name: entry.name,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n };\n }\n }\n\n async remove(path: string, options?: { recursive?: boolean }): Promise<void> {\n await this.ensureInitialized();\n // Node.js fs.rm requires force for recursive deletion of non-empty directories\n await this.fs!.rm(path, {\n recursive: options?.recursive ?? false,\n force: options?.recursive ?? false,\n });\n }\n\n async makeTempDir(options?: { prefix?: string }): Promise<string> {\n await this.ensureInitialized();\n const tempDir = this.path!.join(\n this.os!.tmpdir(),\n `${options?.prefix ?? \"tmp-\"}${Math.random().toString(36).substring(2, 8)}`,\n );\n await this.fs!.mkdir(tempDir, { recursive: true });\n return tempDir;\n }\n}\n\n// ============================================================================\n// Deno Implementation\n// ============================================================================\n\nclass DenoFileSystem implements FileSystem {\n async readTextFile(path: string): Promise<string> {\n // @ts-ignore - Deno global\n return await Deno.readTextFile(path);\n }\n\n async readFile(path: string): Promise<Uint8Array> {\n // @ts-ignore - Deno global\n return await Deno.readFile(path);\n }\n\n async writeTextFile(path: string, data: string): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.writeTextFile(path, data);\n }\n\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.writeFile(path, data);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n // @ts-ignore - Deno global\n await Deno.stat(path);\n return true;\n } catch (error: any) {\n // @ts-ignore - Deno global\n if (error instanceof Deno.errors.NotFound) {\n return false;\n }\n throw error;\n }\n }\n\n async stat(path: string): Promise<FileInfo> {\n // @ts-ignore - Deno global\n const stat = await Deno.stat(path);\n return {\n isFile: stat.isFile,\n isDirectory: stat.isDirectory,\n isSymlink: stat.isSymlink,\n size: stat.size,\n mtime: stat.mtime,\n };\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.mkdir(path, { recursive: options?.recursive ?? false });\n }\n\n async *readDir(\n path: string,\n ): AsyncIterable<{ name: string; isFile: boolean; isDirectory: boolean }> {\n // @ts-ignore - Deno global\n for await (const entry of Deno.readDir(path)) {\n yield {\n name: entry.name,\n isFile: entry.isFile,\n isDirectory: entry.isDirectory,\n };\n }\n }\n\n async remove(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.remove(path, { recursive: options?.recursive ?? false });\n }\n\n async makeTempDir(options?: { prefix?: string }): Promise<string> {\n // @ts-ignore - Deno global\n return await Deno.makeTempDir({ prefix: options?.prefix });\n }\n}\n\n/**\n * Create a cross-platform filesystem instance for CLI commands and standalone utilities.\n *\n * Use this for CLI commands that don't have access to a RuntimeAdapter context:\n * ```ts\n * const fs = createFileSystem();\n * const content = await fs.readTextFile(path);\n * await fs.writeTextFile(outputPath, result);\n * ```\n *\n * For server/rendering contexts, prefer using adapter.fs directly.\n *\n * Note: For npm package, always uses Node.js fs APIs for cross-platform compatibility.\n */\nexport function createFileSystem(): FileSystem {\n if (isDeno) {\n return new DenoFileSystem();\n } else {\n // Node.js or Bun\n return new NodeFileSystem();\n }\n}\n", "import { createError, toError } from \"../../core/errors/veryfront-error.ts\";\nimport type { RuntimeAdapter } from \"./base.ts\";\n\nexport interface MockRuntimeAdapter extends RuntimeAdapter {\n fs: RuntimeAdapter[\"fs\"] & {\n files: Map<string, string>;\n directories: Set<string>;\n };\n}\n\n/**\n * Mock RuntimeAdapter for testing\n *\n * Provides an in-memory filesystem and environment for unit testing.\n * This adapter is useful for testing code that depends on the filesystem\n * without requiring actual file I/O.\n *\n * @example\n * ```typescript\n * const adapter = createMockAdapter();\n * adapter.fs.files.set(\"/project/pages/index.tsx\", \"export default () => <div>Home</div>\");\n * const content = await adapter.fs.readFile(\"/project/pages/index.tsx\");\n * ```\n */\n\n/**\n * Creates a mock RuntimeAdapter for testing\n *\n * The mock adapter uses in-memory Map and Set for file storage:\n * - `files`: Map<string, string> for file contents\n * - `directories`: Set<string> for tracking directories\n * - `envVars`: Map<string, string> for environment variables\n */\nexport function createMockAdapter(): MockRuntimeAdapter {\n const files = new Map<string, string>();\n const directories = new Set<string>();\n const envVars = new Map<string, string>();\n\n return {\n id: \"memory\" as const,\n name: \"mock\",\n /** @deprecated Use `id` instead */\n platform: \"memory\" as const,\n capabilities: {\n typescript: false,\n jsx: false,\n http2: false,\n websocket: false,\n workers: false,\n fileWatching: false,\n shell: false,\n kvStore: false,\n writableFs: true, // In-memory writes work\n },\n serve: (_handler, _options) => {\n return Promise.resolve({\n stop: () => Promise.resolve(),\n addr: { hostname: \"localhost\", port: 8000 },\n });\n },\n fs: {\n files,\n directories,\n readFile: (path: string) => {\n const content = files.get(path);\n if (!content) {\n throw toError(createError({\n type: \"file\",\n message: `File not found: ${path}`,\n }));\n }\n return Promise.resolve(content);\n },\n readFileBytes: (path: string) => {\n const content = files.get(path);\n if (!content) {\n throw toError(createError({\n type: \"file\",\n message: `File not found: ${path}`,\n }));\n }\n return Promise.resolve(new TextEncoder().encode(content));\n },\n writeFile: (path: string, content: string) => {\n files.set(path, content);\n return Promise.resolve();\n },\n exists: (path: string) => {\n if (files.has(path)) return Promise.resolve(true);\n if (directories.has(path)) return Promise.resolve(true);\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) return Promise.resolve(true);\n }\n return Promise.resolve(false);\n },\n readDir: async function* (path: string) {\n const entries = new Map<string, { isFile: boolean; isDirectory: boolean }>();\n\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) {\n const relativePath = filePath.slice(path.length + 1);\n const parts = relativePath.split(\"/\");\n const name = parts[0]!;\n\n if (!entries.has(name)) {\n entries.set(name, {\n isFile: parts.length === 1,\n isDirectory: parts.length > 1,\n });\n }\n }\n }\n\n for (const [name, meta] of entries.entries()) {\n yield { name, ...meta, isSymlink: false };\n }\n },\n stat: (path: string) => {\n if (files.has(path)) {\n const content = files.get(path)!;\n return Promise.resolve({\n size: content.length,\n isFile: true,\n isDirectory: false,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n\n if (directories.has(path)) {\n return Promise.resolve({\n size: 0,\n isFile: false,\n isDirectory: true,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n\n for (const filePath of files.keys()) {\n if (filePath.startsWith(path + \"/\")) {\n return Promise.resolve({\n size: 0,\n isFile: false,\n isDirectory: true,\n isSymlink: false,\n mtime: new Date(),\n });\n }\n }\n\n return Promise.reject(new Error(`Path not found: ${path}`));\n },\n mkdir: (_path: string) => Promise.resolve(),\n remove: (_path: string) => Promise.resolve(),\n makeTempDir: (prefix: string) =>\n Promise.resolve(`/tmp/${prefix}-${Math.random().toString(36).slice(2)}`),\n watch: () => ({\n async *[Symbol.asyncIterator]() {\n yield { kind: \"any\", paths: [] };\n },\n close: () => {},\n }),\n },\n env: {\n get: (key: string) => envVars.get(key),\n set: (key: string, value: string) => envVars.set(key, value),\n toObject: () => Object.fromEntries(envVars),\n },\n server: {\n upgradeWebSocket: (_request) => {\n throw new Error(\n \"WebSocket upgrade not available in mock adapter. \" +\n \"The mock adapter is designed for unit testing filesystem and environment operations. \" +\n \"For WebSocket testing, use integration tests with the actual Deno/Node/Bun adapter, \" +\n \"or mock the WebSocket behavior at a higher level in your tests.\",\n );\n },\n },\n features: {\n websocket: false,\n http2: false,\n workers: false,\n jsx: false,\n typescript: false,\n },\n };\n}\n", "// Conditional imports for path module\nimport nodePath from \"node:path\";\n\n/**\n * Common path module interface compatible with both Node.js and Deno.\n */\ninterface PathModule {\n basename(path: string, suffix?: string): string;\n dirname(path: string): string;\n join(...paths: string[]): string;\n relative(from: string, to: string): string;\n resolve(...paths: string[]): string;\n extname(path: string): string;\n isAbsolute(path: string): boolean;\n sep: string;\n fromFileUrl?: (url: string | URL) => string;\n}\n\n// Use node:path for Node.js or import Deno's std/path for Deno\nlet pathMod: PathModule | null = null;\n\n// Initialize path module synchronously for Node.js\n// @ts-ignore - Deno global\nif (typeof Deno === \"undefined\") {\n pathMod = nodePath;\n} else {\n // Deno environment - start loading asynchronously but don't await\n // @ts-ignore - Deno global\n import(\"std/path/mod.ts\").then((mod) => {\n pathMod = mod as unknown as PathModule;\n });\n}\n\n// Helper to get path module, ensuring it's loaded\nfunction getPathMod(): PathModule {\n if (pathMod) return pathMod;\n // In Deno, if pathMod is not yet loaded, use Node.js path as temporary fallback\n // This should rarely happen as the import is fast\n return nodePath;\n}\n\n// Re-export common path functions with proper types\nexport const basename = (path: string, suffix?: string): string =>\n getPathMod().basename(path, suffix);\nexport const dirname = (path: string): string => getPathMod().dirname(path);\nexport const fromFileUrl = (url: string | URL): string => {\n const mod = getPathMod();\n // @ts-ignore - Deno path module has fromFileUrl\n if (mod && typeof (mod as any).fromFileUrl === \"function\") {\n // @ts-ignore - Deno path module has fromFileUrl\n return (mod as any).fromFileUrl(url);\n }\n // Fallback for Node.js where fromFileUrl might not be directly available\n // This uses URL parsing which is generally cross-platform\n const urlObj = typeof url === \"string\" ? new URL(url) : url;\n return urlObj.pathname;\n};\nexport const join = (...paths: string[]): string => getPathMod().join(...paths);\nexport const relative = (from: string, to: string): string => getPathMod().relative(from, to);\nexport const resolve = (...paths: string[]): string => getPathMod().resolve(...paths);\nexport const extname = (path: string): string => getPathMod().extname(path);\nexport const isAbsolute = (path: string): boolean => getPathMod().isAbsolute(path);\n// Export sep - uses getter function to ensure pathMod is resolved\nexport const sep: string = nodePath.sep;\n", "/**\n * Auto-discovery system for AI components\n *\n * Scans ai/ directories and automatically registers:\n * - Tools (ai/tools/)\n * - Agents (ai/agents/)\n * - Resources (ai/resources/)\n * - Prompts (ai/prompts/)\n */\n\nimport { detectPlatform } from \"../runtime/platform.ts\";\nimport type { Platform } from \"../runtime/platform.ts\";\nimport { registerPrompt, registerResource, registerTool } from \"../mcp/registry.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport type { Agent } from \"../types/agent.ts\";\nimport { registerAgent } from \"../agent/composition.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { getConfig } from \"../../core/config/loader.ts\";\nimport { createMockAdapter } from \"../../platform/adapters/mock.ts\";\nimport type { FileSystemAdapter } from \"../../platform/adapters/base.ts\";\nimport { isDeno } from \"../../platform/compat/runtime.ts\";\nimport { createFileSystem } from \"../../platform/compat/fs.ts\";\nimport * as pathHelper from \"../../platform/compat/path-helper.ts\";\n\ninterface FileDiscoveryContext {\n platform: Platform;\n /** Optional filesystem adapter for cross-platform support */\n fsAdapter?: FileSystemAdapter;\n /** Cached node dependencies (lazy loaded) */\n nodeDeps?: {\n fs: typeof import(\"node:fs\");\n path: typeof import(\"node:path\");\n };\n /** Base directory for the project (needed for Node.js transpilation) */\n baseDir?: string;\n}\n\n/** Cache for transpiled modules to avoid re-transpiling the same file */\nconst transpileCache = new Map<string, unknown>();\n\n/**\n * Create an esbuild plugin for loading files from fsAdapter (Veryfront Cloud).\n * This allows esbuild to properly resolve and bundle relative imports from remote storage.\n *\n * The plugin intercepts relative imports (./foo or ../foo), resolves them to absolute paths,\n * and loads the file content from the fsAdapter instead of the local filesystem.\n */\nfunction createFsAdapterPlugin(fsAdapter: FileSystemAdapter) {\n // Cache existence checks to avoid repeated remote calls\n const existsCache = new Map<string, boolean>();\n\n async function checkExists(filePath: string): Promise<boolean> {\n if (existsCache.has(filePath)) {\n return existsCache.get(filePath)!;\n }\n const exists = await fsAdapter.exists(filePath);\n existsCache.set(filePath, exists);\n return exists;\n }\n\n // Try to resolve a path with various extensions\n async function resolveWithExtensions(basePath: string): Promise<string | null> {\n // If path already has an extension, use it directly\n if (/\\.(ts|tsx|js|jsx|mjs|json)$/i.test(basePath)) {\n if (await checkExists(basePath)) {\n return basePath;\n }\n return null;\n }\n\n // Try common TypeScript/JavaScript extensions\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"];\n for (const ext of extensions) {\n const fullPath = basePath + ext;\n if (await checkExists(fullPath)) {\n return fullPath;\n }\n }\n\n // Try index files (for directory imports)\n for (const ext of extensions) {\n const indexPath = pathHelper.join(basePath, `index${ext}`);\n if (await checkExists(indexPath)) {\n return indexPath;\n }\n }\n\n return null;\n }\n\n return {\n name: \"veryfront-fsadapter\",\n // deno-lint-ignore no-explicit-any\n setup(build: any) {\n // Intercept relative imports (./foo or ../foo)\n build.onResolve(\n { filter: /^\\.\\.?\\// },\n async (args: { path: string; importer: string; resolveDir: string }) => {\n // Resolve path relative to importer's directory\n const importerDir = args.importer ? pathHelper.dirname(args.importer) : args.resolveDir;\n const basePath = pathHelper.resolve(importerDir, args.path);\n\n // Try to find the file with various extensions\n const resolvedPath = await resolveWithExtensions(basePath);\n if (resolvedPath) {\n return {\n path: resolvedPath,\n namespace: \"fsadapter\",\n };\n }\n\n // File not found - return error\n return {\n errors: [{\n text: `Could not resolve \"${args.path}\" from \"${importerDir}\" via fsAdapter`,\n }],\n };\n },\n );\n\n // Load files from fsAdapter\n build.onLoad(\n { filter: /.*/, namespace: \"fsadapter\" },\n async (args: { path: string }) => {\n try {\n const content = await fsAdapter.readFile(args.path);\n const ext = pathHelper.extname(args.path).toLowerCase();\n const loader = ext === \".tsx\"\n ? \"tsx\"\n : ext === \".jsx\"\n ? \"jsx\"\n : ext === \".ts\"\n ? \"ts\"\n : \"js\";\n\n return {\n contents: content,\n loader,\n // Set resolveDir for nested imports from this file\n resolveDir: pathHelper.dirname(args.path),\n };\n } catch (error) {\n return {\n errors: [{\n text: `Failed to load \"${args.path}\" from fsAdapter: ${error}`,\n }],\n };\n }\n },\n );\n },\n };\n}\n\n/**\n * Import a TypeScript module in a platform-aware way.\n * - Deno: Transpile to rewrite npm package imports, then import natively\n * - Node.js: Transpile with esbuild, then import\n * - Node.js + fsAdapter: Use esbuild plugin to load from remote storage\n */\nasync function importModule(\n file: string,\n context: FileDiscoveryContext,\n): Promise<unknown> {\n // Check cache first\n const cacheKey = file;\n if (transpileCache.has(cacheKey)) {\n return transpileCache.get(cacheKey);\n }\n\n const filePath = file.replace(\"file://\", \"\");\n\n // Read the source file - use fsAdapter if available (Veryfront Cloud), otherwise local fs\n let source: string;\n try {\n if (context.fsAdapter) {\n source = await context.fsAdapter.readFile(filePath);\n } else {\n const fs = createFileSystem();\n source = await fs.readTextFile(filePath);\n }\n } catch (error) {\n throw new Error(`Failed to read file ${filePath}: ${error}`);\n }\n\n // Determine loader based on file extension\n const isTsx = filePath.endsWith(\".tsx\");\n const isJsx = filePath.endsWith(\".jsx\");\n const loader = isTsx ? \"tsx\" : isJsx ? \"jsx\" : filePath.endsWith(\".ts\") ? \"ts\" : \"js\";\n\n // Transpile with esbuild\n const { build } = await import(\"esbuild\");\n\n // Get the directory containing the file for resolving relative imports\n const fileDir = pathHelper.dirname(filePath);\n\n // In Deno, esbuild runs as WASM which doesn't support plugins.\n // We mark relative imports as external and let Deno's native TS support handle them.\n const relativeImports: string[] = [];\n if (isDeno) {\n const relativeImportPattern = /from\\s+[\"'](\\.\\.[^\"']+)[\"']/g;\n let match;\n while ((match = relativeImportPattern.exec(source)) !== null) {\n if (match[1]) {\n relativeImports.push(match[1]);\n }\n }\n }\n\n // In Node.js with fsAdapter, use plugin to load relative imports from remote storage.\n // This properly bundles all dependencies instead of marking them external.\n const usePlugin = !isDeno && !!context.fsAdapter;\n const plugins = usePlugin ? [createFsAdapterPlugin(context.fsAdapter!)] : [];\n\n const result = await build({\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"neutral\",\n target: \"es2022\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n resolveExtensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"],\n plugins,\n external: [\n \"ai\",\n \"ai/*\",\n \"@ai-sdk/*\",\n \"zod\",\n \"node:*\",\n \"veryfront\",\n \"veryfront/*\",\n \"@opentelemetry/*\",\n \"path\",\n // Only mark relative imports as external in Deno (plugin handles them in Node.js)\n ...relativeImports,\n ],\n stdin: {\n contents: source,\n loader,\n resolveDir: fileDir,\n sourcefile: filePath,\n },\n });\n\n if (result.errors && result.errors.length > 0) {\n const first = result.errors[0]?.text || \"unknown error\";\n throw new Error(`Failed to transpile ${filePath}: ${first}`);\n }\n\n const js = result.outputFiles?.[0]?.text ?? \"export {}\";\n\n // Use local filesystem for temp files\n const localFs = createFileSystem();\n const tempDir = await localFs.makeTempDir({ prefix: \"vf-discovery-\" });\n const tempFile = pathHelper.join(tempDir, \"module.mjs\");\n\n // Rewrite package imports based on platform\n // - Deno: npm: specifiers + file:// for relative imports\n // - Node.js: resolve packages to file:// URLs from node_modules\n let transformedCode: string;\n if (isDeno) {\n transformedCode = rewriteForDeno(js, fileDir);\n } else {\n transformedCode = await rewriteDiscoveryImports(js, context.baseDir || \".\", localFs, fileDir);\n }\n\n await localFs.writeTextFile(tempFile, transformedCode);\n\n try {\n const module = await import(`file://${tempFile}?v=${Date.now()}`);\n transpileCache.set(cacheKey, module);\n return module;\n } finally {\n await localFs.remove(tempDir, { recursive: true });\n }\n}\n\n/**\n * Rewrite imports for Deno (use npm: specifiers and resolve relative imports)\n */\nfunction rewriteForDeno(code: string, fileDir: string): string {\n let transformed = code;\n\n // Rewrite external packages to npm: specifiers\n const npmPackages = [\n { pattern: /from\\s+[\"']ai[\"']/g, replacement: 'from \"npm:ai\"' },\n { pattern: /from\\s+[\"']ai\\/([^\"']+)[\"']/g, replacement: 'from \"npm:ai/$1\"' },\n { pattern: /from\\s+[\"']@ai-sdk\\/([^\"']+)[\"']/g, replacement: 'from \"npm:@ai-sdk/$1\"' },\n { pattern: /from\\s+[\"']zod[\"']/g, replacement: 'from \"npm:zod\"' },\n { pattern: /import\\s*\\(\\s*[\"']ai[\"']\\s*\\)/g, replacement: 'import(\"npm:ai\")' },\n { pattern: /import\\s*\\(\\s*[\"']zod[\"']\\s*\\)/g, replacement: 'import(\"npm:zod\")' },\n ];\n\n for (const { pattern, replacement } of npmPackages) {\n transformed = transformed.replace(pattern, replacement);\n }\n\n // Rewrite relative imports to absolute file:// URLs\n // This handles imports like \"../../lib/github-client.ts\" that were marked external\n transformed = transformed.replace(\n /from\\s+[\"'](\\.\\.\\/[^\"']+)[\"']/g,\n (_match, relativePath: string) => {\n const absolutePath = pathHelper.resolve(fileDir, relativePath);\n return `from \"file://${absolutePath}\"`;\n },\n );\n\n return transformed;\n}\n\n/**\n * Rewrite external imports to absolute paths for Node.js compatibility\n */\nasync function rewriteDiscoveryImports(\n code: string,\n projectDir: string,\n fs: ReturnType<typeof createFileSystem>,\n fileDir: string,\n): Promise<string> {\n let transformed = code;\n\n try {\n const { pathToFileURL } = await import(\"node:url\");\n\n // Rewrite relative imports to absolute file:// URLs\n // This handles imports like \"../../lib/github-client\" that were marked external in Deno\n transformed = transformed.replace(\n /from\\s+[\"'](\\.\\.\\/[^\"']+)[\"']/g,\n (_match, relativePath: string) => {\n const absolutePath = pathHelper.resolve(fileDir, relativePath);\n return `from \"${pathToFileURL(absolutePath).href}\"`;\n },\n );\n\n // Helper to resolve a package to absolute file:// URL\n const resolvePackageToFileUrl = async (packageName: string): Promise<string | null> => {\n const packagePath = pathHelper.join(projectDir, \"node_modules\", packageName);\n const packageJsonPath = pathHelper.join(packagePath, \"package.json\");\n\n try {\n const pkgJson = JSON.parse(await fs.readTextFile(packageJsonPath));\n let entryPoint: string | undefined;\n\n if (pkgJson.exports) {\n const dotExport = pkgJson.exports[\".\"];\n if (typeof dotExport === \"string\") {\n entryPoint = dotExport;\n } else if (dotExport?.import) {\n entryPoint = dotExport.import;\n } else if (dotExport?.default) {\n entryPoint = dotExport.default;\n }\n }\n\n if (!entryPoint) {\n entryPoint = pkgJson.module || pkgJson.main || \"index.js\";\n }\n\n if (!entryPoint) {\n return null;\n }\n\n const resolvedPath = pathHelper.join(packagePath, entryPoint);\n return pathToFileURL(resolvedPath).href;\n } catch {\n return null;\n }\n };\n\n // List of external packages that need to be resolved\n const externalPackagesToResolve = [\n \"zod\",\n \"ai\",\n \"@ai-sdk/anthropic\",\n \"@ai-sdk/openai\",\n \"@ai-sdk/google\",\n \"@ai-sdk/mistral\",\n \"@ai-sdk/provider\",\n \"@ai-sdk/provider-utils\",\n ];\n\n for (const pkg of externalPackagesToResolve) {\n const escapedPkg = pkg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const staticImportRegex = new RegExp(`from\\\\s+[\"']${escapedPkg}[\"']`, \"g\");\n if (staticImportRegex.test(transformed)) {\n const resolvedUrl = await resolvePackageToFileUrl(pkg);\n if (resolvedUrl) {\n transformed = transformed.replace(staticImportRegex, `from \"${resolvedUrl}\"`);\n }\n }\n\n const dynamicImportRegex = new RegExp(`import\\\\s*\\\\(\\\\s*[\"']${escapedPkg}[\"']\\\\s*\\\\)`, \"g\");\n if (dynamicImportRegex.test(transformed)) {\n const resolvedUrl = await resolvePackageToFileUrl(pkg);\n if (resolvedUrl) {\n transformed = transformed.replace(dynamicImportRegex, `import(\"${resolvedUrl}\")`);\n }\n }\n }\n\n // Resolve veryfront imports\n const vfPackagePath = pathHelper.join(projectDir, \"node_modules\", \"veryfront\");\n const vfPackageJsonPath = pathHelper.join(vfPackagePath, \"package.json\");\n\n let exportsMap: Record<string, { import?: string }> = {};\n try {\n const pkgJson = JSON.parse(await fs.readTextFile(vfPackageJsonPath));\n exportsMap = pkgJson.exports || {};\n } catch {\n // Ignore - veryfront may not be in node_modules\n }\n\n transformed = transformed.replace(\n /from\\s+[\"'](veryfront\\/[^\"']+)[\"']/g,\n (_match, fullSpecifier: string) => {\n const subpath = \"./\" + fullSpecifier.replace(\"veryfront/\", \"\");\n const exportEntry = exportsMap[subpath];\n if (exportEntry?.import) {\n const resolvedPath = pathHelper.join(vfPackagePath, exportEntry.import);\n return `from \"${pathToFileURL(resolvedPath).href}\"`;\n }\n return _match;\n },\n );\n\n transformed = transformed.replace(\n /from\\s+[\"']veryfront[\"']/g,\n () => {\n const exportEntry = exportsMap[\".\"];\n if (exportEntry?.import) {\n const resolvedPath = pathHelper.join(vfPackagePath, exportEntry.import);\n return `from \"${pathToFileURL(resolvedPath).href}\"`;\n }\n return 'from \"veryfront\"';\n },\n );\n } catch {\n // If node:url import fails, return code as-is\n }\n\n return transformed;\n}\n\nexport interface DiscoveryConfig {\n /** Base directory (usually project root) */\n baseDir: string;\n\n /** AI directory (relative to baseDir) */\n aiDir?: string;\n\n /** Tool directories */\n toolDirs?: string[];\n\n /** Agent directories */\n agentDirs?: string[];\n\n /** Resource directories */\n resourceDirs?: string[];\n\n /** Prompt directories */\n promptDirs?: string[];\n\n /** Enable verbose logging */\n verbose?: boolean;\n\n /** Optional filesystem adapter for cross-platform support (Cloudflare Workers, etc.) */\n fsAdapter?: FileSystemAdapter;\n}\n\nexport interface DiscoveryResult {\n tools: Map<string, Tool>;\n agents: Map<string, Agent>;\n resources: Map<string, Resource>;\n prompts: Map<string, Prompt>;\n errors: Array<{ file: string; error: Error }>;\n}\n\n/**\n * Discover and register all AI components\n */\nexport async function discoverAll(\n config: DiscoveryConfig,\n): Promise<DiscoveryResult> {\n let aiDir = config.aiDir;\n const baseDir = config.baseDir;\n\n if (!aiDir) {\n try {\n const adapter = createMockAdapter();\n const projectConfig = await getConfig(baseDir, adapter);\n aiDir = projectConfig.directories?.ai || \"ai\";\n } catch {\n aiDir = \"ai\";\n }\n }\n\n const context: FileDiscoveryContext = {\n platform: detectPlatform(),\n fsAdapter: config.fsAdapter,\n baseDir,\n };\n\n const result: DiscoveryResult = {\n tools: new Map(),\n agents: new Map(),\n resources: new Map(),\n prompts: new Map(),\n errors: [],\n };\n\n const toolDirs = config.toolDirs || [`${aiDir}/tools`];\n for (const dir of toolDirs) {\n await discoverTools(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const agentDirs = config.agentDirs || [`${aiDir}/agents`];\n for (const dir of agentDirs) {\n await discoverAgents(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const resourceDirs = config.resourceDirs || [`${aiDir}/resources`];\n for (const dir of resourceDirs) {\n await discoverResources(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n const promptDirs = config.promptDirs || [`${aiDir}/prompts`];\n for (const dir of promptDirs) {\n await discoverPrompts(`${baseDir}/${dir}`, result, context, config.verbose);\n }\n\n return result;\n}\n\n/**\n * Discover tools in a directory\n */\nasync function discoverTools(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} tool files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const tool = (module as { default?: Tool }).default as Tool;\n\n if (!tool || typeof tool.execute !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid tool`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const toolWithId = { ...tool, id };\n registerTool(id, toolWithId);\n result.tools.set(id, toolWithId);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered tool: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover agents in a directory\n */\nasync function discoverAgents(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} agent files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const agent = (module as { default?: Agent }).default as Agent;\n\n if (!agent || typeof agent.generate !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid agent`);\n }\n continue;\n }\n\n const id = agent.id || filenameToId(file);\n\n // Register in the global agent registry\n registerAgent(id, agent);\n result.agents.set(id, agent);\n\n // Track the file path for index generation\n trackAgentPath(id, file);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered agent: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover resources in a directory\n */\nasync function discoverResources(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} resource files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const resource = (module as { default?: Resource }).default as Resource;\n\n if (!resource || typeof resource.load !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid resource`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const pattern = filePathToPattern(file, dir);\n const resourceWithMeta = { ...resource, id, pattern };\n registerResource(id, resourceWithMeta);\n result.resources.set(id, resourceWithMeta);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered resource: ${id} (${pattern})`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Discover prompts in a directory\n */\nasync function discoverPrompts(\n dir: string,\n result: DiscoveryResult,\n context: FileDiscoveryContext,\n verbose?: boolean,\n): Promise<void> {\n const files = await findTypeScriptFiles(dir, context);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Found ${files.length} prompt files in ${dir}`);\n }\n\n for (const file of files) {\n try {\n const module = await importModule(file, context);\n const promptInstance = (module as { default?: Prompt }).default as Prompt;\n\n if (!promptInstance || typeof promptInstance.getContent !== \"function\") {\n if (verbose) {\n agentLogger.warn(`[Discovery] ${file} does not export a valid prompt`);\n }\n continue;\n }\n\n const id = filenameToId(file);\n const promptWithId = { ...promptInstance, id };\n registerPrompt(id, promptWithId);\n result.prompts.set(id, promptWithId);\n\n if (verbose) {\n agentLogger.info(`[Discovery] Registered prompt: ${id}`);\n }\n } catch (error) {\n result.errors.push({\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n if (verbose) {\n agentLogger.error(`[Discovery] Error loading ${file}:`, error);\n }\n }\n }\n}\n\n/**\n * Find all TypeScript files in a directory (recursively)\n */\nasync function findTypeScriptFiles(\n dir: string,\n context: FileDiscoveryContext,\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n if (context.fsAdapter) {\n const exists = await context.fsAdapter.exists(dir);\n if (!exists) {\n return files;\n }\n\n for await (const entry of context.fsAdapter.readDir(dir)) {\n const filePath = `${dir}/${entry.name}`;\n\n if (entry.isFile && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n files.push(`file://${filePath}`);\n } else if (entry.isDirectory) {\n const subFiles = await findTypeScriptFiles(filePath, context);\n files.push(...subFiles);\n }\n }\n } else {\n const { fs, path } = await getNodeDeps(context);\n\n if (!fs || !path) {\n return files;\n }\n\n if (!fs.existsSync(dir)) {\n return files;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n\n if (entry.isFile() && (entry.name.endsWith(\".ts\") || entry.name.endsWith(\".tsx\"))) {\n files.push(`file://${path.resolve(filePath)}`);\n } else if (entry.isDirectory()) {\n const subFiles = await findTypeScriptFiles(filePath, context);\n files.push(...subFiles);\n }\n }\n }\n } catch {\n // Directory doesn't exist or is not accessible\n return files;\n }\n\n return files;\n}\n\nasync function getNodeDeps(context: FileDiscoveryContext) {\n if (context.nodeDeps) {\n return context.nodeDeps;\n }\n\n if (context.fsAdapter) {\n context.nodeDeps = {\n fs: {} as unknown as typeof import(\"node:fs\"),\n path: {} as unknown as typeof import(\"node:path\"),\n };\n return context.nodeDeps;\n }\n\n const [fsModule, pathModule] = await Promise.all([\n import(\"node:fs\"),\n import(\"node:path\"),\n ]);\n\n context.nodeDeps = {\n fs: fsModule,\n path: pathModule,\n };\n\n return context.nodeDeps;\n}\n\n/**\n * Convert filename to camelCase ID\n */\nfunction filenameToId(filePath: string): string {\n const filename = filePath.split(\"/\").pop()?.replace(/\\.(ts|tsx|js|jsx)$/, \"\") || \"\";\n\n return filename\n .replace(/[-_](.)/g, (_, char) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n/**\n * Convert file path to resource pattern\n */\nfunction filePathToPattern(filePath: string, baseDir: string): string {\n const cleanPath = filePath.replace(\"file://\", \"\");\n\n let pattern = cleanPath\n .replace(baseDir, \"\")\n .replace(/\\.(ts|tsx|js|jsx)$/, \"\");\n\n pattern = pattern.replace(/\\[(\\w+)\\]/g, \":$1\");\n pattern = pattern.replace(/^\\/+/, \"\");\n pattern = \"/\" + pattern;\n\n return pattern;\n}\n\n/**\n * Tracked agent file paths for index generation\n */\nconst discoveredAgentPaths = new Map<string, string>();\n\n/**\n * Generate an index file that exports all discovered agents\n * This allows API routes to import agents from a known location\n *\n * @example\n * // Generated file: ai/.generated/agents.ts\n * export { default as assistant } from '../agents/assistant';\n *\n * // Usage in API route:\n * import { assistant } from '../../ai/.generated/agents';\n */\nexport async function generateAgentIndex(\n baseDir: string,\n aiDir: string = \"ai\",\n): Promise<void> {\n const generatedDir = `${baseDir}/${aiDir}/.generated`;\n const indexPath = `${generatedDir}/agents.ts`;\n\n // Ensure the .generated directory exists\n try {\n const [fsModule, pathModule] = await Promise.all([\n import(\"node:fs\"),\n import(\"node:path\"),\n ]);\n\n if (!fsModule.existsSync(generatedDir)) {\n fsModule.mkdirSync(generatedDir, { recursive: true });\n }\n\n // Generate the index file content\n const lines: string[] = [\n \"/**\",\n \" * Auto-generated by veryfront\",\n \" * Do not edit manually - this file is regenerated on each dev server start\",\n \" */\",\n \"\",\n ];\n\n // Add exports for each discovered agent\n for (const [id, filePath] of discoveredAgentPaths) {\n // Convert absolute path to relative from .generated directory\n const cleanPath = filePath.replace(\"file://\", \"\");\n const relativePath = pathModule.relative(generatedDir, cleanPath)\n .replace(/\\.(ts|tsx|js|jsx)$/, \"\");\n\n lines.push(`export { default as ${id} } from '${relativePath}';`);\n }\n\n // Add an agents object for runtime lookup\n lines.push(\"\");\n lines.push(\"// Runtime lookup object\");\n const agentIds = Array.from(discoveredAgentPaths.keys());\n if (agentIds.length > 0) {\n lines.push(`import { ${agentIds.join(\", \")} } from './agents';`);\n lines.push(\"\");\n lines.push(\"export const agents = {\");\n for (const id of agentIds) {\n lines.push(` ${id},`);\n }\n lines.push(\"} as const;\");\n } else {\n lines.push(\"export const agents = {} as const;\");\n }\n\n lines.push(\"\");\n\n // Write the file\n fsModule.writeFileSync(indexPath, lines.join(\"\\n\"));\n agentLogger.debug(`[Discovery] Generated agent index: ${indexPath}`);\n } catch (error) {\n agentLogger.debug(`[Discovery] Could not generate agent index: ${error}`);\n }\n}\n\n/**\n * Track agent file path during discovery\n */\nfunction trackAgentPath(id: string, filePath: string): void {\n discoveredAgentPaths.set(id, filePath);\n}\n\n/**\n * Clear tracked agent paths (for re-discovery)\n */\nexport function clearTrackedAgents(): void {\n discoveredAgentPaths.clear();\n}\n\n/**\n * Clear the transpile cache (for HMR/development)\n */\nexport function clearTranspileCache(): void {\n transpileCache.clear();\n}\n", "/**\n * ID generation utilities following AI SDK best practices\n *\n * AI SDK uses nanoid internally with these defaults:\n * - 16 character alphanumeric string (a-zA-Z0-9)\n * - Dash separator for prefixed IDs\n *\n * @module veryfront/ai/utils/id\n */\n\n// URL-safe alphabet matching nanoid default (no special chars for simplicity)\nconst ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/**\n * Generate a random alphanumeric string\n */\nfunction randomString(length: number): string {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += ALPHABET[bytes[i]! % ALPHABET.length];\n }\n return result;\n}\n\n/**\n * Generate a unique ID with optional prefix\n *\n * Follows AI SDK generateId pattern:\n * - 16 character alphanumeric string by default\n * - Optional prefix with dash separator (AI SDK default)\n *\n * @example\n * ```ts\n * generateId() // \"a1B2c3D4e5F6g7H8\"\n * generateId(\"msg\") // \"msg-a1B2c3D4e5F6g7H8\"\n * generateId(\"text\") // \"text-a1B2c3D4e5F6g7H8\"\n * ```\n */\nexport function generateId(prefix?: string): string {\n const id = randomString(16);\n\n if (prefix) {\n return `${prefix}-${id}`;\n }\n\n return id;\n}\n\n/**\n * Create an ID generator with a fixed prefix and optional configuration\n *\n * @example\n * ```ts\n * const generateMessageId = createIdGenerator({ prefix: \"msg\" });\n * generateMessageId() // \"msg-a1B2c3D4e5F6g7H8\"\n *\n * const generateShortId = createIdGenerator({ prefix: \"user\", size: 8 });\n * generateShortId() // \"user-a1B2c3D4\"\n * ```\n */\nexport function createIdGenerator(options: {\n prefix?: string;\n separator?: string;\n size?: number;\n}): () => string {\n const { prefix, separator = \"-\", size = 16 } = options;\n\n return () => {\n const id = randomString(size);\n if (prefix) {\n return `${prefix}${separator}${id}`;\n }\n return id;\n };\n}\n", "/**\n * Agent Memory System\n *\n * Manages conversation history with different strategies:\n * - Conversation: Keep all messages\n * - Buffer: Keep last N messages\n * - Summary: Summarize old messages to save tokens\n */\n\nimport { getTextFromParts, type MemoryConfig, type Message } from \"../types/agent.ts\";\n\n/**\n * Memory interface\n */\nexport interface Memory {\n /**\n * Add a message to memory\n */\n add(message: Message): Promise<void>;\n\n /**\n * Get messages for the current context\n */\n getMessages(): Promise<Message[]>;\n\n /**\n * Clear all messages\n */\n clear(): Promise<void>;\n\n /**\n * Get memory stats\n */\n getStats(): Promise<MemoryStats>;\n}\n\n/**\n * Memory statistics\n */\nexport interface MemoryStats {\n /** Total messages stored */\n totalMessages: number;\n\n /** Estimated token count */\n estimatedTokens: number;\n\n /** Memory type */\n type: string;\n}\n\n/**\n * Conversation Memory - Keeps all messages\n */\nexport class ConversationMemory implements Memory {\n private messages: Message[] = [];\n private config: MemoryConfig;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n }\n\n async add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Trim if max messages exceeded\n if (\n this.config.maxMessages &&\n this.messages.length > this.config.maxMessages\n ) {\n this.messages = this.messages.slice(-this.config.maxMessages);\n }\n\n // Trim if max tokens exceeded\n if (this.config.maxTokens) {\n await this.trimToTokenLimit();\n }\n }\n\n getMessages(): Promise<Message[]> {\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n return Promise.resolve();\n }\n\n getStats(): Promise<MemoryStats> {\n return Promise.resolve({\n totalMessages: this.messages.length,\n estimatedTokens: this.estimateTokens(this.messages),\n type: \"conversation\",\n });\n }\n\n private trimToTokenLimit(): Promise<void> {\n if (!this.config.maxTokens) return Promise.resolve();\n\n let tokenCount = this.estimateTokens(this.messages);\n\n // Remove oldest messages until under limit\n while (\n tokenCount > this.config.maxTokens &&\n this.messages.length > 1\n ) {\n this.messages.shift();\n tokenCount = this.estimateTokens(this.messages);\n }\n return Promise.resolve();\n }\n\n private estimateTokens(messages: Message[]): number {\n // Rough estimation: ~4 characters per token\n const totalChars = messages.reduce(\n (sum, msg) => sum + getTextFromParts(msg.parts).length,\n 0,\n );\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Buffer Memory - Keeps last N messages\n */\nexport class BufferMemory implements Memory {\n private messages: Message[] = [];\n private config: MemoryConfig;\n private bufferSize: number;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n this.bufferSize = config.maxMessages || 10;\n }\n\n add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Keep only last N messages\n if (this.messages.length > this.bufferSize) {\n this.messages = this.messages.slice(-this.bufferSize);\n }\n return Promise.resolve();\n }\n\n getMessages(): Promise<Message[]> {\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n return Promise.resolve();\n }\n\n getStats(): Promise<MemoryStats> {\n return Promise.resolve({\n totalMessages: this.messages.length,\n estimatedTokens: this.estimateTokens(this.messages),\n type: \"buffer\",\n });\n }\n\n private estimateTokens(messages: Message[]): number {\n const totalChars = messages.reduce(\n (sum, msg) => sum + getTextFromParts(msg.parts).length,\n 0,\n );\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Summary Memory - Summarizes old messages\n * (Simplified version - full implementation would use LLM for summarization)\n */\nexport class SummaryMemory implements Memory {\n private messages: Message[] = [];\n private summary: string = \"\";\n private config: MemoryConfig;\n private summaryThreshold: number;\n\n constructor(config: MemoryConfig) {\n this.config = config;\n this.summaryThreshold = config.maxMessages || 20;\n }\n\n async add(message: Message): Promise<void> {\n this.messages.push(message);\n\n // Summarize if threshold exceeded\n if (this.messages.length > this.summaryThreshold) {\n await this.summarizeOldMessages();\n }\n }\n\n getMessages(): Promise<Message[]> {\n // If we have a summary, include it as first message\n if (this.summary) {\n return Promise.resolve([\n {\n id: \"summary\",\n role: \"system\",\n parts: [{ type: \"text\", text: `Previous conversation summary:\\n${this.summary}` }],\n timestamp: Date.now(),\n },\n ...this.messages,\n ]);\n }\n\n return Promise.resolve([...this.messages]);\n }\n\n clear(): Promise<void> {\n this.messages = [];\n this.summary = \"\";\n return Promise.resolve();\n }\n\n async getStats(): Promise<MemoryStats> {\n const allMessages = await this.getMessages();\n return {\n totalMessages: allMessages.length,\n estimatedTokens: this.estimateTokens(allMessages),\n type: \"summary\",\n };\n }\n\n private summarizeOldMessages(): Promise<void> {\n // Take first half of messages for summarization\n const toSummarize = this.messages.slice(0, Math.floor(this.messages.length / 2));\n const remaining = this.messages.slice(Math.floor(this.messages.length / 2));\n\n // Simple summarization (in production, use LLM)\n const topics = toSummarize\n .filter((m) => m.role === \"user\")\n .map((m) => getTextFromParts(m.parts).substring(0, 50))\n .join(\"; \");\n\n this.summary = `Discussed: ${topics}`;\n this.messages = remaining;\n return Promise.resolve();\n }\n\n private estimateTokens(messages: Message[]): number {\n const totalChars = messages.reduce((sum, msg) => sum + getTextFromParts(msg.parts).length, 0) +\n this.summary.length;\n return Math.ceil(totalChars / 4);\n }\n}\n\n/**\n * Create memory instance based on config\n */\nexport function createMemory(config: MemoryConfig): Memory {\n switch (config.type) {\n case \"conversation\":\n return new ConversationMemory(config);\n\n case \"buffer\":\n return new BufferMemory(config);\n\n case \"summary\":\n return new SummaryMemory(config);\n\n default:\n return new ConversationMemory(config);\n }\n}\n\n/**\n * Memory persistence interface (for future implementation)\n */\nexport interface MemoryPersistence {\n save(agentId: string, messages: Message[]): Promise<void>;\n load(agentId: string): Promise<Message[]>;\n clear(agentId: string): Promise<void>;\n}\n\n// Re-export Redis memory for convenience\nexport {\n createRedisMemory,\n type RedisClient,\n RedisMemory,\n type RedisMemoryConfig,\n} from \"./memory-redis.ts\";\n", "export const SECONDS_PER_MINUTE = 60;\n\nexport const MINUTES_PER_HOUR = 60;\n\nexport const HOURS_PER_DAY = 24;\n\nexport const MS_PER_SECOND = 1000;\n\nexport const DEFAULT_LRU_MAX_ENTRIES = 100;\n\nexport const COMPONENT_LOADER_MAX_ENTRIES = 100;\nexport const COMPONENT_LOADER_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const MDX_RENDERER_MAX_ENTRIES = 200;\nexport const MDX_RENDERER_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const RENDERER_CORE_MAX_ENTRIES = 100;\nexport const RENDERER_CORE_TTL_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const TSX_LAYOUT_MAX_ENTRIES = 50;\nexport const TSX_LAYOUT_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const DATA_FETCHING_MAX_ENTRIES = 200;\nexport const DATA_FETCHING_TTL_MS = 10 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const MDX_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE *\n MS_PER_SECOND;\nexport const MDX_CACHE_TTL_DEVELOPMENT_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const BUNDLE_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR *\n SECONDS_PER_MINUTE * MS_PER_SECOND;\nexport const BUNDLE_CACHE_TTL_DEVELOPMENT_MS = 5 * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const BUNDLE_MANIFEST_PROD_TTL_MS = 7 * HOURS_PER_DAY * MINUTES_PER_HOUR *\n SECONDS_PER_MINUTE * MS_PER_SECOND;\nexport const BUNDLE_MANIFEST_DEV_TTL_MS = MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const RSC_MANIFEST_CACHE_TTL_MS = 5000;\n\nexport const SERVER_ACTION_DEFAULT_TTL_SEC = MINUTES_PER_HOUR * SECONDS_PER_MINUTE;\n\nexport const DENO_KV_SAFE_SIZE_LIMIT_BYTES = 64_000;\n\nexport const HTTP_CACHE_SHORT_MAX_AGE_SEC = 60;\nexport const HTTP_CACHE_MEDIUM_MAX_AGE_SEC = 3600;\nexport const HTTP_CACHE_LONG_MAX_AGE_SEC = 31536000;\n\nexport const ONE_DAY_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nexport const CACHE_CLEANUP_INTERVAL_MS = 60000;\n\nexport const LRU_DEFAULT_MAX_ENTRIES = 1000;\n\nexport const LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;\n\nexport const CLEANUP_INTERVAL_MULTIPLIER = 2;\n", "export const KB_IN_BYTES = 1024;\n\nexport const HTTP_MODULE_FETCH_TIMEOUT_MS = 2500;\n\nexport const HMR_RECONNECT_DELAY_MS = 1000;\n\nexport const HMR_RELOAD_DELAY_MS = 1000;\n\nexport const HMR_FILE_WATCHER_DEBOUNCE_MS = 100;\n\nexport const HMR_KEEP_ALIVE_INTERVAL_MS = 30000;\n\nexport const DASHBOARD_RECONNECT_DELAY_MS = 3000;\n\nexport const SERVER_FUNCTION_DEFAULT_TIMEOUT_MS = 30000;\n\nexport const PREFETCH_MAX_SIZE_BYTES = 200 * KB_IN_BYTES;\n\nexport const PREFETCH_DEFAULT_TIMEOUT_MS = 10000;\n\nexport const PREFETCH_DEFAULT_DELAY_MS = 200;\n\nexport const HTTP_OK = 200;\n\nexport const HTTP_NO_CONTENT = 204;\n\nexport const HTTP_CREATED = 201;\n\nexport const HTTP_REDIRECT_FOUND = 302;\n\nexport const HTTP_NOT_MODIFIED = 304;\n\nexport const HTTP_BAD_REQUEST = 400;\n\nexport const HTTP_UNAUTHORIZED = 401;\n\nexport const HTTP_FORBIDDEN = 403;\n\nexport const HTTP_NOT_FOUND = 404;\n\nexport const HTTP_METHOD_NOT_ALLOWED = 405;\n\nexport const HTTP_GONE = 410;\n\nexport const HTTP_PAYLOAD_TOO_LARGE = 413;\n\nexport const HTTP_URI_TOO_LONG = 414;\n\nexport const HTTP_TOO_MANY_REQUESTS = 429;\n\nexport const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;\n\nexport const HTTP_SERVER_ERROR = 500;\n\nexport const HTTP_INTERNAL_SERVER_ERROR = 500;\n\nexport const HTTP_BAD_GATEWAY = 502;\n\nexport const HTTP_NOT_IMPLEMENTED = 501;\n\nexport const HTTP_UNAVAILABLE = 503;\n\nexport const HTTP_NETWORK_CONNECT_TIMEOUT = 599;\n\nexport const HTTP_STATUS_SUCCESS_MIN = 200;\n\nexport const HTTP_STATUS_REDIRECT_MIN = 300;\n\nexport const HTTP_STATUS_CLIENT_ERROR_MIN = 400;\n\nexport const HTTP_STATUS_SERVER_ERROR_MIN = 500;\n\nexport const HTTP_CONTENT_TYPES = {\n JS: \"application/javascript; charset=utf-8\",\n JSON: \"application/json; charset=utf-8\",\n HTML: \"text/html; charset=utf-8\",\n CSS: \"text/css; charset=utf-8\",\n TEXT: \"text/plain; charset=utf-8\",\n} as const;\n\nimport { MS_PER_SECOND, SECONDS_PER_MINUTE } from \"./cache.ts\";\n\nexport const MS_PER_MINUTE = 60000;\n\nexport { MS_PER_SECOND, SECONDS_PER_MINUTE };\n\nexport const HTTP_CONTENT_TYPE_IMAGE_PNG = \"image/png\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_JPEG = \"image/jpeg\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_WEBP = \"image/webp\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_AVIF = \"image/avif\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_SVG = \"image/svg+xml\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_GIF = \"image/gif\";\n\nexport const HTTP_CONTENT_TYPE_IMAGE_ICO = \"image/x-icon\";\n", "import { KB_IN_BYTES } from \"./http.ts\";\n\nexport const HMR_MAX_MESSAGE_SIZE_BYTES = 1024 * KB_IN_BYTES;\n\nexport const HMR_MAX_MESSAGES_PER_MINUTE = 100;\n\nexport const HMR_CLIENT_RELOAD_DELAY_MS = 3000;\n\nexport const HMR_PORT_OFFSET = 1;\n\nexport const HMR_RATE_LIMIT_WINDOW_MS = 60000;\n\nexport const HMR_CLOSE_NORMAL = 1000;\n\nexport const HMR_CLOSE_RATE_LIMIT = 1008;\n\nexport const HMR_CLOSE_MESSAGE_TOO_LARGE = 1009;\n\nexport const HMR_MESSAGE_TYPES = {\n CONNECTED: \"connected\",\n UPDATE: \"update\",\n RELOAD: \"reload\",\n PING: \"ping\",\n PONG: \"pong\",\n} as const;\n\nexport function isValidHMRMessageType(type: string): type is keyof typeof HMR_MESSAGE_TYPES {\n return Object.values(HMR_MESSAGE_TYPES).includes(\n type as typeof HMR_MESSAGE_TYPES[keyof typeof HMR_MESSAGE_TYPES],\n );\n}\n", "export const DEFAULT_DEV_SERVER_PORT = 3000;\nexport const DEFAULT_REDIS_PORT = 6379;\nexport const DEFAULT_API_SERVER_PORT = 8080;\nexport const DEFAULT_PREVIEW_SERVER_PORT = 5000;\nexport const DEFAULT_METRICS_PORT = 9000;\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * 1024;\n\nexport const DEFAULT_IMAGE_THUMBNAIL_SIZE = 256;\nexport const DEFAULT_IMAGE_SMALL_SIZE = 512;\nexport const DEFAULT_IMAGE_LARGE_SIZE = 2048;\n\nexport const RESPONSIVE_IMAGE_WIDTH_XS = 320;\nexport const RESPONSIVE_IMAGE_WIDTH_SM = 640;\nexport const RESPONSIVE_IMAGE_WIDTH_MD = 1024;\nexport const RESPONSIVE_IMAGE_WIDTH_LG = 1920;\n\nexport const RESPONSIVE_IMAGE_WIDTHS = [\n RESPONSIVE_IMAGE_WIDTH_XS,\n RESPONSIVE_IMAGE_WIDTH_SM,\n RESPONSIVE_IMAGE_WIDTH_MD,\n RESPONSIVE_IMAGE_WIDTH_LG,\n] as const;\n\nexport const MAX_CHUNK_SIZE_KB = 4096;\n\nexport const MIN_PORT = 1;\n\nexport const MAX_PORT = 65535;\n\nexport const DEFAULT_SERVER_PORT = 8000;\n", "/**\n * Project directory paths and file extensions\n *\n * For internal veryfront URL endpoints, see ./constants/server.ts\n */\n\nimport {\n BUILD_DIRS,\n INTERNAL_ENDPOINTS,\n INTERNAL_PATH_PREFIXES,\n INTERNAL_PREFIX,\n} from \"./constants/server.ts\";\n\nexport const PATHS = {\n PAGES_DIR: \"pages\",\n COMPONENTS_DIR: \"components\",\n PUBLIC_DIR: \"public\",\n STYLES_DIR: \"styles\",\n DIST_DIR: \"dist\",\n CONFIG_FILE: \"veryfront.config.js\",\n} as const;\n\n/**\n * @deprecated Use INTERNAL_PREFIX, INTERNAL_ENDPOINTS, INTERNAL_PATH_PREFIXES from ./constants/server.ts\n */\nexport const VERYFRONT_PATHS = {\n INTERNAL_PREFIX: INTERNAL_PREFIX,\n BUILD_DIR: BUILD_DIRS.ROOT,\n CHUNKS_DIR: BUILD_DIRS.CHUNKS,\n DATA_DIR: BUILD_DIRS.DATA,\n ASSETS_DIR: BUILD_DIRS.ASSETS,\n HMR_RUNTIME: INTERNAL_ENDPOINTS.HMR_RUNTIME,\n CLIENT_JS: INTERNAL_ENDPOINTS.CLIENT_JS,\n ROUTER_JS: INTERNAL_ENDPOINTS.ROUTER_JS,\n ERROR_OVERLAY: INTERNAL_ENDPOINTS.ERROR_OVERLAY,\n} as const;\n\nexport const FILE_EXTENSIONS = {\n MDX: [\".mdx\", \".md\"],\n SCRIPT: [\".tsx\", \".ts\", \".jsx\", \".js\"],\n STYLE: [\".css\", \".scss\", \".sass\"],\n ALL: [\".mdx\", \".md\", \".tsx\", \".ts\", \".jsx\", \".js\", \".css\"],\n} as const;\n\n// Re-export for convenience\nexport { BUILD_DIRS, INTERNAL_ENDPOINTS, INTERNAL_PATH_PREFIXES, INTERNAL_PREFIX };\n", "import { serverLogger as logger } from \"./logger/index.ts\";\n\nexport interface BundleMetadata {\n hash: string;\n codeHash: string;\n size: number;\n compiledAt: number;\n source: string;\n mode: \"development\" | \"production\";\n meta?: {\n type?: \"mdx\" | \"component\" | \"layout\" | \"provider\";\n depsHash?: string;\n reactVersion?: string;\n };\n}\n\nexport interface BundleCode {\n code: string;\n sourceMap?: string;\n css?: string;\n}\n\nexport interface BundleManifestStore {\n getBundleMetadata(key: string): Promise<BundleMetadata | undefined>;\n\n setBundleMetadata(key: string, metadata: BundleMetadata, ttlMs?: number): Promise<void>;\n\n getBundleCode(hash: string): Promise<BundleCode | undefined>;\n\n setBundleCode(hash: string, code: BundleCode, ttlMs?: number): Promise<void>;\n\n deleteBundle(key: string): Promise<void>;\n\n invalidateSource(source: string): Promise<number>;\n\n clear(): Promise<void>;\n\n isAvailable(): Promise<boolean>;\n\n getStats(): Promise<{\n totalBundles: number;\n totalSize: number;\n oldestBundle?: number;\n newestBundle?: number;\n }>;\n}\n\nexport class InMemoryBundleManifestStore implements BundleManifestStore {\n private metadata = new Map<string, { value: BundleMetadata; expiry?: number }>();\n private code = new Map<string, { value: BundleCode; expiry?: number }>();\n private sourceIndex = new Map<string, Set<string>>();\n\n getBundleMetadata(key: string): Promise<BundleMetadata | undefined> {\n const entry = this.metadata.get(key);\n if (!entry) return Promise.resolve(undefined);\n if (entry.expiry && Date.now() > entry.expiry) {\n this.metadata.delete(key);\n return Promise.resolve(undefined);\n }\n return Promise.resolve(entry.value);\n }\n\n setBundleMetadata(key: string, metadata: BundleMetadata, ttlMs?: number): Promise<void> {\n const expiry = ttlMs ? Date.now() + ttlMs : undefined;\n this.metadata.set(key, { value: metadata, expiry });\n\n if (!this.sourceIndex.has(metadata.source)) {\n this.sourceIndex.set(metadata.source, new Set());\n }\n this.sourceIndex.get(metadata.source)!.add(key);\n return Promise.resolve();\n }\n\n getBundleCode(hash: string): Promise<BundleCode | undefined> {\n const entry = this.code.get(hash);\n if (!entry) return Promise.resolve(undefined);\n if (entry.expiry && Date.now() > entry.expiry) {\n this.code.delete(hash);\n return Promise.resolve(undefined);\n }\n return Promise.resolve(entry.value);\n }\n\n setBundleCode(hash: string, code: BundleCode, ttlMs?: number): Promise<void> {\n const expiry = ttlMs ? Date.now() + ttlMs : undefined;\n this.code.set(hash, { value: code, expiry });\n return Promise.resolve();\n }\n\n async deleteBundle(key: string): Promise<void> {\n const metadata = await this.getBundleMetadata(key);\n this.metadata.delete(key);\n if (metadata) {\n this.code.delete(metadata.codeHash);\n const sourceKeys = this.sourceIndex.get(metadata.source);\n if (sourceKeys) {\n sourceKeys.delete(key);\n if (sourceKeys.size === 0) {\n this.sourceIndex.delete(metadata.source);\n }\n }\n }\n }\n\n async invalidateSource(source: string): Promise<number> {\n const keys = this.sourceIndex.get(source);\n if (!keys) return 0;\n\n let count = 0;\n for (const key of Array.from(keys)) {\n await this.deleteBundle(key);\n count++;\n }\n this.sourceIndex.delete(source);\n return count;\n }\n\n clear(): Promise<void> {\n this.metadata.clear();\n this.code.clear();\n this.sourceIndex.clear();\n return Promise.resolve();\n }\n\n isAvailable(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n getStats(): Promise<{\n totalBundles: number;\n totalSize: number;\n oldestBundle?: number;\n newestBundle?: number;\n }> {\n let totalSize = 0;\n let oldest: number | undefined;\n let newest: number | undefined;\n\n for (const { value } of this.metadata.values()) {\n totalSize += value.size;\n if (!oldest || value.compiledAt < oldest) oldest = value.compiledAt;\n if (!newest || value.compiledAt > newest) newest = value.compiledAt;\n }\n\n return Promise.resolve({\n totalBundles: this.metadata.size,\n totalSize,\n oldestBundle: oldest,\n newestBundle: newest,\n });\n }\n}\n\nlet manifestStore: BundleManifestStore = new InMemoryBundleManifestStore();\n\nexport function setBundleManifestStore(store: BundleManifestStore): void {\n manifestStore = store;\n logger.info(\"[bundle-manifest] Bundle manifest store configured\", {\n type: store.constructor.name,\n });\n}\n\nexport function getBundleManifestStore(): BundleManifestStore {\n return manifestStore;\n}\n\nexport { computeCodeHash, computeContentHash } from \"./hash-utils.ts\";\n", "/**\n * Performance Timer Utility\n *\n * Collects timing data for performance analysis.\n * Enable with VERYFRONT_PERF=1 environment variable.\n */\n\nconst enabled = typeof process !== \"undefined\"\n ? process.env?.VERYFRONT_PERF === \"1\"\n : typeof Deno !== \"undefined\"\n ? Deno.env.get(\"VERYFRONT_PERF\") === \"1\"\n : false;\n\ninterface TimingEntry {\n label: string;\n startMs: number;\n endMs?: number;\n durationMs?: number;\n parent?: string;\n}\n\nconst timings = new Map<string, TimingEntry[]>();\nlet currentRequestId: string | null = null;\n\nexport function startRequest(requestId: string): void {\n if (!enabled) return;\n currentRequestId = requestId;\n timings.set(requestId, []);\n}\n\nexport function startTimer(label: string, parent?: string): () => void {\n if (!enabled || !currentRequestId) return () => {};\n\n const entry: TimingEntry = {\n label,\n startMs: performance.now(),\n parent,\n };\n\n const entries = timings.get(currentRequestId);\n if (entries) {\n entries.push(entry);\n }\n\n return () => {\n entry.endMs = performance.now();\n entry.durationMs = entry.endMs - entry.startMs;\n };\n}\n\nexport async function timeAsync<T>(\n label: string,\n fn: () => Promise<T>,\n parent?: string,\n): Promise<T> {\n if (!enabled) return fn();\n\n const stop = startTimer(label, parent);\n try {\n return await fn();\n } finally {\n stop();\n }\n}\n\nexport function endRequest(requestId: string): void {\n if (!enabled) return;\n\n const entries = timings.get(requestId);\n if (!entries || entries.length === 0) {\n currentRequestId = null;\n return;\n }\n\n // Calculate total and sort by duration\n const sorted = entries\n .filter((e) => e.durationMs !== undefined)\n .sort((a, b) => (b.durationMs || 0) - (a.durationMs || 0));\n\n const total = entries.find((e) => e.label === \"total\")?.durationMs ||\n sorted.reduce((sum, e) => sum + (e.durationMs || 0), 0);\n\n console.log(`\\n[PERF] Request ${requestId} - Total: ${total.toFixed(1)}ms`);\n console.log(\"\u2500\".repeat(60));\n\n // Group by parent\n const roots = sorted.filter((e) => !e.parent);\n const children = new Map<string, TimingEntry[]>();\n\n for (const entry of sorted) {\n if (entry.parent) {\n const list = children.get(entry.parent) || [];\n list.push(entry);\n children.set(entry.parent, list);\n }\n }\n\n for (const entry of roots) {\n const pct = ((entry.durationMs || 0) / total * 100).toFixed(1);\n console.log(` ${entry.label}: ${entry.durationMs?.toFixed(1)}ms (${pct}%)`);\n\n const childList = children.get(entry.label);\n if (childList) {\n for (const child of childList.slice(0, 5)) {\n const childPct = ((child.durationMs || 0) / total * 100).toFixed(1);\n console.log(` \u2514\u2500 ${child.label}: ${child.durationMs?.toFixed(1)}ms (${childPct}%)`);\n }\n if (childList.length > 5) {\n console.log(` \u2514\u2500 ... and ${childList.length - 5} more`);\n }\n }\n }\n\n console.log(\"\u2500\".repeat(60));\n\n timings.delete(requestId);\n currentRequestId = null;\n}\n\nexport function isEnabled(): boolean {\n return enabled;\n}\n", "import type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport type { TracingConfig } from \"./types.ts\";\nimport { getEnv } from \"../../platform/compat/process.ts\";\n\nconst DEFAULT_CONFIG: TracingConfig = {\n enabled: false,\n exporter: \"console\",\n serviceName: \"veryfront\",\n sampleRate: 1.0,\n debug: false,\n};\n\nexport function loadConfig(\n config: Partial<TracingConfig> = {},\n adapter?: RuntimeAdapter,\n): TracingConfig {\n const finalConfig = { ...DEFAULT_CONFIG, ...config };\n\n if (adapter?.env) {\n applyEnvFromAdapter(finalConfig, adapter.env);\n } else {\n applyEnvFromDeno(finalConfig);\n }\n\n return finalConfig;\n}\n\nfunction applyEnvFromAdapter(\n config: TracingConfig,\n envAdapter: RuntimeAdapter[\"env\"],\n): void {\n if (!envAdapter) return;\n\n const otelEnabled = envAdapter.get(\"OTEL_TRACES_ENABLED\");\n const veryfrontOtel = envAdapter.get(\"VERYFRONT_OTEL\");\n const serviceName = envAdapter.get(\"OTEL_SERVICE_NAME\");\n\n config.enabled = otelEnabled === \"true\" ||\n veryfrontOtel === \"1\" ||\n config.enabled;\n\n if (serviceName) config.serviceName = serviceName;\n\n const otlpEndpoint = envAdapter.get(\"OTEL_EXPORTER_OTLP_ENDPOINT\");\n const tracesEndpoint = envAdapter.get(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\");\n config.endpoint = otlpEndpoint || tracesEndpoint || config.endpoint;\n\n const exporterType = envAdapter.get(\"OTEL_TRACES_EXPORTER\");\n if (isValidExporter(exporterType)) {\n config.exporter = exporterType;\n }\n}\n\nfunction applyEnvFromDeno(config: TracingConfig): void {\n try {\n // Use platform abstraction for cross-platform env access\n config.enabled = getEnv(\"OTEL_TRACES_ENABLED\") === \"true\" ||\n getEnv(\"VERYFRONT_OTEL\") === \"1\" ||\n config.enabled;\n\n config.serviceName = getEnv(\"OTEL_SERVICE_NAME\") || config.serviceName;\n config.endpoint = getEnv(\"OTEL_EXPORTER_OTLP_ENDPOINT\") ||\n getEnv(\"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\") ||\n config.endpoint;\n\n const exporterType = getEnv(\"OTEL_TRACES_EXPORTER\");\n if (isValidExporter(exporterType)) {\n config.exporter = exporterType;\n }\n } catch {\n // Environment access may fail in some runtimes\n }\n}\n\nfunction isValidExporter(value: string | undefined): value is TracingConfig[\"exporter\"] {\n return value === \"jaeger\" || value === \"zipkin\" || value === \"otlp\" || value === \"console\";\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { Span, SpanKind } from \"./types.ts\";\nimport type { OpenTelemetryAPI, SpanOptions } from \"./types.ts\";\n\nexport class SpanOperations {\n constructor(\n private api: OpenTelemetryAPI,\n private tracer: import(\"./types.ts\").Tracer,\n ) {}\n\n startSpan(name: string, options: SpanOptions = {}): Span | null {\n try {\n const spanKind = this.mapSpanKind(options.kind);\n\n const span = this.tracer.startSpan(name, {\n kind: spanKind,\n attributes: options.attributes || {},\n }, options.parent as import(\"./types.ts\").Context | undefined);\n\n return span;\n } catch (error) {\n logger.debug(\"[tracing] Failed to start span\", { name, error });\n return null;\n }\n }\n\n endSpan(span: Span | null, error?: Error): void {\n if (!span) return;\n\n try {\n if (error) {\n span.recordException(error);\n span.setStatus({\n code: this.api.SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: this.api.SpanStatusCode.OK });\n }\n span.end();\n } catch (err) {\n logger.debug(\"[tracing] Failed to end span\", err);\n }\n }\n\n setAttributes(span: Span | null, attributes: Record<string, string | number | boolean>): void {\n if (!span) return;\n\n try {\n span.setAttributes(attributes);\n } catch (error) {\n logger.debug(\"[tracing] Failed to set span attributes\", error);\n }\n }\n\n addEvent(\n span: Span | null,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n if (!span) return;\n\n try {\n span.addEvent(name, attributes);\n } catch (error) {\n logger.debug(\"[tracing] Failed to add span event\", error);\n }\n }\n\n createChildSpan(parentSpan: Span | null, name: string, options: SpanOptions = {}): Span | null {\n if (!parentSpan) return this.startSpan(name, options);\n\n try {\n const parentContext = this.api.trace.setSpan(this.api.context.active(), parentSpan);\n return this.startSpan(name, { ...options, parent: parentContext });\n } catch (error) {\n logger.debug(\"[tracing] Failed to create child span\", error);\n return null;\n }\n }\n\n private mapSpanKind(kind?: SpanOptions[\"kind\"]): SpanKind {\n if (!kind) return this.api.SpanKind.INTERNAL;\n\n const kindMap: Record<string, SpanKind> = {\n \"internal\": this.api.SpanKind.INTERNAL,\n \"server\": this.api.SpanKind.SERVER,\n \"client\": this.api.SpanKind.CLIENT,\n \"producer\": this.api.SpanKind.PRODUCER,\n \"consumer\": this.api.SpanKind.CONSUMER,\n };\n\n return kindMap[kind.toLowerCase()] || this.api.SpanKind.INTERNAL;\n }\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { Context, OpenTelemetryAPI, Span, TextMapPropagator } from \"./types.ts\";\n\nexport class ContextPropagation {\n constructor(\n private api: OpenTelemetryAPI,\n private propagator: TextMapPropagator,\n ) {}\n\n extractContext(headers: Headers): Context | undefined {\n try {\n const carrier: Record<string, string> = {};\n headers.forEach((value, key) => {\n carrier[key] = value;\n });\n\n return this.api.propagation.extract(this.api.context.active(), carrier);\n } catch (error) {\n logger.debug(\"[tracing] Failed to extract context from headers\", error);\n return undefined;\n }\n }\n\n injectContext(context: Context, headers: Headers): void {\n try {\n const carrier: Record<string, string> = {};\n this.api.propagation.inject(context, carrier);\n\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value);\n }\n } catch (error) {\n logger.debug(\"[tracing] Failed to inject context into headers\", error);\n }\n }\n\n getActiveContext(): Context | undefined {\n try {\n return this.api.context.active();\n } catch (error) {\n logger.debug(\"[tracing] Failed to get active context\", error);\n return undefined;\n }\n }\n\n async withActiveSpan<T>(span: Span | null, fn: () => Promise<T>): Promise<T> {\n if (!span) return await fn();\n\n return await this.api.context.with(\n this.api.trace.setSpan(this.api.context.active(), span),\n fn,\n );\n }\n\n withSpan<T>(\n name: string,\n fn: (span: Span | null) => T,\n startSpan: (name: string) => Span | null,\n endSpan: (span: Span | null, error?: Error) => void,\n ): T {\n const span = startSpan(name);\n\n try {\n const result = fn(span);\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n }\n\n async withSpanAsync<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n startSpan: (name: string) => Span | null,\n endSpan: (span: Span | null, error?: Error) => void,\n ): Promise<T> {\n const span = startSpan(name);\n\n try {\n const result = await fn(span);\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span, error as Error);\n throw error;\n }\n }\n}\n", "import { serverLogger as logger } from \"@veryfront/utils\";\nimport type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport type { OpenTelemetryAPI, TracingConfig, TracingState } from \"./types.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { SpanOperations } from \"./span-operations.ts\";\nimport { ContextPropagation } from \"./context-propagation.ts\";\n\nclass TracingManager {\n private state: TracingState = {\n initialized: false,\n tracer: null,\n api: null,\n propagator: null,\n };\n\n private spanOps: SpanOperations | null = null;\n private contextProp: ContextPropagation | null = null;\n\n async initialize(config: Partial<TracingConfig> = {}, adapter?: RuntimeAdapter): Promise<void> {\n if (this.state.initialized) {\n logger.debug(\"[tracing] Already initialized\");\n return;\n }\n\n const finalConfig = loadConfig(config, adapter);\n\n if (!finalConfig.enabled) {\n logger.debug(\"[tracing] Tracing disabled\");\n this.state.initialized = true;\n return;\n }\n\n try {\n await this.initializeTracer(finalConfig);\n this.state.initialized = true;\n\n logger.info(\"[tracing] OpenTelemetry tracing initialized\", {\n exporter: finalConfig.exporter,\n serviceName: finalConfig.serviceName,\n endpoint: finalConfig.endpoint,\n });\n } catch (error) {\n logger.warn(\"[tracing] Failed to initialize OpenTelemetry tracing\", error);\n this.state.initialized = true;\n }\n }\n\n private async initializeTracer(config: TracingConfig): Promise<void> {\n const api = await import(\"@opentelemetry/api\") as OpenTelemetryAPI;\n this.state.api = api;\n\n this.state.tracer = api.trace.getTracer(config.serviceName || \"veryfront\", \"0.1.0\");\n\n const { W3CTraceContextPropagator } = await import(\"@opentelemetry/core\");\n const propagator = new W3CTraceContextPropagator();\n this.state.propagator = propagator;\n api.propagation.setGlobalPropagator(propagator);\n\n if (this.state.api && this.state.tracer) {\n this.spanOps = new SpanOperations(this.state.api, this.state.tracer);\n }\n\n if (this.state.api && this.state.propagator) {\n this.contextProp = new ContextPropagation(this.state.api, this.state.propagator);\n }\n }\n\n isEnabled(): boolean {\n return this.state.initialized && this.state.tracer !== null;\n }\n\n getSpanOperations(): SpanOperations | null {\n return this.spanOps;\n }\n\n getContextPropagation(): ContextPropagation | null {\n return this.contextProp;\n }\n\n getState(): TracingState {\n return this.state;\n }\n\n shutdown(): void {\n if (!this.state.initialized) return;\n\n try {\n logger.info(\"[tracing] Tracing shutdown initiated\");\n } catch (error) {\n logger.warn(\"[tracing] Error during tracing shutdown\", error);\n }\n }\n}\n\nexport const tracingManager = new TracingManager();\n", "import type { RuntimeAdapter } from \"@veryfront/platform/adapters/base.ts\";\nimport { tracingManager } from \"./manager.ts\";\nimport type { Context, Span, SpanOptions, TracingConfig } from \"./types.ts\";\n\nexport type { Context, Span, SpanOptions, TracingConfig } from \"./types.ts\";\nexport { loadConfig } from \"./config.ts\";\nexport { SpanOperations } from \"./span-operations.ts\";\nexport { ContextPropagation } from \"./context-propagation.ts\";\nexport { SpanNames } from \"./span-names.ts\";\n\nexport async function initTracing(\n config: Partial<TracingConfig> = {},\n adapter?: RuntimeAdapter,\n): Promise<void> {\n await tracingManager.initialize(config, adapter);\n}\n\nexport function isTracingEnabled(): boolean {\n return tracingManager.isEnabled();\n}\n\nexport function shutdownTracing(): void {\n tracingManager.shutdown();\n}\n\nexport function getTracingState() {\n return tracingManager.getState();\n}\n\nconst getSpanOps = () => tracingManager.getSpanOperations();\nconst getContextProp = () => tracingManager.getContextPropagation();\n\nexport function startSpan(name: string, options: SpanOptions = {}): Span | null {\n return getSpanOps()?.startSpan(name, options) ?? null;\n}\n\nexport function endSpan(span: Span | null, error?: Error): void {\n getSpanOps()?.endSpan(span, error);\n}\n\nexport function setSpanAttributes(\n span: Span | null,\n attributes: Record<string, string | number | boolean>,\n): void {\n getSpanOps()?.setAttributes(span, attributes);\n}\n\nexport function addSpanEvent(\n span: Span | null,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n): void {\n getSpanOps()?.addEvent(span, name, attributes);\n}\n\nexport function createChildSpan(\n parentSpan: Span | null,\n name: string,\n options: SpanOptions = {},\n): Span | null {\n return getSpanOps()?.createChildSpan(parentSpan, name, options) ?? null;\n}\n\nexport function extractContext(headers: Headers): Context | undefined {\n return getContextProp()?.extractContext(headers);\n}\n\nexport function injectContext(context: Context, headers: Headers): void {\n getContextProp()?.injectContext(context, headers);\n}\n\nexport function getActiveContext(): Context | undefined {\n return getContextProp()?.getActiveContext();\n}\n\nexport async function withActiveSpan<T>(span: Span | null, fn: () => Promise<T>): Promise<T> {\n const contextProp = getContextProp();\n if (!contextProp) return await fn();\n return await contextProp.withActiveSpan(span, fn);\n}\n\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n options: SpanOptions = {},\n): Promise<T> {\n const contextProp = getContextProp();\n const spanOps = getSpanOps();\n\n if (!contextProp || !spanOps) return await fn(null);\n\n return await contextProp.withSpanAsync(\n name,\n fn,\n (n) => spanOps.startSpan(n, options),\n (s, e) => spanOps.endSpan(s, e),\n );\n}\n\nexport function withSpanSync<T>(\n name: string,\n fn: (span: Span | null) => T,\n options: SpanOptions = {},\n): T {\n const contextProp = getContextProp();\n const spanOps = getSpanOps();\n\n if (!contextProp || !spanOps) return fn(null);\n\n return contextProp.withSpan(\n name,\n fn,\n (n) => spanOps.startSpan(n, options),\n (s, e) => spanOps.endSpan(s, e),\n );\n}\n\nexport { tracingManager } from \"./manager.ts\";\n", "/**\n * AI Module Default Configuration\n *\n * Centralized defaults for all AI components.\n * Import from here instead of hardcoding values.\n */\n\n/**\n * Agent defaults\n */\nexport const AGENT_DEFAULTS = {\n /** Maximum tokens for completion */\n maxTokens: 4096,\n\n /** Default temperature for generation */\n temperature: 0.7,\n\n /** Maximum agent loop steps */\n maxSteps: 20,\n\n /** Default memory type */\n memoryType: \"conversation\" as const,\n\n /** Default memory max tokens */\n memoryMaxTokens: 4000,\n} as const;\n\n/**\n * Streaming defaults\n */\nexport const STREAMING_DEFAULTS = {\n /** Maximum buffer size for streaming (1MB) */\n maxBufferSize: 1024 * 1024,\n\n /** Chunk size for stream processing */\n chunkSize: 16384,\n} as const;\n\n/**\n * Memory defaults\n */\nexport const MEMORY_DEFAULTS = {\n /** Default buffer size for buffer memory */\n bufferSize: 10,\n\n /** Default summary threshold for summary memory */\n summaryThreshold: 20,\n\n /** Default Redis TTL (24 hours) */\n redisTtl: 86400,\n\n /** Default Redis key prefix */\n redisKeyPrefix: \"veryfront:agent:memory:\",\n} as const;\n\n/**\n * Rate limiting defaults\n */\nexport const RATE_LIMIT_DEFAULTS = {\n /** Default requests per minute */\n requestsPerMinute: 60,\n\n /** Default tokens per minute */\n tokensPerMinute: 100000,\n\n /** Default window size in ms */\n windowMs: 60000,\n} as const;\n\n/**\n * Cost tracking defaults\n */\nexport const COST_TRACKING_DEFAULTS = {\n /** Default daily budget (USD) */\n dailyBudget: 100,\n\n /** Default monthly budget (USD) */\n monthlyBudget: 1000,\n\n /** Budget warning threshold (percentage) */\n warningThreshold: 0.8,\n} as const;\n\n/**\n * Retry defaults\n */\nexport const RETRY_DEFAULTS = {\n /** Maximum retry attempts */\n maxAttempts: 3,\n\n /** Initial retry delay (ms) */\n initialDelayMs: 1000,\n\n /** Maximum retry delay (ms) */\n maxDelayMs: 30000,\n\n /** Backoff multiplier */\n backoffMultiplier: 2,\n} as const;\n\n/**\n * Workflow defaults\n */\nexport const WORKFLOW_DEFAULTS = {\n /** Default workflow timeout (5 minutes) */\n timeoutMs: 300000,\n\n /** Maximum parallel executions */\n maxParallel: 10,\n\n /** Checkpoint interval (ms) */\n checkpointIntervalMs: 5000,\n\n /** Approval timeout (24 hours) */\n approvalTimeoutMs: 86400000,\n} as const;\n\n/**\n * Provider defaults\n */\nexport const PROVIDER_DEFAULTS = {\n /** Default model for each provider */\n models: {\n openai: \"gpt-4o\",\n anthropic: \"claude-sonnet-4-20250514\",\n google: \"gemini-1.5-pro\",\n },\n\n /** Request timeout (ms) */\n requestTimeoutMs: 120000,\n} as const;\n\n/**\n * Security defaults\n */\nexport const SECURITY_DEFAULTS = {\n /** Maximum input length */\n maxInputLength: 100000,\n\n /** Maximum output length */\n maxOutputLength: 100000,\n\n /** PII redaction enabled */\n redactPii: false,\n} as const;\n\n/**\n * Get all defaults as a single object\n */\nexport const AI_DEFAULTS = {\n agent: AGENT_DEFAULTS,\n streaming: STREAMING_DEFAULTS,\n memory: MEMORY_DEFAULTS,\n rateLimit: RATE_LIMIT_DEFAULTS,\n costTracking: COST_TRACKING_DEFAULTS,\n retry: RETRY_DEFAULTS,\n workflow: WORKFLOW_DEFAULTS,\n provider: PROVIDER_DEFAULTS,\n security: SECURITY_DEFAULTS,\n} as const;\n", "/**\n * Stream Event Schemas and Types\n *\n * Defines the event format for agent streaming responses.\n * Compatible with Vercel AI SDK Data Stream Protocol.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Schema for agent stream events\n */\nexport const AgentStreamEventSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"content\"),\n content: z.string(),\n }),\n z.object({\n type: z.literal(\"tool_call_start\"),\n toolCall: z.object({\n id: z.string(),\n name: z.string(),\n }),\n }),\n z.object({\n type: z.literal(\"tool_call_delta\"),\n id: z.string(),\n arguments: z.string(),\n }),\n z.object({\n type: z.literal(\"tool_call_complete\"),\n toolCall: z.object({\n id: z.string(),\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n z.object({\n type: z.literal(\"finish\"),\n finishReason: z.string().nullable(),\n }),\n z.object({\n type: z.literal(\"usage\"),\n usage: z.object({\n promptTokens: z.number().optional(),\n completionTokens: z.number().optional(),\n totalTokens: z.number().optional(),\n }),\n }),\n]);\n\nexport type AgentStreamEvent = z.infer<typeof AgentStreamEventSchema>;\n\n/**\n * Stream event emitter helper\n */\nexport class StreamEventEmitter {\n private encoder: TextEncoder;\n private controller: ReadableStreamDefaultController;\n\n constructor(controller: ReadableStreamDefaultController) {\n this.encoder = new TextEncoder();\n this.controller = controller;\n }\n\n /**\n * Emit an SSE-formatted event\n */\n emit(event: Record<string, unknown>): void {\n const data = JSON.stringify(event);\n this.controller.enqueue(this.encoder.encode(`data: ${data}\\n\\n`));\n }\n\n /**\n * Emit a start event\n */\n emitStart(messageId: string): void {\n this.emit({ type: \"start\", messageId });\n }\n\n /**\n * Emit a text-start event\n */\n emitTextStart(id: string): void {\n this.emit({ type: \"text-start\", id });\n }\n\n /**\n * Emit a text-delta event\n */\n emitTextDelta(id: string, delta: string): void {\n this.emit({ type: \"text-delta\", id, delta });\n }\n\n /**\n * Emit a text-end event\n */\n emitTextEnd(id: string): void {\n this.emit({ type: \"text-end\", id });\n }\n\n /**\n * Emit a tool-input-start event\n */\n emitToolInputStart(toolCallId: string, toolName: string, dynamic?: boolean): void {\n this.emit({\n type: \"tool-input-start\",\n toolCallId,\n toolName,\n ...(dynamic && { dynamic: true }),\n });\n }\n\n /**\n * Emit a tool-input-delta event\n */\n emitToolInputDelta(toolCallId: string, inputTextDelta: string): void {\n this.emit({\n type: \"tool-input-delta\",\n toolCallId,\n inputTextDelta,\n });\n }\n\n /**\n * Emit a tool-input-available event\n */\n emitToolInputAvailable(\n toolCallId: string,\n toolName: string,\n input: Record<string, unknown>,\n dynamic?: boolean,\n ): void {\n this.emit({\n type: \"tool-input-available\",\n toolCallId,\n toolName,\n input,\n ...(dynamic && { dynamic: true }),\n });\n }\n\n /**\n * Emit a tool-output-available event\n */\n emitToolOutputAvailable(toolCallId: string, output: unknown, dynamic?: boolean): void {\n this.emit({\n type: \"tool-output-available\",\n toolCallId,\n output,\n ...(dynamic && { dynamic: true }),\n });\n }\n\n /**\n * Emit a tool-output-error event\n */\n emitToolOutputError(toolCallId: string, errorText: string, dynamic?: boolean): void {\n this.emit({\n type: \"tool-output-error\",\n toolCallId,\n errorText,\n ...(dynamic && { dynamic: true }),\n });\n }\n\n /**\n * Emit a tool-input-error event\n */\n emitToolInputError(toolCallId: string, errorText: string, dynamic?: boolean): void {\n this.emit({\n type: \"tool-input-error\",\n toolCallId,\n errorText,\n ...(dynamic && { dynamic: true }),\n });\n }\n\n /**\n * Emit a finish event\n */\n emitFinish(): void {\n this.emit({ type: \"finish\" });\n }\n\n /**\n * Emit an error event\n */\n emitError(error: string): void {\n this.emit({ type: \"error\", error });\n }\n\n /**\n * Emit a step event (Veryfront extension)\n */\n emitStartStep(): void {\n this.emit({ type: \"start-step\" });\n }\n\n /**\n * Emit a finish-step event (Veryfront extension)\n */\n emitFinishStep(): void {\n this.emit({ type: \"finish-step\" });\n }\n}\n", "/**\n * Message Converter\n *\n * Converts between AI SDK v5 message format and provider formats.\n */\n\nimport {\n getTextFromParts,\n getToolArguments,\n type Message,\n type MessagePart,\n type ToolCallPart,\n type ToolResultPart,\n} from \"../types/agent.ts\";\n\n/**\n * Provider message format (OpenAI-compatible)\n */\nexport interface ProviderMessage {\n role: string;\n content: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Convert AI SDK v5 Message to provider format.\n *\n * Handles:\n * - Text content extraction from parts\n * - Tool calls (both tool-${toolName} and legacy tool-call patterns)\n * - Tool results\n *\n * Empty parts array results in empty content string, which is valid for\n * providers (e.g., assistant message with only tool calls, no text).\n */\nexport function convertMessageToProvider(msg: Message): ProviderMessage {\n const content = getTextFromParts(msg.parts);\n\n const providerMsg: ProviderMessage = {\n role: msg.role,\n content,\n };\n\n // Extract tool calls from parts\n // AI SDK v5 uses tool-${toolName} pattern (e.g., \"tool-weather\")\n // Also support legacy \"tool-call\" for backwards compatibility\n // Exclude \"tool-result\" which also starts with \"tool-\"\n const toolCallParts = msg.parts.filter(\n (p): p is ToolCallPart | (MessagePart & { type: \"tool-call\" }) =>\n p.type === \"tool-call\" || (p.type.startsWith(\"tool-\") && p.type !== \"tool-result\"),\n );\n\n if (toolCallParts.length > 0) {\n providerMsg.tool_calls = toolCallParts.map((tc) => ({\n id: tc.toolCallId,\n type: \"function\",\n function: {\n name: tc.toolName,\n // Use type-safe helper to extract args/input (throws if missing)\n arguments: JSON.stringify(getToolArguments(tc as ToolCallPart)),\n },\n }));\n }\n\n // Extract tool result info from parts\n const toolResultPart = msg.parts.find(\n (p): p is ToolResultPart => p.type === \"tool-result\",\n );\n\n if (toolResultPart && msg.role === \"tool\") {\n providerMsg.tool_call_id = toolResultPart.toolCallId;\n providerMsg.content = JSON.stringify(toolResultPart.result);\n }\n\n return providerMsg;\n}\n\n/**\n * Convert provider message back to AI SDK v5 format\n */\nexport function convertProviderToMessage(\n providerMsg: ProviderMessage,\n messageId?: string,\n): Message {\n const parts: MessagePart[] = [];\n\n // Add text content if present\n if (providerMsg.content) {\n parts.push({ type: \"text\", text: providerMsg.content });\n }\n\n // Add tool calls if present\n if (providerMsg.tool_calls) {\n for (const tc of providerMsg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty args on parse failure\n }\n\n parts.push({\n type: `tool-${tc.function.name}`,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args,\n });\n }\n }\n\n return {\n id: messageId || `msg_${Date.now()}`,\n role: providerMsg.role as Message[\"role\"],\n parts,\n timestamp: Date.now(),\n };\n}\n", "/**\n * Agent Runtime - Core execution engine\n *\n * Handles agent execution with:\n * - Multi-step reasoning (agent loop)\n * - Tool calling and execution\n * - Streaming responses\n * - Memory management\n * - Middleware execution\n */\n\nimport {\n type AgentConfig,\n type AgentContext,\n type AgentResponse,\n type AgentStatus,\n getTextFromParts,\n type Message,\n type MessagePart,\n type ToolCall,\n} from \"../types/agent.ts\";\nimport type { ToolDefinition } from \"../types/tool.ts\";\nimport type { Provider } from \"../types/provider.ts\";\nimport { getProviderFromModel } from \"../providers/factory.ts\";\nimport { executeTool, generateId, toolRegistry, toolToProviderDefinition } from \"../utils/index.ts\";\nimport { detectPlatform, getPlatformCapabilities } from \"../runtime/platform.ts\";\nimport { createMemory, type Memory } from \"./memory.ts\";\nimport { serverLogger as logger } from \"@veryfront/utils\";\nimport { addSpanEvent, setSpanAttributes, withSpan } from \"../../observability/tracing/index.ts\";\nimport { AGENT_DEFAULTS, STREAMING_DEFAULTS } from \"../config/defaults.ts\";\nimport { type AgentStreamEvent, AgentStreamEventSchema } from \"./streaming/index.ts\";\nimport { convertMessageToProvider } from \"./message-converter.ts\";\n\n// Use centralized defaults from config\nconst DEFAULT_MAX_TOKENS = AGENT_DEFAULTS.maxTokens;\nconst DEFAULT_TEMPERATURE = AGENT_DEFAULTS.temperature;\nconst MAX_STREAM_BUFFER_SIZE = STREAMING_DEFAULTS.maxBufferSize;\n\nexport class AgentRuntime {\n private id: string;\n private config: AgentConfig;\n private memory: Memory;\n private status: AgentStatus = \"idle\";\n\n constructor(id: string, config: AgentConfig) {\n this.id = id;\n this.config = config;\n\n const memoryConfig = config.memory || { type: \"conversation\", maxTokens: 4000 };\n this.memory = createMemory(memoryConfig);\n }\n\n /**\n * Generate a response (non-streaming)\n */\n async generate(\n input: string | Message[],\n context?: Record<string, unknown>,\n ): Promise<AgentResponse> {\n return await withSpan(\"agent.generate\", async (span) => {\n setSpanAttributes(span, {\n \"agent.id\": this.id,\n \"agent.model\": this.config.model,\n });\n\n const inputMessages = this.normalizeInput(input);\n\n for (const msg of inputMessages) {\n await this.memory.add(msg);\n }\n\n const messages = await this.memory.getMessages();\n const systemPrompt = await this.resolveSystemPrompt();\n const { provider, model } = getProviderFromModel(this.config.model);\n\n const agentContext: AgentContext = {\n agentId: this.id,\n model: this.config.model,\n input: inputMessages,\n data: context,\n platform: detectPlatform(),\n };\n\n if (this.config.middleware && this.config.middleware.length > 0) {\n return await this.executeMiddleware(agentContext, async () => {\n return await this.executeAgentLoop(\n provider,\n model,\n systemPrompt,\n messages,\n );\n });\n }\n\n return await this.executeAgentLoop(\n provider,\n model,\n systemPrompt,\n messages,\n );\n });\n }\n\n /**\n * Stream a response\n * Returns a ReadableStream compatible with Vercel AI SDK Data Stream Protocol\n */\n async stream(\n messages: Message[],\n context?: Record<string, unknown>,\n callbacks?: {\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n },\n ): Promise<ReadableStream> {\n for (const msg of messages) {\n await this.memory.add(msg);\n }\n\n const memoryMessages = await this.memory.getMessages();\n const systemPrompt = await this.resolveSystemPrompt();\n const { provider, model } = getProviderFromModel(this.config.model);\n\n const encoder = new TextEncoder();\n\n // Build tool execution context - merge user context with agent context\n const toolContext = {\n agentId: this.id,\n ...context,\n };\n\n // Generate a unique text part ID for UI message stream\n const textPartId = generateId(\"text\");\n\n return new ReadableStream({\n start: async (controller) => {\n try {\n this.status = \"streaming\";\n\n // Send start event (UI Message Stream Protocol v5)\n const messageId = `msg-${Date.now().toString(36)}-${\n Math.random().toString(36).slice(2, 8)\n }`;\n const startEvent = JSON.stringify({ type: \"start\", messageId });\n controller.enqueue(encoder.encode(`data: ${startEvent}\\n\\n`));\n\n // Send text-start event with ID\n const textStartEvent = JSON.stringify({\n type: \"text-start\",\n id: textPartId,\n });\n controller.enqueue(encoder.encode(`data: ${textStartEvent}\\n\\n`));\n\n await this.executeAgentLoopStreaming(\n provider,\n model,\n systemPrompt,\n memoryMessages,\n controller,\n encoder,\n callbacks,\n textPartId,\n toolContext,\n );\n\n // Send text-end event (UI Message Stream Protocol v5)\n const textEndEvent = JSON.stringify({\n type: \"text-end\",\n id: textPartId,\n });\n controller.enqueue(encoder.encode(`data: ${textEndEvent}\\n\\n`));\n\n // Send finish event (UI Message Stream Protocol v5)\n const finishEvent = JSON.stringify({ type: \"finish\" });\n controller.enqueue(encoder.encode(`data: ${finishEvent}\\n\\n`));\n\n controller.close();\n } catch (error) {\n this.status = \"error\";\n\n const errorEvent = JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n controller.enqueue(encoder.encode(`data: ${errorEvent}\\n\\n`));\n\n controller.close();\n }\n },\n });\n }\n\n /**\n * Execute agent loop (with tool calling)\n */\n private async executeAgentLoop(\n provider: Provider,\n model: string,\n systemPrompt: string,\n messages: Message[],\n ): Promise<AgentResponse> {\n return await withSpan(\"agent.execution_loop\", async (loopSpan) => {\n const capabilities = getPlatformCapabilities();\n const maxSteps = this.getMaxSteps(capabilities.maxAgentSteps);\n\n const toolCalls: ToolCall[] = [];\n const currentMessages = [...messages];\n const totalUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n for (let step = 0; step < maxSteps; step++) {\n this.status = \"thinking\";\n addSpanEvent(loopSpan, \"step_start\", { step });\n\n const tools = this.getAvailableTools();\n\n const response = await withSpan(\"agent.provider_complete\", async (span) => {\n setSpanAttributes(span, {\n model,\n \"messages.count\": currentMessages.length,\n });\n return await provider.complete({\n model,\n system: systemPrompt,\n messages: currentMessages.map((m) => convertMessageToProvider(m)),\n tools: tools.length > 0 ? tools : undefined,\n maxTokens: this.config.memory?.maxTokens || DEFAULT_MAX_TOKENS,\n temperature: DEFAULT_TEMPERATURE,\n });\n });\n\n totalUsage.promptTokens += response.usage.promptTokens;\n totalUsage.completionTokens += response.usage.completionTokens;\n totalUsage.totalTokens += response.usage.totalTokens;\n\n // Build parts array for v5 Message\n const assistantParts: MessagePart[] = [];\n if (response.text) {\n assistantParts.push({ type: \"text\", text: response.text });\n }\n if (response.toolCalls) {\n for (const tc of response.toolCalls) {\n // Use AI SDK v5 tool-${toolName} pattern\n assistantParts.push({\n type: `tool-${tc.name}`,\n toolCallId: tc.id,\n toolName: tc.name,\n args: tc.arguments,\n });\n }\n }\n\n const assistantMessage: Message = {\n id: `msg_${Date.now()}_${step}`,\n role: \"assistant\",\n parts: assistantParts,\n timestamp: Date.now(),\n };\n currentMessages.push(assistantMessage);\n await this.memory.add(assistantMessage);\n\n if (response.toolCalls && response.toolCalls.length > 0) {\n this.status = \"tool_execution\";\n addSpanEvent(loopSpan, \"tool_execution_start\", {\n count: response.toolCalls.length,\n });\n\n for (const tc of response.toolCalls) {\n const toolCall: ToolCall = {\n id: tc.id,\n name: tc.name,\n args: tc.arguments,\n status: \"pending\",\n };\n\n await withSpan(\"agent.tool_execute\", async (toolSpan) => {\n setSpanAttributes(toolSpan, {\n \"tool.name\": tc.name,\n \"tool.id\": tc.id,\n });\n\n try {\n toolCall.status = \"executing\";\n const startTime = Date.now();\n\n const result = await executeTool(tc.name, tc.arguments, {\n agentId: this.id,\n });\n\n toolCall.status = \"completed\";\n toolCall.result = result;\n toolCall.executionTime = Date.now() - startTime;\n\n const toolResultMessage: Message = {\n id: `tool_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result,\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(toolResultMessage);\n await this.memory.add(toolResultMessage);\n } catch (error) {\n toolCall.status = \"error\";\n toolCall.error = error instanceof Error ? error.message : String(error);\n setSpanAttributes(toolSpan, { \"error\": true, \"error.message\": toolCall.error });\n\n const errorMessage: Message = {\n id: `tool_error_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result: { error: toolCall.error },\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(errorMessage);\n await this.memory.add(errorMessage);\n }\n\n toolCalls.push(toolCall);\n });\n }\n\n continue;\n }\n\n this.status = \"completed\";\n addSpanEvent(loopSpan, \"loop_complete\");\n\n return {\n text: response.text,\n messages: currentMessages,\n toolCalls,\n status: this.status,\n usage: totalUsage,\n };\n }\n\n this.status = \"completed\";\n addSpanEvent(loopSpan, \"max_steps_reached\", { maxSteps });\n\n const lastMsg = currentMessages[currentMessages.length - 1];\n return {\n text: lastMsg ? getTextFromParts(lastMsg.parts) : \"\",\n messages: currentMessages,\n toolCalls,\n status: this.status,\n usage: totalUsage,\n metadata: {\n warning: `Max steps (${maxSteps}) reached`,\n },\n };\n });\n }\n\n /**\n * Execute agent loop with streaming\n * Uses Vercel AI SDK UI Message Stream Protocol v5 format\n */\n private async executeAgentLoopStreaming(\n provider: Provider,\n model: string,\n systemPrompt: string,\n messages: Message[],\n controller: ReadableStreamDefaultController,\n encoder: TextEncoder,\n callbacks?: {\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n },\n textPartId?: string,\n toolContext?: Record<string, unknown>,\n ): Promise<AgentResponse> {\n const capabilities = getPlatformCapabilities();\n const maxSteps = this.getMaxSteps(capabilities.maxAgentSteps);\n\n const toolCalls: ToolCall[] = [];\n const currentMessages = [...messages];\n const totalUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n for (let step = 0; step < maxSteps; step++) {\n // Send start-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const startStepEvent = JSON.stringify({ type: \"start-step\" });\n controller.enqueue(encoder.encode(`data: ${startStepEvent}\\n\\n`));\n\n const tools = this.getAvailableTools();\n\n const stream = await provider.stream({\n model,\n system: systemPrompt,\n messages: currentMessages.map((m) => convertMessageToProvider(m)),\n tools: tools.length > 0 ? tools : undefined,\n maxTokens: this.config.memory?.maxTokens || DEFAULT_MAX_TOKENS,\n temperature: DEFAULT_TEMPERATURE,\n });\n\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n let finishReason: string | null = null;\n\n const streamToolCalls = new Map<string, {\n id: string;\n name: string;\n arguments: string;\n }>();\n\n const parseStreamToolArgs = (\n rawArgs: string | Record<string, unknown>,\n ): { args: Record<string, unknown>; error?: string } => {\n try {\n const parsed = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return { args: parsed as Record<string, unknown> };\n }\n return { args: {}, error: \"Tool call arguments must be a JSON object\" };\n } catch (error) {\n return {\n args: {},\n error: error instanceof Error ? error.message : String(error),\n };\n }\n };\n\n const recordToolError = async (toolCall: ToolCall, errorStr: string) => {\n toolCall.status = \"error\";\n toolCall.error = errorStr;\n toolCalls.push(toolCall);\n\n // Send tool-output-error event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const errorTool = toolRegistry.get(toolCall.name);\n const errorIsDynamic = errorTool?.type === \"dynamic\";\n const errorData = JSON.stringify({\n type: \"tool-output-error\",\n toolCallId: toolCall.id,\n errorText: errorStr,\n ...(errorIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n\n const errorMessage: Message = {\n id: `tool_error_${toolCall.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n result: { error: errorStr },\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(errorMessage);\n await this.memory.add(errorMessage);\n };\n\n // Vercel AI SDK Data Stream Protocol event handler\n const handleEvent = (event: AgentStreamEvent) => {\n switch (event.type) {\n case \"content\": {\n accumulatedText += event.content;\n\n // Use Vercel AI SDK UI Message Stream Protocol v5 format\n const textDeltaEvent = JSON.stringify({\n type: \"text-delta\",\n id: textPartId,\n delta: event.content,\n });\n controller.enqueue(encoder.encode(`data: ${textDeltaEvent}\\n\\n`));\n\n if (callbacks?.onChunk) {\n callbacks.onChunk(event.content);\n }\n break;\n }\n\n case \"tool_call_start\":\n if (event.toolCall?.id) {\n streamToolCalls.set(event.toolCall.id, {\n id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: \"\",\n });\n\n // Send tool-input-start event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const startTool = toolRegistry.get(event.toolCall.name);\n const startIsDynamic = startTool?.type === \"dynamic\";\n const toolStartEvent = JSON.stringify({\n type: \"tool-input-start\",\n toolCallId: event.toolCall.id,\n toolName: event.toolCall.name,\n ...(startIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolStartEvent}\\n\\n`));\n }\n break;\n\n case \"tool_call_delta\":\n if (event.id && streamToolCalls.has(event.id)) {\n const tc = streamToolCalls.get(event.id)!;\n tc.arguments += event.arguments;\n\n // Send tool-input-delta event (AI SDK v5 UI Message Stream Protocol)\n const toolDeltaEvent = JSON.stringify({\n type: \"tool-input-delta\",\n toolCallId: event.id,\n inputTextDelta: event.arguments,\n });\n controller.enqueue(encoder.encode(`data: ${toolDeltaEvent}\\n\\n`));\n }\n break;\n\n case \"tool_call_complete\":\n if (event.toolCall?.id) {\n streamToolCalls.set(event.toolCall.id, {\n id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: event.toolCall.arguments,\n });\n\n // Send tool-input-available event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const completeTool = toolRegistry.get(event.toolCall.name);\n const completeIsDynamic = completeTool?.type === \"dynamic\";\n const { args } = parseStreamToolArgs(event.toolCall.arguments);\n const toolCallEvent = JSON.stringify({\n type: \"tool-input-available\",\n toolCallId: event.toolCall.id,\n toolName: event.toolCall.name,\n input: args,\n ...(completeIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolCallEvent}\\n\\n`));\n }\n break;\n\n case \"finish\":\n finishReason = event.finishReason;\n break;\n\n case \"usage\":\n if (event.usage) {\n totalUsage.promptTokens += event.usage.promptTokens || 0;\n totalUsage.completionTokens += event.usage.completionTokens || 0;\n totalUsage.totalTokens += event.usage.totalTokens || 0;\n }\n break;\n }\n };\n\n let partial = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n partial += decoder.decode(value, { stream: true });\n\n // Prevent unbounded buffer growth\n if (partial.length > MAX_STREAM_BUFFER_SIZE) {\n logger.warn(\"[AGENT] Stream buffer exceeded max size, truncating\");\n partial = partial.slice(-MAX_STREAM_BUFFER_SIZE / 2);\n }\n\n const segments = partial.split(\"\\n\");\n partial = segments.pop() ?? \"\";\n const lines = segments.filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const rawEvent = JSON.parse(line);\n const parseResult = AgentStreamEventSchema.safeParse(rawEvent);\n\n if (parseResult.success) {\n handleEvent(parseResult.data);\n } else {\n logger.warn(\"[AGENT] Invalid stream event received:\", parseResult.error);\n }\n } catch (e) {\n logger.warn(\"[AGENT] Failed to parse stream line:\", e);\n continue;\n }\n }\n }\n\n if (partial.trim()) {\n try {\n const rawEvent = JSON.parse(partial);\n const parseResult = AgentStreamEventSchema.safeParse(rawEvent);\n if (parseResult.success) {\n handleEvent(parseResult.data);\n }\n } catch {\n // Ignore trailing partial\n }\n }\n\n // Build v5 parts array\n const streamParts: MessagePart[] = [];\n if (accumulatedText) {\n streamParts.push({ type: \"text\", text: accumulatedText });\n }\n if (streamToolCalls.size > 0) {\n for (const tc of streamToolCalls.values()) {\n const { args, error } = parseStreamToolArgs(tc.arguments);\n if (error) {\n logger.warn(\"[AGENT] Failed to parse streamed tool arguments\", {\n toolCallId: tc.id,\n error,\n });\n }\n // Use AI SDK v5 tool-${toolName} pattern\n streamParts.push({\n type: `tool-${tc.name}`,\n toolCallId: tc.id,\n toolName: tc.name,\n args,\n });\n }\n }\n\n const assistantMessage: Message = {\n id: `msg_${Date.now()}_${step}`,\n role: \"assistant\",\n parts: streamParts,\n timestamp: Date.now(),\n };\n\n currentMessages.push(assistantMessage);\n await this.memory.add(assistantMessage);\n\n if (finishReason === \"tool_calls\" && streamToolCalls.size > 0) {\n this.status = \"tool_execution\";\n\n for (const tc of streamToolCalls.values()) {\n const { args, error: argError } = parseStreamToolArgs(tc.arguments);\n const toolCall: ToolCall = {\n id: tc.id,\n name: tc.name,\n args,\n status: \"pending\",\n };\n\n if (argError) {\n logger.warn(\"[AGENT] Invalid streamed tool arguments\", {\n toolCallId: tc.id,\n error: argError,\n });\n // Send tool-input-error event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const inputErrorTool = toolRegistry.get(tc.name);\n const inputErrorIsDynamic = inputErrorTool?.type === \"dynamic\";\n const inputErrorEvent = JSON.stringify({\n type: \"tool-input-error\",\n toolCallId: tc.id,\n errorText: `Invalid tool arguments: ${argError}`,\n ...(inputErrorIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${inputErrorEvent}\\n\\n`));\n await recordToolError(toolCall, `Invalid tool arguments: ${argError}`);\n continue;\n }\n\n try {\n toolCall.status = \"executing\";\n const startTime = Date.now();\n\n if (callbacks?.onToolCall) {\n callbacks.onToolCall(toolCall);\n }\n\n // Note: tool-input-available was already sent during streaming\n // Proceed directly to tool execution\n\n const result = await executeTool(tc.name, toolCall.args, {\n agentId: this.id,\n ...toolContext,\n });\n\n toolCall.status = \"completed\";\n toolCall.result = result;\n toolCall.executionTime = Date.now() - startTime;\n toolCalls.push(toolCall);\n\n // Send tool-output-available event (AI SDK v5 UI Message Stream Protocol)\n // Check if this is a dynamic tool\n const outputTool = toolRegistry.get(tc.name);\n const outputIsDynamic = outputTool?.type === \"dynamic\";\n const toolResultEvent = JSON.stringify({\n type: \"tool-output-available\",\n toolCallId: toolCall.id,\n output: result,\n ...(outputIsDynamic && { dynamic: true }),\n });\n controller.enqueue(encoder.encode(`data: ${toolResultEvent}\\n\\n`));\n\n const toolResultMessage: Message = {\n id: `tool_${tc.id}`,\n role: \"tool\",\n parts: [{\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result,\n }],\n timestamp: Date.now(),\n };\n currentMessages.push(toolResultMessage);\n await this.memory.add(toolResultMessage);\n } catch (error) {\n const errorStr = error instanceof Error ? error.message : String(error);\n await recordToolError(toolCall, errorStr);\n }\n }\n\n // Send finish-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const finishStepToolsEvent = JSON.stringify({ type: \"finish-step\" });\n controller.enqueue(encoder.encode(`data: ${finishStepToolsEvent}\\n\\n`));\n\n this.status = \"thinking\";\n continue;\n }\n\n // Send finish-step event (Veryfront extension, not part of standard AI SDK v5 protocol)\n const finishStepEvent = JSON.stringify({ type: \"finish-step\" });\n controller.enqueue(encoder.encode(`data: ${finishStepEvent}\\n\\n`));\n\n break;\n }\n\n const lastMessage = currentMessages[currentMessages.length - 1];\n return {\n text: lastMessage ? getTextFromParts(lastMessage.parts) : \"\",\n messages: currentMessages,\n toolCalls,\n status: \"completed\",\n usage: totalUsage,\n };\n }\n\n /**\n * Execute middleware chain\n */\n private executeMiddleware(\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> {\n const middleware = this.config.middleware || [];\n\n if (middleware.length === 0) {\n return next();\n }\n\n let index = 0;\n const dispatch = (): Promise<AgentResponse> => {\n if (index >= middleware.length) {\n return next();\n }\n\n const currentMiddleware = middleware[index++];\n if (!currentMiddleware) {\n return next();\n }\n return currentMiddleware(context, dispatch);\n };\n\n return dispatch();\n }\n\n private getAvailableTools(): ToolDefinition[] {\n if (!this.config.tools) {\n return [];\n }\n\n const tools: ToolDefinition[] = [];\n\n // When tools === true, load ALL tools from the registry\n if (this.config.tools === true) {\n const allTools = toolRegistry.getAll();\n logger.debug(`[AGENT] Loading all ${allTools.size} tools from registry`);\n for (const [name, tool] of allTools) {\n const def = toolToProviderDefinition(tool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n return tools;\n }\n\n // Otherwise, load specific tools from the config\n for (const [name, entry] of Object.entries(this.config.tools)) {\n if (entry === true) {\n const tool = toolRegistry.get(name);\n if (tool) {\n const def = toolToProviderDefinition(tool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n continue;\n }\n\n if (entry && typeof entry === \"object\") {\n const inlineTool = entry.id === name ? entry : { ...entry, id: name };\n const def = toolToProviderDefinition(inlineTool);\n logger.debug(`[AGENT] Tool definition for \"${name}\":`, JSON.stringify(def, null, 2));\n tools.push(def);\n }\n }\n\n return tools;\n }\n\n /**\n * Resolve system prompt (handle string or function)\n */\n private async resolveSystemPrompt(): Promise<string> {\n const system = this.config.system;\n\n if (typeof system === \"string\") {\n return system;\n }\n\n if (typeof system === \"function\") {\n return await system();\n }\n\n return \"You are a helpful AI assistant.\";\n }\n\n /**\n * Normalize input to messages array (v5 format with parts)\n */\n private normalizeInput(input: string | Message[]): Message[] {\n if (typeof input === \"string\") {\n return [\n {\n id: `msg_${Date.now()}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input }],\n timestamp: Date.now(),\n },\n ];\n }\n\n return input.map((msg) => ({\n ...msg,\n id: msg.id || `msg_${Date.now()}`,\n timestamp: msg.timestamp || Date.now(),\n }));\n }\n\n /**\n * Get max steps considering edge config and platform limits\n */\n private getMaxSteps(platformLimit: number): number {\n // Edge config takes precedence\n if (this.config.edge?.enabled && this.config.edge.maxSteps) {\n return Math.min(this.config.edge.maxSteps, platformLimit);\n }\n\n // Use agent config\n if (this.config.maxSteps) {\n return Math.min(this.config.maxSteps, platformLimit);\n }\n\n // Default\n return Math.min(20, platformLimit);\n }\n\n /**\n * Get memory instance (for advanced use cases)\n */\n getMemory(): Memory {\n return this.memory;\n }\n\n /**\n * Get memory stats\n */\n async getMemoryStats() {\n return await this.memory.getStats();\n }\n\n /**\n * Clear agent memory\n */\n async clearMemory(): Promise<void> {\n await this.memory.clear();\n }\n}\n", "/**\n * Agent factory\n */\n\nimport type { Agent, AgentConfig, AgentResponse, Message, ToolCall } from \"../types/agent.ts\";\nimport { AgentRuntime } from \"./runtime.ts\";\nimport { detectPlatform, validatePlatformCompatibility } from \"../runtime/platform.ts\";\nimport { registerTool } from \"../mcp/registry.ts\";\nimport { agentRegistry } from \"./composition.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Result object returned by agent.stream()\n * Provides toDataStreamResponse() for Vercel AI SDK compatible streaming\n */\nexport interface AgentStreamResult {\n /**\n * Convert the stream to a Response object for streaming responses\n * Compatible with Vercel AI SDK's toDataStreamResponse()\n */\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response;\n}\n\n/**\n * Create an AgentStreamResult from a ReadableStream\n * Returns Vercel AI SDK compatible streaming response\n */\nfunction createAgentStreamResult(stream: ReadableStream): AgentStreamResult {\n return {\n toDataStreamResponse(options?: {\n headers?: Record<string, string>;\n status?: number;\n statusText?: string;\n }): Response {\n return new Response(stream, {\n status: options?.status ?? 200,\n statusText: options?.statusText,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n // Required header for Vercel AI SDK Data Stream Protocol v1\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n ...options?.headers,\n },\n });\n },\n };\n}\n\n/**\n * Create an agent\n *\n * @example\n * ```typescript\n * import { agent } from 'veryfront/ai';\n\n *\n * export default agent({\n * model: 'openai/gpt-4',\n * system: 'You are a helpful assistant',\n * tools: {\n * searchWeb: true,\n * },\n * });\n * ```\n */\nexport function agent(config: AgentConfig): Agent {\n const id = config.id || generateAgentId();\n\n // Register tools if config.tools is a Record (not `true` for all tools)\n if (config.tools && config.tools !== true) {\n for (const [name, entry] of Object.entries(config.tools)) {\n if (entry && typeof entry === \"object\") {\n const normalizedTool = entry.id === name ? entry : { ...entry, id: name };\n registerTool(normalizedTool.id, normalizedTool);\n config.tools[name] = normalizedTool;\n }\n }\n }\n\n const platform = detectPlatform();\n const compatibility = validatePlatformCompatibility({\n maxSteps: config.maxSteps,\n streaming: config.streaming,\n requiresFileSystem: false,\n requiresMCP: false,\n }, platform);\n\n if (!compatibility.compatible) {\n throw toError(createError({\n type: \"agent\",\n message: `Agent \"${id}\" is not compatible with current platform:\\n${\n compatibility.errors.join(\"\\n\")\n }`,\n }));\n }\n\n if (compatibility.warnings.length > 0) {\n agentLogger.warn(\n `Agent \"${id}\" warnings:\\n${compatibility.warnings.join(\"\\n\")}`,\n );\n }\n\n const runtime = new AgentRuntime(id, config);\n\n const agentInstance: Agent = {\n id,\n config,\n\n generate(input: {\n input: string | Message[];\n context?: Record<string, unknown>;\n }): Promise<AgentResponse> {\n return runtime.generate(input.input, input.context);\n },\n\n async stream(input: {\n input?: string;\n messages?: Message[];\n context?: Record<string, unknown>;\n onToolCall?: (toolCall: ToolCall) => void;\n onChunk?: (chunk: string) => void;\n }): Promise<AgentStreamResult> {\n const inputMessages: Message[] = input.input\n ? [{\n id: `msg_${Date.now()}`,\n role: \"user\" as const,\n parts: [{ type: \"text\", text: input.input }],\n }]\n : input.messages || [];\n\n const stream = await runtime.stream(inputMessages, input.context, {\n onToolCall: input.onToolCall,\n onChunk: input.onChunk,\n });\n\n return createAgentStreamResult(stream);\n },\n\n async respond(request: Request): Promise<Response> {\n const body = await request.json();\n const messages = body.messages || [];\n const stream = await runtime.stream(messages, body.context);\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n // Required header for Vercel AI SDK Data Stream Protocol v1\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n },\n });\n },\n\n getMemory() {\n return runtime.getMemory();\n },\n\n getMemoryStats() {\n return runtime.getMemoryStats();\n },\n\n clearMemory() {\n return runtime.clearMemory();\n },\n };\n\n agentRegistry.register(id, agentInstance);\n\n return agentInstance;\n}\n\n/**\n * Generate a unique agent ID\n */\nlet agentIdCounter = 0;\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${agentIdCounter++}`;\n}\n", "/**\n * Veryfront AI Module\n *\n * This is the 16th module of Veryfront, providing AI-native capabilities:\n * - Agent runtime with tool execution\n * - MCP (Model Context Protocol) server integration\n * - Provider integrations (OpenAI, Anthropic, etc.)\n * - Multi-runtime support (Deno, Node.js, Bun, Cloudflare Workers)\n *\n * @module veryfront/ai\n * @example\n * ```typescript\n * // Create an agent\n * import { agent, tool } from 'veryfront/ai';\n * import { z } from 'zod';\n *\n * // Define a tool\n * export const searchTool = tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * return await searchWeb(query);\n * },\n * });\n *\n * // Define an agent\n * export const myAgent = agent({\n * model: 'openai/gpt-4',\n * system: 'You are a helpful assistant',\n * tools: {\n * searchWeb: searchTool,\n * },\n * });\n *\n * // Use the agent\n * const response = await myAgent.generate({\n * input: 'What is the weather today?',\n * });\n * ```\n */\n\n// ============================================================================\n// Public API - Factory Functions\n// ============================================================================\n\n/**\n * Create an agent\n */\nexport { agent } from \"./agent/factory.ts\";\n\n/**\n * Create a tool\n */\nexport { dynamicTool, tool } from \"./utils/tool.ts\";\n\nexport type { DynamicToolConfig } from \"./utils/tool.ts\";\n\n/**\n * Re-export zod for schema definitions\n * This allows users to import z from 'veryfront/ai' without needing separate zod import\n * which ensures compatibility across Deno, Node.js, and other runtimes\n */\nexport { z } from \"zod\";\n\n/**\n * Create an MCP resource\n */\nexport { resource } from \"./mcp/resource.ts\";\n\n/**\n * Create an MCP prompt template\n */\nexport { prompt } from \"./mcp/prompt.ts\";\n\n// ============================================================================\n// Public API - Provider Management\n// ============================================================================\n\nexport { getProvider, getProviderFromModel, initializeProviders } from \"./providers/factory.ts\";\n\n// ============================================================================\n// Public API - Platform Detection\n// ============================================================================\n\nexport {\n detectPlatform,\n getPlatformCapabilities,\n getPlatformWarnings,\n supportsCapability,\n validatePlatformCompatibility,\n} from \"./runtime/platform.ts\";\n\n// ============================================================================\n// Public API - Registries\n// ============================================================================\n\nexport {\n getMCPRegistry,\n getMCPStats,\n registerPrompt,\n registerResource,\n registerTool,\n} from \"./mcp/registry.ts\";\n\nexport { toolRegistry } from \"./utils/tool.ts\";\nexport { resourceRegistry } from \"./mcp/resource.ts\";\nexport { promptRegistry } from \"./mcp/prompt.ts\";\nexport { agentRegistry, getAgent, getAllAgentIds, registerAgent } from \"./agent/composition.ts\";\n\n// ============================================================================\n// Public API - Agent Composition\n// ============================================================================\n\nexport { agentAsTool, createWorkflow, getAgentsAsTools } from \"./agent/composition.ts\";\n\nexport type { WorkflowConfig, WorkflowResult, WorkflowStep } from \"./agent/composition.ts\";\n\n// ============================================================================\n// Public API - Memory\n// ============================================================================\n\nexport { BufferMemory, ConversationMemory, createMemory, SummaryMemory } from \"./agent/memory.ts\";\n\nexport type { Memory, MemoryPersistence, MemoryStats } from \"./agent/memory.ts\";\n\n// ============================================================================\n// Public API - Auto-Discovery & Setup\n// ============================================================================\n\nexport { discoverAll } from \"./utils/discovery.ts\";\nexport type { DiscoveryConfig, DiscoveryResult } from \"./utils/discovery.ts\";\n\nexport { setupAI, type SetupAIOptions, type SetupAIResult } from \"./utils/setup.ts\";\n\n// ============================================================================\n// Public API - MCP Server\n// ============================================================================\n\nexport { createMCPServer, MCPServer } from \"./mcp/server.ts\";\n\n// ============================================================================\n// Public API - AI SDK Integration (Recommended)\n// ============================================================================\n\n// Client-only exports (useChat, useCompletion, etc.) are now available at:\n// import { useChat, useCompletion } from \"veryfront/ai/client\";\n// This prevents server-side bundling issues\n\n// Re-export AI SDK core functions\n// - Text generation: generateText, streamText\n// - Structured data: generateObject, streamObject\n// - Message conversion: convertToModelMessages\n// - Embeddings: embed, embedMany\n// - Utilities: createIdGenerator, smoothStream, cosineSimilarity\n// - Tool helper: aiTool (renamed from 'tool' to avoid conflict with veryfront's tool)\n// - Experimental: experimental_generateImage, experimental_generateSpeech, experimental_transcribe\nexport {\n convertToModelMessages,\n cosineSimilarity,\n createIdGenerator,\n embed,\n embedMany,\n experimental_generateImage,\n experimental_generateSpeech,\n experimental_transcribe,\n generateObject,\n generateText,\n smoothStream,\n streamObject,\n streamText,\n tool as aiTool,\n} from \"ai\";\n\n// Re-export AI SDK providers (30+ providers available)\nexport { openai } from \"@ai-sdk/openai\";\nexport { anthropic } from \"@ai-sdk/anthropic\";\n\n// AI SDK adapter utilities\nexport {\n aiSDKModel,\n isAISDKModel,\n toAISDKTool,\n toAISDKTools,\n useAISDK,\n} from \"./adapters/ai-sdk.ts\";\n\n// ============================================================================\n// Public API - Custom Providers (Advanced - For Special Cases)\n// ============================================================================\n\n// For users who want to implement custom providers:\n// - Internal/proprietary APIs\n// - OpenAI-compatible endpoints (Ollama, vLLM)\n// - Custom authentication flows\n// - Educational purposes\n\nexport { BaseProvider } from \"./providers/base.ts\";\nexport { OpenAIProvider } from \"./providers/openai.ts\";\nexport { AnthropicProvider } from \"./providers/anthropic.ts\";\nexport { GoogleProvider } from \"./providers/google.ts\";\n\n// ============================================================================\n// Public API - Production Features\n// ============================================================================\n\nexport {\n cacheMiddleware,\n COMMON_BLOCKED_PATTERNS,\n costTrackingMiddleware,\n // Caching\n createCache,\n // Cost tracking\n createCostTracker,\n // Rate limiting\n createRateLimiter,\n InputValidator,\n OutputFilter,\n rateLimitMiddleware,\n // Security\n securityMiddleware,\n} from \"./production/index.ts\";\n\nexport type {\n CacheConfig,\n CacheEntry,\n CostConfig,\n RateLimitConfig,\n RateLimitResult,\n SecurityConfig,\n SecurityViolation,\n UsageRecord,\n UsageSummary,\n} from \"./production/index.ts\";\n\n// ============================================================================\n// Public API - Durable Workflows\n// ============================================================================\n\n// Re-export workflow module\n// Full workflow API available at: import { ... } from \"veryfront/ai/workflow\";\nexport {\n branch,\n createWorkflowClient,\n // Backend\n MemoryBackend,\n parallel,\n step,\n waitForApproval,\n // DSL builders\n workflow,\n // Client\n WorkflowClient,\n} from \"./workflow/index.ts\";\n\nexport type {\n Checkpoint,\n PendingApproval,\n // Backend\n WorkflowBackend,\n // Client\n WorkflowClientConfig,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowHandle,\n WorkflowNode,\n WorkflowRun,\n // Core types\n WorkflowStatus,\n} from \"./workflow/index.ts\";\n\n// ============================================================================\n// Public API - Types\n// ============================================================================\n\nexport type {\n // Agent types\n Agent,\n AgentConfig,\n AgentContext,\n AgentMiddleware,\n AgentResponse,\n AgentStatus,\n AnthropicConfig,\n CompletionRequest,\n CompletionResponse,\n EdgeConfig,\n GoogleConfig,\n MCPRegistry,\n MCPServerConfig,\n MemoryConfig,\n Message,\n ModelProvider,\n ModelString,\n OpenAIConfig,\n // Platform types\n Platform,\n PlatformCapabilities,\n Prompt,\n PromptConfig,\n // Provider types\n Provider,\n ProviderConfig,\n ProvidersConfig,\n // MCP types\n Resource,\n ResourceConfig,\n // Tool types\n Tool,\n ToolCall,\n ToolConfig,\n ToolExecutionContext,\n ToolType,\n} from \"./types/index.ts\";\n", "import type { Tool } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"../utils/zod-json-schema.ts\";\n\nconst MODEL_BRAND = \"ai-sdk-model\";\n\nexport interface AISDKModelWrapper<Model = unknown> {\n __type: typeof MODEL_BRAND;\n model: Model;\n}\n\nexport function aiSDKModel<Model = unknown>(model: Model): AISDKModelWrapper<Model> {\n return { __type: MODEL_BRAND, model };\n}\n\nexport function isAISDKModel(value: unknown): value is AISDKModelWrapper {\n return Boolean(\n value && typeof value === \"object\" && (value as AISDKModelWrapper).__type === MODEL_BRAND,\n );\n}\n\nexport const useAISDK = aiSDKModel;\n\n/**\n * Get JSON Schema from a tool, preferring pre-converted schema if available\n */\nfunction getToolSchema(tool: Tool): JsonSchema {\n // Use pre-converted JSON Schema if available (set during tool() creation)\n // This is the preferred path - no zod schema needed at runtime\n if (tool.inputSchemaJson) {\n return tool.inputSchemaJson;\n }\n\n // Runtime conversion - may fail if zod schema is not properly initialized\n // This can happen when the user's zod instance differs from the bundled one\n try {\n if (tool.inputSchema && typeof tool.inputSchema === \"object\") {\n // Check for zod schema markers\n const schema = tool.inputSchema as { _def?: { typeName?: string } };\n if (schema._def && schema._def.typeName) {\n return zodToJsonSchema(tool.inputSchema);\n }\n }\n } catch {\n // Schema conversion failed - fall through to fallback\n }\n\n // Fallback: empty object schema\n return { type: \"object\", properties: {} };\n}\n\nexport function toAISDKTool(tool: Tool) {\n return {\n type: \"function\" as const,\n function: {\n name: tool.id,\n description: tool.description,\n parameters: getToolSchema(tool),\n },\n };\n}\n\nexport function toAISDKTools(tools: Record<string, Tool>) {\n const aiTools: Record<\n string,\n { description: string; parameters: JsonSchema; execute: Tool[\"execute\"] }\n > = {};\n\n for (const [name, tool] of Object.entries(tools)) {\n aiTools[name] = {\n description: tool.description,\n parameters: getToolSchema(tool),\n execute: tool.execute,\n };\n }\n\n return aiTools;\n}\n\nexport const AI_SDK_ADAPTER_VERSION = \"1.0.0\";\nexport const AI_SDK_SUPPORTED_VERSION = \"3.x\";\n", "import type { Tool } from \"../types/tool.ts\";\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { discoverAll, type DiscoveryConfig } from \"./discovery.ts\";\nimport { toolRegistry } from \"./tool.ts\";\nimport { registerAgent } from \"../agent/composition.ts\";\nimport { registerResource } from \"../mcp/registry.ts\";\nimport { registerPrompt } from \"../mcp/registry.ts\";\nimport { toAISDKTools } from \"../adapters/ai-sdk.ts\";\nimport { cwd } from \"../../platform/compat/process.ts\";\nimport { createFileSystem } from \"../../platform/compat/fs.ts\";\nimport { cliLogger as logger } from \"@veryfront/utils\";\n\nconst fs = createFileSystem();\n\nexport interface SetupAIOptions {\n /**\n * Base directory for AI discovery.\n * @default process.cwd() or Deno.cwd()\n */\n baseDir?: string;\n\n /**\n * Path to AI manifest file (for pre-built discovery).\n * If provided, skips filesystem scanning.\n */\n manifestPath?: string;\n\n /**\n * AI directory name (relative to baseDir).\n * @default \"ai\"\n */\n aiDir?: string;\n\n /**\n * Manually register tools instead of discovery.\n */\n tools?: Record<string, Tool>;\n\n /**\n * Manually register agents instead of discovery.\n */\n agents?: Record<string, Agent>;\n\n /**\n * Manually register resources instead of discovery.\n */\n resources?: Record<string, Resource>;\n\n /**\n * Manually register prompts instead of discovery.\n */\n prompts?: Record<string, Prompt>;\n\n /**\n * Enable verbose logging during setup.\n * @default false\n */\n verbose?: boolean;\n\n /**\n * Skip filesystem discovery entirely (use only manual registrations).\n * @default false\n */\n skipDiscovery?: boolean;\n}\n\nexport interface SetupAIResult {\n /**\n * All registered tools\n */\n tools: Map<string, Tool>;\n\n /**\n * All registered agents\n */\n agents: Map<string, Agent>;\n\n /**\n * All registered resources\n */\n resources: Map<string, Resource>;\n\n /**\n * All registered prompts\n */\n prompts: Map<string, Prompt>;\n\n /**\n * Get a specific tool by ID\n */\n getTool(id: string): Tool | undefined;\n\n /**\n * Get a specific agent by ID\n */\n getAgent(id: string): Agent | undefined;\n\n /**\n * Get all tools as an array\n */\n getTools(): Tool[];\n\n /**\n * Get all agents as an array\n */\n getAgents(): Agent[];\n\n /**\n * Convert all tools to AI SDK format\n * Use with generateText(), streamText(), etc.\n */\n toAISDKTools(): ReturnType<typeof toAISDKTools>;\n\n /**\n * Any errors encountered during discovery\n */\n errors: Array<{ file: string; error: Error }>;\n}\n\n/**\n * Set up AI with zero configuration.\n *\n * This function:\n * 1. Detects the runtime (Deno, Node.js, Bun)\n * 2. Discovers AI components from the filesystem or manifest\n * 3. Registers all discovered tools, agents, resources, and prompts\n * 4. Returns an easy-to-use API for accessing them\n *\n * @example\n * ```typescript\n * // Simplest usage - zero config\n * const ai = await setupAI();\n *\n * // With custom options\n * const ai = await setupAI({\n * baseDir: \"./my-project\",\n * aiDir: \"src/ai\",\n * verbose: true,\n * });\n *\n * // With manual tool registration (no filesystem discovery)\n * const ai = await setupAI({\n * skipDiscovery: true,\n * tools: {\n * searchWeb: mySearchTool,\n * sendEmail: myEmailTool,\n * },\n * });\n * ```\n */\nexport async function setupAI(options: SetupAIOptions = {}): Promise<SetupAIResult> {\n const {\n baseDir = cwd(),\n aiDir = \"ai\",\n tools: manualTools = {},\n agents: manualAgents = {},\n resources: manualResources = {},\n prompts: manualPrompts = {},\n verbose = false,\n skipDiscovery = false,\n manifestPath,\n } = options;\n\n // Result containers\n const tools = new Map<string, Tool>();\n const agents = new Map<string, Agent>();\n const resources = new Map<string, Resource>();\n const prompts = new Map<string, Prompt>();\n const errors: Array<{ file: string; error: Error }> = [];\n\n // Step 1: Load from manifest if provided\n if (manifestPath) {\n try {\n const manifest = await fs.readTextFile(manifestPath).then(JSON.parse);\n if (manifest.tools) {\n for (const [id, tool] of Object.entries(manifest.tools)) {\n tools.set(id, tool as Tool);\n toolRegistry.register(id, tool as Tool);\n }\n }\n if (manifest.agents) {\n for (const [id, agent] of Object.entries(manifest.agents)) {\n agents.set(id, agent as Agent);\n registerAgent(id, agent as Agent);\n }\n }\n if (manifest.resources) {\n for (const [id, resource] of Object.entries(manifest.resources)) {\n resources.set(id, resource as Resource);\n registerResource(id, resource as Resource);\n }\n }\n if (manifest.prompts) {\n for (const [id, prompt] of Object.entries(manifest.prompts)) {\n prompts.set(id, prompt as Prompt);\n registerPrompt(id, prompt as Prompt);\n }\n }\n if (verbose) {\n logger.info(`[setupAI] Loaded manifest: ${tools.size} tools, ${agents.size} agents`);\n }\n } catch (error) {\n errors.push({\n file: manifestPath,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n // Step 2: Discover from filesystem (unless skipped)\n if (!skipDiscovery && !manifestPath) {\n const discoveryConfig: DiscoveryConfig = {\n baseDir,\n aiDir,\n verbose,\n };\n\n try {\n const discovered = await discoverAll(discoveryConfig);\n\n // Merge discovered items\n for (const [id, tool] of discovered.tools) {\n tools.set(id, tool);\n }\n for (const [id, agent] of discovered.agents) {\n agents.set(id, agent);\n }\n for (const [id, resource] of discovered.resources) {\n resources.set(id, resource);\n }\n for (const [id, prompt] of discovered.prompts) {\n prompts.set(id, prompt);\n }\n errors.push(...discovered.errors);\n\n if (verbose) {\n logger.info(`[setupAI] Discovered: ${tools.size} tools, ${agents.size} agents`);\n }\n } catch (error) {\n // Discovery failed - might be expected if no ai/ directory\n if (verbose) {\n logger.info(`[setupAI] Discovery skipped: ${error}`);\n }\n }\n }\n\n // Step 3: Register manual items (override discovered ones)\n for (const [id, tool] of Object.entries(manualTools)) {\n tools.set(id, tool);\n toolRegistry.register(id, tool);\n }\n for (const [id, agent] of Object.entries(manualAgents)) {\n agents.set(id, agent);\n registerAgent(id, agent);\n }\n for (const [id, resource] of Object.entries(manualResources)) {\n resources.set(id, resource);\n registerResource(id, resource);\n }\n for (const [id, prompt] of Object.entries(manualPrompts)) {\n prompts.set(id, prompt);\n registerPrompt(id, prompt);\n }\n\n // Create the result object with helper methods\n const result: SetupAIResult = {\n tools,\n agents,\n resources,\n prompts,\n errors,\n\n getTool(id: string) {\n return tools.get(id);\n },\n\n getAgent(id: string) {\n return agents.get(id);\n },\n\n getTools() {\n return Array.from(tools.values());\n },\n\n getAgents() {\n return Array.from(agents.values());\n },\n\n toAISDKTools() {\n // Convert Map to Record for toAISDKTools\n const toolsRecord: Record<string, Tool> = {};\n for (const [id, tool] of tools) {\n toolsRecord[id] = tool;\n }\n return toAISDKTools(toolsRecord);\n },\n };\n\n return result;\n}\n", "/**\n * MCP Server Implementation\n *\n * Implements the Model Context Protocol (MCP) specification\n * Exposes tools, resources, and prompts via JSON-RPC 2.0\n */\n\nimport { getMCPRegistry } from \"./registry.ts\";\nimport { executeTool, zodToJsonSchema } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\nimport type { MCPServerConfig } from \"../types/mcp.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * JSON-RPC 2.0 Params type\n */\ntype JSONRPCParams = Record<string, unknown> | unknown[];\n\n/**\n * JSON-RPC 2.0 Request\n */\ninterface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: JSONRPCParams;\n}\n\n/**\n * JSON-RPC 2.0 Response\n */\ninterface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id?: string | number;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/**\n * MCP Server\n */\nexport class MCPServer {\n private config: MCPServerConfig;\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n }\n\n /**\n * Handle JSON-RPC request\n */\n async handleRequest(request: JSONRPCRequest): Promise<JSONRPCResponse> {\n try {\n const result = await this.dispatch(request.method, request.params);\n\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n } catch (error) {\n return {\n jsonrpc: \"2.0\",\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n /**\n * Dispatch request to appropriate handler\n */\n private dispatch(method: string, params: JSONRPCParams | undefined): Promise<unknown> {\n switch (method) {\n // Tool methods\n case \"tools/list\":\n return this.listTools();\n\n case \"tools/call\":\n return this.callTool(params);\n\n // Resource methods\n case \"resources/list\":\n return this.listResources();\n\n case \"resources/read\":\n return this.readResource(params);\n\n // Prompt methods\n case \"prompts/list\":\n return this.listPrompts();\n\n case \"prompts/get\":\n return this.getPrompt(params);\n\n // Server info\n case \"initialize\":\n return this.initialize(params);\n\n default:\n throw toError(createError({\n type: \"agent\",\n message: `Unknown method: ${method}`,\n }));\n }\n }\n\n /**\n * Initialize connection\n */\n private initialize(_params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n return Promise.resolve({\n protocolVersion: \"2024-11-05\",\n serverInfo: {\n name: \"veryfront-mcp\",\n version: \"0.1.0\",\n },\n capabilities: {\n tools: {},\n resources: { subscribe: true },\n prompts: {},\n },\n });\n }\n\n /**\n * List all available tools\n */\n private listTools(): Promise<{ tools: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const tools: Array<Record<string, unknown>> = [];\n\n for (const [id, tool] of registry.tools.entries()) {\n // Only expose tools with MCP enabled\n if (tool.mcp?.enabled !== false) {\n // Use pre-converted schema or convert at runtime\n const inputSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n tools.push({\n name: id,\n description: tool.description,\n inputSchema,\n });\n }\n }\n\n return Promise.resolve({ tools });\n }\n\n /**\n * Call a tool\n */\n private async callTool(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { name, arguments: args } = paramsObj || {};\n\n if (!name) {\n throw toError(createError({\n type: \"agent\",\n message: \"Tool name is required\",\n }));\n }\n\n const result = await executeTool(name as string, args);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n\n /**\n * List all available resources\n */\n private listResources(): Promise<{ resources: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const resources: Array<Record<string, unknown>> = [];\n\n for (const [id, resource] of registry.resources.entries()) {\n resources.push({\n uri: resource.pattern,\n name: id,\n description: resource.description,\n mimeType: \"application/json\",\n });\n }\n\n return Promise.resolve({ resources });\n }\n\n /**\n * Read a resource\n */\n private async readResource(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { uri } = paramsObj || {};\n\n if (!uri) {\n throw toError(createError({\n type: \"agent\",\n message: \"Resource URI is required\",\n }));\n }\n\n const resource = resourceRegistry.findByPattern(uri as string);\n\n if (!resource) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource not found: ${uri}`,\n }));\n }\n\n // Extract params from URI\n const resourceParams = resourceRegistry.extractParams(uri as string, resource.pattern);\n\n // Load resource data\n const data = await resource.load(resourceParams);\n\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n /**\n * List all available prompts\n */\n private listPrompts(): Promise<{ prompts: Array<Record<string, unknown>> }> {\n const registry = getMCPRegistry();\n const prompts: Array<Record<string, unknown>> = [];\n\n for (const [id, promptInstance] of registry.prompts.entries()) {\n prompts.push({\n name: id,\n description: promptInstance.description,\n });\n }\n\n return Promise.resolve({ prompts });\n }\n\n /**\n * Get a prompt\n */\n private async getPrompt(params: JSONRPCParams | undefined): Promise<Record<string, unknown>> {\n const paramsObj = params as Record<string, unknown> | undefined;\n const { name, arguments: args } = paramsObj || {};\n\n if (!name) {\n throw toError(createError({\n type: \"agent\",\n message: \"Prompt name is required\",\n }));\n }\n\n const content = await promptRegistry.getContent(\n name as string,\n args as Record<string, unknown> | undefined,\n );\n\n return {\n description: `Prompt: ${name}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: content,\n },\n },\n ],\n };\n }\n\n /**\n * Create HTTP handler for MCP server\n */\n createHTTPHandler(): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n // Handle CORS\n if (request.method === \"OPTIONS\") {\n return this.handleCORS();\n }\n\n // Validate auth\n if (this.config.auth && this.config.auth.type !== \"none\") {\n const authorized = await this.validateAuth(request);\n if (!authorized) {\n return new Response(\"Unauthorized\", { status: 401 });\n }\n }\n\n // Parse JSON-RPC request\n try {\n const rpcRequest: JSONRPCRequest = await request.json();\n const rpcResponse = await this.handleRequest(rpcRequest);\n\n return new Response(JSON.stringify(rpcResponse), {\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.getCORSHeaders(),\n },\n });\n } catch {\n return new Response(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32700,\n message: \"Parse error\",\n },\n }),\n {\n status: 400,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n }\n };\n }\n\n /**\n * Validate authentication\n */\n private async validateAuth(request: Request): Promise<boolean> {\n if (!this.config.auth || this.config.auth.type === \"none\") {\n return true;\n }\n\n const authHeader = request.headers.get(\"Authorization\");\n\n if (!authHeader) {\n return false;\n }\n\n if (this.config.auth.type === \"bearer\") {\n const token = authHeader.replace(\"Bearer \", \"\");\n\n if (this.config.auth.validate) {\n return await this.config.auth.validate(token);\n }\n\n return false;\n }\n\n return false;\n }\n\n /**\n * Handle CORS preflight\n */\n private handleCORS(): Response {\n return new Response(null, {\n status: 204,\n headers: this.getCORSHeaders(),\n });\n }\n\n /**\n * Get CORS headers\n */\n private getCORSHeaders(): Record<string, string> {\n if (!this.config.cors?.enabled) {\n return {};\n }\n\n const origins = this.config.cors.origins || [\"*\"];\n\n return {\n \"Access-Control-Allow-Origin\": origins[0] || \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n };\n }\n}\n\n/**\n * Create an MCP server instance\n */\nexport function createMCPServer(config: MCPServerConfig): MCPServer {\n return new MCPServer(config);\n}\n", "import { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Rate Limiting System\n *\n * Prevents abuse and ensures fair usage of AI resources.\n * Supports multiple strategies: fixed window, sliding window, token bucket.\n */\n\nexport interface RateLimitConfig {\n /** Strategy type */\n strategy: \"fixed-window\" | \"sliding-window\" | \"token-bucket\";\n\n /** Maximum requests */\n maxRequests: number;\n\n /** Time window in milliseconds */\n windowMs: number;\n\n /** Identifier function (e.g., user ID, IP address) */\n identify?: (context: Record<string, unknown>) => string;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface RateLimitResult {\n /** Allowed or not */\n allowed: boolean;\n\n /** Requests remaining */\n remaining: number;\n\n /** Reset time (timestamp) */\n resetAt: number;\n\n /** Retry after (seconds) */\n retryAfter?: number;\n}\n\n/**\n * Fixed Window Rate Limiter\n */\nclass FixedWindowLimiter {\n private requests = new Map<string, { count: number; resetAt: number }>();\n private config: RateLimitConfig;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n const entry = this.requests.get(identifier);\n\n // No previous requests or window expired\n if (!entry || now >= entry.resetAt) {\n const resetAt = now + this.config.windowMs;\n\n this.requests.set(identifier, {\n count: 1,\n resetAt,\n });\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - 1,\n resetAt,\n };\n }\n\n // Within window\n if (entry.count < this.config.maxRequests) {\n entry.count++;\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - entry.count,\n resetAt: entry.resetAt,\n };\n }\n\n // Limit exceeded\n return {\n allowed: false,\n remaining: 0,\n resetAt: entry.resetAt,\n retryAfter: Math.ceil((entry.resetAt - now) / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.requests.delete(identifier);\n }\n\n clear(): void {\n this.requests.clear();\n }\n}\n\n/**\n * Token Bucket Rate Limiter (more flexible)\n */\nclass TokenBucketLimiter {\n private buckets = new Map<\n string,\n { tokens: number; lastRefill: number }\n >();\n private config: RateLimitConfig;\n private refillRate: number;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n // Refill rate: tokens per millisecond\n this.refillRate = config.maxRequests / config.windowMs;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n\n // Initialize bucket if not exists\n if (!bucket) {\n bucket = {\n tokens: this.config.maxRequests - 1,\n lastRefill: now,\n };\n this.buckets.set(identifier, bucket);\n\n return {\n allowed: true,\n remaining: bucket.tokens,\n resetAt: now + this.config.windowMs,\n };\n }\n\n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * this.refillRate;\n\n bucket.tokens = Math.min(\n this.config.maxRequests,\n bucket.tokens + tokensToAdd,\n );\n bucket.lastRefill = now;\n\n // Check if we have tokens\n if (bucket.tokens >= 1) {\n bucket.tokens--;\n\n return {\n allowed: true,\n remaining: Math.floor(bucket.tokens),\n resetAt: now + this.config.windowMs,\n };\n }\n\n // No tokens available\n const timeUntilToken = (1 - bucket.tokens) / this.refillRate;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt: now + this.config.windowMs,\n retryAfter: Math.ceil(timeUntilToken / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.buckets.delete(identifier);\n }\n\n clear(): void {\n this.buckets.clear();\n }\n}\n\n/**\n * Create a rate limiter\n */\nexport function createRateLimiter(config: RateLimitConfig) {\n let limiter: FixedWindowLimiter | TokenBucketLimiter;\n\n switch (config.strategy) {\n case \"fixed-window\":\n limiter = new FixedWindowLimiter(config);\n break;\n case \"token-bucket\":\n limiter = new TokenBucketLimiter(config);\n break;\n case \"sliding-window\":\n // Use token bucket as approximation for sliding window\n limiter = new TokenBucketLimiter(config);\n break;\n default:\n limiter = new FixedWindowLimiter(config);\n }\n\n return {\n /**\n * Check if request is allowed\n */\n check(context?: Record<string, unknown>): RateLimitResult {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n return limiter.check(identifier);\n },\n\n /**\n * Reset rate limit for identifier\n */\n reset(context?: Record<string, unknown>): void {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n limiter.reset(identifier);\n },\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n limiter.clear();\n },\n };\n}\n\n/**\n * Create rate limit middleware for agents\n */\nexport function rateLimitMiddleware(config: RateLimitConfig) {\n const limiter = createRateLimiter(config);\n\n return <T>(context: Record<string, unknown>, next: () => Promise<T>): Promise<T> => {\n const result = limiter.check(context);\n\n if (!result.allowed) {\n throw toError(createError({\n type: \"agent\",\n message: config.errorMessage ||\n `Rate limit exceeded. Try again in ${result.retryAfter} seconds.`,\n }));\n }\n\n return next();\n };\n}\n", "/**\n * Response Caching System\n *\n * Cache agent responses to reduce API calls and improve performance.\n */\n\nimport type { AgentResponse } from \"../../types/agent.ts\";\n\nexport interface CacheConfig {\n /** Cache strategy */\n strategy: \"memory\" | \"lru\" | \"ttl\";\n\n /** Maximum cache size (for LRU) */\n maxSize?: number;\n\n /** Time to live in milliseconds (for TTL) */\n ttl?: number;\n\n /** Generate cache key */\n keyGenerator?: (input: string, context?: Record<string, unknown>) => string;\n}\n\nexport interface CacheEntry {\n /** Cached response */\n response: AgentResponse;\n\n /** Timestamp when cached */\n cachedAt: number;\n\n /** Expiration timestamp (for TTL) */\n expiresAt?: number;\n\n /** Access count */\n accessCount: number;\n\n /** Last accessed timestamp */\n lastAccessedAt: number;\n}\n\n/**\n * Memory Cache (simple in-memory storage)\n */\nclass MemoryCache {\n private cache = new Map<string, CacheEntry>();\n\n set(key: string, response: AgentResponse): void {\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * LRU Cache (Least Recently Used eviction)\n */\nclass LRUCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n set(key: string, response: AgentResponse): void {\n // If key exists, delete it first (will re-add to end)\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // If at max size, remove least recently used (first entry)\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Move to end (mark as recently used)\n this.cache.delete(key);\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n this.cache.set(key, entry);\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * TTL Cache (Time To Live eviction)\n */\nclass TTLCache {\n private cache = new Map<string, CacheEntry>();\n private ttl: number;\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(ttl: number = 300000) {\n this.ttl = ttl;\n this.startCleanup();\n }\n\n set(key: string, response: AgentResponse): void {\n const now = Date.now();\n\n this.cache.set(key, {\n response,\n cachedAt: now,\n expiresAt: now + this.ttl,\n accessCount: 0,\n lastAccessedAt: now,\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.cache.clear();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }, 60000);\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(config: CacheConfig) {\n let cache: MemoryCache | LRUCache | TTLCache;\n\n switch (config.strategy) {\n case \"memory\":\n cache = new MemoryCache();\n break;\n case \"lru\":\n cache = new LRUCache(config.maxSize || 100);\n break;\n case \"ttl\":\n cache = new TTLCache(config.ttl || 300000);\n break;\n default:\n cache = new MemoryCache();\n }\n\n const keyGenerator = config.keyGenerator || ((input: string) => `cache_${hashString(input)}`);\n\n return {\n /**\n * Get cached response\n */\n get(input: string, context?: Record<string, unknown>): AgentResponse | null {\n const key = keyGenerator(input, context);\n return cache.get(key);\n },\n\n /**\n * Set cached response\n */\n set(input: string, response: AgentResponse, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.set(key, response);\n },\n\n /**\n * Check if cached\n */\n has(input: string, context?: Record<string, unknown>): boolean {\n const key = keyGenerator(input, context);\n return cache.has(key);\n },\n\n /**\n * Delete cached entry\n */\n delete(input: string, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.delete(key);\n },\n\n /**\n * Clear all cache\n */\n clear(): void {\n cache.clear();\n },\n\n /**\n * Get cache size\n */\n size(): number {\n return cache.size();\n },\n };\n}\n\n/**\n * Simple string hash function\n */\nfunction hashString(str: string): string {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Cache middleware for agents\n */\nexport function cacheMiddleware(config: CacheConfig) {\n const cache = createCache(config);\n\n return async (\n context: Record<string, unknown>,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n // Check cache\n const cached = cache.get(inputString, context);\n\n if (cached) {\n return {\n ...cached,\n metadata: {\n ...cached.metadata,\n fromCache: true,\n cachedAt: Date.now(),\n },\n };\n }\n\n // Execute and cache\n const result = await next();\n cache.set(inputString, result, context);\n\n return result;\n };\n}\n", "/**\n * Cost Tracking System\n *\n * Track API usage and costs for monitoring and billing.\n */\n\nimport type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface CostConfig {\n /** Provider pricing (per 1M tokens) */\n pricing: {\n [provider: string]: {\n input: number; // Cost per 1M input tokens\n output: number; // Cost per 1M output tokens\n };\n };\n\n /** Budget limits */\n limits?: {\n daily?: number;\n monthly?: number;\n };\n\n /** Callback when limit exceeded */\n onLimitExceeded?: (usage: UsageSummary) => void;\n}\n\nexport interface UsageRecord {\n /** Timestamp */\n timestamp: number;\n\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model: string;\n\n /** Provider */\n provider: string;\n\n /** Token usage */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Estimated cost */\n cost: number;\n\n /** User/session identifier */\n userId?: string;\n}\n\nexport interface UsageSummary {\n /** Total requests */\n requests: number;\n\n /** Total tokens */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Total cost */\n cost: number;\n\n /** Cost by provider */\n byProvider: Record<\n string,\n {\n requests: number;\n tokens: number;\n cost: number;\n }\n >;\n\n /** Period */\n period: {\n start: number;\n end: number;\n };\n}\n\n/**\n * Cost Tracker\n */\nclass CostTracker {\n private records: UsageRecord[] = [];\n private config: CostConfig;\n private dailyTotal = 0;\n private monthlyTotal = 0;\n private lastDayReset = Date.now();\n private lastMonthReset = Date.now();\n private resetInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: CostConfig) {\n this.config = config;\n this.startPeriodicReset();\n }\n\n /**\n * Track an agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n if (!response.usage) {\n agentLogger.warn(\"No usage data in response, cannot track costs\");\n return this.createEmptyRecord(agentId, model);\n }\n\n // Parse provider from model string\n const provider = model.split(\"/\")[0] || \"unknown\";\n\n // Calculate cost\n const cost = this.calculateCost(\n provider,\n response.usage.promptTokens,\n response.usage.completionTokens,\n );\n\n // Create record\n const record: UsageRecord = {\n timestamp: Date.now(),\n agentId,\n model,\n provider,\n tokens: {\n prompt: response.usage.promptTokens,\n completion: response.usage.completionTokens,\n total: response.usage.totalTokens,\n },\n cost,\n userId,\n };\n\n // Add to records\n this.records.push(record);\n\n // Update totals\n this.dailyTotal += cost;\n this.monthlyTotal += cost;\n\n // Check limits\n this.checkLimits();\n\n return record;\n }\n\n /**\n * Calculate cost based on token usage\n */\n private calculateCost(\n provider: string,\n inputTokens: number,\n outputTokens: number,\n ): number {\n const pricing = this.config.pricing[provider];\n\n if (!pricing) {\n agentLogger.warn(`No pricing configured for provider: ${provider}`);\n return 0;\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n }\n\n /**\n * Get usage summary for a period\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n const relevantRecords = this.records.filter(\n (r) => r.timestamp >= start && r.timestamp <= end,\n );\n\n const summary: UsageSummary = {\n requests: relevantRecords.length,\n tokens: {\n prompt: 0,\n completion: 0,\n total: 0,\n },\n cost: 0,\n byProvider: {},\n period: { start, end },\n };\n\n for (const record of relevantRecords) {\n summary.tokens.prompt += record.tokens.prompt;\n summary.tokens.completion += record.tokens.completion;\n summary.tokens.total += record.tokens.total;\n summary.cost += record.cost;\n\n if (!summary.byProvider[record.provider]) {\n summary.byProvider[record.provider] = {\n requests: 0,\n tokens: 0,\n cost: 0,\n };\n }\n\n const providerStats = summary.byProvider[record.provider]!;\n providerStats.requests++;\n providerStats.tokens += record.tokens.total;\n providerStats.cost += record.cost;\n }\n\n return summary;\n }\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n const now = Date.now();\n const dayStart = now - 24 * 60 * 60 * 1000;\n return this.getSummary(dayStart, now);\n }\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n const now = Date.now();\n const monthStart = now - 30 * 24 * 60 * 60 * 1000;\n return this.getSummary(monthStart, now);\n }\n\n /**\n * Check if limits are exceeded\n */\n private checkLimits(): void {\n if (this.config.limits?.daily && this.dailyTotal > this.config.limits.daily) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getDailySummary());\n }\n }\n\n if (\n this.config.limits?.monthly &&\n this.monthlyTotal > this.config.limits.monthly\n ) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getMonthlySummary());\n }\n }\n }\n\n private startPeriodicReset(): void {\n this.resetInterval = setInterval(() => {\n const now = Date.now();\n\n if (now - this.lastDayReset >= 24 * 60 * 60 * 1000) {\n this.dailyTotal = 0;\n this.lastDayReset = now;\n }\n\n if (now - this.lastMonthReset >= 30 * 24 * 60 * 60 * 1000) {\n this.monthlyTotal = 0;\n this.lastMonthReset = now;\n }\n }, 60000);\n }\n\n destroy(): void {\n if (this.resetInterval) {\n clearInterval(this.resetInterval);\n this.resetInterval = null;\n }\n this.records = [];\n }\n\n /**\n * Create empty record\n */\n private createEmptyRecord(agentId: string, model: string): UsageRecord {\n return {\n timestamp: Date.now(),\n agentId,\n model,\n provider: model.split(\"/\")[0] || \"unknown\",\n tokens: { prompt: 0, completion: 0, total: 0 },\n cost: 0,\n };\n }\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return [...this.records];\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records = [];\n this.dailyTotal = 0;\n this.monthlyTotal = 0;\n }\n}\n\n/**\n * Create a cost tracker\n */\nexport function createCostTracker(config: CostConfig) {\n const tracker = new CostTracker(config);\n\n return {\n /**\n * Track agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n return tracker.track(agentId, model, response, userId);\n },\n\n /**\n * Get usage summary\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n return tracker.getSummary(startTime, endTime);\n },\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n return tracker.getDailySummary();\n },\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n return tracker.getMonthlySummary();\n },\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return tracker.getAllRecords();\n },\n\n /**\n * Clear all data\n */\n clear(): void {\n tracker.clear();\n },\n };\n}\n\n/**\n * Cost tracking middleware for agents\n */\nexport function costTrackingMiddleware(config: CostConfig) {\n const tracker = createCostTracker(config);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const result = await next();\n\n // Track cost\n tracker.track(\n context.agentId,\n context.model || \"unknown\",\n result,\n (context.data as Record<string, unknown>)?.userId as string | undefined,\n );\n\n return result;\n };\n}\n", "import type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Input Validation and Output Filtering\n *\n * Security features to prevent prompt injection, data leakage, and harmful content.\n */\n\nexport interface SecurityConfig {\n /** Input validation rules */\n input?: {\n /** Maximum input length */\n maxLength?: number;\n\n /** Blocked patterns (regex) */\n blockedPatterns?: RegExp[];\n\n /** Sanitize input */\n sanitize?: boolean;\n\n /** Custom validator */\n validate?: (input: string) => boolean | Promise<boolean>;\n };\n\n /** Output filtering rules */\n output?: {\n /** Blocked patterns in output */\n blockedPatterns?: RegExp[];\n\n /** Filter PII (Personal Identifiable Information) */\n filterPII?: boolean;\n\n /** Custom filter */\n filter?: (output: string) => string | Promise<string>;\n };\n\n /** Action when violation detected */\n onViolation?: (violation: SecurityViolation) => void;\n}\n\nexport interface SecurityViolation {\n /** Violation type */\n type: \"input\" | \"output\";\n\n /** Violation reason */\n reason: string;\n\n /** Original content */\n content: string;\n\n /** Matched pattern (if any) */\n pattern?: RegExp;\n}\n\n/**\n * Common blocked patterns\n */\nexport const COMMON_BLOCKED_PATTERNS = {\n /** Prompt injection attempts */\n promptInjection: [\n /ignore\\s+previous\\s+instructions/i,\n /ignore\\s+all\\s+previous\\s+prompts/i,\n /you\\s+are\\s+now\\s+a/i,\n /pretend\\s+you\\s+are/i,\n /system:\\s*/i,\n /<\\|im_start\\|>/i,\n /<\\|im_end\\|>/i,\n ],\n\n /** Potential data exfiltration */\n dataExfiltration: [\n /password/i,\n /api[_\\s-]?key/i,\n /secret/i,\n /token/i,\n /credit\\s+card/i,\n ],\n\n /** SQL injection patterns */\n sqlInjection: [\n /(\\bUNION\\b|\\bSELECT\\b).*\\bFROM\\b/i,\n /;\\s*(DROP|DELETE|UPDATE|INSERT)/i,\n ],\n\n /** XSS patterns */\n xss: [\n /<script[^>]*>.*?<\\/script>/gi,\n /javascript:/i,\n /on\\w+\\s*=/i, // Event handlers\n ],\n};\n\n/**\n * PII patterns (email, phone, SSN, etc.)\n */\nconst PII_PATTERNS = {\n email: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n phone: /\\b(\\+\\d{1,3}[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g,\n ssn: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n creditCard: /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g,\n};\n\n/**\n * Input Validator\n */\nexport class InputValidator {\n private config: SecurityConfig[\"input\"];\n\n constructor(config?: SecurityConfig[\"input\"]) {\n this.config = config || {};\n }\n\n /**\n * Validate input\n */\n async validate(input: string): Promise<{\n valid: boolean;\n sanitized?: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n\n // Check length\n if (this.config?.maxLength && input.length > this.config.maxLength) {\n violations.push({\n type: \"input\",\n reason: `Input exceeds maximum length of ${this.config.maxLength}`,\n content: input.substring(0, 100) + \"...\",\n });\n }\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(input)) {\n violations.push({\n type: \"input\",\n reason: \"Input matches blocked pattern\",\n content: input,\n pattern,\n });\n }\n }\n }\n\n // Custom validation\n if (this.config?.validate) {\n const customValid = await this.config.validate(input);\n if (!customValid) {\n violations.push({\n type: \"input\",\n reason: \"Custom validation failed\",\n content: input,\n });\n }\n }\n\n // Sanitize if requested\n let sanitized = input;\n if (this.config?.sanitize) {\n sanitized = this.sanitizeInput(input);\n }\n\n return {\n valid: violations.length === 0,\n sanitized: this.config?.sanitize ? sanitized : undefined,\n violations,\n };\n }\n\n /**\n * Sanitize input (remove potentially harmful content)\n */\n private sanitizeInput(input: string): string {\n let sanitized = input;\n\n // Remove script tags\n sanitized = sanitized.replace(/<script[^>]*>.*?<\\/script>/gi, \"\");\n\n // Remove event handlers\n sanitized = sanitized.replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, \"\");\n\n // Remove javascript: protocol\n sanitized = sanitized.replace(/javascript:/gi, \"\");\n\n return sanitized;\n }\n}\n\n/**\n * Output Filter\n */\nexport class OutputFilter {\n private config: SecurityConfig[\"output\"];\n\n constructor(config?: SecurityConfig[\"output\"]) {\n this.config = config || {};\n }\n\n /**\n * Filter output\n */\n async filter(output: string): Promise<{\n filtered: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n let filtered = output;\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(filtered)) {\n violations.push({\n type: \"output\",\n reason: \"Output contains blocked pattern\",\n content: filtered,\n pattern,\n });\n\n // Redact matched content\n filtered = filtered.replace(pattern, \"[REDACTED]\");\n }\n }\n }\n\n // Filter PII\n if (this.config?.filterPII) {\n filtered = this.filterPII(filtered);\n }\n\n // Custom filter\n if (this.config?.filter) {\n filtered = await this.config.filter(filtered);\n }\n\n return { filtered, violations };\n }\n\n /**\n * Filter PII from output\n */\n private filterPII(output: string): string {\n let filtered = output;\n\n // Replace email addresses\n filtered = filtered.replace(PII_PATTERNS.email, \"[EMAIL]\");\n\n // Replace phone numbers\n filtered = filtered.replace(PII_PATTERNS.phone, \"[PHONE]\");\n\n // Replace SSN\n filtered = filtered.replace(PII_PATTERNS.ssn, \"[SSN]\");\n\n // Replace credit card numbers\n filtered = filtered.replace(PII_PATTERNS.creditCard, \"[CREDIT_CARD]\");\n\n return filtered;\n }\n}\n\n/**\n * Create security middleware for agents\n */\nexport function securityMiddleware(config: SecurityConfig) {\n const inputValidator = new InputValidator(config.input);\n const outputFilter = new OutputFilter(config.output);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n // Validate input\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n const inputValidation = await inputValidator.validate(inputString);\n\n if (!inputValidation.valid) {\n // Report violations\n inputValidation.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n\n const firstViolation = inputValidation.violations[0];\n throw toError(createError({\n type: \"agent\",\n message: `Input validation failed: ${firstViolation?.reason || \"Unknown reason\"}`,\n }));\n }\n\n // Execute with sanitized input if applicable\n if (inputValidation.sanitized) {\n context.input = inputValidation.sanitized;\n }\n\n // Execute\n const result = await next();\n\n // Filter output\n const outputFiltering = await outputFilter.filter(result.text);\n\n if (outputFiltering.violations.length > 0) {\n // Report violations\n outputFiltering.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n }\n\n // Return filtered result\n return {\n ...result,\n text: outputFiltering.filtered,\n };\n };\n}\n", "/**\n * Veryfront Workflow Types\n *\n * Core type definitions for durable, DAG-based agentic workflows\n */\n\nimport type { z } from \"zod\";\nimport type { Agent } from \"../types/agent.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { BlobRef, BlobStorage } from \"./blob/types.ts\";\n\n// ============================================================================\n// Workflow Status\n// ============================================================================\n\n/**\n * Status of a workflow run\n */\nexport type WorkflowStatus =\n | \"pending\" // Created but not started\n | \"running\" // Currently executing\n | \"waiting\" // Paused, waiting for approval/event\n | \"completed\" // Successfully finished\n | \"failed\" // Failed with error\n | \"cancelled\"; // Cancelled by user\n\n/**\n * Status of a single node in the workflow\n */\nexport type NodeStatus =\n | \"pending\" // Not yet executed\n | \"running\" // Currently executing\n | \"completed\" // Successfully finished\n | \"failed\" // Failed with error\n | \"skipped\"; // Skipped due to condition\n\n// ============================================================================\n// Workflow Node Types\n// ============================================================================\n\n/**\n * Types of nodes in a workflow DAG\n */\nexport type WorkflowNodeType =\n | \"step\" // Single agent or tool execution\n | \"parallel\" // Parallel execution of multiple nodes\n | \"map\" // Dynamic fan-out/map-reduce\n | \"branch\" // Conditional branching\n | \"wait\" // Wait for approval or event\n | \"subWorkflow\" // Nested workflow execution\n | \"loop\"; // Iterative execution until condition is met\n\n/**\n * Retry configuration for a step\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxAttempts?: number;\n /** Backoff strategy */\n backoff?: \"fixed\" | \"linear\" | \"exponential\";\n /** Initial delay in milliseconds */\n initialDelay?: number;\n /** Maximum delay between retries */\n maxDelay?: number;\n /** Custom function to determine if error is retryable */\n retryIf?: (error: Error) => boolean;\n}\n\n/**\n * Base configuration for all workflow nodes\n */\nexport interface BaseNodeConfig {\n /** Whether to checkpoint after this node */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for this node */\n timeout?: string | number;\n /** Condition to skip this node */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Step node configuration (agent or tool execution)\n */\nexport interface StepNodeConfig extends BaseNodeConfig {\n type: \"step\";\n /** Agent ID or agent instance to execute */\n agent?: string | Agent;\n /** Tool ID or tool instance to execute */\n tool?: string | Tool | undefined;\n /** Input for the agent/tool - can be static or computed from context */\n input?:\n | string\n | Record<string, unknown>\n | ((context: WorkflowContext) => unknown);\n}\n\n/**\n * Parallel node configuration (concurrent execution)\n */\nexport interface ParallelNodeConfig extends BaseNodeConfig {\n type: \"parallel\";\n /** Nodes to execute in parallel */\n nodes: WorkflowNode[];\n /** How to handle parallel completion */\n strategy?: \"all\" | \"race\" | \"allSettled\";\n}\n\n/**\n * Branch node configuration (conditional execution)\n */\nexport interface BranchNodeConfig extends BaseNodeConfig {\n type: \"branch\";\n /** Condition to evaluate */\n condition: (context: WorkflowContext) => boolean | Promise<boolean>;\n /** Nodes to execute if condition is true */\n then: WorkflowNode[];\n /** Nodes to execute if condition is false */\n else?: WorkflowNode[];\n}\n\n/**\n * Wait node configuration (approval or event)\n */\nexport interface WaitNodeConfig extends BaseNodeConfig {\n type: \"wait\";\n /** Type of wait */\n waitType: \"approval\" | \"event\";\n /** Message to display for approval */\n message?: string;\n /** Payload to include with approval request */\n payload?: unknown | ((context: WorkflowContext) => unknown);\n /** Allowed approvers (email or user IDs) */\n approvers?: string[];\n /** Event name to wait for (for event type) */\n eventName?: string;\n}\n\n/**\n * Sub-workflow node configuration\n */\nexport interface SubWorkflowNodeConfig extends BaseNodeConfig {\n type: \"subWorkflow\";\n /** Workflow ID or workflow definition to execute */\n workflow: string | WorkflowDefinition;\n /** Input for the sub-workflow */\n input?: unknown | ((context: WorkflowContext) => unknown);\n /** Transform the sub-workflow output */\n output?: (result: unknown) => unknown;\n}\n\n/**\n * Map node configuration (dynamic fan-out)\n */\nexport interface MapNodeConfig extends BaseNodeConfig {\n type: \"map\";\n /** Collection to iterate over (array) */\n items: unknown[] | ((context: WorkflowContext) => unknown[] | Promise<unknown[]>);\n /** Node or workflow to execute for each item */\n processor: WorkflowNode | WorkflowDefinition;\n /** Maximum concurrent executions */\n concurrency?: number;\n}\n\n/**\n * Union of all node configurations\n */\nexport type WorkflowNodeConfig =\n | StepNodeConfig\n | ParallelNodeConfig\n | MapNodeConfig\n | BranchNodeConfig\n | WaitNodeConfig\n | SubWorkflowNodeConfig\n | LoopNodeConfig;\n\n/**\n * Loop node configuration (imported from DSL)\n * Re-exported here for the union type\n */\nexport interface LoopNodeConfig extends BaseNodeConfig {\n type: \"loop\";\n while: (context: WorkflowContext, loop: LoopExecutionContext) => boolean | Promise<boolean>;\n steps:\n | WorkflowNode[]\n | ((context: WorkflowContext, loop: LoopExecutionContext) => WorkflowNode[]);\n maxIterations: number;\n onMaxIterations?: (\n context: WorkflowContext,\n loop: LoopExecutionContext,\n ) => Record<string, unknown> | Promise<Record<string, unknown>>;\n onComplete?: (\n context: WorkflowContext,\n loop: LoopExecutionContext,\n ) => Record<string, unknown> | Promise<Record<string, unknown>>;\n iterationTimeout?: string | number;\n delay?: number | string;\n}\n\n/**\n * Loop execution context passed to loop callbacks\n */\nexport interface LoopExecutionContext {\n iteration: number;\n totalIterations: number;\n previousResults: unknown[];\n isFirstIteration: boolean;\n isLastAllowedIteration: boolean;\n}\n\n/**\n * A node in the workflow DAG\n */\nexport interface WorkflowNode {\n /** Unique node ID within the workflow */\n id: string;\n /** Node configuration */\n config: WorkflowNodeConfig;\n /** Dependencies (node IDs that must complete before this node) */\n dependsOn?: string[];\n}\n\n// ============================================================================\n// Workflow Definition\n// ============================================================================\n\n/**\n * Workflow context - accumulated data during execution\n */\nexport interface WorkflowContext {\n /** Input provided when workflow was started */\n input: unknown;\n /** Results from each completed node, keyed by node ID */\n [nodeId: string]: unknown;\n}\n\n/**\n * Helper to resolve BlobRefs into actual content.\n */\nexport interface BlobResolver {\n /** Get blob content as text. */\n getText(ref: BlobRef): Promise<string | null>;\n /** Get blob content as Uint8Array. */\n getBytes(ref: BlobRef): Promise<Uint8Array | null>;\n /** Get blob content as ReadableStream. */\n getStream(ref: BlobRef): Promise<ReadableStream | null>;\n /** Get blob metadata. */\n stat(ref: BlobRef): Promise<BlobRef | null>;\n /** Delete blob data. */\n delete(ref: BlobRef): Promise<void>;\n}\n\n/**\n * Step builder function context\n */\nexport interface StepBuilderContext<TInput = unknown> {\n /** Original workflow input */\n input: TInput;\n /** Accumulated context from previous steps */\n context: WorkflowContext;\n /** Blob storage access (if configured) */\n blobStorage?: BlobStorage;\n /** Helper to resolve BlobRefs to content */\n blob?: BlobResolver;\n}\n\n/**\n * Workflow definition\n */\nexport interface WorkflowDefinition<\n TInput = unknown,\n TOutput = unknown,\n> {\n /** Unique workflow identifier */\n id: string;\n /** Optional description */\n description?: string;\n /** Optional version */\n version?: string;\n /** Input validation schema */\n inputSchema?: z.ZodSchema<TInput>;\n /** Output validation schema */\n outputSchema?: z.ZodSchema<TOutput>;\n /** Default retry configuration for all steps */\n retry?: RetryConfig;\n /** Default timeout for the entire workflow */\n timeout?: string | number;\n /** Workflow steps - can be static or dynamic based on input */\n steps:\n | WorkflowNode[]\n | ((context: StepBuilderContext<TInput>) => WorkflowNode[]);\n /** Error handler */\n onError?: (error: Error, context: WorkflowContext) => void | Promise<void>;\n /** Completion handler */\n onComplete?: (\n result: TOutput,\n context: WorkflowContext,\n ) => void | Promise<void>;\n}\n\n// ============================================================================\n// Workflow Run State\n// ============================================================================\n\n/**\n * State of a single node during execution\n */\nexport interface NodeState {\n /** Node ID */\n nodeId: string;\n /** Current status */\n status: NodeStatus;\n /** Input provided to the node */\n input?: unknown;\n /** Output produced by the node */\n output?: unknown;\n /** Error message if failed */\n error?: string;\n /** Current attempt number (for retries) */\n attempt: number;\n /** When execution started */\n startedAt?: Date;\n /** When execution completed */\n completedAt?: Date;\n}\n\n/**\n * Checkpoint for workflow resume\n */\nexport interface Checkpoint {\n /** Unique checkpoint ID */\n id: string;\n /** Node ID where checkpoint was created */\n nodeId: string;\n /** When checkpoint was created */\n timestamp: Date;\n /** Context at checkpoint time */\n context: WorkflowContext;\n /** Node states at checkpoint time */\n nodeStates: Record<string, NodeState>;\n}\n\n/**\n * Pending approval request\n */\nexport interface PendingApproval {\n /** Unique approval ID */\n id: string;\n /** Node ID that requested approval */\n nodeId: string;\n /** Message for the approver */\n message: string;\n /** Payload with context for the approver */\n payload: unknown;\n /** Allowed approvers (if restricted) */\n approvers?: string[];\n /** When approval was requested */\n requestedAt: Date;\n /** When approval expires */\n expiresAt?: Date;\n /** Current approval status */\n status: \"pending\" | \"approved\" | \"rejected\" | \"expired\";\n /** Who approved/rejected */\n decidedBy?: string;\n /** When decision was made */\n decidedAt?: Date;\n /** Optional comment from approver */\n comment?: string;\n}\n\n/**\n * Workflow run - tracks execution of a workflow instance\n */\nexport interface WorkflowRun<TInput = unknown, TOutput = unknown> {\n /** Unique run ID */\n id: string;\n /** Workflow definition ID */\n workflowId: string;\n /** Workflow version */\n version?: string;\n /** Current status */\n status: WorkflowStatus;\n /** Input provided when started */\n input: TInput;\n /** Final output (when completed) */\n output?: TOutput;\n\n // Execution state\n /** State of each node in the workflow */\n nodeStates: Record<string, NodeState>;\n /** Currently executing node IDs */\n currentNodes: string[];\n /** Accumulated context */\n context: WorkflowContext;\n\n // Durability\n /** Checkpoints for resume */\n checkpoints: Checkpoint[];\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n // Error state\n /** Error information if failed */\n error?: {\n message: string;\n stack?: string;\n nodeId?: string;\n };\n\n // Timing\n /** When run was created */\n createdAt: Date;\n /** When execution started */\n startedAt?: Date;\n /** When execution completed */\n completedAt?: Date;\n}\n\n// ============================================================================\n// Approval Decision\n// ============================================================================\n\n/**\n * Decision on a pending approval\n */\nexport interface ApprovalDecision {\n /** Whether the approval was granted */\n approved: boolean;\n /** Who made the decision */\n approver: string;\n /** Optional comment */\n comment?: string;\n}\n\n// ============================================================================\n// Workflow Job (for queue-based execution)\n// ============================================================================\n\n/**\n * Job for queue-based workflow execution\n */\nexport interface WorkflowJob {\n /** Run ID */\n runId: string;\n /** Workflow ID */\n workflowId: string;\n /** Input data */\n input: unknown;\n /** Priority (higher = more urgent) */\n priority?: number;\n /** When job was created */\n createdAt: Date;\n}\n\n// ============================================================================\n// Run Filter (for querying runs)\n// ============================================================================\n\n/**\n * Filter options for listing workflow runs\n */\nexport interface RunFilter {\n /** Filter by workflow ID */\n workflowId?: string;\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n /** Filter by creation date (after) */\n createdAfter?: Date;\n /** Filter by creation date (before) */\n createdBefore?: Date;\n /** Maximum number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n// ============================================================================\n// Duration parsing utility type\n// ============================================================================\n\n/**\n * Duration string format: \"1h\", \"30m\", \"2d\", etc.\n */\nexport type DurationString = string;\n\n/**\n * Parse duration string to milliseconds\n *\n * @throws Error if duration is invalid, zero, or negative\n */\nexport function parseDuration(duration: string | number): number {\n if (typeof duration === \"number\") {\n if (duration < 0) {\n throw new Error(`Duration cannot be negative: ${duration}`);\n }\n return duration;\n }\n\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n\n const value = match[1];\n const unit = match[2];\n\n if (!value || !unit) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n\n const num = parseFloat(value);\n\n // Reject zero and negative values\n if (num <= 0) {\n throw new Error(`Duration must be positive: ${duration}`);\n }\n\n switch (unit) {\n case \"ms\":\n return num;\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60 * 1000;\n case \"h\":\n return num * 60 * 60 * 1000;\n case \"d\":\n return num * 24 * 60 * 60 * 1000;\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Validate retry configuration\n *\n * @throws Error if retry config has invalid values\n */\nexport function validateRetryConfig(config: RetryConfig): void {\n if (config.maxAttempts !== undefined) {\n if (!Number.isInteger(config.maxAttempts) || config.maxAttempts < 1) {\n throw new Error(`maxAttempts must be a positive integer, got: ${config.maxAttempts}`);\n }\n }\n\n if (config.initialDelay !== undefined) {\n if (config.initialDelay < 0) {\n throw new Error(`initialDelay cannot be negative: ${config.initialDelay}`);\n }\n }\n\n if (config.maxDelay !== undefined) {\n if (config.maxDelay < 0) {\n throw new Error(`maxDelay cannot be negative: ${config.maxDelay}`);\n }\n }\n\n if (config.initialDelay !== undefined && config.maxDelay !== undefined) {\n if (config.initialDelay > config.maxDelay) {\n throw new Error(\n `initialDelay (${config.initialDelay}) cannot be greater than maxDelay (${config.maxDelay})`,\n );\n }\n }\n\n if (config.backoff !== undefined) {\n const validBackoffs = [\"fixed\", \"linear\", \"exponential\"];\n if (!validBackoffs.includes(config.backoff)) {\n throw new Error(\n `Invalid backoff strategy: ${config.backoff}. Must be one of: ${validBackoffs.join(\", \")}`,\n );\n }\n }\n}\n\n/**\n * Generate a unique ID for workflow runs, nodes, etc.\n */\nexport function generateId(prefix: string = \"wf\"): string {\n const randomPart = crypto.randomUUID().slice(0, 12);\n return `${prefix}_${randomPart}`;\n}\n", "/**\n * Workflow DSL Builder\n *\n * Main factory function for creating durable workflows\n */\n\nimport type { z } from \"zod\";\nimport type {\n RetryConfig,\n StepBuilderContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a workflow\n */\nexport interface WorkflowOptions<TInput = unknown, TOutput = unknown> {\n /** Unique workflow identifier */\n id: string;\n /** Optional description */\n description?: string;\n /** Optional version */\n version?: string;\n /** Input validation schema (Zod) */\n inputSchema?: z.ZodSchema<TInput>;\n /** Output validation schema (Zod) */\n outputSchema?: z.ZodSchema<TOutput>;\n /** Default retry configuration for all steps */\n retry?: RetryConfig;\n /** Default timeout for the entire workflow */\n timeout?: string | number;\n /**\n * Workflow steps - can be:\n * - An array of WorkflowNode\n * - A function that returns an array based on input\n */\n steps:\n | WorkflowNode[]\n | ((context: StepBuilderContext<TInput>) => WorkflowNode[]);\n /** Error handler called when workflow fails */\n onError?: (error: Error, context: WorkflowContext) => void | Promise<void>;\n /** Completion handler called when workflow succeeds */\n onComplete?: (\n result: TOutput,\n context: WorkflowContext,\n ) => void | Promise<void>;\n}\n\n/**\n * Created workflow with execution methods\n */\nexport interface Workflow<TInput = unknown, TOutput = unknown> {\n /** Workflow definition */\n definition: WorkflowDefinition<TInput, TOutput>;\n /** Workflow ID */\n id: string;\n /** Workflow version */\n version?: string;\n}\n\n/**\n * Create a durable workflow definition\n *\n * @example\n * ```typescript\n * import { workflow, step, parallel, branch, waitForApproval } from 'veryfront/ai/workflow';\n * import { z } from 'zod';\n *\n * export default workflow({\n * id: 'content-pipeline',\n * description: 'Generate and publish content with human review',\n *\n * inputSchema: z.object({\n * topic: z.string(),\n * requiresApproval: z.boolean().default(true),\n * }),\n *\n * timeout: '2h',\n *\n * steps: ({ input }) => [\n * // Research phase\n * step('research', {\n * agent: 'researcher',\n * input: `Research: ${input.topic}`,\n * }),\n *\n * // Generate content in parallel\n * parallel('generate', [\n * step('write-article', { agent: 'writer' }),\n * step('create-images', { tool: 'imageGenerator' }),\n * ]),\n *\n * // Optional approval gate\n * branch('approval-gate', {\n * condition: () => input.requiresApproval,\n * then: [\n * waitForApproval('human-review', {\n * timeout: '24h',\n * message: 'Please review the content',\n * }),\n * ],\n * }),\n *\n * // Publish\n * step('publish', { agent: 'publisher' }),\n * ],\n *\n * onComplete: async (result, context) => {\n * console.log('Workflow completed:', result);\n * },\n *\n * onError: async (error, context) => {\n * console.error('Workflow failed:', error);\n * },\n * });\n * ```\n */\nexport function workflow<TInput = unknown, TOutput = unknown>(\n options: WorkflowOptions<TInput, TOutput>,\n): Workflow<TInput, TOutput> {\n // Validate required fields\n if (!options.id) {\n throw new Error(\"Workflow must have an 'id'\");\n }\n\n if (!options.steps) {\n throw new Error(`Workflow \"${options.id}\" must have 'steps'`);\n }\n\n // Create the workflow definition\n const definition: WorkflowDefinition<TInput, TOutput> = {\n id: options.id,\n description: options.description,\n version: options.version,\n inputSchema: options.inputSchema,\n outputSchema: options.outputSchema,\n retry: options.retry,\n timeout: options.timeout,\n steps: options.steps,\n onError: options.onError,\n onComplete: options.onComplete,\n };\n\n return {\n definition,\n id: options.id,\n version: options.version,\n };\n}\n\n/**\n * Helper to build linear dependencies between nodes\n *\n * Takes an array of nodes and returns them with dependsOn set\n * so each node depends on the previous one.\n */\nexport function sequence(...nodes: WorkflowNode[]): WorkflowNode[] {\n return nodes.map((node, index) => {\n if (index === 0) {\n return node;\n }\n const prevNode = nodes[index - 1];\n return {\n ...node,\n dependsOn: prevNode ? [prevNode.id] : undefined,\n };\n });\n}\n\n/**\n * Create a DAG-based workflow with explicit dependencies\n *\n * @example\n * ```typescript\n * import { dag, workflow } from 'veryfront/ai/workflow';\n *\n * export default workflow({\n * id: 'data-pipeline',\n * steps: dag({\n * 'fetch': step('fetch', { tool: 'dataFetcher' }),\n * 'validate': step('validate', { agent: 'validator' }).dependsOn('fetch'),\n * 'transform-a': step('transform-a', { tool: 'transformerA' }).dependsOn('validate'),\n * 'transform-b': step('transform-b', { tool: 'transformerB' }).dependsOn('validate'),\n * 'aggregate': step('aggregate', { agent: 'aggregator' }).dependsOn('transform-a', 'transform-b'),\n * }),\n * });\n * ```\n */\nexport function dag(\n nodes: Record<string, WorkflowNode | { node: WorkflowNode; dependsOn: string[] }>,\n): WorkflowNode[] {\n const result: WorkflowNode[] = [];\n const seenIds = new Set<string>();\n\n for (const [id, value] of Object.entries(nodes)) {\n let nodeId: string;\n let node: WorkflowNode;\n\n if (\"node\" in value && \"dependsOn\" in value) {\n // Object with explicit dependencies\n nodeId = value.node.id || id;\n node = {\n ...value.node,\n id: nodeId,\n dependsOn: value.dependsOn,\n };\n } else {\n // Plain WorkflowNode\n const workflowNode = value as WorkflowNode;\n nodeId = workflowNode.id || id;\n node = {\n ...workflowNode,\n id: nodeId,\n };\n }\n\n // Check for duplicate IDs\n if (seenIds.has(nodeId)) {\n throw new Error(`Duplicate node ID detected in dag: \"${nodeId}\"`);\n }\n seenIds.add(nodeId);\n\n result.push(node);\n }\n\n return result;\n}\n\n/**\n * Helper to add dependencies to a node\n */\nexport function dependsOn(\n node: WorkflowNode,\n ...dependencies: string[]\n): WorkflowNode {\n return {\n ...node,\n dependsOn: [...(node.dependsOn || []), ...dependencies],\n };\n}\n", "/**\n * Step DSL Builder\n *\n * Creates step nodes for agent or tool execution\n */\n\nimport type { Agent } from \"../../types/agent.ts\";\nimport type { Tool } from \"../../types/tool.ts\";\nimport type {\n BaseNodeConfig,\n RetryConfig,\n StepNodeConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a step node\n */\nexport interface StepOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Agent ID or agent instance to execute */\n agent?: string | Agent;\n /** Tool ID or tool instance to execute */\n tool?: string | Tool | undefined;\n /** Input for the agent/tool */\n input?:\n | string\n | Record<string, unknown>\n | ((context: WorkflowContext) => unknown);\n /** Whether to checkpoint after this step (default: true for agents) */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for this step */\n timeout?: string | number;\n /** Condition to skip this step */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a step node for agent or tool execution\n *\n * @example\n * ```typescript\n * // Agent step\n * step('research', {\n * agent: 'researcher',\n * input: 'Research AI safety',\n * checkpoint: true,\n * })\n *\n * // Tool step\n * step('fetch-data', {\n * tool: 'dataFetcher',\n * input: { url: 'https://api.example.com/data' },\n * })\n *\n * // Dynamic input from context\n * step('write', {\n * agent: 'writer',\n * input: (ctx) => ctx['research'].output,\n * })\n * ```\n */\nexport function step(id: string, options: StepOptions): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n // Validate that either agent or tool is specified\n if (!options.agent && !options.tool) {\n throw new Error(`Step \"${id}\" must specify either 'agent' or 'tool'`);\n }\n\n if (options.agent && options.tool) {\n throw new Error(`Step \"${id}\" cannot specify both 'agent' and 'tool'`);\n }\n\n // Default checkpoint to true for agent steps\n const shouldCheckpoint = options.checkpoint ?? !!options.agent;\n\n const config: StepNodeConfig = {\n type: \"step\",\n agent: options.agent,\n tool: options.tool,\n input: options.input,\n checkpoint: shouldCheckpoint,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a step that executes an agent\n * Convenience wrapper around step()\n */\nexport function agentStep(\n id: string,\n agent: string | Agent,\n options?: Omit<StepOptions, \"agent\" | \"tool\">,\n): WorkflowNode {\n return step(id, { ...options, agent });\n}\n\n/**\n * Create a step that executes a tool\n * Convenience wrapper around step()\n */\nexport function toolStep(\n id: string,\n tool: string | Tool,\n options?: Omit<StepOptions, \"agent\" | \"tool\">,\n): WorkflowNode {\n return step(id, { ...options, tool });\n}\n", "/**\n * Parallel DSL Builder\n *\n * Creates parallel nodes for concurrent execution\n */\n\nimport type {\n BaseNodeConfig,\n ParallelNodeConfig,\n RetryConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a parallel node\n */\nexport interface ParallelOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** How to handle parallel completion */\n strategy?: \"all\" | \"race\" | \"allSettled\";\n /** Whether to checkpoint after all parallel steps complete */\n checkpoint?: boolean;\n /** Retry configuration for the parallel group */\n retry?: RetryConfig;\n /** Timeout for all parallel steps */\n timeout?: string | number;\n /** Condition to skip this parallel group */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a parallel node for concurrent execution of multiple steps\n *\n * @example\n * ```typescript\n * // Execute multiple agents in parallel\n * parallel('analyze', [\n * step('security-scan', { agent: 'securityAgent' }),\n * step('code-quality', { agent: 'codeReviewAgent' }),\n * step('test-coverage', { tool: 'coverageAnalyzer' }),\n * ])\n *\n * // Race condition - first to complete wins\n * parallel('fast-response', [\n * step('gpt4', { agent: 'gpt4Agent' }),\n * step('claude', { agent: 'claudeAgent' }),\n * ], { strategy: 'race' })\n *\n * // Continue even if some fail\n * parallel('optional-checks', [\n * step('lint', { tool: 'linter' }),\n * step('typecheck', { tool: 'typechecker' }),\n * ], { strategy: 'allSettled' })\n * ```\n */\nexport function parallel(\n id: string,\n nodes: WorkflowNode[],\n options: ParallelOptions = {},\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!nodes || nodes.length === 0) {\n throw new Error(`Parallel node \"${id}\" must have at least one child node`);\n }\n\n // Generate unique IDs for child nodes if they're nested under this parallel\n // Also validate child node IDs\n const prefixedNodes = nodes.map((node, index) => {\n if (!node.id || typeof node.id !== \"string\") {\n throw new Error(`Child node at index ${index} in parallel \"${id}\" has invalid ID`);\n }\n return {\n ...node,\n id: node.id.startsWith(`${id}/`) ? node.id : `${id}/${node.id}`,\n };\n });\n\n const config: ParallelNodeConfig = {\n type: \"parallel\",\n nodes: prefixedNodes,\n strategy: options.strategy ?? \"all\",\n checkpoint: options.checkpoint ?? true,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n", "/**\n * Branch DSL Builder\n *\n * Creates conditional branch nodes for workflow control flow\n */\n\nimport type {\n BaseNodeConfig,\n BranchNodeConfig,\n RetryConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a branch node\n */\nexport interface BranchOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Condition to evaluate */\n condition: (context: WorkflowContext) => boolean | Promise<boolean>;\n /** Nodes to execute if condition is true */\n then: WorkflowNode[];\n /** Nodes to execute if condition is false (optional) */\n else?: WorkflowNode[];\n /** Whether to checkpoint after branching */\n checkpoint?: boolean;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Timeout for the entire branch */\n timeout?: string | number;\n /** Condition to skip the entire branch */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a conditional branch node\n *\n * @example\n * ```typescript\n * // Simple if-then branch\n * branch('approval-gate', {\n * condition: (ctx) => ctx.input.requiresApproval,\n * then: [\n * waitForApproval('human-review', { timeout: '24h' }),\n * ],\n * })\n *\n * // If-then-else branch\n * branch('quality-check', {\n * condition: async (ctx) => {\n * const score = ctx['analyze'].output.score;\n * return score >= 0.8;\n * },\n * then: [\n * step('publish', { agent: 'publisher' }),\n * ],\n * else: [\n * step('revise', { agent: 'editor' }),\n * step('reanalyze', { agent: 'analyzer' }),\n * ],\n * })\n * ```\n */\nexport function branch(id: string, options: BranchOptions): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!options.condition) {\n throw new Error(`Branch \"${id}\" must specify a condition`);\n }\n\n if (!options.then || options.then.length === 0) {\n throw new Error(`Branch \"${id}\" must have at least one 'then' node`);\n }\n\n // Prefix child node IDs for proper namespacing\n const prefixThenNodes = options.then.map((node) => ({\n ...node,\n id: node.id.startsWith(`${id}/then/`) ? node.id : `${id}/then/${node.id}`,\n }));\n\n const prefixElseNodes = options.else?.map((node) => ({\n ...node,\n id: node.id.startsWith(`${id}/else/`) ? node.id : `${id}/else/${node.id}`,\n }));\n\n const config: BranchNodeConfig = {\n type: \"branch\",\n condition: options.condition,\n then: prefixThenNodes,\n else: prefixElseNodes,\n checkpoint: options.checkpoint ?? false,\n retry: options.retry,\n timeout: options.timeout,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a branch that only executes if condition is true (no else)\n * Convenience wrapper around branch()\n */\nexport function when(\n id: string,\n condition: (context: WorkflowContext) => boolean | Promise<boolean>,\n nodes: WorkflowNode[],\n): WorkflowNode {\n return branch(id, { condition, then: nodes });\n}\n\n/**\n * Create a branch that only executes if condition is false\n * Convenience wrapper around branch()\n */\nexport function unless(\n id: string,\n condition: (context: WorkflowContext) => boolean | Promise<boolean>,\n nodes: WorkflowNode[],\n): WorkflowNode {\n return branch(id, {\n condition: async (ctx) => !(await condition(ctx)),\n then: nodes,\n });\n}\n", "/**\n * Wait DSL Builder\n *\n * Creates wait nodes for approvals and external events\n */\n\nimport type {\n BaseNodeConfig,\n RetryConfig,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\n\n/**\n * Options for creating a wait-for-approval node\n */\nexport interface WaitForApprovalOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Message to display to the approver */\n message?: string;\n /** Payload to include with the approval request */\n payload?: unknown | ((context: WorkflowContext) => unknown);\n /** Timeout for the approval (e.g., \"24h\", \"7d\") */\n timeout?: string | number;\n /** Restrict approval to specific users */\n approvers?: string[];\n /** Retry configuration (for timeout/retry scenarios) */\n retry?: RetryConfig;\n /** Condition to skip this approval */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a wait-for-approval node\n *\n * This pauses the workflow until a human approves or rejects.\n * The workflow can be resumed via the approval API.\n *\n * @example\n * ```typescript\n * // Basic approval\n * waitForApproval('content-review', {\n * message: 'Please review the generated content',\n * timeout: '24h',\n * })\n *\n * // Approval with payload for context\n * waitForApproval('deployment-approval', {\n * message: 'Approve deployment to production?',\n * payload: (ctx) => ({\n * changes: ctx['summarize'].output,\n * riskLevel: ctx['analyze'].output.riskLevel,\n * }),\n * approvers: ['ops@company.com', 'lead@company.com'],\n * timeout: '48h',\n * })\n * ```\n */\nexport function waitForApproval(\n id: string,\n options: WaitForApprovalOptions = {},\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"approval\",\n message: options.message ?? \"Approval required\",\n payload: options.payload,\n approvers: options.approvers,\n timeout: options.timeout,\n // Always checkpoint before waiting\n checkpoint: true,\n retry: options.retry,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Options for creating a wait-for-event node\n */\nexport interface WaitForEventOptions extends Omit<BaseNodeConfig, \"checkpoint\"> {\n /** Event name to wait for */\n eventName: string;\n /** Timeout for the event (e.g., \"1h\", \"7d\") */\n timeout?: string | number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Condition to skip this wait */\n skip?: (context: WorkflowContext) => boolean | Promise<boolean>;\n}\n\n/**\n * Create a wait-for-event node\n *\n * This pauses the workflow until an external event is received.\n * Events can be sent via the workflow event API.\n *\n * @example\n * ```typescript\n * // Wait for external webhook\n * waitForEvent('payment-confirmation', {\n * eventName: 'payment.completed',\n * timeout: '30m',\n * })\n *\n * // Wait for manual trigger\n * waitForEvent('manual-continue', {\n * eventName: 'workflow.continue',\n * })\n * ```\n */\nexport function waitForEvent(\n id: string,\n options: WaitForEventOptions,\n): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n if (!options.eventName) {\n throw new Error(`waitForEvent \"${id}\" must specify an eventName`);\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"event\",\n eventName: options.eventName,\n timeout: options.timeout,\n // Always checkpoint before waiting\n checkpoint: true,\n retry: options.retry,\n skip: options.skip,\n };\n\n return {\n id,\n config,\n };\n}\n\n/**\n * Create a simple delay/sleep node\n *\n * @example\n * ```typescript\n * // Wait for 5 minutes between steps\n * delay('cooldown', '5m')\n * ```\n */\nexport function delay(id: string, duration: string | number): WorkflowNode {\n // Validate node ID\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n throw new Error(\"Node ID must be a non-empty string\");\n }\n\n const config: WaitNodeConfig = {\n type: \"wait\",\n waitType: \"event\",\n eventName: \"__delay__\",\n timeout: duration,\n checkpoint: false, // No need to checkpoint for simple delays\n };\n\n return {\n id,\n config,\n };\n}\n", "/**\n * Workflow Backend Interface\n *\n * Defines the contract for workflow persistence and execution backends.\n * Implementations can be:\n * - MemoryBackend (development)\n * - RedisBackend (production)\n * - TemporalAdapter (enterprise)\n * - InngestAdapter (serverless)\n * - CloudflareAdapter (edge)\n */\n\nimport type {\n ApprovalDecision,\n Checkpoint,\n PendingApproval,\n RunFilter,\n WorkflowJob,\n WorkflowRun,\n WorkflowStatus as _WorkflowStatus,\n} from \"../types.ts\";\n\n/**\n * Backend configuration options\n */\nexport interface BackendConfig {\n /** Connection URL (for Redis, Postgres, etc.) */\n url?: string;\n /** Key prefix for namespacing */\n prefix?: string;\n /** Default TTL for runs (in milliseconds) */\n defaultTtl?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Lock information for distributed execution\n */\nexport interface Lock {\n /** Lock identifier */\n lockId: string;\n /** Run ID that owns the lock */\n runId: string;\n /** When lock was acquired */\n acquiredAt: Date;\n /** When lock expires */\n expiresAt: Date;\n}\n\n/**\n * Workflow backend interface\n *\n * All backend implementations must implement this interface.\n * Optional methods (marked with ?) can be omitted for simpler backends.\n */\nexport interface WorkflowBackend {\n // =========================================================================\n // Run Management\n // =========================================================================\n\n /**\n * Create a new workflow run\n */\n createRun(run: WorkflowRun): Promise<void>;\n\n /**\n * Get a workflow run by ID\n */\n getRun(runId: string): Promise<WorkflowRun | null>;\n\n /**\n * Update a workflow run\n */\n updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void>;\n\n /**\n * Delete a workflow run\n */\n deleteRun?(runId: string): Promise<void>;\n\n /**\n * List workflow runs with optional filters\n */\n listRuns(filter: RunFilter): Promise<WorkflowRun[]>;\n\n /**\n * Count workflow runs matching filter\n */\n countRuns?(filter: RunFilter): Promise<number>;\n\n // =========================================================================\n // Checkpointing\n // =========================================================================\n\n /**\n * Save a checkpoint for a workflow run\n */\n saveCheckpoint(runId: string, checkpoint: Checkpoint): Promise<void>;\n\n /**\n * Get the latest checkpoint for a workflow run\n */\n getLatestCheckpoint(runId: string): Promise<Checkpoint | null>;\n\n /**\n * Get all checkpoints for a workflow run\n */\n getCheckpoints?(runId: string): Promise<Checkpoint[]>;\n\n /**\n * Delete a specific checkpoint\n */\n deleteCheckpoint?(runId: string, checkpointId: string): Promise<void>;\n\n /**\n * Delete multiple checkpoints by ID\n */\n deleteCheckpoints?(runId: string, checkpointIds: string[]): Promise<void>;\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n /**\n * Save a pending approval request\n */\n savePendingApproval(\n runId: string,\n approval: PendingApproval,\n ): Promise<void>;\n\n /**\n * Get all pending approvals for a workflow run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]>;\n\n /**\n * Get a specific pending approval\n */\n getPendingApproval?(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null>;\n\n /**\n * Update an approval with a decision\n */\n updateApproval(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void>;\n\n /**\n * List all pending approvals across workflows\n */\n listPendingApprovals?(filter?: {\n workflowId?: string;\n approver?: string;\n status?: \"pending\" | \"expired\";\n }): Promise<Array<{ runId: string; approval: PendingApproval }>>;\n\n // =========================================================================\n // Queue Operations (optional - for distributed execution)\n // =========================================================================\n\n /**\n * Enqueue a workflow job for processing\n */\n enqueue?(job: WorkflowJob): Promise<void>;\n\n /**\n * Dequeue the next workflow job\n */\n dequeue?(): Promise<WorkflowJob | null>;\n\n /**\n * Acknowledge job completion\n */\n acknowledge?(runId: string): Promise<void>;\n\n /**\n * Negative acknowledge - return job to queue\n */\n nack?(runId: string): Promise<void>;\n\n // =========================================================================\n // Distributed Locking (optional - for distributed execution)\n // =========================================================================\n\n /**\n * Acquire a lock for exclusive workflow execution\n * Returns true if lock was acquired, false if already locked\n */\n acquireLock?(runId: string, duration: number): Promise<boolean>;\n\n /**\n * Release a lock\n */\n releaseLock?(runId: string): Promise<void>;\n\n /**\n * Extend lock duration\n */\n extendLock?(runId: string, duration: number): Promise<boolean>;\n\n /**\n * Check if a lock is held\n */\n isLocked?(runId: string): Promise<boolean>;\n\n // =========================================================================\n // Events (optional - for event-driven workflows)\n // =========================================================================\n\n /**\n * Publish an event that waiting workflows can receive\n */\n publishEvent?(\n eventName: string,\n payload: unknown,\n options?: {\n runId?: string; // Target specific run\n workflowId?: string; // Target specific workflow type\n },\n ): Promise<void>;\n\n /**\n * Subscribe to events for a workflow run\n * Returns an async iterator of events\n */\n subscribeEvents?(runId: string): AsyncIterable<{\n eventName: string;\n payload: unknown;\n timestamp: Date;\n }>;\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n /**\n * Initialize the backend (connect to database, etc.)\n */\n initialize?(): Promise<void>;\n\n /**\n * Check if the backend is healthy\n */\n healthCheck?(): Promise<boolean>;\n\n /**\n * Cleanup and close connections\n */\n destroy(): Promise<void>;\n}\n\n/**\n * Backend with queue capabilities\n * Type guard for checking if backend supports queueing\n */\nexport function hasQueueSupport(\n backend: WorkflowBackend,\n): backend is\n & WorkflowBackend\n & Required<Pick<WorkflowBackend, \"enqueue\" | \"dequeue\" | \"acknowledge\">> {\n return (\n typeof backend.enqueue === \"function\" &&\n typeof backend.dequeue === \"function\" &&\n typeof backend.acknowledge === \"function\"\n );\n}\n\n/**\n * Backend with locking capabilities\n * Type guard for checking if backend supports distributed locking\n */\nexport function hasLockSupport(\n backend: WorkflowBackend,\n): backend is WorkflowBackend & Required<Pick<WorkflowBackend, \"acquireLock\" | \"releaseLock\">> {\n return (\n typeof backend.acquireLock === \"function\" &&\n typeof backend.releaseLock === \"function\"\n );\n}\n\n/**\n * Backend with event capabilities\n * Type guard for checking if backend supports events\n */\nexport function hasEventSupport(\n backend: WorkflowBackend,\n): backend is\n & WorkflowBackend\n & Required<Pick<WorkflowBackend, \"publishEvent\" | \"subscribeEvents\">> {\n return (\n typeof backend.publishEvent === \"function\" &&\n typeof backend.subscribeEvents === \"function\"\n );\n}\n", "/**\n * Memory Workflow Backend\n *\n * In-memory implementation of WorkflowBackend for development and testing.\n * Data is NOT persisted across restarts.\n */\n\nimport type {\n ApprovalDecision,\n Checkpoint,\n PendingApproval,\n RunFilter,\n WorkflowJob,\n WorkflowRun,\n} from \"../types.ts\";\nimport type { BackendConfig, WorkflowBackend } from \"./types.ts\";\n\n/**\n * Memory backend configuration\n */\nexport interface MemoryBackendConfig extends BackendConfig {\n /** Maximum queue size (default: 10000) */\n maxQueueSize?: number;\n}\n\n/** Default max queue size */\nconst DEFAULT_MAX_QUEUE_SIZE = 10000;\n\n/**\n * In-memory workflow backend\n *\n * @example\n * ```typescript\n * import { MemoryBackend } from 'veryfront/ai/workflow/backends/memory';\n *\n * const backend = new MemoryBackend();\n * ```\n */\nexport class MemoryBackend implements WorkflowBackend {\n private runs = new Map<string, WorkflowRun>();\n private checkpoints = new Map<string, Checkpoint[]>();\n private approvals = new Map<string, PendingApproval[]>();\n private queue: WorkflowJob[] = [];\n private locks = new Map<string, { lockId: string; expiresAt: number }>();\n private config: MemoryBackendConfig;\n\n constructor(config: MemoryBackendConfig = {}) {\n this.config = {\n prefix: \"wf:\",\n debug: false,\n maxQueueSize: DEFAULT_MAX_QUEUE_SIZE,\n ...config,\n };\n }\n\n // =========================================================================\n // Run Management\n // =========================================================================\n\n createRun(run: WorkflowRun): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Creating run: ${run.id}`);\n }\n this.runs.set(run.id, structuredClone(run));\n return Promise.resolve();\n }\n\n getRun(runId: string): Promise<WorkflowRun | null> {\n const run = this.runs.get(runId);\n return Promise.resolve(run ? structuredClone(run) : null);\n }\n\n updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void> {\n const run = this.runs.get(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Updating run: ${runId}`, patch);\n }\n\n // Deep merge the patch\n const updated = {\n ...run,\n ...patch,\n // Deep merge specific fields\n nodeStates: { ...run.nodeStates, ...patch.nodeStates },\n context: { ...run.context, ...patch.context },\n };\n\n this.runs.set(runId, updated);\n return Promise.resolve();\n }\n\n deleteRun(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.checkpoints.delete(runId);\n this.approvals.delete(runId);\n return Promise.resolve();\n }\n\n listRuns(filter: RunFilter): Promise<WorkflowRun[]> {\n let runs = Array.from(this.runs.values());\n\n // Apply filters\n if (filter.workflowId) {\n runs = runs.filter((r) => r.workflowId === filter.workflowId);\n }\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n runs = runs.filter((r) => statuses.includes(r.status));\n }\n\n if (filter.createdAfter) {\n runs = runs.filter((r) => r.createdAt >= filter.createdAfter!);\n }\n\n if (filter.createdBefore) {\n runs = runs.filter((r) => r.createdAt <= filter.createdBefore!);\n }\n\n // Sort by creation date (newest first)\n runs.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n // Apply pagination (offset and limit together)\n const start = filter.offset ?? 0;\n const end = filter.limit ? start + filter.limit : undefined;\n runs = runs.slice(start, end);\n\n return Promise.resolve(runs.map((r) => structuredClone(r)));\n }\n\n async countRuns(filter: RunFilter): Promise<number> {\n const runs = await this.listRuns({ ...filter, limit: undefined, offset: undefined });\n return runs.length;\n }\n\n // =========================================================================\n // Checkpointing\n // =========================================================================\n\n saveCheckpoint(runId: string, checkpoint: Checkpoint): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Saving checkpoint: ${checkpoint.id} for run ${runId}`);\n }\n\n const existing = this.checkpoints.get(runId) || [];\n existing.push(structuredClone(checkpoint));\n this.checkpoints.set(runId, existing);\n return Promise.resolve();\n }\n\n getLatestCheckpoint(runId: string): Promise<Checkpoint | null> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints || checkpoints.length === 0) {\n return Promise.resolve(null);\n }\n\n // Return the most recent checkpoint\n const latest = checkpoints[checkpoints.length - 1];\n return Promise.resolve(latest ? structuredClone(latest) : null);\n }\n\n getCheckpoints(runId: string): Promise<Checkpoint[]> {\n const checkpoints = this.checkpoints.get(runId) || [];\n return Promise.resolve(checkpoints.map((c) => structuredClone(c)));\n }\n\n deleteCheckpoint(runId: string, checkpointId: string): Promise<void> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints) {\n return Promise.resolve();\n }\n\n const index = checkpoints.findIndex((c) => c.id === checkpointId);\n if (index !== -1) {\n checkpoints.splice(index, 1);\n if (this.config.debug) {\n console.log(`[MemoryBackend] Deleted checkpoint: ${checkpointId}`);\n }\n }\n return Promise.resolve();\n }\n\n deleteCheckpoints(runId: string, checkpointIds: string[]): Promise<void> {\n const checkpoints = this.checkpoints.get(runId);\n if (!checkpoints) {\n return Promise.resolve();\n }\n\n const idsToDelete = new Set(checkpointIds);\n const filtered = checkpoints.filter((c) => !idsToDelete.has(c.id));\n this.checkpoints.set(runId, filtered);\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Deleted ${checkpointIds.length} checkpoints`);\n }\n return Promise.resolve();\n }\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n savePendingApproval(\n runId: string,\n approval: PendingApproval,\n ): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Saving approval: ${approval.id} for run ${runId}`);\n }\n\n const existing = this.approvals.get(runId) || [];\n existing.push(structuredClone(approval));\n this.approvals.set(runId, existing);\n return Promise.resolve();\n }\n\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n const approvals = this.approvals.get(runId) || [];\n return Promise.resolve(\n approvals\n .filter((a) => a.status === \"pending\")\n .map((a) => structuredClone(a)),\n );\n }\n\n getPendingApproval(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null> {\n const approvals = this.approvals.get(runId) || [];\n const approval = approvals.find((a) => a.id === approvalId);\n return Promise.resolve(approval ? structuredClone(approval) : null);\n }\n\n updateApproval(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void> {\n const approvals = this.approvals.get(runId);\n if (!approvals) {\n throw new Error(`No approvals found for run: ${runId}`);\n }\n\n const approval = approvals.find((a) => a.id === approvalId);\n if (!approval) {\n throw new Error(`Approval not found: ${approvalId}`);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Updating approval: ${approvalId}`, decision);\n }\n\n approval.status = decision.approved ? \"approved\" : \"rejected\";\n approval.decidedBy = decision.approver;\n approval.decidedAt = new Date();\n approval.comment = decision.comment;\n return Promise.resolve();\n }\n\n listPendingApprovals(filter?: {\n workflowId?: string;\n approver?: string;\n status?: \"pending\" | \"expired\";\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n const result: Array<{ runId: string; approval: PendingApproval }> = [];\n\n for (const [runId, approvals] of this.approvals) {\n const run = this.runs.get(runId);\n if (!run) continue;\n\n if (filter?.workflowId && run.workflowId !== filter.workflowId) {\n continue;\n }\n\n for (const approval of approvals) {\n // Check status\n if (filter?.status === \"pending\" && approval.status !== \"pending\") {\n continue;\n }\n\n if (filter?.status === \"expired\") {\n const isExpired = approval.expiresAt && new Date() > approval.expiresAt;\n if (!isExpired) continue;\n }\n\n // Check approver\n if (\n filter?.approver &&\n approval.approvers &&\n !approval.approvers.includes(filter.approver)\n ) {\n continue;\n }\n\n result.push({ runId, approval: structuredClone(approval) });\n }\n }\n\n return Promise.resolve(result);\n }\n\n // =========================================================================\n // Queue Operations\n // =========================================================================\n\n enqueue(job: WorkflowJob): Promise<void> {\n // Check queue size limit\n const maxSize = this.config.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;\n if (this.queue.length >= maxSize) {\n return Promise.reject(\n new Error(`Queue full (max: ${maxSize}). Cannot enqueue job: ${job.runId}`),\n );\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Enqueueing job: ${job.runId}`);\n }\n\n // Insert based on priority (higher priority first)\n const priority = job.priority ?? 0;\n const insertIndex = this.queue.findIndex((j) => (j.priority ?? 0) < priority);\n\n if (insertIndex === -1) {\n this.queue.push(structuredClone(job));\n } else {\n this.queue.splice(insertIndex, 0, structuredClone(job));\n }\n return Promise.resolve();\n }\n\n dequeue(): Promise<WorkflowJob | null> {\n const job = this.queue.shift();\n return Promise.resolve(job ? structuredClone(job) : null);\n }\n\n acknowledge(runId: string): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Acknowledging job: ${runId}`);\n }\n // For memory backend, acknowledgment is a no-op\n // The job is already removed from queue on dequeue\n return Promise.resolve();\n }\n\n async nack(runId: string): Promise<void> {\n // Re-enqueue the job\n const run = await this.getRun(runId);\n if (run) {\n await this.enqueue({\n runId: run.id,\n workflowId: run.workflowId,\n input: run.input,\n createdAt: new Date(),\n });\n }\n }\n\n // =========================================================================\n // Distributed Locking\n // =========================================================================\n\n acquireLock(runId: string, duration: number): Promise<boolean> {\n const existing = this.locks.get(runId);\n const now = Date.now();\n\n // If lock exists and hasn't expired, fail to acquire\n if (existing && existing.expiresAt > now) {\n return Promise.resolve(false);\n }\n\n if (this.config.debug) {\n console.log(`[MemoryBackend] Acquiring lock for: ${runId}`);\n }\n\n this.locks.set(runId, {\n lockId: crypto.randomUUID(),\n expiresAt: now + duration,\n });\n\n return Promise.resolve(true);\n }\n\n releaseLock(runId: string): Promise<void> {\n if (this.config.debug) {\n console.log(`[MemoryBackend] Releasing lock for: ${runId}`);\n }\n this.locks.delete(runId);\n return Promise.resolve();\n }\n\n extendLock(runId: string, duration: number): Promise<boolean> {\n const existing = this.locks.get(runId);\n const now = Date.now();\n\n if (!existing || existing.expiresAt <= now) {\n return Promise.resolve(false);\n }\n\n existing.expiresAt = now + duration;\n return Promise.resolve(true);\n }\n\n isLocked(runId: string): Promise<boolean> {\n const existing = this.locks.get(runId);\n return Promise.resolve(!!existing && existing.expiresAt > Date.now());\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n initialize(): Promise<void> {\n if (this.config.debug) {\n console.log(\"[MemoryBackend] Initialized\");\n }\n return Promise.resolve();\n }\n\n healthCheck(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n destroy(): Promise<void> {\n this.runs.clear();\n this.checkpoints.clear();\n this.approvals.clear();\n this.queue = [];\n this.locks.clear();\n\n if (this.config.debug) {\n console.log(\"[MemoryBackend] Destroyed\");\n }\n return Promise.resolve();\n }\n\n // =========================================================================\n // Development Helpers\n // =========================================================================\n\n /**\n * Get statistics about the backend (for debugging)\n */\n getStats(): {\n runs: number;\n checkpoints: number;\n approvals: number;\n queueLength: number;\n locks: number;\n } {\n let totalCheckpoints = 0;\n let totalApprovals = 0;\n\n for (const checkpoints of this.checkpoints.values()) {\n totalCheckpoints += checkpoints.length;\n }\n\n for (const approvals of this.approvals.values()) {\n totalApprovals += approvals.length;\n }\n\n return {\n runs: this.runs.size,\n checkpoints: totalCheckpoints,\n approvals: totalApprovals,\n queueLength: this.queue.length,\n locks: this.locks.size,\n };\n }\n\n /**\n * Clear all data (for testing)\n */\n clear(): Promise<void> {\n this.runs.clear();\n this.checkpoints.clear();\n this.approvals.clear();\n this.queue = [];\n this.locks.clear();\n return Promise.resolve();\n }\n}\n", "/**\n * DAG Executor\n *\n * Executes workflow DAGs with proper dependency ordering and parallel execution\n */\n\nimport type {\n BranchNodeConfig,\n Checkpoint,\n LoopExecutionContext,\n LoopNodeConfig,\n MapNodeConfig,\n NodeState,\n ParallelNodeConfig,\n SubWorkflowNodeConfig,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n WorkflowNodeConfig,\n WorkflowRun,\n} from \"../types.ts\";\nimport { generateId } from \"../types.ts\";\nimport type { StepExecutor } from \"./step-executor.ts\";\nimport type { CheckpointManager } from \"./checkpoint-manager.ts\";\n\n/**\n * DAG executor configuration\n */\nexport interface DAGExecutorConfig {\n /** Step executor for running individual steps */\n stepExecutor: StepExecutor;\n /** Checkpoint manager for durability */\n checkpointManager?: CheckpointManager;\n /** Maximum concurrent parallel executions */\n maxConcurrency?: number;\n /** Callback when node execution starts */\n onNodeStart?: (nodeId: string) => void;\n /** Callback when node execution completes */\n onNodeComplete?: (nodeId: string, state: NodeState) => void;\n /** Callback when waiting for approval/event */\n onWaiting?: (nodeId: string, waitConfig: WaitNodeConfig) => void;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Result of DAG execution\n */\nexport interface DAGExecutionResult {\n /** Whether the DAG completed successfully */\n completed: boolean;\n /** Whether the DAG is waiting (for approval/event) */\n waiting: boolean;\n /** Node that is waiting (if waiting) */\n waitingNode?: string;\n /** Final context after execution */\n context: WorkflowContext;\n /** Final node states */\n nodeStates: Record<string, NodeState>;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * DAG Executor class\n *\n * Responsible for executing workflow DAGs with:\n * - Topological ordering for dependencies\n * - Parallel execution of independent nodes\n * - Support for branching and conditional logic\n * - Checkpointing for durability\n */\nexport class DAGExecutor {\n private config: DAGExecutorConfig;\n\n constructor(config: DAGExecutorConfig) {\n this.config = {\n maxConcurrency: 10,\n debug: false,\n ...config,\n };\n }\n\n /**\n * Execute a workflow DAG\n */\n async execute(\n nodes: WorkflowNode[],\n run: WorkflowRun,\n startFromNode?: string,\n ): Promise<DAGExecutionResult> {\n const context = { ...run.context };\n const nodeStates = { ...run.nodeStates };\n\n // Build dependency graph\n const { adjList, inDegree, nodeMap } = this.buildGraph(nodes);\n\n // Update in-degrees for nodes whose dependencies are already completed\n // This handles resuming from checkpoints\n for (const [nodeId, state] of Object.entries(nodeStates)) {\n if (state.status === \"completed\" || state.status === \"skipped\") {\n // Decrement in-degree for all dependents of this completed node\n for (const dependent of adjList.get(nodeId) || []) {\n const currentDegree = inDegree.get(dependent) ?? 0;\n if (currentDegree > 0) {\n inDegree.set(dependent, currentDegree - 1);\n }\n }\n }\n }\n\n // Validate DAG (no cycles)\n if (this.hasCycle(nodes, adjList)) {\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: \"Workflow DAG contains cycles\",\n };\n }\n\n // Find starting nodes\n let ready: string[];\n if (startFromNode) {\n // Resume from specific node\n ready = [startFromNode];\n } else {\n // Start from nodes with no dependencies that haven't been completed\n ready = this.getReadyNodes(inDegree, nodeStates);\n }\n\n // Execute nodes in topological order\n while (ready.length > 0) {\n // Execute ready nodes in parallel (respecting max concurrency)\n const batch = ready.slice(0, this.config.maxConcurrency);\n ready = ready.slice(this.config.maxConcurrency);\n\n const results = await Promise.allSettled(\n batch.map((nodeId) => this.executeNode(nodeMap.get(nodeId)!, context, nodeStates)),\n );\n\n // Process results\n for (let i = 0; i < batch.length; i++) {\n const nodeId = batch[i]!;\n const result = results[i]!;\n\n if (result.status === \"fulfilled\") {\n const nodeResult = result.value;\n\n // Update node state\n nodeStates[nodeId] = nodeResult.state;\n Object.assign(context, nodeResult.contextUpdates);\n\n // Handle waiting state\n if (nodeResult.waiting) {\n return {\n completed: false,\n waiting: true,\n waitingNode: nodeId,\n context,\n nodeStates,\n };\n }\n\n // Checkpoint if configured\n const nodeConfig = nodeMap.get(nodeId);\n if (\n nodeResult.state.status === \"completed\" &&\n nodeConfig && this.shouldCheckpoint(nodeConfig)\n ) {\n await this.checkpoint(run.id, nodeId, context, nodeStates);\n }\n\n // Check if node failed (step returned success: false)\n if (nodeResult.state.status === \"failed\") {\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: `Node \"${nodeId}\" failed: ${nodeResult.state.error || \"Unknown error\"}`,\n };\n }\n\n // Update ready nodes based on completed dependencies\n if (nodeResult.state.status === \"completed\" || nodeResult.state.status === \"skipped\") {\n for (const dependent of adjList.get(nodeId) || []) {\n const newDegree = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDegree);\n }\n }\n } else {\n // Node execution failed\n const error = result.reason instanceof Error\n ? result.reason.message\n : String(result.reason);\n\n nodeStates[nodeId] = {\n nodeId,\n status: \"failed\",\n error,\n attempt: (nodeStates[nodeId]?.attempt || 0) + 1,\n completedAt: new Date(),\n };\n\n // Fail fast - don't continue with other nodes\n return {\n completed: false,\n waiting: false,\n context,\n nodeStates,\n error: `Node \"${nodeId}\" failed: ${error}`,\n };\n }\n }\n\n // Get newly ready nodes\n const newReady = this.getReadyNodes(inDegree, nodeStates);\n ready = [...ready, ...newReady];\n }\n\n return {\n completed: true,\n waiting: false,\n context,\n nodeStates,\n };\n }\n\n /**\n * Execute a single node\n */\n private async executeNode(\n node: WorkflowNode,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const nodeId = node.id;\n\n // Check if node is already completed (resuming from checkpoint)\n const existingState = nodeStates[nodeId];\n if (existingState?.status === \"completed\") {\n return { state: existingState, contextUpdates: {}, waiting: false };\n }\n\n this.config.onNodeStart?.(nodeId);\n\n // Check if should skip\n if (node.config.skip && (await node.config.skip(context))) {\n const state = this.config.stepExecutor.createSkippedState(nodeId);\n this.config.onNodeComplete?.(nodeId, state);\n return { state, contextUpdates: {}, waiting: false };\n }\n\n // Execute based on node type\n const config = node.config;\n\n switch (config.type) {\n case \"step\":\n return await this.executeStepNode(node, context);\n\n case \"parallel\":\n return await this.executeParallelNode(node, config, context, nodeStates);\n\n case \"map\":\n return await this.executeMapNode(node, config as MapNodeConfig, context, nodeStates);\n\n case \"branch\":\n return await this.executeBranchNode(node, config as BranchNodeConfig, context, nodeStates);\n\n case \"wait\":\n return await this.executeWaitNode(node, config as WaitNodeConfig, context);\n\n case \"subWorkflow\":\n return await this.executeSubWorkflowNode(\n node,\n config as SubWorkflowNodeConfig,\n context,\n nodeStates,\n );\n\n case \"loop\":\n return await this.executeLoopNode(\n node,\n config as LoopNodeConfig,\n context,\n nodeStates,\n );\n\n default:\n throw new Error(\n `Unknown node type \"${(config as WorkflowNodeConfig).type}\" for node \"${node.id}\". ` +\n `Valid types are: step, parallel, map, branch, wait, subWorkflow, loop`,\n );\n }\n }\n\n /**\n * Execute a map node (dynamic fan-out)\n */\n private async executeMapNode(\n node: WorkflowNode,\n config: MapNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // 1. Resolve items collection\n const items = typeof config.items === \"function\" ? await config.items(context) : config.items;\n\n if (!Array.isArray(items)) {\n throw new Error(`Map node \"${node.id}\" items must be an array`);\n }\n\n if (items.length === 0) {\n // Empty collection, done immediately\n const state: NodeState = {\n nodeId: node.id,\n status: \"completed\",\n output: [],\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: new Date(),\n };\n return { state, contextUpdates: { [node.id]: [] }, waiting: false };\n }\n\n // 2. Generate child nodes for each item\n const childNodes: WorkflowNode[] = [];\n\n // Check if processor is a WorkflowDefinition or a single node\n const isWorkflowDef = (p: any): p is WorkflowDefinition => !!p.steps;\n\n // We'll map each item to a set of nodes\n // For simplicity in this implementation, if processor is a single node, we clone it.\n // If it's a workflow def, we'd need to expand it (similar to subworkflow).\n // Here we assume it's a single node structure for the \"map\" pattern or a simple chain.\n // To support complex subworkflows per item, best to wrap in a SubWorkflowNode.\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const childId = `${node.id}_${i}`;\n\n let childNode: WorkflowNode;\n\n if (isWorkflowDef(config.processor)) {\n // Create a SubWorkflow node for this item\n childNode = {\n id: childId,\n config: {\n type: \"subWorkflow\",\n workflow: config.processor,\n input: item,\n retry: config.retry,\n checkpoint: false, // Don't checkpoint individual map items by default\n } as SubWorkflowNodeConfig,\n };\n } else {\n // Clone the single processor node\n // We must override the input to be the current item\n const processorConfig = { ...config.processor.config } as any;\n\n // If it's a step node, ensure input receives the item\n if (processorConfig.type === \"step\") {\n processorConfig.input = item;\n }\n\n childNode = {\n id: childId,\n config: processorConfig,\n };\n }\n\n childNodes.push(childNode);\n }\n\n // 3. Execute child nodes\n // We use a temporary DAG execution for these nodes\n // The maxConcurrency from config overrides default\n const originalConcurrency = this.config.maxConcurrency;\n if (config.concurrency) {\n this.config.maxConcurrency = config.concurrency;\n }\n\n try {\n const result = await this.execute(childNodes, {\n id: `${node.id}_map`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {}, // Start fresh for map iteration\n currentNodes: [],\n context: { ...context }, // Pass copy of context so they can read global state\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states into parent for visibility\n Object.assign(nodeStates, result.nodeStates);\n\n // Collect outputs in order\n const outputs = childNodes.map((child) => {\n const childState = result.nodeStates[child.id];\n return childState?.output;\n });\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: outputs,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.completed ? { [node.id]: outputs } : {},\n waiting: result.waiting,\n };\n } finally {\n // Restore concurrency setting\n this.config.maxConcurrency = originalConcurrency!;\n }\n }\n\n /**\n * Execute a sub-workflow node\n */\n private async executeSubWorkflowNode(\n node: WorkflowNode,\n config: SubWorkflowNodeConfig,\n context: WorkflowContext,\n _nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // 1. Resolve workflow definition\n let workflowDef: WorkflowDefinition;\n if (typeof config.workflow === \"string\") {\n throw new Error(\n \"Resolving workflow by ID is not yet supported in this execution context. Pass the WorkflowDefinition object.\",\n );\n } else {\n workflowDef = config.workflow;\n }\n\n // 2. Resolve input\n const input = typeof config.input === \"function\"\n ? await config.input(context)\n : (config.input ?? context.input);\n\n // 3. Expand steps (handle dynamic steps builder)\n let steps: WorkflowNode[];\n if (typeof workflowDef.steps === \"function\") {\n steps = workflowDef.steps({\n input,\n context,\n });\n } else {\n steps = workflowDef.steps;\n }\n\n // 4. Execute sub-workflow\n // We create a new isolated run context for the subworkflow\n const subRunId = `${node.id}_sub_${generateId()}`;\n\n // Execute recursively\n const result = await this.execute(steps, {\n id: subRunId,\n workflowId: workflowDef.id,\n status: \"running\",\n input,\n nodeStates: {},\n currentNodes: [],\n context: {\n input, // Subworkflow starts with fresh context scoped to its input\n // We do NOT inherit parent context to ensure isolation,\n // unless explicitly passed via input.\n },\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // 5. Process result\n let finalOutput = result.context; // Default output is the final context\n\n // If sub-workflow has explicit output transformation\n if (result.completed && config.output) {\n finalOutput = config.output(result.context) as any;\n }\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: finalOutput,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.completed ? { [node.id]: finalOutput } : {},\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a loop node\n */\n private async executeLoopNode(\n node: WorkflowNode,\n config: LoopNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n const previousResults: unknown[] = [];\n let iteration = 0;\n let exitReason: \"condition\" | \"maxIterations\" | \"error\" = \"condition\";\n let lastError: string | undefined;\n\n // Check for resumed loop state\n const existingLoopState = context[`${node.id}_loop_state`] as {\n iteration: number;\n previousResults: unknown[];\n } | undefined;\n\n if (existingLoopState) {\n iteration = existingLoopState.iteration;\n previousResults.push(...existingLoopState.previousResults);\n }\n\n while (iteration < config.maxIterations) {\n const loopContext: LoopExecutionContext = {\n iteration,\n totalIterations: iteration,\n previousResults: [...previousResults],\n isFirstIteration: iteration === 0,\n isLastAllowedIteration: iteration === config.maxIterations - 1,\n };\n\n // Check while condition\n const shouldContinue = await config.while(context, loopContext);\n if (!shouldContinue) {\n exitReason = \"condition\";\n break;\n }\n\n // Get steps for this iteration\n const steps = typeof config.steps === \"function\"\n ? config.steps(context, loopContext)\n : config.steps;\n\n // Execute iteration steps\n const result = await this.execute(steps, {\n id: `${node.id}_iter_${iteration}`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {},\n currentNodes: [],\n context: { ...context, _loop: loopContext },\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Handle waiting state (e.g., waitForApproval within loop)\n if (result.waiting) {\n Object.assign(nodeStates, result.nodeStates);\n\n const state: NodeState = {\n nodeId: node.id,\n status: \"running\",\n output: {\n iteration,\n waiting: true,\n previousResults,\n },\n attempt: 1,\n startedAt: new Date(startTime),\n };\n\n return {\n state,\n contextUpdates: {\n ...result.context,\n [`${node.id}_loop_state`]: { iteration, previousResults },\n },\n waiting: true,\n };\n }\n\n // Handle error\n if (result.error) {\n lastError = result.error;\n exitReason = \"error\";\n break;\n }\n\n // Store iteration result and merge context\n previousResults.push(result.context);\n Object.assign(context, result.context);\n Object.assign(nodeStates, result.nodeStates);\n\n // Apply delay between iterations\n if (config.delay && iteration < config.maxIterations - 1) {\n const delayMs = typeof config.delay === \"number\"\n ? config.delay\n : this.parseDuration(config.delay);\n await this.sleep(delayMs);\n }\n\n iteration++;\n }\n\n // Check if we hit max iterations\n if (iteration >= config.maxIterations && exitReason !== \"condition\") {\n exitReason = \"maxIterations\";\n }\n\n // Build final loop context\n const finalLoopContext: LoopExecutionContext = {\n iteration,\n totalIterations: iteration,\n previousResults,\n isFirstIteration: false,\n isLastAllowedIteration: true,\n };\n\n // Call appropriate completion handler\n let completionUpdates: Record<string, unknown> = {};\n if (exitReason === \"maxIterations\" && config.onMaxIterations) {\n completionUpdates = await config.onMaxIterations(context, finalLoopContext);\n } else if (exitReason === \"condition\" && config.onComplete) {\n completionUpdates = await config.onComplete(context, finalLoopContext);\n }\n\n const output = {\n exitReason,\n iterations: iteration,\n previousResults,\n ...completionUpdates,\n };\n\n const state: NodeState = {\n nodeId: node.id,\n status: exitReason === \"error\" ? \"failed\" : \"completed\",\n output,\n error: lastError,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: new Date(),\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: {\n [node.id]: output,\n ...completionUpdates,\n },\n waiting: false,\n };\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string | number): number {\n if (typeof duration === \"number\") return duration;\n\n const match = duration.match(/^(\\d+)(ms|s|m|h|d)$/);\n if (!match) return 0;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2];\n\n switch (unit) {\n case \"ms\":\n return value;\n case \"s\":\n return value * 1000;\n case \"m\":\n return value * 60 * 1000;\n case \"h\":\n return value * 60 * 60 * 1000;\n case \"d\":\n return value * 24 * 60 * 60 * 1000;\n default:\n return 0;\n }\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Execute a step node\n */\n private async executeStepNode(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const result = await this.config.stepExecutor.execute(node, context);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.success ? \"completed\" : \"failed\",\n input: context.input,\n output: result.output,\n error: result.error,\n attempt: 1,\n startedAt: new Date(Date.now() - result.executionTime),\n completedAt: new Date(),\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.success ? { [node.id]: result.output } : {},\n waiting: false,\n };\n }\n\n /**\n * Execute a parallel node\n */\n private async executeParallelNode(\n node: WorkflowNode,\n config: ParallelNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // Execute child nodes using DAG executor recursively\n const result = await this.execute(config.nodes, {\n id: `${node.id}_parallel`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {},\n currentNodes: [],\n context,\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states\n Object.assign(nodeStates, result.nodeStates);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: result.context,\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.context,\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a branch node\n */\n private async executeBranchNode(\n node: WorkflowNode,\n config: BranchNodeConfig,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n const startTime = Date.now();\n\n // Evaluate condition\n const conditionResult = await config.condition(context);\n\n // Select branch to execute\n const branchNodes = conditionResult ? config.then : (config.else || []);\n\n if (branchNodes.length === 0) {\n // No nodes to execute\n const state: NodeState = {\n nodeId: node.id,\n status: \"completed\",\n output: { branch: conditionResult ? \"then\" : \"else\", skipped: true },\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: new Date(),\n };\n\n return { state, contextUpdates: {}, waiting: false };\n }\n\n // Execute branch nodes\n const result = await this.execute(branchNodes, {\n id: `${node.id}_branch`,\n workflowId: \"\",\n status: \"running\",\n input: context.input,\n nodeStates: {},\n currentNodes: [],\n context,\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n });\n\n // Merge child node states\n Object.assign(nodeStates, result.nodeStates);\n\n const state: NodeState = {\n nodeId: node.id,\n status: result.completed ? \"completed\" : (result.waiting ? \"running\" : \"failed\"),\n output: {\n branch: conditionResult ? \"then\" : \"else\",\n result: result.context,\n },\n error: result.error,\n attempt: 1,\n startedAt: new Date(startTime),\n completedAt: result.completed ? new Date() : undefined,\n };\n\n this.config.onNodeComplete?.(node.id, state);\n\n return {\n state,\n contextUpdates: result.context,\n waiting: result.waiting,\n };\n }\n\n /**\n * Execute a wait node (approval or event)\n */\n private async executeWaitNode(\n node: WorkflowNode,\n config: WaitNodeConfig,\n context: WorkflowContext,\n ): Promise<{\n state: NodeState;\n contextUpdates: Record<string, unknown>;\n waiting: boolean;\n }> {\n // Notify that we're waiting\n this.config.onWaiting?.(node.id, config);\n\n const state: NodeState = {\n nodeId: node.id,\n status: \"running\",\n input: {\n type: config.waitType,\n message: config.message,\n payload: typeof config.payload === \"function\"\n ? await config.payload(context)\n : config.payload,\n },\n attempt: 1,\n startedAt: new Date(),\n };\n\n // Signal that workflow is now waiting\n return {\n state,\n contextUpdates: {},\n waiting: true,\n };\n }\n\n /**\n * Build dependency graph from nodes\n */\n private buildGraph(nodes: WorkflowNode[]): {\n adjList: Map<string, string[]>;\n inDegree: Map<string, number>;\n nodeMap: Map<string, WorkflowNode>;\n } {\n const adjList = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n const nodeMap = new Map<string, WorkflowNode>();\n\n // Initialize\n for (const node of nodes) {\n adjList.set(node.id, []);\n inDegree.set(node.id, 0);\n nodeMap.set(node.id, node);\n }\n\n // Build edges from dependencies\n for (const node of nodes) {\n for (const dep of node.dependsOn || []) {\n if (!adjList.has(dep)) {\n throw new Error(\n `Node \"${node.id}\" depends on unknown node \"${dep}\"`,\n );\n }\n adjList.get(dep)!.push(node.id);\n inDegree.set(node.id, inDegree.get(node.id)! + 1);\n }\n }\n\n // Also handle implicit sequential dependencies (nodes without explicit deps)\n // If no dependencies specified (undefined), assume sequential order\n // If dependsOn is explicitly set (even to []), respect that choice\n let prevNodeId: string | null = null;\n for (const node of nodes) {\n // Only add implicit deps if:\n // 1. dependsOn is undefined (not explicitly set)\n // 2. No other node explicitly depends on this node\n // 3. This node has no incoming edges yet\n if (node.dependsOn === undefined && prevNodeId) {\n const isDependent = this.hasAnyDependents(nodes, node.id);\n const currentInDegree = inDegree.get(node.id) ?? 0;\n\n if (!isDependent && currentInDegree === 0) {\n // This node is \"floating\" - no explicit deps and nothing depends on it\n // Create implicit dependency on previous node\n adjList.get(prevNodeId)!.push(node.id);\n inDegree.set(node.id, inDegree.get(node.id)! + 1);\n }\n }\n prevNodeId = node.id;\n }\n\n return { adjList, inDegree, nodeMap };\n }\n\n /**\n * Check if any node explicitly depends on the given node\n */\n private hasAnyDependents(nodes: WorkflowNode[], nodeId: string): boolean {\n return nodes.some((n) => n.dependsOn?.includes(nodeId));\n }\n\n /**\n * Get nodes that are ready to execute\n */\n private getReadyNodes(\n inDegree: Map<string, number>,\n nodeStates: Record<string, NodeState>,\n ): string[] {\n const ready: string[] = [];\n\n for (const [nodeId, degree] of inDegree) {\n // Node is ready if:\n // 1. No remaining dependencies (in-degree = 0)\n // 2. Not already completed/running/failed\n const state = nodeStates[nodeId];\n const isReady = degree === 0 &&\n (!state || state.status === \"pending\");\n\n if (isReady) {\n ready.push(nodeId);\n }\n }\n\n return ready;\n }\n\n /**\n * Check if DAG has cycles (using DFS)\n */\n private hasCycle(\n nodes: WorkflowNode[],\n adjList: Map<string, string[]>,\n ): boolean {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (nodeId: string): boolean => {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n\n for (const neighbor of adjList.get(nodeId) || []) {\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true;\n } else if (recursionStack.has(neighbor)) {\n return true;\n }\n }\n\n recursionStack.delete(nodeId);\n return false;\n };\n\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n if (dfs(node.id)) return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if node should be checkpointed\n */\n private shouldCheckpoint(node: WorkflowNode): boolean {\n return node.config.checkpoint ?? false;\n }\n\n /**\n * Create a checkpoint\n */\n private async checkpoint(\n runId: string,\n nodeId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n if (!this.config.checkpointManager) {\n return;\n }\n\n const checkpoint: Checkpoint = {\n id: generateId(\"cp\"),\n nodeId,\n timestamp: new Date(),\n context: structuredClone(context),\n nodeStates: structuredClone(nodeStates),\n };\n\n await this.config.checkpointManager.save(runId, checkpoint);\n }\n}\n", "/**\n * Checkpoint Manager\n *\n * Handles workflow state checkpointing for durability and resume\n */\n\nimport type { Checkpoint, NodeState, WorkflowContext, WorkflowNode } from \"../types.ts\";\nimport { generateId } from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\n\n/**\n * Checkpoint manager configuration\n */\nexport interface CheckpointManagerConfig {\n /** Backend for persisting checkpoints */\n backend: WorkflowBackend;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Resume information returned when resuming from checkpoint\n */\nexport interface ResumeInfo {\n /** Checkpoint to resume from */\n checkpoint: Checkpoint;\n /** Node to start execution from */\n startFromNode: string;\n /** Restored context */\n context: WorkflowContext;\n /** Restored node states */\n nodeStates: Record<string, NodeState>;\n}\n\n/**\n * Checkpoint Manager class\n *\n * Responsible for:\n * - Saving checkpoints after step completion\n * - Loading checkpoints for resume\n * - Determining resume points\n */\nexport class CheckpointManager {\n private config: CheckpointManagerConfig;\n\n constructor(config: CheckpointManagerConfig) {\n this.config = {\n debug: false,\n ...config,\n };\n }\n\n /**\n * Save a checkpoint for a workflow run\n */\n async save(runId: string, checkpoint: Checkpoint): Promise<void> {\n if (this.config.debug) {\n console.log(`[CheckpointManager] Saving checkpoint ${checkpoint.id} for run ${runId}`);\n }\n\n await this.config.backend.saveCheckpoint(runId, checkpoint);\n }\n\n /**\n * Create and save a checkpoint\n */\n async createCheckpoint(\n runId: string,\n nodeId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<Checkpoint> {\n const checkpoint: Checkpoint = {\n id: generateId(\"cp\"),\n nodeId,\n timestamp: new Date(),\n context: structuredClone(context),\n nodeStates: structuredClone(nodeStates),\n };\n\n await this.save(runId, checkpoint);\n\n return checkpoint;\n }\n\n /**\n * Get the latest checkpoint for a workflow run\n */\n async getLatest(runId: string): Promise<Checkpoint | null> {\n return await this.config.backend.getLatestCheckpoint(runId);\n }\n\n /**\n * Get all checkpoints for a workflow run\n */\n async getAll(runId: string): Promise<Checkpoint[]> {\n if (this.config.backend.getCheckpoints) {\n return await this.config.backend.getCheckpoints(runId);\n }\n\n // Fallback: just return latest if getCheckpoints not implemented\n const latest = await this.getLatest(runId);\n return latest ? [latest] : [];\n }\n\n /**\n * Prepare resume information from a checkpoint\n */\n async prepareResume(\n runId: string,\n nodes: WorkflowNode[],\n fromCheckpoint?: string,\n ): Promise<ResumeInfo | null> {\n let checkpoint: Checkpoint | null;\n\n if (fromCheckpoint) {\n // Find specific checkpoint\n const all = await this.getAll(runId);\n checkpoint = all.find((c) => c.id === fromCheckpoint) || null;\n } else {\n // Use latest checkpoint\n checkpoint = await this.getLatest(runId);\n }\n\n if (!checkpoint) {\n return null;\n }\n\n // Find next node to execute after checkpoint\n const startFromNode = this.findNextNode(nodes, checkpoint);\n\n if (!startFromNode) {\n // No more nodes to execute\n return null;\n }\n\n return {\n checkpoint,\n startFromNode,\n context: structuredClone(checkpoint.context),\n nodeStates: structuredClone(checkpoint.nodeStates),\n };\n }\n\n /**\n * Find the next node to execute after a checkpoint\n */\n private findNextNode(\n nodes: WorkflowNode[],\n checkpoint: Checkpoint,\n ): string | null {\n const completedNodeId = checkpoint.nodeId;\n const nodeStates = checkpoint.nodeStates;\n\n // Build node lookup\n const nodeIndex = new Map<string, number>();\n nodes.forEach((node, index) => nodeIndex.set(node.id, index));\n\n // Find the checkpoint node's position\n const checkpointIndex = nodeIndex.get(completedNodeId);\n if (checkpointIndex === undefined) {\n // Checkpoint node not found, start from beginning\n const firstNode = nodes[0];\n return firstNode?.id ?? null;\n }\n\n // Look for the first incomplete node after the checkpoint\n for (let i = checkpointIndex + 1; i < nodes.length; i++) {\n const node = nodes[i];\n if (!node) continue;\n\n const state = nodeStates[node.id];\n\n // Find first node that hasn't completed\n if (!state || state.status === \"pending\") {\n return node.id;\n }\n }\n\n // Also check nodes that depend on the checkpoint node\n for (const node of nodes) {\n if (node.dependsOn?.includes(completedNodeId)) {\n const state = nodeStates[node.id];\n if (!state || state.status === \"pending\") {\n return node.id;\n }\n }\n }\n\n // No incomplete nodes found\n return null;\n }\n\n /**\n * Determine if a node should be checkpointed\n */\n shouldCheckpoint(node: WorkflowNode): boolean {\n const config = node.config;\n\n // Explicit checkpoint configuration\n if (config.checkpoint !== undefined) {\n return config.checkpoint;\n }\n\n // Default checkpointing rules:\n // - Always checkpoint after agent steps\n // - Always checkpoint before wait/approval\n // - Checkpoint after parallel completion\n switch (config.type) {\n case \"step\":\n // Checkpoint agent steps, but not tool steps by default\n return \"agent\" in config && !!config.agent;\n\n case \"wait\":\n // Always checkpoint before waiting\n return true;\n\n case \"parallel\":\n // Checkpoint after all parallel steps complete\n return true;\n\n case \"branch\":\n // Don't checkpoint branches by default\n return false;\n\n case \"subWorkflow\":\n // Always checkpoint after sub-workflow\n return true;\n\n default:\n return false;\n }\n }\n\n /**\n * Clean up old checkpoints (keep only the most recent N)\n */\n async cleanup(runId: string, keepCount: number = 5): Promise<void> {\n const all = await this.getAll(runId);\n\n if (all.length <= keepCount) {\n return;\n }\n\n // Sort by timestamp (newest first)\n all.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n // Get checkpoints to delete (all except the newest keepCount)\n const toDelete = all.slice(keepCount);\n const idsToDelete = toDelete.map((c) => c.id);\n\n if (idsToDelete.length === 0) {\n return;\n }\n\n if (this.config.debug) {\n console.log(\n `[CheckpointManager] Cleaning up ${idsToDelete.length} old checkpoints for run ${runId}`,\n );\n }\n\n // Use batch delete if available, otherwise delete one by one\n if (this.config.backend.deleteCheckpoints) {\n await this.config.backend.deleteCheckpoints(runId, idsToDelete);\n } else if (this.config.backend.deleteCheckpoint) {\n for (const id of idsToDelete) {\n await this.config.backend.deleteCheckpoint(runId, id);\n }\n }\n // If neither method is available, cleanup is a no-op\n }\n}\n", "/**\n * Step Executor\n *\n * Executes individual workflow steps (agents and tools)\n */\n\nimport type { Agent, AgentResponse } from \"../../types/agent.ts\";\nimport type { Tool } from \"../../types/tool.ts\";\nimport type {\n NodeState,\n RetryConfig,\n StepNodeConfig,\n WorkflowContext,\n WorkflowNode,\n} from \"../types.ts\";\nimport { parseDuration } from \"../types.ts\";\n\n/** Default retry configuration */\nconst DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 1,\n backoff: \"exponential\",\n initialDelay: 1000,\n maxDelay: 30000,\n};\nimport type { BlobStorage } from \"../blob/types.ts\";\n\n/** Default timeout for workflow steps (5 minutes) */\nconst DEFAULT_STEP_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * Agent registry for looking up agents by ID\n */\nexport interface AgentRegistry {\n get(id: string): Agent | undefined;\n /** Optional: List all registered agent IDs (for error messages) */\n list?(): string[];\n}\n\n/**\n * Tool registry for looking up tools by ID\n */\nexport interface ToolRegistry {\n get(id: string): Tool | undefined;\n /** Optional: List all registered tool IDs (for error messages) */\n list?(): string[];\n}\n\n/**\n * Step executor configuration\n */\nexport interface StepExecutorConfig {\n /** Agent registry for looking up agents */\n agentRegistry?: AgentRegistry;\n /** Tool registry for looking up tools */\n toolRegistry?: ToolRegistry;\n /** Default timeout for steps (in milliseconds) */\n defaultTimeout?: number;\n /** Blob storage access */\n blobStorage?: BlobStorage;\n /** Callback when step starts */\n onStepStart?: (nodeId: string, input: unknown) => void;\n /** Callback when step completes */\n onStepComplete?: (nodeId: string, output: unknown) => void;\n /** Callback when step fails */\n onStepError?: (nodeId: string, error: Error) => void;\n}\n\n/**\n * Result of executing a step\n */\nexport interface StepResult {\n /** Whether the step succeeded */\n success: boolean;\n /** Output from the step (if successful) */\n output?: unknown;\n /** Error message (if failed) */\n error?: string;\n /** Execution time in milliseconds */\n executionTime: number;\n}\n\n/**\n * Step Executor class\n *\n * Responsible for executing individual workflow steps by invoking\n * the appropriate agent or tool.\n */\nexport class StepExecutor {\n private config: StepExecutorConfig;\n\n constructor(config: StepExecutorConfig = {}) {\n this.config = {\n defaultTimeout: DEFAULT_STEP_TIMEOUT_MS,\n ...config,\n };\n }\n\n /**\n * Execute a step node with retry support\n */\n async execute(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<StepResult> {\n const startTime = Date.now();\n const config = node.config as StepNodeConfig;\n\n if (config.type !== \"step\") {\n throw new Error(\n `StepExecutor can only execute 'step' nodes, but node \"${node.id}\" has type '${config.type}'. ` +\n `This is likely a bug in the DAG executor routing.`,\n );\n }\n\n const retryConfig = { ...DEFAULT_RETRY, ...config.retry };\n const maxAttempts = retryConfig.maxAttempts ?? 1;\n\n let lastError: Error | undefined;\n let attempt = 0;\n\n while (attempt < maxAttempts) {\n attempt++;\n\n try {\n // Notify start\n const resolvedInput = await this.resolveInput(config.input, context);\n this.config.onStepStart?.(node.id, resolvedInput);\n\n // Execute with timeout\n const timeout = config.timeout\n ? parseDuration(config.timeout)\n : this.config.defaultTimeout!;\n\n const output = await this.executeWithTimeout(\n () => this.executeStep(config, resolvedInput, context),\n timeout,\n node.id,\n );\n\n // Notify completion\n this.config.onStepComplete?.(node.id, output);\n\n return {\n success: true,\n output,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if we should retry\n const shouldRetry = attempt < maxAttempts && this.isRetryableError(lastError, retryConfig);\n\n if (shouldRetry) {\n const delay = this.calculateRetryDelay(attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n\n // Notify error (only on final failure)\n this.config.onStepError?.(node.id, lastError);\n\n return {\n success: false,\n error: lastError.message,\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n // Should not reach here, but just in case\n return {\n success: false,\n error: lastError?.message ?? \"Unknown error\",\n executionTime: Date.now() - startTime,\n };\n }\n\n /**\n * Check if error is retryable\n */\n private isRetryableError(error: Error, config: RetryConfig): boolean {\n // Check custom retryable condition\n if (config.retryIf) {\n return config.retryIf(error);\n }\n\n // Default: retry on timeout and network-like errors\n const retryablePatterns = [\n /timeout/i,\n /ECONNRESET/i,\n /ECONNREFUSED/i,\n /ETIMEDOUT/i,\n /rate limit/i,\n /429/,\n /503/,\n /502/,\n ];\n\n return retryablePatterns.some((pattern) => pattern.test(error.message));\n }\n\n /**\n * Calculate retry delay based on backoff strategy\n */\n private calculateRetryDelay(attempt: number, config: RetryConfig): number {\n const initialDelay = config.initialDelay ?? 1000;\n const maxDelay = config.maxDelay ?? 30000;\n\n let delay: number;\n\n switch (config.backoff) {\n case \"exponential\":\n delay = initialDelay * Math.pow(2, attempt - 1);\n break;\n case \"linear\":\n delay = initialDelay * attempt;\n break;\n case \"fixed\":\n default:\n delay = initialDelay;\n break;\n }\n\n // Add jitter (\u00B110%)\n const jitter = delay * 0.1 * (Math.random() * 2 - 1);\n delay = Math.min(delay + jitter, maxDelay);\n\n return Math.floor(delay);\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Resolve step input from context\n */\n private async resolveInput(\n input: StepNodeConfig[\"input\"],\n context: WorkflowContext,\n ): Promise<unknown> {\n if (input === undefined) {\n // Default to the original workflow input\n return context.input;\n }\n\n if (typeof input === \"function\") {\n return await input(context);\n }\n\n return input;\n }\n\n /**\n * Execute step with timeout\n *\n * Uses Promise.race() to properly handle timeout cleanup.\n * The timeout is always cleared in the finally block to prevent memory leaks.\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeout: number,\n nodeId: string,\n ): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Step \"${nodeId}\" timed out after ${timeout}ms`));\n }, timeout);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Execute the actual step (agent or tool)\n */\n private async executeStep(\n config: StepNodeConfig,\n input: unknown,\n context: WorkflowContext,\n ): Promise<unknown> {\n if (config.agent) {\n return await this.executeAgent(config.agent, input, context);\n }\n\n if (config.tool) {\n return await this.executeTool(config.tool, input);\n }\n\n throw new Error(\"Step must have either 'agent' or 'tool' specified\");\n }\n\n /**\n * Execute an agent\n */\n private async executeAgent(\n agent: string | Agent,\n input: unknown,\n context: WorkflowContext,\n ): Promise<unknown> {\n // Resolve agent from registry if string\n const resolvedAgent = typeof agent === \"string\" ? this.getAgent(agent) : agent;\n\n // Prepare input for agent\n const agentInput = typeof input === \"string\" ? input : JSON.stringify(input);\n\n // Execute agent\n const response: AgentResponse = await resolvedAgent.generate({\n input: agentInput,\n context,\n });\n\n // Return the agent's response\n return {\n text: response.text,\n toolCalls: response.toolCalls,\n status: response.status,\n usage: response.usage,\n };\n }\n\n /**\n * Execute a tool\n */\n private async executeTool(\n tool: string | Tool,\n input: unknown,\n ): Promise<unknown> {\n // Resolve tool from registry if string\n const resolvedTool = typeof tool === \"string\" ? this.getTool(tool) : tool;\n\n // Execute tool\n const result = await resolvedTool.execute(\n input as Record<string, unknown>,\n {\n agentId: \"workflow\",\n blobStorage: this.config.blobStorage,\n },\n );\n\n return result;\n }\n\n /**\n * Get agent from registry\n */\n private getAgent(id: string): Agent {\n if (!this.config.agentRegistry) {\n throw new Error(\n `Agent registry not configured. Cannot resolve agent \"${id}\"`,\n );\n }\n\n const agent = this.config.agentRegistry.get(id);\n if (!agent) {\n const available = this.config.agentRegistry.list?.() ?? [];\n const suggestion = available.length > 0\n ? ` Available agents: ${available.slice(0, 5).join(\", \")}${\n available.length > 5 ? \"...\" : \"\"\n }`\n : \" No agents are registered.\";\n throw new Error(`Agent not found: \"${id}\".${suggestion}`);\n }\n\n return agent;\n }\n\n /**\n * Get tool from registry\n */\n private getTool(id: string): Tool {\n if (!this.config.toolRegistry) {\n throw new Error(\n `Tool registry not configured. Cannot resolve tool \"${id}\"`,\n );\n }\n\n const tool = this.config.toolRegistry.get(id);\n if (!tool) {\n const available = this.config.toolRegistry.list?.() ?? [];\n const suggestion = available.length > 0\n ? ` Available tools: ${available.slice(0, 5).join(\", \")}${\n available.length > 5 ? \"...\" : \"\"\n }`\n : \" No tools are registered.\";\n throw new Error(`Tool not found: \"${id}\".${suggestion}`);\n }\n\n return tool;\n }\n\n /**\n * Check if a step should be skipped\n */\n async shouldSkip(\n node: WorkflowNode,\n context: WorkflowContext,\n ): Promise<boolean> {\n const config = node.config;\n\n if (!config.skip) {\n return false;\n }\n\n return await config.skip(context);\n }\n\n /**\n * Create initial node state\n */\n createInitialState(nodeId: string): NodeState {\n return {\n nodeId,\n status: \"pending\",\n attempt: 0,\n };\n }\n\n /**\n * Update node state for running\n */\n createRunningState(nodeId: string, input: unknown, attempt: number): NodeState {\n return {\n nodeId,\n status: \"running\",\n input,\n attempt,\n startedAt: new Date(),\n };\n }\n\n /**\n * Update node state for completion\n *\n * @param result - The step execution result\n * @param previousState - The previous node state (contains nodeId)\n */\n createCompletedState(\n result: StepResult,\n previousState: NodeState,\n ): NodeState {\n if (result.success) {\n return {\n ...previousState,\n status: \"completed\",\n output: result.output,\n completedAt: new Date(),\n };\n }\n\n return {\n ...previousState,\n status: \"failed\",\n error: result.error,\n completedAt: new Date(),\n };\n }\n\n /**\n * Update node state for skip\n */\n createSkippedState(nodeId: string): NodeState {\n return {\n nodeId,\n status: \"skipped\",\n attempt: 0,\n completedAt: new Date(),\n };\n }\n}\n", "/**\n * Workflow Executor\n *\n * Main orchestrator for executing durable workflows\n */\n\nimport type {\n BlobResolver,\n NodeState,\n StepBuilderContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowNode,\n WorkflowRun,\n WorkflowStatus,\n} from \"../types.ts\";\nimport { generateId, parseDuration } from \"../types.ts\";\nimport { hasLockSupport, type WorkflowBackend } from \"../backends/types.ts\";\nimport { DAGExecutor } from \"./dag-executor.ts\";\nimport { CheckpointManager } from \"./checkpoint-manager.ts\";\nimport { StepExecutor, type StepExecutorConfig } from \"./step-executor.ts\";\nimport type { BlobStorage } from \"../blob/types.ts\";\n\n/**\n * Workflow executor configuration\n */\nexport interface WorkflowExecutorConfig {\n /** Backend for persistence */\n backend: WorkflowBackend;\n /** Blob storage for large data */\n blobStorage?: BlobStorage;\n /** Step executor configuration */\n stepExecutor?: StepExecutorConfig;\n /** Maximum concurrent parallel executions */\n maxConcurrency?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Lock duration in milliseconds for distributed execution (default: 30000) */\n lockDuration?: number;\n /** Enable distributed locking (default: true if backend supports it) */\n enableLocking?: boolean;\n /** Callback when workflow starts */\n onStart?: (run: WorkflowRun) => void;\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n /** Callback when workflow fails */\n onError?: (run: WorkflowRun, error: Error) => void;\n /** Callback when workflow is waiting */\n onWaiting?: (run: WorkflowRun, nodeId: string) => void;\n}\n\n/**\n * Handle for a running workflow\n */\nexport interface WorkflowHandle<TOutput = unknown> {\n /** Run ID */\n runId: string;\n /** Get current status */\n status(): Promise<WorkflowRun>;\n /** Wait for completion and get result */\n result(): Promise<TOutput>;\n /** Cancel the workflow */\n cancel(): Promise<void>;\n}\n\n/**\n * Workflow Executor class\n *\n * Main entry point for executing workflows. Handles:\n * - Starting new workflow runs\n * - Resuming from checkpoints\n * - Coordinating DAG execution\n * - Managing workflow lifecycle\n */\nexport class WorkflowExecutor {\n private config: WorkflowExecutorConfig;\n private stepExecutor: StepExecutor;\n private checkpointManager: CheckpointManager;\n private dagExecutor: DAGExecutor;\n private workflows = new Map<string, WorkflowDefinition<any, any>>();\n private blobResolver?: BlobResolver;\n\n /** Default lock duration: 30 seconds */\n private static readonly DEFAULT_LOCK_DURATION = 30000;\n\n constructor(config: WorkflowExecutorConfig) {\n this.config = {\n maxConcurrency: 10,\n debug: false,\n lockDuration: WorkflowExecutor.DEFAULT_LOCK_DURATION,\n ...config,\n };\n\n // Initialize components\n this.stepExecutor = new StepExecutor({\n ...this.config.stepExecutor,\n blobStorage: this.config.blobStorage,\n });\n\n this.checkpointManager = new CheckpointManager({\n backend: this.config.backend,\n debug: this.config.debug,\n });\n\n this.dagExecutor = new DAGExecutor({\n stepExecutor: this.stepExecutor,\n checkpointManager: this.checkpointManager,\n maxConcurrency: this.config.maxConcurrency,\n debug: this.config.debug,\n // onWaiting is intentionally a no-op here - waiting state is handled\n // by executeAsync() after DAG execution returns with waiting: true\n onWaiting: () => {},\n });\n\n if (this.config.blobStorage) {\n const bs = this.config.blobStorage;\n this.blobResolver = {\n getText: (ref) => ref.__kind === \"blob\" ? bs.getText(ref.id) : Promise.resolve(null),\n getBytes: (ref) => ref.__kind === \"blob\" ? bs.getBytes(ref.id) : Promise.resolve(null),\n getStream: (ref) => ref.__kind === \"blob\" ? bs.getStream(ref.id) : Promise.resolve(null),\n stat: (ref) => ref.__kind === \"blob\" ? bs.stat(ref.id) : Promise.resolve(null),\n delete: (ref) => ref.__kind === \"blob\" ? bs.delete(ref.id) : Promise.resolve(undefined),\n };\n }\n }\n\n /**\n * Register a workflow definition\n */\n register<TInput, TOutput>(workflow: WorkflowDefinition<TInput, TOutput>): void {\n this.workflows.set(workflow.id, workflow);\n }\n\n /**\n * Get a registered workflow\n */\n getWorkflow(id: string): WorkflowDefinition<any, any> | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Start a new workflow run\n */\n async start<TInput, TOutput>(\n workflowId: string,\n input: TInput,\n options?: { runId?: string },\n ): Promise<WorkflowHandle<TOutput>> {\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${workflowId}`);\n }\n\n // Validate input if schema provided\n if (workflow.inputSchema) {\n workflow.inputSchema.parse(input);\n }\n\n // Create run\n const run: WorkflowRun<TInput, TOutput> = {\n id: options?.runId || generateId(\"run\"),\n workflowId,\n version: workflow.version,\n status: \"pending\",\n input,\n nodeStates: {},\n currentNodes: [],\n context: { input },\n checkpoints: [],\n pendingApprovals: [],\n createdAt: new Date(),\n };\n\n // Persist run\n await this.config.backend.createRun(run);\n\n // Start execution asynchronously\n this.executeAsync(run.id).catch((error) => {\n console.error(`Workflow ${run.id} failed:`, error);\n });\n\n return this.createHandle<TOutput>(run.id);\n }\n\n /**\n * Resume a paused/waiting workflow\n */\n async resume(runId: string, fromCheckpoint?: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status !== \"waiting\" && run.status !== \"pending\") {\n throw new Error(\n `Cannot resume workflow run \"${runId}\": current status is \"${run.status}\". ` +\n `Only runs in \"waiting\" or \"pending\" status can be resumed.`,\n );\n }\n\n // Get workflow definition\n const workflow = this.workflows.get(run.workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${run.workflowId}`);\n }\n\n // Get nodes\n const nodes = this.resolveNodes(workflow, run.context);\n\n // Get resume point\n const resumeInfo = await this.checkpointManager.prepareResume(\n runId,\n nodes,\n fromCheckpoint,\n );\n\n // If an explicit checkpoint was requested but not found, throw error\n if (fromCheckpoint && !resumeInfo) {\n throw new Error(\n `Checkpoint \"${fromCheckpoint}\" not found for run \"${runId}\". ` +\n `Cannot resume from non-existent checkpoint.`,\n );\n }\n\n if (resumeInfo) {\n // Update run state from checkpoint\n await this.config.backend.updateRun(runId, {\n status: \"running\",\n context: resumeInfo.context,\n nodeStates: resumeInfo.nodeStates,\n });\n }\n\n // Resume execution\n await this.executeAsync(runId, resumeInfo?.startFromNode);\n }\n\n /**\n * Execute a workflow run asynchronously\n *\n * Uses distributed locking (when backend supports it) to prevent\n * concurrent execution of the same workflow run.\n */\n async executeAsync(runId: string, startFromNode?: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Get workflow definition\n const workflow = this.workflows.get(run.workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${run.workflowId}`);\n }\n\n // Try to acquire lock if backend supports it and locking is enabled\n const useLocking = this.config.enableLocking !== false &&\n hasLockSupport(this.config.backend);\n const lockDuration = this.config.lockDuration!;\n\n if (useLocking) {\n const acquired = await this.config.backend.acquireLock!(runId, lockDuration);\n if (!acquired) {\n throw new Error(\n `Cannot execute workflow run \"${runId}\": another worker is already executing it. ` +\n `This can happen when multiple workers try to execute the same run concurrently.`,\n );\n }\n\n if (this.config.debug) {\n console.log(`[WorkflowExecutor] Acquired lock for run: ${runId}`);\n }\n }\n\n try {\n // Update status to running\n await this.config.backend.updateRun(runId, {\n status: \"running\",\n startedAt: run.startedAt || new Date(),\n });\n\n // Notify start\n const updatedRun = await this.config.backend.getRun(runId);\n this.config.onStart?.(updatedRun!);\n\n // Resolve workflow nodes\n const nodes = this.resolveNodes(workflow, run.context);\n\n // Execute with timeout if configured\n const result = await this.executeWithTimeout(\n () => this.dagExecutor.execute(nodes, run as WorkflowRun, startFromNode),\n workflow.timeout,\n );\n\n // Update run based on result\n if (result.completed) {\n // Workflow completed successfully\n const finalRun = await this.completeRun(\n runId,\n result.context,\n result.nodeStates,\n );\n\n // Validate output if schema provided\n if (workflow.outputSchema) {\n workflow.outputSchema.parse(finalRun.output);\n }\n\n // Call completion handler\n await workflow.onComplete?.(finalRun.output, finalRun.context);\n this.config.onComplete?.(finalRun);\n } else if (result.waiting) {\n // Workflow is waiting for approval/event\n await this.pauseRun(\n runId,\n result.waitingNode!,\n result.context,\n result.nodeStates,\n );\n\n const pausedRun = await this.config.backend.getRun(runId);\n this.config.onWaiting?.(pausedRun!, result.waitingNode!);\n } else {\n // Workflow failed\n const error = new Error(result.error || \"Unknown error\");\n await this.failRun(runId, error, result.context, result.nodeStates);\n\n await workflow.onError?.(error, result.context);\n this.config.onError?.(run, error);\n }\n } catch (error) {\n // Unexpected error during execution\n const err = error instanceof Error ? error : new Error(String(error));\n await this.failRun(runId, err, run.context, run.nodeStates);\n\n await workflow.onError?.(err, run.context);\n this.config.onError?.(run, err);\n\n throw error;\n } finally {\n // Always release lock when done\n if (useLocking) {\n await this.config.backend.releaseLock!(runId);\n\n if (this.config.debug) {\n console.log(`[WorkflowExecutor] Released lock for run: ${runId}`);\n }\n }\n }\n }\n\n /**\n * Resolve workflow nodes from definition\n */\n private resolveNodes(\n workflow: WorkflowDefinition,\n context: WorkflowContext,\n ): WorkflowNode[] {\n let nodes: WorkflowNode[];\n\n if (Array.isArray(workflow.steps)) {\n nodes = workflow.steps;\n } else {\n // Dynamic steps - call the function\n if (!this.config.blobStorage) {\n // Warn if blobStorage is missing but dynamic steps might need it?\n // For now, we allow it to be undefined if user doesn't use it.\n }\n\n const builderContext: StepBuilderContext = {\n input: context.input,\n context,\n blobStorage: this.config.blobStorage,\n blob: this.blobResolver,\n };\n nodes = workflow.steps(builderContext);\n }\n\n // Validate resolved nodes\n this.validateNodes(nodes, workflow.id);\n\n return nodes;\n }\n\n /**\n * Validate workflow nodes\n */\n private validateNodes(nodes: WorkflowNode[], workflowId: string): void {\n if (!Array.isArray(nodes)) {\n throw new Error(`Workflow \"${workflowId}\" steps must resolve to an array`);\n }\n\n if (nodes.length === 0) {\n throw new Error(`Workflow \"${workflowId}\" must have at least one step`);\n }\n\n const seenIds = new Set<string>();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (!node) {\n throw new Error(`Workflow \"${workflowId}\" has undefined node at index ${i}`);\n }\n\n if (!node.id || typeof node.id !== \"string\") {\n throw new Error(`Workflow \"${workflowId}\" node at index ${i} has invalid ID`);\n }\n\n if (seenIds.has(node.id)) {\n throw new Error(`Workflow \"${workflowId}\" has duplicate node ID: \"${node.id}\"`);\n }\n seenIds.add(node.id);\n\n if (!node.config || typeof node.config !== \"object\") {\n throw new Error(`Workflow \"${workflowId}\" node \"${node.id}\" has invalid config`);\n }\n\n if (!node.config.type) {\n throw new Error(`Workflow \"${workflowId}\" node \"${node.id}\" config missing type`);\n }\n }\n }\n\n /**\n * Execute with optional timeout\n *\n * Uses Promise.race() to properly handle timeout cleanup.\n * The timeout is always cleared in the finally block to prevent memory leaks.\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeout?: string | number,\n ): Promise<T> {\n if (!timeout) {\n return fn();\n }\n\n const timeoutMs = parseDuration(timeout);\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Workflow timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Mark run as completed\n */\n private async completeRun(\n runId: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<WorkflowRun> {\n // Determine output (last node's output or accumulated context)\n const output = this.determineOutput(context);\n\n await this.config.backend.updateRun(runId, {\n status: \"completed\" as WorkflowStatus,\n output,\n context,\n nodeStates,\n completedAt: new Date(),\n });\n\n return (await this.config.backend.getRun(runId))!;\n }\n\n /**\n * Mark run as failed\n */\n private async failRun(\n runId: string,\n error: Error,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n await this.config.backend.updateRun(runId, {\n status: \"failed\" as WorkflowStatus,\n context,\n nodeStates,\n error: {\n message: error.message,\n stack: error.stack,\n },\n completedAt: new Date(),\n });\n }\n\n /**\n * Mark run as waiting\n */\n private async pauseRun(\n runId: string,\n waitingNode: string,\n context: WorkflowContext,\n nodeStates: Record<string, NodeState>,\n ): Promise<void> {\n await this.config.backend.updateRun(runId, {\n status: \"waiting\" as WorkflowStatus,\n currentNodes: [waitingNode],\n context,\n nodeStates,\n });\n }\n\n /**\n * Determine workflow output from context\n */\n private determineOutput(context: WorkflowContext): unknown {\n // Remove 'input' and return the rest as output\n const { input: _input, ...rest } = context;\n return rest;\n }\n\n /**\n * Create a handle for a workflow run\n */\n private createHandle<TOutput>(runId: string): WorkflowHandle<TOutput> {\n return {\n runId,\n status: () => this.config.backend.getRun(runId) as Promise<WorkflowRun>,\n result: () => this.waitForResult<TOutput>(runId),\n cancel: () => this.cancel(runId),\n };\n }\n\n /**\n * Wait for workflow result\n */\n private async waitForResult<TOutput>(\n runId: string,\n pollInterval: number = 1000,\n ): Promise<TOutput> {\n while (true) {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status === \"completed\") {\n return run.output as TOutput;\n }\n\n if (run.status === \"failed\") {\n throw new Error(run.error?.message || \"Workflow failed\");\n }\n\n if (run.status === \"cancelled\") {\n throw new Error(\"Workflow was cancelled\");\n }\n\n // Wait before polling again\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n\n /**\n * Cancel a workflow run\n */\n async cancel(runId: string): Promise<void> {\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n if (run.status === \"completed\" || run.status === \"failed\") {\n throw new Error(\n `Cannot cancel workflow run \"${runId}\": run has already ${run.status}. ` +\n `Only active runs (pending, running, waiting) can be cancelled.`,\n );\n }\n\n await this.config.backend.updateRun(runId, {\n status: \"cancelled\" as WorkflowStatus,\n completedAt: new Date(),\n });\n }\n\n /**\n * Get workflow run status\n */\n getStatus(runId: string): Promise<WorkflowRun | null> {\n return this.config.backend.getRun(runId);\n }\n\n /**\n * List workflow runs\n */\n listRuns(options?: {\n workflowId?: string;\n status?: WorkflowStatus | WorkflowStatus[];\n limit?: number;\n }): Promise<WorkflowRun[]> {\n return this.config.backend.listRuns({\n workflowId: options?.workflowId,\n status: options?.status,\n limit: options?.limit,\n });\n }\n}\n", "/**\n * Approval Manager\n *\n * Handles human-in-the-loop approval workflows\n */\n\nimport type {\n ApprovalDecision,\n PendingApproval,\n WaitNodeConfig,\n WorkflowContext,\n WorkflowRun,\n} from \"../types.ts\";\nimport { generateId, parseDuration } from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\nimport type { WorkflowExecutor } from \"../executor/workflow-executor.ts\";\n\n/**\n * Approval notification callback\n */\nexport type ApprovalNotifier = (\n approval: PendingApproval,\n run: WorkflowRun,\n) => Promise<void>;\n\n/**\n * Approval manager configuration\n */\nexport interface ApprovalManagerConfig {\n /** Backend for persistence */\n backend: WorkflowBackend;\n /** Workflow executor for resuming after approval */\n executor?: WorkflowExecutor;\n /** Notification callback */\n notifier?: ApprovalNotifier;\n /** Check expired approvals interval (ms) */\n expirationCheckInterval?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Approval request result\n */\nexport interface ApprovalRequest {\n /** Approval ID */\n approvalId: string;\n /** Run ID */\n runId: string;\n /** Node ID */\n nodeId: string;\n /** Message for approver */\n message: string;\n /** Payload with context */\n payload: unknown;\n /** When approval expires */\n expiresAt?: Date;\n}\n\n/**\n * Approval Manager class\n *\n * Responsible for:\n * - Creating pending approvals\n * - Processing approval decisions\n * - Resuming workflows after approval\n * - Handling approval timeouts\n */\nexport class ApprovalManager {\n private config: ApprovalManagerConfig;\n private expirationTimer?: ReturnType<typeof setInterval>;\n private destroyed = false;\n\n constructor(config: ApprovalManagerConfig) {\n this.config = {\n expirationCheckInterval: 60000, // Check every minute\n debug: false,\n ...config,\n };\n\n // Start expiration checker if interval is set\n if (this.config.expirationCheckInterval && this.config.expirationCheckInterval > 0) {\n this.startExpirationChecker();\n }\n }\n\n /**\n * Create a pending approval request\n */\n async createApproval(\n run: WorkflowRun,\n nodeId: string,\n waitConfig: WaitNodeConfig,\n context: WorkflowContext,\n ): Promise<ApprovalRequest> {\n // Resolve payload if it's a function\n const payload = typeof waitConfig.payload === \"function\"\n ? await waitConfig.payload(context)\n : waitConfig.payload;\n\n // Calculate expiration\n const expiresAt = waitConfig.timeout\n ? new Date(Date.now() + parseDuration(waitConfig.timeout))\n : undefined;\n\n const approval: PendingApproval = {\n id: generateId(\"apr\"),\n nodeId,\n message: waitConfig.message || \"Approval required\",\n payload,\n approvers: waitConfig.approvers,\n requestedAt: new Date(),\n expiresAt,\n status: \"pending\",\n };\n\n if (this.config.debug) {\n console.log(`[ApprovalManager] Creating approval ${approval.id} for run ${run.id}`);\n }\n\n // Save to backend\n await this.config.backend.savePendingApproval(run.id, approval);\n\n // Notify approvers\n if (this.config.notifier) {\n try {\n await this.config.notifier(approval, run);\n } catch (error) {\n console.error(`[ApprovalManager] Failed to notify approvers:`, error);\n }\n }\n\n return {\n approvalId: approval.id,\n runId: run.id,\n nodeId,\n message: approval.message,\n payload: approval.payload,\n expiresAt: approval.expiresAt,\n };\n }\n\n /**\n * Get pending approval by ID\n */\n async getApproval(\n runId: string,\n approvalId: string,\n ): Promise<PendingApproval | null> {\n if (this.config.backend.getPendingApproval) {\n return this.config.backend.getPendingApproval(runId, approvalId);\n }\n\n // Fallback: get all and find\n const all = await this.config.backend.getPendingApprovals(runId);\n return all.find((a) => a.id === approvalId) || null;\n }\n\n /**\n * Get all pending approvals for a run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n return this.config.backend.getPendingApprovals(runId);\n }\n\n /**\n * Process an approval decision\n */\n async processDecision(\n runId: string,\n approvalId: string,\n decision: ApprovalDecision,\n ): Promise<void> {\n if (this.config.debug) {\n console.log(\n `[ApprovalManager] Processing decision for ${approvalId}: ${\n decision.approved ? \"approved\" : \"rejected\"\n }`,\n );\n }\n\n // Get the approval\n const approval = await this.getApproval(runId, approvalId);\n if (!approval) {\n throw new Error(`Approval not found: ${approvalId}`);\n }\n\n // Check if already decided\n if (approval.status !== \"pending\") {\n throw new Error(`Approval already processed: ${approval.status}`);\n }\n\n // Check if expired\n if (approval.expiresAt && new Date() > approval.expiresAt) {\n throw new Error(\"Approval has expired\");\n }\n\n // Check if approver is authorized\n if (\n approval.approvers &&\n approval.approvers.length > 0 &&\n !approval.approvers.includes(decision.approver)\n ) {\n throw new Error(\"Not authorized to approve this request\");\n }\n\n // Update the approval\n await this.config.backend.updateApproval(runId, approvalId, decision);\n\n // Get the run\n const run = await this.config.backend.getRun(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Update run context with approval result\n const updatedContext = {\n ...run.context,\n [approval.nodeId]: {\n approved: decision.approved,\n approver: decision.approver,\n comment: decision.comment,\n decidedAt: new Date().toISOString(),\n },\n };\n\n // Update node state\n const updatedNodeStates = {\n ...run.nodeStates,\n [approval.nodeId]: {\n nodeId: approval.nodeId,\n status: \"completed\" as const,\n output: {\n approved: decision.approved,\n approver: decision.approver,\n comment: decision.comment,\n },\n attempt: 1,\n completedAt: new Date(),\n },\n };\n\n await this.config.backend.updateRun(runId, {\n context: updatedContext,\n nodeStates: updatedNodeStates,\n });\n\n // Resume workflow if approved and executor is available\n if (decision.approved && this.config.executor) {\n try {\n await this.config.executor.resume(runId);\n } catch (error) {\n console.error(`[ApprovalManager] Failed to resume workflow:`, error);\n throw error;\n }\n } else if (!decision.approved) {\n // If rejected, fail the workflow\n await this.config.backend.updateRun(runId, {\n status: \"failed\",\n error: {\n message: `Approval \"${approvalId}\" was rejected${\n decision.comment ? `: ${decision.comment}` : \"\"\n }`,\n },\n completedAt: new Date(),\n });\n }\n }\n\n /**\n * Approve an approval request\n */\n async approve(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n await this.processDecision(runId, approvalId, {\n approved: true,\n approver,\n comment,\n });\n }\n\n /**\n * Reject an approval request\n */\n async reject(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n await this.processDecision(runId, approvalId, {\n approved: false,\n approver,\n comment,\n });\n }\n\n /**\n * List all pending approvals across workflows\n */\n listAllPending(filter?: {\n workflowId?: string;\n approver?: string;\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n if (this.config.backend.listPendingApprovals) {\n return this.config.backend.listPendingApprovals({\n ...filter,\n status: \"pending\",\n });\n }\n\n // Fallback: not supported by backend\n console.warn(\n \"[ApprovalManager] listPendingApprovals not supported by backend\",\n );\n return Promise.resolve([]);\n }\n\n /**\n * Check and expire stale approvals\n */\n async checkExpiredApprovals(): Promise<void> {\n // Guard against post-stop execution\n if (this.destroyed) {\n return;\n }\n\n if (!this.config.backend.listPendingApprovals) {\n return;\n }\n\n const pending = await this.config.backend.listPendingApprovals({\n status: \"pending\",\n });\n\n const now = new Date();\n\n for (const { runId, approval } of pending) {\n if (approval.expiresAt && now > approval.expiresAt) {\n if (this.config.debug) {\n console.log(`[ApprovalManager] Expiring approval ${approval.id}`);\n }\n\n // Mark as expired\n await this.config.backend.updateApproval(runId, approval.id, {\n approved: false,\n approver: \"system\",\n comment: \"Approval expired\",\n });\n\n // Fail the workflow\n await this.config.backend.updateRun(runId, {\n status: \"failed\",\n error: {\n message: `Approval \"${approval.id}\" expired`,\n },\n completedAt: new Date(),\n });\n }\n }\n }\n\n /**\n * Start the expiration checker timer\n */\n private startExpirationChecker(): void {\n this.expirationTimer = setInterval(() => {\n this.checkExpiredApprovals().catch((error) => {\n console.error(`[ApprovalManager] Expiration check failed:`, error);\n });\n }, this.config.expirationCheckInterval);\n }\n\n /**\n * Stop the approval manager\n */\n stop(): void {\n this.destroyed = true;\n if (this.expirationTimer) {\n clearInterval(this.expirationTimer);\n this.expirationTimer = undefined;\n }\n }\n}\n", "/**\n * Workflow Client\n *\n * High-level API for interacting with workflows\n */\n\nimport type {\n PendingApproval,\n RunFilter,\n WorkflowDefinition,\n WorkflowRun,\n WorkflowStatus,\n} from \"../types.ts\";\nimport type { WorkflowBackend } from \"../backends/types.ts\";\nimport { MemoryBackend } from \"../backends/memory.ts\";\nimport {\n WorkflowExecutor,\n type WorkflowExecutorConfig,\n type WorkflowHandle,\n} from \"../executor/workflow-executor.ts\";\nimport { ApprovalManager, type ApprovalManagerConfig } from \"../runtime/approval-manager.ts\";\nimport type { Workflow } from \"../dsl/workflow.ts\";\n\n/**\n * Workflow client configuration\n */\nexport interface WorkflowClientConfig {\n /** Backend for persistence (default: MemoryBackend) */\n backend?: WorkflowBackend;\n /** Executor configuration */\n executor?: Partial<WorkflowExecutorConfig>;\n /** Approval manager configuration */\n approval?: Partial<ApprovalManagerConfig>;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Workflow Client class\n *\n * The main entry point for working with workflows.\n * Provides a simple API for:\n * - Registering workflow definitions\n * - Starting and managing workflow runs\n * - Handling approvals\n */\nexport class WorkflowClient {\n private backend: WorkflowBackend;\n private executor: WorkflowExecutor;\n private approvalManager: ApprovalManager;\n private debug: boolean;\n\n constructor(config: WorkflowClientConfig = {}) {\n this.debug = config.debug ?? false;\n this.backend = config.backend ?? new MemoryBackend({ debug: this.debug });\n\n // Note: onWaiting callback references this.approvalManager which is set below.\n // The callback is only invoked after construction completes, so this is safe.\n\n // Initialize executor with onWaiting callback to create approvals\n this.executor = new WorkflowExecutor({\n backend: this.backend,\n debug: this.debug,\n ...config.executor,\n onWaiting: async (run, nodeId) => {\n // Get the node state to extract wait config\n const nodeState = run.nodeStates[nodeId];\n if (!nodeState?.input) {\n if (this.debug) {\n console.log(`[WorkflowClient] No wait config found for node: ${nodeId}`);\n }\n return;\n }\n\n // Reconstruct wait config from node state input\n const input = nodeState.input as { type?: string; message?: string; payload?: unknown };\n if (input.type !== \"approval\") {\n // Not an approval wait (might be event wait)\n return;\n }\n\n const waitConfig = {\n type: \"wait\" as const,\n waitType: \"approval\" as const,\n message: input.message,\n payload: input.payload,\n };\n\n try {\n await this.approvalManager.createApproval(run, nodeId, waitConfig, run.context);\n if (this.debug) {\n console.log(`[WorkflowClient] Created approval for node: ${nodeId}`);\n }\n } catch (error) {\n console.error(`[WorkflowClient] Failed to create approval:`, error);\n }\n\n // Call user's onWaiting callback if provided\n config.executor?.onWaiting?.(run, nodeId);\n },\n });\n\n // Initialize approval manager\n this.approvalManager = new ApprovalManager({\n backend: this.backend,\n executor: this.executor,\n debug: this.debug,\n ...config.approval,\n });\n }\n\n // =========================================================================\n // Workflow Registration\n // =========================================================================\n\n /**\n * Register a workflow definition\n */\n register(\n workflow: Workflow | WorkflowDefinition,\n ): void {\n const definition = \"definition\" in workflow ? workflow.definition : workflow;\n\n this.executor.register(definition as WorkflowDefinition);\n\n if (this.debug) {\n console.log(`[WorkflowClient] Registered workflow: ${definition.id}`);\n }\n }\n\n /**\n * Register multiple workflows\n */\n registerAll(\n workflows: Array<Workflow | WorkflowDefinition>,\n ): void {\n for (const workflow of workflows) {\n this.register(workflow);\n }\n }\n\n // =========================================================================\n // Workflow Execution\n // =========================================================================\n\n /**\n * Start a new workflow run\n *\n * @example\n * ```typescript\n * const handle = await client.start('content-pipeline', {\n * topic: 'AI Safety',\n * requiresApproval: true,\n * });\n *\n * const result = await handle.result();\n * ```\n */\n start<TInput, TOutput = unknown>(\n workflowId: string,\n input: TInput,\n options?: { runId?: string },\n ): Promise<WorkflowHandle<TOutput>> {\n return this.executor.start<TInput, TOutput>(workflowId, input, options);\n }\n\n /**\n * Resume a paused/waiting workflow\n */\n resume(runId: string): Promise<void> {\n return this.executor.resume(runId);\n }\n\n /**\n * Cancel a workflow run\n */\n cancel(runId: string): Promise<void> {\n return this.executor.cancel(runId);\n }\n\n // =========================================================================\n // Run Management\n // =========================================================================\n\n /**\n * Get a workflow run by ID\n */\n getRun(runId: string): Promise<WorkflowRun | null> {\n return this.backend.getRun(runId);\n }\n\n /**\n * List workflow runs\n */\n listRuns(filter?: RunFilter): Promise<WorkflowRun[]> {\n return this.backend.listRuns(filter ?? {});\n }\n\n /**\n * Get runs by status\n */\n getRunsByStatus(\n status: WorkflowStatus | WorkflowStatus[],\n limit?: number,\n ): Promise<WorkflowRun[]> {\n return this.backend.listRuns({ status, limit });\n }\n\n /**\n * Get runs for a specific workflow\n */\n getRunsForWorkflow(\n workflowId: string,\n limit?: number,\n ): Promise<WorkflowRun[]> {\n return this.backend.listRuns({ workflowId, limit });\n }\n\n // =========================================================================\n // Approvals\n // =========================================================================\n\n /**\n * Get pending approvals for a run\n */\n getPendingApprovals(runId: string): Promise<PendingApproval[]> {\n return this.approvalManager.getPendingApprovals(runId);\n }\n\n /**\n * Approve an approval request\n *\n * @example\n * ```typescript\n * await client.approve(runId, approvalId, 'user@example.com', 'Looks good!');\n * ```\n */\n approve(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n return this.approvalManager.approve(runId, approvalId, approver, comment);\n }\n\n /**\n * Reject an approval request\n */\n reject(\n runId: string,\n approvalId: string,\n approver: string,\n comment?: string,\n ): Promise<void> {\n return this.approvalManager.reject(runId, approvalId, approver, comment);\n }\n\n /**\n * List all pending approvals across workflows\n */\n listAllPendingApprovals(filter?: {\n workflowId?: string;\n approver?: string;\n }): Promise<Array<{ runId: string; approval: PendingApproval }>> {\n return this.approvalManager.listAllPending(filter);\n }\n\n // =========================================================================\n // Lifecycle\n // =========================================================================\n\n /**\n * Get the underlying backend\n */\n getBackend(): WorkflowBackend {\n return this.backend;\n }\n\n /**\n * Get the underlying executor\n */\n getExecutor(): WorkflowExecutor {\n return this.executor;\n }\n\n /**\n * Get the underlying approval manager\n */\n getApprovalManager(): ApprovalManager {\n return this.approvalManager;\n }\n\n /**\n * Cleanup and shutdown\n */\n async destroy(): Promise<void> {\n this.approvalManager.stop();\n await this.backend.destroy();\n\n if (this.debug) {\n console.log(\"[WorkflowClient] Destroyed\");\n }\n }\n}\n\n/**\n * Create a workflow client with default configuration\n */\nexport function createWorkflowClient(\n config?: WorkflowClientConfig,\n): WorkflowClient {\n return new WorkflowClient(config);\n}\n", "/**\n * useWorkflow Hook\n *\n * React hook for tracking and interacting with workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflow } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowDashboard({ runId }: { runId: string }) {\n * const {\n * run,\n * status,\n * progress,\n * currentNodes,\n * pendingApprovals,\n * cancel,\n * retry,\n * isLoading,\n * error,\n * } = useWorkflow({ runId });\n *\n * return (\n * <div>\n * <h2>Status: {status}</h2>\n * <p>Progress: {progress}%</p>\n * {pendingApprovals.length > 0 && (\n * <p>{pendingApprovals.length} approvals pending</p>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NodeState, PendingApproval, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflow hook\n */\nexport interface UseWorkflowOptions {\n /** Run ID to track */\n runId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Polling interval in ms (defaults to 2000) */\n pollInterval?: number;\n\n /** Enable automatic polling */\n autoRefresh?: boolean;\n\n /** Callback when status changes */\n onStatusChange?: (status: WorkflowStatus, previousStatus: WorkflowStatus) => void;\n\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n\n /** Callback when workflow fails */\n onError?: (error: Error, run?: WorkflowRun) => void;\n\n /** Callback when approval is required */\n onApprovalRequired?: (approval: PendingApproval) => void;\n}\n\n/**\n * Result from useWorkflow hook\n */\nexport interface UseWorkflowResult {\n /** The workflow run data */\n run: WorkflowRun | null;\n\n /** Current workflow status */\n status: WorkflowStatus;\n\n /** Progress percentage (0-100) */\n progress: number;\n\n /** Currently executing node IDs */\n currentNodes: string[];\n\n /** Node states by node ID */\n nodeStates: Record<string, NodeState>;\n\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n /** Refresh the workflow data */\n refresh: () => Promise<void>;\n\n /** Cancel the workflow */\n cancel: () => Promise<void>;\n\n /** Retry a failed workflow */\n retry: () => Promise<void>;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useWorkflow - Track and interact with a workflow run\n */\nexport function useWorkflow(options: UseWorkflowOptions): UseWorkflowResult {\n const {\n runId,\n apiBase = \"/api/workflows\",\n pollInterval = 2000,\n autoRefresh = true,\n onStatusChange,\n onComplete,\n onError,\n onApprovalRequired,\n } = options;\n\n const [run, setRun] = useState<WorkflowRun | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const previousStatusRef = useRef<WorkflowStatus | null>(null);\n const previousApprovalsRef = useRef<Set<string>>(new Set());\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Fetch workflow data\n */\n const fetchRun = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}`, {\n signal: abortControllerRef.current?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow: ${response.status}`);\n }\n\n const data = await response.json();\n const workflowRun = data as WorkflowRun;\n\n // Check for status changes\n if (previousStatusRef.current && previousStatusRef.current !== workflowRun.status) {\n onStatusChange?.(workflowRun.status, previousStatusRef.current);\n }\n previousStatusRef.current = workflowRun.status;\n\n // Check for completion\n if (workflowRun.status === \"completed\") {\n onComplete?.(workflowRun);\n }\n\n // Check for failures\n if (workflowRun.status === \"failed\") {\n const failedError = new Error(\"Workflow failed\");\n onError?.(failedError, workflowRun);\n }\n\n // Check for new approvals\n if (workflowRun.pendingApprovals) {\n for (const approval of workflowRun.pendingApprovals) {\n if (approval.status === \"pending\" && !previousApprovalsRef.current.has(approval.id)) {\n previousApprovalsRef.current.add(approval.id);\n onApprovalRequired?.(approval);\n }\n }\n }\n\n setRun(workflowRun);\n setError(null);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n }\n }, [runId, apiBase, onStatusChange, onComplete, onError, onApprovalRequired]);\n\n /**\n * Initial fetch and polling setup\n */\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n };\n\n doFetch();\n\n // Set up polling for active workflows\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (autoRefresh) {\n intervalId = setInterval(() => {\n // Only poll if workflow is still active\n const currentStatus = previousStatusRef.current;\n if (currentStatus && ![\"completed\", \"failed\", \"cancelled\"].includes(currentStatus)) {\n fetchRun();\n }\n }, pollInterval);\n }\n\n return () => {\n abortControllerRef.current?.abort();\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [runId, autoRefresh, pollInterval, fetchRun]);\n\n /**\n * Refresh workflow data\n */\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n }, [fetchRun]);\n\n /**\n * Cancel the workflow\n */\n const cancel = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/cancel`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to cancel workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const cancelError = err instanceof Error ? err : new Error(String(err));\n setError(cancelError);\n throw cancelError;\n }\n }, [runId, apiBase, refresh]);\n\n /**\n * Retry a failed workflow\n */\n const retry = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/retry`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to retry workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const retryError = err instanceof Error ? err : new Error(String(err));\n setError(retryError);\n throw retryError;\n }\n }, [runId, apiBase, refresh]);\n\n // Calculate progress\n const calculateProgress = (): number => {\n if (!run?.nodeStates) return 0;\n\n const states = Object.values(run.nodeStates);\n if (states.length === 0) return 0;\n\n const completed = states.filter(\n (s) => s.status === \"completed\" || s.status === \"skipped\",\n ).length;\n\n return Math.round((completed / states.length) * 100);\n };\n\n return {\n run,\n status: run?.status ?? \"pending\",\n progress: calculateProgress(),\n currentNodes: run?.currentNodes ?? [],\n nodeStates: run?.nodeStates ?? {},\n pendingApprovals: run?.pendingApprovals?.filter((a) => a.status === \"pending\") ?? [],\n refresh,\n cancel,\n retry,\n isLoading,\n error,\n };\n}\n", "/**\n * useApproval Hook\n *\n * React hook for handling workflow approval interactions.\n *\n * @example\n * ```tsx\n * import { useApproval } from 'veryfront/ai/workflow/react';\n *\n * function ApprovalUI({ runId, approvalId }: Props) {\n * const {\n * approval,\n * approve,\n * reject,\n * isSubmitting,\n * error,\n * } = useApproval({ runId, approvalId });\n *\n * if (!approval) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <h3>{approval.message}</h3>\n * <p>Requested by: {approval.stepId}</p>\n * <button onClick={() => approve('Looks good!')}>\n * Approve\n * </button>\n * <button onClick={() => reject('Needs changes')}>\n * Reject\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ApprovalDecision, PendingApproval } from \"../types.ts\";\n\n/**\n * Options for useApproval hook\n */\nexport interface UseApprovalOptions {\n /** Workflow run ID */\n runId: string;\n\n /** Approval ID */\n approvalId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Current user/approver name */\n approver?: string;\n\n /** Callback on successful approval/rejection */\n onDecision?: (decision: ApprovalDecision) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useApproval hook\n */\nexport interface UseApprovalResult {\n /** The approval data */\n approval: PendingApproval | null;\n\n /** Approve the request */\n approve: (comment?: string) => Promise<void>;\n\n /** Reject the request */\n reject: (comment?: string) => Promise<void>;\n\n /** Submit a custom decision */\n submitDecision: (decision: ApprovalDecision) => Promise<void>;\n\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n\n /** Loading state for initial fetch */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether the approval is still pending */\n isPending: boolean;\n\n /** Whether the approval has been resolved */\n isResolved: boolean;\n}\n\n/**\n * useApproval - Handle workflow approval interactions\n */\nexport function useApproval(options: UseApprovalOptions): UseApprovalResult {\n const {\n runId,\n approvalId,\n apiBase = \"/api/workflows\",\n approver = \"unknown\",\n onDecision,\n onError,\n } = options;\n\n const [approval, setApproval] = useState<PendingApproval | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch approval data\n */\n useEffect(() => {\n const fetchApproval = async () => {\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch approval: ${response.status}`);\n }\n\n const data = await response.json();\n setApproval(data as PendingApproval);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (runId && approvalId) {\n fetchApproval();\n }\n }, [runId, approvalId, apiBase, onError]);\n\n /**\n * Submit a decision\n */\n const submitDecision = useCallback(\n async (decision: ApprovalDecision) => {\n if (!runId || !approvalId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(decision),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to submit decision: ${response.status}`);\n }\n\n // Update local state\n setApproval((prev) =>\n prev\n ? {\n ...prev,\n status: decision.approved ? \"approved\" : \"rejected\",\n resolvedAt: new Date(),\n resolvedBy: decision.approver,\n comment: decision.comment,\n }\n : null\n );\n\n onDecision?.(decision);\n } catch (err) {\n const submitError = err instanceof Error ? err : new Error(String(err));\n setError(submitError);\n onError?.(submitError);\n throw submitError;\n } finally {\n setIsSubmitting(false);\n }\n },\n [runId, approvalId, apiBase, onDecision, onError],\n );\n\n /**\n * Approve the request\n */\n const approve = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: true,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n /**\n * Reject the request\n */\n const reject = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: false,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n return {\n approval,\n approve,\n reject,\n submitDecision,\n isSubmitting,\n isLoading,\n error,\n isPending: approval?.status === \"pending\",\n isResolved: approval?.status !== \"pending\",\n };\n}\n", "/**\n * useWorkflowList Hook\n *\n * React hook for listing and filtering workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowList } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowList() {\n * const {\n * runs,\n * isLoading,\n * hasMore,\n * loadMore,\n * setFilter,\n * } = useWorkflowList({\n * workflowId: 'content-pipeline',\n * status: 'running',\n * });\n *\n * return (\n * <div>\n * {runs.map(run => (\n * <div key={run.id}>\n * {run.id} - {run.status}\n * </div>\n * ))}\n * {hasMore && (\n * <button onClick={loadMore}>Load More</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { RunFilter, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflowList hook\n */\nexport interface UseWorkflowListOptions {\n /** Filter by workflow ID */\n workflowId?: string;\n\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n\n /** Filter runs created after this date */\n createdAfter?: Date;\n\n /** Filter runs created before this date */\n createdBefore?: Date;\n\n /** Page size (defaults to 20) */\n pageSize?: number;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Enable automatic refresh */\n autoRefresh?: boolean;\n\n /** Refresh interval in ms (defaults to 5000) */\n refreshInterval?: number;\n}\n\n/**\n * Result from useWorkflowList hook\n */\nexport interface UseWorkflowListResult {\n /** List of workflow runs */\n runs: WorkflowRun[];\n\n /** Total count (if available) */\n totalCount?: number;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether there are more results */\n hasMore: boolean;\n\n /** Load more results */\n loadMore: () => Promise<void>;\n\n /** Refresh the list */\n refresh: () => Promise<void>;\n\n /** Update the filter */\n setFilter: (filter: Partial<UseWorkflowListOptions>) => void;\n\n /** Current filter */\n filter: RunFilter;\n}\n\n/**\n * useWorkflowList - List and filter workflow runs\n */\nexport function useWorkflowList(\n options: UseWorkflowListOptions = {},\n): UseWorkflowListResult {\n const {\n workflowId,\n status,\n createdAfter,\n createdBefore,\n pageSize = 20,\n apiBase = \"/api/workflows\",\n autoRefresh = false,\n refreshInterval = 5000,\n } = options;\n\n const [runs, setRuns] = useState<WorkflowRun[]>([]);\n const [totalCount, setTotalCount] = useState<number | undefined>();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [cursor, setCursor] = useState<string | undefined>();\n\n const [filter, setFilterState] = useState<RunFilter>({\n workflowId,\n status,\n createdAfter,\n createdBefore,\n limit: pageSize,\n });\n\n /**\n * Build query string from filter\n */\n const buildQueryString = useCallback(\n (filterToUse: RunFilter, cursorToUse?: string): string => {\n const params = new URLSearchParams();\n\n if (filterToUse.workflowId) {\n params.set(\"workflowId\", filterToUse.workflowId);\n }\n\n if (filterToUse.status) {\n const statuses = Array.isArray(filterToUse.status)\n ? filterToUse.status\n : [filterToUse.status];\n statuses.forEach((s) => params.append(\"status\", s));\n }\n\n if (filterToUse.createdAfter) {\n params.set(\"createdAfter\", filterToUse.createdAfter.toISOString());\n }\n\n if (filterToUse.createdBefore) {\n params.set(\"createdBefore\", filterToUse.createdBefore.toISOString());\n }\n\n if (filterToUse.limit) {\n params.set(\"limit\", String(filterToUse.limit));\n }\n\n if (cursorToUse) {\n params.set(\"cursor\", cursorToUse);\n }\n\n return params.toString();\n },\n [],\n );\n\n /**\n * Fetch runs\n */\n const fetchRuns = useCallback(\n async (append: boolean = false) => {\n try {\n const queryString = buildQueryString(filter, append ? cursor : undefined);\n const response = await fetch(`${apiBase}/runs?${queryString}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch runs: ${response.status}`);\n }\n\n const data = await response.json();\n const fetchedRuns = (data.runs || data) as WorkflowRun[];\n const nextCursor = data.cursor;\n const total = data.totalCount;\n\n if (append) {\n setRuns((prev) => [...prev, ...fetchedRuns]);\n } else {\n setRuns(fetchedRuns);\n }\n\n setCursor(nextCursor);\n setHasMore(!!nextCursor || fetchedRuns.length === filter.limit);\n setTotalCount(total);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n }\n },\n [apiBase, filter, cursor, buildQueryString],\n );\n\n /**\n * Initial fetch\n */\n useEffect(() => {\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n };\n\n doFetch();\n }, [filter]); // Re-fetch when filter changes\n\n /**\n * Auto-refresh setup\n */\n useEffect(() => {\n if (!autoRefresh) return;\n\n const intervalId = setInterval(() => {\n fetchRuns(false);\n }, refreshInterval);\n\n return () => clearInterval(intervalId);\n }, [autoRefresh, refreshInterval, fetchRuns]);\n\n /**\n * Load more results\n */\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading) return;\n setIsLoading(true);\n await fetchRuns(true);\n setIsLoading(false);\n }, [hasMore, isLoading, fetchRuns]);\n\n /**\n * Refresh the list\n */\n const refresh = useCallback(async () => {\n setCursor(undefined);\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n }, [fetchRuns]);\n\n /**\n * Update filter\n */\n const setFilter = useCallback(\n (newFilter: Partial<UseWorkflowListOptions>) => {\n setCursor(undefined); // Reset pagination\n setFilterState((prev) => ({\n ...prev,\n workflowId: newFilter.workflowId ?? prev.workflowId,\n status: newFilter.status ?? prev.status,\n createdAfter: newFilter.createdAfter ?? prev.createdAfter,\n createdBefore: newFilter.createdBefore ?? prev.createdBefore,\n limit: newFilter.pageSize ?? prev.limit,\n }));\n },\n [],\n );\n\n return {\n runs,\n totalCount,\n isLoading,\n error,\n hasMore,\n loadMore,\n refresh,\n setFilter,\n filter,\n };\n}\n", "/**\n * useWorkflowStart Hook\n *\n * React hook for starting workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowStart } from 'veryfront/ai/workflow/react';\n *\n * function StartWorkflowButton() {\n * const { start, isStarting, error, lastRunId } = useWorkflowStart({\n * workflowId: 'content-pipeline',\n * onStart: (runId) => {\n * console.log('Started:', runId);\n * },\n * });\n *\n * return (\n * <button\n * onClick={() => start({ topic: 'AI Safety' })}\n * disabled={isStarting}\n * >\n * {isStarting ? 'Starting...' : 'Start Workflow'}\n * </button>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useState } from \"react\";\n\n/**\n * Options for useWorkflowStart hook\n */\nexport interface UseWorkflowStartOptions {\n /** Workflow ID to start */\n workflowId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Callback when workflow starts successfully */\n onStart?: (runId: string) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useWorkflowStart hook\n */\nexport interface UseWorkflowStartResult<TInput = unknown> {\n /** Start a new workflow run */\n start: (input: TInput) => Promise<string>;\n\n /** Whether a start is in progress */\n isStarting: boolean;\n\n /** Last started run ID */\n lastRunId: string | null;\n\n /** Error state */\n error: Error | null;\n\n /** Reset error state */\n resetError: () => void;\n}\n\n/**\n * useWorkflowStart - Start new workflow runs\n */\nexport function useWorkflowStart<TInput = unknown>(\n options: UseWorkflowStartOptions,\n): UseWorkflowStartResult<TInput> {\n const { workflowId, apiBase = \"/api/workflows\", onStart, onError } = options;\n\n const [isStarting, setIsStarting] = useState(false);\n const [lastRunId, setLastRunId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Start a new workflow run\n */\n const start = useCallback(\n async (input: TInput): Promise<string> => {\n setIsStarting(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBase}/${workflowId}/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message || `Failed to start workflow: ${response.status}`,\n );\n }\n\n const data = await response.json();\n const runId = data.runId || data.id;\n\n setLastRunId(runId);\n onStart?.(runId);\n\n return runId;\n } catch (err) {\n const startError = err instanceof Error ? err : new Error(String(err));\n setError(startError);\n onError?.(startError);\n throw startError;\n } finally {\n setIsStarting(false);\n }\n },\n [workflowId, apiBase, onStart, onError],\n );\n\n /**\n * Reset error state\n */\n const resetError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n start,\n isStarting,\n lastRunId,\n error,\n resetError,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["z", "logger", "z", "tool", "tool", "z", "z", "tool", "hasNodeProcess", "hasNodeProcess", "hasNodeProcess", "tool", "resource", "prompt", "tool", "resource", "z", "agent", "z", "step", "agent", "z", "z", "fs", "dirname", "join", "join", "dirname", "fs", "tool", "agent", "resource", "DEFAULT_CONFIG", "z", "step", "tool", "z", "tool", "tool", "agent", "resource", "prompt", "tool", "resource", "tool", "generateId", "generateId", "state", "resolve", "generateId", "delay", "resolve", "agent", "tool", "workflow", "generateId", "resolve", "generateId", "workflow", "useCallback", "useEffect", "useState", "useCallback", "useEffect", "useState", "useCallback", "useState"]
7
7
  }