@threaded/ai 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +60 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -3
- package/dist/index.d.ts +26 -3
- package/dist/index.js +60 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -199,6 +199,22 @@ var maxCalls = (toolConfig, maxCalls2) => ({
|
|
|
199
199
|
});
|
|
200
200
|
|
|
201
201
|
// src/providers/openai.ts
|
|
202
|
+
var appendToolCalls = (toolCalls, tcchunklist) => {
|
|
203
|
+
for (const tcchunk of tcchunklist) {
|
|
204
|
+
while (toolCalls.length <= tcchunk.index) {
|
|
205
|
+
toolCalls.push({
|
|
206
|
+
id: "",
|
|
207
|
+
type: "function",
|
|
208
|
+
function: { name: "", arguments: "" }
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const tc = toolCalls[tcchunk.index];
|
|
212
|
+
tc.id += tcchunk.id || "";
|
|
213
|
+
tc.function.name += tcchunk.function?.name || "";
|
|
214
|
+
tc.function.arguments += tcchunk.function?.arguments || "";
|
|
215
|
+
}
|
|
216
|
+
return toolCalls;
|
|
217
|
+
};
|
|
202
218
|
var callOpenAI = async (config, ctx) => {
|
|
203
219
|
const { model: model2, instructions, schema } = config;
|
|
204
220
|
const apiKey = getKey("openai") || process.env.OPENAI_API_KEY;
|
|
@@ -265,17 +281,19 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
265
281
|
const decoder = new TextDecoder();
|
|
266
282
|
let fullContent = "";
|
|
267
283
|
let toolCalls = [];
|
|
268
|
-
|
|
284
|
+
let buffer = "";
|
|
269
285
|
try {
|
|
270
286
|
while (true) {
|
|
271
287
|
const { done, value } = await reader.read();
|
|
272
288
|
if (done) break;
|
|
273
|
-
|
|
274
|
-
const lines =
|
|
289
|
+
buffer += decoder.decode(value, { stream: true });
|
|
290
|
+
const lines = buffer.split("\n");
|
|
291
|
+
buffer = lines.pop() || "";
|
|
275
292
|
for (const line of lines) {
|
|
276
293
|
if (line.startsWith("data: ")) {
|
|
277
|
-
const data = line.slice(6);
|
|
294
|
+
const data = line.slice(6).trim();
|
|
278
295
|
if (data === "[DONE]") continue;
|
|
296
|
+
if (!data) continue;
|
|
279
297
|
try {
|
|
280
298
|
const parsed = JSON.parse(data);
|
|
281
299
|
const delta = parsed.choices?.[0]?.delta;
|
|
@@ -286,25 +304,7 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
286
304
|
}
|
|
287
305
|
}
|
|
288
306
|
if (delta?.tool_calls) {
|
|
289
|
-
|
|
290
|
-
const { index } = toolCall;
|
|
291
|
-
if (!toolCallsBuffer[index]) {
|
|
292
|
-
toolCallsBuffer[index] = {
|
|
293
|
-
id: toolCall.id || "",
|
|
294
|
-
type: "function",
|
|
295
|
-
function: { name: "", arguments: "" }
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
if (toolCall.id) {
|
|
299
|
-
toolCallsBuffer[index].id = toolCall.id;
|
|
300
|
-
}
|
|
301
|
-
if (toolCall.function?.name) {
|
|
302
|
-
toolCallsBuffer[index].function.name += toolCall.function.name;
|
|
303
|
-
}
|
|
304
|
-
if (toolCall.function?.arguments) {
|
|
305
|
-
toolCallsBuffer[index].function.arguments += toolCall.function.arguments;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
307
|
+
toolCalls = appendToolCalls(toolCalls, delta.tool_calls);
|
|
308
308
|
}
|
|
309
309
|
} catch (e) {
|
|
310
310
|
}
|
|
@@ -314,7 +314,6 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
314
314
|
} finally {
|
|
315
315
|
reader.releaseLock();
|
|
316
316
|
}
|
|
317
|
-
toolCalls = Object.values(toolCallsBuffer);
|
|
318
317
|
const msg = {
|
|
319
318
|
role: "assistant",
|
|
320
319
|
content: fullContent
|
|
@@ -416,15 +415,18 @@ var handleAnthropicStream = async (response, ctx) => {
|
|
|
416
415
|
const decoder = new TextDecoder();
|
|
417
416
|
let fullContent = "";
|
|
418
417
|
const toolCalls = [];
|
|
418
|
+
let buffer = "";
|
|
419
419
|
try {
|
|
420
420
|
while (true) {
|
|
421
421
|
const { done, value } = await reader.read();
|
|
422
422
|
if (done) break;
|
|
423
|
-
|
|
424
|
-
const lines =
|
|
423
|
+
buffer += decoder.decode(value, { stream: true });
|
|
424
|
+
const lines = buffer.split("\n");
|
|
425
|
+
buffer = lines.pop() || "";
|
|
425
426
|
for (const line of lines) {
|
|
426
427
|
if (line.startsWith("data: ")) {
|
|
427
|
-
const data = line.slice(6);
|
|
428
|
+
const data = line.slice(6).trim();
|
|
429
|
+
if (!data) continue;
|
|
428
430
|
try {
|
|
429
431
|
const parsed = JSON.parse(data);
|
|
430
432
|
if (parsed.type === "content_block_delta" && parsed.delta?.text) {
|
|
@@ -553,15 +555,18 @@ var handleGoogleStream = async (response, ctx) => {
|
|
|
553
555
|
const decoder = new TextDecoder();
|
|
554
556
|
let fullContent = "";
|
|
555
557
|
const toolCalls = [];
|
|
558
|
+
let buffer = "";
|
|
556
559
|
try {
|
|
557
560
|
while (true) {
|
|
558
561
|
const { done, value } = await reader.read();
|
|
559
562
|
if (done) break;
|
|
560
|
-
|
|
561
|
-
const lines =
|
|
563
|
+
buffer += decoder.decode(value, { stream: true });
|
|
564
|
+
const lines = buffer.split("\n");
|
|
565
|
+
buffer = lines.pop() || "";
|
|
562
566
|
for (const line of lines) {
|
|
563
567
|
if (line.startsWith("data: ")) {
|
|
564
|
-
const data = line.slice(6);
|
|
568
|
+
const data = line.slice(6).trim();
|
|
569
|
+
if (!data) continue;
|
|
565
570
|
try {
|
|
566
571
|
const parsed = JSON.parse(data);
|
|
567
572
|
const candidate = parsed.candidates?.[0];
|
|
@@ -669,10 +674,16 @@ var model = ({
|
|
|
669
674
|
schema
|
|
670
675
|
} = {}) => {
|
|
671
676
|
return async (ctxOrMessage) => {
|
|
672
|
-
const ctx = typeof ctxOrMessage === "string" ?
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
677
|
+
const ctx = typeof ctxOrMessage === "string" ? (
|
|
678
|
+
// model()("hello!");
|
|
679
|
+
{
|
|
680
|
+
history: [{ role: "user", content: ctxOrMessage }],
|
|
681
|
+
tools: []
|
|
682
|
+
}
|
|
683
|
+
) : (
|
|
684
|
+
// model()(/* few shot / history */);
|
|
685
|
+
ctxOrMessage
|
|
686
|
+
);
|
|
676
687
|
const normalizedSchema = schema ? normalizeSchema(schema) : void 0;
|
|
677
688
|
const systemMessage = ctx.history.find((m) => m.role === "system");
|
|
678
689
|
const instructions = systemMessage?.content;
|
|
@@ -723,7 +734,11 @@ var executeTools = async (ctx) => {
|
|
|
723
734
|
const approval = approvals.find((a) => a.call.id === call.id);
|
|
724
735
|
if (!approval?.approved) {
|
|
725
736
|
if (ctx.stream) {
|
|
726
|
-
ctx.stream({
|
|
737
|
+
ctx.stream({
|
|
738
|
+
type: "tool_error",
|
|
739
|
+
call,
|
|
740
|
+
error: "Tool execution denied by user"
|
|
741
|
+
});
|
|
727
742
|
}
|
|
728
743
|
return {
|
|
729
744
|
call,
|
|
@@ -844,14 +859,15 @@ var createThread = (id, store) => {
|
|
|
844
859
|
}
|
|
845
860
|
};
|
|
846
861
|
};
|
|
847
|
-
var defaultStore = createMemoryStore();
|
|
848
862
|
var threads = /* @__PURE__ */ new Map();
|
|
849
|
-
var getOrCreateThread = (id, store
|
|
850
|
-
|
|
851
|
-
|
|
863
|
+
var getOrCreateThread = (id, store) => {
|
|
864
|
+
const cacheKey = store ? `${id}-${store}` : id;
|
|
865
|
+
if (threads.has(cacheKey)) {
|
|
866
|
+
return threads.get(cacheKey);
|
|
852
867
|
}
|
|
853
|
-
const
|
|
854
|
-
|
|
868
|
+
const threadStore = store || createMemoryStore();
|
|
869
|
+
const thread = createThread(id, threadStore);
|
|
870
|
+
threads.set(cacheKey, thread);
|
|
855
871
|
return thread;
|
|
856
872
|
};
|
|
857
873
|
|
|
@@ -1082,6 +1098,9 @@ var scopeContext = (config, ctx) => {
|
|
|
1082
1098
|
scopedCtx.history = [{ role: "system", content: config.system }, ...scopedCtx.history];
|
|
1083
1099
|
}
|
|
1084
1100
|
}
|
|
1101
|
+
if (config.stream) {
|
|
1102
|
+
scopedCtx.stream = config.stream;
|
|
1103
|
+
}
|
|
1085
1104
|
return scopedCtx;
|
|
1086
1105
|
};
|
|
1087
1106
|
var scope = (config, ...steps) => {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\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 \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent = \n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage?: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n const toolCallsBuffer: Record<string, any> = {};\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n const { index } = toolCall;\n if (!toolCallsBuffer[index]) {\n toolCallsBuffer[index] = {\n id: toolCall.id || \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n };\n }\n\n if (toolCall.id) {\n toolCallsBuffer[index].id = toolCall.id;\n }\n if (toolCall.function?.name) {\n toolCallsBuffer[index].function.name +=\n toolCall.function.name;\n }\n if (toolCall.function?.arguments) {\n toolCallsBuffer[index].function.arguments +=\n toolCall.function.arguments;\n }\n }\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n // Convert tool calls buffer to array\n toolCalls = Object.values(toolCallsBuffer);\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport { ConversationContext, StepFunction, ToolCall } from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: { model?: string; schema?: any } = {}): StepFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : ctxOrMessage;\n\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: 'tool_calls_ready', calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error: 'Tool execution denied by user' });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: 'tool_executing', call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: 'tool_complete', call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n \n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst defaultStore = createMemoryStore();\nconst threads = new Map<string, Thread>();\n\nexport const getOrCreateThread = (\n id: string,\n store: ThreadStore = defaultStore,\n): Thread => {\n if (threads.has(id)) {\n return threads.get(id)!;\n }\n\n const thread = createThread(id, store);\n threads.set(id, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage?: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n \n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || { \n history: [], \n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","model","model","msg","model","model","maxCalls","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\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 \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\n// openai streams tool calls as incremental chunks with index properties that need assembly\n// example: {\"index\": 0, \"function\": {\"name\": \"get_wea\"}} then {\"index\": 0, \"function\": {\"arguments\": \"ther\"}}\n// google/anthropic send complete tool calls in single chunks, so they don't need this logic\nconst appendToolCalls = (toolCalls: any[], tcchunklist: any[]): any[] => {\n for (const tcchunk of tcchunklist) {\n while (toolCalls.length <= tcchunk.index) {\n toolCalls.push({\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n const tc = toolCalls[tcchunk.index];\n tc.id += tcchunk.id || \"\";\n tc.function.name += tcchunk.function?.name || \"\";\n tc.function.arguments += tcchunk.function?.arguments || \"\";\n }\n return toolCalls;\n};\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: \"content\", content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n toolCalls = appendToolCalls(toolCalls, delta.tool_calls);\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport {\n ConversationContext,\n StepFunction,\n ToolCall,\n JsonSchema,\n StandardSchema,\n ComposedFunction,\n} from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n} = {}): ComposedFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? // model()(\"hello!\");\n {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : // model()(/* few shot / history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;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;;;ACEO,IAAM,mBAAmB,CAAC,WAA0C;AACzE,SAAO,UAAU,OAAO,WAAW,YAAY,eAAe;AAChE;AAEO,IAAM,oCAAoC,CAC/C,gBACA,OAAe,aACA;AAEf,MAAI;AACF,UAAM,YAAY,QAAQ,KAAK;AAC/B,QAAI,aAAa,OAAO,UAAU,iBAAiB,YAAY;AAC7D,YAAM,aAAa,UAAU,aAAa,cAAc;AACxD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAAA,EAEhB;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAEO,IAAM,+BAA+B,CAC1C,cACmC;AACnC,MAAI,CAAC,WAAW,WAAY,QAAO,CAAC;AAEpC,QAAM,SAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC/D,UAAM,OAAO;AACb,WAAO,GAAG,IAAI;AAAA,MACZ,MAAM,KAAK,QAAQ;AAAA,MACnB,aAAa,KAAK,eAAe;AAAA,MACjC,UAAU,CAAC,UAAU,UAAU,SAAS,GAAG;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBACd,QACA,MACY;AACZ,MAAI,iBAAiB,MAAM,GAAG;AAC5B,WAAO,kCAAkC,QAAQ,IAAI;AAAA,EACvD;AACA,SAAO;AACT;;;ACnDO,IAAM,iBAAiB,OAAO,WAA0C;AAC7E,QAAM,aAAa,OAAO,iBAAiB;AAC3C,QAAM,aAAa,YAAY;AAE/B,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,iDAAiD;AAC/D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,MAAM,OAAO,UAAU;AAE7C,SAAO,cAAc,MAAM,IAAI,CAAC,YAAY;AAC1C,UAAM,eAAe,GAAG,UAAU,IAAI,QAAQ,IAAI;AAElD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,IAAI,UAAU,KAAK,QAAQ,eAAe,EAAE;AAAA,MACzD,QAAQ,6BAA6B,QAAQ,WAAW;AAAA,MACxD,SAAS,OAAO,SAAc;AAC5B,cAAM,SAAS,MAAM,OAAO,SAAS;AAAA,UACnC,MAAM,QAAQ;AAAA,UACd,WAAW;AAAA,QACb,CAAC;AACD,eACG,OAAO,WACN,MAAM,QAAQ,OAAO,OAAO,KAC5B,OAAO,QAAQ,CAAC,GAAG,QACrB,KAAK,UAAU,MAAM;AAAA,MAEzB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC4CO,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,kBAAA,aAAU,KAAV;AACA,EAAAA,kBAAA,kBAAe,KAAf;AACA,EAAAA,kBAAA,WAAQ,KAAR;AACA,EAAAA,kBAAA,SAAM,KAAN;AAJU,SAAAA;AAAA,GAAA;;;ACxEL,IAAM,6BAA6B,CACxC,SACmB;AACnB,QAAM,aAAkC,CAAC;AACzC,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACrD,eAAW,GAAG,IAAI,sBAAsB,IAAI;AAC5C,QAAI,CAAC,KAAK,UAAU;AAClB,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,GAAI,SAAS,SAAS,KAAK,EAAE,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB,CAAC,SAA8B;AAC3D,QAAM,SAAc;AAAA,IAClB,MAAM,KAAK;AAAA,EACb;AAEA,MAAI,KAAK,aAAa;AACpB,WAAO,cAAc,KAAK;AAAA,EAC5B;AAEA,MAAI,KAAK,MAAM;AACb,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,KAAK,OAAO;AACd,WAAO,QAAQ,sBAAsB,KAAK,KAAK;AAAA,EACjD;AAEA,MAAI,KAAK,YAAY;AACnB,WAAO,aAAa,CAAC;AACrB,eAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC9D,aAAO,WAAW,GAAG,IAAI,sBAAsB,SAAS;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAACC,WAA+B;AAC5D,QAAM,QAAQA,OAAM,MAAM,GAAG;AAE7B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,UAAU,eAAe,OAAO,MAAM,CAAC,EAAE;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,UAAU,MAAM,CAAC;AAAA,IACjB,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAChC;AACF;AAEA,IAAI,aAAsB,CAAC;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;;;ACtFA,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,OAAO,IAAI;AACxC,QAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,WAAW,CAAC;AAClB,MAAI,cAAc;AAChB,aAAS,KAAK,EAAE,MAAM,UAAU,SAAS,aAAa,CAAC;AAAA,EACzD;AACA,WAAS,KAAK,GAAG,IAAI,OAAO;AAE5B,QAAM,OAAY;AAAA,IAChB,OAAAA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC,CAAC,IAAI;AAAA,EAChB;AAEA,MAAI,QAAQ;AACV,SAAK,kBAAkB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,QAAQ,EAAE,GAAG,OAAO,QAAQ,sBAAsB,MAAM;AAAA,QACxD,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ,IAAI;AACjB,SAAK,cAAc;AAAA,EACrB;AAEA,QAAM,WAAW,MAAM,MAAM,8CAA8C;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAC9C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,mBAAmB,UAAU,GAAG;AAAA,EACzC;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,QAAQ,WAAW;AAAA,EAC9B;AAEA,MAAI,QAAQ,YAAY;AACtB,QAAI,aAAa,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,MAAI,YAAmB,CAAC;AACxB,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,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;;;AClKO,IAAM,gBAAgB,OAC3B,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,cAAc,OAAO,IAAI;AACxC,QAAM,SAAS,OAAO,WAAW,KAAK,QAAQ,IAAI;AAElD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,QAAM,WAAW,CAAC,GAAG,IAAI,OAAO;AAChC,MAAI,SAAS;AAGb,MAAI,SAAS,CAAC,GAAG,SAAS,UAAU;AAClC,aAAS,SAAS,CAAC,EAAE;AACrB,aAAS,MAAM;AAAA,EACjB;AAEA,MAAI,QAAQ;AACV,UAAM,eAAe;AAAA;AAAA;AAAA,EAAmE,KAAK;AAAA,MAC3F,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;AACD,aAAS,SAAS,SAAS,eAAe,aAAa,MAAM,CAAC;AAAA,EAChE;AAEA,QAAM,OAAY;AAAA,IAChB,OAAAA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ,CAAC,CAAC,IAAI;AAAA,EAChB;AAEA,MAAI,QAAQ;AACV,SAAK,SAAS;AAAA,EAChB;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,MACpC,MAAM,KAAK,SAAS;AAAA,MACpB,aAAa,KAAK,SAAS;AAAA,MAC3B,cAAc,KAAK,SAAS;AAAA,IAC9B,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,MAAM,MAAM,yCAAyC;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,qBAAqB;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,EACjD;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,sBAAsB,UAAU,GAAG;AAAA,EAC5C;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,UAAU,KAAK,QAAQ,CAAC;AAE9B,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,QAAQ,SAAS,SAAS,QAAQ,OAAO;AAAA,EACpD;AAEA,MAAI,QAAQ,SAAS,YAAY;AAC/B,QAAI,aAAa;AAAA,MACf;AAAA,QACE,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,QAAQ;AAAA,UACd,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,wBAAwB,OAC5B,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,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;AAE9B,gBAAI,OAAO,SAAS,yBAAyB,OAAO,OAAO,MAAM;AAC/D,6BAAe,OAAO,MAAM;AAC5B,kBAAI,IAAI,QAAQ;AACd,oBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,cAC5D;AAAA,YACF;AAEA,gBACE,OAAO,SAAS,yBAChB,OAAO,eAAe,SAAS,YAC/B;AACA,oBAAM,UAAU,OAAO;AACvB,wBAAU,KAAK;AAAA,gBACb,IAAI,QAAQ;AAAA,gBACZ,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,QAAQ;AAAA,kBACd,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,gBACzC;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI,aAAa;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;ACzKO,IAAM,aAAa,OACxB,QACA,QACiC;AACjC,QAAM,EAAE,OAAAC,QAAO,aAAa,IAAI;AAChC,QAAM,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI;AAE/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,WAAW,CAAC;AAElB,MAAI,cAAc;AAChB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;AAAA,IAChC,CAAC;AACD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,gBAAgB,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,aAAWC,QAAO,IAAI,SAAS;AAC7B,UAAM,OAAOA,KAAI,SAAS,cAAc,UAAU;AAClD,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,OAAO,CAAC,EAAE,MAAMA,KAAI,QAAQ,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,OAAY;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,SAAK,QAAQ;AAAA,MACX;AAAA,QACE,uBAAuB,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,UAC9C,MAAM,KAAK,SAAS;AAAA,UACpB,aAAa,KAAK,SAAS;AAAA,UAC3B,YAAY,KAAK,SAAS;AAAA,QAC5B,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,SAAS,0BAA0B;AACxD,QAAM,WAAW,MAAM;AAAA,IACrB,2DAA2DD,MAAK,IAAI,QAAQ,QAAQ,MAAM;AAAA,IAC1F;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAC9C;AAEA,MAAI,IAAI,QAAQ;AACd,WAAO,mBAAmB,UAAU,GAAG;AAAA,EACzC;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,YAAY,KAAK,WAAW,CAAC;AACnC,QAAM,OAAO,UAAU,QAAQ,MAAM,CAAC;AAEtC,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,KAAK,QAAQ;AAAA,EACxB;AAEA,MAAI,KAAK,cAAc;AACrB,QAAI,aAAa;AAAA,MACf;AAAA,QACE,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,QAC7C,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK,aAAa;AAAA,UACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;AAEA,IAAM,qBAAqB,OACzB,UACA,QACiC;AACjC,QAAM,SAAS,SAAS,KAAM,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI,cAAc;AAClB,QAAM,YAAmB,CAAC;AAC1B,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,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,OAAO,WAAW,SAAS,QAAQ,CAAC;AAE1C,gBAAI,MAAM,MAAM;AACd,6BAAe,KAAK;AACpB,kBAAI,IAAI,QAAQ;AACd,oBAAI,OAAO,EAAE,MAAM,WAAW,SAAS,KAAK,KAAK,CAAC;AAAA,cACpD;AAAA,YACF;AAEA,gBAAI,MAAM,cAAc;AACtB,wBAAU,KAAK;AAAA,gBACb,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA,gBAC7C,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,KAAK,aAAa;AAAA,kBACxB,WAAW,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,gBAClD;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,MAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI,aAAa;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,CAAC,GAAG,IAAI,SAAS,GAAG;AAAA,EAC/B;AACF;;;AC3KO,IAAM,kBAAkB,OAC7B,QACA,QACiC;AACjC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;ACFO,IAAM,eAAe,OAC1B,QACA,QACiC;AACjC,QAAM,EAAE,UAAU,OAAAE,OAAM,IAAI,eAAe,OAAO,KAAK;AACvD,QAAM,iBAAiB,EAAE,GAAG,QAAQ,OAAAA,OAAM;AAE1C,UAAQ,SAAS,YAAY,GAAG;AAAA,IAC9B,KAAK;AACH,aAAO,WAAW,gBAAgB,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,cAAc,gBAAgB,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO,WAAW,gBAAgB,GAAG;AAAA,IACvC,KAAK;AAAA,IACL;AACE,aAAO,gBAAgB,gBAAgB,GAAG;AAAA,EAC9C;AACF;;;ACzBA,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;;;AC1DO,IAAM,QAAQ,CAAC;AAAA,EACpB,OAAAC,SAAQ;AAAA,EACR;AACF,IAGI,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;AAC5D,UAAM,gBAAgB,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACjE,UAAM,eAAe,eAAe;AACpC,QAAI,aAAa;AAEjB,OAAG;AACD,mBAAa,MAAM;AAAA,QACjB,EAAE,OAAAA,QAAO,cAAc,QAAQ,iBAAiB;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,WAAW,cAAc,cAAc,WAAW,OAAO,QAAQ;AACnE,qBAAa,MAAM,aAAa,UAAU;AAAA,MAC5C;AAAA,IACF,SAAS,WAAW,cAAc,cAAc,WAAW,OAAO;AAElE,WAAO;AAAA,EACT;AACF;AAEA,IAAM,eAAe,OACnB,QACiC;AACjC,QAAM,QAAQ,IAAI,cAAc,cAAc,CAAC;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAG1B,MAAI,IAAI,QAAQ;AACd,QAAI,OAAO,EAAE,MAAM,oBAAoB,MAAM,CAAC;AAAA,EAChD;AAEA,QAAM,aAAa,IAAI,cAAc,CAAC;AACtC,QAAM;AAAA,IACJ,kBAAkB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,mBAAmB,MAAM,IAAI,OAAO,SAAS;AACjD,QAAI,iBAAiB;AACnB,UAAI;AAEJ,UAAI,kBAAkB;AACpB,mBAAW,MAAM,iBAAiB,IAAI;AAAA,MACxC,OAAO;AACL,cAAM,WAAW,MAAM,gBAAgB,MAAM,UAAU;AACvD,mBAAW,SAAS;AAAA,MACtB;AAEA,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B,OAAO;AACL,aAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAED,QAAM,YAAY,MAAM,QAAQ,IAAI,gBAAgB;AAEpD,QAAM,gBAAgB,EAAE,GAAI,IAAI,kBAAkB,CAAC,EAAG;AAEtD,QAAM,UAAU,OAAO,SAAmB;AACxC,UAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,EAAE;AAE5D,QAAI,CAAC,UAAU,UAAU;AACvB,UAAI,IAAI,QAAQ;AACd,YAAI,OAAO;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,QAAM,UAAU,WACZ,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,CAAC,IACpC,MAAM,qBAAqB,OAAO,OAAO;AAE7C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,IAAI;AAAA,MACP,GAAG,QAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,QACpC,MAAM;AAAA,QACN,cAAc,KAAK;AAAA,QACnB,SAAS,KAAK,UAAU,MAAM;AAAA,MAChC,EAAE;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,uBAAuB,OAC3B,OACA,YACG;AACH,QAAM,UAA6C,CAAC;AACpD,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,EAClC;AACA,SAAO;AACT;;;ACvLA,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;AAEvB,MAAI,OAAO,OAAO;AAChB,UAAM,kBAAkB,OAAO,MAAM,IAAI,0BAA0B;AACnE,UAAM,gBAAgB,OAAO,MAAM;AAAA,MACjC,CAAC,KAAK,SAAS;AACb,YAAI,KAAK,IAAI,IAAI,KAAK;AAEtB,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AACA,UAAM,aAAa,OAAO,MAAM;AAAA,MAC9B,CAAC,KAAK,SAAS;AACb,YAAI,KAAK,WAAW;AAClB,cAAI,KAAK,IAAI,IAAI,KAAK;AAAA,QACxB;AAEA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAEA,cAAU,QAAQ;AAClB,cAAU,gBAAgB;AAC1B,cAAU,aAAa;AAAA,EACzB;AAEA,MAAI,OAAO,YAAY;AACrB,cAAU,aAAa,EAAE,GAAG,OAAO,WAAW;AAAA,EAChD;AAEA,MAAI,OAAO,QAAQ;AACjB,UAAM,CAAC,OAAO,GAAG,IAAI,IAAI,UAAU;AACnC,QAAI,OAAO,SAAS,UAAU;AAC5B,gBAAU,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,OAAO,GAAG,GAAG,IAAI;AAAA,IAC1E,OAAO;AACL,gBAAU,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,OAAO,GAAG,GAAG,UAAU,OAAO;AAAA,IACvF;AAAA,EACF;AAEA,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;","names":["Inherit","model","maxCalls","model","model","model","msg","model","model","maxCalls","error"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -100,9 +100,10 @@ interface ScopeConfig {
|
|
|
100
100
|
system?: string;
|
|
101
101
|
silent?: boolean;
|
|
102
102
|
until?: (ctx: ConversationContext) => boolean;
|
|
103
|
+
stream?: (event: StreamEvent) => void;
|
|
103
104
|
}
|
|
104
105
|
type StepFunction = (ctx: ConversationContext) => Promise<ConversationContext>;
|
|
105
|
-
type ComposedFunction = (ctxOrMessage
|
|
106
|
+
type ComposedFunction = (ctxOrMessage: ConversationContext | string) => Promise<ConversationContext>;
|
|
106
107
|
interface JsonSchema {
|
|
107
108
|
name: string;
|
|
108
109
|
schema: {
|
|
@@ -152,6 +153,28 @@ declare const setKeys: (keys: ApiKeys) => void;
|
|
|
152
153
|
declare const getKey: (provider: string) => string;
|
|
153
154
|
declare const maxCalls: (toolConfig: ToolConfig, maxCalls: number) => ToolConfig;
|
|
154
155
|
|
|
156
|
+
/**
|
|
157
|
+
* @example
|
|
158
|
+
* // in-memory (default)
|
|
159
|
+
* const thread = getOrCreateThread('user-123');
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* // sqlite
|
|
163
|
+
* const thread = getOrCreateThread('user-123', {
|
|
164
|
+
* async get(id) {
|
|
165
|
+
* const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);
|
|
166
|
+
* return row ? JSON.parse(row.messages) : [];
|
|
167
|
+
* },
|
|
168
|
+
* async set(id, messages) {
|
|
169
|
+
* await db.run(
|
|
170
|
+
* 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',
|
|
171
|
+
* id,
|
|
172
|
+
* JSON.stringify(messages),
|
|
173
|
+
* Date.now()
|
|
174
|
+
* );
|
|
175
|
+
* }
|
|
176
|
+
* });
|
|
177
|
+
*/
|
|
155
178
|
declare const getOrCreateThread: (id: string, store?: ThreadStore) => Thread;
|
|
156
179
|
|
|
157
180
|
declare const isStandardSchema: (schema: any) => schema is StandardSchema;
|
|
@@ -198,8 +221,8 @@ declare const when: (condition: (ctx: ConversationContext) => boolean, action: S
|
|
|
198
221
|
|
|
199
222
|
declare const model: ({ model, schema, }?: {
|
|
200
223
|
model?: string;
|
|
201
|
-
schema?:
|
|
202
|
-
}) =>
|
|
224
|
+
schema?: JsonSchema | StandardSchema;
|
|
225
|
+
}) => ComposedFunction;
|
|
203
226
|
|
|
204
227
|
/**
|
|
205
228
|
* scope({}, retry({ times: 2 }, model(...)))
|
package/dist/index.d.ts
CHANGED
|
@@ -100,9 +100,10 @@ interface ScopeConfig {
|
|
|
100
100
|
system?: string;
|
|
101
101
|
silent?: boolean;
|
|
102
102
|
until?: (ctx: ConversationContext) => boolean;
|
|
103
|
+
stream?: (event: StreamEvent) => void;
|
|
103
104
|
}
|
|
104
105
|
type StepFunction = (ctx: ConversationContext) => Promise<ConversationContext>;
|
|
105
|
-
type ComposedFunction = (ctxOrMessage
|
|
106
|
+
type ComposedFunction = (ctxOrMessage: ConversationContext | string) => Promise<ConversationContext>;
|
|
106
107
|
interface JsonSchema {
|
|
107
108
|
name: string;
|
|
108
109
|
schema: {
|
|
@@ -152,6 +153,28 @@ declare const setKeys: (keys: ApiKeys) => void;
|
|
|
152
153
|
declare const getKey: (provider: string) => string;
|
|
153
154
|
declare const maxCalls: (toolConfig: ToolConfig, maxCalls: number) => ToolConfig;
|
|
154
155
|
|
|
156
|
+
/**
|
|
157
|
+
* @example
|
|
158
|
+
* // in-memory (default)
|
|
159
|
+
* const thread = getOrCreateThread('user-123');
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* // sqlite
|
|
163
|
+
* const thread = getOrCreateThread('user-123', {
|
|
164
|
+
* async get(id) {
|
|
165
|
+
* const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);
|
|
166
|
+
* return row ? JSON.parse(row.messages) : [];
|
|
167
|
+
* },
|
|
168
|
+
* async set(id, messages) {
|
|
169
|
+
* await db.run(
|
|
170
|
+
* 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',
|
|
171
|
+
* id,
|
|
172
|
+
* JSON.stringify(messages),
|
|
173
|
+
* Date.now()
|
|
174
|
+
* );
|
|
175
|
+
* }
|
|
176
|
+
* });
|
|
177
|
+
*/
|
|
155
178
|
declare const getOrCreateThread: (id: string, store?: ThreadStore) => Thread;
|
|
156
179
|
|
|
157
180
|
declare const isStandardSchema: (schema: any) => schema is StandardSchema;
|
|
@@ -198,8 +221,8 @@ declare const when: (condition: (ctx: ConversationContext) => boolean, action: S
|
|
|
198
221
|
|
|
199
222
|
declare const model: ({ model, schema, }?: {
|
|
200
223
|
model?: string;
|
|
201
|
-
schema?:
|
|
202
|
-
}) =>
|
|
224
|
+
schema?: JsonSchema | StandardSchema;
|
|
225
|
+
}) => ComposedFunction;
|
|
203
226
|
|
|
204
227
|
/**
|
|
205
228
|
* scope({}, retry({ times: 2 }, model(...)))
|
package/dist/index.js
CHANGED
|
@@ -151,6 +151,22 @@ var maxCalls = (toolConfig, maxCalls2) => ({
|
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
// src/providers/openai.ts
|
|
154
|
+
var appendToolCalls = (toolCalls, tcchunklist) => {
|
|
155
|
+
for (const tcchunk of tcchunklist) {
|
|
156
|
+
while (toolCalls.length <= tcchunk.index) {
|
|
157
|
+
toolCalls.push({
|
|
158
|
+
id: "",
|
|
159
|
+
type: "function",
|
|
160
|
+
function: { name: "", arguments: "" }
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const tc = toolCalls[tcchunk.index];
|
|
164
|
+
tc.id += tcchunk.id || "";
|
|
165
|
+
tc.function.name += tcchunk.function?.name || "";
|
|
166
|
+
tc.function.arguments += tcchunk.function?.arguments || "";
|
|
167
|
+
}
|
|
168
|
+
return toolCalls;
|
|
169
|
+
};
|
|
154
170
|
var callOpenAI = async (config, ctx) => {
|
|
155
171
|
const { model: model2, instructions, schema } = config;
|
|
156
172
|
const apiKey = getKey("openai") || process.env.OPENAI_API_KEY;
|
|
@@ -217,17 +233,19 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
217
233
|
const decoder = new TextDecoder();
|
|
218
234
|
let fullContent = "";
|
|
219
235
|
let toolCalls = [];
|
|
220
|
-
|
|
236
|
+
let buffer = "";
|
|
221
237
|
try {
|
|
222
238
|
while (true) {
|
|
223
239
|
const { done, value } = await reader.read();
|
|
224
240
|
if (done) break;
|
|
225
|
-
|
|
226
|
-
const lines =
|
|
241
|
+
buffer += decoder.decode(value, { stream: true });
|
|
242
|
+
const lines = buffer.split("\n");
|
|
243
|
+
buffer = lines.pop() || "";
|
|
227
244
|
for (const line of lines) {
|
|
228
245
|
if (line.startsWith("data: ")) {
|
|
229
|
-
const data = line.slice(6);
|
|
246
|
+
const data = line.slice(6).trim();
|
|
230
247
|
if (data === "[DONE]") continue;
|
|
248
|
+
if (!data) continue;
|
|
231
249
|
try {
|
|
232
250
|
const parsed = JSON.parse(data);
|
|
233
251
|
const delta = parsed.choices?.[0]?.delta;
|
|
@@ -238,25 +256,7 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
238
256
|
}
|
|
239
257
|
}
|
|
240
258
|
if (delta?.tool_calls) {
|
|
241
|
-
|
|
242
|
-
const { index } = toolCall;
|
|
243
|
-
if (!toolCallsBuffer[index]) {
|
|
244
|
-
toolCallsBuffer[index] = {
|
|
245
|
-
id: toolCall.id || "",
|
|
246
|
-
type: "function",
|
|
247
|
-
function: { name: "", arguments: "" }
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
if (toolCall.id) {
|
|
251
|
-
toolCallsBuffer[index].id = toolCall.id;
|
|
252
|
-
}
|
|
253
|
-
if (toolCall.function?.name) {
|
|
254
|
-
toolCallsBuffer[index].function.name += toolCall.function.name;
|
|
255
|
-
}
|
|
256
|
-
if (toolCall.function?.arguments) {
|
|
257
|
-
toolCallsBuffer[index].function.arguments += toolCall.function.arguments;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
259
|
+
toolCalls = appendToolCalls(toolCalls, delta.tool_calls);
|
|
260
260
|
}
|
|
261
261
|
} catch (e) {
|
|
262
262
|
}
|
|
@@ -266,7 +266,6 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
266
266
|
} finally {
|
|
267
267
|
reader.releaseLock();
|
|
268
268
|
}
|
|
269
|
-
toolCalls = Object.values(toolCallsBuffer);
|
|
270
269
|
const msg = {
|
|
271
270
|
role: "assistant",
|
|
272
271
|
content: fullContent
|
|
@@ -368,15 +367,18 @@ var handleAnthropicStream = async (response, ctx) => {
|
|
|
368
367
|
const decoder = new TextDecoder();
|
|
369
368
|
let fullContent = "";
|
|
370
369
|
const toolCalls = [];
|
|
370
|
+
let buffer = "";
|
|
371
371
|
try {
|
|
372
372
|
while (true) {
|
|
373
373
|
const { done, value } = await reader.read();
|
|
374
374
|
if (done) break;
|
|
375
|
-
|
|
376
|
-
const lines =
|
|
375
|
+
buffer += decoder.decode(value, { stream: true });
|
|
376
|
+
const lines = buffer.split("\n");
|
|
377
|
+
buffer = lines.pop() || "";
|
|
377
378
|
for (const line of lines) {
|
|
378
379
|
if (line.startsWith("data: ")) {
|
|
379
|
-
const data = line.slice(6);
|
|
380
|
+
const data = line.slice(6).trim();
|
|
381
|
+
if (!data) continue;
|
|
380
382
|
try {
|
|
381
383
|
const parsed = JSON.parse(data);
|
|
382
384
|
if (parsed.type === "content_block_delta" && parsed.delta?.text) {
|
|
@@ -505,15 +507,18 @@ var handleGoogleStream = async (response, ctx) => {
|
|
|
505
507
|
const decoder = new TextDecoder();
|
|
506
508
|
let fullContent = "";
|
|
507
509
|
const toolCalls = [];
|
|
510
|
+
let buffer = "";
|
|
508
511
|
try {
|
|
509
512
|
while (true) {
|
|
510
513
|
const { done, value } = await reader.read();
|
|
511
514
|
if (done) break;
|
|
512
|
-
|
|
513
|
-
const lines =
|
|
515
|
+
buffer += decoder.decode(value, { stream: true });
|
|
516
|
+
const lines = buffer.split("\n");
|
|
517
|
+
buffer = lines.pop() || "";
|
|
514
518
|
for (const line of lines) {
|
|
515
519
|
if (line.startsWith("data: ")) {
|
|
516
|
-
const data = line.slice(6);
|
|
520
|
+
const data = line.slice(6).trim();
|
|
521
|
+
if (!data) continue;
|
|
517
522
|
try {
|
|
518
523
|
const parsed = JSON.parse(data);
|
|
519
524
|
const candidate = parsed.candidates?.[0];
|
|
@@ -621,10 +626,16 @@ var model = ({
|
|
|
621
626
|
schema
|
|
622
627
|
} = {}) => {
|
|
623
628
|
return async (ctxOrMessage) => {
|
|
624
|
-
const ctx = typeof ctxOrMessage === "string" ?
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
629
|
+
const ctx = typeof ctxOrMessage === "string" ? (
|
|
630
|
+
// model()("hello!");
|
|
631
|
+
{
|
|
632
|
+
history: [{ role: "user", content: ctxOrMessage }],
|
|
633
|
+
tools: []
|
|
634
|
+
}
|
|
635
|
+
) : (
|
|
636
|
+
// model()(/* few shot / history */);
|
|
637
|
+
ctxOrMessage
|
|
638
|
+
);
|
|
628
639
|
const normalizedSchema = schema ? normalizeSchema(schema) : void 0;
|
|
629
640
|
const systemMessage = ctx.history.find((m) => m.role === "system");
|
|
630
641
|
const instructions = systemMessage?.content;
|
|
@@ -675,7 +686,11 @@ var executeTools = async (ctx) => {
|
|
|
675
686
|
const approval = approvals.find((a) => a.call.id === call.id);
|
|
676
687
|
if (!approval?.approved) {
|
|
677
688
|
if (ctx.stream) {
|
|
678
|
-
ctx.stream({
|
|
689
|
+
ctx.stream({
|
|
690
|
+
type: "tool_error",
|
|
691
|
+
call,
|
|
692
|
+
error: "Tool execution denied by user"
|
|
693
|
+
});
|
|
679
694
|
}
|
|
680
695
|
return {
|
|
681
696
|
call,
|
|
@@ -796,14 +811,15 @@ var createThread = (id, store) => {
|
|
|
796
811
|
}
|
|
797
812
|
};
|
|
798
813
|
};
|
|
799
|
-
var defaultStore = createMemoryStore();
|
|
800
814
|
var threads = /* @__PURE__ */ new Map();
|
|
801
|
-
var getOrCreateThread = (id, store
|
|
802
|
-
|
|
803
|
-
|
|
815
|
+
var getOrCreateThread = (id, store) => {
|
|
816
|
+
const cacheKey = store ? `${id}-${store}` : id;
|
|
817
|
+
if (threads.has(cacheKey)) {
|
|
818
|
+
return threads.get(cacheKey);
|
|
804
819
|
}
|
|
805
|
-
const
|
|
806
|
-
|
|
820
|
+
const threadStore = store || createMemoryStore();
|
|
821
|
+
const thread = createThread(id, threadStore);
|
|
822
|
+
threads.set(cacheKey, thread);
|
|
807
823
|
return thread;
|
|
808
824
|
};
|
|
809
825
|
|
|
@@ -1034,6 +1050,9 @@ var scopeContext = (config, ctx) => {
|
|
|
1034
1050
|
scopedCtx.history = [{ role: "system", content: config.system }, ...scopedCtx.history];
|
|
1035
1051
|
}
|
|
1036
1052
|
}
|
|
1053
|
+
if (config.stream) {
|
|
1054
|
+
scopedCtx.stream = config.stream;
|
|
1055
|
+
}
|
|
1037
1056
|
return scopedCtx;
|
|
1038
1057
|
};
|
|
1039
1058
|
var scope = (config, ...steps) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent = \n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage?: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n const toolCallsBuffer: Record<string, any> = {};\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n const { index } = toolCall;\n if (!toolCallsBuffer[index]) {\n toolCallsBuffer[index] = {\n id: toolCall.id || \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n };\n }\n\n if (toolCall.id) {\n toolCallsBuffer[index].id = toolCall.id;\n }\n if (toolCall.function?.name) {\n toolCallsBuffer[index].function.name +=\n toolCall.function.name;\n }\n if (toolCall.function?.arguments) {\n toolCallsBuffer[index].function.arguments +=\n toolCall.function.arguments;\n }\n }\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n // Convert tool calls buffer to array\n toolCalls = Object.values(toolCallsBuffer);\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport { ConversationContext, StepFunction, ToolCall } from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: { model?: string; schema?: any } = {}): StepFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : ctxOrMessage;\n\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: 'tool_calls_ready', calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error: 'Tool execution denied by user' });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: 'tool_executing', call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: 'tool_complete', call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n \n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: 'tool_error', call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst defaultStore = createMemoryStore();\nconst threads = new Map<string, Thread>();\n\nexport const getOrCreateThread = (\n id: string,\n store: ThreadStore = defaultStore,\n): Thread => {\n if (threads.has(id)) {\n return threads.get(id)!;\n }\n\n const thread = createThread(id, store);\n threads.set(id, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage?: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n \n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || { \n history: [], \n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","model","model","msg","model","model","maxCalls","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/huggingface.ts","../src/providers/index.ts","../src/approval.ts","../src/composition/model.ts","../src/thread.ts","../src/composition/when.ts","../src/helpers.ts","../src/composition/tap.ts","../src/composition/retry.ts","../src/composition/compose.ts","../src/composition/scope.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n // check if zod is available and has toJSONSchema method\n try {\n const zodModule = require(\"zod\");\n if (zodModule && typeof zodModule.toJSONSchema === \"function\") {\n const jsonSchema = zodModule.toJSONSchema(standardSchema);\n return {\n name,\n schema: jsonSchema,\n };\n }\n } catch (error) {\n // zod not available or doesn't have toJSONSchema\n }\n\n throw new Error(\n \"Standard Schema conversion requires zod v4+ with toJSONSchema support. \" +\n \"Please install zod@^4.0.0 or provide a JsonSchema object instead.\",\n );\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const result: Record<string, SchemaProperty> = {};\n for (const [key, value] of Object.entries(mcpSchema.properties)) {\n const prop = value as any;\n result[key] = {\n type: prop.type || \"string\",\n description: prop.description || \"\",\n optional: !mcpSchema.required?.includes(key),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty>;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n requireApproval?: boolean;\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n parallel?: boolean;\n retryCount?: number;\n approvalId?: string;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n additionalProperties?: boolean;\n };\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport interface ApiKeys {\n openai?: string;\n anthropic?: string;\n google?: string;\n [provider: string]: string | undefined;\n}\n\nexport interface ThreadStore {\n get(threadId: string): Promise<Message[]>;\n set(threadId: string, messages: Message[]): Promise<void>;\n}\n\nexport interface Thread {\n id: string;\n store: ThreadStore;\n generate(step: StepFunction): Promise<ConversationContext>;\n message(content: string, workflow?: StepFunction): Promise<ConversationContext>;\n}\n\nexport interface RetryOptions {\n times?: number;\n}\n","import {\n ApiKeys,\n ParsedModel,\n SchemaProperty,\n ToolConfig,\n ToolDefinition,\n} from \"./types\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(tool.schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\n// openai streams tool calls as incremental chunks with index properties that need assembly\n// example: {\"index\": 0, \"function\": {\"name\": \"get_wea\"}} then {\"index\": 0, \"function\": {\"arguments\": \"ther\"}}\n// google/anthropic send complete tool calls in single chunks, so they don't need this logic\nconst appendToolCalls = (toolCalls: any[], tcchunklist: any[]): any[] => {\n for (const tcchunk of tcchunklist) {\n while (toolCalls.length <= tcchunk.index) {\n toolCalls.push({\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n const tc = toolCalls[tcchunk.index];\n tc.id += tcchunk.id || \"\";\n tc.function.name += tcchunk.function?.name || \"\";\n tc.function.arguments += tcchunk.function?.arguments || \"\";\n }\n return toolCalls;\n};\n\nexport const callOpenAI = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const messages = [];\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n messages.push(...ctx.history);\n\n const body: any = {\n model,\n messages,\n stream: !!ctx.stream,\n };\n\n if (schema) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schema.name,\n schema: { ...schema.schema, additionalProperties: false },\n strict: true,\n },\n };\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools;\n body.tool_choice = \"auto\";\n }\n\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: \"content\", content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n toolCalls = appendToolCalls(toolCalls, delta.tool_calls);\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = config;\n const apiKey = getKey(\"anthropic\") || process.env.ANTHROPIC_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Anthropic API key not found\");\n }\n\n const messages = [...ctx.history];\n let system = instructions;\n\n // Extract system message if it exists\n if (messages[0]?.role === \"system\") {\n system = messages[0].content;\n messages.shift();\n }\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\nexport const callGoogle = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions } = config;\n const apiKey = getKey(\"google\") || process.env.GOOGLE_AI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"Google API key not found\");\n }\n\n const contents = [];\n\n if (instructions) {\n contents.push({\n role: \"user\",\n parts: [{ text: instructions }],\n });\n contents.push({\n role: \"model\",\n parts: [{ text: \"I understand.\" }],\n });\n }\n\n for (const msg of ctx.history) {\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const body: any = {\n contents,\n };\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = [\n {\n function_declarations: ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n })),\n },\n ];\n }\n\n const endpoint = ctx.stream ? \"streamGenerateContent\" : \"generateContent\";\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${model}:${endpoint}?key=${apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const part = candidate?.content?.parts?.[0];\n\n if (part?.text) {\n fullContent += part.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: part.text });\n }\n }\n\n if (part?.functionCall) {\n toolCalls.push({\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\n\nexport const callHuggingFace = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n throw new Error(\n \"Hugging Face provider not yet implemented. Use openai/, anthropic/, or google/ prefixes.\",\n );\n};\n","import { ConversationContext, ProviderConfig } from \"../types\";\nimport { parseModelName } from \"../utils\";\nimport { callOpenAI } from \"./openai\";\nimport { callAnthropic } from \"./anthropic\";\nimport { callGoogle } from \"./google\";\nimport { callHuggingFace } from \"./huggingface\";\n\nexport const callProvider = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { provider, model } = parseModelName(config.model);\n const providerConfig = { ...config, model };\n\n switch (provider.toLowerCase()) {\n case \"openai\":\n return callOpenAI(providerConfig, ctx);\n case \"anthropic\":\n return callAnthropic(providerConfig, ctx);\n case \"google\":\n return callGoogle(providerConfig, ctx);\n case \"huggingface\":\n default:\n return callHuggingFace(providerConfig, ctx);\n }\n};\n","import { EventEmitter } from \"events\";\nimport { ToolCall } from \"./types\";\n\nexport interface ApprovalRequest {\n id: string;\n toolCall: ToolCall;\n approvalId?: string;\n}\n\nexport interface ApprovalResponse {\n id: string;\n approved: boolean;\n reason?: string;\n}\n\ninterface ApprovalManagerState {\n resolvers: Map<string, (response: ApprovalResponse) => void>;\n emitter: EventEmitter;\n}\n\nconst state: ApprovalManagerState = {\n resolvers: new Map(),\n emitter: new EventEmitter(),\n};\n\nexport const generateApprovalToken = (): string => {\n return `approval_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n};\n\nexport const requestApproval = async (\n toolCall: ToolCall,\n approvalId?: string,\n): Promise<ApprovalResponse> => {\n const id = generateApprovalToken();\n const request: ApprovalRequest = { id, toolCall, approvalId };\n\n state.emitter.emit(\"approvalRequested\", request);\n\n return new Promise<ApprovalResponse>((resolve) => {\n state.resolvers.set(id, resolve);\n });\n};\n\nexport const resolveApproval = (response: ApprovalResponse): boolean => {\n const resolver = state.resolvers.get(response.id);\n if (!resolver) return false;\n\n state.resolvers.delete(response.id);\n resolver(response);\n state.emitter.emit(\"approvalResolved\", response);\n return true;\n};\n\nexport const onApprovalRequested = (\n listener: (request: ApprovalRequest) => void,\n) => {\n state.emitter.on(\"approvalRequested\", listener);\n};\n\nexport const onApprovalResolved = (\n listener: (response: ApprovalResponse) => void,\n) => {\n state.emitter.on(\"approvalResolved\", listener);\n};\n\nexport const removeApprovalListener = (\n event: \"approvalRequested\" | \"approvalResolved\",\n listener: (...args: any[]) => void,\n) => {\n state.emitter.removeListener(event, listener);\n};\n","import { callProvider } from \"../providers\";\nimport { normalizeSchema } from \"../schema\";\nimport {\n ConversationContext,\n StepFunction,\n ToolCall,\n JsonSchema,\n StandardSchema,\n ComposedFunction,\n} from \"../types\";\nimport { requestApproval } from \"../approval\";\n\nexport const model = ({\n model = \"openai/gpt-4o-mini\",\n schema,\n}: {\n model?: string;\n schema?: JsonSchema | StandardSchema;\n} = {}): ComposedFunction => {\n return async (\n ctxOrMessage: ConversationContext | string,\n ): Promise<ConversationContext> => {\n const ctx =\n typeof ctxOrMessage === \"string\"\n ? // model()(\"hello!\");\n {\n history: [{ role: \"user\" as const, content: ctxOrMessage }],\n tools: [],\n }\n : // model()(/* few shot / history */);\n ctxOrMessage;\n const normalizedSchema = schema ? normalizeSchema(schema) : undefined;\n const systemMessage = ctx.history.find((m) => m.role === \"system\");\n const instructions = systemMessage?.content;\n let currentCtx = ctx;\n\n do {\n currentCtx = await callProvider(\n { model, instructions, schema: normalizedSchema },\n currentCtx,\n );\n\n if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {\n currentCtx = await executeTools(currentCtx);\n }\n } while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n // notify UI of pending tool calls\n if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n } = toolConfig;\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n\n if (!approval?.approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCall))\n : await runCallsSequentially(calls, runCall);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","model","model","msg","model","model","maxCalls","error"]}
|