@microfox/ai-router 2.0.0 → 2.0.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +40 -1
- package/package.json +1 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -11
- package/dist/chunk-BJTO5JO5.mjs.map +0 -1
- package/dist/fs_store.d.mts +0 -5
- package/dist/fs_store.d.ts +0 -5
- package/dist/fs_store.js +0 -122
- package/dist/fs_store.js.map +0 -1
- package/dist/fs_store.mjs +0 -101
- package/dist/fs_store.mjs.map +0 -1
- package/dist/index.d.mts +0 -448
- package/dist/index.d.ts +0 -448
- package/dist/index.js +0 -1390
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -1347
- package/dist/index.mjs.map +0 -1
- package/dist/store-BBHh-uTh.d.mts +0 -27
- package/dist/store-BBHh-uTh.d.ts +0 -27
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/router.ts","../../../node_modules/nanoid/index.js","../src/helper.ts","../src/store.ts"],"sourcesContent":["import {\n UIMessage,\n createUIMessageStream,\n UIMessageStreamWriter,\n createUIMessageStreamResponse,\n UIDataTypes,\n generateId,\n Tool,\n tool,\n JSONValue,\n ToolCallOptions,\n convertToModelMessages,\n ToolSet,\n DataUIPart,\n pipeUIMessageStreamToResponse,\n readUIMessageStream,\n} from 'ai';\nimport { StreamWriter } from './helper.js';\nimport { UITools } from './types.js';\nimport { z, ZodObject, ZodType } from 'zod';\nimport path from 'path';\nimport { Store, MemoryStore } from './store.js';\n\n// Add global logger management\nlet globalLogger: AiLogger | undefined = undefined;\n\n/**\n * Sets a global logger that will be used by all router instances when no instance-specific logger is set.\n * This is useful for debugging across multiple router instances.\n * @param logger The logger to use globally, or undefined to disable global logging\n */\nexport function setGlobalLogger(logger?: AiLogger) {\n globalLogger = logger;\n}\n\n/**\n * Gets the current global logger.\n * @returns The current global logger or undefined if none is set\n */\nexport function getGlobalLogger(): AiLogger | undefined {\n return globalLogger;\n}\n\n// --- Helper Functions ---\n/**\n * Clubs parts based on toolCallId for tool-* types and id for data-* types\n * @param parts Array of parts to club\n * @returns Clubbed parts array\n */\nfunction clubParts(parts: any[]): any[] {\n if (!parts || parts.length === 0) return parts;\n\n const clubbedParts: any[] = [];\n const toolCallIdGroups = new Map<string, any[]>();\n const dataIdGroups = new Map<string, any[]>();\n\n // Group parts by toolCallId for tool-* types and by id for data-* types\n for (const part of parts) {\n if (part.type?.startsWith('tool-') && (part as any).toolCallId) {\n const toolCallId = (part as any).toolCallId;\n if (!toolCallIdGroups.has(toolCallId)) {\n toolCallIdGroups.set(toolCallId, []);\n }\n toolCallIdGroups.get(toolCallId)!.push(part);\n } else if (part.type?.startsWith('data-') && part.id) {\n const id = part.id;\n if (!dataIdGroups.has(id)) {\n dataIdGroups.set(id, []);\n }\n dataIdGroups.get(id)!.push(part);\n } else {\n // For parts that don't match the clubbing criteria, add them directly\n clubbedParts.push(part);\n }\n }\n\n // Add clubbed tool parts\n for (const [toolCallId, toolParts] of toolCallIdGroups) {\n if (toolParts.length === 1) {\n clubbedParts.push(toolParts[0]);\n } else {\n // Merge multiple parts with same toolCallId\n const mergedPart = { ...toolParts[0] };\n // Combine any additional properties from other parts\n for (let i = 1; i < toolParts.length; i++) {\n const currentPart = toolParts[i];\n // Merge properties, giving priority to later parts\n Object.keys(currentPart).forEach((key) => {\n if (key !== 'type' && key !== 'toolCallId') {\n mergedPart[key] = currentPart[key];\n }\n });\n }\n clubbedParts.push(mergedPart);\n }\n }\n\n // Add clubbed data parts\n for (const [id, dataParts] of dataIdGroups) {\n if (dataParts.length === 1) {\n clubbedParts.push(dataParts[0]);\n } else {\n // Merge multiple parts with same id\n const mergedPart = { ...dataParts[0] };\n // Combine any additional properties from other parts\n for (let i = 1; i < dataParts.length; i++) {\n const currentPart = dataParts[i];\n // Merge properties, giving priority to later parts\n Object.keys(currentPart).forEach((key) => {\n if (key !== 'type' && key !== 'id') {\n mergedPart[key] = currentPart[key];\n }\n });\n }\n clubbedParts.push(mergedPart);\n }\n }\n\n return clubbedParts;\n}\n\n// --- Custom Errors ---\nexport class AiKitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AiKitError';\n }\n}\n\nexport class AgentNotFoundError extends AiKitError {\n constructor(path: string) {\n super(`[AiAgentKit] Agent not found for path: ${path}`);\n this.name = 'AgentNotFoundError';\n }\n}\n\n/**\n * @deprecated This error class is deprecated and will be removed in a future version.\n * Use agent-as-tools pattern instead.\n */\nexport class ToolNotFoundError extends AiKitError {\n constructor(path: string) {\n super(`[AiAgentKit] Tool not found at path: ${path}`);\n this.name = 'ToolNotFoundError';\n }\n}\n\n/**\n * @deprecated This error class is deprecated and will be removed in a future version.\n * Use agent-as-tools pattern instead.\n */\nexport class ToolValidationError extends AiKitError {\n constructor(path: string, validationError: z.ZodError) {\n const message = `[AiAgentKit] Tool call validation failed for path: ${path}: ${validationError.message}`;\n super(message);\n this.name = 'ToolValidationError';\n }\n}\n\nexport class MaxCallDepthExceededError extends AiKitError {\n constructor(maxDepth: number) {\n super(`[AiAgentKit] Agent call depth limit (${maxDepth}) exceeded.`);\n this.name = 'MaxCallDepthExceededError';\n }\n}\n\nexport class AgentDefinitionMissingError extends AiKitError {\n constructor(path: string) {\n super(\n `[AiAgentKit] agentAsTool: No definition found for \"${path}\". Please define it using '.actAsTool()' or pass a definition as the second argument.`\n );\n this.name = 'AgentDefinitionMissingError';\n }\n}\n\n// --- Dynamic Parameter Support ---\n\n/**\n * Converts a path pattern with dynamic parameters (e.g., \"/users/:id/posts/:postId\")\n * into a RegExp that can match actual paths and extract parameters.\n * @param pattern The path pattern with dynamic parameters\n * @returns A RegExp and parameter names array\n */\nfunction parsePathPattern(pattern: string): {\n regex: RegExp;\n paramNames: string[];\n} {\n const paramNames: string[] = [];\n // Split the pattern by dynamic parameter segments, but keep the segments in the result\n const parts = pattern.split(/(\\/:[^\\/]+)/);\n\n const regexPattern = parts\n .map((part) => {\n if (part.startsWith('/:')) {\n // This is a dynamic segment like \"/:id\"\n paramNames.push(part.substring(2)); // Extract \"id\"\n return '/([^/]+)'; // Replace with a capturing group\n }\n // This is a static segment, escape any special regex characters in it\n return part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n })\n .join('');\n\n const regex = new RegExp(`^${regexPattern}$`);\n\n return { regex, paramNames };\n}\n\n/**\n * Extracts dynamic parameters from a path based on a pattern.\n * @param pattern The path pattern with dynamic parameters\n * @param path The actual path to extract parameters from\n * @returns An object with extracted parameters or null if no match\n */\nfunction extractPathParams(\n pattern: string,\n path: string\n): Record<string, string> | null {\n const { regex, paramNames } = parsePathPattern(pattern);\n const match = path.match(regex);\n\n if (!match) {\n return null;\n }\n\n const params: Record<string, string> = {};\n paramNames.forEach((paramName, index) => {\n const value = match[index + 1]; // +1 because match[0] is the full match\n if (value !== undefined) {\n params[paramName] = value;\n }\n });\n\n return params;\n}\n\n/**\n * Checks if a path pattern contains dynamic parameters.\n * @param pattern The path pattern to check\n * @returns True if the pattern contains dynamic parameters\n */\nfunction hasDynamicParams(pattern: string): boolean {\n return /\\/:[^\\/]+/.test(pattern);\n}\n\nexport type AiStreamWriter<\n METADATA = unknown,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = UIMessageStreamWriter<UIMessage<METADATA, PARTS, TOOLS>> &\n Omit<StreamWriter<METADATA, TOOLS>, 'writer'> & {\n generateId: typeof generateId;\n };\n\n// --- Core Types ---\n\n/**\n * The context object passed to every agent, tool, and middleware. It contains\n * all the necessary information and utilities for a handler to perform its work.\n * @template METADATA - The type for custom metadata in UI messages.\n * @template PARTS - The type for custom parts in UI messages.\n * @template TOOLS - The type for custom tools in UI messages.\n * @template ContextState - The type for the shared state object.\n */\nexport type AiContext<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = {\n request: {\n /** The message history for the current request. */\n messages: UIMessage<METADATA, PARTS, TOOLS>[];\n /** Parameters passed from an internal tool or agent call. */\n params: PARAMS;\n [key: string]: any;\n } & METADATA;\n /** A shared, mutable state object that persists for the lifetime of a single request. */\n state: ContextState;\n /** A shared, mutable store object that persists for the lifetime of a single request. */\n store: Store;\n /**\n * Internal execution context for the router. Should not be modified by user code.\n * @internal\n */\n executionContext: {\n handlerPathStack?: string[];\n currentPath?: string;\n callDepth?: number;\n [key: string]: any;\n };\n /**\n * A unique ID for the top-level request, useful for logging and tracing.\n */\n requestId: string;\n /**\n * A structured logger that automatically includes the `requestId` and current handler path.\n */\n logger: AiLogger;\n /**\n * The stream writer to send data back to the end-user's UI.\n * Includes helpers for writing structured data like tool calls and metadata.\n */\n response: AiStreamWriter<Partial<METADATA>, PARTS, TOOLS>;\n /**\n * Provides functions for an agent to dispatch calls to other agents or tools.\n * @internal\n */\n next: NextHandler<METADATA, ContextState, PARAMS, PARTS, TOOLS>;\n\n _onExecutionStart?: () => void;\n _onExecutionEnd?: () => void;\n};\n\n/** Represents the `next` function in a middleware chain, used to pass control to the next handler. */\nexport type NextFunction = () => Promise<any>;\n/** A function that handles a request for a specific agent path. */\nexport type AiHandler<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = (\n ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>\n) => Promise<any>;\n\n/**\n * @deprecated Use agent-as-tools pattern instead. This type will be removed in a future version.\n * Create agents and use `.actAsTool()` to expose them as tools.\n */\nexport type AiToolHandler<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> =\n | ((\n ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n params: PARAMS\n ) => Promise<any>)\n | ((\n ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>\n ) => Tool<any, any>);\n\n/**\n * @deprecated Use agent-as-tools pattern instead. This type will be removed in a future version.\n * Create agents and use `.actAsTool()` to expose them as tools.\n */\nexport type AiToolFactory<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = (\n ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>\n) => Tool<any, any>;\n\n/** A function that acts as middleware, processing a request and optionally passing control to the next handler. */\nexport type AiMiddleware<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = (\n ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n next: NextFunction\n) => Promise<any>;\n\n// --- Router Implementation ---\n\n/** A simple structured logger interface. */\nexport type AiLogger = {\n log: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n};\n\n/** Internal representation of a registered handler in the router's stack. */\ntype Layer<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> = {\n path: string | RegExp;\n handler: AiMiddleware<METADATA, ContextState, PARAMS, PARTS, TOOLS>;\n isTool: boolean;\n toolOptions?:\n | {\n type: 'static';\n schema: ZodObject<any>;\n description?: string;\n handler: AiToolHandler<METADATA, ContextState, PARAMS, PARTS, TOOLS>;\n }\n | {\n type: 'factory';\n factory: AiToolFactory<METADATA, ContextState, PARAMS, PARTS, TOOLS>;\n };\n isAgent: boolean;\n // Dynamic parameter support\n hasDynamicParams?: boolean;\n paramNames?: string[];\n};\n\nexport type AgentTool<\n INPUT extends JSONValue | unknown | never = any,\n OUTPUT extends JSONValue | unknown | never = any,\n> = Tool<INPUT, OUTPUT> & {\n name: string;\n id: string;\n metadata?: Record<string, any> & {\n absolutePath?: string;\n name?: string;\n description?: string;\n toolKey?: string;\n icon?: string;\n parentTitle?: string;\n title?: string;\n hideUI?: boolean;\n };\n};\n\nexport type AgentData = {\n metadata?: Record<string, any> & {\n absolutePath?: string;\n name?: string;\n description?: string;\n toolKey?: string;\n icon?: string;\n parentTitle?: string;\n title?: string;\n hideUI?: boolean;\n };\n [key: string]: any;\n};\n\n/**\n * A composable router for building structured, multi-agent AI applications.\n * It allows you to define agents and tools, compose them together, and handle\n * requests in a predictable, middleware-style pattern.\n *\n * @template KIT_METADATA - The base metadata type for all UI messages in this router.\n * @template PARTS - The base custom parts type for all UI messages.\n * @template TOOLS - The base custom tools type for all UI messages.\n * @template ContextState - The base type for the shared state object.\n */\nexport class AiRouter<\n KIT_METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = {},\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n REGISTERED_TOOLS extends ToolSet = {},\n> {\n private stack: Layer<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>[] = [];\n public actAsToolDefinitions: Map<string | RegExp, AgentTool<any, any>> =\n new Map();\n private logger?: AiLogger = undefined;\n private _store: Store = new MemoryStore();\n public toolExecutionPromise: Promise<any> = Promise.resolve();\n\n /** Configuration options for the router instance. */\n public options: {\n /** The maximum number of agent-to-agent calls allowed in a single request to prevent infinite loops. */\n maxCallDepth: number;\n } = {\n maxCallDepth: 10,\n };\n\n /**\n * Constructs a new AiAgentKit router.\n * @param stack An optional initial stack of layers, used for composing routers.\n * @param options Optional configuration for the router.\n */\n constructor(\n stack?: Layer<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>[],\n options?: { maxCallDepth?: number; logger?: AiLogger }\n ) {\n // Remove logger from constructor - it should be set via setLogger\n if (stack) {\n this.stack = stack;\n }\n if (options?.maxCallDepth) {\n this.options.maxCallDepth = options.maxCallDepth;\n }\n }\n\n setStore(store: Store) {\n this._store = store;\n }\n\n /**\n * Sets a logger for this router instance.\n * If no logger is set, the router will fall back to the global logger.\n * @param logger The logger to use for this router instance, or undefined to use global logger\n */\n setLogger(logger?: AiLogger) {\n this.logger = logger;\n }\n\n /**\n * Gets the effective logger for this router instance.\n * Returns instance logger if set, otherwise falls back to global logger.\n * @returns The effective logger or undefined if no logging should occur\n */\n private _getEffectiveLogger(): AiLogger | undefined {\n return this.logger ?? globalLogger;\n }\n\n /**\n * Registers a middleware-style agent that runs for a specific path prefix, regex pattern, or wildcard.\n * Agents can modify the context and must call `next()` to pass control to the next handler in the chain.\n * This method is primarily for middleware. For terminal agents, see `.agent()` on an instance.\n *\n * @param path The path prefix, regex pattern, or \"*\" for wildcard matching.\n * @param agents The agent middleware function(s).\n */\n agent<\n const TAgents extends (\n | AiMiddleware<any, any, any, any, any>\n | AiRouter<any, any, any, any, any, any>\n )[],\n >(\n agentPath:\n | string\n | RegExp\n | AiMiddleware<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n ...agents: TAgents\n ): AiRouter<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS,\n REGISTERED_TOOLS &\n (TAgents[number] extends AiRouter<any, any, any, any, any, infer R>\n ? R\n : {})\n > {\n let prefix: string | RegExp = '/';\n if (typeof agentPath === 'string' || agentPath instanceof RegExp) {\n prefix = agentPath;\n } else {\n agents.unshift(agentPath);\n }\n\n for (const handler of agents) {\n if (typeof handler !== 'function') {\n // Check if it's an AiAgentKit instance for mounting\n if (handler instanceof AiRouter && typeof prefix === 'string') {\n const stackToMount = handler.getStackWithPrefix(prefix);\n this.stack.push(...(stackToMount as any));\n this.logger?.log(\n `Router mounted: path=${prefix}, layers=${stackToMount.length}`\n );\n // Also mount actAsTool definitions from the sub-router\n const mountPath = prefix.toString();\n handler.actAsToolDefinitions.forEach((value, key) => {\n const keyPath = key.toString();\n const relativeKeyPath = keyPath.startsWith('/')\n ? keyPath.substring(1)\n : keyPath;\n const newKey = path.posix.join(mountPath, relativeKeyPath);\n this.actAsToolDefinitions.set(newKey, value);\n });\n }\n continue;\n }\n this.stack.push({\n path: prefix,\n handler: handler as any,\n isTool: false,\n isAgent: true, // Mark as an agent\n });\n this.logger?.log(`Agent registered: path=${prefix}`);\n }\n\n return this as any;\n }\n\n /**\n * Mounts a middleware function or another AiAgentKit router at a specific path.\n * This is the primary method for composing routers and applying cross-cutting middleware.\n *\n * @param path The path prefix to mount the handler on.\n * @param handler The middleware function or AiAgentKit router instance to mount.\n */\n use<\n THandler extends\n | AiMiddleware<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>\n | AiRouter<any, any, any, any, any, any>,\n >(\n mountPathArg: string | RegExp,\n handler: THandler\n ): AiRouter<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS,\n REGISTERED_TOOLS &\n (THandler extends AiRouter<any, any, any, any, any, infer R> ? R : {})\n > {\n if (mountPathArg instanceof RegExp && handler instanceof AiRouter) {\n throw new AiKitError(\n '[AiAgentKit] Mounting a router on a RegExp path is not supported.'\n );\n }\n\n if (handler instanceof AiRouter) {\n const router = handler;\n const mountPath = mountPathArg.toString().replace(/\\/$/, ''); // remove trailing slash\n // Mount routes from the sub-router\n router.stack.forEach((layer) => {\n const layerPath = layer.path.toString();\n // Prevent layer paths starting with '/' from being treated as absolute by join\n const relativeLayerPath = layerPath.startsWith('/')\n ? layerPath.substring(1)\n : layerPath;\n const newPath = path.posix.join(mountPath, relativeLayerPath);\n this.stack.push({ ...layer, path: newPath });\n });\n // Mount tool definitions from the sub-router\n router.actAsToolDefinitions.forEach((value, key) => {\n const keyPath = key.toString();\n const relativeKeyPath = keyPath.startsWith('/')\n ? keyPath.substring(1)\n : keyPath;\n const newKey = path.posix.join(mountPath, relativeKeyPath);\n this.actAsToolDefinitions.set(newKey, value);\n });\n } else {\n // It's a middleware\n this.stack.push({\n path: mountPathArg,\n handler: handler,\n isTool: false,\n isAgent: false, // Middleware is not a terminal agent\n });\n }\n return this as any;\n }\n\n /**\n * Pre-defines the schema and description for an agent when it is used as a tool by an LLM.\n * This allows `next.agentAsTool()` to create a valid `Tool` object without needing the definition at call time.\n * @param path The path of the agent being defined.\n * @param options The tool definition, including a Zod schema and description.\n */\n actAsTool<\n const TPath extends string | RegExp,\n const TTool extends AgentTool<any, any>,\n >(\n path: TPath,\n options: TTool\n ): AiRouter<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS,\n REGISTERED_TOOLS & {\n [K in TTool['id']]: Tool<\n z.infer<TTool['inputSchema']>,\n z.infer<TTool['outputSchema']>\n > & {\n metadata: TTool['metadata'] & {\n toolKey: TTool['id'];\n name: TTool['name'];\n description: TTool['description'];\n };\n };\n }\n > {\n this.actAsToolDefinitions.set(path, options);\n this.logger?.log(`[actAsTool] Added definition: at path ${path}`);\n this.logger?.log(\n `[actAsTool] Router now has ${this.actAsToolDefinitions.size} definitions`\n );\n return this as any;\n }\n\n getToolSet(): REGISTERED_TOOLS {\n let allTools = Array.from(this.actAsToolDefinitions.entries()).map(\n ([key, value]) => {\n return {\n ...value,\n metadata: {\n ...value.metadata,\n absolutePath: key,\n },\n } as AgentTool<any, any>;\n }\n ) as AgentTool<any, any>[];\n return allTools.reduce((acc, _tool) => {\n const { inputSchema, outputSchema } = _tool;\n acc[_tool.id] = {\n ...tool<z.infer<typeof inputSchema>, z.infer<typeof outputSchema>>(\n _tool\n ),\n metadata: {\n ..._tool.metadata,\n toolKey: _tool.id,\n name: _tool.name,\n description: _tool.description,\n },\n } as AgentTool<z.infer<typeof inputSchema>, z.infer<typeof outputSchema>>;\n return acc;\n }, {} as any) as REGISTERED_TOOLS;\n }\n\n getToolDefinition(path: string) {\n let definition = this.actAsToolDefinitions.get(path);\n if (!definition) {\n this.logger?.error(\n `[getToolDefinition] No definition found for path: ${path}`\n );\n throw new AgentDefinitionMissingError(path);\n }\n return definition;\n }\n\n /**\n * @deprecated Use agent-as-tools pattern instead. Create an agent and use `.actAsTool()` to expose it as a tool.\n * This method will be removed in a future version.\n *\n * Example migration:\n * ```typescript\n * // Old way (deprecated):\n * router.tool('/calculator', { schema: z.object({...}) }, async (ctx, params) => {...});\n *\n * // New way (recommended):\n * router.agent('/calculator', async (ctx) => {...})\n * .actAsTool('/calculator', { id: 'calculator', name: 'Calculator', ... });\n * ```\n */\n // Overload for factory-based tools\n tool<\n TOOL_METADATA extends Record<string, any> = Record<string, any>,\n TOOL_TOOLS extends UITools = UITools,\n TOOL_STATE extends Record<string, any> = Record<string, any>,\n >(\n path: string | RegExp,\n factory: AiToolFactory<\n TOOL_METADATA,\n PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\n >\n ): AiRouter<\n KIT_METADATA | TOOL_METADATA,\n PARTS,\n TOOLS & TOOL_TOOLS,\n ContextState & TOOL_STATE\n >;\n /**\n * @deprecated Use agent-as-tools pattern instead. Create an agent and use `.actAsTool()` to expose it as a tool.\n * This method will be removed in a future version.\n */\n // Overload for static tools\n tool<\n TOOL_METADATA extends Record<string, any> = Record<string, any>,\n TOOL_TOOLS extends UITools = UITools,\n TOOL_STATE extends Record<string, any> = Record<string, any>,\n TOOL_PARAMS extends ZodObject<any> = ZodObject<any>,\n >(\n path: string | RegExp,\n options: {\n schema: TOOL_PARAMS;\n description?: string;\n },\n handler: (\n ctx: AiContext<\n TOOL_METADATA,\n ContextState & TOOL_STATE,\n z.infer<TOOL_PARAMS>,\n PARTS,\n TOOL_TOOLS\n >,\n params: z.infer<TOOL_PARAMS>\n ) => Promise<any>\n ): AiRouter<\n KIT_METADATA | TOOL_METADATA,\n PARTS,\n TOOLS & TOOL_TOOLS,\n ContextState & TOOL_STATE\n >;\n /**\n * @deprecated Use agent-as-tools pattern instead. Create an agent and use `.actAsTool()` to expose it as a tool.\n * This method will be removed in a future version.\n */\n // Implementation\n tool<\n TOOL_METADATA extends Record<string, any> = Record<string, any>,\n TOOL_TOOLS extends UITools = UITools,\n TOOL_STATE extends Record<string, any> = Record<string, any>,\n TOOL_PARAMS extends ZodObject<any> = ZodObject<any>,\n >(\n path: string | RegExp,\n optionsOrFactory:\n | {\n schema: TOOL_PARAMS;\n description?: string;\n }\n | AiToolFactory<\n TOOL_METADATA,\n PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\n >,\n handler?: AiToolHandler<\n TOOL_METADATA,\n PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\n >\n ): AiRouter<\n KIT_METADATA | TOOL_METADATA,\n PARTS,\n TOOLS & TOOL_TOOLS,\n ContextState & TOOL_STATE\n > {\n this.logger?.warn(\n `[DEPRECATION WARNING] router.tool() is deprecated and will be removed in a future version. ` +\n `Please migrate to the agent-as-tools pattern: ` +\n `router.agent('${path}', async (ctx) => {...}).actAsTool('${path}', {...})`\n );\n this.logger?.log(`[AiAgentKit][tool] Registering tool at path:`, path);\n if (this.stack.some((l) => l.isTool && l.path === path)) {\n this.logger?.error(\n `[AiAgentKit][tool] Tool already registered for path: ${path}`\n );\n throw new AiKitError(`A tool is already registered for path: ${path}`);\n }\n if (typeof optionsOrFactory === 'function' && !handler) {\n const factory = optionsOrFactory as AiToolFactory<any, any, any, any>;\n const isDynamicPath = typeof path === 'string' && hasDynamicParams(path);\n\n const toolMiddleware: AiMiddleware<any, any, any, any, any> = async (\n ctx,\n _next\n ) => {\n this.logger?.log(\n `[Tool Middleware] Executing factory for path \"${path}\". Messages in context: ${\n ctx.request.messages?.length ?? 'undefined'\n }`\n );\n // Factory-based tool called directly.\n const toolObject = factory(ctx);\n\n if (!toolObject.execute) {\n throw new AiKitError(\n `[AiAgentKit] Tool from factory at path ${path} does not have an execute method.`\n );\n }\n\n // Validate parameters using the tool's schema\n const schema = toolObject.inputSchema as ZodObject<any> | undefined;\n if (!schema) {\n this.logger?.warn(\n `[AiAgentKit][tool] Factory-based tool at path ${path} has no inputSchema. Executing without params.`\n );\n return toolObject.execute({} as any, {} as ToolCallOptions);\n }\n\n const parsedParams = schema.safeParse(ctx.request.params);\n\n if (!parsedParams.success) {\n this.logger?.error(\n `[AiAgentKit][tool] Tool call validation failed for path: ${path}:`,\n parsedParams.error.message\n );\n throw new ToolValidationError(path.toString(), parsedParams.error);\n }\n\n // Execute the tool with validated parameters.\n // We pass empty options as this is a direct internal call.\n return toolObject.execute(parsedParams.data, {\n messages: convertToModelMessages(ctx.request.messages ?? []),\n toolCallId:\n 'tool-' +\n (path.toString()?.split('/').pop() ?? 'direct-call') +\n '-' +\n generateId(),\n });\n };\n this.stack.push({\n path,\n handler: toolMiddleware,\n isTool: true,\n toolOptions: {\n type: 'factory',\n factory,\n },\n isAgent: false,\n hasDynamicParams: isDynamicPath,\n });\n this.logger?.log(\n `Tool registered: path=${path}, type=factory${\n isDynamicPath ? ' (dynamic)' : ''\n }`\n );\n return this as any;\n }\n if (typeof optionsOrFactory === 'object' && handler) {\n const options = optionsOrFactory as {\n schema: ZodObject<any>;\n description?: string;\n };\n const isDynamicPath = typeof path === 'string' && hasDynamicParams(path);\n const dynamicParamInfo = isDynamicPath\n ? parsePathPattern(path as string)\n : null;\n const toolMiddleware: AiMiddleware<\n TOOL_METADATA,\n ContextState & TOOL_STATE,\n z.infer<TOOL_PARAMS>,\n PARTS,\n TOOL_TOOLS\n > = async (ctx, _next) => {\n if (isDynamicPath && typeof path === 'string') {\n const pathParams = extractPathParams(path, ctx.request.path || '');\n this.logger?.log(\n `[AiAgentKit][tool] Extracted dynamic path params:`,\n pathParams\n );\n if (pathParams) {\n ctx.request.params = {\n ...ctx.request.params,\n ...pathParams,\n } as z.infer<TOOL_PARAMS>;\n }\n }\n const parsedParams = options.schema.safeParse(ctx.request.params);\n if (!parsedParams.success) {\n this.logger?.error(\n `[AiAgentKit][tool] Tool call validation failed for path: ${path}:`,\n parsedParams.error.message\n );\n throw new ToolValidationError(path.toString(), parsedParams.error);\n }\n const staticHandler = handler as (\n ctx: AiContext<any, any, any, any, any>,\n params: Record<string, any>\n ) => Promise<any>;\n return staticHandler(ctx, parsedParams.data);\n };\n this.stack.push({\n path,\n handler: toolMiddleware as any,\n isTool: true,\n toolOptions: {\n type: 'static',\n schema: options.schema,\n description: options.description,\n handler: handler as any,\n },\n isAgent: false,\n hasDynamicParams: isDynamicPath,\n paramNames: dynamicParamInfo?.paramNames,\n });\n this.logger?.log(\n `Tool registered: path=${path}, type=static${\n isDynamicPath ? ' (dynamic)' : ''\n }`\n );\n return this as any;\n }\n this.logger?.error(\n `[AiAgentKit][tool] Invalid arguments for tool registration at path: ${path}`\n );\n throw new AiKitError(\n `Invalid arguments for tool registration at path: ${path}`\n );\n }\n\n /**\n * Returns the internal stack of layers. Primarily used for manual router composition.\n * @deprecated Prefer using `.use()` for router composition.\n */\n getStack() {\n return this.stack;\n }\n\n /**\n * Returns the internal stack with a path prefix applied to each layer.\n * @param prefix The prefix to add to each path.\n * @deprecated Prefer using `.use()` for router composition.\n */\n getStackWithPrefix(prefix: string) {\n return this.stack.map((layer) => {\n let newPath: string | RegExp;\n if (layer.path instanceof RegExp) {\n // This is a simplistic way to combine regex and might need refinement\n newPath = new RegExp(prefix.replace(/\\\\/g, '\\\\\\\\') + layer.path.source);\n } else {\n const layerPathStr = layer.path.toString();\n // Prevent layer paths starting with '/' from being treated as absolute by join\n const relativeLayerPath = layerPathStr.startsWith('/')\n ? layerPathStr.substring(1)\n : layerPathStr;\n newPath = path.posix.join(prefix, relativeLayerPath);\n }\n\n return {\n ...layer,\n path: newPath,\n };\n });\n }\n\n /**\n * Outputs all registered paths, and the tool definitions, middlewares, and agents registered on each path.\n * @returns A map of paths to their registered handlers.\n */\n registry(): {\n map: Record<string, { middlewares: any[]; tools: any[]; agents: any[] }>;\n tools: REGISTERED_TOOLS;\n } {\n const registryMap: Record<\n string,\n { middlewares: any[]; tools: any[]; agents: any[] }\n > = {};\n\n for (const layer of this.stack) {\n const pathKey = layer.path.toString();\n if (!registryMap[pathKey]) {\n registryMap[pathKey] = { middlewares: [], tools: [], agents: [] };\n }\n\n if (layer.isTool) {\n let toolInfo: any = { type: layer.toolOptions?.type };\n if (layer.toolOptions?.type === 'static') {\n toolInfo = {\n ...toolInfo,\n schema: layer.toolOptions.schema,\n description: layer.toolOptions.description,\n };\n } else if (layer.toolOptions?.type === 'factory') {\n toolInfo = {\n ...toolInfo,\n factory: layer.toolOptions.factory.toString(),\n };\n }\n registryMap[pathKey].tools.push(toolInfo);\n } else if (layer.isAgent) {\n const agentInfo: any = {\n handler: layer.handler.name || 'anonymous',\n };\n const actAsToolDef = this.actAsToolDefinitions.get(layer.path);\n if (actAsToolDef) {\n agentInfo.actAsTool = {\n ...actAsToolDef,\n };\n }\n registryMap[pathKey].agents.push(agentInfo);\n } else {\n registryMap[pathKey].middlewares.push({\n handler: layer.handler.name || 'anonymous',\n });\n }\n }\n\n return {\n map: registryMap,\n tools: this.getToolSet(),\n };\n }\n\n /**\n * Resolves a path based on the parent path and the requested path.\n * - If path starts with `@/`, it's an absolute path from the root.\n * - Otherwise, it's a relative path.\n * @internal\n */\n private _resolvePath(parentPath: string, newPath: string): string {\n if (newPath.startsWith('@/')) {\n // Absolute path from root, use POSIX normalize for consistency\n return path.posix.normalize(newPath.substring(1));\n }\n // Relative path, use POSIX join to ensure consistent behavior\n const joinedPath = path.posix.join(parentPath, newPath);\n return joinedPath;\n }\n\n /**\n * Creates a new context for an internal agent or tool call.\n * It inherits from the parent context but gets a new logger and call depth.\n * @internal\n */\n private _createSubContext(\n parentCtx: AiContext<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n options: {\n type: 'agent' | 'tool';\n path: string;\n messages?: UIMessage<KIT_METADATA, PARTS, TOOLS>[];\n params: PARAMS;\n }\n ) {\n const parentDepth = parentCtx.executionContext.callDepth ?? 0;\n const newCallDepth = parentDepth + (options.type === 'agent' ? 1 : 0);\n\n const subContext: AiContext<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS\n > = {\n ...parentCtx,\n // State is passed by reference to allow sub-agents to modify the parent's state.\n // The execution context is a shallow copy to ensure call-specific data is isolated.\n state: parentCtx.state,\n store: parentCtx.store,\n executionContext: {\n ...parentCtx.executionContext,\n currentPath: options.path,\n callDepth: newCallDepth,\n },\n request: {\n ...parentCtx.request,\n messages:\n options.messages ||\n parentCtx.request.messages ||\n ([] as UIMessage<KIT_METADATA, PARTS, TOOLS>[]),\n params: options.params,\n path: options.path, // The path to execute\n },\n logger: this._createLogger(\n parentCtx.requestId,\n options.path,\n newCallDepth\n ),\n next: undefined as any, // Will be replaced right after\n };\n\n // The current path for the new context is the path we are about to execute.\n subContext.executionContext.currentPath = options.path;\n\n subContext.next = new NextHandler<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS\n >(\n subContext,\n this,\n (parentCtx as any)._onExecutionStart,\n (parentCtx as any)._onExecutionEnd,\n parentCtx.next\n ) as any;\n\n return subContext;\n }\n\n /**\n * Creates a new logger instance with a structured prefix.\n * @internal\n */\n private _createLogger(\n requestId: string,\n path: string | RegExp,\n callDepth: number = 0\n ): AiLogger {\n const effectiveLogger = this._getEffectiveLogger();\n\n // If no logger is available, return a no-op logger\n if (!effectiveLogger) {\n return {\n log: () => {},\n warn: () => {},\n error: () => {},\n };\n }\n\n const indent = ' '.repeat(callDepth);\n const prefix = `${indent}[${path.toString()}]`;\n // Add requestId to every log message for better tracking.\n const fullPrefix = `[${requestId}]${prefix}`;\n return {\n log: (...args: any[]) => effectiveLogger.log(fullPrefix, ...args),\n warn: (...args: any[]) => effectiveLogger.warn(fullPrefix, ...args),\n error: (...args: any[]) => effectiveLogger.error(fullPrefix, ...args),\n };\n }\n\n /**\n * Calculates a specificity score for a layer to enable Express-style routing.\n * Higher score means more specific.\n * - Middleware is less specific than an agent/tool.\n * - Deeper paths are more specific.\n * - Static segments are more specific than dynamic segments.\n * @internal\n */\n private _getSpecificityScore(\n layer: Layer<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>\n ): number {\n const path = layer.path.toString();\n let score = 0;\n\n // Base score on depth. Deeper is more specific.\n score += path.split('/').length * 100;\n\n // More dynamic segments mean less specific.\n score -= (path.match(/:/g) || []).length * 10;\n\n // Regex is less specific than a string path.\n if (layer.path instanceof RegExp) {\n score -= 50;\n }\n\n // Agents/tools are more specific than middleware.\n if (layer.isAgent || layer.isTool) {\n score += 1;\n }\n\n return score;\n }\n\n /**\n * The core execution engine. It finds all matching layers for a given path\n * and runs them in a middleware-style chain.\n * @internal\n */\n private async _execute(\n path: string,\n ctx: AiContext<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n isInternalCall = false\n ) {\n // The context's `currentPath` is now the single source of truth.\n // No more stack manipulation is needed here.\n try {\n const normalizedPath =\n path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;\n\n ctx.logger.log(`Executing path. isInternalCall=${isInternalCall}`);\n const layersToRun = this.stack.filter((layer) => {\n let shouldRun = false;\n\n // Handle RegExp paths. For internal calls, we demand an exact match.\n if (layer.path instanceof RegExp) {\n if (isInternalCall) {\n const exactRegex = new RegExp(`^${layer.path.source}$`);\n shouldRun = exactRegex.test(normalizedPath);\n } else {\n shouldRun = layer.path.test(normalizedPath);\n }\n } else if (typeof layer.path === 'string') {\n const layerPath = layer.path;\n\n // Wildcard middleware only runs for external calls.\n if (layerPath === '*') {\n return !isInternalCall;\n }\n\n const normalizedLayerPath =\n layerPath.length > 1 && layerPath.endsWith('/')\n ? layerPath.slice(0, -1)\n : layerPath;\n\n const isExactMatch = normalizedPath === normalizedLayerPath;\n\n if (isInternalCall) {\n // --- Internal Call Logic ---\n // For internal calls, we only consider exact matches for all layer types.\n if (layer.isTool && layer.hasDynamicParams) {\n shouldRun = extractPathParams(layerPath, normalizedPath) !== null;\n } else {\n shouldRun = isExactMatch;\n }\n } else {\n // --- External Call Logic ---\n if (layer.isTool) {\n // Tools are matched exactly or via dynamic path parameters.\n if (layer.hasDynamicParams) {\n shouldRun =\n extractPathParams(layerPath, normalizedPath) !== null;\n } else {\n shouldRun = isExactMatch;\n }\n } else if (layer.isAgent) {\n // Agents are only matched exactly.\n shouldRun = isExactMatch;\n } else {\n // Middlewares are matched by prefix.\n shouldRun = normalizedPath.startsWith(normalizedLayerPath);\n }\n }\n }\n\n if (shouldRun) {\n ctx.logger.log(\n `[AiAgentKit][_execute] Layer MATCH: path=${normalizedPath}, layer.path=${layer.path}, isTool=${layer.isTool}, isAgent=${layer.isAgent}, isInternal=${isInternalCall}`\n );\n }\n return shouldRun;\n });\n\n // Sort layers by specificity (most general first) to ensure correct execution order.\n layersToRun.sort(\n (a, b) => this._getSpecificityScore(a) - this._getSpecificityScore(b)\n );\n\n const layerDescriptions = layersToRun.map(\n (l) =>\n `${l.path.toString()} (${\n l.isTool ? 'tool' : l.isAgent ? 'agent' : 'middleware'\n })`\n );\n ctx.logger.log(\n `Found ${layersToRun.length} layers to run: [${layerDescriptions.join(\n ', '\n )}]`\n );\n const hasTool = layersToRun.some((l) => l.isTool);\n const hasAgent = layersToRun.some((l) => l.isAgent);\n\n if (!layersToRun.length) {\n const errorMsg = `No agent or tool found for path: ${normalizedPath}`;\n ctx.logger.error(errorMsg);\n throw new AgentNotFoundError(normalizedPath);\n }\n\n // A more robust, explicit dispatcher to avoid promise chain issues.\n const dispatch = async (index: number): Promise<any> => {\n const layer = layersToRun[index];\n if (!layer) {\n // End of the chain\n return;\n }\n\n const next = () => dispatch(index + 1);\n\n const layerPath =\n typeof layer.path === 'string' ? layer.path : layer.path.toString();\n\n const layerType = layer.isTool\n ? 'tool'\n : layer.isAgent\n ? 'agent'\n : 'middleware';\n ctx.logger.log(`-> Running ${layerType}: ${layerPath}`);\n\n try {\n if (ctx._onExecutionStart) {\n ctx._onExecutionStart();\n }\n // The handler is an async function, so we can await it directly.\n // The original Promise wrapper was redundant and could hide issues.\n const result = await layer.handler(ctx, next);\n\n // if (!isInternalCall) {\n // console.log('toolDefinition', result);\n // const toolDefinition = this.actAsToolDefinitions.get(path);\n // if (toolDefinition && !toolDefinition.metadata?.hideUI) {\n // ctx.response.writeCustomTool({\n // toolName: toolDefinition.id as string,\n // toolCallId: toolDefinition.id + '-' + ctx.response.generateId(),\n // output: result,\n // });\n // }\n // }\n ctx.logger.log(`<- Finished ${layerType}: ${layerPath}`);\n return result;\n } catch (err) {\n ctx.logger.error(\n `Error in ${layerType} layer for path: ${layerPath}`,\n err\n );\n throw err;\n } finally {\n if (ctx._onExecutionEnd) {\n ctx._onExecutionEnd();\n }\n }\n };\n\n return await dispatch(0);\n } finally {\n // No-op. Stack is managed by context creation/destruction.\n }\n }\n\n private pendingExecutions = 0;\n\n /**\n * The main public entry point for the router. It handles an incoming request,\n * sets up the response stream, creates the root context, and starts the execution chain.\n *\n * @param path The path of the agent or tool to execute.\n * @param initialContext The initial context for the request, typically containing messages.\n * @returns A standard `Response` object containing the rich UI stream.\n */\n handle(\n path: string,\n initialContext: Omit<\n AiContext<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\n | 'store'\n >\n ): Response {\n this.logger?.log(`Handling request for path: ${path}`);\n const self = this; // Reference to the router instance\n\n // --- Execution Lifecycle Management ---\n let executionCompletionResolver: (() => void) | null = null;\n const executionCompletionPromise = new Promise<void>((resolve) => {\n executionCompletionResolver = resolve;\n });\n\n // --- End Execution Lifecycle Management ---\n\n return createUIMessageStreamResponse({\n stream: self.handleStream(\n path,\n initialContext,\n executionCompletionPromise,\n executionCompletionResolver\n ),\n });\n }\n\n handleStream(\n path: string,\n initialContext: Omit<\n AiContext<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\n | 'store'\n >,\n executionCompletionPromise: Promise<void>,\n executionCompletionResolver: (() => void) | null\n ) {\n const self = this;\n return createUIMessageStream({\n originalMessages: initialContext.request.messages,\n execute: async ({ writer }) => {\n const streamWriter = new StreamWriter<KIT_METADATA, TOOLS>(writer);\n const requestId = generateId();\n\n // If the configured store is a MemoryStore, create a new one for each request\n // to prevent state leakage between concurrent requests. If it's a different\n // type of store, we assume it's designed to be shared.\n const store =\n self._store instanceof MemoryStore ? new MemoryStore() : self._store;\n\n const ctx: AiContext<\n KIT_METADATA,\n ContextState,\n PARAMS,\n PARTS,\n TOOLS\n > & {\n _onExecutionStart: () => void;\n _onExecutionEnd: () => void;\n } = {\n ...initialContext,\n request: {\n ...initialContext.request,\n path: path, // Set the initial path for the root context\n },\n state: {} as any,\n store: store,\n executionContext: { currentPath: path, callDepth: 0 },\n requestId: requestId,\n logger: self._createLogger(requestId, path, 0),\n response: {\n ...streamWriter.writer,\n writeMessageMetadata: streamWriter.writeMessageMetadata,\n writeCustomTool: streamWriter.writeCustomTool,\n writeObjectAsTool: streamWriter.writeObjectAsTool,\n generateId: generateId,\n },\n next: undefined as any, // Will be replaced right after\n _onExecutionStart: () => {\n self.pendingExecutions++;\n self.logger?.log(\n `[AiAgentKit][lifecycle] Execution started. Pending: ${self.pendingExecutions}`\n );\n },\n _onExecutionEnd: () => {\n self.pendingExecutions--;\n self.logger?.log(\n `[AiAgentKit][lifecycle] Execution ended. Pending: ${self.pendingExecutions}`\n );\n if (self.pendingExecutions === 0 && executionCompletionResolver) {\n self.logger?.log(\n `[AiAgentKit][lifecycle] All executions finished. Resolving promise.`\n );\n executionCompletionResolver();\n }\n },\n };\n ctx.next = new NextHandler(\n ctx,\n self,\n ctx._onExecutionStart,\n ctx._onExecutionEnd\n ) as any;\n\n ctx._onExecutionStart();\n self.logger?.log(\n `[AiAgentKit][lifecycle] Main execution chain started.`\n );\n\n // Fire off the main execution chain. We don't await it here because, in a streaming\n // context, the await might resolve prematurely when the agent yields control.\n // Instead, we catch errors and use .finally() to reliably mark the end of this\n // specific execution, while the main function body waits on the lifecycle promise.\n // self\n // ._execute(path, ctx)\n // .catch((err) => {\n // ctx.logger.error(\"Unhandled error in main execution chain\", err);\n // // Optionally, you could write an error message to the stream here.\n // })\n // .finally(() => {\n // ctx._onExecutionEnd();\n // });\n\n try {\n const response = await self._execute(path, ctx);\n const toolDefinition = this.actAsToolDefinitions.get(path);\n if (toolDefinition && !toolDefinition.metadata?.hideUI) {\n ctx.response.writeCustomTool({\n toolName: toolDefinition.id as string,\n toolCallId: toolDefinition.id + '-' + ctx.response.generateId(),\n output: response,\n });\n }\n return response;\n } catch (err) {\n ctx.logger.error('Unhandled error in main execution chain', err);\n } finally {\n ctx._onExecutionEnd();\n self.logger?.log(\n `[AiAgentKit][lifecycle] Main execution chain finished.`\n );\n }\n\n // ctx.next\n // .callAgent(path, initialContext.request.params)\n // .catch((err) => {\n // ctx.logger.error(\"Unhandled error in main execution chain\", err);\n // });\n\n // Wait for the promise that resolves only when all executions (the main one\n // and all sub-calls) have completed.\n await executionCompletionPromise;\n self.logger?.log(\n `[AiAgentKit][lifecycle] All executions truly finished. Stream can be safely closed.`\n );\n },\n });\n }\n\n /**\n * Handles an incoming request and returns a promise that resolves with the full,\n * non-streamed response. This is useful for environments where streaming is not\n * desired or for testing.\n *\n * @param path The path of the agent or tool to execute.\n * @param initialContext The initial context for the request, typically containing messages.\n * @returns A `Promise<Response>` that resolves with the final JSON response.\n */\n async toAwaitResponse(\n path: string,\n initialContext: Omit<\n AiContext<KIT_METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\n | 'store'\n >\n ): Promise<Response> {\n this.logger?.log(`Handling request for path: ${path}`);\n const self = this; // Reference to the router instance\n\n // --- Execution Lifecycle Management ---\n let executionCompletionResolver: (() => void) | null = null;\n const executionCompletionPromise = new Promise<void>((resolve) => {\n executionCompletionResolver = resolve;\n });\n\n const stream = this.handleStream(\n path,\n initialContext,\n executionCompletionPromise,\n executionCompletionResolver\n );\n\n const messageStream = readUIMessageStream({\n stream,\n onError: (error) => {\n this.logger?.error('Error reading UI message stream', error);\n },\n });\n\n let finalMessages: UIMessage[] = [];\n const thisMessageId = generateId();\n for await (const message of messageStream) {\n if (message.id?.length > 0) {\n finalMessages.push(message);\n } else if (finalMessages.find((m) => m.id === thisMessageId)) {\n finalMessages = finalMessages.map((m) =>\n m.id === thisMessageId\n ? {\n ...m,\n metadata: {\n ...(m.metadata ?? {}),\n ...(message.metadata ?? {}),\n },\n parts: clubParts([\n ...(m.parts ?? []),\n ...(message.parts ?? []),\n ]),\n }\n : m\n );\n } else {\n finalMessages.push({\n ...message,\n id: thisMessageId,\n });\n }\n }\n const responseBody = JSON.stringify(finalMessages);\n return new Response(responseBody, {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\nexport type AiRouterType = typeof AiRouter;\n\nclass NextHandler<\n METADATA extends Record<string, any> = Record<string, any>,\n ContextState extends Record<string, any> = Record<string, any>,\n PARAMS extends Record<string, any> = Record<string, any>,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> {\n public maxCallDepth: number;\n\n constructor(\n private ctx: AiContext<METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n private router: AiRouter<METADATA, ContextState, PARAMS, PARTS, TOOLS>,\n private onExecutionStart: () => void,\n private onExecutionEnd: () => void,\n parentNext?: NextHandler<METADATA, ContextState, PARAMS, PARTS, TOOLS>\n ) {\n this.maxCallDepth = this.router.options.maxCallDepth;\n }\n\n async callAgent(\n agentPath: string,\n params?: Record<string, any>,\n options?: {\n streamToUI?: boolean;\n }\n ): Promise<{ ok: true; data: any } | { ok: false; error: Error }> {\n this.onExecutionStart();\n try {\n const currentDepth = this.ctx.executionContext.callDepth ?? 0;\n if (currentDepth >= this.maxCallDepth) {\n const err = new MaxCallDepthExceededError(this.maxCallDepth);\n this.ctx.logger.error(`[callAgent] Aborting. ${err.message}`);\n throw err;\n }\n const parentPath = this.ctx.executionContext.currentPath || '/';\n const resolvedPath = (this.router as any)._resolvePath(\n parentPath,\n agentPath\n );\n\n this.ctx.logger.log(`Calling agent: resolvedPath='${resolvedPath}'`);\n\n const subContext = (this.router as any)._createSubContext(this.ctx, {\n type: 'agent',\n path: resolvedPath,\n params: params ?? ({} as PARAMS),\n messages: this.ctx.request.messages,\n });\n\n const definition = this.router.actAsToolDefinitions.get(resolvedPath);\n const toolCallId = definition?.id + '-' + this.ctx.response.generateId();\n if (options?.streamToUI && definition) {\n this.ctx.response.writeCustomTool({\n toolName: definition?.id,\n toolCallId: toolCallId,\n input: subContext.request.params,\n });\n }\n\n const data = await (this.router as any)._execute(\n resolvedPath,\n subContext,\n true\n );\n\n if (options?.streamToUI && definition) {\n this.ctx.response.writeCustomTool({\n toolName: definition?.id,\n toolCallId: toolCallId,\n output: data,\n });\n }\n\n return { ok: true, data };\n } catch (error: any) {\n this.ctx.logger.error(`[callAgent] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\n }\n\n /**\n * @deprecated Use agent-as-tools pattern instead. Use `ctx.next.callAgent()` to call agents that are exposed as tools.\n * This method will be removed in a future version.\n *\n * Example migration:\n * ```typescript\n * // Old way (deprecated):\n * const result = await ctx.next.callTool('/calculator', { a: 5, b: 3 });\n *\n * // New way (recommended):\n * const result = await ctx.next.callAgent('/calculator', { a: 5, b: 3 });\n * ```\n */\n async callTool<T extends z.ZodObject<any>>(\n toolPath: string,\n params: z.infer<T>,\n options?: ToolCallOptions\n ): Promise<{ ok: true; data: any } | { ok: false; error: Error }> {\n this.ctx.logger.warn(\n `[DEPRECATION WARNING] ctx.next.callTool() is deprecated and will be removed in a future version. ` +\n `Please use ctx.next.callAgent() instead to call agents that are exposed as tools.`\n );\n this.onExecutionStart();\n try {\n const parentPath = this.ctx.executionContext.currentPath || '/';\n const resolvedPath = (this.router as any)._resolvePath(\n parentPath,\n toolPath\n );\n\n this.ctx.logger.log(`Calling tool: resolvedPath='${resolvedPath}'`);\n\n const subContext = (this.router as any)._createSubContext(this.ctx, {\n type: 'tool',\n path: resolvedPath,\n params: params ?? ({} as PARAMS),\n messages: this.ctx.request.messages,\n });\n const data = await (this.router as any)._execute(\n resolvedPath,\n subContext,\n true\n );\n return { ok: true, data };\n } catch (error: any) {\n this.ctx.logger.error(`[callTool] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\n }\n\n /**\n * @deprecated Use agent-as-tools pattern instead. Use `ctx.next.agentAsTool()` to attach agents as tools.\n * This method will be removed in a future version.\n *\n * Example migration:\n * ```typescript\n * // Old way (deprecated):\n * const tool = ctx.next.attachTool('/calculator');\n *\n * // New way (recommended):\n * const tool = ctx.next.agentAsTool('/calculator');\n * ```\n */\n attachTool<SCHEMA extends z.ZodObject<any>>(\n toolPath: string,\n _tool?: Omit<Tool<z.infer<SCHEMA>, any>, 'description'>\n ): Tool<z.infer<SCHEMA>, any> {\n this.ctx.logger.warn(\n `[DEPRECATION WARNING] ctx.next.attachTool() is deprecated and will be removed in a future version. ` +\n `Please use ctx.next.agentAsTool() instead to attach agents as tools.`\n );\n const parentPath = this.ctx.executionContext.currentPath || '/';\n const resolvedPath = (this.router as any)._resolvePath(\n parentPath,\n toolPath\n );\n this.ctx.logger.log(`Attaching tool: resolvedPath='${resolvedPath}'`);\n\n const layer = (this.router as any).stack.find((l: any) => {\n if (!l.isTool) return false;\n if (l.path === resolvedPath) return true;\n if (l.hasDynamicParams && typeof l.path === 'string') {\n return extractPathParams(l.path, resolvedPath) !== null;\n }\n return false;\n });\n if (!layer || !layer.toolOptions) {\n this.ctx.logger.error(\n `[attachTool] Tool not found at resolved path: ${resolvedPath}`\n );\n throw new ToolNotFoundError(resolvedPath);\n }\n if (layer.toolOptions.type === 'factory') {\n return layer.toolOptions.factory(this.ctx);\n }\n const { description, schema } = layer.toolOptions;\n return {\n description,\n inputSchema: schema,\n ...(_tool ?? {}),\n execute: async (params: z.infer<SCHEMA>, options: ToolCallOptions) => {\n if (_tool?.execute) {\n return await _tool.execute?.(params as any, options);\n }\n const result = await this.callTool(toolPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n },\n } as unknown as Tool<z.infer<SCHEMA>, any>;\n }\n\n agentAsTool<INPUT extends JSONValue | unknown | never = any, OUTPUT = any>(\n agentPath: string,\n toolDefinition?: AgentTool<INPUT, OUTPUT>\n ) {\n const parentPath = this.ctx.executionContext.currentPath || '/';\n const resolvedPath = (this.router as any)._resolvePath(\n parentPath,\n agentPath\n );\n let preDefined;\n const pathsToTry = [resolvedPath];\n // If the agentPath starts with '/', it's an absolute path from root, so also try it directly\n if (agentPath.startsWith('/')) {\n pathsToTry.unshift(agentPath);\n }\n for (const pathToTry of pathsToTry) {\n for (const [key, value] of (this.router as any).actAsToolDefinitions) {\n if (typeof key === 'string') {\n // Check for exact match first\n if (key === pathToTry) {\n preDefined = value;\n break;\n }\n // Then check for dynamic path parameters\n if (extractPathParams(key, pathToTry) !== null) {\n preDefined = value;\n break;\n }\n }\n // Basic RegExp match\n if (key instanceof RegExp && key.test(pathToTry)) {\n preDefined = value;\n break;\n }\n }\n if (preDefined) break;\n }\n\n const definition = toolDefinition || preDefined;\n if (!definition) {\n this.ctx.logger.error(\n `[agentAsTool] No definition found for agent at resolved path: ${resolvedPath}`\n );\n throw new AgentDefinitionMissingError(resolvedPath);\n }\n const { id, metadata, ...restDefinition } = definition;\n return {\n [id]: {\n ...restDefinition,\n metadata: {\n ...metadata,\n toolKey: id,\n name: restDefinition.name,\n description: restDefinition.description,\n absolutePath: restDefinition.path,\n },\n execute: (params: any, options: any) => {\n const executeInternal = async () => {\n const result = await this.callAgent(agentPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n };\n const newPromise = this.router.toolExecutionPromise.then(\n executeInternal,\n executeInternal\n );\n this.router.toolExecutionPromise = newPromise;\n return newPromise;\n },\n } as Tool<INPUT, OUTPUT>,\n };\n }\n\n getToolDefinition(agentPath: string | RegExp) {\n const parentPath = this.ctx.executionContext.currentPath || '/';\n const resolvedPath = (this.router as any)._resolvePath(\n parentPath,\n agentPath\n );\n let preDefined;\n const pathsToTry = [resolvedPath];\n // If the agentPath starts with '/', it's an absolute path from root, so also try it directly\n if (typeof agentPath === 'string' && agentPath.startsWith('/')) {\n pathsToTry.unshift(agentPath);\n }\n for (const pathToTry of pathsToTry) {\n for (const [key, value] of (this.router as any).actAsToolDefinitions) {\n if (typeof key === 'string') {\n // Check for exact match first\n if (key === pathToTry) {\n preDefined = value;\n break;\n }\n // Then check for dynamic path parameters\n if (extractPathParams(key, pathToTry) !== null) {\n preDefined = value;\n break;\n }\n }\n // Basic RegExp match\n if (key instanceof RegExp && key.test(pathToTry)) {\n preDefined = value;\n break;\n }\n }\n if (preDefined) break;\n }\n\n const definition = preDefined;\n if (!definition) {\n this.ctx.logger.error(\n `[agentAsTool] No definition found for agent at resolved path: ${resolvedPath}`\n );\n throw new AgentDefinitionMissingError(resolvedPath);\n }\n const { metadata, ...restDefinition } = definition;\n return {\n ...restDefinition,\n metadata: {\n ...metadata,\n toolKey: restDefinition.id,\n name: restDefinition.name,\n description: restDefinition.description,\n absolutePath: restDefinition.path,\n },\n } as AgentTool<any, any>;\n }\n}\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import {\n GenerateObjectResult,\n UIDataTypes,\n UIMessage,\n UIMessageStreamWriter,\n} from 'ai';\nimport { UITools } from './types.js';\nimport { customAlphabet } from 'nanoid';\n\nexport const findLastElement = <T>(array: T[]) => {\n return array[array.length - 1];\n};\n\nexport const findFirstElement = <T>(array: T[]) => {\n return array[0];\n};\n\nexport class StreamWriter<METADATA, TOOLS extends UITools> {\n public writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>;\n constructor(writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>) {\n this.writer = writer;\n }\n generateId = () => {\n return customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 10)();\n };\n writeMessageMetadata = <NEW_METADATA extends METADATA>(\n metadata: NEW_METADATA\n ) => {\n return this.writer.write({\n type: 'message-metadata' as const,\n messageMetadata: metadata as NEW_METADATA,\n });\n };\n writeCustomTool = <K extends keyof TOOLS>(tool: {\n toolCallId?: string;\n toolName: K;\n inputTextDelta?: string[];\n input?: any;\n output?: any;\n }) => {\n const toolCallId =\n tool.toolCallId || tool.toolName?.toString() + '-' + this.generateId();\n if ('input' in tool && tool.input) {\n this.writer.write({\n type: 'tool-input-available' as const,\n input: tool.input,\n toolCallId: toolCallId,\n toolName: tool.toolName as string,\n });\n }\n if (\n (tool.inputTextDelta && tool.inputTextDelta.length > 0) ||\n ('output' in tool && tool.output)\n ) {\n this.writer.write({\n type: 'tool-input-start' as const,\n toolCallId: toolCallId,\n toolName: tool.toolName as string,\n });\n if (tool.inputTextDelta) {\n for (const delta of tool.inputTextDelta) {\n this.writer.write({\n type: 'tool-input-delta' as const,\n toolCallId: toolCallId,\n inputTextDelta: delta,\n });\n }\n }\n }\n if ('output' in tool && tool.output) {\n this.writer.write({\n type: 'tool-output-available' as const,\n toolCallId: toolCallId,\n output: tool.output,\n });\n }\n };\n writeObjectAsTool = <K extends keyof TOOLS>(tool: {\n toolName: K;\n result?: GenerateObjectResult<TOOLS[K]['output']>;\n input?: GenerateObjectResult<TOOLS[K]['input']>;\n }) => {\n if (!tool.result?.object) {\n throw new Error('No object found in the GenerateObjectResult');\n }\n\n const toolCallId = tool.toolName.toString() + '-' + this.generateId();\n\n this.writer.write({\n type: 'tool-input-start' as const,\n toolCallId: toolCallId,\n toolName: tool.toolName as string,\n });\n\n this.writer.write({\n type: 'tool-input-available' as const,\n toolCallId: toolCallId,\n input:\n (tool.input ?? tool.result)\n ? {\n usage: tool.result?.usage,\n warnings: tool.result?.warnings,\n finishReason: tool.result?.finishReason,\n }\n : undefined,\n toolName: tool.toolName as string,\n });\n\n this.writer.write({\n type: 'tool-output-available' as const,\n toolCallId: toolCallId,\n output: tool.result?.object,\n });\n };\n}\n\nexport const getTextParts = (message: UIMessage | null | undefined) => {\n if (!message) return [];\n return message.parts\n .filter((part) => part.type === 'text')\n .map((part) => part.text);\n};\n\nexport const getTextPartsContent = (message: UIMessage | null | undefined) => {\n if (!message) return '';\n return message.parts\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('')\n .trim();\n};\n\nexport const findLastMessageWith = <T>(\n message: UIMessage[] | null | undefined,\n filters: {\n role?: 'user' | 'assistant' | 'system';\n metadata?: Record<string, any>;\n }\n) => {\n if (!message) return null;\n return message\n .filter((m) => {\n if (filters.role && m.role !== filters.role) return false;\n if (filters.metadata) {\n for (const key in filters.metadata) {\n }\n }\n return true;\n })\n .pop();\n};\n","export interface Store {\n get<T>(key: string): Promise<T | undefined>;\n set<T>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<void>;\n has(key: string): Promise<boolean>;\n entries?(): Promise<[string, any][]>;\n clear?(): Promise<void>;\n}\n\n/**\n * An in-memory implementation of the `Store` interface.\n *\n * @remarks\n * Each instance of `MemoryStore` maintains its own isolated key-value map.\n * In a server environment where a single `AiRouter` instance handles multiple\n * concurrent requests, the router's `handle` method automatically creates a new\n * `MemoryStore` for each request to ensure state isolation. This prevents\n * data leakage between different requests.\n */\nexport class MemoryStore implements Store {\n private store = new Map<string, any>();\n\n async get<T>(key: string): Promise<T | undefined> {\n return this.store.get(key);\n }\n\n async set<T>(key: string, value: T): Promise<void> {\n this.store.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n}\n"],"mappings":"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","names":["tool","path"]}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
interface Store {
|
|
2
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
3
|
-
set<T>(key: string, value: T): Promise<void>;
|
|
4
|
-
delete(key: string): Promise<void>;
|
|
5
|
-
has(key: string): Promise<boolean>;
|
|
6
|
-
entries?(): Promise<[string, any][]>;
|
|
7
|
-
clear?(): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* An in-memory implementation of the `Store` interface.
|
|
11
|
-
*
|
|
12
|
-
* @remarks
|
|
13
|
-
* Each instance of `MemoryStore` maintains its own isolated key-value map.
|
|
14
|
-
* In a server environment where a single `AiRouter` instance handles multiple
|
|
15
|
-
* concurrent requests, the router's `handle` method automatically creates a new
|
|
16
|
-
* `MemoryStore` for each request to ensure state isolation. This prevents
|
|
17
|
-
* data leakage between different requests.
|
|
18
|
-
*/
|
|
19
|
-
declare class MemoryStore implements Store {
|
|
20
|
-
private store;
|
|
21
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
22
|
-
set<T>(key: string, value: T): Promise<void>;
|
|
23
|
-
delete(key: string): Promise<void>;
|
|
24
|
-
has(key: string): Promise<boolean>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export { MemoryStore as M, type Store as S };
|
package/dist/store-BBHh-uTh.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
interface Store {
|
|
2
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
3
|
-
set<T>(key: string, value: T): Promise<void>;
|
|
4
|
-
delete(key: string): Promise<void>;
|
|
5
|
-
has(key: string): Promise<boolean>;
|
|
6
|
-
entries?(): Promise<[string, any][]>;
|
|
7
|
-
clear?(): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* An in-memory implementation of the `Store` interface.
|
|
11
|
-
*
|
|
12
|
-
* @remarks
|
|
13
|
-
* Each instance of `MemoryStore` maintains its own isolated key-value map.
|
|
14
|
-
* In a server environment where a single `AiRouter` instance handles multiple
|
|
15
|
-
* concurrent requests, the router's `handle` method automatically creates a new
|
|
16
|
-
* `MemoryStore` for each request to ensure state isolation. This prevents
|
|
17
|
-
* data leakage between different requests.
|
|
18
|
-
*/
|
|
19
|
-
declare class MemoryStore implements Store {
|
|
20
|
-
private store;
|
|
21
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
22
|
-
set<T>(key: string, value: T): Promise<void>;
|
|
23
|
-
delete(key: string): Promise<void>;
|
|
24
|
-
has(key: string): Promise<boolean>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export { MemoryStore as M, type Store as S };
|