@threaded/ai 1.0.12 → 1.0.13

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.cjs CHANGED
@@ -760,23 +760,27 @@ var callGoogle = async (config, ctx) => {
760
760
  for (let i = 0; i < ctx.history.length; i++) {
761
761
  const msg2 = ctx.history[i];
762
762
  if (msg2.role === "assistant") {
763
- const parts = [];
763
+ const parts2 = [];
764
764
  if (msg2.content) {
765
- parts.push({ text: msg2.content });
765
+ parts2.push({ text: msg2.content });
766
766
  }
767
767
  if (msg2.tool_calls?.length) {
768
768
  for (const tc of msg2.tool_calls) {
769
769
  toolCallMap.set(tc.id, tc.function.name);
770
- parts.push({
770
+ const part = {
771
771
  functionCall: {
772
772
  name: tc.function.name,
773
773
  args: JSON.parse(tc.function.arguments)
774
774
  }
775
- });
775
+ };
776
+ if (tc.thoughtSignature) {
777
+ part.thoughtSignature = tc.thoughtSignature;
778
+ }
779
+ parts2.push(part);
776
780
  }
777
781
  }
778
- if (parts.length > 0) {
779
- contents.push({ role: "model", parts });
782
+ if (parts2.length > 0) {
783
+ contents.push({ role: "model", parts: parts2 });
780
784
  }
781
785
  } else if (msg2.role === "tool") {
782
786
  const responseParts = [];
@@ -845,22 +849,33 @@ var callGoogle = async (config, ctx) => {
845
849
  }
846
850
  const data = await response.json();
847
851
  const candidate = data.candidates[0];
848
- const part = candidate.content.parts[0];
852
+ const parts = candidate.content.parts || [];
849
853
  const msg = {
850
854
  role: "assistant",
851
- content: part.text || ""
855
+ content: ""
852
856
  };
853
- if (part.functionCall) {
854
- msg.tool_calls = [
855
- {
857
+ const toolCalls = [];
858
+ for (const part of parts) {
859
+ if (part.text) {
860
+ msg.content += part.text;
861
+ }
862
+ if (part.functionCall) {
863
+ const tc = {
856
864
  id: Math.random().toString(36).substring(2, 9),
857
865
  type: "function",
858
866
  function: {
859
867
  name: part.functionCall.name,
860
868
  arguments: JSON.stringify(part.functionCall.args)
861
869
  }
870
+ };
871
+ if (part.thoughtSignature) {
872
+ tc.thoughtSignature = part.thoughtSignature;
862
873
  }
863
- ];
874
+ toolCalls.push(tc);
875
+ }
876
+ }
877
+ if (toolCalls.length > 0) {
878
+ msg.tool_calls = toolCalls;
864
879
  }
865
880
  return {
866
881
  ...ctx,
@@ -900,14 +915,18 @@ var handleGoogleStream = async (response, ctx) => {
900
915
  }
901
916
  }
902
917
  if (part?.functionCall) {
903
- toolCalls.push({
918
+ const tc = {
904
919
  id: Math.random().toString(36).substring(2, 9),
905
920
  type: "function",
906
921
  function: {
907
922
  name: part.functionCall.name,
908
923
  arguments: JSON.stringify(part.functionCall.args)
909
924
  }
910
- });
925
+ };
926
+ if (part.thoughtSignature) {
927
+ tc.thoughtSignature = part.thoughtSignature;
928
+ }
929
+ toolCalls.push(tc);
911
930
  }
912
931
  }
913
932
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/image.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/xai.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","../src/utils/rateLimited.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./embed\";\nexport * from \"./image\";\nexport * from \"./thread\";\nexport * from \"./schema\";\nexport * from \"./helpers\";\nexport * from \"./approval\";\nexport * from \"./composition/tap\";\nexport * from \"./composition/when\";\nexport * from \"./composition/model\";\nexport * from \"./composition/retry\";\nexport * from \"./composition/scope\";\nexport * from \"./utils/rateLimited\";\nexport * from \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\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 const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const convertProperty = (prop: any): SchemaProperty => ({\n type: prop.type || \"string\",\n description: prop.description || \"\",\n ...(prop.enum && { enum: prop.enum }),\n ...(prop.items && { items: convertProperty(prop.items) }),\n ...(prop.properties && {\n properties: Object.fromEntries(\n Object.entries(prop.properties).map(([k, v]) => [k, convertProperty(v)])\n ),\n }),\n });\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 ...convertProperty(prop),\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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(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> | StandardSchema;\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 /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\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 abortSignal?: AbortSignal;\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: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n apiKey?: string;\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\nexport interface ImageConfig {\n n?: number;\n size?: string;\n quality?: \"standard\" | \"hd\" | \"low\" | \"medium\" | \"high\" | \"auto\";\n style?: \"vivid\" | \"natural\";\n responseFormat?: \"url\" | \"b64_json\";\n aspectRatio?: string;\n outputFormat?: \"png\" | \"jpeg\" | \"webp\";\n outputCompression?: number;\n background?: \"transparent\" | \"opaque\" | \"auto\";\n}\n\nexport interface ImageResult {\n data: string;\n revisedPrompt?: string;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(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 { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\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 body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\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 const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { ImageConfig, ImageResult } from \"./types\";\nimport { getKey, parseModelName } from \"./utils\";\n\nconst providerKeyEnvVars: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n xai: \"XAI_API_KEY\",\n google: \"GEMINI_API_KEY\",\n};\n\nconst getApiKey = (provider: string): string => {\n try {\n return getKey(provider);\n } catch {\n const envVar = providerKeyEnvVars[provider];\n const key = envVar ? process.env[envVar] || \"\" : \"\";\n if (!key) throw new Error(`No API key found for provider: ${provider}`);\n return key;\n }\n};\n\nconst generateOpenAICompatible = async (\n endpoint: string,\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const isGptImage = modelName.startsWith(\"gpt-image\");\n\n const body: Record<string, any> = {\n model: modelName,\n prompt,\n };\n\n if (!isGptImage) {\n body.response_format = config?.responseFormat || \"b64_json\";\n }\n\n if (config?.n) body.n = config.n;\n if (config?.size) body.size = config.size;\n if (config?.quality) body.quality = config.quality;\n if (config?.style && !isGptImage) body.style = config.style;\n\n if (isGptImage) {\n if (config?.outputFormat) body.output_format = config.outputFormat;\n if (config?.outputCompression != null) body.output_compression = config.outputCompression;\n if (config?.background) body.background = config.background;\n }\n\n const response = await fetch(endpoint, {\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(`API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const image = data.data[0];\n\n return {\n data: image.b64_json || image.url,\n revisedPrompt: image.revised_prompt,\n };\n};\n\nconst generateGoogle = async (\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${modelName}:generateContent`;\n\n const body: Record<string, any> = {\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n },\n };\n\n if (config?.aspectRatio) {\n body.generationConfig.aspectRatio = config.aspectRatio;\n }\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const parts = data.candidates?.[0]?.content?.parts || [];\n\n const imagePart = parts.find((p: any) => p.inlineData);\n const textPart = parts.find((p: any) => p.text);\n\n if (!imagePart?.inlineData?.data) {\n throw new Error(\"No image data in response\");\n }\n\n return {\n data: imagePart.inlineData.data,\n revisedPrompt: textPart?.text,\n };\n};\n\nexport const generateImage = async (\n model: string,\n prompt: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const { provider, model: modelName } = parseModelName(model);\n const providerLower = provider.toLowerCase();\n const apiKey = getApiKey(providerLower);\n\n switch (providerLower) {\n case \"openai\":\n return generateOpenAICompatible(\n \"https://api.openai.com/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"xai\":\n return generateOpenAICompatible(\n \"https://api.x.ai/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"google\":\n return generateGoogle(modelName, prompt, apiKey, config);\n\n default:\n throw new Error(`Unsupported image generation provider: ${provider}`);\n }\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"openai\");\n } catch {\n const key = process.env.OPENAI_API_KEY || \"\";\n if (!key) throw new Error(\"OpenAI API key not found\");\n return key;\n }\n};\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, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"anthropic\");\n } catch {\n const key = process.env.ANTHROPIC_API_KEY || \"\";\n if (!key) throw new Error(\"Anthropic API key not found\");\n return key;\n }\n};\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\n\n let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\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.map(({ index, ...tc }) => tc);\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"google\");\n } catch {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || \"\";\n if (!key) throw new Error(\"Google API key not found\");\n return key;\n }\n};\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 const toolCallMap = new Map<string, string>();\n\n for (let i = 0; i < ctx.history.length; i++) {\n const msg = ctx.history[i] as any;\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n toolCallMap.set(tc.id, tc.function.name);\n parts.push({\n functionCall: {\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n },\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const responseParts: any[] = [];\n\n while (i < ctx.history.length && (ctx.history[i] as any).role === \"tool\") {\n const toolMsg = ctx.history[i] as any;\n const functionName = toolCallMap.get(toolMsg.tool_call_id);\n if (functionName) {\n let responseData;\n try {\n responseData = JSON.parse(toolMsg.content);\n } catch {\n responseData = { result: toolMsg.content };\n }\n responseParts.push({\n functionResponse: {\n name: functionName,\n response: responseData,\n },\n });\n }\n i++;\n }\n i--;\n\n if (responseParts.length > 0) {\n contents.push({ role: \"user\", parts: responseParts });\n }\n } else if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts: [{ text: msg.content }],\n });\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}${ctx.stream ? '&alt=sse' : ''}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 parts = candidate?.content?.parts || [];\n\n for (const part of parts) {\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 }\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, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"xai\");\n } catch {\n const key = process.env.XAI_API_KEY || \"\";\n if (!key) throw new Error(\"xAI API key not found\");\n return key;\n }\n};\n\nexport const callXAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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.x.ai/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`xAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleXAIStream(response, ctx);\n }\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 handleXAIStream = 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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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 { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\nimport { callXAI } from \"./xai\";\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 \"xai\":\n return callXAI(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 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 system,\n apiKey,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n system?: string | ((ctx: ConversationContext) => string);\n apiKey?: string;\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 or history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n let currentCtx = ctx;\n\n if (system) {\n const systemContent = typeof system === \"function\" ? system(currentCtx) : system;\n const [first, ...rest] = currentCtx.history;\n\n if (first?.role === \"system\") {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...rest],\n };\n } else {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...currentCtx.history],\n };\n }\n }\n\n const systemMessage = currentCtx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n do {\n if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema, apiKey },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\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 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 executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!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 if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\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 runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\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\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 runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\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 scopedCtx.abortSignal = ctx.abortSignal;\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","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","getApiKey","model","getApiKey","model","getApiKey","model","msg","appendToolCalls","getApiKey","model","model","model","maxCalls","error","results"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/image.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/xai.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","../src/utils/rateLimited.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./embed\";\nexport * from \"./image\";\nexport * from \"./thread\";\nexport * from \"./schema\";\nexport * from \"./helpers\";\nexport * from \"./approval\";\nexport * from \"./composition/tap\";\nexport * from \"./composition/when\";\nexport * from \"./composition/model\";\nexport * from \"./composition/retry\";\nexport * from \"./composition/scope\";\nexport * from \"./utils/rateLimited\";\nexport * from \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\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 const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const convertProperty = (prop: any): SchemaProperty => ({\n type: prop.type || \"string\",\n description: prop.description || \"\",\n ...(prop.enum && { enum: prop.enum }),\n ...(prop.items && { items: convertProperty(prop.items) }),\n ...(prop.properties && {\n properties: Object.fromEntries(\n Object.entries(prop.properties).map(([k, v]) => [k, convertProperty(v)])\n ),\n }),\n });\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 ...convertProperty(prop),\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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(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> | StandardSchema;\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 /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\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 abortSignal?: AbortSignal;\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: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n apiKey?: string;\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\nexport interface ImageConfig {\n n?: number;\n size?: string;\n quality?: \"standard\" | \"hd\" | \"low\" | \"medium\" | \"high\" | \"auto\";\n style?: \"vivid\" | \"natural\";\n responseFormat?: \"url\" | \"b64_json\";\n aspectRatio?: string;\n outputFormat?: \"png\" | \"jpeg\" | \"webp\";\n outputCompression?: number;\n background?: \"transparent\" | \"opaque\" | \"auto\";\n}\n\nexport interface ImageResult {\n data: string;\n revisedPrompt?: string;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(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 { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\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 body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\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 const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { ImageConfig, ImageResult } from \"./types\";\nimport { getKey, parseModelName } from \"./utils\";\n\nconst providerKeyEnvVars: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n xai: \"XAI_API_KEY\",\n google: \"GEMINI_API_KEY\",\n};\n\nconst getApiKey = (provider: string): string => {\n try {\n return getKey(provider);\n } catch {\n const envVar = providerKeyEnvVars[provider];\n const key = envVar ? process.env[envVar] || \"\" : \"\";\n if (!key) throw new Error(`No API key found for provider: ${provider}`);\n return key;\n }\n};\n\nconst generateOpenAICompatible = async (\n endpoint: string,\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const isGptImage = modelName.startsWith(\"gpt-image\");\n\n const body: Record<string, any> = {\n model: modelName,\n prompt,\n };\n\n if (!isGptImage) {\n body.response_format = config?.responseFormat || \"b64_json\";\n }\n\n if (config?.n) body.n = config.n;\n if (config?.size) body.size = config.size;\n if (config?.quality) body.quality = config.quality;\n if (config?.style && !isGptImage) body.style = config.style;\n\n if (isGptImage) {\n if (config?.outputFormat) body.output_format = config.outputFormat;\n if (config?.outputCompression != null) body.output_compression = config.outputCompression;\n if (config?.background) body.background = config.background;\n }\n\n const response = await fetch(endpoint, {\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(`API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const image = data.data[0];\n\n return {\n data: image.b64_json || image.url,\n revisedPrompt: image.revised_prompt,\n };\n};\n\nconst generateGoogle = async (\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${modelName}:generateContent`;\n\n const body: Record<string, any> = {\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n },\n };\n\n if (config?.aspectRatio) {\n body.generationConfig.aspectRatio = config.aspectRatio;\n }\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const parts = data.candidates?.[0]?.content?.parts || [];\n\n const imagePart = parts.find((p: any) => p.inlineData);\n const textPart = parts.find((p: any) => p.text);\n\n if (!imagePart?.inlineData?.data) {\n throw new Error(\"No image data in response\");\n }\n\n return {\n data: imagePart.inlineData.data,\n revisedPrompt: textPart?.text,\n };\n};\n\nexport const generateImage = async (\n model: string,\n prompt: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const { provider, model: modelName } = parseModelName(model);\n const providerLower = provider.toLowerCase();\n const apiKey = getApiKey(providerLower);\n\n switch (providerLower) {\n case \"openai\":\n return generateOpenAICompatible(\n \"https://api.openai.com/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"xai\":\n return generateOpenAICompatible(\n \"https://api.x.ai/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"google\":\n return generateGoogle(modelName, prompt, apiKey, config);\n\n default:\n throw new Error(`Unsupported image generation provider: ${provider}`);\n }\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"openai\");\n } catch {\n const key = process.env.OPENAI_API_KEY || \"\";\n if (!key) throw new Error(\"OpenAI API key not found\");\n return key;\n }\n};\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, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"anthropic\");\n } catch {\n const key = process.env.ANTHROPIC_API_KEY || \"\";\n if (!key) throw new Error(\"Anthropic API key not found\");\n return key;\n }\n};\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\n\n let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\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.map(({ index, ...tc }) => tc);\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"google\");\n } catch {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || \"\";\n if (!key) throw new Error(\"Google API key not found\");\n return key;\n }\n};\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 const toolCallMap = new Map<string, string>();\n\n for (let i = 0; i < ctx.history.length; i++) {\n const msg = ctx.history[i] as any;\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n toolCallMap.set(tc.id, tc.function.name);\n const part: any = {\n functionCall: {\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n },\n };\n if (tc.thoughtSignature) {\n part.thoughtSignature = tc.thoughtSignature;\n }\n parts.push(part);\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const responseParts: any[] = [];\n\n while (i < ctx.history.length && (ctx.history[i] as any).role === \"tool\") {\n const toolMsg = ctx.history[i] as any;\n const functionName = toolCallMap.get(toolMsg.tool_call_id);\n if (functionName) {\n let responseData;\n try {\n responseData = JSON.parse(toolMsg.content);\n } catch {\n responseData = { result: toolMsg.content };\n }\n responseParts.push({\n functionResponse: {\n name: functionName,\n response: responseData,\n },\n });\n }\n i++;\n }\n i--;\n\n if (responseParts.length > 0) {\n contents.push({ role: \"user\", parts: responseParts });\n }\n } else if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts: [{ text: msg.content }],\n });\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}${ctx.stream ? '&alt=sse' : ''}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\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 parts = candidate.content.parts || [];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: \"\",\n };\n\n const toolCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n msg.content += part.text;\n }\n if (part.functionCall) {\n const tc: any = {\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 if (part.thoughtSignature) {\n tc.thoughtSignature = part.thoughtSignature;\n }\n toolCalls.push(tc);\n }\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\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 parts = candidate?.content?.parts || [];\n\n for (const part of parts) {\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 const tc: any = {\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 if (part.thoughtSignature) {\n tc.thoughtSignature = part.thoughtSignature;\n }\n toolCalls.push(tc);\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, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"xai\");\n } catch {\n const key = process.env.XAI_API_KEY || \"\";\n if (!key) throw new Error(\"xAI API key not found\");\n return key;\n }\n};\n\nexport const callXAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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.x.ai/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`xAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleXAIStream(response, ctx);\n }\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 handleXAIStream = 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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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 { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\nimport { callXAI } from \"./xai\";\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 \"xai\":\n return callXAI(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 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 system,\n apiKey,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n system?: string | ((ctx: ConversationContext) => string);\n apiKey?: string;\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 or history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n let currentCtx = ctx;\n\n if (system) {\n const systemContent = typeof system === \"function\" ? system(currentCtx) : system;\n const [first, ...rest] = currentCtx.history;\n\n if (first?.role === \"system\") {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...rest],\n };\n } else {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...currentCtx.history],\n };\n }\n }\n\n const systemMessage = currentCtx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n do {\n if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema, apiKey },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\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 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 executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!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 if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\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 runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\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\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 runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\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 scopedCtx.abortSignal = ctx.abortSignal;\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","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,iBAAgC;AAEzB,IAAM,mBAAmB,CAAC,WAA0C;AACzE,SAAO,UAAU,OAAO,WAAW,YAAY,eAAe;AAChE;AAEO,IAAM,oCAAoC,CAC/C,gBACA,OAAe,aACA;AACf,QAAM,aAAa,aAAE,aAAa,cAAyB;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,+BAA+B,CAC1C,cACmC;AACnC,MAAI,CAAC,WAAW,WAAY,QAAO,CAAC;AAEpC,QAAM,kBAAkB,CAAC,UAA+B;AAAA,IACtD,MAAM,KAAK,QAAQ;AAAA,IACnB,aAAa,KAAK,eAAe;AAAA,IACjC,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,KAAK;AAAA,IACnC,GAAI,KAAK,SAAS,EAAE,OAAO,gBAAgB,KAAK,KAAK,EAAE;AAAA,IACvD,GAAI,KAAK,cAAc;AAAA,MACrB,YAAY,OAAO;AAAA,QACjB,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC/D,UAAM,OAAO;AACb,WAAO,GAAG,IAAI;AAAA,MACZ,GAAG,gBAAgB,IAAI;AAAA,MACvB,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;AAEO,IAAM,0CAA0C,CACrD,mBACmC;AACnC,QAAM,aAAa,aAAE,aAAa,cAAyB;AAC3D,SAAO,6BAA6B,UAAU;AAChD;;;ACzDO,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;;;ACkEO,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;;;AC7FL,IAAM,6BAA6B,CACxC,SACmB;AACnB,QAAM,SAAS,iBAAiB,KAAK,MAAM,IACvC,wCAAwC,KAAK,MAAM,IACnD,KAAK;AAET,QAAM,aAAkC,CAAC;AACzC,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChD,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;AAEpB,IAAM,UAAU,CAAC,SAAwB;AAC9C,eAAa,EAAE,GAAG,YAAY,GAAG,KAAK;AACxC;AAEO,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;AAEO,IAAM,WAAW,CAAC,YAAwBC,eAAkC;AAAA,EACjF,GAAG;AAAA,EACH,WAAWA;AACb;;;AC/FA,IAAM,aAAa,oBAAI,IAAiB;AAYjC,IAAM,QAAQ,OACnBC,QACA,MACA,WACsB;AACtB,MAAIA,OAAM,WAAW,SAAS,GAAG;AAC/B,UAAM,YAAYA,OAAM,QAAQ,WAAW,EAAE;AAC7C,UAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAY;AAAA,MAChB,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,OAAO;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM,MAAM,wCAAwC;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,MAAM;AAAA,MACjC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK,KAAK,CAAC,EAAE;AAAA,EACtB;AAEA,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,2BAA2B;AAE7D,QAAI,CAAC,WAAW,IAAIA,MAAK,GAAG;AAC1B,YAAMC,aAAY,MAAM,SAAS,sBAAsBD,QAAO;AAAA,QAC5D,OAAO;AAAA,MACT,CAAC;AACD,iBAAW,IAAIA,QAAOC,UAAS;AAAA,IACjC;AAEA,UAAM,YAAY,WAAW,IAAID,MAAK;AACtC,UAAM,SAAS,MAAM,UAAU,MAAM,EAAE,SAAS,QAAQ,WAAW,KAAK,CAAC;AACzE,WAAO,MAAM,KAAK,OAAO,IAAI;AAAA,EAC/B,SAAS,OAAY;AACnB,UAAM,IAAI;AAAA,MACR,sHAAsH,MAAM,OAAO;AAAA,IACrI;AAAA,EACF;AACF;;;ACrEA,IAAM,qBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,YAAY,CAAC,aAA6B;AAC9C,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,SAAS,mBAAmB,QAAQ;AAC1C,UAAM,MAAM,SAAS,QAAQ,IAAI,MAAM,KAAK,KAAK;AACjD,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kCAAkC,QAAQ,EAAE;AACtE,WAAO;AAAA,EACT;AACF;AAEA,IAAM,2BAA2B,OAC/B,UACA,WACA,QACA,QACA,WACyB;AACzB,QAAM,aAAa,UAAU,WAAW,WAAW;AAEnD,QAAM,OAA4B;AAAA,IAChC,OAAO;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,SAAK,kBAAkB,QAAQ,kBAAkB;AAAA,EACnD;AAEA,MAAI,QAAQ,EAAG,MAAK,IAAI,OAAO;AAC/B,MAAI,QAAQ,KAAM,MAAK,OAAO,OAAO;AACrC,MAAI,QAAQ,QAAS,MAAK,UAAU,OAAO;AAC3C,MAAI,QAAQ,SAAS,CAAC,WAAY,MAAK,QAAQ,OAAO;AAEtD,MAAI,YAAY;AACd,QAAI,QAAQ,aAAc,MAAK,gBAAgB,OAAO;AACtD,QAAI,QAAQ,qBAAqB,KAAM,MAAK,qBAAqB,OAAO;AACxE,QAAI,QAAQ,WAAY,MAAK,aAAa,OAAO;AAAA,EACnD;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,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,cAAc,KAAK,EAAE;AAAA,EACvC;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,QAAQ,KAAK,KAAK,CAAC;AAEzB,SAAO;AAAA,IACL,MAAM,MAAM,YAAY,MAAM;AAAA,IAC9B,eAAe,MAAM;AAAA,EACvB;AACF;AAEA,IAAM,iBAAiB,OACrB,WACA,QACA,QACA,WACyB;AACzB,QAAM,WAAW,2DAA2D,SAAS;AAErF,QAAM,OAA4B;AAAA,IAChC,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAAA,IACxC,kBAAkB;AAAA,MAChB,oBAAoB,CAAC,QAAQ,OAAO;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,SAAK,iBAAiB,cAAc,OAAO;AAAA,EAC7C;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB;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,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,QAAQ,KAAK,aAAa,CAAC,GAAG,SAAS,SAAS,CAAC;AAEvD,QAAM,YAAY,MAAM,KAAK,CAAC,MAAW,EAAE,UAAU;AACrD,QAAM,WAAW,MAAM,KAAK,CAAC,MAAW,EAAE,IAAI;AAE9C,MAAI,CAAC,WAAW,YAAY,MAAM;AAChC,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,MAAM,UAAU,WAAW;AAAA,IAC3B,eAAe,UAAU;AAAA,EAC3B;AACF;AAEO,IAAM,gBAAgB,OAC3BE,QACA,QACA,WACyB;AACzB,QAAM,EAAE,UAAU,OAAO,UAAU,IAAI,eAAeA,MAAK;AAC3D,QAAM,gBAAgB,SAAS,YAAY;AAC3C,QAAM,SAAS,UAAU,aAAa;AAEtC,UAAQ,eAAe;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,eAAe,WAAW,QAAQ,QAAQ,MAAM;AAAA,IAEzD;AACE,YAAM,IAAI,MAAM,0CAA0C,QAAQ,EAAE;AAAA,EACxE;AACF;;;ACxJA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0BAA0B;AACpD,WAAO;AAAA,EACT;AACF;AAKA,IAAM,kBAAkB,CAAC,WAAkB,gBAA8B;AACvE,aAAW,WAAW,aAAa;AACjC,WAAO,UAAU,UAAU,QAAQ,OAAO;AACxC,gBAAU,KAAK;AAAA,QACb,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,IAAI,WAAW,GAAG;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,KAAK,UAAU,QAAQ,KAAK;AAClC,OAAG,MAAM,QAAQ,MAAM;AACvB,OAAG,SAAS,QAAQ,QAAQ,UAAU,QAAQ;AAC9C,OAAG,SAAS,aAAa,QAAQ,UAAU,aAAa;AAAA,EAC1D;AACA,SAAO;AACT;AAEO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,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,OAAAC;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,IACzB,QAAQ,IAAI;AAAA,EACd,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,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,SAAS,SAAU;AACvB,cAAI,CAAC,KAAM;AAEX,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,0BAAY,gBAAgB,WAAW,MAAM,UAAU;AAAA,YACzD;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;;;AC9KA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,qBAAqB;AAC7C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,WAAO;AAAA,EACT;AACF;AAEA,IAAM,2BAA2B,CAAC,aAA2B;AAC3D,QAAM,SAAgB,CAAC;AACvB,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,MAAM,SAAS,CAAC;AAEtB,QAAI,IAAI,SAAS,UAAU;AACzB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,aAAa;AAC5B,UAAI,IAAI,YAAY;AAClB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,IAAI,WAAW,IAAI,CAAC,QAAa;AAAA,YACxC,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG,SAAS;AAAA,YAClB,OAAO,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,UACzC,EAAE;AAAA,QACJ,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,QACf,CAAC;AAAA,MACH;AACA;AAAA,IACF,WAAW,IAAI,SAAS,QAAQ;AAC9B,YAAM,cAAqB,CAAC;AAC5B,aAAO,IAAI,SAAS,UAAU,SAAS,CAAC,EAAE,SAAS,QAAQ;AACzD,cAAM,UAAU,SAAS,CAAC;AAC1B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,QAAQ;AAAA,QACnB,CAAC;AACD;AAAA,MACF;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,GAAG;AACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,OAC3B,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,MAAI,SAAS;AAEb,MAAI,IAAI,QAAQ,CAAC,GAAG,SAAS,UAAU;AACrC,aAAS,IAAI,QAAQ,CAAC,EAAE;AAAA,EAC1B;AAEA,QAAM,WAAW,yBAAyB,IAAI,OAAO;AAErD,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,OAAAC;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,IACzB,QAAQ,IAAI;AAAA,EACd,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;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,CAAC,KAAM;AAEX,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;AAAA,gBACb;AAAA,gBACA,OAAO,OAAO;AAAA,cAChB,CAAC;AAAA,YACH;AAEA,gBACE,OAAO,SAAS,yBAChB,OAAO,OAAO,SAAS,oBACvB;AACA,oBAAM,WAAW,UAAU,KAAK,CAAC,OAAO,GAAG,UAAU,OAAO,KAAK;AACjE,kBAAI,UAAU;AACZ,yBAAS,SAAS,aAAa,OAAO,MAAM;AAAA,cAC9C;AAAA,YACF;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,UAAU,IAAI,CAAC,EAAE,OAAO,GAAG,GAAG,MAAM,EAAE;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;ACpPA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,qBAAqB;AAC3E,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0BAA0B;AACpD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,aAAa,IAAI;AACtD,QAAM,SAASD,WAAU,YAAY;AAErC,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,QAAM,cAAc,oBAAI,IAAoB;AAE5C,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;AAC3C,UAAME,OAAM,IAAI,QAAQ,CAAC;AAEzB,QAAIA,KAAI,SAAS,aAAa;AAC5B,YAAMC,SAAe,CAAC;AAEtB,UAAID,KAAI,SAAS;AACf,QAAAC,OAAM,KAAK,EAAE,MAAMD,KAAI,QAAQ,CAAC;AAAA,MAClC;AAEA,UAAIA,KAAI,YAAY,QAAQ;AAC1B,mBAAW,MAAMA,KAAI,YAAY;AAC/B,sBAAY,IAAI,GAAG,IAAI,GAAG,SAAS,IAAI;AACvC,gBAAM,OAAY;AAAA,YAChB,cAAc;AAAA,cACZ,MAAM,GAAG,SAAS;AAAA,cAClB,MAAM,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,YACxC;AAAA,UACF;AACA,cAAI,GAAG,kBAAkB;AACvB,iBAAK,mBAAmB,GAAG;AAAA,UAC7B;AACA,UAAAC,OAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAEA,UAAIA,OAAM,SAAS,GAAG;AACpB,iBAAS,KAAK,EAAE,MAAM,SAAS,OAAAA,OAAM,CAAC;AAAA,MACxC;AAAA,IACF,WAAWD,KAAI,SAAS,QAAQ;AAC9B,YAAM,gBAAuB,CAAC;AAE9B,aAAO,IAAI,IAAI,QAAQ,UAAW,IAAI,QAAQ,CAAC,EAAU,SAAS,QAAQ;AACxE,cAAM,UAAU,IAAI,QAAQ,CAAC;AAC7B,cAAM,eAAe,YAAY,IAAI,QAAQ,YAAY;AACzD,YAAI,cAAc;AAChB,cAAI;AACJ,cAAI;AACF,2BAAe,KAAK,MAAM,QAAQ,OAAO;AAAA,UAC3C,QAAQ;AACN,2BAAe,EAAE,QAAQ,QAAQ,QAAQ;AAAA,UAC3C;AACA,wBAAc,KAAK;AAAA,YACjB,kBAAkB;AAAA,cAChB,MAAM;AAAA,cACN,UAAU;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA;AAEA,UAAI,cAAc,SAAS,GAAG;AAC5B,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,cAAc,CAAC;AAAA,MACtD;AAAA,IACF,WAAWA,KAAI,SAAS,QAAQ;AAC9B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAMA,KAAI,QAAQ,CAAC;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;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,GAAG,IAAI,SAAS,aAAa,EAAE;AAAA,IACzH;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,IAAI;AAAA,IACd;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,QAAQ,UAAU,QAAQ,SAAS,CAAC;AAE1C,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,QAAM,YAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,MAAM;AACb,UAAI,WAAW,KAAK;AAAA,IACtB;AACA,QAAI,KAAK,cAAc;AACrB,YAAM,KAAU;AAAA,QACd,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;AACA,UAAI,KAAK,kBAAkB;AACzB,WAAG,mBAAmB,KAAK;AAAA,MAC7B;AACA,gBAAU,KAAK,EAAE;AAAA,IACnB;AAAA,EACF;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;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,CAAC,KAAM;AAEX,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,YAAY,OAAO,aAAa,CAAC;AACvC,kBAAM,QAAQ,WAAW,SAAS,SAAS,CAAC;AAE5C,uBAAW,QAAQ,OAAO;AACxB,kBAAI,MAAM,MAAM;AACd,+BAAe,KAAK;AACpB,oBAAI,IAAI,QAAQ;AACd,sBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,KAAK,KAAK,CAAC;AAAA,gBACpD;AAAA,cACF;AAEA,kBAAI,MAAM,cAAc;AACtB,sBAAM,KAAU;AAAA,kBACd,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,kBAC7C,MAAM;AAAA,kBACN,UAAU;AAAA,oBACR,MAAM,KAAK,aAAa;AAAA,oBACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,kBAClD;AAAA,gBACF;AACA,oBAAI,KAAK,kBAAkB;AACzB,qBAAG,mBAAmB,KAAK;AAAA,gBAC7B;AACA,0BAAU,KAAK,EAAE;AAAA,cACnB;AAAA,YACF;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;;;ACpQO,IAAM,kBAAkB,OAC7B,QACA,QACiC;AACjC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;ACNA,IAAMG,mBAAkB,CAAC,WAAkB,gBAA8B;AACvE,aAAW,WAAW,aAAa;AACjC,WAAO,UAAU,UAAU,QAAQ,OAAO;AACxC,gBAAU,KAAK;AAAA,QACb,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,IAAI,WAAW,GAAG;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,KAAK,UAAU,QAAQ,KAAK;AAClC,OAAG,MAAM,QAAQ,MAAM;AACvB,OAAG,SAAS,QAAQ,QAAQ,UAAU,QAAQ;AAC9C,OAAG,SAAS,aAAa,QAAQ,UAAU,aAAa;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,eAAe;AACvC,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uBAAuB;AACjD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,UAAU,OACrB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,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,OAAAC;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,wCAAwC;AAAA,IACnE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,IAAI;AAAA,EACd,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAAA,EAC3C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,gBAAgB,UAAU,GAAG;AAAA,EACtC;AAEA,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,kBAAkB,OACtB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,MAAI,YAAmB,CAAC;AACxB,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,SAAS,SAAU;AACvB,cAAI,CAAC,KAAM;AAEX,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,0BAAYF,iBAAgB,WAAW,MAAM,UAAU;AAAA,YACzD;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,eAAe,OAC1B,QACA,QACiC;AACjC,QAAM,EAAE,UAAU,OAAAG,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;AACH,aAAO,QAAQ,gBAAgB,GAAG;AAAA,IACpC,KAAK;AAAA,IACL;AACE,aAAO,gBAAgB,gBAAgB,GAAG;AAAA,EAC9C;AACF;;;AC5BA,oBAA6B;AAoB7B,IAAM,QAA8B;AAAA,EAClC,WAAW,oBAAI,IAAI;AAAA,EACnB,SAAS,IAAI,2BAAa;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;;;AC3DO,IAAM,QAAQ,CAAC;AAAA,EACpB,OAAAC,SAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,IAKI,CAAC,MAAwB;AAC3B,SAAO,OACL,iBACiC;AACjC,UAAM,MACJ,OAAO,iBAAiB;AAAA;AAAA,MAEpB;AAAA,QACE,SAAS,CAAC,EAAE,MAAM,QAAiB,SAAS,aAAa,CAAC;AAAA,QAC1D,OAAO,CAAC;AAAA,MACV;AAAA;AAAA;AAAA,MAEA;AAAA;AACN,UAAM,mBAAmB,SAAS,gBAAgB,MAAM,IAAI;AAE5D,QAAI,aAAa;AAEjB,QAAI,QAAQ;AACV,YAAM,gBAAgB,OAAO,WAAW,aAAa,OAAO,UAAU,IAAI;AAC1E,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI,WAAW;AAEpC,UAAI,OAAO,SAAS,UAAU;AAC5B,qBAAa;AAAA,UACX,GAAG;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,cAAc,GAAG,GAAG,IAAI;AAAA,QAC/D;AAAA,MACF,OAAO;AACL,qBAAa;AAAA,UACX,GAAG;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,cAAc,GAAG,GAAG,WAAW,OAAO;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACxE,UAAM,eAAe,eAAe;AAEpC,OAAG;AACD,UAAI,WAAW,aAAa,SAAS;AACnC;AAAA,MACF;AAEA,mBAAa,MAAM;AAAA,QACjB,EAAE,OAAAA,QAAO,cAAc,QAAQ,kBAAkB,OAAO;AAAA,QACxD;AAAA,MACF;AAEA,UAAI,WAAW,cAAc,cAAc,WAAW,OAAO,QAAQ;AACnE,qBAAa,MAAM,aAAa,UAAU;AAAA,MAC5C;AAAA,IACF,SACE,WAAW,cAAc,cACzB,WAAW,OAAO,UAClB,CAAC,WAAW,aAAa;AAG3B,WAAO;AAAA,EACT;AACF;AAEA,IAAM,eAAe,OACnB,QACiC;AACjC,QAAM,QAAQ,IAAI,cAAc,cAAc,CAAC;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,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,IACA,oBAAoB;AAAA,EACtB,IAAI;AAEJ,QAAM,gBAAgB,EAAE,GAAI,IAAI,kBAAkB,CAAC,EAAG;AAEtD,QAAM,UAAU,OAAO,MAAgB,aAAsB;AAC3D,QAAI,CAAC,UAAU;AACb,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;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,UAAMC,YAAW,OAAO,QAAQ;AAChC,UAAM,eAAe,cAAc,QAAQ,KAAK;AAEhD,QAAIA,aAAY,gBAAgBA,WAAU;AACxC,YAAMC,SAAQ,QAAQ,QAAQ,6BAA6BD,SAAQ;AACnE,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO,EAAE,MAAM,cAAc,MAAM,OAAAC,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,MAAI,qBAAqB,iBAAiB;AACxC,UAAM,iBAAiB,MAAM,IAAI,OAAO,SAAS;AAC/C,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,QAAQ,MAAM,QAAQ;AAAA,IAC/B,CAAC;AAED,UAAMC,WAAU,MAAM,QAAQ,IAAI,cAAc;AAEhD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,IAAI;AAAA,QACP,GAAGA,SAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,UACpC,MAAM;AAAA,UACN,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK,UAAU,MAAM;AAAA,QAChC,EAAE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,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,sBAAsB,OAAO,SAAmB;AACpD,UAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,EAAE;AAC5D,WAAO,QAAQ,MAAM,UAAU,YAAY,IAAI;AAAA,EACjD;AAEA,QAAM,UAAU,WACZ,MAAM,QAAQ,IAAI,MAAM,IAAI,mBAAmB,CAAC,IAChD,MAAM,qBAAqB,OAAO,mBAAmB;AAEzD,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;;;ACtPA,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,UAAU,oBAAI,IAAoB;AAwBjC,IAAM,oBAAoB,CAAC,IAAY,UAAgC;AAC5E,QAAM,WAAW,QAAQ,GAAG,EAAE,IAAI,KAAK,KAAK;AAE5C,MAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AAEA,QAAM,cAAc,SAAS,kBAAkB;AAC/C,QAAM,SAAS,aAAa,IAAI,WAAW;AAC3C,UAAQ,IAAI,UAAU,MAAM;AAC5B,SAAO;AACT;;;ACjGO,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,iBAA6E;AACzF,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;AACvB,YAAU,cAAc,IAAI;AAE5B,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,MAAI,OAAO,QAAQ;AACjB,cAAU,SAAS,OAAO;AAAA,EAC5B;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;;;ACjFO,IAAM,cACX,CAAC,WACD,CAA6C,OAAa;AACxD,QAAM,EAAE,KAAK,OAAO,YAAY,IAAI;AAEpC,MAAI,SAAS;AACb,MAAI,WAAW;AACf,QAAM,QAAqB,CAAC;AAC5B,MAAI,aAAoC;AAExC,QAAM,eAAe,MAAM;AACzB,aAAS,KAAK,IAAI,SAAS,GAAG,KAAK;AACnC,iBAAa;AAAA,EACf;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,YAAY;AACf,mBAAa,YAAY,cAAc,MAAO,GAAG;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,cAAc,MAAM,WAAW,KAAK,aAAa,GAAG;AACtD,oBAAc,UAAU;AACxB,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,WAAO,MAAM,SAAS,KAAK,SAAS,KAAK,WAAW,aAAa;AAC/D;AACA;AAEA,YAAM,OAAO,MAAM,MAAM;AAEzB,WACG,GAAG,EACH,KAAK,CAAC,WAAW;AAChB;AACA,aAAK,QAAQ,MAAM;AACnB,qBAAa;AACb,qBAAa;AAAA,MACf,CAAC,EACA,MAAM,CAAC,UAAU;AAChB;AACA,aAAK,OAAO,KAAK;AACjB,qBAAa;AACb,qBAAa;AAAA,MACf,CAAC;AAAA,IACL;AAAA,EACF;AAEA,UAAQ,UAAU,SAAgB;AAChC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK;AAAA,QACT,IAAI,MAAM,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF,CAAC;AACD,oBAAc;AACd,mBAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":["Inherit","model","maxCalls","model","extractor","model","getApiKey","model","getApiKey","model","getApiKey","model","msg","parts","appendToolCalls","getApiKey","model","model","model","maxCalls","error","results"]}
package/dist/index.js CHANGED
@@ -691,23 +691,27 @@ var callGoogle = async (config, ctx) => {
691
691
  for (let i = 0; i < ctx.history.length; i++) {
692
692
  const msg2 = ctx.history[i];
693
693
  if (msg2.role === "assistant") {
694
- const parts = [];
694
+ const parts2 = [];
695
695
  if (msg2.content) {
696
- parts.push({ text: msg2.content });
696
+ parts2.push({ text: msg2.content });
697
697
  }
698
698
  if (msg2.tool_calls?.length) {
699
699
  for (const tc of msg2.tool_calls) {
700
700
  toolCallMap.set(tc.id, tc.function.name);
701
- parts.push({
701
+ const part = {
702
702
  functionCall: {
703
703
  name: tc.function.name,
704
704
  args: JSON.parse(tc.function.arguments)
705
705
  }
706
- });
706
+ };
707
+ if (tc.thoughtSignature) {
708
+ part.thoughtSignature = tc.thoughtSignature;
709
+ }
710
+ parts2.push(part);
707
711
  }
708
712
  }
709
- if (parts.length > 0) {
710
- contents.push({ role: "model", parts });
713
+ if (parts2.length > 0) {
714
+ contents.push({ role: "model", parts: parts2 });
711
715
  }
712
716
  } else if (msg2.role === "tool") {
713
717
  const responseParts = [];
@@ -776,22 +780,33 @@ var callGoogle = async (config, ctx) => {
776
780
  }
777
781
  const data = await response.json();
778
782
  const candidate = data.candidates[0];
779
- const part = candidate.content.parts[0];
783
+ const parts = candidate.content.parts || [];
780
784
  const msg = {
781
785
  role: "assistant",
782
- content: part.text || ""
786
+ content: ""
783
787
  };
784
- if (part.functionCall) {
785
- msg.tool_calls = [
786
- {
788
+ const toolCalls = [];
789
+ for (const part of parts) {
790
+ if (part.text) {
791
+ msg.content += part.text;
792
+ }
793
+ if (part.functionCall) {
794
+ const tc = {
787
795
  id: Math.random().toString(36).substring(2, 9),
788
796
  type: "function",
789
797
  function: {
790
798
  name: part.functionCall.name,
791
799
  arguments: JSON.stringify(part.functionCall.args)
792
800
  }
801
+ };
802
+ if (part.thoughtSignature) {
803
+ tc.thoughtSignature = part.thoughtSignature;
793
804
  }
794
- ];
805
+ toolCalls.push(tc);
806
+ }
807
+ }
808
+ if (toolCalls.length > 0) {
809
+ msg.tool_calls = toolCalls;
795
810
  }
796
811
  return {
797
812
  ...ctx,
@@ -831,14 +846,18 @@ var handleGoogleStream = async (response, ctx) => {
831
846
  }
832
847
  }
833
848
  if (part?.functionCall) {
834
- toolCalls.push({
849
+ const tc = {
835
850
  id: Math.random().toString(36).substring(2, 9),
836
851
  type: "function",
837
852
  function: {
838
853
  name: part.functionCall.name,
839
854
  arguments: JSON.stringify(part.functionCall.args)
840
855
  }
841
- });
856
+ };
857
+ if (part.thoughtSignature) {
858
+ tc.thoughtSignature = part.thoughtSignature;
859
+ }
860
+ toolCalls.push(tc);
842
861
  }
843
862
  }
844
863
  } catch (e) {
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/embed.ts","../src/image.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/xai.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","../src/utils/rateLimited.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\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 const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const convertProperty = (prop: any): SchemaProperty => ({\n type: prop.type || \"string\",\n description: prop.description || \"\",\n ...(prop.enum && { enum: prop.enum }),\n ...(prop.items && { items: convertProperty(prop.items) }),\n ...(prop.properties && {\n properties: Object.fromEntries(\n Object.entries(prop.properties).map(([k, v]) => [k, convertProperty(v)])\n ),\n }),\n });\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 ...convertProperty(prop),\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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(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> | StandardSchema;\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 /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\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 abortSignal?: AbortSignal;\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: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n apiKey?: string;\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\nexport interface ImageConfig {\n n?: number;\n size?: string;\n quality?: \"standard\" | \"hd\" | \"low\" | \"medium\" | \"high\" | \"auto\";\n style?: \"vivid\" | \"natural\";\n responseFormat?: \"url\" | \"b64_json\";\n aspectRatio?: string;\n outputFormat?: \"png\" | \"jpeg\" | \"webp\";\n outputCompression?: number;\n background?: \"transparent\" | \"opaque\" | \"auto\";\n}\n\nexport interface ImageResult {\n data: string;\n revisedPrompt?: string;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(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 { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\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 body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\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 const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { ImageConfig, ImageResult } from \"./types\";\nimport { getKey, parseModelName } from \"./utils\";\n\nconst providerKeyEnvVars: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n xai: \"XAI_API_KEY\",\n google: \"GEMINI_API_KEY\",\n};\n\nconst getApiKey = (provider: string): string => {\n try {\n return getKey(provider);\n } catch {\n const envVar = providerKeyEnvVars[provider];\n const key = envVar ? process.env[envVar] || \"\" : \"\";\n if (!key) throw new Error(`No API key found for provider: ${provider}`);\n return key;\n }\n};\n\nconst generateOpenAICompatible = async (\n endpoint: string,\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const isGptImage = modelName.startsWith(\"gpt-image\");\n\n const body: Record<string, any> = {\n model: modelName,\n prompt,\n };\n\n if (!isGptImage) {\n body.response_format = config?.responseFormat || \"b64_json\";\n }\n\n if (config?.n) body.n = config.n;\n if (config?.size) body.size = config.size;\n if (config?.quality) body.quality = config.quality;\n if (config?.style && !isGptImage) body.style = config.style;\n\n if (isGptImage) {\n if (config?.outputFormat) body.output_format = config.outputFormat;\n if (config?.outputCompression != null) body.output_compression = config.outputCompression;\n if (config?.background) body.background = config.background;\n }\n\n const response = await fetch(endpoint, {\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(`API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const image = data.data[0];\n\n return {\n data: image.b64_json || image.url,\n revisedPrompt: image.revised_prompt,\n };\n};\n\nconst generateGoogle = async (\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${modelName}:generateContent`;\n\n const body: Record<string, any> = {\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n },\n };\n\n if (config?.aspectRatio) {\n body.generationConfig.aspectRatio = config.aspectRatio;\n }\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const parts = data.candidates?.[0]?.content?.parts || [];\n\n const imagePart = parts.find((p: any) => p.inlineData);\n const textPart = parts.find((p: any) => p.text);\n\n if (!imagePart?.inlineData?.data) {\n throw new Error(\"No image data in response\");\n }\n\n return {\n data: imagePart.inlineData.data,\n revisedPrompt: textPart?.text,\n };\n};\n\nexport const generateImage = async (\n model: string,\n prompt: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const { provider, model: modelName } = parseModelName(model);\n const providerLower = provider.toLowerCase();\n const apiKey = getApiKey(providerLower);\n\n switch (providerLower) {\n case \"openai\":\n return generateOpenAICompatible(\n \"https://api.openai.com/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"xai\":\n return generateOpenAICompatible(\n \"https://api.x.ai/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"google\":\n return generateGoogle(modelName, prompt, apiKey, config);\n\n default:\n throw new Error(`Unsupported image generation provider: ${provider}`);\n }\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"openai\");\n } catch {\n const key = process.env.OPENAI_API_KEY || \"\";\n if (!key) throw new Error(\"OpenAI API key not found\");\n return key;\n }\n};\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, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"anthropic\");\n } catch {\n const key = process.env.ANTHROPIC_API_KEY || \"\";\n if (!key) throw new Error(\"Anthropic API key not found\");\n return key;\n }\n};\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\n\n let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\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.map(({ index, ...tc }) => tc);\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"google\");\n } catch {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || \"\";\n if (!key) throw new Error(\"Google API key not found\");\n return key;\n }\n};\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 const toolCallMap = new Map<string, string>();\n\n for (let i = 0; i < ctx.history.length; i++) {\n const msg = ctx.history[i] as any;\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n toolCallMap.set(tc.id, tc.function.name);\n parts.push({\n functionCall: {\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n },\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const responseParts: any[] = [];\n\n while (i < ctx.history.length && (ctx.history[i] as any).role === \"tool\") {\n const toolMsg = ctx.history[i] as any;\n const functionName = toolCallMap.get(toolMsg.tool_call_id);\n if (functionName) {\n let responseData;\n try {\n responseData = JSON.parse(toolMsg.content);\n } catch {\n responseData = { result: toolMsg.content };\n }\n responseParts.push({\n functionResponse: {\n name: functionName,\n response: responseData,\n },\n });\n }\n i++;\n }\n i--;\n\n if (responseParts.length > 0) {\n contents.push({ role: \"user\", parts: responseParts });\n }\n } else if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts: [{ text: msg.content }],\n });\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}${ctx.stream ? '&alt=sse' : ''}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 parts = candidate?.content?.parts || [];\n\n for (const part of parts) {\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 }\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, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"xai\");\n } catch {\n const key = process.env.XAI_API_KEY || \"\";\n if (!key) throw new Error(\"xAI API key not found\");\n return key;\n }\n};\n\nexport const callXAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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.x.ai/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`xAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleXAIStream(response, ctx);\n }\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 handleXAIStream = 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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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 { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\nimport { callXAI } from \"./xai\";\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 \"xai\":\n return callXAI(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 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 system,\n apiKey,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n system?: string | ((ctx: ConversationContext) => string);\n apiKey?: string;\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 or history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n let currentCtx = ctx;\n\n if (system) {\n const systemContent = typeof system === \"function\" ? system(currentCtx) : system;\n const [first, ...rest] = currentCtx.history;\n\n if (first?.role === \"system\") {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...rest],\n };\n } else {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...currentCtx.history],\n };\n }\n }\n\n const systemMessage = currentCtx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n do {\n if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema, apiKey },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\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 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 executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!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 if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\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 runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\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\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 runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\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 scopedCtx.abortSignal = ctx.abortSignal;\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","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","getApiKey","model","getApiKey","model","getApiKey","model","msg","appendToolCalls","getApiKey","model","model","model","maxCalls","error","results"]}
1
+ {"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/image.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/xai.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","../src/utils/rateLimited.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\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 const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const convertProperty = (prop: any): SchemaProperty => ({\n type: prop.type || \"string\",\n description: prop.description || \"\",\n ...(prop.enum && { enum: prop.enum }),\n ...(prop.items && { items: convertProperty(prop.items) }),\n ...(prop.properties && {\n properties: Object.fromEntries(\n Object.entries(prop.properties).map(([k, v]) => [k, convertProperty(v)])\n ),\n }),\n });\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 ...convertProperty(prop),\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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(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> | StandardSchema;\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 /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\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 abortSignal?: AbortSignal;\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: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n apiKey?: string;\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\nexport interface ImageConfig {\n n?: number;\n size?: string;\n quality?: \"standard\" | \"hd\" | \"low\" | \"medium\" | \"high\" | \"auto\";\n style?: \"vivid\" | \"natural\";\n responseFormat?: \"url\" | \"b64_json\";\n aspectRatio?: string;\n outputFormat?: \"png\" | \"jpeg\" | \"webp\";\n outputCompression?: number;\n background?: \"transparent\" | \"opaque\" | \"auto\";\n}\n\nexport interface ImageResult {\n data: string;\n revisedPrompt?: string;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(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 { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\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 body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\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 const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { ImageConfig, ImageResult } from \"./types\";\nimport { getKey, parseModelName } from \"./utils\";\n\nconst providerKeyEnvVars: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n xai: \"XAI_API_KEY\",\n google: \"GEMINI_API_KEY\",\n};\n\nconst getApiKey = (provider: string): string => {\n try {\n return getKey(provider);\n } catch {\n const envVar = providerKeyEnvVars[provider];\n const key = envVar ? process.env[envVar] || \"\" : \"\";\n if (!key) throw new Error(`No API key found for provider: ${provider}`);\n return key;\n }\n};\n\nconst generateOpenAICompatible = async (\n endpoint: string,\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const isGptImage = modelName.startsWith(\"gpt-image\");\n\n const body: Record<string, any> = {\n model: modelName,\n prompt,\n };\n\n if (!isGptImage) {\n body.response_format = config?.responseFormat || \"b64_json\";\n }\n\n if (config?.n) body.n = config.n;\n if (config?.size) body.size = config.size;\n if (config?.quality) body.quality = config.quality;\n if (config?.style && !isGptImage) body.style = config.style;\n\n if (isGptImage) {\n if (config?.outputFormat) body.output_format = config.outputFormat;\n if (config?.outputCompression != null) body.output_compression = config.outputCompression;\n if (config?.background) body.background = config.background;\n }\n\n const response = await fetch(endpoint, {\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(`API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const image = data.data[0];\n\n return {\n data: image.b64_json || image.url,\n revisedPrompt: image.revised_prompt,\n };\n};\n\nconst generateGoogle = async (\n modelName: string,\n prompt: string,\n apiKey: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${modelName}:generateContent`;\n\n const body: Record<string, any> = {\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n },\n };\n\n if (config?.aspectRatio) {\n body.generationConfig.aspectRatio = config.aspectRatio;\n }\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n const parts = data.candidates?.[0]?.content?.parts || [];\n\n const imagePart = parts.find((p: any) => p.inlineData);\n const textPart = parts.find((p: any) => p.text);\n\n if (!imagePart?.inlineData?.data) {\n throw new Error(\"No image data in response\");\n }\n\n return {\n data: imagePart.inlineData.data,\n revisedPrompt: textPart?.text,\n };\n};\n\nexport const generateImage = async (\n model: string,\n prompt: string,\n config?: ImageConfig,\n): Promise<ImageResult> => {\n const { provider, model: modelName } = parseModelName(model);\n const providerLower = provider.toLowerCase();\n const apiKey = getApiKey(providerLower);\n\n switch (providerLower) {\n case \"openai\":\n return generateOpenAICompatible(\n \"https://api.openai.com/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"xai\":\n return generateOpenAICompatible(\n \"https://api.x.ai/v1/images/generations\",\n modelName,\n prompt,\n apiKey,\n config,\n );\n\n case \"google\":\n return generateGoogle(modelName, prompt, apiKey, config);\n\n default:\n throw new Error(`Unsupported image generation provider: ${provider}`);\n }\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"openai\");\n } catch {\n const key = process.env.OPENAI_API_KEY || \"\";\n if (!key) throw new Error(\"OpenAI API key not found\");\n return key;\n }\n};\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, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"anthropic\");\n } catch {\n const key = process.env.ANTHROPIC_API_KEY || \"\";\n if (!key) throw new Error(\"Anthropic API key not found\");\n return key;\n }\n};\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\n\n let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\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 signal: ctx.abortSignal,\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\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.map(({ index, ...tc }) => tc);\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"google\");\n } catch {\n const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || \"\";\n if (!key) throw new Error(\"Google API key not found\");\n return key;\n }\n};\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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 const toolCallMap = new Map<string, string>();\n\n for (let i = 0; i < ctx.history.length; i++) {\n const msg = ctx.history[i] as any;\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n toolCallMap.set(tc.id, tc.function.name);\n const part: any = {\n functionCall: {\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n },\n };\n if (tc.thoughtSignature) {\n part.thoughtSignature = tc.thoughtSignature;\n }\n parts.push(part);\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const responseParts: any[] = [];\n\n while (i < ctx.history.length && (ctx.history[i] as any).role === \"tool\") {\n const toolMsg = ctx.history[i] as any;\n const functionName = toolCallMap.get(toolMsg.tool_call_id);\n if (functionName) {\n let responseData;\n try {\n responseData = JSON.parse(toolMsg.content);\n } catch {\n responseData = { result: toolMsg.content };\n }\n responseParts.push({\n functionResponse: {\n name: functionName,\n response: responseData,\n },\n });\n }\n i++;\n }\n i--;\n\n if (responseParts.length > 0) {\n contents.push({ role: \"user\", parts: responseParts });\n }\n } else if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts: [{ text: msg.content }],\n });\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}${ctx.stream ? '&alt=sse' : ''}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\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 parts = candidate.content.parts || [];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: \"\",\n };\n\n const toolCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n msg.content += part.text;\n }\n if (part.functionCall) {\n const tc: any = {\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 if (part.thoughtSignature) {\n tc.thoughtSignature = part.thoughtSignature;\n }\n toolCalls.push(tc);\n }\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\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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 parts = candidate?.content?.parts || [];\n\n for (const part of parts) {\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 const tc: any = {\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 if (part.thoughtSignature) {\n tc.thoughtSignature = part.thoughtSignature;\n }\n toolCalls.push(tc);\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, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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\nconst getApiKey = (configApiKey?: string): string => {\n if (configApiKey) return configApiKey;\n try {\n return getKey(\"xai\");\n } catch {\n const key = process.env.XAI_API_KEY || \"\";\n if (!key) throw new Error(\"xAI API key not found\");\n return key;\n }\n};\n\nexport const callXAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema, apiKey: configApiKey } = config;\n const apiKey = getApiKey(configApiKey);\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.x.ai/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`xAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleXAIStream(response, ctx);\n }\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 handleXAIStream = 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 if (ctx.abortSignal?.aborted) {\n break;\n }\n\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 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 { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\nimport { callXAI } from \"./xai\";\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 \"xai\":\n return callXAI(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 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 system,\n apiKey,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n system?: string | ((ctx: ConversationContext) => string);\n apiKey?: string;\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 or history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n let currentCtx = ctx;\n\n if (system) {\n const systemContent = typeof system === \"function\" ? system(currentCtx) : system;\n const [first, ...rest] = currentCtx.history;\n\n if (first?.role === \"system\") {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...rest],\n };\n } else {\n currentCtx = {\n ...currentCtx,\n history: [{ role: \"system\", content: systemContent }, ...currentCtx.history],\n };\n }\n }\n\n const systemMessage = currentCtx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n do {\n if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema, apiKey },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\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 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 executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!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 if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\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 runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\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\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 runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\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 scopedCtx.abortSignal = ctx.abortSignal;\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","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":";AACA,SAAS,SAAuB;AAEzB,IAAM,mBAAmB,CAAC,WAA0C;AACzE,SAAO,UAAU,OAAO,WAAW,YAAY,eAAe;AAChE;AAEO,IAAM,oCAAoC,CAC/C,gBACA,OAAe,aACA;AACf,QAAM,aAAa,EAAE,aAAa,cAAyB;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,+BAA+B,CAC1C,cACmC;AACnC,MAAI,CAAC,WAAW,WAAY,QAAO,CAAC;AAEpC,QAAM,kBAAkB,CAAC,UAA+B;AAAA,IACtD,MAAM,KAAK,QAAQ;AAAA,IACnB,aAAa,KAAK,eAAe;AAAA,IACjC,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,KAAK;AAAA,IACnC,GAAI,KAAK,SAAS,EAAE,OAAO,gBAAgB,KAAK,KAAK,EAAE;AAAA,IACvD,GAAI,KAAK,cAAc;AAAA,MACrB,YAAY,OAAO;AAAA,QACjB,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC/D,UAAM,OAAO;AACb,WAAO,GAAG,IAAI;AAAA,MACZ,GAAG,gBAAgB,IAAI;AAAA,MACvB,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;AAEO,IAAM,0CAA0C,CACrD,mBACmC;AACnC,QAAM,aAAa,EAAE,aAAa,cAAyB;AAC3D,SAAO,6BAA6B,UAAU;AAChD;;;ACzDO,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;;;ACkEO,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;;;AC7FL,IAAM,6BAA6B,CACxC,SACmB;AACnB,QAAM,SAAS,iBAAiB,KAAK,MAAM,IACvC,wCAAwC,KAAK,MAAM,IACnD,KAAK;AAET,QAAM,aAAkC,CAAC;AACzC,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChD,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;AAEpB,IAAM,UAAU,CAAC,SAAwB;AAC9C,eAAa,EAAE,GAAG,YAAY,GAAG,KAAK;AACxC;AAEO,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;AAEO,IAAM,WAAW,CAAC,YAAwBC,eAAkC;AAAA,EACjF,GAAG;AAAA,EACH,WAAWA;AACb;;;AC/FA,IAAM,aAAa,oBAAI,IAAiB;AAYjC,IAAM,QAAQ,OACnBC,QACA,MACA,WACsB;AACtB,MAAIA,OAAM,WAAW,SAAS,GAAG;AAC/B,UAAM,YAAYA,OAAM,QAAQ,WAAW,EAAE;AAC7C,UAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAY;AAAA,MAChB,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,OAAO;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM,MAAM,wCAAwC;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,MAAM;AAAA,MACjC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,IAC9C;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK,KAAK,CAAC,EAAE;AAAA,EACtB;AAEA,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,2BAA2B;AAE7D,QAAI,CAAC,WAAW,IAAIA,MAAK,GAAG;AAC1B,YAAMC,aAAY,MAAM,SAAS,sBAAsBD,QAAO;AAAA,QAC5D,OAAO;AAAA,MACT,CAAC;AACD,iBAAW,IAAIA,QAAOC,UAAS;AAAA,IACjC;AAEA,UAAM,YAAY,WAAW,IAAID,MAAK;AACtC,UAAM,SAAS,MAAM,UAAU,MAAM,EAAE,SAAS,QAAQ,WAAW,KAAK,CAAC;AACzE,WAAO,MAAM,KAAK,OAAO,IAAI;AAAA,EAC/B,SAAS,OAAY;AACnB,UAAM,IAAI;AAAA,MACR,sHAAsH,MAAM,OAAO;AAAA,IACrI;AAAA,EACF;AACF;;;ACrEA,IAAM,qBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,YAAY,CAAC,aAA6B;AAC9C,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,SAAS,mBAAmB,QAAQ;AAC1C,UAAM,MAAM,SAAS,QAAQ,IAAI,MAAM,KAAK,KAAK;AACjD,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kCAAkC,QAAQ,EAAE;AACtE,WAAO;AAAA,EACT;AACF;AAEA,IAAM,2BAA2B,OAC/B,UACA,WACA,QACA,QACA,WACyB;AACzB,QAAM,aAAa,UAAU,WAAW,WAAW;AAEnD,QAAM,OAA4B;AAAA,IAChC,OAAO;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,SAAK,kBAAkB,QAAQ,kBAAkB;AAAA,EACnD;AAEA,MAAI,QAAQ,EAAG,MAAK,IAAI,OAAO;AAC/B,MAAI,QAAQ,KAAM,MAAK,OAAO,OAAO;AACrC,MAAI,QAAQ,QAAS,MAAK,UAAU,OAAO;AAC3C,MAAI,QAAQ,SAAS,CAAC,WAAY,MAAK,QAAQ,OAAO;AAEtD,MAAI,YAAY;AACd,QAAI,QAAQ,aAAc,MAAK,gBAAgB,OAAO;AACtD,QAAI,QAAQ,qBAAqB,KAAM,MAAK,qBAAqB,OAAO;AACxE,QAAI,QAAQ,WAAY,MAAK,aAAa,OAAO;AAAA,EACnD;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,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,cAAc,KAAK,EAAE;AAAA,EACvC;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,QAAQ,KAAK,KAAK,CAAC;AAEzB,SAAO;AAAA,IACL,MAAM,MAAM,YAAY,MAAM;AAAA,IAC9B,eAAe,MAAM;AAAA,EACvB;AACF;AAEA,IAAM,iBAAiB,OACrB,WACA,QACA,QACA,WACyB;AACzB,QAAM,WAAW,2DAA2D,SAAS;AAErF,QAAM,OAA4B;AAAA,IAChC,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAAA,IACxC,kBAAkB;AAAA,MAChB,oBAAoB,CAAC,QAAQ,OAAO;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,SAAK,iBAAiB,cAAc,OAAO;AAAA,EAC7C;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB;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,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,QAAQ,KAAK,aAAa,CAAC,GAAG,SAAS,SAAS,CAAC;AAEvD,QAAM,YAAY,MAAM,KAAK,CAAC,MAAW,EAAE,UAAU;AACrD,QAAM,WAAW,MAAM,KAAK,CAAC,MAAW,EAAE,IAAI;AAE9C,MAAI,CAAC,WAAW,YAAY,MAAM;AAChC,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,MAAM,UAAU,WAAW;AAAA,IAC3B,eAAe,UAAU;AAAA,EAC3B;AACF;AAEO,IAAM,gBAAgB,OAC3BE,QACA,QACA,WACyB;AACzB,QAAM,EAAE,UAAU,OAAO,UAAU,IAAI,eAAeA,MAAK;AAC3D,QAAM,gBAAgB,SAAS,YAAY;AAC3C,QAAM,SAAS,UAAU,aAAa;AAEtC,UAAQ,eAAe;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,eAAe,WAAW,QAAQ,QAAQ,MAAM;AAAA,IAEzD;AACE,YAAM,IAAI,MAAM,0CAA0C,QAAQ,EAAE;AAAA,EACxE;AACF;;;ACxJA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0BAA0B;AACpD,WAAO;AAAA,EACT;AACF;AAKA,IAAM,kBAAkB,CAAC,WAAkB,gBAA8B;AACvE,aAAW,WAAW,aAAa;AACjC,WAAO,UAAU,UAAU,QAAQ,OAAO;AACxC,gBAAU,KAAK;AAAA,QACb,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,IAAI,WAAW,GAAG;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,KAAK,UAAU,QAAQ,KAAK;AAClC,OAAG,MAAM,QAAQ,MAAM;AACvB,OAAG,SAAS,QAAQ,QAAQ,UAAU,QAAQ;AAC9C,OAAG,SAAS,aAAa,QAAQ,UAAU,aAAa;AAAA,EAC1D;AACA,SAAO;AACT;AAEO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,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,OAAAC;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,IACzB,QAAQ,IAAI;AAAA,EACd,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,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,SAAS,SAAU;AACvB,cAAI,CAAC,KAAM;AAEX,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,0BAAY,gBAAgB,WAAW,MAAM,UAAU;AAAA,YACzD;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;;;AC9KA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,qBAAqB;AAC7C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,WAAO;AAAA,EACT;AACF;AAEA,IAAM,2BAA2B,CAAC,aAA2B;AAC3D,QAAM,SAAgB,CAAC;AACvB,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,MAAM,SAAS,CAAC;AAEtB,QAAI,IAAI,SAAS,UAAU;AACzB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,aAAa;AAC5B,UAAI,IAAI,YAAY;AAClB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,IAAI,WAAW,IAAI,CAAC,QAAa;AAAA,YACxC,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG,SAAS;AAAA,YAClB,OAAO,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,UACzC,EAAE;AAAA,QACJ,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,QACf,CAAC;AAAA,MACH;AACA;AAAA,IACF,WAAW,IAAI,SAAS,QAAQ;AAC9B,YAAM,cAAqB,CAAC;AAC5B,aAAO,IAAI,SAAS,UAAU,SAAS,CAAC,EAAE,SAAS,QAAQ;AACzD,cAAM,UAAU,SAAS,CAAC;AAC1B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,QAAQ;AAAA,QACnB,CAAC;AACD;AAAA,MACF;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,GAAG;AACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,OAC3B,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,MAAI,SAAS;AAEb,MAAI,IAAI,QAAQ,CAAC,GAAG,SAAS,UAAU;AACrC,aAAS,IAAI,QAAQ,CAAC,EAAE;AAAA,EAC1B;AAEA,QAAM,WAAW,yBAAyB,IAAI,OAAO;AAErD,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,OAAAC;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,IACzB,QAAQ,IAAI;AAAA,EACd,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;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,CAAC,KAAM;AAEX,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;AAAA,gBACb;AAAA,gBACA,OAAO,OAAO;AAAA,cAChB,CAAC;AAAA,YACH;AAEA,gBACE,OAAO,SAAS,yBAChB,OAAO,OAAO,SAAS,oBACvB;AACA,oBAAM,WAAW,UAAU,KAAK,CAAC,OAAO,GAAG,UAAU,OAAO,KAAK;AACjE,kBAAI,UAAU;AACZ,yBAAS,SAAS,aAAa,OAAO,MAAM;AAAA,cAC9C;AAAA,YACF;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,UAAU,IAAI,CAAC,EAAE,OAAO,GAAG,GAAG,MAAM,EAAE;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;ACpPA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,QAAQ;AAAA,EACxB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,qBAAqB;AAC3E,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0BAA0B;AACpD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,aAAa,IAAI;AACtD,QAAM,SAASD,WAAU,YAAY;AAErC,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,QAAM,cAAc,oBAAI,IAAoB;AAE5C,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;AAC3C,UAAME,OAAM,IAAI,QAAQ,CAAC;AAEzB,QAAIA,KAAI,SAAS,aAAa;AAC5B,YAAMC,SAAe,CAAC;AAEtB,UAAID,KAAI,SAAS;AACf,QAAAC,OAAM,KAAK,EAAE,MAAMD,KAAI,QAAQ,CAAC;AAAA,MAClC;AAEA,UAAIA,KAAI,YAAY,QAAQ;AAC1B,mBAAW,MAAMA,KAAI,YAAY;AAC/B,sBAAY,IAAI,GAAG,IAAI,GAAG,SAAS,IAAI;AACvC,gBAAM,OAAY;AAAA,YAChB,cAAc;AAAA,cACZ,MAAM,GAAG,SAAS;AAAA,cAClB,MAAM,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,YACxC;AAAA,UACF;AACA,cAAI,GAAG,kBAAkB;AACvB,iBAAK,mBAAmB,GAAG;AAAA,UAC7B;AACA,UAAAC,OAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAEA,UAAIA,OAAM,SAAS,GAAG;AACpB,iBAAS,KAAK,EAAE,MAAM,SAAS,OAAAA,OAAM,CAAC;AAAA,MACxC;AAAA,IACF,WAAWD,KAAI,SAAS,QAAQ;AAC9B,YAAM,gBAAuB,CAAC;AAE9B,aAAO,IAAI,IAAI,QAAQ,UAAW,IAAI,QAAQ,CAAC,EAAU,SAAS,QAAQ;AACxE,cAAM,UAAU,IAAI,QAAQ,CAAC;AAC7B,cAAM,eAAe,YAAY,IAAI,QAAQ,YAAY;AACzD,YAAI,cAAc;AAChB,cAAI;AACJ,cAAI;AACF,2BAAe,KAAK,MAAM,QAAQ,OAAO;AAAA,UAC3C,QAAQ;AACN,2BAAe,EAAE,QAAQ,QAAQ,QAAQ;AAAA,UAC3C;AACA,wBAAc,KAAK;AAAA,YACjB,kBAAkB;AAAA,cAChB,MAAM;AAAA,cACN,UAAU;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA;AAEA,UAAI,cAAc,SAAS,GAAG;AAC5B,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,cAAc,CAAC;AAAA,MACtD;AAAA,IACF,WAAWA,KAAI,SAAS,QAAQ;AAC9B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAMA,KAAI,QAAQ,CAAC;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;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,GAAG,IAAI,SAAS,aAAa,EAAE;AAAA,IACzH;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,IAAI;AAAA,IACd;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,QAAQ,UAAU,QAAQ,SAAS,CAAC;AAE1C,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,QAAM,YAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,MAAM;AACb,UAAI,WAAW,KAAK;AAAA,IACtB;AACA,QAAI,KAAK,cAAc;AACrB,YAAM,KAAU;AAAA,QACd,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;AACA,UAAI,KAAK,kBAAkB;AACzB,WAAG,mBAAmB,KAAK;AAAA,MAC7B;AACA,gBAAU,KAAK,EAAE;AAAA,IACnB;AAAA,EACF;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;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,CAAC,KAAM;AAEX,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,YAAY,OAAO,aAAa,CAAC;AACvC,kBAAM,QAAQ,WAAW,SAAS,SAAS,CAAC;AAE5C,uBAAW,QAAQ,OAAO;AACxB,kBAAI,MAAM,MAAM;AACd,+BAAe,KAAK;AACpB,oBAAI,IAAI,QAAQ;AACd,sBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,KAAK,KAAK,CAAC;AAAA,gBACpD;AAAA,cACF;AAEA,kBAAI,MAAM,cAAc;AACtB,sBAAM,KAAU;AAAA,kBACd,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,kBAC7C,MAAM;AAAA,kBACN,UAAU;AAAA,oBACR,MAAM,KAAK,aAAa;AAAA,oBACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,kBAClD;AAAA,gBACF;AACA,oBAAI,KAAK,kBAAkB;AACzB,qBAAG,mBAAmB,KAAK;AAAA,gBAC7B;AACA,0BAAU,KAAK,EAAE;AAAA,cACnB;AAAA,YACF;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;;;ACpQO,IAAM,kBAAkB,OAC7B,QACA,QACiC;AACjC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;ACNA,IAAMG,mBAAkB,CAAC,WAAkB,gBAA8B;AACvE,aAAW,WAAW,aAAa;AACjC,WAAO,UAAU,UAAU,QAAQ,OAAO;AACxC,gBAAU,KAAK;AAAA,QACb,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,IAAI,WAAW,GAAG;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,KAAK,UAAU,QAAQ,KAAK;AAClC,OAAG,MAAM,QAAQ,MAAM;AACvB,OAAG,SAAS,QAAQ,QAAQ,UAAU,QAAQ;AAC9C,OAAG,SAAS,aAAa,QAAQ,UAAU,aAAa;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAMC,aAAY,CAAC,iBAAkC;AACnD,MAAI,aAAc,QAAO;AACzB,MAAI;AACF,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,MAAM,QAAQ,IAAI,eAAe;AACvC,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uBAAuB;AACjD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,UAAU,OACrB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,QAAQ,QAAQ,aAAa,IAAI;AAC9D,QAAM,SAASD,WAAU,YAAY;AAErC,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,OAAAC;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,wCAAwC;AAAA,IACnE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,IAAI;AAAA,EACd,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAAA,EAC3C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,gBAAgB,UAAU,GAAG;AAAA,EACtC;AAEA,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,kBAAkB,OACtB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,MAAI,YAAmB,CAAC;AACxB,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,IAAI,aAAa,SAAS;AAC5B;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,SAAS,SAAU;AACvB,cAAI,CAAC,KAAM;AAEX,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,0BAAYF,iBAAgB,WAAW,MAAM,UAAU;AAAA,YACzD;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,eAAe,OAC1B,QACA,QACiC;AACjC,QAAM,EAAE,UAAU,OAAAG,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;AACH,aAAO,QAAQ,gBAAgB,GAAG;AAAA,IACpC,KAAK;AAAA,IACL;AACE,aAAO,gBAAgB,gBAAgB,GAAG;AAAA,EAC9C;AACF;;;AC5BA,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;;;AC3DO,IAAM,QAAQ,CAAC;AAAA,EACpB,OAAAC,SAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,IAKI,CAAC,MAAwB;AAC3B,SAAO,OACL,iBACiC;AACjC,UAAM,MACJ,OAAO,iBAAiB;AAAA;AAAA,MAEpB;AAAA,QACE,SAAS,CAAC,EAAE,MAAM,QAAiB,SAAS,aAAa,CAAC;AAAA,QAC1D,OAAO,CAAC;AAAA,MACV;AAAA;AAAA;AAAA,MAEA;AAAA;AACN,UAAM,mBAAmB,SAAS,gBAAgB,MAAM,IAAI;AAE5D,QAAI,aAAa;AAEjB,QAAI,QAAQ;AACV,YAAM,gBAAgB,OAAO,WAAW,aAAa,OAAO,UAAU,IAAI;AAC1E,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI,WAAW;AAEpC,UAAI,OAAO,SAAS,UAAU;AAC5B,qBAAa;AAAA,UACX,GAAG;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,cAAc,GAAG,GAAG,IAAI;AAAA,QAC/D;AAAA,MACF,OAAO;AACL,qBAAa;AAAA,UACX,GAAG;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,cAAc,GAAG,GAAG,WAAW,OAAO;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACxE,UAAM,eAAe,eAAe;AAEpC,OAAG;AACD,UAAI,WAAW,aAAa,SAAS;AACnC;AAAA,MACF;AAEA,mBAAa,MAAM;AAAA,QACjB,EAAE,OAAAA,QAAO,cAAc,QAAQ,kBAAkB,OAAO;AAAA,QACxD;AAAA,MACF;AAEA,UAAI,WAAW,cAAc,cAAc,WAAW,OAAO,QAAQ;AACnE,qBAAa,MAAM,aAAa,UAAU;AAAA,MAC5C;AAAA,IACF,SACE,WAAW,cAAc,cACzB,WAAW,OAAO,UAClB,CAAC,WAAW,aAAa;AAG3B,WAAO;AAAA,EACT;AACF;AAEA,IAAM,eAAe,OACnB,QACiC;AACjC,QAAM,QAAQ,IAAI,cAAc,cAAc,CAAC;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,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,IACA,oBAAoB;AAAA,EACtB,IAAI;AAEJ,QAAM,gBAAgB,EAAE,GAAI,IAAI,kBAAkB,CAAC,EAAG;AAEtD,QAAM,UAAU,OAAO,MAAgB,aAAsB;AAC3D,QAAI,CAAC,UAAU;AACb,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;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,UAAMC,YAAW,OAAO,QAAQ;AAChC,UAAM,eAAe,cAAc,QAAQ,KAAK;AAEhD,QAAIA,aAAY,gBAAgBA,WAAU;AACxC,YAAMC,SAAQ,QAAQ,QAAQ,6BAA6BD,SAAQ;AACnE,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO,EAAE,MAAM,cAAc,MAAM,OAAAC,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,MAAI,qBAAqB,iBAAiB;AACxC,UAAM,iBAAiB,MAAM,IAAI,OAAO,SAAS;AAC/C,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,QAAQ,MAAM,QAAQ;AAAA,IAC/B,CAAC;AAED,UAAMC,WAAU,MAAM,QAAQ,IAAI,cAAc;AAEhD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,IAAI;AAAA,QACP,GAAGA,SAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,UACpC,MAAM;AAAA,UACN,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK,UAAU,MAAM;AAAA,QAChC,EAAE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,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,sBAAsB,OAAO,SAAmB;AACpD,UAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,EAAE;AAC5D,WAAO,QAAQ,MAAM,UAAU,YAAY,IAAI;AAAA,EACjD;AAEA,QAAM,UAAU,WACZ,MAAM,QAAQ,IAAI,MAAM,IAAI,mBAAmB,CAAC,IAChD,MAAM,qBAAqB,OAAO,mBAAmB;AAEzD,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;;;ACtPA,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,UAAU,oBAAI,IAAoB;AAwBjC,IAAM,oBAAoB,CAAC,IAAY,UAAgC;AAC5E,QAAM,WAAW,QAAQ,GAAG,EAAE,IAAI,KAAK,KAAK;AAE5C,MAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AAEA,QAAM,cAAc,SAAS,kBAAkB;AAC/C,QAAM,SAAS,aAAa,IAAI,WAAW;AAC3C,UAAQ,IAAI,UAAU,MAAM;AAC5B,SAAO;AACT;;;ACjGO,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,iBAA6E;AACzF,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;AACvB,YAAU,cAAc,IAAI;AAE5B,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,MAAI,OAAO,QAAQ;AACjB,cAAU,SAAS,OAAO;AAAA,EAC5B;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;;;ACjFO,IAAM,cACX,CAAC,WACD,CAA6C,OAAa;AACxD,QAAM,EAAE,KAAK,OAAO,YAAY,IAAI;AAEpC,MAAI,SAAS;AACb,MAAI,WAAW;AACf,QAAM,QAAqB,CAAC;AAC5B,MAAI,aAAoC;AAExC,QAAM,eAAe,MAAM;AACzB,aAAS,KAAK,IAAI,SAAS,GAAG,KAAK;AACnC,iBAAa;AAAA,EACf;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,YAAY;AACf,mBAAa,YAAY,cAAc,MAAO,GAAG;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,cAAc,MAAM,WAAW,KAAK,aAAa,GAAG;AACtD,oBAAc,UAAU;AACxB,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,WAAO,MAAM,SAAS,KAAK,SAAS,KAAK,WAAW,aAAa;AAC/D;AACA;AAEA,YAAM,OAAO,MAAM,MAAM;AAEzB,WACG,GAAG,EACH,KAAK,CAAC,WAAW;AAChB;AACA,aAAK,QAAQ,MAAM;AACnB,qBAAa;AACb,qBAAa;AAAA,MACf,CAAC,EACA,MAAM,CAAC,UAAU;AAChB;AACA,aAAK,OAAO,KAAK;AACjB,qBAAa;AACb,qBAAa;AAAA,MACf,CAAC;AAAA,IACL;AAAA,EACF;AAEA,UAAQ,UAAU,SAAgB;AAChC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK;AAAA,QACT,IAAI,MAAM,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF,CAAC;AACD,oBAAc;AACd,mBAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":["Inherit","model","maxCalls","model","extractor","model","getApiKey","model","getApiKey","model","getApiKey","model","msg","parts","appendToolCalls","getApiKey","model","model","model","maxCalls","error","results"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threaded/ai",
3
- "version": "1.0.12",
3
+ "version": "1.0.13",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "scripts": {