veryfront 0.0.72 → 0.0.73

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
3
  "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/react/hooks/use-chat.ts", "../../../src/core/errors/veryfront-error.ts", "../../../src/ai/react/hooks/use-agent.ts", "../../../src/ai/react/hooks/use-completion.ts", "../../../src/ai/react/hooks/use-streaming.ts", "../../../src/ai/react/hooks/use-voice-input.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 * useChat Hook - Layer 1 (Headless)\n *\n * Complete chat state management with zero UI.\n * Build any interface you want.\n *\n * NOTE: In production, this could leverage Vercel AI SDK's useChat\n * for battle-tested implementation. This is a simplified reference implementation.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\n/**\n * Text part - AI SDK v5 compatible\n */\nexport interface TextUIPart {\n type: \"text\";\n text: string;\n state?: \"streaming\" | \"done\";\n}\n\n/**\n * Reasoning part - AI SDK v5 compatible\n */\nexport interface ReasoningUIPart {\n type: \"reasoning\";\n text: string;\n state?: \"streaming\" | \"done\";\n}\n\n/**\n * Tool call state - AI SDK v5 compatible\n */\nexport type ToolState =\n | \"input-streaming\"\n | \"input-available\"\n | \"output-streaming\"\n | \"output-available\"\n | \"output-error\";\n\n/**\n * Tool UI part - AI SDK v5 compatible\n * Uses `tool-${toolName}` type pattern for static tools (e.g., \"tool-weather\")\n * Generic type allows typed tool inputs/outputs\n */\nexport interface ToolUIPart<NAME extends string = string, INPUT = unknown, OUTPUT = unknown> {\n type: `tool-${NAME}`;\n toolCallId: string;\n toolName: NAME;\n state: ToolState;\n input?: INPUT;\n output?: OUTPUT;\n errorText?: string;\n}\n\n/**\n * Tool result part - AI SDK v5 compatible\n */\nexport interface ToolResultUIPart<RESULT = unknown> {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: RESULT;\n isError?: boolean;\n}\n\n/**\n * Dynamic tool UI part - AI SDK v5 compatible\n * Used for MCP tools, user-defined functions, and runtime-loaded tools\n * where input/output types are unknown at compile time\n */\nexport interface DynamicToolUIPart {\n type: \"dynamic-tool\";\n toolCallId: string;\n toolName: string;\n state: ToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string;\n}\n\n/**\n * All possible UI message parts - AI SDK v5 compatible\n */\nexport type UIMessagePart =\n | TextUIPart\n | ReasoningUIPart\n | ToolUIPart\n | ToolResultUIPart\n | DynamicToolUIPart;\n\n/**\n * UI Message - AI SDK v5 compatible\n * Uses parts array as primary content structure\n */\nexport interface UIMessage {\n id: string;\n role: \"system\" | \"user\" | \"assistant\";\n parts: UIMessagePart[];\n metadata?: Record<string, unknown>;\n /** Message creation timestamp (optional) */\n createdAt?: Date | string;\n}\n\n/**\n * Tool output for addToolOutput - AI SDK v5 compatible\n */\nexport interface ToolOutput {\n tool: string;\n toolCallId: string;\n output?: unknown;\n state?: \"output-available\" | \"output-error\";\n errorText?: string;\n}\n\n/**\n * Tool call argument for onToolCall callback - AI SDK v5 compatible\n */\nexport interface OnToolCallArg {\n toolCall: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n /** Whether this is a dynamic tool (MCP, user-defined, etc.) */\n dynamic?: boolean;\n };\n}\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n api: string;\n\n /** Initial messages */\n initialMessages?: UIMessage[];\n\n /** Additional data to send */\n body?: Record<string, unknown>;\n\n /** Custom headers */\n headers?: Record<string, string>;\n\n /** Credentials mode */\n credentials?: RequestCredentials;\n\n /** Callback when response received */\n onResponse?: (response: Response) => void;\n\n /** Callback when message finished */\n onFinish?: (message: UIMessage) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n\n /**\n * Callback when tool call is available - AI SDK v5 compatible\n * Use addToolOutput to provide results (don't await inside callback)\n */\n onToolCall?: (arg: OnToolCallArg) => void | Promise<void>;\n}\n\nexport interface UseChatResult {\n /** Message history - AI SDK v5 UIMessage format */\n messages: UIMessage[];\n\n /** Current input value */\n input: string;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Set input value */\n setInput: (input: string) => void;\n\n /** Send a message - AI SDK v5 compatible */\n sendMessage: (message: { text: string }) => Promise<void>;\n\n /** Retry last message */\n reload: () => Promise<void>;\n\n /** Stop generation */\n stop: () => void;\n\n /** Manually set messages */\n setMessages: (messages: UIMessage[]) => void;\n\n /**\n * Add tool output - AI SDK v5 compatible\n * Call this from onToolCall to provide tool results\n */\n addToolOutput: (output: ToolOutput) => void;\n\n /** Additional data from server */\n data?: unknown;\n\n /** Handle input change */\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Handle form submit */\n handleSubmit: (e: React.FormEvent) => Promise<void>;\n}\n\n/**\n * useChat hook for managing chat state - AI SDK v5 compatible\n */\nexport function useChat(options: UseChatOptions): UseChatResult {\n const [messages, setMessages] = useState<UIMessage[]>(\n options.initialMessages || [],\n );\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<unknown>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Track pending tool outputs for addToolOutput\n const pendingToolOutputsRef = useRef<Map<string, ToolOutput>>(new Map());\n\n /**\n * Add tool output - AI SDK v5 compatible\n * Call from onToolCall to provide results (don't await)\n */\n const addToolOutput = useCallback((output: ToolOutput) => {\n pendingToolOutputsRef.current.set(output.toolCallId, output);\n\n // Update the tool part state in messages\n // Match tool-${toolName} pattern (AI SDK v5) or dynamic-tool\n setMessages((prev) =>\n prev.map((msg) => ({\n ...msg,\n parts: msg.parts.map((part) => {\n const isToolPart = part.type.startsWith(\"tool-\") || part.type === \"dynamic-tool\";\n if (isToolPart && \"toolCallId\" in part && part.toolCallId === output.toolCallId) {\n return {\n ...part,\n state: output.state || \"output-available\",\n output: output.output,\n errorText: output.errorText,\n };\n }\n return part;\n }),\n }))\n );\n }, []);\n\n /**\n * Send a message - AI SDK v5 compatible\n */\n const sendMessage = useCallback(\n async (message: { text: string }) => {\n const userMessage: UIMessage = {\n id: generateClientId(\"msg\"),\n role: \"user\",\n parts: [{ type: \"text\", text: message.text }],\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n setError(null);\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n credentials: options.credentials,\n body: JSON.stringify({\n messages: [...messages, userMessage],\n ...options.body,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `API error: ${response.status}`,\n }));\n }\n\n options.onResponse?.(response);\n\n if (response.body) {\n const streamingMessageId = generateClientId(\"msg\");\n let hasAddedStreamingMessage = false;\n // Track the actual message ID used (server ID takes precedence once received)\n let currentMessageId = streamingMessageId;\n\n await handleStreamingResponse(response.body, {\n onMessage: (assistantMessage) => {\n setMessages((prev) => {\n if (hasAddedStreamingMessage) {\n // Use currentMessageId which may have been updated to server's ID\n return prev.map((m) => m.id === currentMessageId ? assistantMessage : m);\n }\n return [...prev, assistantMessage];\n });\n options.onFinish?.(assistantMessage);\n },\n onData: setData,\n onUpdate: (parts, messageId) => {\n const id = messageId || streamingMessageId;\n // Update currentMessageId when server provides one\n if (messageId && messageId !== currentMessageId) {\n const oldId = currentMessageId;\n currentMessageId = messageId;\n // Update existing message to use new ID if already added\n if (hasAddedStreamingMessage) {\n setMessages((prev) => prev.map((m) => m.id === oldId ? { ...m, id, parts } : m));\n return;\n }\n }\n if (!hasAddedStreamingMessage) {\n hasAddedStreamingMessage = true;\n setMessages((prev) => [...prev, {\n id,\n role: \"assistant\",\n parts,\n }]);\n } else {\n setMessages((prev) =>\n prev.map((m) => m.id === currentMessageId ? { ...m, parts } : m)\n );\n }\n },\n onToolCall: options.onToolCall,\n });\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n options.onError?.(error);\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [messages, options],\n );\n\n /**\n * Reload last message\n */\n const reload = useCallback(async () => {\n if (messages.length === 0) return;\n\n const lastUserIndex = messages.findLastIndex((m) => m.role === \"user\");\n if (lastUserIndex === -1) return;\n\n const lastUserMessage = messages[lastUserIndex];\n if (!lastUserMessage) return;\n\n // Get text from parts\n const textPart = lastUserMessage.parts.find((p) => p.type === \"text\") as TextUIPart | undefined;\n if (!textPart) return;\n\n setMessages(messages.slice(0, lastUserIndex));\n await sendMessage({ text: textPart.text });\n }, [messages, sendMessage]);\n\n /**\n * Stop generation\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n }, []);\n\n /**\n * Handle input change\n */\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n },\n [],\n );\n\n /**\n * Handle form submit\n */\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!input.trim() || isLoading) return;\n\n const text = input;\n setInput(\"\");\n await sendMessage({ text });\n },\n [input, isLoading, sendMessage],\n );\n\n return {\n messages,\n input,\n isLoading,\n error,\n setInput,\n sendMessage,\n reload,\n stop,\n setMessages,\n addToolOutput,\n data,\n handleInputChange,\n handleSubmit,\n };\n}\n\n/**\n * Streaming response callbacks - AI SDK v5 compatible\n */\ninterface StreamingCallbacks {\n onMessage: (message: UIMessage) => void;\n onData: (data: unknown) => void;\n onUpdate?: (parts: UIMessagePart[], messageId: string) => void;\n onToolCall?: (arg: OnToolCallArg) => void;\n}\n\n/**\n * Internal tool tracking during streaming\n */\ninterface StreamingToolCall {\n toolCallId: string;\n toolName: string;\n inputText: string;\n input?: unknown;\n output?: unknown;\n error?: string;\n state: ToolState;\n /** Whether this is a dynamic tool (MCP, user-defined, etc.) */\n dynamic?: boolean;\n}\n\n/**\n * Internal reasoning tracking during streaming\n */\ninterface StreamingReasoning {\n id: string;\n text: string;\n isComplete: boolean;\n}\n\n/**\n * Handle streaming response from server\n * Supports AI SDK v5 UI Message Stream Protocol\n *\n * v5 Event Types:\n * - start: Stream beginning\n * - start-step / finish-step: Step boundaries (for multi-step/tools)\n * - text-start / text-delta / text-end: Text block lifecycle\n * - tool-input-start / tool-input-delta / tool-input-available: Tool input streaming\n * - tool-output-available: Tool result\n * - reasoning-start / reasoning-delta / reasoning-end: Reasoning block lifecycle\n * - finish: Stream end\n * - data: Custom data\n */\nasync function handleStreamingResponse(\n body: ReadableStream,\n callbacks: StreamingCallbacks,\n): Promise<void> {\n const { onMessage, onData, onUpdate, onToolCall } = callbacks;\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n // Track text blocks by ID (v5 uses IDs to group text-start/delta/end)\n const textBlocks = new Map<string, { text: string; state: \"streaming\" | \"done\" }>();\n let currentTextId = \"\";\n let messageId = \"\";\n\n // Track tool calls by ID\n const toolCalls = new Map<string, StreamingToolCall>();\n\n // Track reasoning blocks by ID\n const reasoningBlocks = new Map<string, StreamingReasoning>();\n\n // Message parts for v5 structured messages\n const messageParts: UIMessagePart[] = [];\n\n // Helper to build current parts for onUpdate\n const buildCurrentParts = (): UIMessagePart[] => {\n const parts: UIMessagePart[] = [];\n\n // Add text parts\n for (const [, block] of textBlocks) {\n if (block.text) {\n parts.push({ type: \"text\", text: block.text, state: block.state });\n }\n }\n\n // Add reasoning parts\n for (const [, reasoning] of reasoningBlocks) {\n parts.push({\n type: \"reasoning\",\n text: reasoning.text,\n state: reasoning.isComplete ? \"done\" : \"streaming\",\n });\n }\n\n // Add tool parts - use \"dynamic-tool\" type for dynamic tools\n for (const [, tool] of toolCalls) {\n if (tool.dynamic) {\n // Dynamic tools use \"dynamic-tool\" part type (AI SDK v5)\n parts.push({\n type: \"dynamic-tool\",\n toolCallId: tool.toolCallId,\n toolName: tool.toolName,\n state: tool.state,\n input: tool.input,\n output: tool.output,\n errorText: tool.error,\n });\n } else {\n // Static tools use \"tool-${toolName}\" part type (AI SDK v5)\n parts.push({\n type: `tool-${tool.toolName}` as const,\n toolCallId: tool.toolCallId,\n toolName: tool.toolName,\n state: tool.state,\n input: tool.input,\n output: tool.output,\n errorText: tool.error,\n } as ToolUIPart);\n }\n }\n\n return parts;\n };\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\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 switch (parsed.type) {\n // v5: Stream start\n case \"start\":\n messageId = parsed.messageId || generateClientId(\"msg\");\n textBlocks.clear();\n toolCalls.clear();\n reasoningBlocks.clear();\n messageParts.length = 0;\n break;\n\n // v5: Step boundaries (for multi-step tool calls)\n case \"start-step\":\n // Step started - could track step ID if needed\n break;\n case \"finish-step\":\n // Step finished - finalize any pending tool calls for this step\n break;\n\n // v5: Text block start\n case \"text-start\":\n currentTextId = parsed.id || generateClientId(\"text\");\n textBlocks.set(currentTextId, { text: \"\", state: \"streaming\" });\n break;\n\n // v5: Text delta\n case \"text-delta\": {\n const textId = parsed.id || currentTextId || \"default\";\n const delta = parsed.delta || \"\";\n\n // Initialize text block if needed\n if (!textBlocks.has(textId)) {\n textBlocks.set(textId, { text: \"\", state: \"streaming\" });\n currentTextId = textId;\n }\n\n // Append delta to text block\n const block = textBlocks.get(textId)!;\n block.text += delta;\n\n // Update UI with current parts\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Text block end\n case \"text-end\": {\n const textId = parsed.id || currentTextId;\n const block = textBlocks.get(textId);\n if (block) {\n block.state = \"done\";\n // Add text part to final message parts\n if (block.text) {\n messageParts.push({ type: \"text\", text: block.text, state: \"done\" });\n }\n }\n break;\n }\n\n // v5: Tool input start\n case \"tool-input-start\": {\n const toolCallId = parsed.toolCallId || generateClientId(\"tool\");\n const toolCall: StreamingToolCall = {\n toolCallId,\n toolName: parsed.toolName || \"unknown\",\n inputText: \"\",\n state: \"input-streaming\",\n dynamic: parsed.dynamic === true,\n };\n toolCalls.set(toolCallId, toolCall);\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Tool input delta (streaming tool arguments)\n case \"tool-input-delta\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.inputText += parsed.inputTextDelta || parsed.delta || \"\";\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool input available (complete input ready)\n case \"tool-input-available\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.input = parsed.input;\n toolCall.toolName = parsed.toolName || toolCall.toolName;\n toolCall.state = \"input-available\";\n // Update dynamic flag if provided (may not have been set during start)\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n\n // Notify via onToolCall - AI SDK v5 pattern\n onToolCall?.({\n toolCall: {\n toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n dynamic: toolCall.dynamic,\n },\n });\n\n // Add tool-${toolName} or dynamic-tool part based on tool type (AI SDK v5)\n messageParts.push(\n toolCall.dynamic\n ? {\n type: \"dynamic-tool\",\n toolCallId,\n toolName: toolCall.toolName,\n state: \"input-available\" as const,\n input: toolCall.input,\n }\n : {\n type: `tool-${toolCall.toolName}` as const,\n toolCallId,\n toolName: toolCall.toolName,\n state: \"input-available\" as const,\n input: toolCall.input,\n } as ToolUIPart,\n );\n\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool output available (result)\n case \"tool-output-available\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.output = parsed.output;\n toolCall.state = \"output-available\";\n\n // Add tool-result part\n messageParts.push({\n type: \"tool-result\",\n toolCallId,\n toolName: toolCall.toolName,\n result: toolCall.output,\n });\n\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool input error\n case \"tool-input-error\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.state = \"output-error\";\n toolCall.error = parsed.errorText;\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool output error\n case \"tool-output-error\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.state = \"output-error\";\n toolCall.error = parsed.errorText;\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Reasoning start\n case \"reasoning-start\": {\n const reasoningId = parsed.id || generateClientId(\"reasoning\");\n const reasoning: StreamingReasoning = {\n id: reasoningId,\n text: \"\",\n isComplete: false,\n };\n reasoningBlocks.set(reasoningId, reasoning);\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Reasoning delta\n case \"reasoning-delta\": {\n const reasoningId = parsed.id;\n const reasoning = reasoningBlocks.get(reasoningId);\n if (reasoning) {\n reasoning.text += parsed.delta || \"\";\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Reasoning end\n case \"reasoning-end\": {\n const reasoningId = parsed.id;\n const reasoning = reasoningBlocks.get(reasoningId);\n if (reasoning) {\n reasoning.isComplete = true;\n // Add reasoning part to final message\n messageParts.push({\n type: \"reasoning\",\n text: reasoning.text,\n state: \"done\",\n });\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Stream finish\n case \"finish\": {\n if (messageParts.length > 0 || textBlocks.size > 0) {\n onMessage(createAssistantMessage(messageId, messageParts));\n }\n break;\n }\n\n // Custom data events\n case \"data\":\n onData(parsed.data || parsed.value);\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n}\n\n/**\n * Create assistant message from parts - AI SDK v5 compatible\n */\nfunction createAssistantMessage(\n messageId: string,\n parts: UIMessagePart[],\n): UIMessage {\n return {\n id: messageId || generateClientId(\"msg\"),\n role: \"assistant\",\n parts,\n };\n}\n\n/**\n * Generate client-side ID (fallback when server doesn't provide one)\n */\nfunction generateClientId(prefix: string): string {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\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", "/**\n * useAgent Hook - Layer 1 (Headless)\n *\n * Agent orchestration with tool execution visualization.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseAgentOptions {\n /** Agent ID or endpoint */\n agent: string;\n\n /** Callback when tool is called */\n onToolCall?: (toolCall: ToolCall) => void;\n\n /** Callback when tool result received */\n onToolResult?: (toolCall: ToolCall, result: unknown) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseAgentResult {\n /** Message history */\n messages: Message[];\n\n /** Active tool calls */\n toolCalls: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Invoke the agent */\n invoke: (input: string) => Promise<void>;\n\n /** Stop agent execution */\n stop: () => void;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useAgent hook for agent orchestration\n */\nexport function useAgent(options: UseAgentOptions): UseAgentResult {\n const [messages, setMessages] = useState<Message[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [status, setStatus] = useState<AgentStatus>(\"idle\");\n const [thinking, setThinking] = useState<string | undefined>();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Invoke the agent\n */\n const invoke = useCallback(\n async (input: string) => {\n setIsLoading(true);\n setError(null);\n setStatus(\"thinking\");\n setToolCalls([]);\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n // Call agent API\n const response = await fetch(`/api/agents/${options.agent}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n input,\n messages,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `Agent error: ${response.status}`,\n }));\n }\n\n // Parse response\n const data = await response.json();\n\n // Update state\n setMessages(data.messages || []);\n setToolCalls(data.toolCalls || []);\n setStatus(data.status || \"completed\");\n setThinking(data.thinking);\n\n // Call callbacks for tool calls\n if (data.toolCalls && options.onToolCall) {\n data.toolCalls.forEach((tc: ToolCall) => {\n options.onToolCall!(tc);\n\n if (tc.result && options.onToolResult) {\n options.onToolResult(tc, tc.result);\n }\n });\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus(\"error\");\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [messages, options],\n );\n\n /**\n * Stop agent execution\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n setStatus(\"idle\");\n }, []);\n\n return {\n messages,\n toolCalls,\n status,\n thinking,\n invoke,\n stop,\n isLoading,\n error,\n };\n}\n", "/**\n * useCompletion Hook - Layer 1 (Headless)\n *\n * Single text completion with streaming support.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseCompletionOptions {\n /** API endpoint for completion */\n api: string;\n\n /** Additional data to send */\n body?: Record<string, unknown>;\n\n /** Custom headers */\n headers?: Record<string, string>;\n\n /** Callback when response received */\n onResponse?: (response: Response) => void;\n\n /** Callback when completion finished */\n onFinish?: (completion: string) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseCompletionResult {\n /** Generated completion text */\n completion: string;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Complete a prompt */\n complete: (prompt: string) => Promise<void>;\n\n /** Stop generation */\n stop: () => void;\n\n /** Set completion manually */\n setCompletion: (completion: string) => void;\n}\n\n/**\n * useCompletion hook for single text generation\n */\nexport function useCompletion(\n options: UseCompletionOptions,\n): UseCompletionResult {\n const [completion, setCompletion] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Complete a prompt\n */\n const complete = useCallback(\n async (prompt: string) => {\n setIsLoading(true);\n setError(null);\n setCompletion(\"\");\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n // Call API\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: JSON.stringify({\n prompt,\n ...options.body,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `API error: ${response.status}`,\n }));\n }\n\n if (options.onResponse) {\n options.onResponse(response);\n }\n\n // Handle streaming response\n if (response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n accumulatedText += chunk;\n setCompletion(accumulatedText);\n }\n\n if (options.onFinish) {\n options.onFinish(accumulatedText);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [options],\n );\n\n /**\n * Stop generation\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n }, []);\n\n return {\n completion,\n isLoading,\n error,\n complete,\n stop,\n setCompletion,\n };\n}\n", "/**\n * useStreaming Hook - Layer 1 (Headless)\n *\n * Low-level streaming control for custom implementations.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseStreamingOptions {\n /** URL to stream from */\n url: string;\n\n /** Callback for each chunk */\n onChunk?: (chunk: string) => void;\n\n /** Callback when stream completes */\n onComplete?: () => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseStreamingResult {\n /** Streaming data */\n data: string;\n\n /** Streaming state */\n isStreaming: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Start streaming */\n start: (body?: Record<string, unknown>) => Promise<void>;\n\n /** Stop streaming */\n stop: () => void;\n\n /** Reset data */\n reset: () => void;\n}\n\n/**\n * useStreaming hook for low-level streaming control\n */\nexport function useStreaming(\n options: UseStreamingOptions,\n): UseStreamingResult {\n const [data, setData] = useState(\"\");\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Start streaming\n */\n const start = useCallback(\n async (body?: Record<string, unknown>) => {\n setIsStreaming(true);\n setError(null);\n setData(\"\");\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await fetch(options.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `Streaming error: ${response.status}`,\n }));\n }\n\n if (!response.body) {\n throw toError(createError({\n type: \"agent\",\n message: \"No response body\",\n }));\n }\n\n // Read stream\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let accumulatedData = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n accumulatedData += chunk;\n setData(accumulatedData);\n\n if (options.onChunk) {\n options.onChunk(chunk);\n }\n }\n\n if (options.onComplete) {\n options.onComplete();\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n [options],\n );\n\n /**\n * Stop streaming\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }, []);\n\n /**\n * Reset data\n */\n const reset = useCallback(() => {\n setData(\"\");\n setError(null);\n }, []);\n\n return {\n data,\n isStreaming,\n error,\n start,\n stop,\n reset,\n };\n}\n", "/**\n * useVoiceInput - Web Speech API hook for voice input\n *\n * Provides browser-based speech recognition for chat input.\n */\n\nimport * as React from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Language for speech recognition (default: browser default) */\n language?: string;\n\n /** Continuous listening mode (default: false) */\n continuous?: boolean;\n\n /** Show interim results while speaking (default: true) */\n interimResults?: boolean;\n\n /** Callback when transcript is received */\n onTranscript?: (transcript: string, isFinal: boolean) => void;\n\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n\n /** Callback when listening starts */\n onStart?: () => void;\n\n /** Callback when listening ends */\n onEnd?: () => void;\n}\n\nexport interface UseVoiceInputResult {\n /** Whether voice input is supported in this browser */\n isSupported: boolean;\n\n /** Whether currently listening */\n isListening: boolean;\n\n /** Current transcript (interim or final) */\n transcript: string;\n\n /** Start listening */\n start: () => void;\n\n /** Stop listening */\n stop: () => void;\n\n /** Toggle listening on/off */\n toggle: () => void;\n\n /** Clear the transcript */\n clear: () => void;\n\n /** Last error message */\n error: string | null;\n}\n\n// Type for SpeechRecognition (not in all TypeScript libs)\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n message: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onstart: (() => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition?: new () => SpeechRecognition;\n webkitSpeechRecognition?: new () => SpeechRecognition;\n }\n}\n\n/**\n * useVoiceInput - Voice input hook using Web Speech API\n *\n * @example\n * ```tsx\n * const { isListening, transcript, toggle, isSupported } = useVoiceInput({\n * onTranscript: (text, isFinal) => {\n * if (isFinal) setInput(text);\n * }\n * });\n *\n * if (!isSupported) return <span>Voice not supported</span>;\n *\n * return (\n * <button onClick={toggle}>\n * {isListening ? 'Stop' : 'Start'} Voice\n * </button>\n * );\n * ```\n */\nexport function useVoiceInput(\n options: UseVoiceInputOptions = {},\n): UseVoiceInputResult {\n const {\n language,\n continuous = false,\n interimResults = true,\n onTranscript,\n onError,\n onStart,\n onEnd,\n } = options;\n\n const [isListening, setIsListening] = React.useState(false);\n const [transcript, setTranscript] = React.useState(\"\");\n const [error, setError] = React.useState<string | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognition | null>(null);\n\n // Check browser support\n const isSupported = React.useMemo(() => {\n if (typeof globalThis === \"undefined\") return false;\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n return !!(g.SpeechRecognition || g.webkitSpeechRecognition);\n }, []);\n\n // Initialize recognition\n React.useEffect(() => {\n if (!isSupported) return;\n\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n const SpeechRecognitionAPI = g.SpeechRecognition || g.webkitSpeechRecognition;\n\n if (!SpeechRecognitionAPI) return;\n\n const recognition = new SpeechRecognitionAPI();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n\n if (language) {\n recognition.lang = language;\n }\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result || !result[0]) continue;\n\n if (result.isFinal) {\n finalTranscript += result[0].transcript;\n } else {\n interimTranscript += result[0].transcript;\n }\n }\n\n const currentTranscript = finalTranscript || interimTranscript;\n setTranscript(currentTranscript);\n\n if (onTranscript) {\n onTranscript(currentTranscript, !!finalTranscript);\n }\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n\n if (onError) {\n onError(errorMessage);\n }\n };\n\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n\n if (onStart) {\n onStart();\n }\n };\n\n recognition.onend = () => {\n setIsListening(false);\n\n if (onEnd) {\n onEnd();\n }\n };\n\n recognitionRef.current = recognition;\n\n return () => {\n recognition.abort();\n };\n }, [isSupported, language, continuous, interimResults, onTranscript, onError, onStart, onEnd]);\n\n const start = React.useCallback(() => {\n if (!recognitionRef.current || isListening) return;\n\n setTranscript(\"\");\n setError(null);\n\n try {\n recognitionRef.current.start();\n } catch {\n // Already started\n console.warn(\"Speech recognition already started\");\n }\n }, [isListening]);\n\n const stop = React.useCallback(() => {\n if (!recognitionRef.current || !isListening) return;\n\n recognitionRef.current.stop();\n }, [isListening]);\n\n const toggle = React.useCallback(() => {\n if (isListening) {\n stop();\n } else {\n start();\n }\n }, [isListening, start, stop]);\n\n const clear = React.useCallback(() => {\n setTranscript(\"\");\n }, []);\n\n return {\n isSupported,\n isListening,\n transcript,\n start,\n stop,\n toggle,\n clear,\n error,\n };\n}\n\nfunction getErrorMessage(error: string): string {\n switch (error) {\n case \"no-speech\":\n return \"No speech detected. Please try again.\";\n case \"audio-capture\":\n return \"No microphone found. Please check your device.\";\n case \"not-allowed\":\n return \"Microphone permission denied. Please allow access.\";\n case \"network\":\n return \"Network error. Please check your connection.\";\n case \"aborted\":\n return \"Speech recognition was aborted.\";\n case \"language-not-supported\":\n return \"Language not supported.\";\n case \"service-not-allowed\":\n return \"Speech recognition service not allowed.\";\n default:\n return `Speech recognition error: ${error}`;\n }\n}\n"],
5
- "mappings": "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",
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 * useChat Hook - Layer 1 (Headless)\n *\n * Complete chat state management with zero UI.\n * Build any interface you want.\n *\n * NOTE: In production, this could leverage Vercel AI SDK's useChat\n * for battle-tested implementation. This is a simplified reference implementation.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\n/**\n * Text part - AI SDK v5 compatible\n */\nexport interface TextUIPart {\n type: \"text\";\n text: string;\n state?: \"streaming\" | \"done\";\n}\n\n/**\n * Reasoning part - AI SDK v5 compatible\n */\nexport interface ReasoningUIPart {\n type: \"reasoning\";\n text: string;\n state?: \"streaming\" | \"done\";\n}\n\n/**\n * Tool call state - AI SDK v5 compatible\n */\nexport type ToolState =\n | \"input-streaming\"\n | \"input-available\"\n | \"output-streaming\"\n | \"output-available\"\n | \"output-error\";\n\n/**\n * Tool UI part - AI SDK v5 compatible\n * Uses `tool-${toolName}` type pattern for static tools (e.g., \"tool-weather\")\n * Generic type allows typed tool inputs/outputs\n */\nexport interface ToolUIPart<NAME extends string = string, INPUT = unknown, OUTPUT = unknown> {\n type: `tool-${NAME}`;\n toolCallId: string;\n toolName: NAME;\n state: ToolState;\n input?: INPUT;\n output?: OUTPUT;\n errorText?: string;\n}\n\n/**\n * Tool result part - AI SDK v5 compatible\n */\nexport interface ToolResultUIPart<RESULT = unknown> {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: RESULT;\n isError?: boolean;\n}\n\n/**\n * Dynamic tool UI part - AI SDK v5 compatible\n * Used for MCP tools, user-defined functions, and runtime-loaded tools\n * where input/output types are unknown at compile time\n */\nexport interface DynamicToolUIPart {\n type: \"dynamic-tool\";\n toolCallId: string;\n toolName: string;\n state: ToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string;\n}\n\n/**\n * All possible UI message parts - AI SDK v5 compatible\n */\nexport type UIMessagePart =\n | TextUIPart\n | ReasoningUIPart\n | ToolUIPart\n | ToolResultUIPart\n | DynamicToolUIPart;\n\n/**\n * UI Message - AI SDK v5 compatible\n * Uses parts array as primary content structure\n */\nexport interface UIMessage {\n id: string;\n role: \"system\" | \"user\" | \"assistant\";\n parts: UIMessagePart[];\n metadata?: Record<string, unknown>;\n /** Message creation timestamp (optional) */\n createdAt?: Date | string;\n}\n\n/**\n * Tool output for addToolOutput - AI SDK v5 compatible\n */\nexport interface ToolOutput {\n tool: string;\n toolCallId: string;\n output?: unknown;\n state?: \"output-available\" | \"output-error\";\n errorText?: string;\n}\n\n/**\n * Tool call argument for onToolCall callback - AI SDK v5 compatible\n */\nexport interface OnToolCallArg {\n toolCall: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n /** Whether this is a dynamic tool (MCP, user-defined, etc.) */\n dynamic?: boolean;\n };\n}\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n api: string;\n\n /** Initial messages */\n initialMessages?: UIMessage[];\n\n /** Additional data to send */\n body?: Record<string, unknown>;\n\n /** Custom headers */\n headers?: Record<string, string>;\n\n /** Credentials mode */\n credentials?: RequestCredentials;\n\n /** Callback when response received */\n onResponse?: (response: Response) => void;\n\n /** Callback when message finished */\n onFinish?: (message: UIMessage) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n\n /**\n * Callback when tool call is available - AI SDK v5 compatible\n * Use addToolOutput to provide results (don't await inside callback)\n */\n onToolCall?: (arg: OnToolCallArg) => void | Promise<void>;\n}\n\nexport interface UseChatResult {\n /** Message history - AI SDK v5 UIMessage format */\n messages: UIMessage[];\n\n /** Current input value */\n input: string;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Set input value */\n setInput: (input: string) => void;\n\n /** Send a message - AI SDK v5 compatible */\n sendMessage: (message: { text: string }) => Promise<void>;\n\n /** Retry last message */\n reload: () => Promise<void>;\n\n /** Stop generation */\n stop: () => void;\n\n /** Manually set messages */\n setMessages: (messages: UIMessage[]) => void;\n\n /**\n * Add tool output - AI SDK v5 compatible\n * Call this from onToolCall to provide tool results\n */\n addToolOutput: (output: ToolOutput) => void;\n\n /** Additional data from server */\n data?: unknown;\n\n /** Handle input change */\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Handle form submit */\n handleSubmit: (e: React.FormEvent) => Promise<void>;\n}\n\n/**\n * useChat hook for managing chat state - AI SDK v5 compatible\n */\nexport function useChat(options: UseChatOptions): UseChatResult {\n const [messages, setMessages] = useState<UIMessage[]>(\n options.initialMessages || [],\n );\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<unknown>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Track pending tool outputs for addToolOutput\n const pendingToolOutputsRef = useRef<Map<string, ToolOutput>>(new Map());\n\n /**\n * Add tool output - AI SDK v5 compatible\n * Call from onToolCall to provide results (don't await)\n */\n const addToolOutput = useCallback((output: ToolOutput) => {\n pendingToolOutputsRef.current.set(output.toolCallId, output);\n\n // Update the tool part state in messages\n // Match tool-${toolName} pattern (AI SDK v5) or dynamic-tool\n setMessages((prev) =>\n prev.map((msg) => ({\n ...msg,\n parts: msg.parts.map((part) => {\n const isToolPart = part.type.startsWith(\"tool-\") || part.type === \"dynamic-tool\";\n if (isToolPart && \"toolCallId\" in part && part.toolCallId === output.toolCallId) {\n return {\n ...part,\n state: output.state || \"output-available\",\n output: output.output,\n errorText: output.errorText,\n };\n }\n return part;\n }),\n }))\n );\n }, []);\n\n /**\n * Send a message - AI SDK v5 compatible\n */\n const sendMessage = useCallback(\n async (message: { text: string }) => {\n const userMessage: UIMessage = {\n id: generateClientId(\"msg\"),\n role: \"user\",\n parts: [{ type: \"text\", text: message.text }],\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n setError(null);\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n credentials: options.credentials,\n body: JSON.stringify({\n messages: [...messages, userMessage],\n ...options.body,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `API error: ${response.status}`,\n }));\n }\n\n options.onResponse?.(response);\n\n if (response.body) {\n const streamingMessageId = generateClientId(\"msg\");\n let hasAddedStreamingMessage = false;\n // Track the actual message ID used (server ID takes precedence once received)\n let currentMessageId = streamingMessageId;\n\n await handleStreamingResponse(response.body, {\n onMessage: (assistantMessage) => {\n setMessages((prev) => {\n if (hasAddedStreamingMessage) {\n // Use currentMessageId which may have been updated to server's ID\n return prev.map((m) => m.id === currentMessageId ? assistantMessage : m);\n }\n return [...prev, assistantMessage];\n });\n options.onFinish?.(assistantMessage);\n },\n onData: setData,\n onUpdate: (parts, messageId) => {\n const id = messageId || streamingMessageId;\n // Update currentMessageId when server provides one\n if (messageId && messageId !== currentMessageId) {\n const oldId = currentMessageId;\n currentMessageId = messageId;\n // Update existing message to use new ID if already added\n if (hasAddedStreamingMessage) {\n setMessages((prev) => prev.map((m) => m.id === oldId ? { ...m, id, parts } : m));\n return;\n }\n }\n if (!hasAddedStreamingMessage) {\n hasAddedStreamingMessage = true;\n setMessages((prev) => [...prev, {\n id,\n role: \"assistant\",\n parts,\n }]);\n } else {\n setMessages((prev) =>\n prev.map((m) => m.id === currentMessageId ? { ...m, parts } : m)\n );\n }\n },\n onToolCall: options.onToolCall,\n });\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n options.onError?.(error);\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [messages, options],\n );\n\n /**\n * Reload last message\n */\n const reload = useCallback(async () => {\n if (messages.length === 0) return;\n\n const lastUserIndex = messages.findLastIndex((m) => m.role === \"user\");\n if (lastUserIndex === -1) return;\n\n const lastUserMessage = messages[lastUserIndex];\n if (!lastUserMessage) return;\n\n // Get text from parts\n const textPart = lastUserMessage.parts.find((p) => p.type === \"text\") as TextUIPart | undefined;\n if (!textPart) return;\n\n setMessages(messages.slice(0, lastUserIndex));\n await sendMessage({ text: textPart.text });\n }, [messages, sendMessage]);\n\n /**\n * Stop generation\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n }, []);\n\n /**\n * Handle input change\n */\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n },\n [],\n );\n\n /**\n * Handle form submit\n */\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!input.trim() || isLoading) return;\n\n const text = input;\n setInput(\"\");\n await sendMessage({ text });\n },\n [input, isLoading, sendMessage],\n );\n\n return {\n messages,\n input,\n isLoading,\n error,\n setInput,\n sendMessage,\n reload,\n stop,\n setMessages,\n addToolOutput,\n data,\n handleInputChange,\n handleSubmit,\n };\n}\n\n/**\n * Streaming response callbacks - AI SDK v5 compatible\n */\ninterface StreamingCallbacks {\n onMessage: (message: UIMessage) => void;\n onData: (data: unknown) => void;\n onUpdate?: (parts: UIMessagePart[], messageId: string) => void;\n onToolCall?: (arg: OnToolCallArg) => void;\n}\n\n/**\n * Internal tool tracking during streaming\n */\ninterface StreamingToolCall {\n toolCallId: string;\n toolName: string;\n inputText: string;\n input?: unknown;\n output?: unknown;\n error?: string;\n state: ToolState;\n /** Whether this is a dynamic tool (MCP, user-defined, etc.) */\n dynamic?: boolean;\n}\n\n/**\n * Internal reasoning tracking during streaming\n */\ninterface StreamingReasoning {\n id: string;\n text: string;\n isComplete: boolean;\n}\n\n/**\n * Handle streaming response from server\n * Supports AI SDK v5 UI Message Stream Protocol\n *\n * v5 Event Types:\n * - start: Stream beginning\n * - start-step / finish-step: Step boundaries (for multi-step/tools)\n * - text-start / text-delta / text-end: Text block lifecycle\n * - tool-input-start / tool-input-delta / tool-input-available: Tool input streaming\n * - tool-output-available: Tool result\n * - reasoning-start / reasoning-delta / reasoning-end: Reasoning block lifecycle\n * - finish: Stream end\n * - data: Custom data\n */\nasync function handleStreamingResponse(\n body: ReadableStream,\n callbacks: StreamingCallbacks,\n): Promise<void> {\n const { onMessage, onData, onUpdate, onToolCall } = callbacks;\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n // Track text blocks by ID (v5 uses IDs to group text-start/delta/end)\n // Order is assigned when first content arrives (at text-delta), not at text-start\n const textBlocks = new Map<\n string,\n { text: string; state: \"streaming\" | \"done\"; order: number | null }\n >();\n let currentTextId = \"\";\n let messageId = \"\";\n\n // Track tool calls by ID (with order for proper sequencing)\n const toolCalls = new Map<string, StreamingToolCall & { order: number }>();\n\n // Track reasoning blocks by ID\n const reasoningBlocks = new Map<string, StreamingReasoning & { order: number }>();\n\n // Message parts for v5 structured messages\n const messageParts: UIMessagePart[] = [];\n\n // Global order counter to track sequence of parts\n let partOrderCounter = 0;\n\n // Helper to build current parts for onUpdate - preserves stream order\n const buildCurrentParts = (): UIMessagePart[] => {\n // Collect all parts with their order\n const orderedParts: Array<{ order: number; part: UIMessagePart }> = [];\n\n // Add text parts (only if they have content and an order)\n for (const [, block] of textBlocks) {\n if (block.text && block.order !== null) {\n orderedParts.push({\n order: block.order,\n part: { type: \"text\", text: block.text, state: block.state },\n });\n }\n }\n\n // Add reasoning parts\n for (const [, reasoning] of reasoningBlocks) {\n orderedParts.push({\n order: reasoning.order,\n part: {\n type: \"reasoning\",\n text: reasoning.text,\n state: reasoning.isComplete ? \"done\" : \"streaming\",\n },\n });\n }\n\n // Add tool parts - use \"dynamic-tool\" type for dynamic tools\n for (const [, tool] of toolCalls) {\n if (tool.dynamic) {\n // Dynamic tools use \"dynamic-tool\" part type (AI SDK v5)\n orderedParts.push({\n order: tool.order,\n part: {\n type: \"dynamic-tool\",\n toolCallId: tool.toolCallId,\n toolName: tool.toolName,\n state: tool.state,\n input: tool.input,\n output: tool.output,\n errorText: tool.error,\n },\n });\n } else {\n // Static tools use \"tool-${toolName}\" part type (AI SDK v5)\n orderedParts.push({\n order: tool.order,\n part: {\n type: `tool-${tool.toolName}` as const,\n toolCallId: tool.toolCallId,\n toolName: tool.toolName,\n state: tool.state,\n input: tool.input,\n output: tool.output,\n errorText: tool.error,\n } as ToolUIPart,\n });\n }\n }\n\n // Sort by order and extract parts\n return orderedParts.sort((a, b) => a.order - b.order).map((p) => p.part);\n };\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\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 switch (parsed.type) {\n // v5: Stream start\n case \"start\":\n messageId = parsed.messageId || generateClientId(\"msg\");\n textBlocks.clear();\n toolCalls.clear();\n reasoningBlocks.clear();\n messageParts.length = 0;\n break;\n\n // v5: Step boundaries (for multi-step tool calls)\n case \"start-step\":\n // Step started - could track step ID if needed\n break;\n case \"finish-step\":\n // Step finished - finalize any pending tool calls for this step\n break;\n\n // v5: Text block start\n case \"text-start\":\n currentTextId = parsed.id || generateClientId(\"text\");\n // Don't assign order yet - assign when first content arrives (text-delta)\n textBlocks.set(currentTextId, { text: \"\", state: \"streaming\", order: null });\n break;\n\n // v5: Text delta\n case \"text-delta\": {\n const textId = parsed.id || currentTextId || \"default\";\n const delta = parsed.textDelta || parsed.delta || \"\";\n\n // Initialize text block if needed\n if (!textBlocks.has(textId)) {\n textBlocks.set(textId, { text: \"\", state: \"streaming\", order: null });\n currentTextId = textId;\n }\n\n // Append delta to text block\n const block = textBlocks.get(textId)!;\n block.text += delta;\n\n // Assign order on first content (when text actually starts arriving)\n if (block.order === null) {\n block.order = partOrderCounter++;\n }\n\n // Update UI with current parts\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Text block end\n case \"text-end\": {\n const textId = parsed.id || currentTextId;\n const block = textBlocks.get(textId);\n if (block) {\n block.state = \"done\";\n // Add text part to final message parts\n if (block.text) {\n messageParts.push({ type: \"text\", text: block.text, state: \"done\" });\n }\n }\n break;\n }\n\n // v5: Tool input start\n case \"tool-input-start\": {\n const toolCallId = parsed.toolCallId || generateClientId(\"tool\");\n const toolCall: StreamingToolCall & { order: number } = {\n toolCallId,\n toolName: parsed.toolName || \"unknown\",\n inputText: \"\",\n state: \"input-streaming\",\n dynamic: parsed.dynamic === true,\n order: partOrderCounter++,\n };\n toolCalls.set(toolCallId, toolCall);\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Tool input delta (streaming tool arguments)\n case \"tool-input-delta\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.inputText += parsed.inputTextDelta || parsed.delta || \"\";\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool input available (complete input ready)\n case \"tool-input-available\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.input = parsed.input;\n toolCall.toolName = parsed.toolName || toolCall.toolName;\n toolCall.state = \"input-available\";\n // Update dynamic flag if provided (may not have been set during start)\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n\n // Notify via onToolCall - AI SDK v5 pattern\n onToolCall?.({\n toolCall: {\n toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n dynamic: toolCall.dynamic,\n },\n });\n\n // Add tool-${toolName} or dynamic-tool part based on tool type (AI SDK v5)\n messageParts.push(\n toolCall.dynamic\n ? {\n type: \"dynamic-tool\",\n toolCallId,\n toolName: toolCall.toolName,\n state: \"input-available\" as const,\n input: toolCall.input,\n }\n : {\n type: `tool-${toolCall.toolName}` as const,\n toolCallId,\n toolName: toolCall.toolName,\n state: \"input-available\" as const,\n input: toolCall.input,\n } as ToolUIPart,\n );\n\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool output available (result)\n case \"tool-output-available\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.output = parsed.output;\n toolCall.state = \"output-available\";\n\n // Add tool-result part\n messageParts.push({\n type: \"tool-result\",\n toolCallId,\n toolName: toolCall.toolName,\n result: toolCall.output,\n });\n\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool input error\n case \"tool-input-error\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.state = \"output-error\";\n toolCall.error = parsed.errorText;\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Tool output error\n case \"tool-output-error\": {\n const toolCallId = parsed.toolCallId;\n const toolCall = toolCalls.get(toolCallId);\n if (toolCall) {\n toolCall.state = \"output-error\";\n toolCall.error = parsed.errorText;\n if (parsed.dynamic === true) {\n toolCall.dynamic = true;\n }\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Reasoning start\n case \"reasoning-start\": {\n const reasoningId = parsed.id || generateClientId(\"reasoning\");\n const reasoning: StreamingReasoning & { order: number } = {\n id: reasoningId,\n text: \"\",\n isComplete: false,\n order: partOrderCounter++,\n };\n reasoningBlocks.set(reasoningId, reasoning);\n onUpdate?.(buildCurrentParts(), messageId);\n break;\n }\n\n // v5: Reasoning delta\n case \"reasoning-delta\": {\n const reasoningId = parsed.id;\n const reasoning = reasoningBlocks.get(reasoningId);\n if (reasoning) {\n reasoning.text += parsed.delta || \"\";\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Reasoning end\n case \"reasoning-end\": {\n const reasoningId = parsed.id;\n const reasoning = reasoningBlocks.get(reasoningId);\n if (reasoning) {\n reasoning.isComplete = true;\n // Add reasoning part to final message\n messageParts.push({\n type: \"reasoning\",\n text: reasoning.text,\n state: \"done\",\n });\n onUpdate?.(buildCurrentParts(), messageId);\n }\n break;\n }\n\n // v5: Stream finish\n case \"finish\": {\n // Use buildCurrentParts() to get the latest state from toolCalls Map\n // instead of messageParts which may have stale tool states\n const finalParts = buildCurrentParts();\n if (finalParts.length > 0) {\n onMessage(createAssistantMessage(messageId, finalParts));\n }\n break;\n }\n\n // Custom data events\n case \"data\":\n onData(parsed.data || parsed.value);\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n}\n\n/**\n * Create assistant message from parts - AI SDK v5 compatible\n */\nfunction createAssistantMessage(\n messageId: string,\n parts: UIMessagePart[],\n): UIMessage {\n return {\n id: messageId || generateClientId(\"msg\"),\n role: \"assistant\",\n parts,\n };\n}\n\n/**\n * Generate client-side ID (fallback when server doesn't provide one)\n */\nfunction generateClientId(prefix: string): string {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\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", "/**\n * useAgent Hook - Layer 1 (Headless)\n *\n * Agent orchestration with tool execution visualization.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseAgentOptions {\n /** Agent ID or endpoint */\n agent: string;\n\n /** Callback when tool is called */\n onToolCall?: (toolCall: ToolCall) => void;\n\n /** Callback when tool result received */\n onToolResult?: (toolCall: ToolCall, result: unknown) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseAgentResult {\n /** Message history */\n messages: Message[];\n\n /** Active tool calls */\n toolCalls: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Invoke the agent */\n invoke: (input: string) => Promise<void>;\n\n /** Stop agent execution */\n stop: () => void;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useAgent hook for agent orchestration\n */\nexport function useAgent(options: UseAgentOptions): UseAgentResult {\n const [messages, setMessages] = useState<Message[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [status, setStatus] = useState<AgentStatus>(\"idle\");\n const [thinking, setThinking] = useState<string | undefined>();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Invoke the agent\n */\n const invoke = useCallback(\n async (input: string) => {\n setIsLoading(true);\n setError(null);\n setStatus(\"thinking\");\n setToolCalls([]);\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n // Call agent API\n const response = await fetch(`/api/agents/${options.agent}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n input,\n messages,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `Agent error: ${response.status}`,\n }));\n }\n\n // Parse response\n const data = await response.json();\n\n // Update state\n setMessages(data.messages || []);\n setToolCalls(data.toolCalls || []);\n setStatus(data.status || \"completed\");\n setThinking(data.thinking);\n\n // Call callbacks for tool calls\n if (data.toolCalls && options.onToolCall) {\n data.toolCalls.forEach((tc: ToolCall) => {\n options.onToolCall!(tc);\n\n if (tc.result && options.onToolResult) {\n options.onToolResult(tc, tc.result);\n }\n });\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus(\"error\");\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [messages, options],\n );\n\n /**\n * Stop agent execution\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n setStatus(\"idle\");\n }, []);\n\n return {\n messages,\n toolCalls,\n status,\n thinking,\n invoke,\n stop,\n isLoading,\n error,\n };\n}\n", "/**\n * useCompletion Hook - Layer 1 (Headless)\n *\n * Single text completion with streaming support.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseCompletionOptions {\n /** API endpoint for completion */\n api: string;\n\n /** Additional data to send */\n body?: Record<string, unknown>;\n\n /** Custom headers */\n headers?: Record<string, string>;\n\n /** Callback when response received */\n onResponse?: (response: Response) => void;\n\n /** Callback when completion finished */\n onFinish?: (completion: string) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseCompletionResult {\n /** Generated completion text */\n completion: string;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Complete a prompt */\n complete: (prompt: string) => Promise<void>;\n\n /** Stop generation */\n stop: () => void;\n\n /** Set completion manually */\n setCompletion: (completion: string) => void;\n}\n\n/**\n * useCompletion hook for single text generation\n */\nexport function useCompletion(\n options: UseCompletionOptions,\n): UseCompletionResult {\n const [completion, setCompletion] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Complete a prompt\n */\n const complete = useCallback(\n async (prompt: string) => {\n setIsLoading(true);\n setError(null);\n setCompletion(\"\");\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n // Call API\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n body: JSON.stringify({\n prompt,\n ...options.body,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `API error: ${response.status}`,\n }));\n }\n\n if (options.onResponse) {\n options.onResponse(response);\n }\n\n // Handle streaming response\n if (response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n accumulatedText += chunk;\n setCompletion(accumulatedText);\n }\n\n if (options.onFinish) {\n options.onFinish(accumulatedText);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [options],\n );\n\n /**\n * Stop generation\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n }, []);\n\n return {\n completion,\n isLoading,\n error,\n complete,\n stop,\n setCompletion,\n };\n}\n", "/**\n * useStreaming Hook - Layer 1 (Headless)\n *\n * Low-level streaming control for custom implementations.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseStreamingOptions {\n /** URL to stream from */\n url: string;\n\n /** Callback for each chunk */\n onChunk?: (chunk: string) => void;\n\n /** Callback when stream completes */\n onComplete?: () => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseStreamingResult {\n /** Streaming data */\n data: string;\n\n /** Streaming state */\n isStreaming: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Start streaming */\n start: (body?: Record<string, unknown>) => Promise<void>;\n\n /** Stop streaming */\n stop: () => void;\n\n /** Reset data */\n reset: () => void;\n}\n\n/**\n * useStreaming hook for low-level streaming control\n */\nexport function useStreaming(\n options: UseStreamingOptions,\n): UseStreamingResult {\n const [data, setData] = useState(\"\");\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Start streaming\n */\n const start = useCallback(\n async (body?: Record<string, unknown>) => {\n setIsStreaming(true);\n setError(null);\n setData(\"\");\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await fetch(options.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw toError(createError({\n type: \"agent\",\n message: `Streaming error: ${response.status}`,\n }));\n }\n\n if (!response.body) {\n throw toError(createError({\n type: \"agent\",\n message: \"No response body\",\n }));\n }\n\n // Read stream\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let accumulatedData = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n accumulatedData += chunk;\n setData(accumulatedData);\n\n if (options.onChunk) {\n options.onChunk(chunk);\n }\n }\n\n if (options.onComplete) {\n options.onComplete();\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n\n if (options.onError) {\n options.onError(error);\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n [options],\n );\n\n /**\n * Stop streaming\n */\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsStreaming(false);\n }, []);\n\n /**\n * Reset data\n */\n const reset = useCallback(() => {\n setData(\"\");\n setError(null);\n }, []);\n\n return {\n data,\n isStreaming,\n error,\n start,\n stop,\n reset,\n };\n}\n", "/**\n * useVoiceInput - Web Speech API hook for voice input\n *\n * Provides browser-based speech recognition for chat input.\n */\n\nimport * as React from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Language for speech recognition (default: browser default) */\n language?: string;\n\n /** Continuous listening mode (default: false) */\n continuous?: boolean;\n\n /** Show interim results while speaking (default: true) */\n interimResults?: boolean;\n\n /** Callback when transcript is received */\n onTranscript?: (transcript: string, isFinal: boolean) => void;\n\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n\n /** Callback when listening starts */\n onStart?: () => void;\n\n /** Callback when listening ends */\n onEnd?: () => void;\n}\n\nexport interface UseVoiceInputResult {\n /** Whether voice input is supported in this browser */\n isSupported: boolean;\n\n /** Whether currently listening */\n isListening: boolean;\n\n /** Current transcript (interim or final) */\n transcript: string;\n\n /** Start listening */\n start: () => void;\n\n /** Stop listening */\n stop: () => void;\n\n /** Toggle listening on/off */\n toggle: () => void;\n\n /** Clear the transcript */\n clear: () => void;\n\n /** Last error message */\n error: string | null;\n}\n\n// Type for SpeechRecognition (not in all TypeScript libs)\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n message: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onstart: (() => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition?: new () => SpeechRecognition;\n webkitSpeechRecognition?: new () => SpeechRecognition;\n }\n}\n\n/**\n * useVoiceInput - Voice input hook using Web Speech API\n *\n * @example\n * ```tsx\n * const { isListening, transcript, toggle, isSupported } = useVoiceInput({\n * onTranscript: (text, isFinal) => {\n * if (isFinal) setInput(text);\n * }\n * });\n *\n * if (!isSupported) return <span>Voice not supported</span>;\n *\n * return (\n * <button onClick={toggle}>\n * {isListening ? 'Stop' : 'Start'} Voice\n * </button>\n * );\n * ```\n */\nexport function useVoiceInput(\n options: UseVoiceInputOptions = {},\n): UseVoiceInputResult {\n const {\n language,\n continuous = false,\n interimResults = true,\n onTranscript,\n onError,\n onStart,\n onEnd,\n } = options;\n\n const [isListening, setIsListening] = React.useState(false);\n const [transcript, setTranscript] = React.useState(\"\");\n const [error, setError] = React.useState<string | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognition | null>(null);\n\n // Check browser support\n const isSupported = React.useMemo(() => {\n if (typeof globalThis === \"undefined\") return false;\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n return !!(g.SpeechRecognition || g.webkitSpeechRecognition);\n }, []);\n\n // Initialize recognition\n React.useEffect(() => {\n if (!isSupported) return;\n\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n const SpeechRecognitionAPI = g.SpeechRecognition || g.webkitSpeechRecognition;\n\n if (!SpeechRecognitionAPI) return;\n\n const recognition = new SpeechRecognitionAPI();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n\n if (language) {\n recognition.lang = language;\n }\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result || !result[0]) continue;\n\n if (result.isFinal) {\n finalTranscript += result[0].transcript;\n } else {\n interimTranscript += result[0].transcript;\n }\n }\n\n const currentTranscript = finalTranscript || interimTranscript;\n setTranscript(currentTranscript);\n\n if (onTranscript) {\n onTranscript(currentTranscript, !!finalTranscript);\n }\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n\n if (onError) {\n onError(errorMessage);\n }\n };\n\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n\n if (onStart) {\n onStart();\n }\n };\n\n recognition.onend = () => {\n setIsListening(false);\n\n if (onEnd) {\n onEnd();\n }\n };\n\n recognitionRef.current = recognition;\n\n return () => {\n recognition.abort();\n };\n }, [isSupported, language, continuous, interimResults, onTranscript, onError, onStart, onEnd]);\n\n const start = React.useCallback(() => {\n if (!recognitionRef.current || isListening) return;\n\n setTranscript(\"\");\n setError(null);\n\n try {\n recognitionRef.current.start();\n } catch {\n // Already started\n console.warn(\"Speech recognition already started\");\n }\n }, [isListening]);\n\n const stop = React.useCallback(() => {\n if (!recognitionRef.current || !isListening) return;\n\n recognitionRef.current.stop();\n }, [isListening]);\n\n const toggle = React.useCallback(() => {\n if (isListening) {\n stop();\n } else {\n start();\n }\n }, [isListening, start, stop]);\n\n const clear = React.useCallback(() => {\n setTranscript(\"\");\n }, []);\n\n return {\n isSupported,\n isListening,\n transcript,\n start,\n stop,\n toggle,\n clear,\n error,\n };\n}\n\nfunction getErrorMessage(error: string): string {\n switch (error) {\n case \"no-speech\":\n return \"No speech detected. Please try again.\";\n case \"audio-capture\":\n return \"No microphone found. Please check your device.\";\n case \"not-allowed\":\n return \"Microphone permission denied. Please allow access.\";\n case \"network\":\n return \"Network error. Please check your connection.\";\n case \"aborted\":\n return \"Speech recognition was aborted.\";\n case \"language-not-supported\":\n return \"Language not supported.\";\n case \"service-not-allowed\":\n return \"Speech recognition service not allowed.\";\n default:\n return `Speech recognition error: ${error}`;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["error", "useCallback", "useRef", "useState", "useState", "useRef", "useCallback", "error", "useCallback", "useRef", "useState", "useState", "useRef", "useCallback", "error", "useCallback", "useRef", "useState", "useState", "useRef", "useCallback", "error"]
7
7
  }
@@ -392,19 +392,17 @@ function toError(veryfrontError) {
392
392
  }
393
393
 
394
394
  // src/platform/compat/runtime.ts
395
- var isDeno = typeof Deno !== "undefined";
395
+ var isDeno = typeof Deno !== "undefined" && typeof Deno.version === "object";
396
396
  var isNode = typeof globalThis.process !== "undefined" && globalThis.process?.versions?.node !== void 0;
397
397
  var isBun = typeof globalThis.Bun !== "undefined";
398
398
  var isCloudflare = typeof globalThis !== "undefined" && "caches" in globalThis && "WebSocketPair" in globalThis;
399
399
 
400
400
  // src/platform/compat/fs.ts
401
401
  var NodeFileSystem = class {
402
- constructor() {
403
- this.fs = null;
404
- this.os = null;
405
- this.path = null;
406
- this.initialized = false;
407
- }
402
+ fs = null;
403
+ os = null;
404
+ path = null;
405
+ initialized = false;
408
406
  async ensureInitialized() {
409
407
  if (this.initialized)
410
408
  return;
@@ -698,7 +696,7 @@ var LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
698
696
  // deno.json
699
697
  var deno_default = {
700
698
  name: "veryfront",
701
- version: "0.0.71",
699
+ version: "0.0.73",
702
700
  nodeModulesDir: "auto",
703
701
  exclude: [
704
702
  "npm/",
@@ -1022,11 +1020,9 @@ var VERYFRONT_PATHS = {
1022
1020
 
1023
1021
  // src/core/utils/bundle-manifest.ts
1024
1022
  var InMemoryBundleManifestStore = class {
1025
- constructor() {
1026
- this.metadata = /* @__PURE__ */ new Map();
1027
- this.code = /* @__PURE__ */ new Map();
1028
- this.sourceIndex = /* @__PURE__ */ new Map();
1029
- }
1023
+ metadata = /* @__PURE__ */ new Map();
1024
+ code = /* @__PURE__ */ new Map();
1025
+ sourceIndex = /* @__PURE__ */ new Map();
1030
1026
  getBundleMetadata(key) {
1031
1027
  const entry = this.metadata.get(key);
1032
1028
  if (!entry)
@@ -1119,6 +1115,9 @@ var manifestStore = new InMemoryBundleManifestStore();
1119
1115
 
1120
1116
  // src/ai/workflow/blob/local-storage.ts
1121
1117
  var LocalBlobStorage = class {
1118
+ rootDir;
1119
+ baseUrl;
1120
+ fs;
1122
1121
  constructor(rootDir, baseUrl) {
1123
1122
  this.rootDir = rootDir;
1124
1123
  this.baseUrl = baseUrl;
@@ -1272,9 +1271,10 @@ Original error: ${error instanceof Error ? error.message : String(error)}`
1272
1271
  }
1273
1272
  }
1274
1273
  var S3BlobStorage = class {
1274
+ client = null;
1275
+ config;
1276
+ initPromise = null;
1275
1277
  constructor(config) {
1276
- this.client = null;
1277
- this.initPromise = null;
1278
1278
  this.config = config;
1279
1279
  this.initPromise = this.initialize();
1280
1280
  }
@@ -1504,8 +1504,9 @@ var S3BlobStorage = class {
1504
1504
 
1505
1505
  // src/ai/workflow/blob/gcs-storage.ts
1506
1506
  var GCSBlobStorage = class {
1507
+ config;
1508
+ tokenCache = null;
1507
1509
  constructor(config) {
1508
- this.tokenCache = null;
1509
1510
  this.config = config;
1510
1511
  try {
1511
1512
  JSON.parse(this.config.serviceAccountKey);
@@ -1793,12 +1794,13 @@ function hasEventSupport(backend) {
1793
1794
  // src/ai/workflow/backends/memory.ts
1794
1795
  var DEFAULT_MAX_QUEUE_SIZE = 1e4;
1795
1796
  var MemoryBackend = class {
1797
+ runs = /* @__PURE__ */ new Map();
1798
+ checkpoints = /* @__PURE__ */ new Map();
1799
+ approvals = /* @__PURE__ */ new Map();
1800
+ queue = [];
1801
+ locks = /* @__PURE__ */ new Map();
1802
+ config;
1796
1803
  constructor(config = {}) {
1797
- this.runs = /* @__PURE__ */ new Map();
1798
- this.checkpoints = /* @__PURE__ */ new Map();
1799
- this.approvals = /* @__PURE__ */ new Map();
1800
- this.queue = [];
1801
- this.locks = /* @__PURE__ */ new Map();
1802
1804
  this.config = {
1803
1805
  prefix: "wf:",
1804
1806
  debug: false,
@@ -2355,10 +2357,11 @@ var DenoRedisAdapter = class {
2355
2357
  }
2356
2358
  };
2357
2359
  var RedisBackend = class {
2360
+ client = null;
2361
+ connectionPromise = null;
2362
+ config;
2363
+ initialized = false;
2358
2364
  constructor(config = {}) {
2359
- this.client = null;
2360
- this.connectionPromise = null;
2361
- this.initialized = false;
2362
2365
  this.config = {
2363
2366
  prefix: "vf:workflow:",
2364
2367
  streamKey: "vf:workflow:stream",
@@ -2897,6 +2900,7 @@ var RedisBackend = class {
2897
2900
 
2898
2901
  // src/ai/workflow/executor/dag-executor.ts
2899
2902
  var DAGExecutor = class {
2903
+ config;
2900
2904
  constructor(config) {
2901
2905
  this.config = {
2902
2906
  maxConcurrency: 10,
@@ -3438,6 +3442,7 @@ var DAGExecutor = class {
3438
3442
 
3439
3443
  // src/ai/workflow/executor/checkpoint-manager.ts
3440
3444
  var CheckpointManager = class {
3445
+ config;
3441
3446
  constructor(config) {
3442
3447
  this.config = {
3443
3448
  debug: false,
@@ -3595,6 +3600,7 @@ var CheckpointManager = class {
3595
3600
  // src/ai/workflow/executor/step-executor.ts
3596
3601
  var DEFAULT_STEP_TIMEOUT_MS = 5 * 60 * 1e3;
3597
3602
  var StepExecutor = class {
3603
+ config;
3598
3604
  constructor(config = {}) {
3599
3605
  this.config = {
3600
3606
  defaultTimeout: DEFAULT_STEP_TIMEOUT_MS,
@@ -3816,8 +3822,15 @@ var StepExecutor = class {
3816
3822
 
3817
3823
  // src/ai/workflow/executor/workflow-executor.ts
3818
3824
  var WorkflowExecutor = class _WorkflowExecutor {
3825
+ config;
3826
+ stepExecutor;
3827
+ checkpointManager;
3828
+ dagExecutor;
3829
+ workflows = /* @__PURE__ */ new Map();
3830
+ blobResolver;
3831
+ /** Default lock duration: 30 seconds */
3832
+ static DEFAULT_LOCK_DURATION = 3e4;
3819
3833
  constructor(config) {
3820
- this.workflows = /* @__PURE__ */ new Map();
3821
3834
  this.config = {
3822
3835
  maxConcurrency: 10,
3823
3836
  debug: false,
@@ -3853,10 +3866,6 @@ var WorkflowExecutor = class _WorkflowExecutor {
3853
3866
  };
3854
3867
  }
3855
3868
  }
3856
- static {
3857
- /** Default lock duration: 30 seconds */
3858
- this.DEFAULT_LOCK_DURATION = 3e4;
3859
- }
3860
3869
  /**
3861
3870
  * Register a workflow definition
3862
3871
  */
@@ -4211,8 +4220,10 @@ var WorkflowExecutor = class _WorkflowExecutor {
4211
4220
 
4212
4221
  // src/ai/workflow/runtime/approval-manager.ts
4213
4222
  var ApprovalManager = class {
4223
+ config;
4224
+ expirationTimer;
4225
+ destroyed = false;
4214
4226
  constructor(config) {
4215
- this.destroyed = false;
4216
4227
  this.config = {
4217
4228
  expirationCheckInterval: 6e4,
4218
4229
  // Check every minute
@@ -4439,9 +4450,7 @@ var ApprovalManager = class {
4439
4450
 
4440
4451
  // src/ai/workflow/runtime/agent-registry.ts
4441
4452
  var DefaultAgentRegistry = class {
4442
- constructor() {
4443
- this.agents = /* @__PURE__ */ new Map();
4444
- }
4453
+ agents = /* @__PURE__ */ new Map();
4445
4454
  /**
4446
4455
  * Register an agent
4447
4456
  */
@@ -4488,9 +4497,7 @@ var DefaultAgentRegistry = class {
4488
4497
  }
4489
4498
  };
4490
4499
  var DefaultToolRegistry = class {
4491
- constructor() {
4492
- this.tools = /* @__PURE__ */ new Map();
4493
- }
4500
+ tools = /* @__PURE__ */ new Map();
4494
4501
  /**
4495
4502
  * Register a tool
4496
4503
  */
@@ -4615,6 +4622,10 @@ function createMockTool(id, options = {}) {
4615
4622
 
4616
4623
  // src/ai/workflow/api/workflow-client.ts
4617
4624
  var WorkflowClient = class {
4625
+ backend;
4626
+ executor;
4627
+ approvalManager;
4628
+ debug;
4618
4629
  constructor(config = {}) {
4619
4630
  this.debug = config.debug ?? false;
4620
4631
  this.backend = config.backend ?? new MemoryBackend({ debug: this.debug });
@@ -4779,6 +4790,7 @@ function createWorkflowClient(config) {
4779
4790
 
4780
4791
  // src/ai/workflow/backends/temporal.ts
4781
4792
  var TemporalAdapter = class {
4793
+ config;
4782
4794
  constructor(config = {}) {
4783
4795
  this.config = {
4784
4796
  address: "localhost:7233",
@@ -4839,6 +4851,7 @@ var TemporalAdapter = class {
4839
4851
 
4840
4852
  // src/ai/workflow/backends/inngest.ts
4841
4853
  var InngestAdapter = class {
4854
+ config;
4842
4855
  constructor(config = {}) {
4843
4856
  this.config = {
4844
4857
  debug: false,
@@ -4896,6 +4909,7 @@ var InngestAdapter = class {
4896
4909
 
4897
4910
  // src/ai/workflow/backends/cloudflare.ts
4898
4911
  var CloudflareAdapter = class {
4912
+ config;
4899
4913
  constructor(config = {}) {
4900
4914
  this.config = {
4901
4915
  durableObjectBinding: "WORKFLOW_DO",