react-observer-agent 0.2.0 → 0.3.0

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 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/tools/registerTool.ts","../src/tools/validateToolNames.ts","../src/provider/AIAgentProvider.tsx","../src/state/resolveState.ts","../src/state/createStateSnapshot.ts","../src/permissions/filterTools.ts","../src/permissions/validateToolCall.ts","../src/tools/validateArgs.ts","../src/provider/executeAgentLoop.ts","../src/provider/useAgent.ts","../src/permissions/filterState.ts","../src/adapters/openai.ts","../src/adapters/claude.ts"],"sourcesContent":["// Tools\nexport { registerTool } from './tools/registerTool';\nexport { validateToolNames } from './tools/validateToolNames';\n\n// Provider\nexport { AIAgentProvider } from './provider/AIAgentProvider';\nexport { useAgent } from './provider/useAgent';\n\n// Permissions\nexport { filterState } from './permissions/filterState';\nexport { filterTools } from './permissions/filterTools';\nexport { validateToolCall } from './permissions/validateToolCall';\n\n// Adapters\nexport { openAIAdapter } from './adapters/openai';\nexport { claudeAdapter } from './adapters/claude';\n\n// Types\nexport type {\n ToolDefinition,\n AnyToolDefinition,\n ToolOptions,\n AIAgentProviderProps,\n PermissionsConfig,\n AgentOptions,\n AgentContext,\n AgentResponse,\n ToolCallResult,\n ConversationEntry,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n StateSource,\n PendingToolCall,\n ToolCallEvent,\n SendOptions,\n AgentError,\n JSONSchema,\n LLMToolCall,\n LLMToolDefinition,\n ConversationMessage,\n OpenAIAdapterConfig,\n ClaudeAdapterConfig,\n} from './types';\n","import type { ToolDefinition, ToolOptions } from '../types';\n\nexport function registerTool<TArgs = unknown>(\n name: string,\n handler: (args: TArgs) => unknown | Promise<unknown>,\n options?: ToolOptions,\n): ToolDefinition<TArgs> {\n return {\n name,\n handler,\n description: options?.description,\n parameters: options?.parameters,\n confirm: options?.confirm ?? false,\n };\n}\n","import type { AnyToolDefinition } from '../types';\n\nconst RESERVED_PREFIX = '__';\n\nexport function validateToolNames(tools: AnyToolDefinition[]): void {\n const seen = new Set<string>();\n for (const tool of tools) {\n if (tool.name.startsWith(RESERVED_PREFIX)) {\n throw new Error(\n `Tool name \"${tool.name}\" uses the reserved \"${RESERVED_PREFIX}\" prefix. ` +\n `Names beginning with \"${RESERVED_PREFIX}\" are reserved for internal tools.`,\n );\n }\n if (seen.has(tool.name)) {\n throw new Error(\n `Duplicate tool name \"${tool.name}\". All tools passed to a single provider must have unique names.`,\n );\n }\n seen.add(tool.name);\n }\n}\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n AgentContext,\n AgentResponse,\n AIAgentProviderProps,\n ConversationEntry,\n ConversationMessage,\n SendOptions,\n} from '../types';\nimport { validateToolNames } from '../tools/validateToolNames';\nimport { executeAgentLoop } from './executeAgentLoop';\n\nexport const AgentContextValue = createContext<AgentContext | null>(null);\n\nexport function AIAgentProvider({\n model,\n state,\n tools,\n permissions,\n options,\n children,\n}: AIAgentProviderProps) {\n const [isProcessing, setIsProcessing] = useState(false);\n const [history, setHistory] = useState<ConversationEntry[]>([]);\n const [lastResponse, setLastResponse] = useState<AgentResponse | null>(null);\n\n // Store latest props in refs so send() always sees current values\n const modelRef = useRef(model);\n const stateRef = useRef(state);\n const toolsRef = useRef(tools);\n const permissionsRef = useRef(permissions);\n const optionsRef = useRef(options);\n\n modelRef.current = model;\n stateRef.current = state;\n toolsRef.current = tools;\n permissionsRef.current = permissions;\n optionsRef.current = options;\n\n useEffect(() => {\n validateToolNames(tools);\n }, [tools]);\n\n // The LLM-facing transcript, kept separately from the user-facing history so\n // structured tool calls survive across interactions.\n const transcriptRef = useRef<ConversationMessage[]>([]);\n\n const clearHistory = useCallback(() => {\n setHistory([]);\n setLastResponse(null);\n transcriptRef.current = [];\n }, []);\n\n const send = useCallback(async (\n message: string,\n sendOptions?: SendOptions,\n ): Promise<AgentResponse> => {\n setIsProcessing(true);\n\n const userEntry: ConversationEntry = {\n role: 'user',\n content: message,\n timestamp: Date.now(),\n };\n\n setHistory((prev) => [...prev, userEntry]);\n\n try {\n const { response, messages } = await executeAgentLoop(message, {\n model: modelRef.current,\n state: stateRef.current,\n tools: toolsRef.current,\n permissions: permissionsRef.current,\n options: optionsRef.current,\n conversationHistory: transcriptRef.current,\n signal: sendOptions?.signal,\n });\n\n // An abort can land between an assistant message and the tool results\n // answering it. Providers reject that shape, so the partial turn is\n // dropped rather than replayed.\n if (response.error?.code !== 'ABORTED') {\n transcriptRef.current = messages;\n }\n\n const assistantEntry: ConversationEntry = {\n role: 'assistant',\n content: response.message,\n toolCalls: response.toolCalls,\n timestamp: Date.now(),\n };\n\n setHistory((prev) => [...prev, assistantEntry]);\n setLastResponse(response);\n\n // The loop reports failures it recovered from by returning them, rather\n // than throwing, so the error handler still needs to hear about them.\n // A user-initiated cancel is not an application error.\n if (response.error && response.error.code !== 'ABORTED') {\n optionsRef.current?.onError?.(response.error);\n }\n\n return response;\n } catch (error) {\n const agentError = {\n message: error instanceof Error ? error.message : 'Unknown error',\n cause: error,\n };\n const errorResponse: AgentResponse = {\n message: '',\n toolCalls: [],\n error: agentError,\n };\n setLastResponse(errorResponse);\n optionsRef.current?.onError?.(agentError);\n return errorResponse;\n } finally {\n setIsProcessing(false);\n }\n }, []);\n\n const contextValue = useMemo<AgentContext>(\n () => ({\n send,\n isProcessing,\n history,\n clearHistory,\n lastResponse,\n }),\n [send, isProcessing, history, clearHistory, lastResponse],\n );\n\n return (\n <AgentContextValue.Provider value={contextValue}>\n {children}\n </AgentContextValue.Provider>\n );\n}\n","import type { StateSource } from '../types';\n\nexport function resolveState(state: StateSource): Record<string, unknown> {\n const resolved = typeof state === 'function' ? state() : state;\n return resolved as Record<string, unknown>;\n}\n","import type { StateSource } from '../types';\nimport { resolveState } from './resolveState';\n\nexport function stripNonSerializable(\n obj: Record<string, unknown>,\n debug: boolean = false,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n try {\n JSON.stringify(value);\n result[key] = value;\n } catch {\n if (debug) {\n console.warn(\n `[react-observer-agent] Non-serializable value stripped from state key \"${key}\"`,\n );\n }\n }\n }\n\n return result;\n}\n\nfunction isSerializableValue(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'function' || typeof value === 'symbol') return false;\n if (typeof value === 'bigint') return false;\n return true;\n}\n\nexport function createStateSnapshot(\n state: StateSource,\n canAccess: string[],\n debug: boolean = false,\n): Record<string, unknown> {\n const resolved = resolveState(state);\n const filtered: Record<string, unknown> = {};\n\n for (const key of canAccess) {\n if (key in resolved) {\n const value = resolved[key];\n if (!isSerializableValue(value)) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Non-serializable value stripped from state key \"${key}\"`,\n );\n }\n continue;\n }\n filtered[key] = value;\n }\n }\n\n return stripNonSerializable(filtered, debug);\n}\n","import type { AnyToolDefinition } from '../types';\n\nexport function filterTools(\n tools: AnyToolDefinition[],\n canExecute: string[],\n): AnyToolDefinition[] {\n const allowed = new Set(canExecute);\n return tools.filter((tool) => allowed.has(tool.name));\n}\n","export function validateToolCall(\n name: string,\n canExecute: string[],\n): boolean {\n return canExecute.includes(name);\n}\n","import type { JSONSchema } from '../types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validates tool arguments against a deliberate subset of JSON Schema:\n * `type`, `properties`, `required`, `items`, and `enum`. Every other keyword\n * is ignored rather than rejected, so a richer real-world schema still\n * validates on the parts this understands instead of failing outright.\n */\nexport function validateArgs(\n args: unknown,\n schema: JSONSchema,\n): ValidationResult {\n const errors: string[] = [];\n validateValue(args, schema, '', errors);\n return { valid: errors.length === 0, errors };\n}\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number') {\n return Number.isInteger(value) ? 'integer' : 'number';\n }\n return typeof value;\n}\n\nfunction matchesType(value: unknown, expected: string): boolean {\n const actual = describeType(value);\n // Every integer is a valid number, but not the reverse.\n if (expected === 'number') return actual === 'number' || actual === 'integer';\n return actual === expected;\n}\n\nfunction sameValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (\n a === null ||\n b === null ||\n typeof a !== 'object' ||\n typeof b !== 'object'\n ) {\n return false;\n }\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction label(path: string): string {\n return path === '' ? 'value' : path;\n}\n\nfunction validateValue(\n value: unknown,\n schema: JSONSchema,\n path: string,\n errors: string[],\n): void {\n if (!schema || typeof schema !== 'object') return;\n\n const expectedType = schema.type;\n if (typeof expectedType === 'string' && !matchesType(value, expectedType)) {\n errors.push(\n `${label(path)} should be ${expectedType}, got ${describeType(value)}`,\n );\n // Anything further would just restate the same mismatch.\n return;\n }\n\n if (\n Array.isArray(schema.enum) &&\n !schema.enum.some((option) => sameValue(option, value))\n ) {\n errors.push(\n `${label(path)} should be one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n );\n }\n\n if (isPlainObject(value)) {\n validateObject(value, schema, path, errors);\n }\n\n if (Array.isArray(value) && isPlainObject(schema.items)) {\n const itemSchema = schema.items as JSONSchema;\n value.forEach((item, index) => {\n validateValue(item, itemSchema, `${label(path)}[${index}]`, errors);\n });\n }\n}\n\nfunction validateObject(\n value: Record<string, unknown>,\n schema: JSONSchema,\n path: string,\n errors: string[],\n): void {\n if (Array.isArray(schema.required)) {\n for (const key of schema.required) {\n if (typeof key === 'string' && value[key] === undefined) {\n errors.push(`${path === '' ? '' : `${path}.`}${key} is required`);\n }\n }\n }\n\n if (isPlainObject(schema.properties)) {\n const properties = schema.properties as Record<string, JSONSchema>;\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (value[key] !== undefined && isPlainObject(propertySchema)) {\n validateValue(\n value[key],\n propertySchema,\n path === '' ? key : `${path}.${key}`,\n errors,\n );\n }\n }\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import type {\n AgentOptions,\n AgentResponse,\n AnyToolDefinition,\n ConversationMessage,\n JSONSchema,\n LLMToolDefinition,\n ModelAdapter,\n PermissionsConfig,\n StateSource,\n ToolCallResult,\n} from '../types';\nimport { createStateSnapshot } from '../state/createStateSnapshot';\nimport { filterTools } from '../permissions/filterTools';\nimport { validateToolCall } from '../permissions/validateToolCall';\nimport { validateArgs } from '../tools/validateArgs';\n\nconst DEFAULT_MAX_TURNS = 5;\nconst READ_STATE_TOOL_NAME = '__readState';\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\ninterface ExecutionContext {\n model: ModelAdapter;\n state: StateSource;\n tools: AnyToolDefinition[];\n permissions: PermissionsConfig;\n options?: AgentOptions;\n conversationHistory: ConversationMessage[];\n signal?: AbortSignal;\n}\n\n/**\n * The loop returns the LLM-facing message list alongside the response so the\n * provider can replay it verbatim on the next interaction. Structured tool\n * calls survive that way, which plain history text cannot express.\n */\nexport interface AgentLoopResult {\n response: AgentResponse;\n messages: ConversationMessage[];\n}\n\n/** Accumulates token usage across the turns of one interaction. */\nclass UsageTotal {\n private promptTokens = 0;\n private completionTokens = 0;\n private reported = false;\n\n add(usage?: { promptTokens: number; completionTokens: number }): void {\n if (!usage) return;\n this.reported = true;\n this.promptTokens += usage.promptTokens ?? 0;\n this.completionTokens += usage.completionTokens ?? 0;\n }\n\n /** Undefined when no adapter response carried usage, rather than a false zero. */\n total(): { promptTokens: number; completionTokens: number } | undefined {\n if (!this.reported) return undefined;\n return {\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n };\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction buildStateManifest(\n canAccess: string[],\n descriptions?: Record<string, string>,\n): { key: string; description: string }[] {\n return canAccess.map((key) => ({\n key,\n description: descriptions?.[key] ?? key,\n }));\n}\n\nfunction buildStateManifestPrompt(manifest: { key: string; description: string }[]): string {\n if (manifest.length === 0) return '';\n const lines = manifest.map((m) => `- ${m.key}: ${m.description}`);\n return [\n 'Available application state (use the __readState tool to access specific keys when needed):',\n ...lines,\n '',\n 'Only request state keys relevant to the user\\'s question. Do not read all keys at once unless necessary.',\n ].join('\\n');\n}\n\nfunction buildReadStateToolDef(): LLMToolDefinition {\n return {\n name: READ_STATE_TOOL_NAME,\n description: 'Read specific keys from the application state. Only request keys you need.',\n parameters: {\n type: 'object',\n properties: {\n keys: {\n type: 'array',\n items: { type: 'string' },\n description: 'State keys to read',\n },\n },\n required: ['keys'],\n },\n };\n}\n\nexport async function executeAgentLoop(\n message: string,\n ctx: ExecutionContext,\n): Promise<AgentLoopResult> {\n const { model, state, tools, permissions, options, signal } = ctx;\n const debug = options?.debug ?? false;\n const maxTurns = options?.maxTurns ?? DEFAULT_MAX_TURNS;\n\n // Key names and descriptions only. Values stay behind __readState.\n const stateManifest = buildStateManifest(\n permissions.canAccess,\n permissions.stateDescriptions,\n );\n\n if (debug) {\n console.log('[react-observer-agent] State manifest:', stateManifest.map((m) => m.key));\n }\n\n const allowedTools = filterTools(tools, permissions.canExecute);\n const llmTools: LLMToolDefinition[] = [];\n\n for (const tool of allowedTools) {\n // A tool without a description gives the LLM nothing to decide on, so it\n // stays hidden. It remains executable if the model names it anyway.\n if (!tool.description) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Tool \"${tool.name}\" has no description and is hidden from the LLM.`,\n );\n }\n continue;\n }\n\n llmTools.push({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters ?? EMPTY_OBJECT_SCHEMA,\n });\n }\n\n if (stateManifest.length > 0) {\n llmTools.push(buildReadStateToolDef());\n }\n\n if (debug) {\n console.log('[react-observer-agent] Available tools:', llmTools.map((t) => t.name));\n }\n\n const toolMap = new Map(allowedTools.map((t) => [t.name, t]));\n\n const messages: ConversationMessage[] = [\n ...ctx.conversationHistory,\n { role: 'user', content: message },\n ];\n\n const manifestPrompt = buildStateManifestPrompt(stateManifest);\n const systemPrompt = [options?.systemPrompt, manifestPrompt]\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n\n const allToolCalls: ToolCallResult[] = [];\n const usage = new UsageTotal();\n let turns = 0;\n let finalMessage = '';\n let completed = false;\n\n const abortedResult = (): AgentLoopResult => ({\n response: {\n message: '',\n toolCalls: allToolCalls,\n error: { message: 'Interaction aborted', code: 'ABORTED' },\n usage: usage.total(),\n },\n messages,\n });\n\n while (turns < maxTurns) {\n if (signal?.aborted) return abortedResult();\n\n turns++;\n\n if (debug) {\n console.log(`[react-observer-agent] Turn ${turns}/${maxTurns}`);\n }\n\n // `state` stays empty: the model pulls what it needs through __readState.\n const modelRequest = {\n // A snapshot, since the loop keeps appending to `messages` after this\n // call and an adapter that reads it asynchronously would see the churn.\n messages: [...messages],\n tools: llmTools,\n state: {} as Record<string, unknown>,\n systemPrompt,\n stateManifest,\n signal,\n };\n\n if (debug) {\n console.log('[react-observer-agent] LLM request:', {\n messageCount: modelRequest.messages.length,\n toolCount: modelRequest.tools.length,\n hasSystemPrompt: !!modelRequest.systemPrompt,\n });\n }\n\n let modelResponse;\n try {\n modelResponse = await model.sendMessage(modelRequest);\n } catch (error) {\n // An adapter that forwarded the signal rejects rather than resolving.\n if (isAbortError(error) || signal?.aborted) {\n return abortedResult();\n }\n throw error;\n }\n\n usage.add(modelResponse.usage);\n\n if (signal?.aborted) return abortedResult();\n\n if (debug) {\n console.log('[react-observer-agent] LLM response:', {\n content: modelResponse.content?.slice(0, 200),\n toolCalls: modelResponse.toolCalls?.map((tc) => tc.name),\n });\n }\n\n // Nothing left to run, so this is the answer.\n if (!modelResponse.toolCalls || modelResponse.toolCalls.length === 0) {\n finalMessage = modelResponse.content ?? '';\n completed = true;\n break;\n }\n\n messages.push({\n role: 'assistant',\n content: modelResponse.content ?? '',\n toolCalls: modelResponse.toolCalls,\n });\n\n for (const llmCall of modelResponse.toolCalls) {\n // Stop before starting any further side effects.\n if (signal?.aborted) return abortedResult();\n\n if (llmCall.name === READ_STATE_TOOL_NAME) {\n const args = llmCall.arguments as { keys?: string[] };\n const requestedKeys = args?.keys ?? [];\n\n const allowedKeys = requestedKeys.filter((k) => permissions.canAccess.includes(k));\n const snapshot = createStateSnapshot(state, allowedKeys, debug);\n\n if (debug) {\n console.log('[react-observer-agent] readState requested:', requestedKeys);\n console.log('[react-observer-agent] readState allowed:', allowedKeys);\n console.log('[react-observer-agent] readState result:', snapshot);\n }\n\n messages.push({\n role: 'tool',\n content: JSON.stringify(snapshot),\n toolCallId: llmCall.id,\n });\n // Internal, so it never reaches allToolCalls or onToolCall.\n continue;\n }\n\n // Re-checked after the model answered, so a hallucinated or injected\n // name is rejected even though it was never advertised.\n if (!validateToolCall(llmCall.name, permissions.canExecute)) {\n const deniedResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: `Tool \"${llmCall.name}\" is not permitted`,\n status: 'denied',\n };\n allToolCalls.push(deniedResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: deniedResult.result,\n status: 'denied',\n });\n\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: deniedResult.result }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n\n const toolDef = toolMap.get(llmCall.name);\n if (!toolDef) {\n const deniedResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: `Tool \"${llmCall.name}\" not found`,\n status: 'denied',\n };\n allToolCalls.push(deniedResult);\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: deniedResult.result }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n\n // Validated before anything acts on the arguments, so the user is never\n // asked to confirm a malformed call.\n if (toolDef.parameters) {\n const validation = validateArgs(llmCall.arguments, toolDef.parameters);\n if (!validation.valid) {\n const errorMessage = `Invalid arguments for tool \"${llmCall.name}\": ${validation.errors.join('; ')}`;\n\n if (debug) {\n console.warn(`[react-observer-agent] ${errorMessage}`);\n }\n\n const invalidResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: errorMessage,\n status: 'error',\n };\n allToolCalls.push(invalidResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: errorMessage,\n status: 'error',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: errorMessage }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n }\n\n if (toolDef.confirm) {\n if (!options?.onConfirm) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Tool \"${llmCall.name}\" requires confirmation but no onConfirm handler provided. Skipping.`,\n );\n }\n const cancelledResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: 'Tool execution cancelled: no confirmation handler provided',\n status: 'cancelled',\n };\n allToolCalls.push(cancelledResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: cancelledResult.result,\n status: 'cancelled',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ status: 'cancelled', reason: 'No confirmation handler' }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n\n const confirmed = await options.onConfirm({\n toolName: llmCall.name,\n args: llmCall.arguments,\n description: toolDef.description,\n });\n\n if (!confirmed) {\n const cancelledResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: 'Tool execution cancelled by user',\n status: 'cancelled',\n };\n allToolCalls.push(cancelledResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: cancelledResult.result,\n status: 'cancelled',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ status: 'cancelled', reason: 'User denied' }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n }\n\n try {\n const result = await toolDef.handler(llmCall.arguments);\n const status = toolDef.confirm ? 'confirmed' : 'success';\n\n if (debug) {\n console.log(`[react-observer-agent] Tool \"${llmCall.name}\" executed:`, { status, result });\n }\n\n const toolResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result,\n status,\n };\n allToolCalls.push(toolResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result,\n status,\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ result }),\n toolCallId: llmCall.id,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n const errorResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: errorMessage,\n status: 'error',\n };\n allToolCalls.push(errorResult);\n options?.onToolCall?.({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: errorMessage,\n status: 'error',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: errorMessage }),\n toolCallId: llmCall.id,\n });\n }\n }\n\n // The next turn carries the tool results back to the model.\n }\n\n // The model was still calling tools when the turn budget ran out, so it never\n // got to answer. Surface that as an error rather than an empty message.\n if (!completed) {\n if (debug) {\n console.warn(`[react-observer-agent] Max turns (${maxTurns}) reached`);\n }\n return {\n response: {\n message: '',\n toolCalls: allToolCalls,\n error: {\n message: `Agent did not produce a final response within ${maxTurns} turns`,\n code: 'MAX_TURNS',\n },\n usage: usage.total(),\n },\n messages,\n };\n }\n\n messages.push({ role: 'assistant', content: finalMessage });\n\n return {\n response: {\n message: finalMessage,\n toolCalls: allToolCalls,\n usage: usage.total(),\n },\n messages,\n };\n}\n","import { useContext } from 'react';\nimport type { AgentContext } from '../types';\nimport { AgentContextValue } from './AIAgentProvider';\n\nexport function useAgent(): AgentContext {\n const context = useContext(AgentContextValue);\n if (!context) {\n throw new Error(\n 'useAgent() must be used within an <AIAgentProvider>. ' +\n 'Wrap your component tree with <AIAgentProvider> to use this hook.',\n );\n }\n return context;\n}\n","export function filterState(\n state: Record<string, unknown>,\n canAccess: string[],\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const key of canAccess) {\n if (key in state) {\n filtered[key] = state[key];\n }\n }\n return filtered;\n}\n","import type {\n ConversationMessage,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n OpenAIAdapterConfig,\n} from '../types';\n\nconst DEFAULT_MODEL = 'gpt-4o';\nconst DEFAULT_TEMPERATURE = 0.2;\nconst OPENAI_BASE_URL = 'https://api.openai.com/v1';\n\nexport function openAIAdapter(config: OpenAIAdapterConfig): ModelAdapter {\n if (!config.apiKey && !config.baseURL) {\n throw new Error(\n 'openAIAdapter requires either \"apiKey\" or \"baseURL\". ' +\n 'Provide an API key for direct access, or a baseURL to route through your backend proxy.',\n );\n }\n\n const baseURL = config.baseURL\n ? config.baseURL.replace(/\\/+$/, '')\n : OPENAI_BASE_URL;\n const model = config.model ?? DEFAULT_MODEL;\n const temperature = config.temperature ?? DEFAULT_TEMPERATURE;\n\n return {\n async sendMessage(request: ModelRequest): Promise<ModelResponse> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...config.headers,\n };\n\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n const messages = request.systemPrompt\n ? [\n { role: 'system' as const, content: request.systemPrompt },\n ...request.messages.map(formatMessage),\n ]\n : request.messages.map(formatMessage);\n\n const tools =\n request.tools.length > 0\n ? request.tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }))\n : undefined;\n\n const body: Record<string, unknown> = {\n model,\n messages,\n temperature,\n };\n\n if (tools) {\n body.tools = tools;\n }\n\n const url = baseURL.includes('/chat/completions')\n ? baseURL\n : `${baseURL}/chat/completions`;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n });\n } catch (error) {\n // An abort is a caller decision, not a transport failure. Rewrapping it\n // would hide the AbortError name the agent loop checks for.\n if (error instanceof Error && error.name === 'AbortError') throw error;\n throw new Error(\n `Network error calling OpenAI API: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `OpenAI API error (${res.status}): ${text || res.statusText}`,\n );\n }\n\n let data: unknown;\n try {\n data = await res.json();\n } catch {\n throw new Error('Failed to parse OpenAI API response as JSON');\n }\n\n return parseResponse(data);\n },\n };\n}\n\nfunction formatMessage(msg: ConversationMessage) {\n const formatted: Record<string, unknown> = {\n role: msg.role,\n content: msg.content,\n };\n\n if (msg.toolCallId) {\n formatted.tool_call_id = msg.toolCallId;\n }\n\n // OpenAI rejects tool messages that do not follow an assistant message\n // carrying the matching tool_calls entry.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n formatted.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments ?? {}),\n },\n }));\n if (msg.content === '') {\n formatted.content = null;\n }\n }\n\n return formatted;\n}\n\nfunction parseResponse(data: unknown): ModelResponse {\n const obj = data as Record<string, unknown>;\n const choices = obj.choices as Array<Record<string, unknown>> | undefined;\n\n if (!choices || choices.length === 0) {\n throw new Error('Malformed OpenAI response: no choices returned');\n }\n\n const message = choices[0].message as Record<string, unknown> | undefined;\n if (!message) {\n throw new Error('Malformed OpenAI response: no message in first choice');\n }\n\n const content = (message.content as string) ?? null;\n const toolCalls = message.tool_calls as\n | Array<{\n id: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n const usage = obj.usage as\n | { prompt_tokens: number; completion_tokens: number }\n | undefined;\n\n return {\n content,\n toolCalls: toolCalls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: safeParseJSON(tc.function.arguments),\n })),\n usage: usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n }\n : undefined,\n };\n}\n\nfunction safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n}\n","import type {\n ClaudeAdapterConfig,\n ConversationMessage,\n LLMToolCall,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n} from '../types';\n\nconst DEFAULT_MODEL = 'claude-opus-5';\nconst DEFAULT_MAX_TOKENS = 16000;\nconst ANTHROPIC_BASE_URL = 'https://api.anthropic.com';\nconst ANTHROPIC_VERSION = '2023-06-01';\n\ninterface TextBlock {\n type: 'text';\n text: string;\n}\n\ninterface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n content: string;\n}\n\ntype ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock;\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | ContentBlock[];\n}\n\nexport function claudeAdapter(config: ClaudeAdapterConfig): ModelAdapter {\n if (!config.apiKey && !config.baseURL) {\n throw new Error(\n 'claudeAdapter requires either \"apiKey\" or \"baseURL\". ' +\n 'Provide an API key for direct access, or a baseURL to route through your backend proxy.',\n );\n }\n\n const baseURL = config.baseURL\n ? config.baseURL.replace(/\\/+$/, '')\n : ANTHROPIC_BASE_URL;\n const model = config.model ?? DEFAULT_MODEL;\n const maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n\n return {\n async sendMessage(request: ModelRequest): Promise<ModelResponse> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': ANTHROPIC_VERSION,\n };\n\n if (config.apiKey) {\n headers['x-api-key'] = config.apiKey;\n }\n\n // Spread last so consumers can override anything above, including adding\n // the CORS opt-in header needed for direct browser access.\n Object.assign(headers, config.headers);\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: toAnthropicMessages(request.messages),\n };\n\n if (request.systemPrompt) {\n body.system = request.systemPrompt;\n }\n\n if (request.tools.length > 0) {\n body.tools = request.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters,\n }));\n }\n\n const url = baseURL.includes('/v1/messages')\n ? baseURL\n : `${baseURL}/v1/messages`;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n throw new Error(\n `Network error calling Anthropic API: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error (${res.status}): ${text || res.statusText}`,\n );\n }\n\n let data: unknown;\n try {\n data = await res.json();\n } catch {\n throw new Error('Failed to parse Anthropic API response as JSON');\n }\n\n return parseResponse(data);\n },\n };\n}\n\n/**\n * Anthropic expects tool calls as `tool_use` blocks on an assistant message and\n * their results as `tool_result` blocks on a following user message, so a run of\n * internal tool messages collapses into one user message.\n */\nfunction toAnthropicMessages(\n messages: ConversationMessage[],\n): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n let pendingToolResults: ToolResultBlock[] = [];\n\n const flushToolResults = () => {\n if (pendingToolResults.length > 0) {\n result.push({ role: 'user', content: pendingToolResults });\n pendingToolResults = [];\n }\n };\n\n for (const message of messages) {\n if (message.role === 'tool') {\n pendingToolResults.push({\n type: 'tool_result',\n tool_use_id: message.toolCallId ?? '',\n content: message.content,\n });\n continue;\n }\n\n flushToolResults();\n\n if (\n message.role === 'assistant' &&\n message.toolCalls &&\n message.toolCalls.length > 0\n ) {\n const blocks: ContentBlock[] = [];\n if (message.content) {\n blocks.push({ type: 'text', text: message.content });\n }\n for (const call of message.toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: call.id,\n name: call.name,\n input: isPlainObject(call.arguments) ? call.arguments : {},\n });\n }\n result.push({ role: 'assistant', content: blocks });\n continue;\n }\n\n result.push({ role: message.role, content: message.content });\n }\n\n flushToolResults();\n\n return result;\n}\n\nfunction parseResponse(data: unknown): ModelResponse {\n const obj = data as Record<string, unknown>;\n const blocks = obj.content;\n\n if (!Array.isArray(blocks)) {\n throw new Error('Malformed Anthropic response: no content blocks returned');\n }\n\n const textParts: string[] = [];\n const toolCalls: LLMToolCall[] = [];\n\n for (const block of blocks as ContentBlock[]) {\n if (block?.type === 'text') {\n textParts.push(block.text);\n } else if (block?.type === 'tool_use') {\n // Already parsed by the API, unlike OpenAI's JSON-string arguments.\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: block.input,\n });\n }\n // Other block types (thinking, for example) carry nothing this loop needs.\n }\n\n const usage = obj.usage as\n | { input_tokens: number; output_tokens: number }\n | undefined;\n\n return {\n content: textParts.length > 0 ? textParts.join('') : null,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n }\n : undefined,\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["import_react","DEFAULT_MODEL","parseResponse","isPlainObject"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tools/registerTool.ts","../src/tools/validateToolNames.ts","../src/tools/validateArgs.ts","../src/utils/describeError.ts","../src/tools/validateToolArgs.ts","../src/provider/AIAgentProvider.tsx","../src/adapters/AdapterError.ts","../src/state/resolveState.ts","../src/state/createStateSnapshot.ts","../src/permissions/filterTools.ts","../src/permissions/validateToolCall.ts","../src/utils/abortRace.ts","../src/provider/executeAgentLoop.ts","../src/utils/linkSignals.ts","../src/provider/useAgent.ts","../src/permissions/filterState.ts","../src/adapters/openai.ts","../src/adapters/claude.ts"],"sourcesContent":["// Tools\nexport { registerTool } from './tools/registerTool';\nexport { validateToolNames } from './tools/validateToolNames';\nexport { validateToolArgs } from './tools/validateToolArgs';\n\n// Provider\nexport { AIAgentProvider } from './provider/AIAgentProvider';\nexport { useAgent } from './provider/useAgent';\n\n// Permissions\nexport { filterState } from './permissions/filterState';\nexport { filterTools } from './permissions/filterTools';\nexport { validateToolCall } from './permissions/validateToolCall';\n\n// Adapters\nexport { openAIAdapter } from './adapters/openai';\nexport { claudeAdapter } from './adapters/claude';\nexport { AdapterError } from './adapters/AdapterError';\n\n// Types\nexport type {\n ToolDefinition,\n AnyToolDefinition,\n ToolOptions,\n ToolContext,\n ToolHandler,\n StandardSchemaV1,\n StandardSchemaProps,\n StandardSchemaResult,\n StandardSchemaIssue,\n InferSchemaOutput,\n AIAgentProviderProps,\n PermissionsConfig,\n AgentOptions,\n AgentContext,\n AgentResponse,\n AgentEvent,\n AgentErrorCode,\n ToolCallResult,\n ToolCallStatus,\n TokenUsage,\n ConversationEntry,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n StopReason,\n StateSource,\n PendingToolCall,\n ToolCallEvent,\n SendOptions,\n AgentError,\n JSONSchema,\n LLMToolCall,\n LLMToolDefinition,\n ConversationMessage,\n OpenAIAdapterConfig,\n ClaudeAdapterConfig,\n} from './types';\nexport type { ToolArgsValidation } from './tools/validateToolArgs';\n","import type {\n InferSchemaOutput,\n StandardSchemaV1,\n ToolDefinition,\n ToolHandler,\n ToolOptions,\n} from '../types';\n\n/**\n * With a Standard Schema, the handler's argument type comes from the schema.\n *\n * `schema` is omitted before the intersection rather than narrowed in place.\n * Intersecting leaves `StandardSchemaV1 & S`, and checking a validator against\n * that walks its self-referential methods: a Zod 3 object has `deepPartial()`\n * returning a different object type, which cannot satisfy the intersection, so\n * the call fails to match this overload. Omitting the key first leaves `S`\n * alone and costs nothing, since `S` is already constrained to a validator.\n */\nexport function registerTool<S extends StandardSchemaV1>(\n name: string,\n handler: ToolHandler<InferSchemaOutput<S>>,\n options: Omit<ToolOptions, 'schema'> & { schema: S },\n): ToolDefinition<InferSchemaOutput<S>>;\n/**\n * Without a schema the argument type is the handler's own. The conditional\n * keeps an inferred schema whose output disagrees with that type from falling\n * through to here instead of failing. `O` defaults to options without a\n * `schema` key because an explicit type argument turns inference off, and with\n * it the conditional: an inline schema next to an explicit type argument would\n * leave two unchecked sources of truth for `TArgs`, so it is an excess\n * property error. Drop the type argument and let the schema supply it. A\n * variable typed as plain `ToolOptions` still passes, with or without an\n * explicit type argument, since its schema output is `unknown`.\n */\nexport function registerTool<\n TArgs = unknown,\n O extends ToolOptions = Omit<ToolOptions, 'schema'>,\n>(\n name: string,\n handler: ToolHandler<TArgs>,\n options?: O &\n (O extends { schema: StandardSchemaV1 }\n ? { schema: StandardSchemaV1<unknown, TArgs> }\n : unknown),\n): ToolDefinition<TArgs>;\nexport function registerTool<TArgs = unknown>(\n name: string,\n handler: ToolHandler<TArgs>,\n options?: ToolOptions,\n): ToolDefinition<TArgs> {\n return {\n name,\n handler,\n description: options?.description,\n parameters: options?.parameters,\n schema: options?.schema,\n confirm: options?.confirm ?? false,\n };\n}\n","import type { AnyToolDefinition } from '../types';\n\nconst RESERVED_PREFIX = '__';\n\nexport function validateToolNames(tools: AnyToolDefinition[]): void {\n const seen = new Set<string>();\n for (const tool of tools) {\n if (tool.name.startsWith(RESERVED_PREFIX)) {\n throw new Error(\n `Tool name \"${tool.name}\" uses the reserved \"${RESERVED_PREFIX}\" prefix. ` +\n `Names beginning with \"${RESERVED_PREFIX}\" are reserved for internal tools.`,\n );\n }\n if (seen.has(tool.name)) {\n throw new Error(\n `Duplicate tool name \"${tool.name}\". All tools passed to a single provider must have unique names.`,\n );\n }\n seen.add(tool.name);\n }\n}\n","import type { JSONSchema } from '../types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validates tool arguments against a deliberate subset of JSON Schema:\n * `type`, `properties`, `required`, `items`, and `enum`. Every other keyword\n * is ignored rather than rejected, so a richer real-world schema still\n * validates on the parts this understands instead of failing outright.\n */\nexport function validateArgs(\n args: unknown,\n schema: JSONSchema,\n): ValidationResult {\n const errors: string[] = [];\n validateValue(args, schema, '', errors);\n return { valid: errors.length === 0, errors };\n}\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number') {\n return Number.isInteger(value) ? 'integer' : 'number';\n }\n return typeof value;\n}\n\nfunction matchesType(value: unknown, expected: string): boolean {\n const actual = describeType(value);\n // Every integer is a valid number, but not the reverse.\n if (expected === 'number') return actual === 'number' || actual === 'integer';\n return actual === expected;\n}\n\nfunction sameValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (\n a === null ||\n b === null ||\n typeof a !== 'object' ||\n typeof b !== 'object'\n ) {\n return false;\n }\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction label(path: string): string {\n return path === '' ? 'value' : path;\n}\n\nfunction validateValue(\n value: unknown,\n schema: JSONSchema,\n path: string,\n errors: string[],\n): void {\n if (!schema || typeof schema !== 'object') return;\n\n const expectedType = schema.type;\n if (typeof expectedType === 'string' && !matchesType(value, expectedType)) {\n errors.push(\n `${label(path)} should be ${expectedType}, got ${describeType(value)}`,\n );\n // Anything further would just restate the same mismatch.\n return;\n }\n\n if (\n Array.isArray(schema.enum) &&\n !schema.enum.some((option) => sameValue(option, value))\n ) {\n errors.push(\n `${label(path)} should be one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n );\n }\n\n if (isPlainObject(value)) {\n validateObject(value, schema, path, errors);\n }\n\n if (Array.isArray(value) && isPlainObject(schema.items)) {\n const itemSchema = schema.items as JSONSchema;\n value.forEach((item, index) => {\n validateValue(item, itemSchema, `${label(path)}[${index}]`, errors);\n });\n }\n}\n\nfunction validateObject(\n value: Record<string, unknown>,\n schema: JSONSchema,\n path: string,\n errors: string[],\n): void {\n if (Array.isArray(schema.required)) {\n for (const key of schema.required) {\n if (typeof key === 'string' && value[key] === undefined) {\n errors.push(`${path === '' ? '' : `${path}.`}${key} is required`);\n }\n }\n }\n\n if (isPlainObject(schema.properties)) {\n const properties = schema.properties as Record<string, JSONSchema>;\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (value[key] !== undefined && isPlainObject(propertySchema)) {\n validateValue(\n value[key],\n propertySchema,\n path === '' ? key : `${path}.${key}`,\n errors,\n );\n }\n }\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * Best-effort human-readable text for a thrown value. Handlers, adapters and\n * schema validators are consumer code, so what reaches a catch is not always an\n * Error: a thrown string or a rejected `{ code, message }` object still carries\n * the reason and must not be flattened into the fallback.\n */\nexport function describeError(\n error: unknown,\n fallback = 'Unknown error',\n): string {\n // A thrown value can be hostile: a getter that raises, a Proxy that traps,\n // a null-prototype object.\n try {\n return describeUnsafely(error, fallback);\n } catch {\n return fallback;\n }\n}\n\nfunction describeUnsafely(error: unknown, fallback: string): string {\n if (error instanceof Error) {\n return error.message || error.name || fallback;\n }\n\n if (typeof error === 'string') {\n return error || fallback;\n }\n\n if (error === null || error === undefined) {\n return fallback;\n }\n\n if (typeof error === 'object') {\n const message = (error as { message?: unknown }).message;\n if (typeof message === 'string' && message !== '') {\n return message;\n }\n\n try {\n const serialized = JSON.stringify(error);\n // '{}' means nothing survived serialization, which says no more\n // than the fallback does.\n if (typeof serialized === 'string' && serialized !== '{}') {\n return serialized;\n }\n } catch {\n return fallback;\n }\n return fallback;\n }\n\n return String(error);\n}\n","import type {\n AnyToolDefinition,\n StandardSchemaIssue,\n StandardSchemaResult,\n} from '../types';\nimport { validateArgs } from './validateArgs';\nimport { describeError } from '../utils/describeError';\n\nexport type ToolArgsValidation =\n | { valid: true; value: unknown }\n | { valid: false; errors: string[] };\n\n/**\n * Validates tool arguments, preferring a Standard Schema when the tool carries\n * one. The returned `value` is what the handler should receive: a schema may\n * apply defaults or transforms, so it is not always the input.\n */\nexport async function validateToolArgs(\n tool: AnyToolDefinition,\n args: unknown,\n): Promise<ToolArgsValidation> {\n if (tool.schema) {\n let result: StandardSchemaResult<unknown>;\n try {\n result = await tool.schema['~standard'].validate(args);\n } catch (error) {\n return { valid: false, errors: [describeError(error)] };\n }\n\n if (result.issues) {\n return { valid: false, errors: result.issues.map(formatIssue) };\n }\n return { valid: true, value: result.value };\n }\n\n if (tool.parameters) {\n const validation = validateArgs(args, tool.parameters);\n if (!validation.valid) {\n return { valid: false, errors: validation.errors };\n }\n }\n\n return { valid: true, value: args };\n}\n\nfunction formatIssue(issue: StandardSchemaIssue): string {\n const path = (issue.path ?? [])\n .map((segment) =>\n String(\n typeof segment === 'object' && segment !== null ? segment.key : segment,\n ),\n )\n .join('.');\n return path === '' ? issue.message : `${path}: ${issue.message}`;\n}\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n AgentContext,\n AgentError,\n AgentResponse,\n AIAgentProviderProps,\n ConversationEntry,\n ConversationMessage,\n SendOptions,\n} from '../types';\nimport { AdapterError } from '../adapters/AdapterError';\nimport { validateToolNames } from '../tools/validateToolNames';\nimport { executeAgentLoop } from './executeAgentLoop';\nimport { describeError } from '../utils/describeError';\nimport { linkSignals } from '../utils/linkSignals';\n\nexport const AgentContextValue = createContext<AgentContext | null>(null);\n\nconst noop = (): void => {};\n\nexport function AIAgentProvider({\n model,\n state,\n tools,\n permissions,\n options,\n children,\n}: AIAgentProviderProps) {\n const [isProcessing, setIsProcessing] = useState(false);\n const [history, setHistory] = useState<ConversationEntry[]>([]);\n const [lastResponse, setLastResponse] = useState<AgentResponse | null>(null);\n\n // Store latest props in refs so send() always sees current values\n const modelRef = useRef(model);\n const stateRef = useRef(state);\n const toolsRef = useRef(tools);\n const permissionsRef = useRef(permissions);\n const optionsRef = useRef(options);\n\n modelRef.current = model;\n stateRef.current = state;\n toolsRef.current = tools;\n permissionsRef.current = permissions;\n optionsRef.current = options;\n\n useEffect(() => {\n validateToolNames(tools);\n }, [tools]);\n\n // The LLM-facing transcript, kept separately from the user-facing history so\n // structured tool calls survive across interactions.\n const transcriptRef = useRef<ConversationMessage[]>([]);\n\n // Tail of the interaction queue. Overlapping send() calls would otherwise\n // start from the same transcript and interleave their history entries.\n const queueRef = useRef<Promise<unknown>>(Promise.resolve());\n\n // Calls that have been made but not settled. isProcessing is derived from it\n // so it does not flicker false between two queued interactions.\n const pendingRef = useRef(0);\n\n // Bumped by clearHistory. An interaction that started before the reset must\n // not write its transcript back over the cleared one.\n const generationRef = useRef(0);\n\n // Aborted when the provider unmounts. An interaction that outlives the tree\n // it belongs to keeps calling the model and can never have its onConfirm\n // answered, since the confirmation UI is gone.\n const unmountRef = useRef<AbortController | null>(null);\n\n // Lazy: a child can call send() from its own mount effect, which runs before\n // the provider's, so the controller cannot be created there.\n const unmountController = useCallback((): AbortController => {\n unmountRef.current ??= new AbortController();\n return unmountRef.current;\n }, []);\n\n useEffect(() => {\n // StrictMode simulates an unmount and remount on the same instance, so the\n // controller the previous cleanup aborted has to be replaced here. Only a\n // mount may do that: after a real unmount the aborted controller stays, and\n // it is what a late send() reads.\n if (unmountRef.current?.signal.aborted) unmountRef.current = null;\n\n const controller = unmountController();\n return () => controller.abort();\n }, []);\n\n const clearHistory = useCallback(() => {\n generationRef.current++;\n setHistory([]);\n setLastResponse(null);\n transcriptRef.current = [];\n }, []);\n\n const runInteraction = useCallback(\n async (\n message: string,\n sendOptions?: SendOptions,\n ): Promise<AgentResponse> => {\n const generation = generationRef.current;\n // Pinned for the whole interaction: a re-render with a new inline options\n // object must not redirect this interaction's error to a handler it did\n // not start with.\n const options = optionsRef.current;\n\n const abort = linkSignals(\n sendOptions?.signal,\n unmountController().signal,\n );\n\n // Appended here rather than in send() so the entry lands in queue order,\n // keeping history alternating user, assistant.\n const userEntry: ConversationEntry = {\n role: 'user',\n content: message,\n timestamp: Date.now(),\n };\n\n setHistory((prev) => [...prev, userEntry]);\n\n let response: AgentResponse;\n\n try {\n const loop = await executeAgentLoop(message, {\n model: modelRef.current,\n state: stateRef.current,\n tools: toolsRef.current,\n permissions: permissionsRef.current,\n options,\n conversationHistory: transcriptRef.current,\n signal: abort.signal,\n });\n\n response = loop.response;\n\n // A clear mid-interaction took the user entry with it, so writing the\n // rest back would rebuild half a conversation the user discarded.\n if (generation === generationRef.current) {\n // An abort can land between an assistant message and the tool results\n // answering it. Providers reject that shape, so the partial turn is\n // dropped rather than replayed.\n if (response.error?.code !== 'ABORTED') {\n transcriptRef.current = loop.messages;\n }\n\n const assistantEntry: ConversationEntry = {\n role: 'assistant',\n content: response.message,\n toolCalls: response.toolCalls,\n timestamp: Date.now(),\n };\n\n if (response.error) {\n assistantEntry.error = response.error;\n }\n\n setHistory((prev) => [...prev, assistantEntry]);\n setLastResponse(response);\n }\n } catch (error) {\n const agentError: AgentError =\n error instanceof AdapterError\n ? {\n message: error.message,\n code: 'ADAPTER_ERROR',\n status: error.status,\n cause: error,\n }\n : {\n message: describeError(error),\n cause: error,\n };\n\n response = {\n message: '',\n toolCalls: [],\n error: agentError,\n };\n\n // The interaction still started, so it still gets its assistant entry\n // and history keeps alternating user, assistant.\n if (generation === generationRef.current) {\n setHistory((prev) => [\n ...prev,\n {\n role: 'assistant',\n content: '',\n toolCalls: [],\n error: agentError,\n timestamp: Date.now(),\n },\n ]);\n setLastResponse(response);\n }\n } finally {\n // The caller's signal can outlive many interactions, so this one lets\n // go of it as soon as it settles.\n abort.release();\n }\n\n // The loop returns recovered failures rather than throwing, so they still\n // have to reach onError. A cancel is a caller decision, not a failure.\n // Reported past the catch so a callback that throws is not mistaken for a\n // failed interaction and reported a second time.\n if (response.error && response.error.code !== 'ABORTED') {\n options?.onError?.(response.error);\n }\n\n return response;\n },\n [unmountController],\n );\n\n const send = useCallback(\n (message: string, sendOptions?: SendOptions): Promise<AgentResponse> => {\n pendingRef.current++;\n setIsProcessing(pendingRef.current > 0);\n\n const interaction = queueRef.current.then(() =>\n runInteraction(message, sendOptions),\n );\n // The tail swallows failures so one broken interaction cannot stall every\n // call queued behind it. The caller still sees what `interaction` settles with.\n queueRef.current = interaction.then(noop, noop);\n\n return interaction.finally(() => {\n pendingRef.current--;\n setIsProcessing(pendingRef.current > 0);\n });\n },\n [runInteraction],\n );\n\n const contextValue = useMemo<AgentContext>(\n () => ({\n send,\n isProcessing,\n history,\n clearHistory,\n lastResponse,\n }),\n [send, isProcessing, history, clearHistory, lastResponse],\n );\n\n return (\n <AgentContextValue.Provider value={contextValue}>\n {children}\n </AgentContextValue.Provider>\n );\n}\n","/**\n * Thrown by the built-in adapters. Carries the HTTP status and raw body when\n * the failure came from a response, so callers can tell a 401 from a 429\n * without parsing the message.\n */\nexport class AdapterError extends Error {\n // Declared, not just assigned in the constructor, so the emitted typings\n // publish the literal type the spec promises instead of `string`.\n readonly name = 'AdapterError' as const;\n readonly status?: number;\n readonly body?: string;\n\n constructor(\n message: string,\n options?: { status?: number; body?: string; cause?: unknown },\n ) {\n super(message);\n this.status = options?.status;\n this.body = options?.body;\n if (options?.cause !== undefined) {\n // Assigned rather than passed to super: the ES2020 lib this package\n // compiles against does not type Error's options argument.\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n }\n}\n","import type { StateSource } from '../types';\n\nexport function resolveState(state: StateSource): Record<string, unknown> {\n const resolved = typeof state === 'function' ? state() : state;\n return resolved as Record<string, unknown>;\n}\n","import type { StateSource } from '../types';\nimport { resolveState } from './resolveState';\n\nexport function stripNonSerializable(\n obj: Record<string, unknown>,\n debug: boolean = false,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n try {\n JSON.stringify(value);\n result[key] = value;\n } catch {\n if (debug) {\n console.warn(\n `[react-observer-agent] Non-serializable value stripped from state key \"${key}\"`,\n );\n }\n }\n }\n\n return result;\n}\n\nfunction isSerializableValue(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'function' || typeof value === 'symbol') return false;\n if (typeof value === 'bigint') return false;\n return true;\n}\n\n/**\n * One oversized key would otherwise spend the whole context window on a read\n * the model cannot take back.\n */\nfunction applyByteLimit(\n snapshot: Record<string, unknown>,\n maxBytes: number,\n debug: boolean,\n): Record<string, unknown> {\n const limited: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(snapshot)) {\n // Undefined has no JSON representation, so there is nothing to measure.\n const json = JSON.stringify(value);\n if (json === undefined || json.length <= maxBytes) {\n limited[key] = value;\n continue;\n }\n\n if (debug) {\n console.warn(\n `[react-observer-agent] State key \"${key}\" is ${json.length} bytes, over the ${maxBytes} byte limit, and was truncated`,\n );\n }\n\n limited[key] = {\n __truncated: true,\n limit: maxBytes,\n bytes: json.length,\n preview: json.slice(0, maxBytes),\n };\n }\n\n return limited;\n}\n\nexport function createStateSnapshot(\n state: StateSource,\n canAccess: string[],\n debug: boolean = false,\n maxBytes?: number,\n): Record<string, unknown> {\n const resolved = resolveState(state);\n const filtered: Record<string, unknown> = {};\n\n for (const key of canAccess) {\n if (key in resolved) {\n const value = resolved[key];\n if (!isSerializableValue(value)) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Non-serializable value stripped from state key \"${key}\"`,\n );\n }\n continue;\n }\n filtered[key] = value;\n }\n }\n\n const snapshot = stripNonSerializable(filtered, debug);\n\n return maxBytes === undefined\n ? snapshot\n : applyByteLimit(snapshot, maxBytes, debug);\n}\n","import type { AnyToolDefinition } from '../types';\n\nexport function filterTools(\n tools: AnyToolDefinition[],\n canExecute: string[],\n): AnyToolDefinition[] {\n const allowed = new Set(canExecute);\n return tools.filter((tool) => allowed.has(tool.name));\n}\n","export function validateToolCall(name: string, canExecute: string[]): boolean {\n return canExecute.includes(name);\n}\n","export interface AbortRace {\n /**\n * Rejects with an `AbortError` when the signal fires, and never settles on\n * its own. Race it against consumer code so an abort ends the wait.\n */\n promise: Promise<never>;\n /**\n * Drops the listener. A caller signal can outlive many interactions, so\n * every race has to let go of it once the thing it guarded has settled.\n */\n release(): void;\n}\n\nconst never = (): Promise<never> => new Promise<never>(() => {});\n\n/**\n * Guards an await on consumer code that may never settle: a confirmation whose\n * UI unmounted, a handler that ignores `context.signal`. Racing gives the loop\n * back so the interaction ends and the queue drains. The consumer promise\n * itself keeps running, since JavaScript offers no way to cancel it.\n */\nexport function abortRace(signal?: AbortSignal): AbortRace {\n if (!signal) return { promise: never(), release: () => {} };\n\n let release = (): void => {};\n\n const promise = new Promise<never>((_resolve, reject) => {\n const rejectAborted = (): void => reject(abortReason(signal));\n\n if (signal.aborted) {\n rejectAborted();\n return;\n }\n\n signal.addEventListener('abort', rejectAborted, { once: true });\n release = (): void => signal.removeEventListener('abort', rejectAborted);\n });\n\n return { promise, release };\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n // A cancel is recognized by `name === 'AbortError'`, and a caller may abort\n // with any reason at all, so anything else is wrapped rather than passed on.\n const { reason } = signal;\n if (reason instanceof Error && reason.name === 'AbortError') return reason;\n\n const error = new Error('Interaction aborted');\n error.name = 'AbortError';\n return error;\n}\n","import type {\n AgentError,\n AgentEvent,\n AgentOptions,\n AgentResponse,\n AnyToolDefinition,\n ConversationMessage,\n JSONSchema,\n LLMToolDefinition,\n ModelAdapter,\n PermissionsConfig,\n StateSource,\n TokenUsage,\n ToolCallResult,\n} from '../types';\nimport { createStateSnapshot } from '../state/createStateSnapshot';\nimport { filterTools } from '../permissions/filterTools';\nimport { validateToolCall } from '../permissions/validateToolCall';\nimport { validateArgs } from '../tools/validateArgs';\nimport { validateToolArgs } from '../tools/validateToolArgs';\nimport { abortRace } from '../utils/abortRace';\nimport { describeError } from '../utils/describeError';\n\nconst DEFAULT_MAX_TURNS = 5;\nconst ABORTED_TOOL_RESULT = 'Tool execution cancelled: interaction aborted';\nconst READ_STATE_TOOL_NAME = '__readState';\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\nconst READ_STATE_SCHEMA: JSONSchema = {\n type: 'object',\n properties: {\n keys: {\n type: 'array',\n items: { type: 'string' },\n description: 'State keys to read',\n },\n },\n required: ['keys'],\n};\n\n/** What a handler invocation produced, reported once after the try/catch. */\ntype ToolCallOutcome =\n | { kind: 'success'; result: unknown; content: string }\n | { kind: 'error'; message: string }\n | { kind: 'cancelled' };\n\ninterface ExecutionContext {\n model: ModelAdapter;\n state: StateSource;\n tools: AnyToolDefinition[];\n permissions: PermissionsConfig;\n options?: AgentOptions;\n conversationHistory: ConversationMessage[];\n signal?: AbortSignal;\n}\n\n/**\n * The loop returns the LLM-facing message list alongside the response so the\n * provider can replay it verbatim on the next interaction. Structured tool\n * calls survive that way, which plain history text cannot express.\n */\nexport interface AgentLoopResult {\n response: AgentResponse;\n messages: ConversationMessage[];\n}\n\n/** Accumulates token usage across the turns of one interaction. */\nclass UsageTotal {\n private promptTokens = 0;\n private completionTokens = 0;\n private cacheReadTokens = 0;\n private cacheWriteTokens = 0;\n private reported = false;\n\n add(usage?: TokenUsage): void {\n if (!usage) return;\n this.reported = true;\n this.promptTokens += usage.promptTokens ?? 0;\n this.completionTokens += usage.completionTokens ?? 0;\n this.cacheReadTokens += usage.cacheReadTokens ?? 0;\n this.cacheWriteTokens += usage.cacheWriteTokens ?? 0;\n }\n\n /** Undefined when no adapter response carried usage, rather than a false zero. */\n total(): TokenUsage | undefined {\n if (!this.reported) return undefined;\n const total: TokenUsage = {\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n };\n // Only providers with a cache report these, so a zero would be a claim.\n if (this.cacheReadTokens > 0) total.cacheReadTokens = this.cacheReadTokens;\n if (this.cacheWriteTokens > 0)\n total.cacheWriteTokens = this.cacheWriteTokens;\n return total;\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction buildStateManifest(\n canAccess: string[],\n descriptions?: Record<string, string>,\n): { key: string; description: string }[] {\n return canAccess.map((key) => ({\n key,\n description: descriptions?.[key] ?? key,\n }));\n}\n\nfunction buildStateManifestPrompt(\n manifest: { key: string; description: string }[],\n): string {\n if (manifest.length === 0) return '';\n const lines = manifest.map((m) => `- ${m.key}: ${m.description}`);\n return [\n 'Available application state (use the __readState tool to access specific keys when needed):',\n ...lines,\n '',\n \"Only request state keys relevant to the user's question. Do not read all keys at once unless necessary.\",\n ].join('\\n');\n}\n\nfunction buildReadStateToolDef(): LLMToolDefinition {\n return {\n name: READ_STATE_TOOL_NAME,\n description:\n 'Read specific keys from the application state. Only request keys you need.',\n parameters: READ_STATE_SCHEMA,\n };\n}\n\nexport async function executeAgentLoop(\n message: string,\n ctx: ExecutionContext,\n): Promise<AgentLoopResult> {\n const { model, state, tools, permissions, options, signal } = ctx;\n const debug = options?.debug ?? false;\n const maxTurns = options?.maxTurns ?? DEFAULT_MAX_TURNS;\n\n // Key names and descriptions only. Values stay behind __readState.\n const stateManifest = buildStateManifest(\n permissions.canAccess,\n permissions.stateDescriptions,\n );\n\n if (debug) {\n console.log(\n '[react-observer-agent] State manifest:',\n stateManifest.map((m) => m.key),\n );\n }\n\n const allowedTools = filterTools(tools, permissions.canExecute);\n const llmTools: LLMToolDefinition[] = [];\n\n for (const tool of allowedTools) {\n // A tool without a description gives the LLM nothing to decide on, so it\n // stays hidden. It remains executable if the model names it anyway.\n if (!tool.description) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Tool \"${tool.name}\" has no description and is hidden from the LLM.`,\n );\n }\n continue;\n }\n\n llmTools.push({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters ?? EMPTY_OBJECT_SCHEMA,\n });\n }\n\n if (stateManifest.length > 0) {\n llmTools.push(buildReadStateToolDef());\n }\n\n if (debug) {\n console.log(\n '[react-observer-agent] Available tools:',\n llmTools.map((t) => t.name),\n );\n }\n\n const toolMap = new Map(allowedTools.map((t) => [t.name, t]));\n\n const messages: ConversationMessage[] = [\n ...ctx.conversationHistory,\n { role: 'user', content: message },\n ];\n\n const manifestPrompt = buildStateManifestPrompt(stateManifest);\n const systemPrompt =\n [options?.systemPrompt, manifestPrompt].filter(Boolean).join('\\n\\n') ||\n undefined;\n\n const allToolCalls: ToolCallResult[] = [];\n const usage = new UsageTotal();\n let turns = 0;\n let finalMessage = '';\n let finalProviderData: unknown;\n let stopError: AgentError | undefined;\n let completed = false;\n\n const emit = (event: AgentEvent): void => {\n options?.onEvent?.(event);\n };\n\n /**\n * The single place a user tool call is reported, so every call produces\n * exactly one entry, one callback, and one tool_end.\n */\n const record = (result: ToolCallResult): void => {\n allToolCalls.push(result);\n options?.onToolCall?.({\n toolName: result.toolName,\n args: result.args,\n result: result.result,\n status: result.status,\n });\n emit({\n type: 'tool_end',\n toolName: result.toolName,\n args: result.args,\n result: result.result,\n status: result.status,\n });\n };\n\n const abortedResult = (): AgentLoopResult => ({\n response: {\n message: '',\n toolCalls: allToolCalls,\n error: { message: 'Interaction aborted', code: 'ABORTED' },\n usage: usage.total(),\n },\n messages,\n });\n\n /**\n * Cancels the call in flight and ends the interaction, so an abort that lands\n * mid-call still leaves exactly one report per tool_start.\n */\n const cancelForAbort = (\n toolName: string,\n args: unknown,\n toolCallId: string,\n ): AgentLoopResult => {\n record({\n toolName,\n args,\n result: ABORTED_TOOL_RESULT,\n status: 'cancelled',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({\n status: 'cancelled',\n reason: 'Interaction aborted',\n }),\n toolCallId,\n });\n return abortedResult();\n };\n\n while (turns < maxTurns) {\n if (signal?.aborted) return abortedResult();\n\n turns++;\n\n if (debug) {\n console.log(`[react-observer-agent] Turn ${turns}/${maxTurns}`);\n }\n\n // `state` stays empty: the model pulls what it needs through __readState.\n const modelRequest = {\n // A snapshot, since the loop keeps appending to `messages` after this\n // call and an adapter that reads it asynchronously would see the churn.\n messages: [...messages],\n tools: llmTools,\n state: {} as Record<string, unknown>,\n systemPrompt,\n stateManifest,\n signal,\n };\n\n if (debug) {\n console.log('[react-observer-agent] LLM request:', {\n messageCount: modelRequest.messages.length,\n toolCount: modelRequest.tools.length,\n hasSystemPrompt: !!modelRequest.systemPrompt,\n });\n }\n\n emit({ type: 'turn_start', turn: turns, maxTurns });\n\n let modelResponse;\n const modelAbort = abortRace(signal);\n try {\n // Raced rather than awaited bare: a custom adapter that ignores the\n // signal would otherwise hold the interaction open past a cancel.\n modelResponse = await Promise.race([\n model.sendMessage(modelRequest),\n modelAbort.promise,\n ]);\n } catch (error) {\n // An adapter that forwarded the signal rejects rather than resolving.\n if (isAbortError(error) || signal?.aborted) {\n return abortedResult();\n }\n throw error;\n } finally {\n modelAbort.release();\n }\n\n usage.add(modelResponse.usage);\n\n if (signal?.aborted) return abortedResult();\n\n if (debug) {\n console.log('[react-observer-agent] LLM response:', {\n content: modelResponse.content?.slice(0, 200),\n toolCalls: modelResponse.toolCalls?.map((tc) => tc.name),\n });\n }\n\n // Nothing left to run, so this is the answer.\n if (!modelResponse.toolCalls || modelResponse.toolCalls.length === 0) {\n finalMessage = modelResponse.content ?? '';\n finalProviderData = modelResponse.providerData;\n\n // A cut-off or refused answer is still the answer, but the caller has\n // to be able to tell it apart from a complete one.\n if (modelResponse.stopReason === 'max_tokens') {\n stopError = {\n message: 'Model output was cut off by the max tokens limit',\n code: 'TRUNCATED',\n };\n } else if (modelResponse.stopReason === 'refusal') {\n stopError = {\n message: 'Model declined to answer',\n code: 'REFUSED',\n };\n }\n\n completed = true;\n break;\n }\n\n messages.push({\n role: 'assistant',\n content: modelResponse.content ?? '',\n toolCalls: modelResponse.toolCalls,\n providerData: modelResponse.providerData,\n });\n\n for (const llmCall of modelResponse.toolCalls) {\n // Stop before starting any further side effects.\n if (signal?.aborted) return abortedResult();\n\n if (llmCall.name === READ_STATE_TOOL_NAME) {\n // A model that sends `keys` as a string would otherwise crash the loop.\n const readValidation = validateArgs(\n llmCall.arguments,\n READ_STATE_SCHEMA,\n );\n if (!readValidation.valid) {\n const errorMessage = `Invalid arguments for ${READ_STATE_TOOL_NAME}: ${readValidation.errors.join('; ')}`;\n\n if (debug) {\n console.warn(`[react-observer-agent] ${errorMessage}`);\n }\n\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: errorMessage }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n }\n\n const args = llmCall.arguments as { keys?: unknown[] };\n const requestedKeys = (args?.keys ?? []).filter(\n (k): k is string => typeof k === 'string',\n );\n\n const allowedKeys = requestedKeys.filter((k) =>\n permissions.canAccess.includes(k),\n );\n const snapshot = createStateSnapshot(\n state,\n allowedKeys,\n debug,\n options?.maxStateBytes,\n );\n\n if (debug) {\n console.log(\n '[react-observer-agent] readState requested:',\n requestedKeys,\n );\n console.log('[react-observer-agent] readState allowed:', allowedKeys);\n console.log('[react-observer-agent] readState result:', snapshot);\n }\n\n emit({\n type: 'state_read',\n requested: requestedKeys,\n keys: allowedKeys,\n });\n\n messages.push({\n role: 'tool',\n content: JSON.stringify(snapshot),\n toolCallId: llmCall.id,\n });\n // Internal, so it never reaches allToolCalls or onToolCall.\n continue;\n }\n\n // Fired before the permission check so that a denied call is as visible\n // as an executed one, and every start has a matching end.\n emit({\n type: 'tool_start',\n toolName: llmCall.name,\n args: llmCall.arguments,\n });\n\n // Re-checked after the model answered, so a hallucinated or injected\n // name is rejected even though it was never advertised.\n if (!validateToolCall(llmCall.name, permissions.canExecute)) {\n const deniedResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: `Tool \"${llmCall.name}\" is not permitted`,\n status: 'denied',\n };\n record(deniedResult);\n\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: deniedResult.result }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n }\n\n const toolDef = toolMap.get(llmCall.name);\n if (!toolDef) {\n const deniedResult: ToolCallResult = {\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: `Tool \"${llmCall.name}\" not found`,\n status: 'denied',\n };\n record(deniedResult);\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: deniedResult.result }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n }\n\n // Validated before anything acts on the arguments, so the user is never\n // asked to confirm a malformed call.\n const validation = await validateToolArgs(toolDef, llmCall.arguments);\n if (!validation.valid) {\n const errorMessage = `Invalid arguments for tool \"${llmCall.name}\": ${validation.errors.join('; ')}`;\n\n if (debug) {\n console.warn(`[react-observer-agent] ${errorMessage}`);\n }\n\n record({\n toolName: llmCall.name,\n args: llmCall.arguments,\n result: errorMessage,\n status: 'error',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: errorMessage }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n }\n\n // A schema may apply defaults or transforms, so this is what the user\n // confirms, what the handler runs on, and what every later report shows.\n const value = validation.value;\n\n // Validation can await a schema, so the interaction may have been\n // cancelled while it ran.\n if (signal?.aborted) {\n return cancelForAbort(llmCall.name, value, llmCall.id);\n }\n\n if (toolDef.confirm) {\n if (!options?.onConfirm) {\n if (debug) {\n console.warn(\n `[react-observer-agent] Tool \"${llmCall.name}\" requires confirmation but no onConfirm handler provided. Skipping.`,\n );\n }\n record({\n toolName: llmCall.name,\n args: value,\n result:\n 'Tool execution cancelled: no confirmation handler provided',\n status: 'cancelled',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({\n status: 'cancelled',\n reason: 'No confirmation handler',\n }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n\n let confirmed: boolean;\n const confirmAbort = abortRace(signal);\n try {\n // A confirmation UI that unmounts with its provider never answers,\n // so the abort has to be able to end this wait on its own.\n confirmed = await Promise.race([\n options.onConfirm({\n toolName: llmCall.name,\n args: value,\n description: toolDef.description,\n signal,\n }),\n confirmAbort.promise,\n ]);\n } catch (error) {\n // A rejection is the confirmation surface giving up, which is a\n // cancel rather than a tool failure.\n if (isAbortError(error) || signal?.aborted) {\n return cancelForAbort(llmCall.name, value, llmCall.id);\n }\n\n const errorMessage = describeError(error);\n record({\n toolName: llmCall.name,\n args: value,\n result: errorMessage,\n status: 'error',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: errorMessage }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n } finally {\n confirmAbort.release();\n }\n\n // Confirmation can take arbitrarily long, so an answer may arrive\n // after the interaction was cancelled. It is stale either way.\n if (signal?.aborted) {\n return cancelForAbort(llmCall.name, value, llmCall.id);\n }\n\n if (!confirmed) {\n record({\n toolName: llmCall.name,\n args: value,\n result: 'Tool execution cancelled by user',\n status: 'cancelled',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({\n status: 'cancelled',\n reason: 'User denied',\n }),\n toolCallId: llmCall.id,\n });\n continue;\n }\n }\n\n // Only the handler and the serialization run inside the try. Reporting\n // happens after it, so a throwing callback cannot trigger a second\n // report through the catch.\n let outcome: ToolCallOutcome;\n const handlerAbort = abortRace(signal);\n try {\n // A handler that never forwards the signal can still run forever, so\n // the abort ends the wait even though the work itself carries on.\n const result = await Promise.race([\n toolDef.handler(value, { signal }),\n handlerAbort.promise,\n ]);\n\n let content: string;\n try {\n content = JSON.stringify({ result });\n } catch (error) {\n throw new Error(\n `Tool result is not serializable: ${describeError(error)}`,\n );\n }\n\n outcome = { kind: 'success', result, content };\n } catch (error) {\n // A handler that forwarded the signal rejects on cancel, which is the\n // interaction ending rather than the tool failing.\n outcome =\n isAbortError(error) && signal?.aborted\n ? { kind: 'cancelled' }\n : { kind: 'error', message: describeError(error) };\n } finally {\n handlerAbort.release();\n }\n\n if (outcome.kind === 'cancelled') {\n return cancelForAbort(llmCall.name, value, llmCall.id);\n }\n\n if (outcome.kind === 'error') {\n record({\n toolName: llmCall.name,\n args: value,\n result: outcome.message,\n status: 'error',\n });\n messages.push({\n role: 'tool',\n content: JSON.stringify({ error: outcome.message }),\n toolCallId: llmCall.id,\n isError: true,\n });\n continue;\n }\n\n const status = toolDef.confirm ? 'confirmed' : 'success';\n\n if (debug) {\n console.log(`[react-observer-agent] Tool \"${llmCall.name}\" executed:`, {\n status,\n result: outcome.result,\n });\n }\n\n record({\n toolName: llmCall.name,\n args: value,\n result: outcome.result,\n status,\n });\n messages.push({\n role: 'tool',\n content: outcome.content,\n toolCallId: llmCall.id,\n });\n }\n\n // The next turn carries the tool results back to the model.\n }\n\n // The model was still calling tools when the turn budget ran out, so it never\n // got to answer. Surface that as an error rather than an empty message.\n if (!completed) {\n if (debug) {\n console.warn(`[react-observer-agent] Max turns (${maxTurns}) reached`);\n }\n return {\n response: {\n message: '',\n toolCalls: allToolCalls,\n error: {\n message: `Agent did not produce a final response within ${maxTurns} turns`,\n code: 'MAX_TURNS',\n },\n usage: usage.total(),\n },\n messages,\n };\n }\n\n // An empty assistant message is not a turn, and some providers reject it on\n // replay.\n if (finalMessage !== '') {\n messages.push({\n role: 'assistant',\n content: finalMessage,\n providerData: finalProviderData,\n });\n }\n\n return {\n response: {\n message: finalMessage,\n toolCalls: allToolCalls,\n error: stopError,\n usage: usage.total(),\n },\n messages,\n };\n}\n","export interface LinkedSignal {\n /** Aborted as soon as any of the linked sources is. */\n signal: AbortSignal;\n /**\n * Drops the listeners. A caller signal can outlive many interactions, so\n * every linked signal has to let go of it once its interaction settles.\n */\n release(): void;\n}\n\n/**\n * Combines abort signals into one. Undefined sources are ignored, so a caller\n * that passed no signal still gets a working linked signal.\n */\nexport function linkSignals(\n ...sources: (AbortSignal | undefined)[]\n): LinkedSignal {\n const controller = new AbortController();\n const listeners: { source: AbortSignal; listener: () => void }[] = [];\n\n const release = (): void => {\n for (const { source, listener } of listeners) {\n source.removeEventListener('abort', listener);\n }\n listeners.length = 0;\n };\n\n for (const source of sources) {\n if (!source) continue;\n\n if (source.aborted) {\n abortWith(controller, source);\n release();\n break;\n }\n\n const listener = (): void => abortWith(controller, source);\n source.addEventListener('abort', listener, { once: true });\n listeners.push({ source, listener });\n }\n\n return { signal: controller.signal, release };\n}\n\nfunction abortWith(controller: AbortController, source: AbortSignal): void {\n // abort(undefined) would replace the default AbortError reason with nothing,\n // and the abort reason is what an adapter rejects a forwarded fetch with.\n if (source.reason === undefined) {\n controller.abort();\n return;\n }\n controller.abort(source.reason);\n}\n","import { useContext } from 'react';\nimport type { AgentContext } from '../types';\nimport { AgentContextValue } from './AIAgentProvider';\n\nexport function useAgent(): AgentContext {\n const context = useContext(AgentContextValue);\n if (!context) {\n throw new Error(\n 'useAgent() must be used within an <AIAgentProvider>. ' +\n 'Wrap your component tree with <AIAgentProvider> to use this hook.',\n );\n }\n return context;\n}\n","export function filterState(\n state: Record<string, unknown>,\n canAccess: string[],\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const key of canAccess) {\n if (key in state) {\n filtered[key] = state[key];\n }\n }\n return filtered;\n}\n","import type {\n ConversationMessage,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n OpenAIAdapterConfig,\n StopReason,\n TokenUsage,\n} from '../types';\nimport { AdapterError } from './AdapterError';\nimport { describeError } from '../utils/describeError';\n\nconst DEFAULT_MODEL = 'gpt-4o';\nconst DEFAULT_TEMPERATURE = 0.2;\nconst OPENAI_BASE_URL = 'https://api.openai.com/v1';\n\ninterface OpenAIUsage {\n prompt_tokens: number;\n completion_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n}\n\nexport function openAIAdapter(config: OpenAIAdapterConfig): ModelAdapter {\n if (!config.apiKey && !config.baseURL) {\n throw new Error(\n 'openAIAdapter requires either \"apiKey\" or \"baseURL\". ' +\n 'Provide an API key for direct access, or a baseURL to route through your backend proxy.',\n );\n }\n\n const baseURL = config.baseURL\n ? config.baseURL.replace(/\\/+$/, '')\n : OPENAI_BASE_URL;\n const model = config.model ?? DEFAULT_MODEL;\n // Null means \"leave the field out\": reasoning models reject any temperature\n // other than their own default. Undefined keeps the 0.2 default.\n const temperature =\n config.temperature === null\n ? undefined\n : (config.temperature ?? DEFAULT_TEMPERATURE);\n\n return {\n async sendMessage(request: ModelRequest): Promise<ModelResponse> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...config.headers,\n };\n\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n const conversation = request.messages\n .filter(isSendable)\n .map(formatMessage);\n\n const messages = request.systemPrompt\n ? [\n { role: 'system' as const, content: request.systemPrompt },\n ...conversation,\n ]\n : conversation;\n\n const tools =\n request.tools.length > 0\n ? request.tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }))\n : undefined;\n\n const body: Record<string, unknown> = {\n model,\n messages,\n };\n\n if (temperature !== undefined) {\n body.temperature = temperature;\n }\n\n if (tools) {\n body.tools = tools;\n }\n\n const url = baseURL.includes('/chat/completions')\n ? baseURL\n : `${baseURL}/chat/completions`;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n });\n } catch (error) {\n // An abort is a caller decision, not a transport failure. Rewrapping it\n // would hide the AbortError name the agent loop checks for.\n if (error instanceof Error && error.name === 'AbortError') throw error;\n throw new AdapterError(\n `Network error calling OpenAI API: ${describeError(error)}`,\n { cause: error },\n );\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new AdapterError(\n `OpenAI API error (${res.status}): ${text || res.statusText}`,\n { status: res.status, body: text },\n );\n }\n\n let data: unknown;\n try {\n data = await res.json();\n } catch (error) {\n throw new AdapterError('Failed to parse OpenAI API response as JSON', {\n cause: error,\n });\n }\n\n return parseResponse(data);\n },\n };\n}\n\n/**\n * The API rejects an assistant message carrying neither content nor tool calls,\n * and the loop can produce one when a turn ends on an empty completion.\n */\nfunction isSendable(msg: ConversationMessage): boolean {\n if (msg.role !== 'assistant') return true;\n return msg.content !== '' || (msg.toolCalls?.length ?? 0) > 0;\n}\n\nfunction formatMessage(msg: ConversationMessage) {\n const formatted: Record<string, unknown> = {\n role: msg.role,\n content: msg.content,\n };\n\n if (msg.toolCallId) {\n formatted.tool_call_id = msg.toolCallId;\n }\n\n // OpenAI rejects tool messages that do not follow an assistant message\n // carrying the matching tool_calls entry.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n formatted.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments ?? {}),\n },\n }));\n if (msg.content === '') {\n formatted.content = null;\n }\n }\n\n return formatted;\n}\n\nfunction parseResponse(data: unknown): ModelResponse {\n const obj = data as Record<string, unknown>;\n const choices = obj.choices as Array<Record<string, unknown>> | undefined;\n\n if (!choices || choices.length === 0) {\n throw new AdapterError('Malformed OpenAI response: no choices returned');\n }\n\n const message = choices[0].message as Record<string, unknown> | undefined;\n if (!message) {\n throw new AdapterError(\n 'Malformed OpenAI response: no message in first choice',\n );\n }\n\n const content = (message.content as string) ?? null;\n const toolCalls = message.tool_calls as\n | Array<{\n id: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n const usage = obj.usage as OpenAIUsage | undefined;\n\n return {\n content,\n toolCalls: toolCalls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: safeParseJSON(tc.function.arguments),\n })),\n usage: usage ? mapUsage(usage) : undefined,\n stopReason: mapStopReason(choices[0].finish_reason),\n };\n}\n\nfunction mapUsage(usage: OpenAIUsage): TokenUsage {\n const cached = usage.prompt_tokens_details?.cached_tokens;\n\n const mapped: TokenUsage = {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n };\n\n if (typeof cached === 'number') {\n mapped.cacheReadTokens = cached;\n }\n\n return mapped;\n}\n\nfunction mapStopReason(finishReason: unknown): StopReason {\n switch (finishReason) {\n case 'stop':\n return 'end';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'length':\n return 'max_tokens';\n case 'content_filter':\n return 'refusal';\n default:\n return 'other';\n }\n}\n\nfunction safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n}\n","import type {\n ClaudeAdapterConfig,\n ConversationMessage,\n LLMToolCall,\n ModelAdapter,\n ModelRequest,\n ModelResponse,\n StopReason,\n TokenUsage,\n} from '../types';\nimport { AdapterError } from './AdapterError';\nimport { describeError } from '../utils/describeError';\n\nconst DEFAULT_MODEL = 'claude-opus-5';\nconst DEFAULT_MAX_TOKENS = 16000;\nconst ANTHROPIC_BASE_URL = 'https://api.anthropic.com';\nconst ANTHROPIC_VERSION = '2023-06-01';\n\ninterface TextBlock {\n type: 'text';\n text: string;\n}\n\ninterface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\ntype ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock;\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | ContentBlock[];\n}\n\ninterface SystemBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\ninterface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nexport function claudeAdapter(config: ClaudeAdapterConfig): ModelAdapter {\n if (!config.apiKey && !config.baseURL) {\n throw new Error(\n 'claudeAdapter requires either \"apiKey\" or \"baseURL\". ' +\n 'Provide an API key for direct access, or a baseURL to route through your backend proxy.',\n );\n }\n\n const baseURL = config.baseURL\n ? config.baseURL.replace(/\\/+$/, '')\n : ANTHROPIC_BASE_URL;\n const model = config.model ?? DEFAULT_MODEL;\n const maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n const cache = config.cache !== false;\n\n return {\n async sendMessage(request: ModelRequest): Promise<ModelResponse> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': ANTHROPIC_VERSION,\n };\n\n if (config.apiKey) {\n headers['x-api-key'] = config.apiKey;\n }\n\n // Spread last so consumers can override anything above, including adding\n // the CORS opt-in header needed for direct browser access.\n Object.assign(headers, config.headers);\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: toAnthropicMessages(request.messages),\n };\n\n if (request.systemPrompt) {\n // Tools and the system prompt both render before the messages, so a\n // single breakpoint on the system block caches them together.\n body.system = cache\n ? ([\n {\n type: 'text',\n text: request.systemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n ] as SystemBlock[])\n : request.systemPrompt;\n }\n\n if (request.tools.length > 0) {\n body.tools = request.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters,\n }));\n }\n\n const url = baseURL.includes('/v1/messages')\n ? baseURL\n : `${baseURL}/v1/messages`;\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n throw new AdapterError(\n `Network error calling Anthropic API: ${describeError(error)}`,\n { cause: error },\n );\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new AdapterError(\n `Anthropic API error (${res.status}): ${text || res.statusText}`,\n { status: res.status, body: text },\n );\n }\n\n let data: unknown;\n try {\n data = await res.json();\n } catch (error) {\n throw new AdapterError(\n 'Failed to parse Anthropic API response as JSON',\n { cause: error },\n );\n }\n\n return parseResponse(data);\n },\n };\n}\n\n/**\n * Anthropic expects tool calls as `tool_use` blocks on an assistant message and\n * their results as `tool_result` blocks on a following user message, so a run of\n * internal tool messages collapses into one user message.\n */\nfunction toAnthropicMessages(\n messages: ConversationMessage[],\n): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n let pendingToolResults: ToolResultBlock[] = [];\n\n const flushToolResults = () => {\n if (pendingToolResults.length > 0) {\n result.push({ role: 'user', content: pendingToolResults });\n pendingToolResults = [];\n }\n };\n\n for (const message of messages) {\n if (message.role === 'tool') {\n const block: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: message.toolCallId ?? '',\n content: message.content,\n };\n if (message.isError) {\n block.is_error = true;\n }\n pendingToolResults.push(block);\n continue;\n }\n\n if (message.role === 'assistant') {\n const content = toAssistantContent(message);\n // Null means there is nothing the API would accept: dropping the message\n // is the only option, since an empty text block is rejected.\n if (content === null) continue;\n flushToolResults();\n result.push({ role: 'assistant', content });\n continue;\n }\n\n flushToolResults();\n result.push({ role: message.role, content: message.content });\n }\n\n flushToolResults();\n\n return result;\n}\n\nfunction toAssistantContent(\n message: ConversationMessage,\n): string | ContentBlock[] | null {\n const replay = message.providerData;\n if (Array.isArray(replay) && replay.length > 0) {\n // Anthropic requires thinking blocks to come back with their signatures\n // untouched, so the raw blocks go out exactly as they arrived.\n return replay as ContentBlock[];\n }\n\n const toolCalls = message.toolCalls ?? [];\n if (toolCalls.length > 0) {\n const blocks: ContentBlock[] = [];\n if (message.content) {\n blocks.push({ type: 'text', text: message.content });\n }\n for (const call of toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: call.id,\n name: call.name,\n input: isPlainObject(call.arguments) ? call.arguments : {},\n });\n }\n return blocks;\n }\n\n return message.content ? message.content : null;\n}\n\nfunction parseResponse(data: unknown): ModelResponse {\n const obj = data as Record<string, unknown>;\n const blocks = obj.content;\n\n if (!Array.isArray(blocks)) {\n throw new AdapterError(\n 'Malformed Anthropic response: no content blocks returned',\n );\n }\n\n const textParts: string[] = [];\n const toolCalls: LLMToolCall[] = [];\n\n for (const block of blocks as ContentBlock[]) {\n if (block?.type === 'text') {\n textParts.push(block.text);\n } else if (block?.type === 'tool_use') {\n // Already parsed by the API, unlike OpenAI's JSON-string arguments.\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: block.input,\n });\n }\n // Other block types (thinking, for example) carry nothing this loop needs.\n }\n\n const usage = obj.usage as AnthropicUsage | undefined;\n\n return {\n content: textParts.length > 0 ? textParts.join('') : null,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage: usage ? toTokenUsage(usage) : undefined,\n stopReason: toStopReason(obj.stop_reason),\n providerData: blocks,\n };\n}\n\nfunction toTokenUsage(usage: AnthropicUsage): TokenUsage {\n const cacheRead = usage.cache_read_input_tokens;\n const cacheWrite = usage.cache_creation_input_tokens;\n\n const result: TokenUsage = {\n // Anthropic reports the cached tokens outside input_tokens, so the total\n // input for the call is the three fields added together.\n promptTokens: usage.input_tokens + (cacheRead ?? 0) + (cacheWrite ?? 0),\n completionTokens: usage.output_tokens,\n };\n if (typeof cacheRead === 'number') {\n result.cacheReadTokens = cacheRead;\n }\n if (typeof cacheWrite === 'number') {\n result.cacheWriteTokens = cacheWrite;\n }\n return result;\n}\n\nfunction toStopReason(value: unknown): StopReason {\n switch (value) {\n case 'end_turn':\n return 'end';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n case 'refusal':\n return 'refusal';\n default:\n // stop_sequence, pause_turn and anything the API adds later.\n return 'other';\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["options","import_react","DEFAULT_MODEL","parseResponse","isPlainObject"]}