veryfront 0.0.64 → 0.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/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 * 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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",
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.get() to work in Node.js\n * This provides a proper function that reads from process.env\n */\n\n// Create a shim that matches Deno.env.get(key) signature\nconst denoEnvShim = {\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// Assign to globalThis.Deno if it doesn't exist\nif (typeof globalThis.Deno === \"undefined\") {\n (globalThis as any).Deno = {\n env: denoEnvShim,\n cwd: () => process.cwd(),\n };\n} else if (typeof (globalThis as any).Deno.env === \"undefined\") {\n (globalThis as any).Deno.env = denoEnvShim;\n}\n\nexport { denoEnvShim };\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": ";AAMA,IAAM,cAAc;AAAA,EAClB,IAAI,KAAiC;AACnC,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AAAA,EACA,IAAI,KAAa,OAAqB;AACpC,YAAQ,IAAI,GAAG,IAAI;AAAA,EACrB;AAAA,EACA,OAAO,KAAmB;AACxB,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AAAA,EACA,IAAI,KAAsB;AACxB,WAAO,OAAO,QAAQ;AAAA,EACxB;AAAA,EACA,WAAmC;AACjC,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AACF;AAGA,IAAI,OAAO,WAAW,SAAS,aAAa;AAC1C,EAAC,WAAmB,OAAO;AAAA,IACzB,KAAK;AAAA,IACL,KAAK,MAAM,QAAQ,IAAI;AAAA,EACzB;AACF,WAAW,OAAQ,WAAmB,KAAK,QAAQ,aAAa;AAC9D,EAAC,WAAmB,KAAK,MAAM;AACjC;;;ACtBA,SAAS,aAAa,QAAQ,gBAAgB;;;ACgDvC,SAAS,YAAY,OAAuC;AACjE,SAAO;AACT;AA4CO,SAAS,QAAQ,gBAAuC;AAC7D,QAAM,QAAQ,IAAI,MAAM,eAAe,OAAO;AAC9C,QAAM,OAAO,kBAAkB,eAAe,IAAI;AAClD,SAAO,eAAe,OAAO,WAAW;AAAA,IACtC,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AACD,SAAO;AACT;;;ADhCO,SAAS,QAAQ,SAAwC;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAC9B,QAAQ,mBAAmB,CAAC;AAAA,EAC9B;AACA,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkB,IAAI;AAC9C,QAAM,qBAAqB,OAA+B,IAAI;AAK9D,QAAM,SAAS;AAAA,IACb,OAAO,YAA+C;AACpD,YAAM,cAAuB;AAAA,QAC3B,GAAG;AAAA,QACH,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,QACrB,WAAW,KAAK,IAAI;AAAA,MACtB;AAGA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC;AAC5C,mBAAa,IAAI;AACjB,eAAS,IAAI;AAGb,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAE7B,UAAI;AAEF,cAAM,WAAW,MAAM,MAAM,QAAQ,KAAK;AAAA,UACxC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,GAAG,QAAQ;AAAA,UACb;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,MAAM,KAAK,UAAU;AAAA,YACnB,UAAU,CAAC,GAAG,UAAU,WAAW;AAAA,YACnC,GAAG,QAAQ;AAAA,UACb,CAAC;AAAA,UACD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,QAAQ,YAAY;AAAA,YACxB,MAAM;AAAA,YACN,SAAS,cAAc,SAAS,MAAM;AAAA,UACxC,CAAC,CAAC;AAAA,QACJ;AAEA,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW,QAAQ;AAAA,QAC7B;AAGA,YAAI,SAAS,MAAM;AAEjB,gBAAM,qBAAqB,OAAO,KAAK,IAAI,CAAC;AAC5C,cAAI,2BAA2B;AAE/B,gBAAM;AAAA,YACJ,SAAS;AAAA;AAAA,YAET,CAAC,qBAAqB;AAEpB,0BAAY,CAAC,SAAS;AAEpB,oBAAI,0BAA0B;AAC5B,yBAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,qBAAqB,mBAAmB,CAAC;AAAA,gBAC3E;AAEA,uBAAO,CAAC,GAAG,MAAM,gBAAgB;AAAA,cACnC,CAAC;AAED,kBAAI,QAAQ,UAAU;AACpB,wBAAQ,SAAS,gBAAgB;AAAA,cACnC;AAAA,YACF;AAAA;AAAA,YAEA,CAAC,gBAAgB;AACf,sBAAQ,WAAW;AAAA,YACrB;AAAA;AAAA,YAEA,CAAC,gBAAgB,cAAc;AAC7B,kBAAI,CAAC,0BAA0B;AAE7B,2CAA2B;AAC3B,4BAAY,CAAC,SAAS;AAAA,kBACpB,GAAG;AAAA,kBACH;AAAA,oBACE,IAAI,aAAa;AAAA,oBACjB,MAAM;AAAA,oBACN,SAAS;AAAA,oBACT,WAAW,KAAK,IAAI;AAAA,kBACtB;AAAA,gBACF,CAAC;AAAA,cACH,OAAO;AAEL;AAAA,kBAAY,CAAC,SACX,KAAK;AAAA,oBAAI,CAAC,MACR,EAAE,QAAQ,aAAa,sBACnB,EAAE,GAAG,GAAG,SAAS,eAAe,IAChC;AAAA,kBACN;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AAErD;AAAA,QACF;AAEA,cAAMA,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AAEd,YAAI,QAAQ,SAAS;AACnB,kBAAQ,QAAQA,MAAK;AAAA,QACvB;AAAA,MACF,UAAE;AACA,qBAAa,KAAK;AAClB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,EACpB;AAKA,QAAM,SAAS,YAAY,YAAY;AACrC,QAAI,SAAS,WAAW;AAAG;AAG3B,UAAM,uBAAuB,SAAS,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM;AAE5E,QAAI,yBAAyB;AAAI;AAEjC,UAAM,iBAAiB,SAAS,MAAM,GAAG,oBAAoB;AAC7D,UAAM,kBAAkB,SAAS,oBAAoB;AAGrD,QAAI,CAAC;AAAiB;AAEtB,gBAAY,cAAc;AAE1B,UAAM,OAAO;AAAA,MACX,MAAM,gBAAgB;AAAA,MACtB,SAAS,gBAAgB;AAAA,IAC3B,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,MAAM,CAAC;AAKrB,QAAM,OAAO,YAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAAA,IAC/B;AACA,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,CAAC;AAKL,QAAM,oBAAoB;AAAA,IACxB,CAAC,MAAiE;AAChE,eAAS,EAAE,OAAO,KAAK;AAAA,IACzB;AAAA,IACA,CAAC;AAAA,EACH;AAKA,QAAM,eAAe;AAAA,IACnB,OAAO,MAAuB;AAC5B,QAAE,eAAe;AAEjB,UAAI,CAAC,MAAM,KAAK,KAAK;AAAW;AAEhC,YAAM,iBAAiB;AACvB,eAAS,EAAE;AAEX,YAAM,OAAO;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,WAAW,MAAM;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAe,wBACb,MACA,WACA,QACA,UACe;AACf,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,kBAAkB;AACtB,MAAI,YAAY,OAAO,KAAK,IAAI,CAAC;AAEjC,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,QAAI,MAAM;AACR;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,UAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAE5D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,cAAM,OAAO,KAAK,MAAM,CAAC;AAEzB,YAAI,SAAS,UAAU;AAErB,cAAI,iBAAiB;AACnB,kBAAM,mBAA4B;AAAA,cAChC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW,KAAK,IAAI;AAAA,YACtB;AACA,sBAAU,gBAAgB;AAAA,UAC5B;AACA;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAE9B,cAAI,OAAO,SAAS,QAAQ;AAC1B,mBAAO,OAAO,IAAI;AAAA,UACpB,WAAW,OAAO,SAAS,SAAS;AAElC,wBAAY,OAAO,aAAa,OAAO,KAAK,IAAI,CAAC;AACjD,8BAAkB;AAAA,UACpB,WAAW,OAAO,SAAS,cAAc;AAEvC,+BAAmB,OAAO,aAAa;AAEvC,gBAAI,UAAU;AACZ,uBAAS,iBAAiB,SAAS;AAAA,YACrC;AAAA,UACF,WAAW,OAAO,SAAS,UAAU;AAEnC,gBAAI,iBAAiB;AACnB,oBAAM,mBAA4B;AAAA,gBAChC,IAAI;AAAA,gBACJ,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,WAAW,KAAK,IAAI;AAAA,cACtB;AACA,wBAAU,gBAAgB;AAAA,YAC5B;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AE9WA,SAAS,eAAAC,cAAa,UAAAC,SAAQ,YAAAC,iBAAgB;AA+CvC,SAAS,SAAS,SAA0C;AACjE,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAqB,CAAC,CAAC;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,MAAM;AACxD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAA6B;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,qBAAqBC,QAA+B,IAAI;AAK9D,QAAM,SAASC;AAAA,IACb,OAAO,UAAkB;AACvB,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,gBAAU,UAAU;AACpB,mBAAa,CAAC,CAAC;AAEf,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAE7B,UAAI;AAEF,cAAM,WAAW,MAAM,MAAM,eAAe,QAAQ,KAAK,IAAI;AAAA,UAC3D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,QAAQ,YAAY;AAAA,YACxB,MAAM;AAAA,YACN,SAAS,gBAAgB,SAAS,MAAM;AAAA,UAC1C,CAAC,CAAC;AAAA,QACJ;AAGA,cAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,oBAAY,KAAK,YAAY,CAAC,CAAC;AAC/B,qBAAa,KAAK,aAAa,CAAC,CAAC;AACjC,kBAAU,KAAK,UAAU,WAAW;AACpC,oBAAY,KAAK,QAAQ;AAGzB,YAAI,KAAK,aAAa,QAAQ,YAAY;AACxC,eAAK,UAAU,QAAQ,CAAC,OAAiB;AACvC,oBAAQ,WAAY,EAAE;AAEtB,gBAAI,GAAG,UAAU,QAAQ,cAAc;AACrC,sBAAQ,aAAa,IAAI,GAAG,MAAM;AAAA,YACpC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD;AAAA,QACF;AAEA,cAAMC,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AACd,kBAAU,OAAO;AAEjB,YAAI,QAAQ,SAAS;AACnB,kBAAQ,QAAQA,MAAK;AAAA,QACvB;AAAA,MACF,UAAE;AACA,qBAAa,KAAK;AAClB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,EACpB;AAKA,QAAM,OAAOD,aAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAAA,IAC/B;AACA,iBAAa,KAAK;AAClB,cAAU,MAAM;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvJA,SAAS,eAAAE,cAAa,UAAAC,SAAQ,YAAAC,iBAAgB;AA8CvC,SAAS,cACd,SACqB;AACrB,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,EAAE;AAC/C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,qBAAqBC,QAA+B,IAAI;AAK9D,QAAM,WAAWC;AAAA,IACf,OAAO,WAAmB;AACxB,mBAAa,IAAI;AACjB,eAAS,IAAI;AACb,oBAAc,EAAE;AAEhB,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAE7B,UAAI;AAEF,cAAM,WAAW,MAAM,MAAM,QAAQ,KAAK;AAAA,UACxC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,GAAG,QAAQ;AAAA,UACb;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA,GAAG,QAAQ;AAAA,UACb,CAAC;AAAA,UACD,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,QAAQ,YAAY;AAAA,YACxB,MAAM;AAAA,YACN,SAAS,cAAc,SAAS,MAAM;AAAA,UACxC,CAAC,CAAC;AAAA,QACJ;AAEA,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW,QAAQ;AAAA,QAC7B;AAGA,YAAI,SAAS,MAAM;AACjB,gBAAM,SAAS,SAAS,KAAK,UAAU;AACvC,gBAAM,UAAU,IAAI,YAAY;AAChC,cAAI,kBAAkB;AAEtB,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,gBAAI;AAAM;AAEV,kBAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,+BAAmB;AACnB,0BAAc,eAAe;AAAA,UAC/B;AAEA,cAAI,QAAQ,UAAU;AACpB,oBAAQ,SAAS,eAAe;AAAA,UAClC;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD;AAAA,QACF;AAEA,cAAMC,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AAEd,YAAI,QAAQ,SAAS;AACnB,kBAAQ,QAAQA,MAAK;AAAA,QACvB;AAAA,MACF,UAAE;AACA,qBAAa,KAAK;AAClB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAKA,QAAM,OAAOD,aAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAAA,IAC/B;AACA,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtJA,SAAS,eAAAE,cAAa,UAAAC,SAAQ,YAAAC,iBAAgB;AAwCvC,SAAS,aACd,SACoB;AACpB,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,EAAE;AACnC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,qBAAqBC,QAA+B,IAAI;AAK9D,QAAM,QAAQC;AAAA,IACZ,OAAO,SAAmC;AACxC,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,cAAQ,EAAE;AAEV,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAE7B,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,QAAQ,KAAK;AAAA,UACxC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,UACpC,QAAQ,gBAAgB;AAAA,QAC1B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,QAAQ,YAAY;AAAA,YACxB,MAAM;AAAA,YACN,SAAS,oBAAoB,SAAS,MAAM;AAAA,UAC9C,CAAC,CAAC;AAAA,QACJ;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,QAAQ,YAAY;AAAA,YACxB,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC,CAAC;AAAA,QACJ;AAGA,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,cAAM,UAAU,IAAI,YAAY;AAChC,YAAI,kBAAkB;AAEtB,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,cAAI;AAAM;AAEV,gBAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,6BAAmB;AACnB,kBAAQ,eAAe;AAEvB,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,KAAK;AAAA,UACvB;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW;AAAA,QACrB;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD;AAAA,QACF;AAEA,cAAMC,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AAEd,YAAI,QAAQ,SAAS;AACnB,kBAAQ,QAAQA,MAAK;AAAA,QACvB;AAAA,MACF,UAAE;AACA,uBAAe,KAAK;AACpB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAKA,QAAM,OAAOD,aAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAAA,IAC/B;AACA,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAKL,QAAM,QAAQA,aAAY,MAAM;AAC9B,YAAQ,EAAE;AACV,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxJA,YAAY,WAAW;AAwHhB,SAAS,cACd,UAAgC,CAAC,GACZ;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,KAAK;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAU,eAAS,EAAE;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAwB,IAAI;AAE5D,QAAM,iBAAuB,aAAiC,IAAI;AAGlE,QAAM,cAAoB,cAAQ,MAAM;AACtC,QAAI,OAAO,eAAe;AAAa,aAAO;AAE9C,UAAM,IAAI;AACV,WAAO,CAAC,EAAE,EAAE,qBAAqB,EAAE;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC;AAAa;AAGlB,UAAM,IAAI;AACV,UAAM,uBAAuB,EAAE,qBAAqB,EAAE;AAEtD,QAAI,CAAC;AAAsB;AAE3B,UAAM,cAAc,IAAI,qBAAqB;AAC7C,gBAAY,aAAa;AACzB,gBAAY,iBAAiB;AAE7B,QAAI,UAAU;AACZ,kBAAY,OAAO;AAAA,IACrB;AAEA,gBAAY,WAAW,CAAC,UAAkC;AACxD,UAAI,kBAAkB;AACtB,UAAI,oBAAoB;AAExB,eAAS,IAAI,MAAM,aAAa,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAC7D,cAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,YAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AAAG;AAE3B,YAAI,OAAO,SAAS;AAClB,6BAAmB,OAAO,CAAC,EAAE;AAAA,QAC/B,OAAO;AACL,+BAAqB,OAAO,CAAC,EAAE;AAAA,QACjC;AAAA,MACF;AAEA,YAAM,oBAAoB,mBAAmB;AAC7C,oBAAc,iBAAiB;AAE/B,UAAI,cAAc;AAChB,qBAAa,mBAAmB,CAAC,CAAC,eAAe;AAAA,MACnD;AAAA,IACF;AAEA,gBAAY,UAAU,CAAC,UAAuC;AAC5D,YAAM,eAAe,gBAAgB,MAAM,KAAK;AAChD,eAAS,YAAY;AACrB,qBAAe,KAAK;AAEpB,UAAI,SAAS;AACX,gBAAQ,YAAY;AAAA,MACtB;AAAA,IACF;AAEA,gBAAY,UAAU,MAAM;AAC1B,qBAAe,IAAI;AACnB,eAAS,IAAI;AAEb,UAAI,SAAS;AACX,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,gBAAY,QAAQ,MAAM;AACxB,qBAAe,KAAK;AAEpB,UAAI,OAAO;AACT,cAAM;AAAA,MACR;AAAA,IACF;AAEA,mBAAe,UAAU;AAEzB,WAAO,MAAM;AACX,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,UAAU,YAAY,gBAAgB,cAAc,SAAS,SAAS,KAAK,CAAC;AAE7F,QAAM,QAAc,kBAAY,MAAM;AACpC,QAAI,CAAC,eAAe,WAAW;AAAa;AAE5C,kBAAc,EAAE;AAChB,aAAS,IAAI;AAEb,QAAI;AACF,qBAAe,QAAQ,MAAM;AAAA,IAC/B,QAAQ;AAEN,cAAQ,KAAK,oCAAoC;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,OAAa,kBAAY,MAAM;AACnC,QAAI,CAAC,eAAe,WAAW,CAAC;AAAa;AAE7C,mBAAe,QAAQ,KAAK;AAAA,EAC9B,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAe,kBAAY,MAAM;AACrC,QAAI,aAAa;AACf,WAAK;AAAA,IACP,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC;AAE7B,QAAM,QAAc,kBAAY,MAAM;AACpC,kBAAc,EAAE;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,6BAA6B,KAAK;AAAA,EAC7C;AACF;",
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
  }
@@ -1,3 +1,30 @@
1
+ // src/_shims/deno-env.ts
2
+ var denoEnvShim = {
3
+ get(key) {
4
+ return process.env[key];
5
+ },
6
+ set(key, value) {
7
+ process.env[key] = value;
8
+ },
9
+ delete(key) {
10
+ delete process.env[key];
11
+ },
12
+ has(key) {
13
+ return key in process.env;
14
+ },
15
+ toObject() {
16
+ return { ...process.env };
17
+ }
18
+ };
19
+ if (typeof globalThis.Deno === "undefined") {
20
+ globalThis.Deno = {
21
+ env: denoEnvShim,
22
+ cwd: () => process.cwd()
23
+ };
24
+ } else if (typeof globalThis.Deno.env === "undefined") {
25
+ globalThis.Deno.env = denoEnvShim;
26
+ }
27
+
1
28
  // src/ai/workflow/react/use-workflow.ts
2
29
  import { useCallback, useEffect, useRef, useState } from "react";
3
30
  function useWorkflow(options) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/ai/workflow/react/use-workflow.ts", "../../../src/ai/workflow/react/use-approval.ts", "../../../src/ai/workflow/react/use-workflow-list.ts", "../../../src/ai/workflow/react/use-workflow-start.ts"],
4
- "sourcesContent": ["/**\n * useWorkflow Hook\n *\n * React hook for tracking and interacting with workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflow } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowDashboard({ runId }: { runId: string }) {\n * const {\n * run,\n * status,\n * progress,\n * currentNodes,\n * pendingApprovals,\n * cancel,\n * retry,\n * isLoading,\n * error,\n * } = useWorkflow({ runId });\n *\n * return (\n * <div>\n * <h2>Status: {status}</h2>\n * <p>Progress: {progress}%</p>\n * {pendingApprovals.length > 0 && (\n * <p>{pendingApprovals.length} approvals pending</p>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NodeState, PendingApproval, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflow hook\n */\nexport interface UseWorkflowOptions {\n /** Run ID to track */\n runId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Polling interval in ms (defaults to 2000) */\n pollInterval?: number;\n\n /** Enable automatic polling */\n autoRefresh?: boolean;\n\n /** Callback when status changes */\n onStatusChange?: (status: WorkflowStatus, previousStatus: WorkflowStatus) => void;\n\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n\n /** Callback when workflow fails */\n onError?: (error: Error, run?: WorkflowRun) => void;\n\n /** Callback when approval is required */\n onApprovalRequired?: (approval: PendingApproval) => void;\n}\n\n/**\n * Result from useWorkflow hook\n */\nexport interface UseWorkflowResult {\n /** The workflow run data */\n run: WorkflowRun | null;\n\n /** Current workflow status */\n status: WorkflowStatus;\n\n /** Progress percentage (0-100) */\n progress: number;\n\n /** Currently executing node IDs */\n currentNodes: string[];\n\n /** Node states by node ID */\n nodeStates: Record<string, NodeState>;\n\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n /** Refresh the workflow data */\n refresh: () => Promise<void>;\n\n /** Cancel the workflow */\n cancel: () => Promise<void>;\n\n /** Retry a failed workflow */\n retry: () => Promise<void>;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useWorkflow - Track and interact with a workflow run\n */\nexport function useWorkflow(options: UseWorkflowOptions): UseWorkflowResult {\n const {\n runId,\n apiBase = \"/api/workflows\",\n pollInterval = 2000,\n autoRefresh = true,\n onStatusChange,\n onComplete,\n onError,\n onApprovalRequired,\n } = options;\n\n const [run, setRun] = useState<WorkflowRun | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const previousStatusRef = useRef<WorkflowStatus | null>(null);\n const previousApprovalsRef = useRef<Set<string>>(new Set());\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Fetch workflow data\n */\n const fetchRun = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}`, {\n signal: abortControllerRef.current?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow: ${response.status}`);\n }\n\n const data = await response.json();\n const workflowRun = data as WorkflowRun;\n\n // Check for status changes\n if (previousStatusRef.current && previousStatusRef.current !== workflowRun.status) {\n onStatusChange?.(workflowRun.status, previousStatusRef.current);\n }\n previousStatusRef.current = workflowRun.status;\n\n // Check for completion\n if (workflowRun.status === \"completed\") {\n onComplete?.(workflowRun);\n }\n\n // Check for failures\n if (workflowRun.status === \"failed\") {\n const failedError = new Error(\"Workflow failed\");\n onError?.(failedError, workflowRun);\n }\n\n // Check for new approvals\n if (workflowRun.pendingApprovals) {\n for (const approval of workflowRun.pendingApprovals) {\n if (approval.status === \"pending\" && !previousApprovalsRef.current.has(approval.id)) {\n previousApprovalsRef.current.add(approval.id);\n onApprovalRequired?.(approval);\n }\n }\n }\n\n setRun(workflowRun);\n setError(null);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n }\n }, [runId, apiBase, onStatusChange, onComplete, onError, onApprovalRequired]);\n\n /**\n * Initial fetch and polling setup\n */\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n };\n\n doFetch();\n\n // Set up polling for active workflows\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (autoRefresh) {\n intervalId = setInterval(() => {\n // Only poll if workflow is still active\n const currentStatus = previousStatusRef.current;\n if (currentStatus && ![\"completed\", \"failed\", \"cancelled\"].includes(currentStatus)) {\n fetchRun();\n }\n }, pollInterval);\n }\n\n return () => {\n abortControllerRef.current?.abort();\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [runId, autoRefresh, pollInterval, fetchRun]);\n\n /**\n * Refresh workflow data\n */\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n }, [fetchRun]);\n\n /**\n * Cancel the workflow\n */\n const cancel = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/cancel`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to cancel workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const cancelError = err instanceof Error ? err : new Error(String(err));\n setError(cancelError);\n throw cancelError;\n }\n }, [runId, apiBase, refresh]);\n\n /**\n * Retry a failed workflow\n */\n const retry = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/retry`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to retry workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const retryError = err instanceof Error ? err : new Error(String(err));\n setError(retryError);\n throw retryError;\n }\n }, [runId, apiBase, refresh]);\n\n // Calculate progress\n const calculateProgress = (): number => {\n if (!run?.nodeStates) return 0;\n\n const states = Object.values(run.nodeStates);\n if (states.length === 0) return 0;\n\n const completed = states.filter(\n (s) => s.status === \"completed\" || s.status === \"skipped\",\n ).length;\n\n return Math.round((completed / states.length) * 100);\n };\n\n return {\n run,\n status: run?.status ?? \"pending\",\n progress: calculateProgress(),\n currentNodes: run?.currentNodes ?? [],\n nodeStates: run?.nodeStates ?? {},\n pendingApprovals: run?.pendingApprovals?.filter((a) => a.status === \"pending\") ?? [],\n refresh,\n cancel,\n retry,\n isLoading,\n error,\n };\n}\n", "/**\n * useApproval Hook\n *\n * React hook for handling workflow approval interactions.\n *\n * @example\n * ```tsx\n * import { useApproval } from 'veryfront/ai/workflow/react';\n *\n * function ApprovalUI({ runId, approvalId }: Props) {\n * const {\n * approval,\n * approve,\n * reject,\n * isSubmitting,\n * error,\n * } = useApproval({ runId, approvalId });\n *\n * if (!approval) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <h3>{approval.message}</h3>\n * <p>Requested by: {approval.stepId}</p>\n * <button onClick={() => approve('Looks good!')}>\n * Approve\n * </button>\n * <button onClick={() => reject('Needs changes')}>\n * Reject\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ApprovalDecision, PendingApproval } from \"../types.ts\";\n\n/**\n * Options for useApproval hook\n */\nexport interface UseApprovalOptions {\n /** Workflow run ID */\n runId: string;\n\n /** Approval ID */\n approvalId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Current user/approver name */\n approver?: string;\n\n /** Callback on successful approval/rejection */\n onDecision?: (decision: ApprovalDecision) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useApproval hook\n */\nexport interface UseApprovalResult {\n /** The approval data */\n approval: PendingApproval | null;\n\n /** Approve the request */\n approve: (comment?: string) => Promise<void>;\n\n /** Reject the request */\n reject: (comment?: string) => Promise<void>;\n\n /** Submit a custom decision */\n submitDecision: (decision: ApprovalDecision) => Promise<void>;\n\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n\n /** Loading state for initial fetch */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether the approval is still pending */\n isPending: boolean;\n\n /** Whether the approval has been resolved */\n isResolved: boolean;\n}\n\n/**\n * useApproval - Handle workflow approval interactions\n */\nexport function useApproval(options: UseApprovalOptions): UseApprovalResult {\n const {\n runId,\n approvalId,\n apiBase = \"/api/workflows\",\n approver = \"unknown\",\n onDecision,\n onError,\n } = options;\n\n const [approval, setApproval] = useState<PendingApproval | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch approval data\n */\n useEffect(() => {\n const fetchApproval = async () => {\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch approval: ${response.status}`);\n }\n\n const data = await response.json();\n setApproval(data as PendingApproval);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (runId && approvalId) {\n fetchApproval();\n }\n }, [runId, approvalId, apiBase, onError]);\n\n /**\n * Submit a decision\n */\n const submitDecision = useCallback(\n async (decision: ApprovalDecision) => {\n if (!runId || !approvalId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(decision),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to submit decision: ${response.status}`);\n }\n\n // Update local state\n setApproval((prev) =>\n prev\n ? {\n ...prev,\n status: decision.approved ? \"approved\" : \"rejected\",\n resolvedAt: new Date(),\n resolvedBy: decision.approver,\n comment: decision.comment,\n }\n : null\n );\n\n onDecision?.(decision);\n } catch (err) {\n const submitError = err instanceof Error ? err : new Error(String(err));\n setError(submitError);\n onError?.(submitError);\n throw submitError;\n } finally {\n setIsSubmitting(false);\n }\n },\n [runId, approvalId, apiBase, onDecision, onError],\n );\n\n /**\n * Approve the request\n */\n const approve = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: true,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n /**\n * Reject the request\n */\n const reject = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: false,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n return {\n approval,\n approve,\n reject,\n submitDecision,\n isSubmitting,\n isLoading,\n error,\n isPending: approval?.status === \"pending\",\n isResolved: approval?.status !== \"pending\",\n };\n}\n", "/**\n * useWorkflowList Hook\n *\n * React hook for listing and filtering workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowList } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowList() {\n * const {\n * runs,\n * isLoading,\n * hasMore,\n * loadMore,\n * setFilter,\n * } = useWorkflowList({\n * workflowId: 'content-pipeline',\n * status: 'running',\n * });\n *\n * return (\n * <div>\n * {runs.map(run => (\n * <div key={run.id}>\n * {run.id} - {run.status}\n * </div>\n * ))}\n * {hasMore && (\n * <button onClick={loadMore}>Load More</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { RunFilter, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflowList hook\n */\nexport interface UseWorkflowListOptions {\n /** Filter by workflow ID */\n workflowId?: string;\n\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n\n /** Filter runs created after this date */\n createdAfter?: Date;\n\n /** Filter runs created before this date */\n createdBefore?: Date;\n\n /** Page size (defaults to 20) */\n pageSize?: number;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Enable automatic refresh */\n autoRefresh?: boolean;\n\n /** Refresh interval in ms (defaults to 5000) */\n refreshInterval?: number;\n}\n\n/**\n * Result from useWorkflowList hook\n */\nexport interface UseWorkflowListResult {\n /** List of workflow runs */\n runs: WorkflowRun[];\n\n /** Total count (if available) */\n totalCount?: number;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether there are more results */\n hasMore: boolean;\n\n /** Load more results */\n loadMore: () => Promise<void>;\n\n /** Refresh the list */\n refresh: () => Promise<void>;\n\n /** Update the filter */\n setFilter: (filter: Partial<UseWorkflowListOptions>) => void;\n\n /** Current filter */\n filter: RunFilter;\n}\n\n/**\n * useWorkflowList - List and filter workflow runs\n */\nexport function useWorkflowList(\n options: UseWorkflowListOptions = {},\n): UseWorkflowListResult {\n const {\n workflowId,\n status,\n createdAfter,\n createdBefore,\n pageSize = 20,\n apiBase = \"/api/workflows\",\n autoRefresh = false,\n refreshInterval = 5000,\n } = options;\n\n const [runs, setRuns] = useState<WorkflowRun[]>([]);\n const [totalCount, setTotalCount] = useState<number | undefined>();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [cursor, setCursor] = useState<string | undefined>();\n\n const [filter, setFilterState] = useState<RunFilter>({\n workflowId,\n status,\n createdAfter,\n createdBefore,\n limit: pageSize,\n });\n\n /**\n * Build query string from filter\n */\n const buildQueryString = useCallback(\n (filterToUse: RunFilter, cursorToUse?: string): string => {\n const params = new URLSearchParams();\n\n if (filterToUse.workflowId) {\n params.set(\"workflowId\", filterToUse.workflowId);\n }\n\n if (filterToUse.status) {\n const statuses = Array.isArray(filterToUse.status)\n ? filterToUse.status\n : [filterToUse.status];\n statuses.forEach((s) => params.append(\"status\", s));\n }\n\n if (filterToUse.createdAfter) {\n params.set(\"createdAfter\", filterToUse.createdAfter.toISOString());\n }\n\n if (filterToUse.createdBefore) {\n params.set(\"createdBefore\", filterToUse.createdBefore.toISOString());\n }\n\n if (filterToUse.limit) {\n params.set(\"limit\", String(filterToUse.limit));\n }\n\n if (cursorToUse) {\n params.set(\"cursor\", cursorToUse);\n }\n\n return params.toString();\n },\n [],\n );\n\n /**\n * Fetch runs\n */\n const fetchRuns = useCallback(\n async (append: boolean = false) => {\n try {\n const queryString = buildQueryString(filter, append ? cursor : undefined);\n const response = await fetch(`${apiBase}/runs?${queryString}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch runs: ${response.status}`);\n }\n\n const data = await response.json();\n const fetchedRuns = (data.runs || data) as WorkflowRun[];\n const nextCursor = data.cursor;\n const total = data.totalCount;\n\n if (append) {\n setRuns((prev) => [...prev, ...fetchedRuns]);\n } else {\n setRuns(fetchedRuns);\n }\n\n setCursor(nextCursor);\n setHasMore(!!nextCursor || fetchedRuns.length === filter.limit);\n setTotalCount(total);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n }\n },\n [apiBase, filter, cursor, buildQueryString],\n );\n\n /**\n * Initial fetch\n */\n useEffect(() => {\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n };\n\n doFetch();\n }, [filter]); // Re-fetch when filter changes\n\n /**\n * Auto-refresh setup\n */\n useEffect(() => {\n if (!autoRefresh) return;\n\n const intervalId = setInterval(() => {\n fetchRuns(false);\n }, refreshInterval);\n\n return () => clearInterval(intervalId);\n }, [autoRefresh, refreshInterval, fetchRuns]);\n\n /**\n * Load more results\n */\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading) return;\n setIsLoading(true);\n await fetchRuns(true);\n setIsLoading(false);\n }, [hasMore, isLoading, fetchRuns]);\n\n /**\n * Refresh the list\n */\n const refresh = useCallback(async () => {\n setCursor(undefined);\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n }, [fetchRuns]);\n\n /**\n * Update filter\n */\n const setFilter = useCallback(\n (newFilter: Partial<UseWorkflowListOptions>) => {\n setCursor(undefined); // Reset pagination\n setFilterState((prev) => ({\n ...prev,\n workflowId: newFilter.workflowId ?? prev.workflowId,\n status: newFilter.status ?? prev.status,\n createdAfter: newFilter.createdAfter ?? prev.createdAfter,\n createdBefore: newFilter.createdBefore ?? prev.createdBefore,\n limit: newFilter.pageSize ?? prev.limit,\n }));\n },\n [],\n );\n\n return {\n runs,\n totalCount,\n isLoading,\n error,\n hasMore,\n loadMore,\n refresh,\n setFilter,\n filter,\n };\n}\n", "/**\n * useWorkflowStart Hook\n *\n * React hook for starting workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowStart } from 'veryfront/ai/workflow/react';\n *\n * function StartWorkflowButton() {\n * const { start, isStarting, error, lastRunId } = useWorkflowStart({\n * workflowId: 'content-pipeline',\n * onStart: (runId) => {\n * console.log('Started:', runId);\n * },\n * });\n *\n * return (\n * <button\n * onClick={() => start({ topic: 'AI Safety' })}\n * disabled={isStarting}\n * >\n * {isStarting ? 'Starting...' : 'Start Workflow'}\n * </button>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useState } from \"react\";\n\n/**\n * Options for useWorkflowStart hook\n */\nexport interface UseWorkflowStartOptions {\n /** Workflow ID to start */\n workflowId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Callback when workflow starts successfully */\n onStart?: (runId: string) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useWorkflowStart hook\n */\nexport interface UseWorkflowStartResult<TInput = unknown> {\n /** Start a new workflow run */\n start: (input: TInput) => Promise<string>;\n\n /** Whether a start is in progress */\n isStarting: boolean;\n\n /** Last started run ID */\n lastRunId: string | null;\n\n /** Error state */\n error: Error | null;\n\n /** Reset error state */\n resetError: () => void;\n}\n\n/**\n * useWorkflowStart - Start new workflow runs\n */\nexport function useWorkflowStart<TInput = unknown>(\n options: UseWorkflowStartOptions,\n): UseWorkflowStartResult<TInput> {\n const { workflowId, apiBase = \"/api/workflows\", onStart, onError } = options;\n\n const [isStarting, setIsStarting] = useState(false);\n const [lastRunId, setLastRunId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Start a new workflow run\n */\n const start = useCallback(\n async (input: TInput): Promise<string> => {\n setIsStarting(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBase}/${workflowId}/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message || `Failed to start workflow: ${response.status}`,\n );\n }\n\n const data = await response.json();\n const runId = data.runId || data.id;\n\n setLastRunId(runId);\n onStart?.(runId);\n\n return runId;\n } catch (err) {\n const startError = err instanceof Error ? err : new Error(String(err));\n setError(startError);\n onError?.(startError);\n throw startError;\n } finally {\n setIsStarting(false);\n }\n },\n [workflowId, apiBase, onStart, onError],\n );\n\n /**\n * Reset error state\n */\n const resetError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n start,\n isStarting,\n lastRunId,\n error,\n resetError,\n };\n}\n"],
5
- "mappings": ";AAmCA,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AAyElD,SAAS,YAAY,SAAgD;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,KAAK,MAAM,IAAI,SAA6B,IAAI;AACvD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AAErD,QAAM,oBAAoB,OAA8B,IAAI;AAC5D,QAAM,uBAAuB,OAAoB,oBAAI,IAAI,CAAC;AAC1D,QAAM,qBAAqB,OAA+B,IAAI;AAK9D,QAAM,WAAW,YAAY,YAAY;AACvC,QAAI,CAAC;AAAO;AAEZ,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,IAAI;AAAA,QACvD,QAAQ,mBAAmB,SAAS;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,MAChE;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,cAAc;AAGpB,UAAI,kBAAkB,WAAW,kBAAkB,YAAY,YAAY,QAAQ;AACjF,yBAAiB,YAAY,QAAQ,kBAAkB,OAAO;AAAA,MAChE;AACA,wBAAkB,UAAU,YAAY;AAGxC,UAAI,YAAY,WAAW,aAAa;AACtC,qBAAa,WAAW;AAAA,MAC1B;AAGA,UAAI,YAAY,WAAW,UAAU;AACnC,cAAM,cAAc,IAAI,MAAM,iBAAiB;AAC/C,kBAAU,aAAa,WAAW;AAAA,MACpC;AAGA,UAAI,YAAY,kBAAkB;AAChC,mBAAW,YAAY,YAAY,kBAAkB;AACnD,cAAI,SAAS,WAAW,aAAa,CAAC,qBAAqB,QAAQ,IAAI,SAAS,EAAE,GAAG;AACnF,iCAAqB,QAAQ,IAAI,SAAS,EAAE;AAC5C,iCAAqB,QAAQ;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAEA,aAAO,WAAW;AAClB,eAAS,IAAI;AAAA,IACf,SAAS,KAAK;AACZ,UAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD;AAAA,MACF;AACA,YAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACrE,eAAS,UAAU;AACnB,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,gBAAgB,YAAY,SAAS,kBAAkB,CAAC;AAK5E,YAAU,MAAM;AACd,uBAAmB,UAAU,IAAI,gBAAgB;AAEjD,UAAM,UAAU,YAAY;AAC1B,mBAAa,IAAI;AACjB,YAAM,SAAS;AACf,mBAAa,KAAK;AAAA,IACpB;AAEA,YAAQ;AAGR,QAAI;AACJ,QAAI,aAAa;AACf,mBAAa,YAAY,MAAM;AAE7B,cAAM,gBAAgB,kBAAkB;AACxC,YAAI,iBAAiB,CAAC,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,aAAa,GAAG;AAClF,mBAAS;AAAA,QACX;AAAA,MACF,GAAG,YAAY;AAAA,IACjB;AAEA,WAAO,MAAM;AACX,yBAAmB,SAAS,MAAM;AAClC,UAAI,YAAY;AACd,sBAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,cAAc,QAAQ,CAAC;AAK/C,QAAM,UAAU,YAAY,YAAY;AACtC,iBAAa,IAAI;AACjB,UAAM,SAAS;AACf,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,QAAQ,CAAC;AAKb,QAAM,SAAS,YAAY,YAAY;AACrC,QAAI,CAAC;AAAO;AAEZ,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,WAAW;AAAA,QAC9D,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,MACjE;AAEA,YAAM,QAAQ;AAAA,IAChB,SAAS,KAAK;AACZ,YAAM,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACtE,eAAS,WAAW;AACpB,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,OAAO,CAAC;AAK5B,QAAM,QAAQ,YAAY,YAAY;AACpC,QAAI,CAAC;AAAO;AAEZ,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,UAAU;AAAA,QAC7D,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,MAChE;AAEA,YAAM,QAAQ;AAAA,IAChB,SAAS,KAAK;AACZ,YAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACrE,eAAS,UAAU;AACnB,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,OAAO,CAAC;AAG5B,QAAM,oBAAoB,MAAc;AACtC,QAAI,CAAC,KAAK;AAAY,aAAO;AAE7B,UAAM,SAAS,OAAO,OAAO,IAAI,UAAU;AAC3C,QAAI,OAAO,WAAW;AAAG,aAAO;AAEhC,UAAM,YAAY,OAAO;AAAA,MACvB,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW;AAAA,IAClD,EAAE;AAEF,WAAO,KAAK,MAAO,YAAY,OAAO,SAAU,GAAG;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,KAAK,UAAU;AAAA,IACvB,UAAU,kBAAkB;AAAA,IAC5B,cAAc,KAAK,gBAAgB,CAAC;AAAA,IACpC,YAAY,KAAK,cAAc,CAAC;AAAA,IAChC,kBAAkB,KAAK,kBAAkB,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,KAAK,CAAC;AAAA,IACnF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzQA,SAAS,eAAAA,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AA6D1C,SAAS,YAAY,SAAgD;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAiC,IAAI;AACrE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AAKrD,EAAAD,WAAU,MAAM;AACd,UAAM,gBAAgB,YAAY;AAChC,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB,GAAG,OAAO,SAAS,KAAK,cAAc,UAAU;AAAA,QAClD;AAEA,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,QAChE;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,oBAAY,IAAuB;AACnC,iBAAS,IAAI;AAAA,MACf,SAAS,KAAK;AACZ,cAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACrE,iBAAS,UAAU;AACnB,kBAAU,UAAU;AAAA,MACtB,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,SAAS,YAAY;AACvB,oBAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,SAAS,OAAO,CAAC;AAKxC,QAAM,iBAAiBD;AAAA,IACrB,OAAO,aAA+B;AACpC,UAAI,CAAC,SAAS,CAAC;AAAY;AAE3B,sBAAgB,IAAI;AACpB,eAAS,IAAI;AAEb,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB,GAAG,OAAO,SAAS,KAAK,cAAc,UAAU;AAAA,UAChD;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,YACA,MAAM,KAAK,UAAU,QAAQ;AAAA,UAC/B;AAAA,QACF;AAEA,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,QACjE;AAGA;AAAA,UAAY,CAAC,SACX,OACI;AAAA,YACA,GAAG;AAAA,YACH,QAAQ,SAAS,WAAW,aAAa;AAAA,YACzC,YAAY,oBAAI,KAAK;AAAA,YACrB,YAAY,SAAS;AAAA,YACrB,SAAS,SAAS;AAAA,UACpB,IACE;AAAA,QACN;AAEA,qBAAa,QAAQ;AAAA,MACvB,SAAS,KAAK;AACZ,cAAM,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACtE,iBAAS,WAAW;AACpB,kBAAU,WAAW;AACrB,cAAM;AAAA,MACR,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,YAAY,SAAS,YAAY,OAAO;AAAA,EAClD;AAKA,QAAM,UAAUA;AAAA,IACd,OAAO,YAAqB;AAC1B,YAAM,eAAe;AAAA,QACnB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,EAC3B;AAKA,QAAM,SAASA;AAAA,IACb,OAAO,YAAqB;AAC1B,YAAM,eAAe;AAAA,QACnB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU,WAAW;AAAA,IAChC,YAAY,UAAU,WAAW;AAAA,EACnC;AACF;;;ACrMA,SAAS,eAAAG,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAmE1C,SAAS,gBACd,UAAkC,CAAC,GACZ;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,cAAc;AAAA,IACd,kBAAkB;AAAA,EACpB,IAAI;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAwB,CAAC,CAAC;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA6B;AACjE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA6B;AAEzD,QAAM,CAAC,QAAQ,cAAc,IAAIA,UAAoB;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAKD,QAAM,mBAAmBF;AAAA,IACvB,CAAC,aAAwB,gBAAiC;AACxD,YAAM,SAAS,IAAI,gBAAgB;AAEnC,UAAI,YAAY,YAAY;AAC1B,eAAO,IAAI,cAAc,YAAY,UAAU;AAAA,MACjD;AAEA,UAAI,YAAY,QAAQ;AACtB,cAAM,WAAW,MAAM,QAAQ,YAAY,MAAM,IAC7C,YAAY,SACZ,CAAC,YAAY,MAAM;AACvB,iBAAS,QAAQ,CAAC,MAAM,OAAO,OAAO,UAAU,CAAC,CAAC;AAAA,MACpD;AAEA,UAAI,YAAY,cAAc;AAC5B,eAAO,IAAI,gBAAgB,YAAY,aAAa,YAAY,CAAC;AAAA,MACnE;AAEA,UAAI,YAAY,eAAe;AAC7B,eAAO,IAAI,iBAAiB,YAAY,cAAc,YAAY,CAAC;AAAA,MACrE;AAEA,UAAI,YAAY,OAAO;AACrB,eAAO,IAAI,SAAS,OAAO,YAAY,KAAK,CAAC;AAAA,MAC/C;AAEA,UAAI,aAAa;AACf,eAAO,IAAI,UAAU,WAAW;AAAA,MAClC;AAEA,aAAO,OAAO,SAAS;AAAA,IACzB;AAAA,IACA,CAAC;AAAA,EACH;AAKA,QAAM,YAAYA;AAAA,IAChB,OAAO,SAAkB,UAAU;AACjC,UAAI;AACF,cAAM,cAAc,iBAAiB,QAAQ,SAAS,SAAS,MAAS;AACxE,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,SAAS,WAAW,EAAE;AAE7D,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,EAAE;AAAA,QAC5D;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,cAAe,KAAK,QAAQ;AAClC,cAAM,aAAa,KAAK;AACxB,cAAM,QAAQ,KAAK;AAEnB,YAAI,QAAQ;AACV,kBAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,WAAW,CAAC;AAAA,QAC7C,OAAO;AACL,kBAAQ,WAAW;AAAA,QACrB;AAEA,kBAAU,UAAU;AACpB,mBAAW,CAAC,CAAC,cAAc,YAAY,WAAW,OAAO,KAAK;AAC9D,sBAAc,KAAK;AACnB,iBAAS,IAAI;AAAA,MACf,SAAS,KAAK;AACZ,cAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACrE,iBAAS,UAAU;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,SAAS,QAAQ,QAAQ,gBAAgB;AAAA,EAC5C;AAKA,EAAAC,WAAU,MAAM;AACd,UAAM,UAAU,YAAY;AAC1B,mBAAa,IAAI;AACjB,YAAM,UAAU,KAAK;AACrB,mBAAa,KAAK;AAAA,IACpB;AAEA,YAAQ;AAAA,EACV,GAAG,CAAC,MAAM,CAAC;AAKX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC;AAAa;AAElB,UAAM,aAAa,YAAY,MAAM;AACnC,gBAAU,KAAK;AAAA,IACjB,GAAG,eAAe;AAElB,WAAO,MAAM,cAAc,UAAU;AAAA,EACvC,GAAG,CAAC,aAAa,iBAAiB,SAAS,CAAC;AAK5C,QAAM,WAAWD,aAAY,YAAY;AACvC,QAAI,CAAC,WAAW;AAAW;AAC3B,iBAAa,IAAI;AACjB,UAAM,UAAU,IAAI;AACpB,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,SAAS,WAAW,SAAS,CAAC;AAKlC,QAAM,UAAUA,aAAY,YAAY;AACtC,cAAU,MAAS;AACnB,iBAAa,IAAI;AACjB,UAAM,UAAU,KAAK;AACrB,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,SAAS,CAAC;AAKd,QAAM,YAAYA;AAAA,IAChB,CAAC,cAA+C;AAC9C,gBAAU,MAAS;AACnB,qBAAe,CAAC,UAAU;AAAA,QACxB,GAAG;AAAA,QACH,YAAY,UAAU,cAAc,KAAK;AAAA,QACzC,QAAQ,UAAU,UAAU,KAAK;AAAA,QACjC,cAAc,UAAU,gBAAgB,KAAK;AAAA,QAC7C,eAAe,UAAU,iBAAiB,KAAK;AAAA,QAC/C,OAAO,UAAU,YAAY,KAAK;AAAA,MACpC,EAAE;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9PA,SAAS,eAAAG,cAAa,YAAAC,iBAAgB;AA0C/B,SAAS,iBACd,SACgC;AAChC,QAAM,EAAE,YAAY,UAAU,kBAAkB,SAAS,QAAQ,IAAI;AAErE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AAKrD,QAAM,QAAQD;AAAA,IACZ,OAAO,UAAmC;AACxC,oBAAc,IAAI;AAClB,eAAS,IAAI;AAEb,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,IAAI,UAAU,UAAU;AAAA,UAC7D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,QAChC,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,gBAAM,IAAI;AAAA,YACR,UAAU,WAAW,6BAA6B,SAAS,MAAM;AAAA,UACnE;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,QAAQ,KAAK,SAAS,KAAK;AAEjC,qBAAa,KAAK;AAClB,kBAAU,KAAK;AAEf,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACrE,iBAAS,UAAU;AACnB,kBAAU,UAAU;AACpB,cAAM;AAAA,MACR,UAAE;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,SAAS,SAAS,OAAO;AAAA,EACxC;AAKA,QAAM,aAAaA,aAAY,MAAM;AACnC,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
3
+ "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/workflow/react/use-workflow.ts", "../../../src/ai/workflow/react/use-approval.ts", "../../../src/ai/workflow/react/use-workflow-list.ts", "../../../src/ai/workflow/react/use-workflow-start.ts"],
4
+ "sourcesContent": ["/**\n * Shim for Deno.env.get() to work in Node.js\n * This provides a proper function that reads from process.env\n */\n\n// Create a shim that matches Deno.env.get(key) signature\nconst denoEnvShim = {\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// Assign to globalThis.Deno if it doesn't exist\nif (typeof globalThis.Deno === \"undefined\") {\n (globalThis as any).Deno = {\n env: denoEnvShim,\n cwd: () => process.cwd(),\n };\n} else if (typeof (globalThis as any).Deno.env === \"undefined\") {\n (globalThis as any).Deno.env = denoEnvShim;\n}\n\nexport { denoEnvShim };\n", "/**\n * useWorkflow Hook\n *\n * React hook for tracking and interacting with workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflow } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowDashboard({ runId }: { runId: string }) {\n * const {\n * run,\n * status,\n * progress,\n * currentNodes,\n * pendingApprovals,\n * cancel,\n * retry,\n * isLoading,\n * error,\n * } = useWorkflow({ runId });\n *\n * return (\n * <div>\n * <h2>Status: {status}</h2>\n * <p>Progress: {progress}%</p>\n * {pendingApprovals.length > 0 && (\n * <p>{pendingApprovals.length} approvals pending</p>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NodeState, PendingApproval, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflow hook\n */\nexport interface UseWorkflowOptions {\n /** Run ID to track */\n runId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Polling interval in ms (defaults to 2000) */\n pollInterval?: number;\n\n /** Enable automatic polling */\n autoRefresh?: boolean;\n\n /** Callback when status changes */\n onStatusChange?: (status: WorkflowStatus, previousStatus: WorkflowStatus) => void;\n\n /** Callback when workflow completes */\n onComplete?: (run: WorkflowRun) => void;\n\n /** Callback when workflow fails */\n onError?: (error: Error, run?: WorkflowRun) => void;\n\n /** Callback when approval is required */\n onApprovalRequired?: (approval: PendingApproval) => void;\n}\n\n/**\n * Result from useWorkflow hook\n */\nexport interface UseWorkflowResult {\n /** The workflow run data */\n run: WorkflowRun | null;\n\n /** Current workflow status */\n status: WorkflowStatus;\n\n /** Progress percentage (0-100) */\n progress: number;\n\n /** Currently executing node IDs */\n currentNodes: string[];\n\n /** Node states by node ID */\n nodeStates: Record<string, NodeState>;\n\n /** Pending approvals */\n pendingApprovals: PendingApproval[];\n\n /** Refresh the workflow data */\n refresh: () => Promise<void>;\n\n /** Cancel the workflow */\n cancel: () => Promise<void>;\n\n /** Retry a failed workflow */\n retry: () => Promise<void>;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n}\n\n/**\n * useWorkflow - Track and interact with a workflow run\n */\nexport function useWorkflow(options: UseWorkflowOptions): UseWorkflowResult {\n const {\n runId,\n apiBase = \"/api/workflows\",\n pollInterval = 2000,\n autoRefresh = true,\n onStatusChange,\n onComplete,\n onError,\n onApprovalRequired,\n } = options;\n\n const [run, setRun] = useState<WorkflowRun | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const previousStatusRef = useRef<WorkflowStatus | null>(null);\n const previousApprovalsRef = useRef<Set<string>>(new Set());\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Fetch workflow data\n */\n const fetchRun = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}`, {\n signal: abortControllerRef.current?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow: ${response.status}`);\n }\n\n const data = await response.json();\n const workflowRun = data as WorkflowRun;\n\n // Check for status changes\n if (previousStatusRef.current && previousStatusRef.current !== workflowRun.status) {\n onStatusChange?.(workflowRun.status, previousStatusRef.current);\n }\n previousStatusRef.current = workflowRun.status;\n\n // Check for completion\n if (workflowRun.status === \"completed\") {\n onComplete?.(workflowRun);\n }\n\n // Check for failures\n if (workflowRun.status === \"failed\") {\n const failedError = new Error(\"Workflow failed\");\n onError?.(failedError, workflowRun);\n }\n\n // Check for new approvals\n if (workflowRun.pendingApprovals) {\n for (const approval of workflowRun.pendingApprovals) {\n if (approval.status === \"pending\" && !previousApprovalsRef.current.has(approval.id)) {\n previousApprovalsRef.current.add(approval.id);\n onApprovalRequired?.(approval);\n }\n }\n }\n\n setRun(workflowRun);\n setError(null);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n }\n }, [runId, apiBase, onStatusChange, onComplete, onError, onApprovalRequired]);\n\n /**\n * Initial fetch and polling setup\n */\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n };\n\n doFetch();\n\n // Set up polling for active workflows\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (autoRefresh) {\n intervalId = setInterval(() => {\n // Only poll if workflow is still active\n const currentStatus = previousStatusRef.current;\n if (currentStatus && ![\"completed\", \"failed\", \"cancelled\"].includes(currentStatus)) {\n fetchRun();\n }\n }, pollInterval);\n }\n\n return () => {\n abortControllerRef.current?.abort();\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [runId, autoRefresh, pollInterval, fetchRun]);\n\n /**\n * Refresh workflow data\n */\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchRun();\n setIsLoading(false);\n }, [fetchRun]);\n\n /**\n * Cancel the workflow\n */\n const cancel = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/cancel`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to cancel workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const cancelError = err instanceof Error ? err : new Error(String(err));\n setError(cancelError);\n throw cancelError;\n }\n }, [runId, apiBase, refresh]);\n\n /**\n * Retry a failed workflow\n */\n const retry = useCallback(async () => {\n if (!runId) return;\n\n try {\n const response = await fetch(`${apiBase}/runs/${runId}/retry`, {\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to retry workflow: ${response.status}`);\n }\n\n await refresh();\n } catch (err) {\n const retryError = err instanceof Error ? err : new Error(String(err));\n setError(retryError);\n throw retryError;\n }\n }, [runId, apiBase, refresh]);\n\n // Calculate progress\n const calculateProgress = (): number => {\n if (!run?.nodeStates) return 0;\n\n const states = Object.values(run.nodeStates);\n if (states.length === 0) return 0;\n\n const completed = states.filter(\n (s) => s.status === \"completed\" || s.status === \"skipped\",\n ).length;\n\n return Math.round((completed / states.length) * 100);\n };\n\n return {\n run,\n status: run?.status ?? \"pending\",\n progress: calculateProgress(),\n currentNodes: run?.currentNodes ?? [],\n nodeStates: run?.nodeStates ?? {},\n pendingApprovals: run?.pendingApprovals?.filter((a) => a.status === \"pending\") ?? [],\n refresh,\n cancel,\n retry,\n isLoading,\n error,\n };\n}\n", "/**\n * useApproval Hook\n *\n * React hook for handling workflow approval interactions.\n *\n * @example\n * ```tsx\n * import { useApproval } from 'veryfront/ai/workflow/react';\n *\n * function ApprovalUI({ runId, approvalId }: Props) {\n * const {\n * approval,\n * approve,\n * reject,\n * isSubmitting,\n * error,\n * } = useApproval({ runId, approvalId });\n *\n * if (!approval) return <p>Loading...</p>;\n *\n * return (\n * <div>\n * <h3>{approval.message}</h3>\n * <p>Requested by: {approval.stepId}</p>\n * <button onClick={() => approve('Looks good!')}>\n * Approve\n * </button>\n * <button onClick={() => reject('Needs changes')}>\n * Reject\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ApprovalDecision, PendingApproval } from \"../types.ts\";\n\n/**\n * Options for useApproval hook\n */\nexport interface UseApprovalOptions {\n /** Workflow run ID */\n runId: string;\n\n /** Approval ID */\n approvalId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Current user/approver name */\n approver?: string;\n\n /** Callback on successful approval/rejection */\n onDecision?: (decision: ApprovalDecision) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useApproval hook\n */\nexport interface UseApprovalResult {\n /** The approval data */\n approval: PendingApproval | null;\n\n /** Approve the request */\n approve: (comment?: string) => Promise<void>;\n\n /** Reject the request */\n reject: (comment?: string) => Promise<void>;\n\n /** Submit a custom decision */\n submitDecision: (decision: ApprovalDecision) => Promise<void>;\n\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n\n /** Loading state for initial fetch */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether the approval is still pending */\n isPending: boolean;\n\n /** Whether the approval has been resolved */\n isResolved: boolean;\n}\n\n/**\n * useApproval - Handle workflow approval interactions\n */\nexport function useApproval(options: UseApprovalOptions): UseApprovalResult {\n const {\n runId,\n approvalId,\n apiBase = \"/api/workflows\",\n approver = \"unknown\",\n onDecision,\n onError,\n } = options;\n\n const [approval, setApproval] = useState<PendingApproval | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch approval data\n */\n useEffect(() => {\n const fetchApproval = async () => {\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch approval: ${response.status}`);\n }\n\n const data = await response.json();\n setApproval(data as PendingApproval);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n onError?.(fetchError);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (runId && approvalId) {\n fetchApproval();\n }\n }, [runId, approvalId, apiBase, onError]);\n\n /**\n * Submit a decision\n */\n const submitDecision = useCallback(\n async (decision: ApprovalDecision) => {\n if (!runId || !approvalId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const response = await fetch(\n `${apiBase}/runs/${runId}/approvals/${approvalId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(decision),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to submit decision: ${response.status}`);\n }\n\n // Update local state\n setApproval((prev) =>\n prev\n ? {\n ...prev,\n status: decision.approved ? \"approved\" : \"rejected\",\n resolvedAt: new Date(),\n resolvedBy: decision.approver,\n comment: decision.comment,\n }\n : null\n );\n\n onDecision?.(decision);\n } catch (err) {\n const submitError = err instanceof Error ? err : new Error(String(err));\n setError(submitError);\n onError?.(submitError);\n throw submitError;\n } finally {\n setIsSubmitting(false);\n }\n },\n [runId, approvalId, apiBase, onDecision, onError],\n );\n\n /**\n * Approve the request\n */\n const approve = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: true,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n /**\n * Reject the request\n */\n const reject = useCallback(\n async (comment?: string) => {\n await submitDecision({\n approved: false,\n approver,\n comment,\n });\n },\n [submitDecision, approver],\n );\n\n return {\n approval,\n approve,\n reject,\n submitDecision,\n isSubmitting,\n isLoading,\n error,\n isPending: approval?.status === \"pending\",\n isResolved: approval?.status !== \"pending\",\n };\n}\n", "/**\n * useWorkflowList Hook\n *\n * React hook for listing and filtering workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowList } from 'veryfront/ai/workflow/react';\n *\n * function WorkflowList() {\n * const {\n * runs,\n * isLoading,\n * hasMore,\n * loadMore,\n * setFilter,\n * } = useWorkflowList({\n * workflowId: 'content-pipeline',\n * status: 'running',\n * });\n *\n * return (\n * <div>\n * {runs.map(run => (\n * <div key={run.id}>\n * {run.id} - {run.status}\n * </div>\n * ))}\n * {hasMore && (\n * <button onClick={loadMore}>Load More</button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { RunFilter, WorkflowRun, WorkflowStatus } from \"../types.ts\";\n\n/**\n * Options for useWorkflowList hook\n */\nexport interface UseWorkflowListOptions {\n /** Filter by workflow ID */\n workflowId?: string;\n\n /** Filter by status */\n status?: WorkflowStatus | WorkflowStatus[];\n\n /** Filter runs created after this date */\n createdAfter?: Date;\n\n /** Filter runs created before this date */\n createdBefore?: Date;\n\n /** Page size (defaults to 20) */\n pageSize?: number;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Enable automatic refresh */\n autoRefresh?: boolean;\n\n /** Refresh interval in ms (defaults to 5000) */\n refreshInterval?: number;\n}\n\n/**\n * Result from useWorkflowList hook\n */\nexport interface UseWorkflowListResult {\n /** List of workflow runs */\n runs: WorkflowRun[];\n\n /** Total count (if available) */\n totalCount?: number;\n\n /** Loading state */\n isLoading: boolean;\n\n /** Error state */\n error: Error | null;\n\n /** Whether there are more results */\n hasMore: boolean;\n\n /** Load more results */\n loadMore: () => Promise<void>;\n\n /** Refresh the list */\n refresh: () => Promise<void>;\n\n /** Update the filter */\n setFilter: (filter: Partial<UseWorkflowListOptions>) => void;\n\n /** Current filter */\n filter: RunFilter;\n}\n\n/**\n * useWorkflowList - List and filter workflow runs\n */\nexport function useWorkflowList(\n options: UseWorkflowListOptions = {},\n): UseWorkflowListResult {\n const {\n workflowId,\n status,\n createdAfter,\n createdBefore,\n pageSize = 20,\n apiBase = \"/api/workflows\",\n autoRefresh = false,\n refreshInterval = 5000,\n } = options;\n\n const [runs, setRuns] = useState<WorkflowRun[]>([]);\n const [totalCount, setTotalCount] = useState<number | undefined>();\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [cursor, setCursor] = useState<string | undefined>();\n\n const [filter, setFilterState] = useState<RunFilter>({\n workflowId,\n status,\n createdAfter,\n createdBefore,\n limit: pageSize,\n });\n\n /**\n * Build query string from filter\n */\n const buildQueryString = useCallback(\n (filterToUse: RunFilter, cursorToUse?: string): string => {\n const params = new URLSearchParams();\n\n if (filterToUse.workflowId) {\n params.set(\"workflowId\", filterToUse.workflowId);\n }\n\n if (filterToUse.status) {\n const statuses = Array.isArray(filterToUse.status)\n ? filterToUse.status\n : [filterToUse.status];\n statuses.forEach((s) => params.append(\"status\", s));\n }\n\n if (filterToUse.createdAfter) {\n params.set(\"createdAfter\", filterToUse.createdAfter.toISOString());\n }\n\n if (filterToUse.createdBefore) {\n params.set(\"createdBefore\", filterToUse.createdBefore.toISOString());\n }\n\n if (filterToUse.limit) {\n params.set(\"limit\", String(filterToUse.limit));\n }\n\n if (cursorToUse) {\n params.set(\"cursor\", cursorToUse);\n }\n\n return params.toString();\n },\n [],\n );\n\n /**\n * Fetch runs\n */\n const fetchRuns = useCallback(\n async (append: boolean = false) => {\n try {\n const queryString = buildQueryString(filter, append ? cursor : undefined);\n const response = await fetch(`${apiBase}/runs?${queryString}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch runs: ${response.status}`);\n }\n\n const data = await response.json();\n const fetchedRuns = (data.runs || data) as WorkflowRun[];\n const nextCursor = data.cursor;\n const total = data.totalCount;\n\n if (append) {\n setRuns((prev) => [...prev, ...fetchedRuns]);\n } else {\n setRuns(fetchedRuns);\n }\n\n setCursor(nextCursor);\n setHasMore(!!nextCursor || fetchedRuns.length === filter.limit);\n setTotalCount(total);\n setError(null);\n } catch (err) {\n const fetchError = err instanceof Error ? err : new Error(String(err));\n setError(fetchError);\n }\n },\n [apiBase, filter, cursor, buildQueryString],\n );\n\n /**\n * Initial fetch\n */\n useEffect(() => {\n const doFetch = async () => {\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n };\n\n doFetch();\n }, [filter]); // Re-fetch when filter changes\n\n /**\n * Auto-refresh setup\n */\n useEffect(() => {\n if (!autoRefresh) return;\n\n const intervalId = setInterval(() => {\n fetchRuns(false);\n }, refreshInterval);\n\n return () => clearInterval(intervalId);\n }, [autoRefresh, refreshInterval, fetchRuns]);\n\n /**\n * Load more results\n */\n const loadMore = useCallback(async () => {\n if (!hasMore || isLoading) return;\n setIsLoading(true);\n await fetchRuns(true);\n setIsLoading(false);\n }, [hasMore, isLoading, fetchRuns]);\n\n /**\n * Refresh the list\n */\n const refresh = useCallback(async () => {\n setCursor(undefined);\n setIsLoading(true);\n await fetchRuns(false);\n setIsLoading(false);\n }, [fetchRuns]);\n\n /**\n * Update filter\n */\n const setFilter = useCallback(\n (newFilter: Partial<UseWorkflowListOptions>) => {\n setCursor(undefined); // Reset pagination\n setFilterState((prev) => ({\n ...prev,\n workflowId: newFilter.workflowId ?? prev.workflowId,\n status: newFilter.status ?? prev.status,\n createdAfter: newFilter.createdAfter ?? prev.createdAfter,\n createdBefore: newFilter.createdBefore ?? prev.createdBefore,\n limit: newFilter.pageSize ?? prev.limit,\n }));\n },\n [],\n );\n\n return {\n runs,\n totalCount,\n isLoading,\n error,\n hasMore,\n loadMore,\n refresh,\n setFilter,\n filter,\n };\n}\n", "/**\n * useWorkflowStart Hook\n *\n * React hook for starting workflow runs.\n *\n * @example\n * ```tsx\n * import { useWorkflowStart } from 'veryfront/ai/workflow/react';\n *\n * function StartWorkflowButton() {\n * const { start, isStarting, error, lastRunId } = useWorkflowStart({\n * workflowId: 'content-pipeline',\n * onStart: (runId) => {\n * console.log('Started:', runId);\n * },\n * });\n *\n * return (\n * <button\n * onClick={() => start({ topic: 'AI Safety' })}\n * disabled={isStarting}\n * >\n * {isStarting ? 'Starting...' : 'Start Workflow'}\n * </button>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useState } from \"react\";\n\n/**\n * Options for useWorkflowStart hook\n */\nexport interface UseWorkflowStartOptions {\n /** Workflow ID to start */\n workflowId: string;\n\n /** API endpoint base (defaults to /api/workflows) */\n apiBase?: string;\n\n /** Callback when workflow starts successfully */\n onStart?: (runId: string) => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Result from useWorkflowStart hook\n */\nexport interface UseWorkflowStartResult<TInput = unknown> {\n /** Start a new workflow run */\n start: (input: TInput) => Promise<string>;\n\n /** Whether a start is in progress */\n isStarting: boolean;\n\n /** Last started run ID */\n lastRunId: string | null;\n\n /** Error state */\n error: Error | null;\n\n /** Reset error state */\n resetError: () => void;\n}\n\n/**\n * useWorkflowStart - Start new workflow runs\n */\nexport function useWorkflowStart<TInput = unknown>(\n options: UseWorkflowStartOptions,\n): UseWorkflowStartResult<TInput> {\n const { workflowId, apiBase = \"/api/workflows\", onStart, onError } = options;\n\n const [isStarting, setIsStarting] = useState(false);\n const [lastRunId, setLastRunId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Start a new workflow run\n */\n const start = useCallback(\n async (input: TInput): Promise<string> => {\n setIsStarting(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBase}/${workflowId}/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ input }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message || `Failed to start workflow: ${response.status}`,\n );\n }\n\n const data = await response.json();\n const runId = data.runId || data.id;\n\n setLastRunId(runId);\n onStart?.(runId);\n\n return runId;\n } catch (err) {\n const startError = err instanceof Error ? err : new Error(String(err));\n setError(startError);\n onError?.(startError);\n throw startError;\n } finally {\n setIsStarting(false);\n }\n },\n [workflowId, apiBase, onStart, onError],\n );\n\n /**\n * Reset error state\n */\n const resetError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n start,\n isStarting,\n lastRunId,\n error,\n resetError,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["useCallback", "useEffect", "useState", "useCallback", "useEffect", "useState", "useCallback", "useState"]
7
7
  }
@@ -1,3 +1,30 @@
1
+ // src/_shims/deno-env.ts
2
+ var denoEnvShim = {
3
+ get(key) {
4
+ return process.env[key];
5
+ },
6
+ set(key, value) {
7
+ process.env[key] = value;
8
+ },
9
+ delete(key) {
10
+ delete process.env[key];
11
+ },
12
+ has(key) {
13
+ return key in process.env;
14
+ },
15
+ toObject() {
16
+ return { ...process.env };
17
+ }
18
+ };
19
+ if (typeof globalThis.Deno === "undefined") {
20
+ globalThis.Deno = {
21
+ env: denoEnvShim,
22
+ cwd: () => process.cwd()
23
+ };
24
+ } else if (typeof globalThis.Deno.env === "undefined") {
25
+ globalThis.Deno.env = denoEnvShim;
26
+ }
27
+
1
28
  // src/ai/workflow/types.ts
2
29
  function parseDuration(duration) {
3
30
  if (typeof duration === "number") {
@@ -677,7 +704,7 @@ var LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
677
704
  // deno.json
678
705
  var deno_default = {
679
706
  name: "veryfront",
680
- version: "0.0.64",
707
+ version: "0.0.65",
681
708
  nodeModulesDir: "auto",
682
709
  exclude: [
683
710
  "npm/",
@@ -887,7 +914,7 @@ var nodeProcess = globalThis.process;
887
914
  var hasNodeProcess2 = !!nodeProcess?.versions?.node;
888
915
  function getEnv(key) {
889
916
  if (isDeno) {
890
- return process.env(key);
917
+ return Deno.env.get(key);
891
918
  }
892
919
  if (hasNodeProcess2) {
893
920
  return nodeProcess.env[key];