@threaded/ai 1.0.3 → 1.0.5
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 +47 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +37 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
@@ -76,7 +86,8 @@ var convertMCPSchemaToToolSchema = (mcpSchema) => {
|
|
|
76
86
|
result[key] = {
|
|
77
87
|
type: prop.type || "string",
|
|
78
88
|
description: prop.description || "",
|
|
79
|
-
optional: !mcpSchema.required?.includes(key)
|
|
89
|
+
optional: !mcpSchema.required?.includes(key),
|
|
90
|
+
...prop.enum && { enum: prop.enum }
|
|
80
91
|
};
|
|
81
92
|
}
|
|
82
93
|
return result;
|
|
@@ -199,7 +210,6 @@ var maxCalls = (toolConfig, maxCalls2) => ({
|
|
|
199
210
|
});
|
|
200
211
|
|
|
201
212
|
// src/embed.ts
|
|
202
|
-
var import_transformers = require("@huggingface/transformers");
|
|
203
213
|
var modelCache = /* @__PURE__ */ new Map();
|
|
204
214
|
var embed = async (model2, text, config) => {
|
|
205
215
|
if (model2.startsWith("openai/")) {
|
|
@@ -230,15 +240,22 @@ var embed = async (model2, text, config) => {
|
|
|
230
240
|
const data = await response.json();
|
|
231
241
|
return data.data[0].embedding;
|
|
232
242
|
}
|
|
233
|
-
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
243
|
+
try {
|
|
244
|
+
const { pipeline } = await import("@huggingface/transformers");
|
|
245
|
+
if (!modelCache.has(model2)) {
|
|
246
|
+
const extractor2 = await pipeline("feature-extraction", model2, {
|
|
247
|
+
dtype: "fp32"
|
|
248
|
+
});
|
|
249
|
+
modelCache.set(model2, extractor2);
|
|
250
|
+
}
|
|
251
|
+
const extractor = modelCache.get(model2);
|
|
252
|
+
const result = await extractor(text, { pooling: "mean", normalize: true });
|
|
253
|
+
return Array.from(result.data);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
throw new Error(
|
|
256
|
+
`huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`
|
|
257
|
+
);
|
|
238
258
|
}
|
|
239
|
-
const extractor = modelCache.get(model2);
|
|
240
|
-
const result = await extractor(text, { pooling: "mean", normalize: true });
|
|
241
|
-
return Array.from(result.data);
|
|
242
259
|
};
|
|
243
260
|
|
|
244
261
|
// src/providers/openai.ts
|
|
@@ -294,7 +311,8 @@ var callOpenAI = async (config, ctx) => {
|
|
|
294
311
|
"Content-Type": "application/json",
|
|
295
312
|
Authorization: `Bearer ${apiKey}`
|
|
296
313
|
},
|
|
297
|
-
body: JSON.stringify(body)
|
|
314
|
+
body: JSON.stringify(body),
|
|
315
|
+
signal: ctx.abortSignal
|
|
298
316
|
});
|
|
299
317
|
if (!response.ok) {
|
|
300
318
|
const error = await response.text();
|
|
@@ -327,6 +345,9 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
327
345
|
let buffer = "";
|
|
328
346
|
try {
|
|
329
347
|
while (true) {
|
|
348
|
+
if (ctx.abortSignal?.aborted) {
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
330
351
|
const { done, value } = await reader.read();
|
|
331
352
|
if (done) break;
|
|
332
353
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -468,7 +489,8 @@ Return only the JSON object, no other text or formatting.`;
|
|
|
468
489
|
"x-api-key": apiKey,
|
|
469
490
|
"anthropic-version": "2023-06-01"
|
|
470
491
|
},
|
|
471
|
-
body: JSON.stringify(body)
|
|
492
|
+
body: JSON.stringify(body),
|
|
493
|
+
signal: ctx.abortSignal
|
|
472
494
|
});
|
|
473
495
|
if (!response.ok) {
|
|
474
496
|
const error = await response.text();
|
|
@@ -509,6 +531,9 @@ var handleAnthropicStream = async (response, ctx) => {
|
|
|
509
531
|
let buffer = "";
|
|
510
532
|
try {
|
|
511
533
|
while (true) {
|
|
534
|
+
if (ctx.abortSignal?.aborted) {
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
512
537
|
const { done, value } = await reader.read();
|
|
513
538
|
if (done) break;
|
|
514
539
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -613,7 +638,8 @@ var callGoogle = async (config, ctx) => {
|
|
|
613
638
|
headers: {
|
|
614
639
|
"Content-Type": "application/json"
|
|
615
640
|
},
|
|
616
|
-
body: JSON.stringify(body)
|
|
641
|
+
body: JSON.stringify(body),
|
|
642
|
+
signal: ctx.abortSignal
|
|
617
643
|
}
|
|
618
644
|
);
|
|
619
645
|
if (!response.ok) {
|
|
@@ -656,6 +682,9 @@ var handleGoogleStream = async (response, ctx) => {
|
|
|
656
682
|
let buffer = "";
|
|
657
683
|
try {
|
|
658
684
|
while (true) {
|
|
685
|
+
if (ctx.abortSignal?.aborted) {
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
659
688
|
const { done, value } = await reader.read();
|
|
660
689
|
if (done) break;
|
|
661
690
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -787,6 +816,9 @@ var model = ({
|
|
|
787
816
|
const instructions = systemMessage?.content;
|
|
788
817
|
let currentCtx = ctx;
|
|
789
818
|
do {
|
|
819
|
+
if (currentCtx.abortSignal?.aborted) {
|
|
820
|
+
break;
|
|
821
|
+
}
|
|
790
822
|
currentCtx = await callProvider(
|
|
791
823
|
{ model: model2, instructions, schema: normalizedSchema },
|
|
792
824
|
currentCtx
|
|
@@ -794,7 +826,7 @@ var model = ({
|
|
|
794
826
|
if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {
|
|
795
827
|
currentCtx = await executeTools(currentCtx);
|
|
796
828
|
}
|
|
797
|
-
} while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);
|
|
829
|
+
} while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length && !currentCtx.abortSignal?.aborted);
|
|
798
830
|
return currentCtx;
|
|
799
831
|
};
|
|
800
832
|
};
|
|
@@ -1192,6 +1224,7 @@ var scopeContext = (config, ctx) => {
|
|
|
1192
1224
|
scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : void 0;
|
|
1193
1225
|
}
|
|
1194
1226
|
scopedCtx.stream = ctx.stream;
|
|
1227
|
+
scopedCtx.abortSignal = ctx.abortSignal;
|
|
1195
1228
|
if (config.tools) {
|
|
1196
1229
|
const toolDefinitions = config.tools.map(toolConfigToToolDefinition);
|
|
1197
1230
|
const toolExecutors = config.tools.reduce(
|
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/embed.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","../src/utils/rateLimited.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./embed\";\nexport * from \"./thread\";\nexport * from \"./schema\";\nexport * from \"./helpers\";\nexport * from \"./approval\";\nexport * from \"./composition/tap\";\nexport * from \"./composition/when\";\nexport * from \"./composition/model\";\nexport * from \"./composition/retry\";\nexport * from \"./composition/scope\";\nexport * from \"./utils/rateLimited\";\nexport * from \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const 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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(jsonSchema);\n};\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty> | StandardSchema;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\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\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { pipeline } from \"@huggingface/transformers\";\nimport { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n};\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\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = 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 let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\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 buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\n }\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls.map(({ index, ...tc }) => tc);\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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 or 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 if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n }\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n * \n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n * \n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n * \n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n * \n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","model","model","msg","model","model","maxCalls","error","results"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/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","../src/utils/rateLimited.ts"],"sourcesContent":["export * from \"./mcp\";\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * from \"./embed\";\nexport * from \"./thread\";\nexport * from \"./schema\";\nexport * from \"./helpers\";\nexport * from \"./approval\";\nexport * from \"./composition/tap\";\nexport * from \"./composition/when\";\nexport * from \"./composition/model\";\nexport * from \"./composition/retry\";\nexport * from \"./composition/scope\";\nexport * from \"./utils/rateLimited\";\nexport * from \"./composition/compose\";\n","import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const 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 ...(prop.enum && { enum: prop.enum }),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(jsonSchema);\n};\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty> | StandardSchema;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n abortSignal?: AbortSignal;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\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\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { 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 signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: \"content\", content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n toolCalls = appendToolCalls(toolCalls, delta.tool_calls);\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = 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 let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\n }\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls.map(({ index, ...tc }) => tc);\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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 signal: ctx.abortSignal,\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const 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 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 or 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 if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\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 (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n }\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n scopedCtx.abortSignal = ctx.abortSignal;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","model","model","msg","model","model","maxCalls","error","results"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -18,7 +18,8 @@ var convertMCPSchemaToToolSchema = (mcpSchema) => {
|
|
|
18
18
|
result[key] = {
|
|
19
19
|
type: prop.type || "string",
|
|
20
20
|
description: prop.description || "",
|
|
21
|
-
optional: !mcpSchema.required?.includes(key)
|
|
21
|
+
optional: !mcpSchema.required?.includes(key),
|
|
22
|
+
...prop.enum && { enum: prop.enum }
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
return result;
|
|
@@ -141,7 +142,6 @@ var maxCalls = (toolConfig, maxCalls2) => ({
|
|
|
141
142
|
});
|
|
142
143
|
|
|
143
144
|
// src/embed.ts
|
|
144
|
-
import { pipeline } from "@huggingface/transformers";
|
|
145
145
|
var modelCache = /* @__PURE__ */ new Map();
|
|
146
146
|
var embed = async (model2, text, config) => {
|
|
147
147
|
if (model2.startsWith("openai/")) {
|
|
@@ -172,15 +172,22 @@ var embed = async (model2, text, config) => {
|
|
|
172
172
|
const data = await response.json();
|
|
173
173
|
return data.data[0].embedding;
|
|
174
174
|
}
|
|
175
|
-
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
175
|
+
try {
|
|
176
|
+
const { pipeline } = await import("@huggingface/transformers");
|
|
177
|
+
if (!modelCache.has(model2)) {
|
|
178
|
+
const extractor2 = await pipeline("feature-extraction", model2, {
|
|
179
|
+
dtype: "fp32"
|
|
180
|
+
});
|
|
181
|
+
modelCache.set(model2, extractor2);
|
|
182
|
+
}
|
|
183
|
+
const extractor = modelCache.get(model2);
|
|
184
|
+
const result = await extractor(text, { pooling: "mean", normalize: true });
|
|
185
|
+
return Array.from(result.data);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
throw new Error(
|
|
188
|
+
`huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`
|
|
189
|
+
);
|
|
180
190
|
}
|
|
181
|
-
const extractor = modelCache.get(model2);
|
|
182
|
-
const result = await extractor(text, { pooling: "mean", normalize: true });
|
|
183
|
-
return Array.from(result.data);
|
|
184
191
|
};
|
|
185
192
|
|
|
186
193
|
// src/providers/openai.ts
|
|
@@ -236,7 +243,8 @@ var callOpenAI = async (config, ctx) => {
|
|
|
236
243
|
"Content-Type": "application/json",
|
|
237
244
|
Authorization: `Bearer ${apiKey}`
|
|
238
245
|
},
|
|
239
|
-
body: JSON.stringify(body)
|
|
246
|
+
body: JSON.stringify(body),
|
|
247
|
+
signal: ctx.abortSignal
|
|
240
248
|
});
|
|
241
249
|
if (!response.ok) {
|
|
242
250
|
const error = await response.text();
|
|
@@ -269,6 +277,9 @@ var handleOpenAIStream = async (response, ctx) => {
|
|
|
269
277
|
let buffer = "";
|
|
270
278
|
try {
|
|
271
279
|
while (true) {
|
|
280
|
+
if (ctx.abortSignal?.aborted) {
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
272
283
|
const { done, value } = await reader.read();
|
|
273
284
|
if (done) break;
|
|
274
285
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -410,7 +421,8 @@ Return only the JSON object, no other text or formatting.`;
|
|
|
410
421
|
"x-api-key": apiKey,
|
|
411
422
|
"anthropic-version": "2023-06-01"
|
|
412
423
|
},
|
|
413
|
-
body: JSON.stringify(body)
|
|
424
|
+
body: JSON.stringify(body),
|
|
425
|
+
signal: ctx.abortSignal
|
|
414
426
|
});
|
|
415
427
|
if (!response.ok) {
|
|
416
428
|
const error = await response.text();
|
|
@@ -451,6 +463,9 @@ var handleAnthropicStream = async (response, ctx) => {
|
|
|
451
463
|
let buffer = "";
|
|
452
464
|
try {
|
|
453
465
|
while (true) {
|
|
466
|
+
if (ctx.abortSignal?.aborted) {
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
454
469
|
const { done, value } = await reader.read();
|
|
455
470
|
if (done) break;
|
|
456
471
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -555,7 +570,8 @@ var callGoogle = async (config, ctx) => {
|
|
|
555
570
|
headers: {
|
|
556
571
|
"Content-Type": "application/json"
|
|
557
572
|
},
|
|
558
|
-
body: JSON.stringify(body)
|
|
573
|
+
body: JSON.stringify(body),
|
|
574
|
+
signal: ctx.abortSignal
|
|
559
575
|
}
|
|
560
576
|
);
|
|
561
577
|
if (!response.ok) {
|
|
@@ -598,6 +614,9 @@ var handleGoogleStream = async (response, ctx) => {
|
|
|
598
614
|
let buffer = "";
|
|
599
615
|
try {
|
|
600
616
|
while (true) {
|
|
617
|
+
if (ctx.abortSignal?.aborted) {
|
|
618
|
+
break;
|
|
619
|
+
}
|
|
601
620
|
const { done, value } = await reader.read();
|
|
602
621
|
if (done) break;
|
|
603
622
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -729,6 +748,9 @@ var model = ({
|
|
|
729
748
|
const instructions = systemMessage?.content;
|
|
730
749
|
let currentCtx = ctx;
|
|
731
750
|
do {
|
|
751
|
+
if (currentCtx.abortSignal?.aborted) {
|
|
752
|
+
break;
|
|
753
|
+
}
|
|
732
754
|
currentCtx = await callProvider(
|
|
733
755
|
{ model: model2, instructions, schema: normalizedSchema },
|
|
734
756
|
currentCtx
|
|
@@ -736,7 +758,7 @@ var model = ({
|
|
|
736
758
|
if (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length) {
|
|
737
759
|
currentCtx = await executeTools(currentCtx);
|
|
738
760
|
}
|
|
739
|
-
} while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length);
|
|
761
|
+
} while (currentCtx.lastResponse?.tool_calls && currentCtx.tools?.length && !currentCtx.abortSignal?.aborted);
|
|
740
762
|
return currentCtx;
|
|
741
763
|
};
|
|
742
764
|
};
|
|
@@ -1134,6 +1156,7 @@ var scopeContext = (config, ctx) => {
|
|
|
1134
1156
|
scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : void 0;
|
|
1135
1157
|
}
|
|
1136
1158
|
scopedCtx.stream = ctx.stream;
|
|
1159
|
+
scopedCtx.abortSignal = ctx.abortSignal;
|
|
1137
1160
|
if (config.tools) {
|
|
1138
1161
|
const toolDefinitions = config.tools.map(toolConfigToToolDefinition);
|
|
1139
1162
|
const toolExecutors = config.tools.reduce(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/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","../src/utils/rateLimited.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const 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\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(jsonSchema);\n};\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty> | StandardSchema;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\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\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { pipeline } from \"@huggingface/transformers\";\nimport { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n};\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\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = 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 let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\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 buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\n }\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls.map(({ index, ...tc }) => tc);\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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 or 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 if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n }\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n * \n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n * \n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n * \n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n * \n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","model","model","msg","model","model","maxCalls","error","results"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts","../src/mcp.ts","../src/types.ts","../src/utils.ts","../src/embed.ts","../src/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","../src/utils/rateLimited.ts"],"sourcesContent":["import { JsonSchema, SchemaProperty, StandardSchema } from \"./types\";\nimport { z, type ZodType } from \"zod\";\n\nexport const isStandardSchema = (schema: any): schema is StandardSchema => {\n return schema && typeof schema === \"object\" && \"~standard\" in schema;\n};\n\nexport const convertStandardSchemaToJsonSchema = (\n standardSchema: StandardSchema,\n name: string = \"Schema\",\n): JsonSchema => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return {\n name,\n schema: jsonSchema,\n };\n};\n\nexport const convertMCPSchemaToToolSchema = (\n mcpSchema: any,\n): Record<string, SchemaProperty> => {\n if (!mcpSchema?.properties) return {};\n\n const 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 ...(prop.enum && { enum: prop.enum }),\n };\n }\n return result;\n};\n\nexport function normalizeSchema(\n schema: JsonSchema | StandardSchema,\n name?: string,\n): JsonSchema {\n if (isStandardSchema(schema)) {\n return convertStandardSchemaToJsonSchema(schema, name);\n }\n return schema as JsonSchema;\n}\n\nexport const convertStandardSchemaToSchemaProperties = (\n standardSchema: StandardSchema,\n): Record<string, SchemaProperty> => {\n const jsonSchema = z.toJSONSchema(standardSchema as ZodType);\n return convertMCPSchemaToToolSchema(jsonSchema);\n};\n","import { Client } from \"@modelcontextprotocol/sdk/client/index\";\nimport { ToolConfig } from \"./types\";\nimport { convertMCPSchemaToToolSchema } from \"./schema\";\n\nexport const createMCPTools = async (client: Client): Promise<ToolConfig[]> => {\n const serverInfo = client.getServerVersion();\n const serverName = serverInfo?.name;\n\n if (!serverName) {\n console.error(\"MCP server has no name? Skipping tool creation.\");\n return [];\n }\n\n const toolsResponse = await client.listTools();\n\n return toolsResponse.tools.map((mcpTool) => {\n const prefixedName = `${serverName}_${mcpTool.name}`;\n\n return {\n name: prefixedName,\n description: `[${serverName}] ${mcpTool.description || \"\"}`,\n schema: convertMCPSchemaToToolSchema(mcpTool.inputSchema),\n execute: async (args: any) => {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args,\n });\n return (\n (result.content &&\n Array.isArray(result.content) &&\n result.content[0]?.text) ||\n JSON.stringify(result)\n );\n },\n };\n });\n};\n","export interface Message {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n}\n\nexport interface ToolCall {\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolCallResult {\n name: string;\n inputs: any;\n results: any;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\nexport interface ToolConfig {\n name: string;\n description: string;\n schema: Record<string, SchemaProperty> | StandardSchema;\n execute: (args: any) => Promise<any> | any;\n _maxCalls?: number;\n}\n\nexport interface SchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n description?: string;\n enum?: string[];\n optional?: boolean;\n items?: SchemaProperty;\n properties?: Record<string, SchemaProperty>;\n}\n\nexport interface ToolExecutionConfig {\n /** require user approval before executing tools */\n requireApproval?: boolean;\n /**\n * custom callback to handle tool approval, return true to approve\n * \n * @example\n * // simple callback\n * approvalCallback: (call) => call.function.name !== 'dangerousTool'\n * \n * @example\n * // event-driven (SSE): server sends approval request, waits for client POST\n * approvalCallback: (call) => new Promise((resolve) => {\n * pendingApprovals.set(call.id, resolve);\n * res.write(`data: ${JSON.stringify({ type: 'approval_needed', call })}\\n\\n`);\n * })\n * // then: app.post('/approve/:id', (req) => pendingApprovals.get(id)(req.body.approved))\n */\n approvalCallback?: (call: ToolCall) => boolean | Promise<boolean>;\n /** execute tools in parallel instead of sequentially */\n parallel?: boolean;\n /** number of times to retry failed tool executions */\n retryCount?: number;\n /** identifier for approval requests, useful for managing multiple approval flows */\n approvalId?: string;\n /** execute tools immediately upon approval instead of waiting for all approvals (default: false, only applies when requireApproval is true) */\n executeOnApproval?: boolean;\n}\n\nexport type StreamEvent =\n | { type: 'content'; content: string }\n | { type: 'tool_calls_ready'; calls: ToolCall[] }\n | { type: 'tool_executing'; call: ToolCall }\n | { type: 'tool_complete'; call: ToolCall; result: any }\n | { type: 'tool_error'; call: ToolCall; error: string }\n | { type: 'approval_requested'; call: ToolCall; requestId: string };\n\nexport interface ConversationContext {\n history: Message[];\n lastRequest?: Message;\n lastResponse?: Message & { tool_calls?: ToolCall[] };\n tools?: ToolDefinition[];\n toolExecutors?: Record<string, Function>;\n stream?: (event: StreamEvent) => void;\n stopReason?: string;\n\n toolCallCounts?: Record<string, number>;\n toolLimits?: Record<string, number>;\n toolConfig?: ToolExecutionConfig;\n abortSignal?: AbortSignal;\n}\n\nexport enum Inherit {\n Nothing = 0,\n Conversation = 1 << 0,\n Tools = 1 << 1,\n All = Conversation | Tools,\n}\n\nexport interface ScopeConfig {\n inherit?: number;\n tools?: ToolConfig[];\n toolConfig?: ToolExecutionConfig;\n system?: string;\n silent?: boolean;\n until?: (ctx: ConversationContext) => boolean;\n stream?: (event: StreamEvent) => void;\n}\n\nexport type StepFunction = (\n ctx: ConversationContext,\n) => Promise<ConversationContext>;\nexport type ComposedFunction = (\n ctxOrMessage: ConversationContext | string,\n) => Promise<ConversationContext>;\n\nexport interface JsonSchema {\n name: string;\n schema: Record<string, any>;\n}\n\nexport interface StandardSchema {\n \"~standard\": any;\n [key: string]: any;\n}\n\nexport interface ProviderConfig {\n model: string;\n instructions?: string;\n schema?: JsonSchema;\n}\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\";\nimport { isStandardSchema, convertStandardSchemaToSchemaProperties } from \"./schema\";\n\nexport const toolConfigToToolDefinition = (\n tool: ToolConfig,\n): ToolDefinition => {\n const schema = isStandardSchema(tool.schema)\n ? convertStandardSchemaToSchemaProperties(tool.schema)\n : tool.schema;\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(schema)) {\n properties[key] = convertSchemaProperty(prop);\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n },\n },\n };\n};\n\nconst convertSchemaProperty = (prop: SchemaProperty): any => {\n const result: any = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertSchemaProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = {};\n for (const [key, childProp] of Object.entries(prop.properties)) {\n result.properties[key] = convertSchemaProperty(childProp);\n }\n }\n\n return result;\n};\n\nexport const parseModelName = (model: string): ParsedModel => {\n const parts = model.split(\"/\");\n\n if (parts.length === 1) {\n return { provider: \"huggingface\", model: parts[0] };\n }\n\n return {\n provider: parts[0],\n model: parts.slice(1).join(\"/\"),\n };\n};\n\nlet globalKeys: ApiKeys = {};\n\nexport const setKeys = (keys: ApiKeys): void => {\n globalKeys = { ...globalKeys, ...keys };\n};\n\nexport const getKey = (provider: string): string => {\n const key = globalKeys[provider.toLowerCase()];\n if (!key) {\n throw new Error(`No API key configured for provider: ${provider}`);\n }\n return key;\n};\n\nexport const maxCalls = (toolConfig: ToolConfig, maxCalls: number): ToolConfig => ({\n ...toolConfig,\n _maxCalls: maxCalls,\n});\n","import { getKey } from \"./utils\";\n\nconst modelCache = new Map<string, any>();\n\n/**\n * generates embeddings for text using openai or huggingface models\n *\n * openai models use the prefix \"openai/\" (e.g., \"openai/text-embedding-3-small\")\n * all other models use huggingface transformers\n *\n * @example\n * const vector = await embed(\"openai/text-embedding-3-small\", \"hello world\");\n * const vector2 = await embed(\"Xenova/all-MiniLM-L6-v2\", \"hello world\");\n */\nexport const embed = async (\n model: string,\n text: string,\n config?: { dimensions?: number },\n): Promise<number[]> => {\n if (model.startsWith(\"openai/\")) {\n const modelName = model.replace(\"openai/\", \"\");\n const apiKey = getKey(\"openai\") || process.env.OPENAI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n const body: any = {\n model: modelName,\n input: text,\n };\n\n if (config?.dimensions) {\n body.dimensions = config.dimensions;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n const data = (await response.json()) as any;\n return data.data[0].embedding;\n }\n\n try {\n const { pipeline } = await import(\"@huggingface/transformers\");\n\n if (!modelCache.has(model)) {\n const extractor = await pipeline(\"feature-extraction\", model, {\n dtype: \"fp32\",\n });\n modelCache.set(model, extractor);\n }\n\n const extractor = modelCache.get(model);\n const result = await extractor(text, { pooling: \"mean\", normalize: true });\n return Array.from(result.data);\n } catch (error: any) {\n throw new Error(\n `huggingface transformers failed to load. install system dependencies or use openai models instead. original error: ${error.message}`,\n );\n }\n};\n","import { 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 signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleOpenAIStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const choice = data.choices[0];\n const { message } = choice;\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: message.content || \"\",\n };\n\n if (message.tool_calls) {\n msg.tool_calls = message.tool_calls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleOpenAIStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n let toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullContent += delta.content;\n if (ctx.stream) {\n ctx.stream({ type: \"content\", content: delta.content });\n }\n }\n\n if (delta?.tool_calls) {\n toolCalls = appendToolCalls(toolCalls, delta.tool_calls);\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls;\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ProviderConfig, Message, ConversationContext } from \"../types\";\nimport { getKey } from \"../utils\";\n\nconst convertToAnthropicFormat = (messages: any[]): any[] => {\n const result: any[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n if (msg.role === \"system\") {\n i++;\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (msg.tool_calls) {\n result.push({\n role: \"assistant\",\n content: msg.tool_calls.map((tc: any) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n })),\n });\n } else {\n result.push({\n role: \"assistant\",\n content: msg.content,\n });\n }\n i++;\n } else if (msg.role === \"tool\") {\n const toolResults: any[] = [];\n while (i < messages.length && messages[i].role === \"tool\") {\n const toolMsg = messages[i];\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolMsg.tool_call_id,\n content: toolMsg.content,\n });\n i++;\n }\n result.push({\n role: \"user\",\n content: toolResults,\n });\n } else {\n result.push(msg);\n i++;\n }\n }\n\n return result;\n};\n\nexport const callAnthropic = async (\n config: ProviderConfig,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const { model, instructions, schema } = 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 let system = instructions;\n\n if (ctx.history[0]?.role === \"system\") {\n system = ctx.history[0].content;\n }\n\n const messages = convertToAnthropicFormat(ctx.history);\n\n if (schema) {\n const schemaPrompt = `\\n\\nYou must respond with valid JSON that matches this schema:\\n${JSON.stringify(\n schema.schema,\n null,\n 2,\n )}\\n\\nReturn only the JSON object, no other text or formatting.`;\n system = system ? system + schemaPrompt : schemaPrompt.slice(2);\n }\n\n const body: any = {\n model,\n messages,\n max_tokens: 4096,\n stream: !!ctx.stream,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (ctx.tools && ctx.tools.length > 0) {\n body.tools = ctx.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters,\n }));\n }\n\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n signal: ctx.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleAnthropicStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const content = data.content[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: content.type === \"text\" ? content.text : \"\",\n };\n\n if (content.type === \"tool_use\") {\n msg.tool_calls = [\n {\n id: content.id,\n type: \"function\",\n function: {\n name: content.name,\n arguments: JSON.stringify(content.input),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleAnthropicStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n fullContent += parsed.delta.text;\n if (ctx.stream) {\n ctx.stream({ type: 'content', content: parsed.delta.text });\n }\n }\n\n if (\n parsed.type === \"content_block_start\" &&\n parsed.content_block?.type === \"tool_use\"\n ) {\n const toolUse = parsed.content_block;\n toolCalls.push({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: \"\",\n },\n index: parsed.index,\n });\n }\n\n if (\n parsed.type === \"content_block_delta\" &&\n parsed.delta?.type === \"input_json_delta\"\n ) {\n const toolCall = toolCalls.find((tc) => tc.index === parsed.index);\n if (toolCall) {\n toolCall.function.arguments += parsed.delta.partial_json;\n }\n }\n } catch (e) {\n // skip invalid JSON lines\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: fullContent,\n };\n\n if (toolCalls.length > 0) {\n msg.tool_calls = toolCalls.map(({ index, ...tc }) => tc);\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n","import { ConversationContext, Message, ProviderConfig } from \"../types\";\nimport { getKey } from \"../utils\";\n\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 signal: ctx.abortSignal,\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google API error: ${error}`);\n }\n\n if (ctx.stream) {\n return handleGoogleStream(response, ctx);\n }\n const data = (await response.json()) as any;\n const candidate = data.candidates[0];\n const part = candidate.content.parts[0];\n\n const msg: Message & { tool_calls?: any[] } = {\n role: \"assistant\",\n content: part.text || \"\",\n };\n\n if (part.functionCall) {\n msg.tool_calls = [\n {\n id: Math.random().toString(36).substring(2, 9),\n type: \"function\",\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n },\n ];\n }\n\n return {\n ...ctx,\n lastResponse: msg,\n history: [...ctx.history, msg],\n };\n};\n\nconst handleGoogleStream = async (\n response: Response,\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n\n let fullContent = \"\";\n const toolCalls: any[] = [];\n let buffer = \"\";\n\n try {\n while (true) {\n if (ctx.abortSignal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n \n // keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n\n try {\n const parsed = JSON.parse(data);\n const candidate = parsed.candidates?.[0];\n const 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 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 or 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 if (currentCtx.abortSignal?.aborted) {\n break;\n }\n\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 (\n currentCtx.lastResponse?.tool_calls &&\n currentCtx.tools?.length &&\n !currentCtx.abortSignal?.aborted\n );\n\n return currentCtx;\n };\n};\n\nconst executeTools = async (\n ctx: ConversationContext,\n): Promise<ConversationContext> => {\n const calls = ctx.lastResponse?.tool_calls || [];\n if (!calls.length) return ctx;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_calls_ready\", calls });\n }\n\n const toolConfig = ctx.toolConfig || {};\n const {\n requireApproval = false,\n approvalCallback,\n parallel = false,\n retryCount = 0,\n approvalId,\n executeOnApproval = false,\n } = toolConfig;\n\n const updatedCounts = { ...(ctx.toolCallCounts || {}) };\n\n const runCall = async (call: ToolCall, approved: boolean) => {\n if (!approved) {\n if (ctx.stream) {\n ctx.stream({\n type: \"tool_error\",\n call,\n error: \"Tool execution denied by user\",\n });\n }\n return {\n call,\n result: { error: \"Tool execution denied by user\" },\n };\n }\n\n const toolName = call.function.name;\n const limits = ctx.toolLimits || {};\n const maxCalls = limits[toolName];\n const currentCount = updatedCounts[toolName] || 0;\n\n if (maxCalls && currentCount >= maxCalls) {\n const error = `Tool ${toolName} has reached its limit of ${maxCalls} calls`;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return {\n call,\n result: { error },\n };\n }\n\n updatedCounts[toolName] = currentCount + 1;\n\n if (ctx.stream) {\n ctx.stream({ type: \"tool_executing\", call });\n }\n\n let lastError: Error | undefined;\n for (let i = 0; i <= retryCount; i++) {\n try {\n const executor = ctx.toolExecutors?.[call.function.name];\n if (!executor) {\n throw new Error(`Tool executor not found: ${call.function.name}`);\n }\n let args = {};\n try {\n args = call.function.arguments\n ? JSON.parse(call.function.arguments)\n : {};\n } catch (e) {\n throw new Error(\n `Invalid JSON arguments for tool ${call.function.name}: ${call.function.arguments}`,\n );\n }\n const result = await executor(args);\n if (ctx.stream) {\n ctx.stream({ type: \"tool_complete\", call, result });\n }\n return { call, result };\n } catch (e) {\n lastError = e as Error;\n }\n }\n\n const error = lastError!.message;\n if (ctx.stream) {\n ctx.stream({ type: \"tool_error\", call, error });\n }\n return { call, result: { error } };\n };\n\n if (executeOnApproval && requireApproval) {\n const resultPromises = calls.map(async (call) => {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return runCall(call, approved);\n });\n\n const results = await Promise.all(resultPromises);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n }\n\n const approvalPromises = calls.map(async (call) => {\n if (requireApproval) {\n let approved: boolean;\n\n if (approvalCallback) {\n approved = await approvalCallback(call);\n } else {\n const response = await requestApproval(call, approvalId);\n approved = response.approved;\n }\n\n return { call, approved };\n } else {\n return { call, approved: true };\n }\n });\n\n const approvals = await Promise.all(approvalPromises);\n\n const runCallWithApproval = async (call: ToolCall) => {\n const approval = approvals.find((a) => a.call.id === call.id);\n return runCall(call, approval?.approved ?? true);\n };\n\n const results = parallel\n ? await Promise.all(calls.map(runCallWithApproval))\n : await runCallsSequentially(calls, runCallWithApproval);\n\n return {\n ...ctx,\n history: [\n ...ctx.history,\n ...results.map(({ call, result }) => ({\n role: \"tool\" as const,\n tool_call_id: call.id,\n content: JSON.stringify(result),\n })),\n ],\n toolCallCounts: updatedCounts,\n };\n};\n\nconst runCallsSequentially = async (\n calls: ToolCall[],\n runCall: (call: ToolCall) => Promise<{ call: ToolCall; result: any }>,\n) => {\n const results: { call: ToolCall; result: any }[] = [];\n for (const call of calls) {\n results.push(await runCall(call));\n }\n return results;\n};\n","import {\n Message,\n ConversationContext,\n StepFunction,\n ThreadStore,\n Thread,\n} from \"./types\";\nimport { model } from \"./composition/model\";\n\nconst createMemoryStore = (): ThreadStore => {\n const store = new Map<string, Message[]>();\n\n return {\n async get(threadId: string): Promise<Message[]> {\n return store.get(threadId) || [];\n },\n\n async set(threadId: string, messages: Message[]): Promise<void> {\n store.set(threadId, messages);\n },\n };\n};\n\nconst createThread = (id: string, store: ThreadStore): Thread => {\n return {\n id,\n store,\n async generate(workflow: StepFunction): Promise<ConversationContext> {\n const history = await store.get(id);\n\n const initialContext: ConversationContext = {\n history,\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await workflow(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n async message(\n content: string,\n workflow?: StepFunction,\n ): Promise<ConversationContext> {\n const history = await store.get(id);\n const initialContext: ConversationContext = {\n history: [...history, { role: \"user\", content }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n const finalContext = await (workflow || model())(initialContext);\n await store.set(id, finalContext.history);\n\n return finalContext;\n },\n };\n};\n\nconst threads = new Map<string, Thread>();\n\n/**\n * @example\n * // in-memory (default)\n * const thread = getOrCreateThread('user-123');\n *\n * @example\n * // sqlite\n * const thread = getOrCreateThread('user-123', {\n * async get(id) {\n * const row = await db.get('SELECT messages FROM threads WHERE id = ?', id);\n * return row ? JSON.parse(row.messages) : [];\n * },\n * async set(id, messages) {\n * await db.run(\n * 'INSERT OR REPLACE INTO threads (id, messages, updated_at) VALUES (?, ?, ?)',\n * id,\n * JSON.stringify(messages),\n * Date.now()\n * );\n * }\n * });\n */\nexport const getOrCreateThread = (id: string, store?: ThreadStore): Thread => {\n const cacheKey = store ? `${id}-${store}` : id;\n\n if (threads.has(cacheKey)) {\n return threads.get(cacheKey)!;\n }\n\n const threadStore = store || createMemoryStore();\n const thread = createThread(id, threadStore);\n threads.set(cacheKey, thread);\n return thread;\n};\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const when = (\n condition: (ctx: ConversationContext) => boolean,\n action: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n if (condition(ctx)) {\n return await action(ctx);\n }\n return ctx;\n };\n};\n","import { ConversationContext, StepFunction } from \"./types\";\nimport { when } from \"./composition/when\";\n\n/**\n * scope({ until: noToolsCalled() })\n */\nexport const noToolsCalled =\n () =>\n (ctx: ConversationContext): boolean => {\n return (\n !ctx.lastResponse?.tool_calls || ctx.lastResponse.tool_calls.length === 0\n );\n };\n\nexport const everyNMessages = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) =>\n Math.floor(ctx.history.length / n) > Math.floor(lastTriggeredAt / n),\n async (ctx) => {\n lastTriggeredAt = ctx.history.length;\n return await step(ctx);\n },\n );\n};\n\nexport const everyNTokens = (n: number, step: StepFunction): StepFunction => {\n let lastTriggeredAt = 0;\n\n return when(\n (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n return Math.floor(totalTokens / n) > Math.floor(lastTriggeredAt / n);\n },\n async (ctx) => {\n const totalTokens = ctx.history.reduce(\n (acc, msg) => acc + Math.ceil(msg.content.length / 4),\n 0,\n );\n lastTriggeredAt = totalTokens;\n return await step(ctx);\n },\n );\n};\n\nexport const appendToLastRequest = (content: string): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return ctx;\n\n const newHistory = [...ctx.history];\n newHistory[lastUserIndex] = {\n ...newHistory[lastUserIndex],\n content: newHistory[lastUserIndex].content + content,\n };\n\n return {\n ...ctx,\n history: newHistory,\n };\n };\n};\n\n/**\n * toolNotUsedInNTurns({ toolName: \"search_web\", times: 10 }, appendToLastRequest(\"consider using web search...\"))\n */\nexport const toolNotUsedInNTurns = (\n { toolName, times }: { toolName: string; times: number },\n step: StepFunction,\n): StepFunction => {\n let turnsSinceLastUsed = 0;\n let lastProcessedTurn = -1;\n\n return when((ctx) => {\n const currentTurn = getCurrentTurn(ctx);\n\n // only check once per turn\n if (currentTurn === lastProcessedTurn) return false;\n lastProcessedTurn = currentTurn;\n\n // check if tool was used in this turn\n const toolUsedInTurn = wasToolUsedInCurrentTurn(ctx, toolName);\n\n if (toolUsedInTurn) {\n turnsSinceLastUsed = 0;\n return false;\n } else {\n turnsSinceLastUsed++;\n return turnsSinceLastUsed >= times;\n }\n }, step);\n};\n\nconst getCurrentTurn = (ctx: ConversationContext): number => {\n let turns = 0;\n for (const msg of ctx.history) {\n if (msg.role === \"user\") turns++;\n }\n return turns;\n};\n\nconst wasToolUsedInCurrentTurn = (\n ctx: ConversationContext,\n toolName: string,\n): boolean => {\n // find the last user message and check all messages after it for tool usage\n let lastUserIndex = -1;\n for (let i = ctx.history.length - 1; i >= 0; i--) {\n if (ctx.history[i].role === \"user\") {\n lastUserIndex = i;\n break;\n }\n }\n\n if (lastUserIndex === -1) return false;\n\n // check messages after last user message for tool calls\n for (let i = lastUserIndex + 1; i < ctx.history.length; i++) {\n const msg = ctx.history[i];\n if (msg.role === \"assistant\" && ctx.lastResponse?.tool_calls) {\n return ctx.lastResponse.tool_calls.some(\n (call) => call.function.name === toolName,\n );\n }\n }\n\n return false;\n};\n\nexport const toolWasCalled =\n (name: string) =>\n (ctx: ConversationContext): boolean => {\n return (\n !!ctx.lastResponse?.tool_calls &&\n ctx.lastResponse.tool_calls.some((call) => call.function.name === name)\n );\n };\n","import { ConversationContext, StepFunction } from \"../types\";\n\nexport const tap = (\n fn: (ctx: ConversationContext) => Promise<void> | void,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n await fn(ctx);\n return ctx;\n };\n};\n","import { StepFunction, ConversationContext, RetryOptions } from \"../types\";\n\n/**\n * scope({}, retry({ times: 2 }, model(...)))\n */\nexport const retry = (\n { times = 3 }: RetryOptions = {},\n step: StepFunction,\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let err: Error;\n\n for (let i = 0; i < times; i++) {\n try {\n return await step(ctx);\n } catch (e) {\n err = e as Error;\n }\n }\n\n throw err!;\n };\n};\n","import { ComposedFunction, ConversationContext, StepFunction } from \"../types\";\n\nconst enrichContext = (ctx: ConversationContext): ConversationContext => {\n const lastUserMessage = [...ctx.history]\n .reverse()\n .find((msg) => msg.role === \"user\");\n return {\n ...ctx,\n lastRequest: lastUserMessage,\n };\n};\n\nexport const compose = (...steps: StepFunction[]): ComposedFunction => {\n return async (ctxOrMessage: ConversationContext | string): Promise<ConversationContext> => {\n let initialContext: ConversationContext;\n\n if (typeof ctxOrMessage === \"string\") {\n initialContext = {\n history: [{ role: \"user\", content: ctxOrMessage }],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n } else {\n initialContext = ctxOrMessage || {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n }\n\n let next = enrichContext(initialContext);\n\n for (const step of steps) {\n next = await step(enrichContext(next));\n }\n\n return next;\n };\n};\n","import { compose } from \"./compose\";\nimport {\n ConversationContext,\n Inherit,\n ScopeConfig,\n StepFunction,\n} from \"../types\";\nimport { toolConfigToToolDefinition } from \"../utils\";\n\nconst scopeContext = (\n config: ScopeConfig,\n ctx: ConversationContext,\n): ConversationContext => {\n // const inherit = config.inherit ?? Inherit.Nothing;\n const inherit = config.inherit ?? Inherit.Conversation;\n\n let scopedCtx: ConversationContext = {\n history: [],\n tools: [],\n toolExecutors: {},\n toolLimits: {},\n toolCallCounts: {},\n };\n\n // inheritance\n\n if (inherit & Inherit.Conversation) {\n scopedCtx.history = ctx.history;\n scopedCtx.lastResponse = ctx.lastResponse;\n scopedCtx.lastRequest = ctx.lastRequest;\n }\n\n if (inherit & Inherit.Tools) {\n scopedCtx.tools = [...(ctx.tools || [])];\n scopedCtx.toolExecutors = { ...(ctx.toolExecutors || {}) };\n scopedCtx.toolLimits = { ...(ctx.toolLimits || {}) };\n scopedCtx.toolCallCounts = { ...(ctx.toolCallCounts || {}) };\n scopedCtx.toolConfig = ctx.toolConfig ? { ...ctx.toolConfig } : undefined;\n }\n\n scopedCtx.stream = ctx.stream;\n scopedCtx.abortSignal = ctx.abortSignal;\n\n if (config.tools) {\n const toolDefinitions = config.tools.map(toolConfigToToolDefinition);\n const toolExecutors = config.tools.reduce(\n (acc, tool) => {\n acc[tool.name] = tool.execute;\n\n return acc;\n },\n {} as Record<string, Function>,\n );\n const toolLimits = config.tools.reduce(\n (acc, tool) => {\n if (tool._maxCalls) {\n acc[tool.name] = tool._maxCalls;\n }\n\n return acc;\n },\n {} as Record<string, number>,\n );\n\n scopedCtx.tools = toolDefinitions;\n scopedCtx.toolExecutors = toolExecutors;\n scopedCtx.toolLimits = toolLimits;\n }\n\n if (config.toolConfig) {\n scopedCtx.toolConfig = { ...config.toolConfig };\n }\n\n if (config.system) {\n const [first, ...rest] = scopedCtx.history;\n if (first?.role === \"system\") {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...rest];\n } else {\n scopedCtx.history = [{ role: \"system\", content: config.system }, ...scopedCtx.history];\n }\n }\n\n if (config.stream) {\n scopedCtx.stream = config.stream;\n }\n\n return scopedCtx;\n};\n\nexport const scope = (\n config: ScopeConfig,\n ...steps: StepFunction[]\n): StepFunction => {\n return async (ctx: ConversationContext): Promise<ConversationContext> => {\n let scopedCtx = scopeContext(config, ctx);\n\n if (config.until) {\n do {\n scopedCtx = await compose(...steps)(scopedCtx);\n } while (!config.until(scopedCtx));\n } else {\n scopedCtx = await compose(...steps)(scopedCtx);\n }\n\n return {\n ...ctx,\n history: config.silent ? ctx.history : scopedCtx.history,\n lastResponse: config.silent ? ctx.lastResponse : scopedCtx.lastResponse,\n lastRequest: config.silent ? ctx.lastRequest : scopedCtx.lastRequest,\n stopReason: config.silent ? ctx.stopReason : scopedCtx.stopReason,\n };\n };\n};\n","type RateLimitConfig = {\n rps: number;\n burst: number;\n concurrency: number;\n};\n\ntype QueueItem = {\n fn: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n};\n\n/**\n * creates a rate limiter that wraps async functions with burst, rate, and concurrency controls\n *\n * @param config - rate limit configuration\n * @param config.rps - maximum requests per second\n * @param config.burst - maximum burst size (initial token bucket capacity)\n * @param config.concurrency - maximum concurrent in-flight requests\n *\n * @example\n * const limiter = rateLimited({ rps: 10, burst: 20, concurrency: 5 });\n *\n * const workflow = limiter(\n * compose(\n * scope({ tools: [searchTool] }, model())\n * )\n * );\n *\n * await workflow(\"hello\");\n */\nexport const rateLimited =\n (config: RateLimitConfig) =>\n <T extends (...args: any[]) => Promise<any>>(fn: T): T => {\n const { rps, burst, concurrency } = config;\n\n let tokens = burst;\n let inFlight = 0;\n const queue: QueueItem[] = [];\n let intervalId: NodeJS.Timeout | null = null;\n\n const refillTokens = () => {\n tokens = Math.min(tokens + 1, burst);\n processQueue();\n };\n\n const startInterval = () => {\n if (!intervalId) {\n intervalId = setInterval(refillTokens, 1000 / rps);\n }\n };\n\n const stopInterval = () => {\n if (intervalId && queue.length === 0 && inFlight === 0) {\n clearInterval(intervalId);\n intervalId = null;\n }\n };\n\n const processQueue = () => {\n while (queue.length > 0 && tokens > 0 && inFlight < concurrency) {\n tokens--;\n inFlight++;\n\n const item = queue.shift()!;\n\n item\n .fn()\n .then((result) => {\n inFlight--;\n item.resolve(result);\n processQueue();\n stopInterval();\n })\n .catch((error) => {\n inFlight--;\n item.reject(error);\n processQueue();\n stopInterval();\n });\n }\n };\n\n return (async (...args: any[]) => {\n return new Promise((resolve, reject) => {\n queue.push({\n fn: () => fn(...args),\n resolve,\n reject,\n });\n startInterval();\n processQueue();\n });\n }) as T;\n };\n"],"mappings":"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","names":["Inherit","model","maxCalls","model","extractor","model","model","model","msg","model","model","maxCalls","error","results"]}
|