veryfront 0.0.67 → 0.0.69

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 type { Message } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n\nexport interface UseChatOptions {\n /** API endpoint for chat */\n api: string;\n\n /** Initial messages */\n initialMessages?: Message[];\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: Message) => void;\n\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\nexport interface UseChatResult {\n /** Message history */\n messages: Message[];\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 /** Add a message and get response */\n append: (message: Omit<Message, \"id\" | \"timestamp\">) => 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: Message[]) => 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\n */\nexport function useChat(options: UseChatOptions): UseChatResult {\n const [messages, setMessages] = useState<Message[]>(\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 /**\n * Append a message and get AI response\n */\n const append = useCallback(\n async (message: Omit<Message, \"id\" | \"timestamp\">) => {\n const userMessage: Message = {\n ...message,\n id: `msg_${Date.now()}`,\n timestamp: Date.now(),\n };\n\n // Add user message\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n setError(null);\n\n // Create abort controller\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 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 if (options.onResponse) {\n options.onResponse(response);\n }\n\n // Handle streaming response\n if (response.body) {\n // Create a placeholder message ID for streaming\n const streamingMessageId = `msg_${Date.now()}`;\n let hasAddedStreamingMessage = false;\n\n await handleStreamingResponse(\n response.body,\n // onMessage - when streaming is complete\n (assistantMessage) => {\n // Replace the streaming message with the final message\n setMessages((prev) => {\n // If we had a streaming message, replace it\n if (hasAddedStreamingMessage) {\n return prev.map((m) => m.id === streamingMessageId ? assistantMessage : m);\n }\n // Otherwise just add it\n return [...prev, assistantMessage];\n });\n\n if (options.onFinish) {\n options.onFinish(assistantMessage);\n }\n },\n // onData - for data events\n (partialData) => {\n setData(partialData);\n },\n // onUpdate - for real-time streaming updates\n (partialContent, messageId) => {\n if (!hasAddedStreamingMessage) {\n // Add the streaming message for the first time\n hasAddedStreamingMessage = true;\n setMessages((prev) => [\n ...prev,\n {\n id: messageId || streamingMessageId,\n role: \"assistant\" as const,\n content: partialContent,\n timestamp: Date.now(),\n },\n ]);\n } else {\n // Update the streaming message content\n setMessages((prev) =>\n prev.map((m) =>\n m.id === (messageId || streamingMessageId)\n ? { ...m, content: partialContent }\n : m\n )\n );\n }\n },\n );\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n // Request was aborted, ignore\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 [messages, options],\n );\n\n /**\n * Reload last message\n */\n const reload = useCallback(async () => {\n if (messages.length === 0) return;\n\n // Remove last assistant message and re-send user message\n const lastUserMessageIndex = messages.findLastIndex((m) => m.role === \"user\");\n\n if (lastUserMessageIndex === -1) return;\n\n const messagesToKeep = messages.slice(0, lastUserMessageIndex);\n const lastUserMessage = messages[lastUserMessageIndex];\n\n // Early return already handled undefined case above\n if (!lastUserMessage) return;\n\n setMessages(messagesToKeep);\n\n await append({\n role: lastUserMessage.role,\n content: lastUserMessage.content,\n });\n }, [messages, append]);\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\n if (!input.trim() || isLoading) return;\n\n const messageContent = input;\n setInput(\"\");\n\n await append({\n role: \"user\",\n content: messageContent,\n });\n },\n [input, isLoading, append],\n );\n\n return {\n messages,\n input,\n isLoading,\n error,\n setInput,\n append,\n reload,\n stop,\n setMessages,\n data,\n handleInputChange,\n handleSubmit,\n };\n}\n\n/**\n * Handle streaming response from server\n * Uses Vercel AI SDK data stream format\n */\nasync function handleStreamingResponse(\n body: ReadableStream,\n onMessage: (message: Message) => void,\n onData: (data: unknown) => void,\n onUpdate?: (partialContent: string, messageId: string) => void,\n): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n let messageId = `msg_${Date.now()}`;\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 if (data === \"[DONE]\") {\n // Stream finished - create the assistant message\n if (accumulatedText) {\n const assistantMessage: Message = {\n id: messageId,\n role: \"assistant\",\n content: accumulatedText,\n timestamp: Date.now(),\n };\n onMessage(assistantMessage);\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"data\") {\n onData(parsed.data);\n } else if (parsed.type === \"start\") {\n // New message starting\n messageId = parsed.messageId || `msg_${Date.now()}`;\n accumulatedText = \"\";\n } else if (parsed.type === \"text-delta\") {\n // Text chunk - accumulate and update UI\n accumulatedText += parsed.textDelta || \"\";\n // Call onUpdate to show text progressively\n if (onUpdate) {\n onUpdate(accumulatedText, messageId);\n }\n } else if (parsed.type === \"finish\") {\n // Stream completed\n if (accumulatedText) {\n const assistantMessage: Message = {\n id: messageId,\n role: \"assistant\",\n content: accumulatedText,\n timestamp: Date.now(),\n };\n onMessage(assistantMessage);\n }\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n}\n", "export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "/**\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 * Generic type allows typed tool inputs/outputs\n */\nexport interface ToolUIPart<INPUT = unknown, OUTPUT = unknown> {\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\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 * All possible UI message parts - AI SDK v5 compatible\n */\nexport type UIMessagePart =\n | TextUIPart\n | ReasoningUIPart\n | ToolUIPart\n | ToolResultUIPart;\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}\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 };\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 setMessages((prev) =>\n prev.map((msg) => ({\n ...msg,\n parts: msg.parts.map((part) => {\n if (part.type === \"tool-call\" && part.toolCallId === output.toolCallId) {\n return {\n ...part,\n state: output.state || \"output-available\",\n output: output.output,\n errorText: output.errorText,\n } as ToolUIPart;\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\n await handleStreamingResponse(response.body, {\n onMessage: (assistantMessage) => {\n setMessages((prev) => {\n if (hasAddedStreamingMessage) {\n return prev.map((m) => m.id === streamingMessageId ? 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 if (!hasAddedStreamingMessage) {\n hasAddedStreamingMessage = true;\n setMessages((prev) => [...prev, {\n id,\n role: \"assistant\",\n parts,\n }]);\n } else {\n setMessages((prev) => prev.map((m) => m.id === id ? { ...m, parts } : m));\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 state: ToolState;\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\n for (const [, tool] of toolCalls) {\n parts.push({\n type: \"tool-call\",\n toolCallId: tool.toolCallId,\n toolName: tool.toolName,\n state: tool.state,\n input: tool.input,\n output: tool.output,\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 };\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\n // Notify via onToolCall - AI SDK v5 pattern\n onToolCall?.({\n toolCall: {\n toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n },\n });\n\n // Add tool-call part\n messageParts.push({\n type: \"tool-call\",\n toolCallId,\n toolName: toolCall.toolName,\n state: \"input-available\",\n input: toolCall.input,\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: 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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",
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
  }
@@ -399,10 +399,12 @@ var isCloudflare = typeof globalThis !== "undefined" && "caches" in globalThis &
399
399
 
400
400
  // src/platform/compat/fs.ts
401
401
  var NodeFileSystem = class {
402
- fs = null;
403
- os = null;
404
- path = null;
405
- initialized = false;
402
+ constructor() {
403
+ this.fs = null;
404
+ this.os = null;
405
+ this.path = null;
406
+ this.initialized = false;
407
+ }
406
408
  async ensureInitialized() {
407
409
  if (this.initialized)
408
410
  return;
@@ -696,7 +698,7 @@ var LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
696
698
  // deno.json
697
699
  var deno_default = {
698
700
  name: "veryfront",
699
- version: "0.0.67",
701
+ version: "0.0.68",
700
702
  nodeModulesDir: "auto",
701
703
  exclude: [
702
704
  "npm/",
@@ -1020,9 +1022,11 @@ var VERYFRONT_PATHS = {
1020
1022
 
1021
1023
  // src/core/utils/bundle-manifest.ts
1022
1024
  var InMemoryBundleManifestStore = class {
1023
- metadata = /* @__PURE__ */ new Map();
1024
- code = /* @__PURE__ */ new Map();
1025
- sourceIndex = /* @__PURE__ */ new Map();
1025
+ constructor() {
1026
+ this.metadata = /* @__PURE__ */ new Map();
1027
+ this.code = /* @__PURE__ */ new Map();
1028
+ this.sourceIndex = /* @__PURE__ */ new Map();
1029
+ }
1026
1030
  getBundleMetadata(key) {
1027
1031
  const entry = this.metadata.get(key);
1028
1032
  if (!entry)
@@ -1115,9 +1119,6 @@ var manifestStore = new InMemoryBundleManifestStore();
1115
1119
 
1116
1120
  // src/ai/workflow/blob/local-storage.ts
1117
1121
  var LocalBlobStorage = class {
1118
- rootDir;
1119
- baseUrl;
1120
- fs;
1121
1122
  constructor(rootDir, baseUrl) {
1122
1123
  this.rootDir = rootDir;
1123
1124
  this.baseUrl = baseUrl;
@@ -1271,10 +1272,9 @@ Original error: ${error instanceof Error ? error.message : String(error)}`
1271
1272
  }
1272
1273
  }
1273
1274
  var S3BlobStorage = class {
1274
- client = null;
1275
- config;
1276
- initPromise = null;
1277
1275
  constructor(config) {
1276
+ this.client = null;
1277
+ this.initPromise = null;
1278
1278
  this.config = config;
1279
1279
  this.initPromise = this.initialize();
1280
1280
  }
@@ -1504,9 +1504,8 @@ var S3BlobStorage = class {
1504
1504
 
1505
1505
  // src/ai/workflow/blob/gcs-storage.ts
1506
1506
  var GCSBlobStorage = class {
1507
- config;
1508
- tokenCache = null;
1509
1507
  constructor(config) {
1508
+ this.tokenCache = null;
1510
1509
  this.config = config;
1511
1510
  try {
1512
1511
  JSON.parse(this.config.serviceAccountKey);
@@ -1794,13 +1793,12 @@ function hasEventSupport(backend) {
1794
1793
  // src/ai/workflow/backends/memory.ts
1795
1794
  var DEFAULT_MAX_QUEUE_SIZE = 1e4;
1796
1795
  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;
1803
1796
  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();
1804
1802
  this.config = {
1805
1803
  prefix: "wf:",
1806
1804
  debug: false,
@@ -2357,11 +2355,10 @@ var DenoRedisAdapter = class {
2357
2355
  }
2358
2356
  };
2359
2357
  var RedisBackend = class {
2360
- client = null;
2361
- connectionPromise = null;
2362
- config;
2363
- initialized = false;
2364
2358
  constructor(config = {}) {
2359
+ this.client = null;
2360
+ this.connectionPromise = null;
2361
+ this.initialized = false;
2365
2362
  this.config = {
2366
2363
  prefix: "vf:workflow:",
2367
2364
  streamKey: "vf:workflow:stream",
@@ -2900,7 +2897,6 @@ var RedisBackend = class {
2900
2897
 
2901
2898
  // src/ai/workflow/executor/dag-executor.ts
2902
2899
  var DAGExecutor = class {
2903
- config;
2904
2900
  constructor(config) {
2905
2901
  this.config = {
2906
2902
  maxConcurrency: 10,
@@ -3442,7 +3438,6 @@ var DAGExecutor = class {
3442
3438
 
3443
3439
  // src/ai/workflow/executor/checkpoint-manager.ts
3444
3440
  var CheckpointManager = class {
3445
- config;
3446
3441
  constructor(config) {
3447
3442
  this.config = {
3448
3443
  debug: false,
@@ -3600,7 +3595,6 @@ var CheckpointManager = class {
3600
3595
  // src/ai/workflow/executor/step-executor.ts
3601
3596
  var DEFAULT_STEP_TIMEOUT_MS = 5 * 60 * 1e3;
3602
3597
  var StepExecutor = class {
3603
- config;
3604
3598
  constructor(config = {}) {
3605
3599
  this.config = {
3606
3600
  defaultTimeout: DEFAULT_STEP_TIMEOUT_MS,
@@ -3822,15 +3816,8 @@ var StepExecutor = class {
3822
3816
 
3823
3817
  // src/ai/workflow/executor/workflow-executor.ts
3824
3818
  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;
3833
3819
  constructor(config) {
3820
+ this.workflows = /* @__PURE__ */ new Map();
3834
3821
  this.config = {
3835
3822
  maxConcurrency: 10,
3836
3823
  debug: false,
@@ -3866,6 +3853,10 @@ var WorkflowExecutor = class _WorkflowExecutor {
3866
3853
  };
3867
3854
  }
3868
3855
  }
3856
+ static {
3857
+ /** Default lock duration: 30 seconds */
3858
+ this.DEFAULT_LOCK_DURATION = 3e4;
3859
+ }
3869
3860
  /**
3870
3861
  * Register a workflow definition
3871
3862
  */
@@ -4220,10 +4211,8 @@ var WorkflowExecutor = class _WorkflowExecutor {
4220
4211
 
4221
4212
  // src/ai/workflow/runtime/approval-manager.ts
4222
4213
  var ApprovalManager = class {
4223
- config;
4224
- expirationTimer;
4225
- destroyed = false;
4226
4214
  constructor(config) {
4215
+ this.destroyed = false;
4227
4216
  this.config = {
4228
4217
  expirationCheckInterval: 6e4,
4229
4218
  // Check every minute
@@ -4450,7 +4439,9 @@ var ApprovalManager = class {
4450
4439
 
4451
4440
  // src/ai/workflow/runtime/agent-registry.ts
4452
4441
  var DefaultAgentRegistry = class {
4453
- agents = /* @__PURE__ */ new Map();
4442
+ constructor() {
4443
+ this.agents = /* @__PURE__ */ new Map();
4444
+ }
4454
4445
  /**
4455
4446
  * Register an agent
4456
4447
  */
@@ -4497,7 +4488,9 @@ var DefaultAgentRegistry = class {
4497
4488
  }
4498
4489
  };
4499
4490
  var DefaultToolRegistry = class {
4500
- tools = /* @__PURE__ */ new Map();
4491
+ constructor() {
4492
+ this.tools = /* @__PURE__ */ new Map();
4493
+ }
4501
4494
  /**
4502
4495
  * Register a tool
4503
4496
  */
@@ -4613,10 +4606,6 @@ function createMockTool(id, options = {}) {
4613
4606
 
4614
4607
  // src/ai/workflow/api/workflow-client.ts
4615
4608
  var WorkflowClient = class {
4616
- backend;
4617
- executor;
4618
- approvalManager;
4619
- debug;
4620
4609
  constructor(config = {}) {
4621
4610
  this.debug = config.debug ?? false;
4622
4611
  this.backend = config.backend ?? new MemoryBackend({ debug: this.debug });
@@ -4781,7 +4770,6 @@ function createWorkflowClient(config) {
4781
4770
 
4782
4771
  // src/ai/workflow/backends/temporal.ts
4783
4772
  var TemporalAdapter = class {
4784
- config;
4785
4773
  constructor(config = {}) {
4786
4774
  this.config = {
4787
4775
  address: "localhost:7233",
@@ -4842,7 +4830,6 @@ var TemporalAdapter = class {
4842
4830
 
4843
4831
  // src/ai/workflow/backends/inngest.ts
4844
4832
  var InngestAdapter = class {
4845
- config;
4846
4833
  constructor(config = {}) {
4847
4834
  this.config = {
4848
4835
  debug: false,
@@ -4900,7 +4887,6 @@ var InngestAdapter = class {
4900
4887
 
4901
4888
  // src/ai/workflow/backends/cloudflare.ts
4902
4889
  var CloudflareAdapter = class {
4903
- config;
4904
4890
  constructor(config = {}) {
4905
4891
  this.config = {
4906
4892
  durableObjectBinding: "WORKFLOW_DO",