veryfront 0.0.73 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/ai/components.js +3 -3
- package/dist/ai/components.js.map +1 -1
- package/dist/ai/dev.js +130 -21
- package/dist/ai/dev.js.map +2 -2
- package/dist/ai/index.js +895 -418
- package/dist/ai/index.js.map +4 -4
- package/dist/ai/production.js +135 -38
- package/dist/ai/production.js.map +2 -2
- package/dist/ai/react.js +8 -7
- package/dist/ai/react.js.map +2 -2
- package/dist/ai/workflow.js +468 -110
- package/dist/ai/workflow.js.map +4 -4
- package/dist/components.js +8178 -1164
- package/dist/components.js.map +4 -4
- package/dist/config.js +377 -39
- package/dist/config.js.map +3 -3
- package/dist/context.d.ts +44 -0
- package/dist/context.js +52 -0
- package/dist/context.js.map +7 -0
- package/dist/data.js +176 -62
- package/dist/data.js.map +3 -3
- package/dist/fonts.d.ts +24 -0
- package/dist/fonts.js +45 -0
- package/dist/fonts.js.map +7 -0
- package/dist/head.d.ts +21 -0
- package/dist/head.js +34 -0
- package/dist/head.js.map +7 -0
- package/dist/index.js +8098 -1048
- package/dist/index.js.map +4 -4
- package/dist/oauth/handlers.js +6 -7
- package/dist/oauth/handlers.js.map +1 -1
- package/dist/oauth/index.js +6 -7
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/providers.js +0 -3
- package/dist/oauth/providers.js.map +1 -1
- package/dist/oauth/token-store.js +6 -4
- package/dist/oauth/token-store.js.map +1 -1
- package/dist/router.d.ts +69 -0
- package/dist/router.js +61 -0
- package/dist/router.js.map +7 -0
- package/package.json +19 -2
- package/dist/cli.js +0 -107694
package/dist/ai/react.js.map
CHANGED
|
@@ -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 // 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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",
|
|
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 // Get or initialize text block\n let block = textBlocks.get(textId);\n if (!block) {\n block = { text: \"\", state: \"streaming\", order: null };\n textBlocks.set(textId, block);\n currentTextId = textId;\n }\n\n // Append delta to text block\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?:\n | \"parse\"\n | \"transform\"\n | \"bundle\"\n | \"optimize\"\n | \"dependency-resolution\"\n | \"circuit-breaker\";\n /** Number of failures (for circuit breaker) */\n failures?: number;\n /** Missing dependencies list */\n missing?: Array<{ specifier: string; fromFile: string; reason: string }>;\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "/**\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) {\n data.toolCalls.forEach((tc: ToolCall) => {\n options.onToolCall?.(tc);\n\n if (tc.result) {\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
|
}
|