@threaded/ai 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent = \n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage?: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n const toolCallsBuffer: Record<string, any> = {};\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n const { index } = toolCall;\n if (!toolCallsBuffer[index]) {\n toolCallsBuffer[index] = {\n id: toolCall.id || \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n };\n }\n\n if (toolCall.id) {\n toolCallsBuffer[index].id = toolCall.id;\n }\n if (toolCall.function?.name) {\n toolCallsBuffer[index].function.name +=\n toolCall.function.name;\n }\n if (toolCall.function?.arguments) {\n toolCallsBuffer[index].function.arguments +=\n toolCall.function.arguments;\n }\n }\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n // Convert tool calls buffer to array\n toolCalls = Object.values(toolCallsBuffer);\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport { ConversationContext, StepFunction, ToolCall } from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: { model?: string; schema?: any } = {}): StepFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : ctxOrMessage;\n\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: 'tool_calls_ready', calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error: 'Tool execution denied by user' });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: 'tool_executing', call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: 'tool_complete', call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n \n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst defaultStore = createMemoryStore();\nconst threads = new Map<string, Thread>();\n\nexport const getOrCreateThread = (\n id: string,\n store: ThreadStore = defaultStore,\n): Thread => {\n if (threads.has(id)) {\n return threads.get(id)!;\n }\n\n const thread = createThread(id, store);\n threads.set(id, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage?: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n \n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || { \n history: [], \n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":";;;;;;;;AAEO,IAAM,mBAAmB,CAAC,WAA0C;AACzE,SAAO,UAAU,OAAO,WAAW,YAAY,eAAe;AAChE;AAEO,IAAM,oCAAoC,CAC/C,gBACA,OAAe,aACA;AAEf,MAAI;AACF,UAAM,YAAY,UAAQ,KAAK;AAC/B,QAAI,aAAa,OAAO,UAAU,iBAAiB,YAAY;AAC7D,YAAM,aAAa,UAAU,aAAa,cAAc;AACxD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAAA,EAEhB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAEO,IAAM,+BAA+B,CAC1C,cACmC;AACnC,MAAI,CAAC,WAAW,WAAY,QAAO,CAAC;AAEpC,QAAM,SAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC/D,UAAM,OAAO;AACb,WAAO,GAAG,IAAI;AAAA,MACZ,MAAM,KAAK,QAAQ;AAAA,MACnB,aAAa,KAAK,eAAe;AAAA,MACjC,UAAU,CAAC,UAAU,UAAU,SAAS,GAAG;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBACd,QACA,MACY;AACZ,MAAI,iBAAiB,MAAM,GAAG;AAC5B,WAAO,kCAAkC,QAAQ,IAAI;AAAA,EACvD;AACA,SAAO;AACT;;;ACnDO,IAAM,iBAAiB,OAAO,WAA0C;AAC7E,QAAM,aAAa,OAAO,iBAAiB;AAC3C,QAAM,aAAa,YAAY;AAE/B,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,iDAAiD;AAC/D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,MAAM,OAAO,UAAU;AAE7C,SAAO,cAAc,MAAM,IAAI,CAAC,YAAY;AAC1C,UAAM,eAAe,GAAG,UAAU,IAAI,QAAQ,IAAI;AAElD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,IAAI,UAAU,KAAK,QAAQ,eAAe,EAAE;AAAA,MACzD,QAAQ,6BAA6B,QAAQ,WAAW;AAAA,MACxD,SAAS,OAAO,SAAc;AAC5B,cAAM,SAAS,MAAM,OAAO,SAAS;AAAA,UACnC,MAAM,QAAQ;AAAA,UACd,WAAW;AAAA,QACb,CAAC;AACD,eACG,OAAO,WACN,MAAM,QAAQ,OAAO,OAAO,KAC5B,OAAO,QAAQ,CAAC,GAAG,QACrB,KAAK,UAAU,MAAM;AAAA,MAEzB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC4CO,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,kBAAA,aAAU,KAAV;AACA,EAAAA,kBAAA,kBAAe,KAAf;AACA,EAAAA,kBAAA,WAAQ,KAAR;AACA,EAAAA,kBAAA,SAAM,KAAN;AAJU,SAAAA;AAAA,GAAA;;;ACxEL,IAAM,6BAA6B,CACxC,SACmB;AACnB,QAAM,aAAkC,CAAC;AACzC,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACrD,eAAW,GAAG,IAAI,sBAAsB,IAAI;AAC5C,QAAI,CAAC,KAAK,UAAU;AAClB,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,GAAI,SAAS,SAAS,KAAK,EAAE,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB,CAAC,SAA8B;AAC3D,QAAM,SAAc;AAAA,IAClB,MAAM,KAAK;AAAA,EACb;AAEA,MAAI,KAAK,aAAa;AACpB,WAAO,cAAc,KAAK;AAAA,EAC5B;AAEA,MAAI,KAAK,MAAM;AACb,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,KAAK,OAAO;AACd,WAAO,QAAQ,sBAAsB,KAAK,KAAK;AAAA,EACjD;AAEA,MAAI,KAAK,YAAY;AACnB,WAAO,aAAa,CAAC;AACrB,eAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC9D,aAAO,WAAW,GAAG,IAAI,sBAAsB,SAAS;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAACC,WAA+B;AAC5D,QAAM,QAAQA,OAAM,MAAM,GAAG;AAE7B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,UAAU,eAAe,OAAO,MAAM,CAAC,EAAE;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,UAAU,MAAM,CAAC;AAAA,IACjB,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAChC;AACF;AAEA,IAAI,aAAsB,CAAC;AAMpB,IAAM,SAAS,CAAC,aAA6B;AAClD,QAAM,MAAM,WAAW,SAAS,YAAY,CAAC;AAC7C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,EACnE;AACA,SAAO;AACT;;;ACpFO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,OAAO,IAAI;AACxC,QAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,WAAW,CAAC;AAClB,MAAI,cAAc;AAChB,aAAS,KAAK,EAAE,MAAM,UAAU,SAAS,aAAa,CAAC;AAAA,EACzD;AACA,WAAS,KAAK,GAAG,IAAI,OAAO;AAE5B,QAAM,OAAY;AAAA,IAChB,OAAAA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC,CAAC,IAAI;AAAA,EAChB;AAEA,MAAI,QAAQ;AACV,SAAK,kBAAkB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,QAAQ,EAAE,GAAG,OAAO,QAAQ,sBAAsB,MAAM;AAAA,QACxD,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ,IAAI;AACjB,SAAK,cAAc;AAAA,EACrB;AAEA,QAAM,WAAW,MAAM,MAAM,8CAA8C;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAC9C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,mBAAmB,UAAU,GAAG;AAAA,EACzC;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,QAAQ,WAAW;AAAA,EAC9B;AAEA,MAAI,QAAQ,YAAY;AACtB,QAAI,aAAa,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,MAAI,YAAmB,CAAC;AACxB,QAAM,kBAAuC,CAAC;AAE9C,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,YAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,YAAM,QAAQ,MAAM,MAAM,IAAI;AAE9B,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC;AACzB,cAAI,SAAS,SAAU;AAEvB,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,QAAQ,OAAO,UAAU,CAAC,GAAG;AAEnC,gBAAI,OAAO,SAAS;AAClB,6BAAe,MAAM;AACrB,kBAAI,IAAI,QAAQ;AACd,oBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;AAAA,cACxD;AAAA,YACF;AAEA,gBAAI,OAAO,YAAY;AACrB,yBAAW,YAAY,MAAM,YAAY;AACvC,sBAAM,EAAE,MAAM,IAAI;AAClB,oBAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,kCAAgB,KAAK,IAAI;AAAA,oBACvB,IAAI,SAAS,MAAM;AAAA,oBACnB,MAAM;AAAA,oBACN,UAAU,EAAE,MAAM,IAAI,WAAW,GAAG;AAAA,kBACtC;AAAA,gBACF;AAEA,oBAAI,SAAS,IAAI;AACf,kCAAgB,KAAK,EAAE,KAAK,SAAS;AAAA,gBACvC;AACA,oBAAI,SAAS,UAAU,MAAM;AAC3B,kCAAgB,KAAK,EAAE,SAAS,QAC9B,SAAS,SAAS;AAAA,gBACtB;AACA,oBAAI,SAAS,UAAU,WAAW;AAChC,kCAAgB,KAAK,EAAE,SAAS,aAC9B,SAAS,SAAS;AAAA,gBACtB;AAAA,cACF;AAAA,YACF;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,cAAY,OAAO,OAAO,eAAe;AAEzC,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI,aAAa;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;AClKO,IAAM,gBAAgB,OAC3B,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,OAAO,IAAI;AACxC,QAAM,SAAS,OAAO,WAAW,KAAK,QAAQ,IAAI;AAElD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,QAAM,WAAW,CAAC,GAAG,IAAI,OAAO;AAChC,MAAI,SAAS;AAGb,MAAI,SAAS,CAAC,GAAG,SAAS,UAAU;AAClC,aAAS,SAAS,CAAC,EAAE;AACrB,aAAS,MAAM;AAAA,EACjB;AAEA,MAAI,QAAQ;AACV,UAAM,eAAe;AAAA;AAAA;AAAA,EAAmE,KAAK;AAAA,MAC3F,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;AACD,aAAS,SAAS,SAAS,eAAe,aAAa,MAAM,CAAC;AAAA,EAChE;AAEA,QAAM,OAAY;AAAA,IAChB,OAAAA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ,CAAC,CAAC,IAAI;AAAA,EAChB;AAEA,MAAI,QAAQ;AACV,SAAK,SAAS;AAAA,EAChB;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,MACpC,MAAM,KAAK,SAAS;AAAA,MACpB,aAAa,KAAK,SAAS;AAAA,MAC3B,cAAc,KAAK,SAAS;AAAA,IAC9B,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,MAAM,MAAM,yCAAyC;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,qBAAqB;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,EACjD;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,sBAAsB,UAAU,GAAG;AAAA,EAC5C;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,UAAU,KAAK,QAAQ,CAAC;AAE9B,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,QAAQ,SAAS,SAAS,QAAQ,OAAO;AAAA,EACpD;AAEA,MAAI,QAAQ,SAAS,YAAY;AAC/B,QAAI,aAAa;AAAA,MACf;AAAA,QACE,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,QAAQ;AAAA,UACd,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,wBAAwB,OAC5B,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAE1B,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,YAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,YAAM,QAAQ,MAAM,MAAM,IAAI;AAE9B,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC;AAEzB,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAE9B,gBAAI,OAAO,SAAS,yBAAyB,OAAO,OAAO,MAAM;AAC/D,6BAAe,OAAO,MAAM;AAC5B,kBAAI,IAAI,QAAQ;AACd,oBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,cAC5D;AAAA,YACF;AAEA,gBACE,OAAO,SAAS,yBAChB,OAAO,eAAe,SAAS,YAC/B;AACA,oBAAM,UAAU,OAAO;AACvB,wBAAU,KAAK;AAAA,gBACb,IAAI,QAAQ;AAAA,gBACZ,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,QAAQ;AAAA,kBACd,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,gBACzC;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI,aAAa;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;ACpKO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,aAAa,IAAI;AAChC,QAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,WAAW,CAAC;AAElB,MAAI,cAAc;AAChB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;AAAA,IAChC,CAAC;AACD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,gBAAgB,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,aAAWC,QAAO,IAAI,SAAS;AAC7B,UAAM,OAAOA,KAAI,SAAS,cAAc,UAAU;AAClD,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,OAAO,CAAC,EAAE,MAAMA,KAAI,QAAQ,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,OAAY;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ;AAAA,MACX;AAAA,QACE,uBAAuB,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,UAC9C,MAAM,KAAK,SAAS;AAAA,UACpB,aAAa,KAAK,SAAS;AAAA,UAC3B,YAAY,KAAK,SAAS;AAAA,QAC5B,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,SAAS,0BAA0B;AACxD,QAAM,WAAW,MAAM;AAAA,IACrB,2DAA2DD,MAAK,IAAI,QAAQ,QAAQ,MAAM;AAAA,IAC1F;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAC9C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,mBAAmB,UAAU,GAAG;AAAA,EACzC;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,YAAY,KAAK,WAAW,CAAC;AACnC,QAAM,OAAO,UAAU,QAAQ,MAAM,CAAC;AAEtC,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,KAAK,QAAQ;AAAA,EACxB;AAEA,MAAI,KAAK,cAAc;AACrB,QAAI,aAAa;AAAA,MACf;AAAA,QACE,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,QAC7C,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK,aAAa;AAAA,UACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAE1B,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,YAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,YAAM,QAAQ,MAAM,MAAM,IAAI;AAE9B,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC;AAEzB,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,YAAY,OAAO,aAAa,CAAC;AACvC,kBAAM,OAAO,WAAW,SAAS,QAAQ,CAAC;AAE1C,gBAAI,MAAM,MAAM;AACd,6BAAe,KAAK;AACpB,kBAAI,IAAI,QAAQ;AACd,oBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,KAAK,KAAK,CAAC;AAAA,cACpD;AAAA,YACF;AAEA,gBAAI,MAAM,cAAc;AACtB,wBAAU,KAAK;AAAA,gBACb,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,gBAC7C,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,KAAK,aAAa;AAAA,kBACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,gBAClD;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI,aAAa;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;ACtKO,IAAM,kBAAkB,OAC7B,QACA,QACiC;AACjC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;ACFO,IAAM,eAAe,OAC1B,QACA,QACiC;AACjC,QAAM,EAAE,UAAU,OAAAE,OAAM,IAAI,eAAe,OAAO,KAAK;AACvD,QAAM,iBAAiB,EAAE,GAAG,QAAQ,OAAAA,OAAM;AAE1C,UAAQ,SAAS,YAAY,GAAG;AAAA,IAC9B,KAAK;AACH,aAAO,WAAW,gBAAgB,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,cAAc,gBAAgB,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO,WAAW,gBAAgB,GAAG;AAAA,IACvC,KAAK;AAAA,IACL;AACE,aAAO,gBAAgB,gBAAgB,GAAG;AAAA,EAC9C;AACF;;;ACzBA,SAAS,oBAAoB;AAoB7B,IAAM,QAA8B;AAAA,EAClC,WAAW,oBAAI,IAAI;AAAA,EACnB,SAAS,IAAI,aAAa;AAC5B;AAEO,IAAM,wBAAwB,MAAc;AACjD,SAAO,YAAY,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAC7E;AAEO,IAAM,kBAAkB,OAC7B,UACA,eAC8B;AAC9B,QAAM,KAAK,sBAAsB;AACjC,QAAM,UAA2B,EAAE,IAAI,UAAU,WAAW;AAE5D,QAAM,QAAQ,KAAK,qBAAqB,OAAO;AAE/C,SAAO,IAAI,QAA0B,CAAC,YAAY;AAChD,UAAM,UAAU,IAAI,IAAI,OAAO;AAAA,EACjC,CAAC;AACH;AAEO,IAAM,kBAAkB,CAAC,aAAwC;AACtE,QAAM,WAAW,MAAM,UAAU,IAAI,SAAS,EAAE;AAChD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,UAAU,OAAO,SAAS,EAAE;AAClC,WAAS,QAAQ;AACjB,QAAM,QAAQ,KAAK,oBAAoB,QAAQ;AAC/C,SAAO;AACT;AAEO,IAAM,sBAAsB,CACjC,aACG;AACH,QAAM,QAAQ,GAAG,qBAAqB,QAAQ;AAChD;AAEO,IAAM,qBAAqB,CAChC,aACG;AACH,QAAM,QAAQ,GAAG,oBAAoB,QAAQ;AAC/C;AAEO,IAAM,yBAAyB,CACpC,OACA,aACG;AACH,QAAM,QAAQ,eAAe,OAAO,QAAQ;AAC9C;;;ACjEO,IAAM,QAAQ,CAAC;AAAA,EACpB,OAAAC,SAAQ;AAAA,EACR;AACF,IAAsC,CAAC,MAAoB;AACzD,SAAO,OACL,iBACiC;AACjC,UAAM,MACJ,OAAO,iBAAiB,WACpB;AAAA,MACE,SAAS,CAAC,EAAE,MAAM,QAAiB,SAAS,aAAa,CAAC;AAAA,MAC1D,OAAO,CAAC;AAAA,IACV,IACA;AAEN,UAAM,mBAAmB,SAAS,gBAAgB,MAAM,IAAI;AAE5D,UAAM,gBAAgB,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACjE,UAAM,eAAe,eAAe;AAEpC,QAAI,aAAa;AAEjB,OAAG;AACD,mBAAa,MAAM;AAAA,QACjB,EAAE,OAAAA,QAAO,cAAc,QAAQ,iBAAiB;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,WAAW,cAAc,cAAc,WAAW,OAAO,QAAQ;AACnE,qBAAa,MAAM,aAAa,UAAU;AAAA,MAC5C;AAAA,IACF,SAAS,WAAW,cAAc,cAAc,WAAW,OAAO;AAElE,WAAO;AAAA,EACT;AACF;AAEA,IAAM,eAAe,OACnB,QACiC;AACjC,QAAM,QAAQ,IAAI,cAAc,cAAc,CAAC;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAG1B,MAAI,IAAI,QAAQ;AACd,QAAI,OAAO,EAAE,MAAM,oBAAoB,MAAM,CAAC;AAAA,EAChD;AAEA,QAAM,aAAa,IAAI,cAAc,CAAC;AACtC,QAAM;AAAA,IACJ,kBAAkB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,mBAAmB,MAAM,IAAI,OAAO,SAAS;AACjD,QAAI,iBAAiB;AACnB,UAAI;AAEJ,UAAI,kBAAkB;AACpB,mBAAW,MAAM,iBAAiB,IAAI;AAAA,MACxC,OAAO;AACL,cAAM,WAAW,MAAM,gBAAgB,MAAM,UAAU;AACvD,mBAAW,SAAS;AAAA,MACtB;AAEA,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B,OAAO;AACL,aAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAED,QAAM,YAAY,MAAM,QAAQ,IAAI,gBAAgB;AAEpD,QAAM,gBAAgB,EAAE,GAAI,IAAI,kBAAkB,CAAC,EAAG;AAEtD,QAAM,UAAU,OAAO,SAAmB;AACxC,UAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,EAAE;AAE5D,QAAI,CAAC,UAAU,UAAU;AACvB,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO,EAAE,MAAM,cAAc,MAAM,OAAO,gCAAgC,CAAC;AAAA,MACjF;AACA,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,EAAE,OAAO,gCAAgC;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,SAAS,IAAI,cAAc,CAAC;AAClC,UAAM,WAAW,OAAO,QAAQ;AAChC,UAAM,eAAe,cAAc,QAAQ,KAAK;AAEhD,QAAI,YAAY,gBAAgB,UAAU;AACxC,YAAMC,SAAQ,QAAQ,QAAQ,6BAA6B,QAAQ;AACnE,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO,EAAE,MAAM,cAAc,MAAM,OAAAA,OAAM,CAAC;AAAA,MAChD;AACA,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,EAAE,OAAAA,OAAM;AAAA,MAClB;AAAA,IACF;AAEA,kBAAc,QAAQ,IAAI,eAAe;AAEzC,QAAI,IAAI,QAAQ;AACd,UAAI,OAAO,EAAE,MAAM,kBAAkB,KAAK,CAAC;AAAA,IAC7C;AAEA,QAAI;AACJ,aAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,UAAI;AACF,cAAM,WAAW,IAAI,gBAAgB,KAAK,SAAS,IAAI;AACvD,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,4BAA4B,KAAK,SAAS,IAAI,EAAE;AAAA,QAClE;AACA,YAAI,OAAO,CAAC;AACZ,YAAI;AACF,iBAAO,KAAK,SAAS,YACjB,KAAK,MAAM,KAAK,SAAS,SAAS,IAClC,CAAC;AAAA,QACP,SAAS,GAAG;AACV,gBAAM,IAAI;AAAA,YACR,mCAAmC,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,SAAS;AAAA,UACnF;AAAA,QACF;AACA,cAAM,SAAS,MAAM,SAAS,IAAI;AAClC,YAAI,IAAI,QAAQ;AACd,cAAI,OAAO,EAAE,MAAM,iBAAiB,MAAM,OAAO,CAAC;AAAA,QACpD;AACA,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB,SAAS,GAAG;AACV,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAM,QAAQ,UAAW;AACzB,QAAI,IAAI,QAAQ;AACd,UAAI,OAAO,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC;AAAA,IAChD;AACA,WAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,EAAE;AAAA,EACnC;AAEA,QAAM,UAAU,WACZ,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,CAAC,IACpC,MAAM,qBAAqB,OAAO,OAAO;AAE7C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,IAAI;AAAA,MACP,GAAG,QAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,QACpC,MAAM;AAAA,QACN,cAAc,KAAK;AAAA,QACnB,SAAS,KAAK,UAAU,MAAM;AAAA,MAChC,EAAE;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,uBAAuB,OAC3B,OACA,YACG;AACH,QAAM,UAA6C,CAAC;AACpD,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,EAClC;AACA,SAAO;AACT;;;AC1KA,IAAM,oBAAoB,MAAmB;AAC3C,QAAM,QAAQ,oBAAI,IAAuB;AAEzC,SAAO;AAAA,IACL,MAAM,IAAI,UAAsC;AAC9C,aAAO,MAAM,IAAI,QAAQ,KAAK,CAAC;AAAA,IACjC;AAAA,IAEA,MAAM,IAAI,UAAkB,UAAoC;AAC9D,YAAM,IAAI,UAAU,QAAQ;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,IAAM,eAAe,CAAC,IAAY,UAA+B;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,SAAS,UAAsD;AACnE,YAAM,UAAU,MAAM,MAAM,IAAI,EAAE;AAElC,YAAM,iBAAsC;AAAA,QAC1C;AAAA,QACA,OAAO,CAAC;AAAA,QACR,eAAe,CAAC;AAAA,QAChB,YAAY,CAAC;AAAA,QACb,gBAAgB,CAAC;AAAA,MACnB;AAEA,YAAM,eAAe,MAAM,SAAS,cAAc;AAClD,YAAM,MAAM,IAAI,IAAI,aAAa,OAAO;AAExC,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QACJ,SACA,UAC8B;AAC9B,YAAM,UAAU,MAAM,MAAM,IAAI,EAAE;AAClC,YAAM,iBAAsC;AAAA,QAC1C,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,QAC/C,OAAO,CAAC;AAAA,QACR,eAAe,CAAC;AAAA,QAChB,YAAY,CAAC;AAAA,QACb,gBAAgB,CAAC;AAAA,MACnB;AAEA,YAAM,eAAe,OAAO,YAAY,MAAM,GAAG,cAAc;AAC/D,YAAM,MAAM,IAAI,IAAI,aAAa,OAAO;AAExC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,eAAe,kBAAkB;AACvC,IAAM,UAAU,oBAAI,IAAoB;AAEjC,IAAM,oBAAoB,CAC/B,IACA,QAAqB,iBACV;AACX,MAAI,QAAQ,IAAI,EAAE,GAAG;AACnB,WAAO,QAAQ,IAAI,EAAE;AAAA,EACvB;AAEA,QAAM,SAAS,aAAa,IAAI,KAAK;AACrC,UAAQ,IAAI,IAAI,MAAM;AACtB,SAAO;AACT;;;AC5EO,IAAM,OAAO,CAClB,WACA,WACiB;AACjB,SAAO,OAAO,QAA2D;AACvE,QAAI,UAAU,GAAG,GAAG;AAClB,aAAO,MAAM,OAAO,GAAG;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF;;;ACNO,IAAM,gBACX,MACA,CAAC,QAAsC;AACrC,SACE,CAAC,IAAI,cAAc,cAAc,IAAI,aAAa,WAAW,WAAW;AAE5E;AAEK,IAAM,iBAAiB,CAAC,GAAW,SAAqC;AAC7E,MAAI,kBAAkB;AAEtB,SAAO;AAAA,IACL,CAAC,QACC,KAAK,MAAM,IAAI,QAAQ,SAAS,CAAC,IAAI,KAAK,MAAM,kBAAkB,CAAC;AAAA,IACrE,OAAO,QAAQ;AACb,wBAAkB,IAAI,QAAQ;AAC9B,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,GAAW,SAAqC;AAC3E,MAAI,kBAAkB;AAEtB,SAAO;AAAA,IACL,CAAC,QAAQ;AACP,YAAM,cAAc,IAAI,QAAQ;AAAA,QAC9B,CAAC,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI,QAAQ,SAAS,CAAC;AAAA,QACpD;AAAA,MACF;AACA,aAAO,KAAK,MAAM,cAAc,CAAC,IAAI,KAAK,MAAM,kBAAkB,CAAC;AAAA,IACrE;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,cAAc,IAAI,QAAQ;AAAA,QAC9B,CAAC,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI,QAAQ,SAAS,CAAC;AAAA,QACpD;AAAA,MACF;AACA,wBAAkB;AAClB,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB;AAAA,EACF;AACF;AAEO,IAAM,sBAAsB,CAAC,YAAkC;AACpE,SAAO,OAAO,QAA2D;AACvE,QAAI,gBAAgB;AACpB,aAAS,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,UAAI,IAAI,QAAQ,CAAC,EAAE,SAAS,QAAQ;AAClC,wBAAgB;AAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,kBAAkB,GAAI,QAAO;AAEjC,UAAM,aAAa,CAAC,GAAG,IAAI,OAAO;AAClC,eAAW,aAAa,IAAI;AAAA,MAC1B,GAAG,WAAW,aAAa;AAAA,MAC3B,SAAS,WAAW,aAAa,EAAE,UAAU;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB,CACjC,EAAE,UAAU,MAAM,GAClB,SACiB;AACjB,MAAI,qBAAqB;AACzB,MAAI,oBAAoB;AAExB,SAAO,KAAK,CAAC,QAAQ;AACnB,UAAM,cAAc,eAAe,GAAG;AAGtC,QAAI,gBAAgB,kBAAmB,QAAO;AAC9C,wBAAoB;AAGpB,UAAM,iBAAiB,yBAAyB,KAAK,QAAQ;AAE7D,QAAI,gBAAgB;AAClB,2BAAqB;AACrB,aAAO;AAAA,IACT,OAAO;AACL;AACA,aAAO,sBAAsB;AAAA,IAC/B;AAAA,EACF,GAAG,IAAI;AACT;AAEA,IAAM,iBAAiB,CAAC,QAAqC;AAC3D,MAAI,QAAQ;AACZ,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,SAAS,OAAQ;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,IAAM,2BAA2B,CAC/B,KACA,aACY;AAEZ,MAAI,gBAAgB;AACpB,WAAS,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,QAAI,IAAI,QAAQ,CAAC,EAAE,SAAS,QAAQ;AAClC,sBAAgB;AAChB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,GAAI,QAAO;AAGjC,WAAS,IAAI,gBAAgB,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;AAC3D,UAAM,MAAM,IAAI,QAAQ,CAAC;AACzB,QAAI,IAAI,SAAS,eAAe,IAAI,cAAc,YAAY;AAC5D,aAAO,IAAI,aAAa,WAAW;AAAA,QACjC,CAAC,SAAS,KAAK,SAAS,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,gBACX,CAAC,SACD,CAAC,QAAsC;AACrC,SACE,CAAC,CAAC,IAAI,cAAc,cACpB,IAAI,aAAa,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS,IAAI;AAE1E;;;ACjJK,IAAM,MAAM,CACjB,OACiB;AACjB,SAAO,OAAO,QAA2D;AACvE,UAAM,GAAG,GAAG;AACZ,WAAO;AAAA,EACT;AACF;;;ACJO,IAAM,QAAQ,CACnB,EAAE,QAAQ,EAAE,IAAkB,CAAC,GAC/B,SACiB;AACjB,SAAO,OAAO,QAA2D;AACvE,QAAI;AAEJ,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAI;AACF,eAAO,MAAM,KAAK,GAAG;AAAA,MACvB,SAAS,GAAG;AACV,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;;;ACpBA,IAAM,gBAAgB,CAAC,QAAkD;AACvE,QAAM,kBAAkB,CAAC,GAAG,IAAI,OAAO,EACpC,QAAQ,EACR,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM;AACpC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa;AAAA,EACf;AACF;AAEO,IAAM,UAAU,IAAI,UAA4C;AACrE,SAAO,OAAO,iBAA8E;AAC1F,QAAI;AAEJ,QAAI,OAAO,iBAAiB,UAAU;AACpC,uBAAiB;AAAA,QACf,SAAS,CAAC,EAAE,MAAM,QAAQ,SAAS,aAAa,CAAC;AAAA,QACjD,OAAO,CAAC;AAAA,QACR,eAAe,CAAC;AAAA,QAChB,YAAY,CAAC;AAAA,QACb,gBAAgB,CAAC;AAAA,MACnB;AAAA,IACF,OAAO;AACL,uBAAiB,gBAAgB;AAAA,QAC/B,SAAS,CAAC;AAAA,QACV,OAAO,CAAC;AAAA,QACR,eAAe,CAAC;AAAA,QAChB,YAAY,CAAC;AAAA,QACb,gBAAgB,CAAC;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,cAAc;AAEvC,eAAW,QAAQ,OAAO;AACxB,aAAO,MAAM,KAAK,cAAc,IAAI,CAAC;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AACF;;;ACjCA,IAAM,eAAe,CACnB,QACA,QACwB;AAExB,QAAM,UAAU,OAAO;AAEvB,MAAI,YAAiC;AAAA,IACnC,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,eAAe,CAAC;AAAA,IAChB,YAAY,CAAC;AAAA,IACb,gBAAgB,CAAC;AAAA,EACnB;AAIA,MAAI,gCAAgC;AAClC,cAAU,UAAU,IAAI;AACxB,cAAU,eAAe,IAAI;AAC7B,cAAU,cAAc,IAAI;AAAA,EAC9B;AAEA,MAAI,yBAAyB;AAC3B,cAAU,QAAQ,CAAC,GAAI,IAAI,SAAS,CAAC,CAAE;AACvC,cAAU,gBAAgB,EAAE,GAAI,IAAI,iBAAiB,CAAC,EAAG;AACzD,cAAU,aAAa,EAAE,GAAI,IAAI,cAAc,CAAC,EAAG;AACnD,cAAU,iBAAiB,EAAE,GAAI,IAAI,kBAAkB,CAAC,EAAG;AAC3D,cAAU,aAAa,IAAI,aAAa,EAAE,GAAG,IAAI,WAAW,IAAI;AAAA,EAClE;AAEA,YAAU,SAAS,IAAI;AAEvB,MAAI,OAAO,OAAO;AAChB,UAAM,kBAAkB,OAAO,MAAM,IAAI,0BAA0B;AACnE,UAAM,gBAAgB,OAAO,MAAM;AAAA,MACjC,CAAC,KAAK,SAAS;AACb,YAAI,KAAK,IAAI,IAAI,KAAK;AAEtB,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AACA,UAAM,aAAa,OAAO,MAAM;AAAA,MAC9B,CAAC,KAAK,SAAS;AACb,YAAI,KAAK,WAAW;AAClB,cAAI,KAAK,IAAI,IAAI,KAAK;AAAA,QACxB;AAEA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAEA,cAAU,QAAQ;AAClB,cAAU,gBAAgB;AAC1B,cAAU,aAAa;AAAA,EACzB;AAEA,MAAI,OAAO,YAAY;AACrB,cAAU,aAAa,EAAE,GAAG,OAAO,WAAW;AAAA,EAChD;AAEA,MAAI,OAAO,QAAQ;AACjB,UAAM,CAAC,OAAO,GAAG,IAAI,IAAI,UAAU;AACnC,QAAI,OAAO,SAAS,UAAU;AAC5B,gBAAU,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,OAAO,GAAG,GAAG,IAAI;AAAA,IAC1E,OAAO;AACL,gBAAU,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,OAAO,GAAG,GAAG,UAAU,OAAO;AAAA,IACvF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,QAAQ,CACnB,WACG,UACc;AACjB,SAAO,OAAO,QAA2D;AACvE,QAAI,YAAY,aAAa,QAAQ,GAAG;AAExC,QAAI,OAAO,OAAO;AAChB,SAAG;AACD,oBAAY,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAS;AAAA,MAC/C,SAAS,CAAC,OAAO,MAAM,SAAS;AAAA,IAClC,OAAO;AACL,kBAAY,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAS;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,OAAO,SAAS,IAAI,UAAU,UAAU;AAAA,MACjD,cAAc,OAAO,SAAS,IAAI,eAAe,UAAU;AAAA,MAC3D,aAAa,OAAO,SAAS,IAAI,cAAc,UAAU;AAAA,MACzD,YAAY,OAAO,SAAS,IAAI,aAAa,UAAU;AAAA,IACzD;AAAA,EACF;AACF;","names":["Inherit","model","model","model","model","msg","model","model","error"]}
1
+ {"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\n// openai streams tool calls as incremental chunks with index properties that need assembly\n// example: {\"index\": 0, \"function\": {\"name\": \"get_wea\"}} then {\"index\": 0, \"function\": {\"arguments\": \"ther\"}}\n// google/anthropic send complete tool calls in single chunks, so they don't need this logic\nconst appendToolCalls = (toolCalls: any[], tcchunklist: any[]): any[] => {\n for (const tcchunk of tcchunklist) {\n while (toolCalls.length <= tcchunk.index) {\n toolCalls.push({\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n const tc = toolCalls[tcchunk.index];\n tc.id += tcchunk.id || \"\";\n tc.function.name += tcchunk.function?.name || \"\";\n tc.function.arguments += tcchunk.function?.arguments || \"\";\n }\n return toolCalls;\n};\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: \"content\", content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n toolCalls = appendToolCalls(toolCalls, delta.tool_calls);\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport {\n ConversationContext,\n StepFunction,\n ToolCall,\n JsonSchema,\n StandardSchema,\n ComposedFunction,\n} from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n} = {}): ComposedFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? // model()(\"hello!\");\n {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : // model()(/* few shot / history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","model","model","msg","model","model","maxCalls","error"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threaded/ai",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "scripts": {