@microfox/ai-router 1.0.2 → 1.1.0

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 CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 7e0ae1f: upgraded ai to 15
8
+
9
+ ## 1.0.4
10
+
11
+ ### Patch Changes
12
+
13
+ - fd91148: patch fixes
14
+
15
+ ## 1.0.3
16
+
17
+ ### Patch Changes
18
+
19
+ - 897d926: Changes from PR #582: subhakar
20
+
3
21
  ## 1.0.2
4
22
 
5
23
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -9,7 +9,7 @@ type UITools = Record<string, {
9
9
  declare const findLastElement: <T>(array: T[]) => T;
10
10
  declare const findFirstElement: <T>(array: T[]) => T;
11
11
  declare class StreamWriter<METADATA, TOOLS extends UITools> {
12
- private writer;
12
+ writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>;
13
13
  constructor(writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>);
14
14
  generateId: () => string;
15
15
  writeMessageMetadata: <NEW_METADATA extends METADATA>(metadata: NEW_METADATA) => void;
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ type UITools = Record<string, {
9
9
  declare const findLastElement: <T>(array: T[]) => T;
10
10
  declare const findFirstElement: <T>(array: T[]) => T;
11
11
  declare class StreamWriter<METADATA, TOOLS extends UITools> {
12
- private writer;
12
+ writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>;
13
13
  constructor(writer: UIMessageStreamWriter<UIMessage<METADATA, any, TOOLS>>);
14
14
  generateId: () => string;
15
15
  writeMessageMetadata: <NEW_METADATA extends METADATA>(metadata: NEW_METADATA) => void;
package/dist/index.js CHANGED
@@ -748,7 +748,7 @@ var AiRouter = class _AiRouter {
748
748
  requestId,
749
749
  logger: self._createLogger(requestId, path2, 0),
750
750
  response: {
751
- ...writer,
751
+ ...streamWriter.writer,
752
752
  writeMessageMetadata: streamWriter.writeMessageMetadata,
753
753
  writeCustomTool: streamWriter.writeCustomTool,
754
754
  writeObjectAsTool: streamWriter.writeObjectAsTool,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/router.ts","../../../node_modules/nanoid/index.js","../src/helper.ts"],"sourcesContent":["export * from \"./router.js\";\nexport * from \"./types.js\";\nexport * from \"./helper.js\";\n","import {\n UIMessage,\n createUIMessageStream,\n UIMessageStreamWriter,\n createUIMessageStreamResponse,\n UIDataTypes,\n generateId,\n Tool,\n tool,\n JSONValue,\n ToolCallOptions,\n convertToModelMessages,\n} from 'ai';\nimport { StreamWriter } from './helper.js';\nimport { UITools } from './types.js';\nimport { z, ZodObject } from 'zod';\nimport path from 'path';\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\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\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,\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\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?: Record<string, any>;\n [key: string]: any;\n };\n /** A shared, mutable state object that persists for the lifetime of a single request. */\n state: ContextState;\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<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, PARTS, TOOLS, ContextState>;\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<void>;\n/** A function that handles a request for a specific agent path. */\nexport type AiHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Promise<void>;\n\n/** A function that handles a request for a specific tool path, with validated parameters. */\nexport type AiToolHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> =\n | ((\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n params: Record<string, any>\n ) => Promise<any>)\n | ((ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Tool<any, any>);\n\n/** A function that creates a Tool on-demand with access to the request context. */\nexport type AiToolFactory<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => 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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n next: NextFunction\n) => Promise<void>;\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = {\n path: string | RegExp;\n handler: AiMiddleware<METADATA, PARTS, TOOLS, ContextState>;\n isTool: boolean;\n toolOptions?:\n | {\n type: 'static';\n schema: ZodObject<any>;\n description?: string;\n handler: AiToolHandler<METADATA, PARTS, TOOLS, ContextState>;\n }\n | {\n type: 'factory';\n factory: AiToolFactory<METADATA, PARTS, TOOLS, ContextState>;\n };\n isAgent: boolean;\n // Dynamic parameter support\n hasDynamicParams?: boolean;\n paramNames?: string[];\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = {},\n> {\n private stack: Layer<KIT_METADATA, PARTS, TOOLS, any>[] = [];\n private actAsToolDefinitions: Map<\n string | RegExp,\n { description?: string; inputSchema: ZodObject<any> }\n > = new Map();\n private logger: AiLogger = console;\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, PARTS, TOOLS, any>[],\n options?: { maxCallDepth?: number; logger?: AiLogger }\n ) {\n this.logger = options?.logger ?? console;\n this.logger.log('AiAgentKit v3 initialized.');\n if (stack) {\n this.stack = stack;\n }\n if (options?.maxCallDepth) {\n this.options.maxCallDepth = options.maxCallDepth;\n }\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 MW_METADATA,\n MW_TOOLS extends UITools,\n MW_STATE extends Record<string, any>,\n >(\n agentPath:\n | string\n | RegExp\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>,\n ...agents: (\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n | AiRouter<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n )[]\n ): AiRouter<\n KIT_METADATA | MW_METADATA,\n PARTS,\n TOOLS & MW_TOOLS,\n ContextState & MW_STATE\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 mountPathArg: string | RegExp,\n handler:\n | AiMiddleware<KIT_METADATA, PARTS, TOOLS, ContextState>\n | AiRouter<any, any, any, any>\n ): this {\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 path: string | RegExp,\n options: {\n description?: string;\n inputSchema: ZodObject<any>;\n }\n ) {\n this.actAsToolDefinitions.set(path, options);\n this.logger.log(\n `[actAsTool] Added definition: ${path} -> ${JSON.stringify(options)}`\n );\n this.logger.log(\n `[actAsTool] Router now has ${this.actAsToolDefinitions.size} definitions`\n );\n return this;\n }\n\n // Overload for factory-based tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends 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 // Overload for static tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 // Implementation\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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.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> = 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 };\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>,\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 * 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, PARTS, TOOLS, ContextState>,\n options: {\n type: 'agent' | 'tool';\n path: string;\n messages?: UIMessage<KIT_METADATA, PARTS, TOOLS>[];\n params?: Record<string, any>;\n }\n ) {\n const parentDepth = parentCtx.executionContext.callDepth ?? 0;\n const newCallDepth = parentDepth + (options.type === 'agent' ? 1 : 0);\n\n const subContext: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> = {\n ...parentCtx,\n // Deep clone state and execution context to prevent race conditions.\n state: JSON.parse(JSON.stringify(parentCtx.state)),\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 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 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[]) => this.logger.log(fullPrefix, ...args),\n warn: (...args: any[]) => this.logger.warn(fullPrefix, ...args),\n error: (...args: any[]) => this.logger.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(layer: Layer<any, any, any, any>): 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, PARTS, TOOLS, ContextState>,\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<void> => {\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 await layer.handler(ctx, next);\n\n ctx.logger.log(`<- Finished ${layerType}: ${layerPath}`);\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 await dispatch(0);\n return;\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, PARTS, TOOLS, ContextState>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\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: 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 const ctx: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> & {\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 executionContext: { currentPath: path, callDepth: 0 },\n requestId: requestId,\n logger: self._createLogger(requestId, path, 0),\n response: {\n ...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 await self._execute(path, ctx);\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\nclass NextHandler<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> {\n public maxCallDepth: number;\n\n constructor(\n private ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n private router: AiRouter<METADATA, PARTS, TOOLS, ContextState>,\n private onExecutionStart: () => void,\n private onExecutionEnd: () => void,\n parentNext?: NextHandler<METADATA, PARTS, TOOLS, ContextState>\n ) {\n this.maxCallDepth = this.router.options.maxCallDepth;\n }\n\n async callAgent(\n agentPath: string,\n params?: Record<string, any>,\n options?: ToolCallOptions\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,\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(`[callAgent] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\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.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,\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 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 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?: Tool<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 return {\n ...definition,\n execute: async (params: any, options: any) => {\n const result = await this.callAgent(agentPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n },\n } as Tool<INPUT, OUTPUT>;\n }\n}\n","import crypto from 'crypto'\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\n// It is best to make fewer, larger requests to the crypto module to\n// avoid system call overhead. So, random numbers are generated in a\n// pool. The pool is a Buffer that is larger than the initial random\n// request size by this multiplier. The pool is enlarged if subsequent\n// requests exceed the maximum buffer size.\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\n\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}\n\nlet random = bytes => {\n // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n // A compact alternative for `for (let i = 0; i < step; i++)`.\n let i = step\n while (i--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) => {\n // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution\n fillPool((size |= 0))\n let id = ''\n // We are reading directly from the random pool to avoid creating new array\n for (let i = poolOffset - size; i < poolOffset; i++) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\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 private 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>(\n tool: {\n toolCallId?: string;\n toolName: K;\n inputTextDelta?: string[];\n input?: any;\n output?: any;\n } & Omit<TOOLS[K], \"toolCallId\">\n ) => {\n const 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 || tool.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 || tool.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 || tool.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 || tool.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 }) => {\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 usage: tool.result.usage,\n warnings: tool.result.warnings,\n finishReason: tool.result.finishReason,\n },\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"],"mappings":"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","names":["crypto","tool","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/router.ts","../../../node_modules/nanoid/index.js","../src/helper.ts"],"sourcesContent":["export * from \"./router.js\";\nexport * from \"./types.js\";\nexport * from \"./helper.js\";\n","import {\n UIMessage,\n createUIMessageStream,\n UIMessageStreamWriter,\n createUIMessageStreamResponse,\n UIDataTypes,\n generateId,\n Tool,\n tool,\n JSONValue,\n ToolCallOptions,\n convertToModelMessages,\n} from 'ai';\nimport { StreamWriter } from './helper.js';\nimport { UITools } from './types.js';\nimport { z, ZodObject } from 'zod';\nimport path from 'path';\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\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\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,\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\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?: Record<string, any>;\n [key: string]: any;\n };\n /** A shared, mutable state object that persists for the lifetime of a single request. */\n state: ContextState;\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<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, PARTS, TOOLS, ContextState>;\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<void>;\n/** A function that handles a request for a specific agent path. */\nexport type AiHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Promise<void>;\n\n/** A function that handles a request for a specific tool path, with validated parameters. */\nexport type AiToolHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> =\n | ((\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n params: Record<string, any>\n ) => Promise<any>)\n | ((ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Tool<any, any>);\n\n/** A function that creates a Tool on-demand with access to the request context. */\nexport type AiToolFactory<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => 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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n next: NextFunction\n) => Promise<void>;\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = {\n path: string | RegExp;\n handler: AiMiddleware<METADATA, PARTS, TOOLS, ContextState>;\n isTool: boolean;\n toolOptions?:\n | {\n type: 'static';\n schema: ZodObject<any>;\n description?: string;\n handler: AiToolHandler<METADATA, PARTS, TOOLS, ContextState>;\n }\n | {\n type: 'factory';\n factory: AiToolFactory<METADATA, PARTS, TOOLS, ContextState>;\n };\n isAgent: boolean;\n // Dynamic parameter support\n hasDynamicParams?: boolean;\n paramNames?: string[];\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = {},\n> {\n private stack: Layer<KIT_METADATA, PARTS, TOOLS, any>[] = [];\n private actAsToolDefinitions: Map<\n string | RegExp,\n { description?: string; inputSchema: ZodObject<any> }\n > = new Map();\n private logger: AiLogger = console;\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, PARTS, TOOLS, any>[],\n options?: { maxCallDepth?: number; logger?: AiLogger }\n ) {\n this.logger = options?.logger ?? console;\n this.logger.log('AiAgentKit v3 initialized.');\n if (stack) {\n this.stack = stack;\n }\n if (options?.maxCallDepth) {\n this.options.maxCallDepth = options.maxCallDepth;\n }\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 MW_METADATA,\n MW_TOOLS extends UITools,\n MW_STATE extends Record<string, any>,\n >(\n agentPath:\n | string\n | RegExp\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>,\n ...agents: (\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n | AiRouter<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n )[]\n ): AiRouter<\n KIT_METADATA | MW_METADATA,\n PARTS,\n TOOLS & MW_TOOLS,\n ContextState & MW_STATE\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 mountPathArg: string | RegExp,\n handler:\n | AiMiddleware<KIT_METADATA, PARTS, TOOLS, ContextState>\n | AiRouter<any, any, any, any>\n ): this {\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 path: string | RegExp,\n options: {\n description?: string;\n inputSchema: ZodObject<any>;\n }\n ) {\n this.actAsToolDefinitions.set(path, options);\n this.logger.log(\n `[actAsTool] Added definition: ${path} -> ${JSON.stringify(options)}`\n );\n this.logger.log(\n `[actAsTool] Router now has ${this.actAsToolDefinitions.size} definitions`\n );\n return this;\n }\n\n // Overload for factory-based tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends 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 // Overload for static tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 // Implementation\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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.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> = 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 };\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>,\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 * 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, PARTS, TOOLS, ContextState>,\n options: {\n type: 'agent' | 'tool';\n path: string;\n messages?: UIMessage<KIT_METADATA, PARTS, TOOLS>[];\n params?: Record<string, any>;\n }\n ) {\n const parentDepth = parentCtx.executionContext.callDepth ?? 0;\n const newCallDepth = parentDepth + (options.type === 'agent' ? 1 : 0);\n\n const subContext: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> = {\n ...parentCtx,\n // Deep clone state and execution context to prevent race conditions.\n state: JSON.parse(JSON.stringify(parentCtx.state)),\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 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 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[]) => this.logger.log(fullPrefix, ...args),\n warn: (...args: any[]) => this.logger.warn(fullPrefix, ...args),\n error: (...args: any[]) => this.logger.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(layer: Layer<any, any, any, any>): 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, PARTS, TOOLS, ContextState>,\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<void> => {\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 await layer.handler(ctx, next);\n\n ctx.logger.log(`<- Finished ${layerType}: ${layerPath}`);\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 await dispatch(0);\n return;\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, PARTS, TOOLS, ContextState>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\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: 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 const ctx: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> & {\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 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 await self._execute(path, ctx);\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\nclass NextHandler<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> {\n public maxCallDepth: number;\n\n constructor(\n private ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n private router: AiRouter<METADATA, PARTS, TOOLS, ContextState>,\n private onExecutionStart: () => void,\n private onExecutionEnd: () => void,\n parentNext?: NextHandler<METADATA, PARTS, TOOLS, ContextState>\n ) {\n this.maxCallDepth = this.router.options.maxCallDepth;\n }\n\n async callAgent(\n agentPath: string,\n params?: Record<string, any>,\n options?: ToolCallOptions\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,\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(`[callAgent] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\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.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,\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 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 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?: Tool<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 return {\n ...definition,\n execute: async (params: any, options: any) => {\n const result = await this.callAgent(agentPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n },\n } as Tool<INPUT, OUTPUT>;\n }\n}\n","import crypto from 'crypto'\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\n// It is best to make fewer, larger requests to the crypto module to\n// avoid system call overhead. So, random numbers are generated in a\n// pool. The pool is a Buffer that is larger than the initial random\n// request size by this multiplier. The pool is enlarged if subsequent\n// requests exceed the maximum buffer size.\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\n\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}\n\nlet random = bytes => {\n // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n // A compact alternative for `for (let i = 0; i < step; i++)`.\n let i = step\n while (i--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) => {\n // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution\n fillPool((size |= 0))\n let id = ''\n // We are reading directly from the random pool to avoid creating new array\n for (let i = poolOffset - size; i < poolOffset; i++) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\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>(\n tool: {\n toolCallId?: string;\n toolName: K;\n inputTextDelta?: string[];\n input?: any;\n output?: any;\n } & Omit<TOOLS[K], 'toolCallId'>\n ) => {\n const 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 || tool.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 || tool.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 || tool.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 || tool.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 }) => {\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 usage: tool.result.usage,\n warnings: tool.result.warnings,\n finishReason: tool.result.finishReason,\n },\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"],"mappings":"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","names":["crypto","tool","path"]}
package/dist/index.mjs CHANGED
@@ -705,7 +705,7 @@ var AiRouter = class _AiRouter {
705
705
  requestId,
706
706
  logger: self._createLogger(requestId, path2, 0),
707
707
  response: {
708
- ...writer,
708
+ ...streamWriter.writer,
709
709
  writeMessageMetadata: streamWriter.writeMessageMetadata,
710
710
  writeCustomTool: streamWriter.writeCustomTool,
711
711
  writeObjectAsTool: streamWriter.writeObjectAsTool,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/router.ts","../../../node_modules/nanoid/index.js","../src/helper.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} from 'ai';\nimport { StreamWriter } from './helper.js';\nimport { UITools } from './types.js';\nimport { z, ZodObject } from 'zod';\nimport path from 'path';\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\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\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,\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\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?: Record<string, any>;\n [key: string]: any;\n };\n /** A shared, mutable state object that persists for the lifetime of a single request. */\n state: ContextState;\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<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, PARTS, TOOLS, ContextState>;\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<void>;\n/** A function that handles a request for a specific agent path. */\nexport type AiHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Promise<void>;\n\n/** A function that handles a request for a specific tool path, with validated parameters. */\nexport type AiToolHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> =\n | ((\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n params: Record<string, any>\n ) => Promise<any>)\n | ((ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Tool<any, any>);\n\n/** A function that creates a Tool on-demand with access to the request context. */\nexport type AiToolFactory<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => 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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n next: NextFunction\n) => Promise<void>;\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = {\n path: string | RegExp;\n handler: AiMiddleware<METADATA, PARTS, TOOLS, ContextState>;\n isTool: boolean;\n toolOptions?:\n | {\n type: 'static';\n schema: ZodObject<any>;\n description?: string;\n handler: AiToolHandler<METADATA, PARTS, TOOLS, ContextState>;\n }\n | {\n type: 'factory';\n factory: AiToolFactory<METADATA, PARTS, TOOLS, ContextState>;\n };\n isAgent: boolean;\n // Dynamic parameter support\n hasDynamicParams?: boolean;\n paramNames?: string[];\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = {},\n> {\n private stack: Layer<KIT_METADATA, PARTS, TOOLS, any>[] = [];\n private actAsToolDefinitions: Map<\n string | RegExp,\n { description?: string; inputSchema: ZodObject<any> }\n > = new Map();\n private logger: AiLogger = console;\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, PARTS, TOOLS, any>[],\n options?: { maxCallDepth?: number; logger?: AiLogger }\n ) {\n this.logger = options?.logger ?? console;\n this.logger.log('AiAgentKit v3 initialized.');\n if (stack) {\n this.stack = stack;\n }\n if (options?.maxCallDepth) {\n this.options.maxCallDepth = options.maxCallDepth;\n }\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 MW_METADATA,\n MW_TOOLS extends UITools,\n MW_STATE extends Record<string, any>,\n >(\n agentPath:\n | string\n | RegExp\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>,\n ...agents: (\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n | AiRouter<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n )[]\n ): AiRouter<\n KIT_METADATA | MW_METADATA,\n PARTS,\n TOOLS & MW_TOOLS,\n ContextState & MW_STATE\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 mountPathArg: string | RegExp,\n handler:\n | AiMiddleware<KIT_METADATA, PARTS, TOOLS, ContextState>\n | AiRouter<any, any, any, any>\n ): this {\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 path: string | RegExp,\n options: {\n description?: string;\n inputSchema: ZodObject<any>;\n }\n ) {\n this.actAsToolDefinitions.set(path, options);\n this.logger.log(\n `[actAsTool] Added definition: ${path} -> ${JSON.stringify(options)}`\n );\n this.logger.log(\n `[actAsTool] Router now has ${this.actAsToolDefinitions.size} definitions`\n );\n return this;\n }\n\n // Overload for factory-based tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends 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 // Overload for static tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 // Implementation\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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.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> = 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 };\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>,\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 * 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, PARTS, TOOLS, ContextState>,\n options: {\n type: 'agent' | 'tool';\n path: string;\n messages?: UIMessage<KIT_METADATA, PARTS, TOOLS>[];\n params?: Record<string, any>;\n }\n ) {\n const parentDepth = parentCtx.executionContext.callDepth ?? 0;\n const newCallDepth = parentDepth + (options.type === 'agent' ? 1 : 0);\n\n const subContext: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> = {\n ...parentCtx,\n // Deep clone state and execution context to prevent race conditions.\n state: JSON.parse(JSON.stringify(parentCtx.state)),\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 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 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[]) => this.logger.log(fullPrefix, ...args),\n warn: (...args: any[]) => this.logger.warn(fullPrefix, ...args),\n error: (...args: any[]) => this.logger.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(layer: Layer<any, any, any, any>): 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, PARTS, TOOLS, ContextState>,\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<void> => {\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 await layer.handler(ctx, next);\n\n ctx.logger.log(`<- Finished ${layerType}: ${layerPath}`);\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 await dispatch(0);\n return;\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, PARTS, TOOLS, ContextState>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\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: 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 const ctx: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> & {\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 executionContext: { currentPath: path, callDepth: 0 },\n requestId: requestId,\n logger: self._createLogger(requestId, path, 0),\n response: {\n ...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 await self._execute(path, ctx);\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\nclass NextHandler<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> {\n public maxCallDepth: number;\n\n constructor(\n private ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n private router: AiRouter<METADATA, PARTS, TOOLS, ContextState>,\n private onExecutionStart: () => void,\n private onExecutionEnd: () => void,\n parentNext?: NextHandler<METADATA, PARTS, TOOLS, ContextState>\n ) {\n this.maxCallDepth = this.router.options.maxCallDepth;\n }\n\n async callAgent(\n agentPath: string,\n params?: Record<string, any>,\n options?: ToolCallOptions\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,\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(`[callAgent] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\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.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,\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 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 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?: Tool<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 return {\n ...definition,\n execute: async (params: any, options: any) => {\n const result = await this.callAgent(agentPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n },\n } as Tool<INPUT, OUTPUT>;\n }\n}\n","import crypto from 'crypto'\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\n// It is best to make fewer, larger requests to the crypto module to\n// avoid system call overhead. So, random numbers are generated in a\n// pool. The pool is a Buffer that is larger than the initial random\n// request size by this multiplier. The pool is enlarged if subsequent\n// requests exceed the maximum buffer size.\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\n\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}\n\nlet random = bytes => {\n // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n // A compact alternative for `for (let i = 0; i < step; i++)`.\n let i = step\n while (i--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) => {\n // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution\n fillPool((size |= 0))\n let id = ''\n // We are reading directly from the random pool to avoid creating new array\n for (let i = poolOffset - size; i < poolOffset; i++) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\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 private 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>(\n tool: {\n toolCallId?: string;\n toolName: K;\n inputTextDelta?: string[];\n input?: any;\n output?: any;\n } & Omit<TOOLS[K], \"toolCallId\">\n ) => {\n const 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 || tool.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 || tool.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 || tool.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 || tool.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 }) => {\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 usage: tool.result.usage,\n warnings: tool.result.warnings,\n finishReason: tool.result.finishReason,\n },\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"],"mappings":";AAAA;AAAA,EAEE;AAAA,EAEA;AAAA,EAEA;AAAA,EAKA;AAAA,OACK;;;ACZP,OAAO,YAAY;AASnB,IAAM,uBAAuB;AAC7B,IAAI;AAAJ,IAAU;AAEV,IAAI,WAAW,WAAS;AACtB,MAAI,CAAC,QAAQ,KAAK,SAAS,OAAO;AAChC,WAAO,OAAO,YAAY,QAAQ,oBAAoB;AACtD,WAAO,eAAe,IAAI;AAC1B,iBAAa;AAAA,EACf,WAAW,aAAa,QAAQ,KAAK,QAAQ;AAC3C,WAAO,eAAe,IAAI;AAC1B,iBAAa;AAAA,EACf;AACA,gBAAc;AAChB;AAEA,IAAI,SAAS,WAAS;AAEpB,WAAU,SAAS,CAAE;AACrB,SAAO,KAAK,SAAS,aAAa,OAAO,UAAU;AACrD;AAEA,IAAI,eAAe,CAAC,UAAU,aAAa,cAAc;AAKvD,MAAI,QAAQ,KAAM,KAAK,KAAK,MAAO,SAAS,SAAS,IAAK,CAAC,KAAM;AAajE,MAAI,OAAO,KAAK,KAAM,MAAM,OAAO,cAAe,SAAS,MAAM;AAEjE,SAAO,CAAC,OAAO,gBAAgB;AAC7B,QAAI,KAAK;AACT,WAAO,MAAM;AACX,UAAI,QAAQ,UAAU,IAAI;AAE1B,UAAI,IAAI;AACR,aAAO,KAAK;AAEV,cAAM,SAAS,MAAM,CAAC,IAAI,IAAI,KAAK;AACnC,YAAI,GAAG,WAAW,KAAM,QAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,iBAAiB,CAAC,UAAU,OAAO,OACrC,aAAa,UAAU,MAAM,MAAM;;;ACzD9B,IAAM,kBAAkB,CAAI,UAAe;AAChD,SAAO,MAAM,MAAM,SAAS,CAAC;AAC/B;AAEO,IAAM,mBAAmB,CAAI,UAAe;AACjD,SAAO,MAAM,CAAC;AAChB;AAEO,IAAM,eAAN,MAAoD;AAAA,EAEzD,YAAY,QAAgE;AAG5E,sBAAa,MAAM;AACjB,aAAO,eAAe,wCAAwC,EAAE,EAAE;AAAA,IACpE;AACA,gCAAuB,CACrB,aACG;AACH,aAAO,KAAK,OAAO,MAAM;AAAA,QACvB,MAAM;AAAA,QACN,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH;AACA,2BAAkB,CAChBA,UAOG;AACH,YAAM,aAAaA,MAAK,UAAU,SAAS,IAAI,MAAM,KAAK,WAAW;AACrE,UAAI,WAAWA,SAAQA,MAAK,OAAO;AACjC,aAAK,OAAO,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,OAAOA,MAAK;AAAA,UACZ,YAAY,cAAcA,MAAK,cAAc;AAAA,UAC7C,UAAUA,MAAK;AAAA,QACjB,CAAC;AAAA,MACH;AACA,UACGA,MAAK,kBAAkBA,MAAK,eAAe,SAAS,KACpD,YAAYA,SAAQA,MAAK,QAC1B;AACA,aAAK,OAAO,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,YAAY,cAAcA,MAAK,cAAc;AAAA,UAC7C,UAAUA,MAAK;AAAA,QACjB,CAAC;AACD,YAAIA,MAAK,gBAAgB;AACvB,qBAAW,SAASA,MAAK,gBAAgB;AACvC,iBAAK,OAAO,MAAM;AAAA,cAChB,MAAM;AAAA,cACN,YAAY,cAAcA,MAAK,cAAc;AAAA,cAC7C,gBAAgB;AAAA,YAClB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,UAAI,YAAYA,SAAQA,MAAK,QAAQ;AACnC,aAAK,OAAO,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,YAAY,cAAcA,MAAK,cAAc;AAAA,UAC7C,QAAQA,MAAK;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,6BAAoB,CAAwBA,UAGtC;AACJ,UAAI,CAACA,MAAK,OAAO,QAAQ;AACvB,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAEA,YAAM,aAAaA,MAAK,SAAS,SAAS,IAAI,MAAM,KAAK,WAAW;AAEpE,WAAK,OAAO,MAAM;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,UAAUA,MAAK;AAAA,MACjB,CAAC;AAED,WAAK,OAAO,MAAM;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,OAAO;AAAA,UACL,OAAOA,MAAK,OAAO;AAAA,UACnB,UAAUA,MAAK,OAAO;AAAA,UACtB,cAAcA,MAAK,OAAO;AAAA,QAC5B;AAAA,QACA,UAAUA,MAAK;AAAA,MACjB,CAAC;AAED,WAAK,OAAO,MAAM;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,QAAQA,MAAK,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AA1FE,SAAK,SAAS;AAAA,EAChB;AA0FF;AAEO,IAAM,eAAe,CAAC,YAA0C;AACrE,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QAAQ,MACZ,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI;AAC5B;AAEO,IAAM,sBAAsB,CAAC,YAA0C;AAC5E,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,MACZ,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE,EACP,KAAK;AACV;AAEO,IAAM,sBAAsB,CACjC,SACA,YAIG;AACH,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QACJ,OAAO,CAAC,MAAM;AACb,QAAI,QAAQ,QAAQ,EAAE,SAAS,QAAQ,KAAM,QAAO;AACpD,QAAI,QAAQ,UAAU;AACpB,iBAAW,OAAO,QAAQ,UAAU;AAAA,MACpC;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC,EACA,IAAI;AACT;;;AFnIA,OAAO,UAAU;AAGV,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,WAAW;AAAA,EACjD,YAAYC,OAAc;AACxB,UAAM,0CAA0CA,KAAI,EAAE;AACtD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,WAAW;AAAA,EAChD,YAAYA,OAAc;AACxB,UAAM,wCAAwCA,KAAI,EAAE;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD,YAAYA,OAAc,iBAA6B;AACrD,UAAM,UAAU,sDAAsDA,KAAI,KAAK,gBAAgB,OAAO;AACtG,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,4BAAN,cAAwC,WAAW;AAAA,EACxD,YAAY,UAAkB;AAC5B,UAAM,wCAAwC,QAAQ,aAAa;AACnE,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,8BAAN,cAA0C,WAAW;AAAA,EAC1D,YAAYA,OAAc;AACxB;AAAA,MACE,sDAAsDA,KAAI;AAAA,IAC5D;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAUA,SAAS,iBAAiB,SAGxB;AACA,QAAM,aAAuB,CAAC;AAE9B,QAAM,QAAQ,QAAQ,MAAM,aAAa;AAEzC,QAAM,eAAe,MAClB,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,WAAW,IAAI,GAAG;AAEzB,iBAAW,KAAK,KAAK,UAAU,CAAC,CAAC;AACjC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,QAAQ,uBAAuB,MAAM;AAAA,EACnD,CAAC,EACA,KAAK,EAAE;AAEV,QAAM,QAAQ,IAAI,OAAO,IAAI,YAAY,GAAG;AAE5C,SAAO,EAAE,OAAO,WAAW;AAC7B;AAQA,SAAS,kBACP,SACAA,OAC+B;AAC/B,QAAM,EAAE,OAAO,WAAW,IAAI,iBAAiB,OAAO;AACtD,QAAM,QAAQA,MAAK,MAAM,KAAK;AAE9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,CAAC,WAAW,UAAU;AACvC,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,QAAI,UAAU,QAAW;AACvB,aAAO,SAAS,IAAI;AAAA,IACtB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAOA,SAAS,iBAAiB,SAA0B;AAClD,SAAO,YAAY,KAAK,OAAO;AACjC;AA6JO,IAAM,WAAN,MAAM,UAKX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,YACE,OACA,SACA;AAvBF,SAAQ,QAAkD,CAAC;AAC3D,SAAQ,uBAGJ,oBAAI,IAAI;AACZ,SAAQ,SAAmB;AAG3B;AAAA,SAAO,UAGH;AAAA,MACF,cAAc;AAAA,IAChB;AA8rBA,SAAQ,oBAAoB;AAnrB1B,SAAK,SAAS,SAAS,UAAU;AACjC,SAAK,OAAO,IAAI,4BAA4B;AAC5C,QAAI,OAAO;AACT,WAAK,QAAQ;AAAA,IACf;AACA,QAAI,SAAS,cAAc;AACzB,WAAK,QAAQ,eAAe,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAKE,cAIG,QASH;AACA,QAAI,SAA0B;AAC9B,QAAI,OAAO,cAAc,YAAY,qBAAqB,QAAQ;AAChE,eAAS;AAAA,IACX,OAAO;AACL,aAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,eAAW,WAAW,QAAQ;AAC5B,UAAI,OAAO,YAAY,YAAY;AAEjC,YAAI,mBAAmB,aAAY,OAAO,WAAW,UAAU;AAC7D,gBAAM,eAAe,QAAQ,mBAAmB,MAAM;AACtD,eAAK,MAAM,KAAK,GAAI,YAAoB;AACxC,eAAK,OAAO;AAAA,YACV,wBAAwB,MAAM,YAAY,aAAa,MAAM;AAAA,UAC/D;AAEA,gBAAM,YAAY,OAAO,SAAS;AAClC,kBAAQ,qBAAqB,QAAQ,CAAC,OAAO,QAAQ;AACnD,kBAAM,UAAU,IAAI,SAAS;AAC7B,kBAAM,kBAAkB,QAAQ,WAAW,GAAG,IAC1C,QAAQ,UAAU,CAAC,IACnB;AACJ,kBAAM,SAAS,KAAK,MAAM,KAAK,WAAW,eAAe;AACzD,iBAAK,qBAAqB,IAAI,QAAQ,KAAK;AAAA,UAC7C,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,WAAK,MAAM,KAAK;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA;AAAA,MACX,CAAC;AACD,WAAK,OAAO,IAAI,0BAA0B,MAAM,EAAE;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IACE,cACA,SAGM;AACN,QAAI,wBAAwB,UAAU,mBAAmB,WAAU;AACjE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB,WAAU;AAC/B,YAAM,SAAS;AACf,YAAM,YAAY,aAAa,SAAS,EAAE,QAAQ,OAAO,EAAE;AAE3D,aAAO,MAAM,QAAQ,CAAC,UAAU;AAC9B,cAAM,YAAY,MAAM,KAAK,SAAS;AAEtC,cAAM,oBAAoB,UAAU,WAAW,GAAG,IAC9C,UAAU,UAAU,CAAC,IACrB;AACJ,cAAM,UAAU,KAAK,MAAM,KAAK,WAAW,iBAAiB;AAC5D,aAAK,MAAM,KAAK,EAAE,GAAG,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7C,CAAC;AAED,aAAO,qBAAqB,QAAQ,CAAC,OAAO,QAAQ;AAClD,cAAM,UAAU,IAAI,SAAS;AAC7B,cAAM,kBAAkB,QAAQ,WAAW,GAAG,IAC1C,QAAQ,UAAU,CAAC,IACnB;AACJ,cAAM,SAAS,KAAK,MAAM,KAAK,WAAW,eAAe;AACzD,aAAK,qBAAqB,IAAI,QAAQ,KAAK;AAAA,MAC7C,CAAC;AAAA,IACH,OAAO;AAEL,WAAK,MAAM,KAAK;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UACEA,OACA,SAIA;AACA,SAAK,qBAAqB,IAAIA,OAAM,OAAO;AAC3C,SAAK,OAAO;AAAA,MACV,iCAAiCA,KAAI,OAAO,KAAK,UAAU,OAAO,CAAC;AAAA,IACrE;AACA,SAAK,OAAO;AAAA,MACV,8BAA8B,KAAK,qBAAqB,IAAI;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAiDA,KAMEA,OACA,kBAWA,SAWA;AACA,SAAK,OAAO,IAAI,gDAAgDA,KAAI;AACpE,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,SAASA,KAAI,GAAG;AACvD,WAAK,OAAO;AAAA,QACV,wDAAwDA,KAAI;AAAA,MAC9D;AACA,YAAM,IAAI,WAAW,0CAA0CA,KAAI,EAAE;AAAA,IACvE;AACA,QAAI,OAAO,qBAAqB,cAAc,CAAC,SAAS;AACtD,YAAM,UAAU;AAChB,YAAM,gBAAgB,OAAOA,UAAS,YAAY,iBAAiBA,KAAI;AAEvE,YAAM,iBAAmD,OACvD,KACA,UACG;AACH,aAAK,OAAO;AAAA,UACV,iDAAiDA,KAAI,2BACnD,IAAI,QAAQ,UAAU,UAAU,WAClC;AAAA,QACF;AAEA,cAAM,aAAa,QAAQ,GAAG;AAE9B,YAAI,CAAC,WAAW,SAAS;AACvB,gBAAM,IAAI;AAAA,YACR,0CAA0CA,KAAI;AAAA,UAChD;AAAA,QACF;AAGA,cAAM,SAAS,WAAW;AAC1B,YAAI,CAAC,QAAQ;AACX,eAAK,OAAO;AAAA,YACV,iDAAiDA,KAAI;AAAA,UACvD;AACA,iBAAO,WAAW,QAAQ,CAAC,GAAU,CAAC,CAAoB;AAAA,QAC5D;AAEA,cAAM,eAAe,OAAO,UAAU,IAAI,QAAQ,MAAM;AAExD,YAAI,CAAC,aAAa,SAAS;AACzB,eAAK,OAAO;AAAA,YACV,4DAA4DA,KAAI;AAAA,YAChE,aAAa,MAAM;AAAA,UACrB;AACA,gBAAM,IAAI,oBAAoBA,MAAK,SAAS,GAAG,aAAa,KAAK;AAAA,QACnE;AAIA,eAAO,WAAW,QAAQ,aAAa,MAAM;AAAA,UAC3C,UAAU,uBAAuB,IAAI,QAAQ,YAAY,CAAC,CAAC;AAAA,UAC3D,YACE,WACCA,MAAK,SAAS,GAAG,MAAM,GAAG,EAAE,IAAI,KAAK,iBACtC,MACA,WAAW;AAAA,QACf,CAAC;AAAA,MACH;AACA,WAAK,MAAM,KAAK;AAAA,QACd,MAAAA;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,kBAAkB;AAAA,MACpB,CAAC;AACD,WAAK,OAAO;AAAA,QACV,yBAAyBA,KAAI,iBAC3B,gBAAgB,eAAe,EACjC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,QAAI,OAAO,qBAAqB,YAAY,SAAS;AACnD,YAAM,UAAU;AAIhB,YAAM,gBAAgB,OAAOA,UAAS,YAAY,iBAAiBA,KAAI;AACvE,YAAM,mBAAmB,gBACrB,iBAAiBA,KAAc,IAC/B;AACJ,YAAM,iBAKF,OAAO,KAAK,UAAU;AACxB,YAAI,iBAAiB,OAAOA,UAAS,UAAU;AAC7C,gBAAM,aAAa,kBAAkBA,OAAM,IAAI,QAAQ,QAAQ,EAAE;AACjE,eAAK,OAAO;AAAA,YACV;AAAA,YACA;AAAA,UACF;AACA,cAAI,YAAY;AACd,gBAAI,QAAQ,SAAS;AAAA,cACnB,GAAG,IAAI,QAAQ;AAAA,cACf,GAAG;AAAA,YACL;AAAA,UACF;AAAA,QACF;AACA,cAAM,eAAe,QAAQ,OAAO,UAAU,IAAI,QAAQ,MAAM;AAChE,YAAI,CAAC,aAAa,SAAS;AACzB,eAAK,OAAO;AAAA,YACV,4DAA4DA,KAAI;AAAA,YAChE,aAAa,MAAM;AAAA,UACrB;AACA,gBAAM,IAAI,oBAAoBA,MAAK,SAAS,GAAG,aAAa,KAAK;AAAA,QACnE;AACA,cAAM,gBAAgB;AAItB,eAAO,cAAc,KAAK,aAAa,IAAI;AAAA,MAC7C;AACA,WAAK,MAAM,KAAK;AAAA,QACd,MAAAA;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,aAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,YAAY,kBAAkB;AAAA,MAChC,CAAC;AACD,WAAK,OAAO;AAAA,QACV,yBAAyBA,KAAI,gBAC3B,gBAAgB,eAAe,EACjC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,SAAK,OAAO;AAAA,MACV,uEAAuEA,KAAI;AAAA,IAC7E;AACA,UAAM,IAAI;AAAA,MACR,oDAAoDA,KAAI;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,QAAgB;AACjC,WAAO,KAAK,MAAM,IAAI,CAAC,UAAU;AAC/B,UAAI;AACJ,UAAI,MAAM,gBAAgB,QAAQ;AAEhC,kBAAU,IAAI,OAAO,OAAO,QAAQ,OAAO,MAAM,IAAI,MAAM,KAAK,MAAM;AAAA,MACxE,OAAO;AACL,cAAM,eAAe,MAAM,KAAK,SAAS;AAEzC,cAAM,oBAAoB,aAAa,WAAW,GAAG,IACjD,aAAa,UAAU,CAAC,IACxB;AACJ,kBAAU,KAAK,MAAM,KAAK,QAAQ,iBAAiB;AAAA,MACrD;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAa,YAAoB,SAAyB;AAChE,QAAI,QAAQ,WAAW,IAAI,GAAG;AAE5B,aAAO,KAAK,MAAM,UAAU,QAAQ,UAAU,CAAC,CAAC;AAAA,IAClD;AAEA,UAAM,aAAa,KAAK,MAAM,KAAK,YAAY,OAAO;AACtD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBACN,WACA,SAMA;AACA,UAAM,cAAc,UAAU,iBAAiB,aAAa;AAC5D,UAAM,eAAe,eAAe,QAAQ,SAAS,UAAU,IAAI;AAEnE,UAAM,aAAkE;AAAA,MACtE,GAAG;AAAA;AAAA,MAEH,OAAO,KAAK,MAAM,KAAK,UAAU,UAAU,KAAK,CAAC;AAAA,MACjD,kBAAkB;AAAA,QAChB,GAAG,UAAU;AAAA,QACb,aAAa,QAAQ;AAAA,QACrB,WAAW;AAAA,MACb;AAAA,MACA,SAAS;AAAA,QACP,GAAG,UAAU;AAAA,QACb,UACE,QAAQ,YACR,UAAU,QAAQ,YACjB,CAAC;AAAA,QACJ,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA;AAAA,MAChB;AAAA,MACA,QAAQ,KAAK;AAAA,QACX,UAAU;AAAA,QACV,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,IACR;AAGA,eAAW,iBAAiB,cAAc,QAAQ;AAElD,eAAW,OAAO,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,MACC,UAAkB;AAAA,MAClB,UAAkB;AAAA,MACnB,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cACN,WACAA,OACA,YAAoB,GACV;AACV,UAAM,SAAS,KAAK,OAAO,SAAS;AACpC,UAAM,SAAS,GAAG,MAAM,IAAIA,MAAK,SAAS,CAAC;AAE3C,UAAM,aAAa,IAAI,SAAS,IAAI,MAAM;AAC1C,WAAO;AAAA,MACL,KAAK,IAAI,SAAgB,KAAK,OAAO,IAAI,YAAY,GAAG,IAAI;AAAA,MAC5D,MAAM,IAAI,SAAgB,KAAK,OAAO,KAAK,YAAY,GAAG,IAAI;AAAA,MAC9D,OAAO,IAAI,SAAgB,KAAK,OAAO,MAAM,YAAY,GAAG,IAAI;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,qBAAqB,OAA0C;AACrE,UAAMA,QAAO,MAAM,KAAK,SAAS;AACjC,QAAI,QAAQ;AAGZ,aAASA,MAAK,MAAM,GAAG,EAAE,SAAS;AAGlC,cAAUA,MAAK,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS;AAG3C,QAAI,MAAM,gBAAgB,QAAQ;AAChC,eAAS;AAAA,IACX;AAGA,QAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,eAAS;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,SACZA,OACA,KACA,iBAAiB,OACjB;AAGA,QAAI;AACF,YAAM,iBACJA,MAAK,SAAS,KAAKA,MAAK,SAAS,GAAG,IAAIA,MAAK,MAAM,GAAG,EAAE,IAAIA;AAE9D,UAAI,OAAO,IAAI,kCAAkC,cAAc,EAAE;AACjE,YAAM,cAAc,KAAK,MAAM,OAAO,CAAC,UAAU;AAC/C,YAAI,YAAY;AAGhB,YAAI,MAAM,gBAAgB,QAAQ;AAChC,cAAI,gBAAgB;AAClB,kBAAM,aAAa,IAAI,OAAO,IAAI,MAAM,KAAK,MAAM,GAAG;AACtD,wBAAY,WAAW,KAAK,cAAc;AAAA,UAC5C,OAAO;AACL,wBAAY,MAAM,KAAK,KAAK,cAAc;AAAA,UAC5C;AAAA,QACF,WAAW,OAAO,MAAM,SAAS,UAAU;AACzC,gBAAM,YAAY,MAAM;AAGxB,cAAI,cAAc,KAAK;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,gBAAM,sBACJ,UAAU,SAAS,KAAK,UAAU,SAAS,GAAG,IAC1C,UAAU,MAAM,GAAG,EAAE,IACrB;AAEN,gBAAM,eAAe,mBAAmB;AAExC,cAAI,gBAAgB;AAGlB,gBAAI,MAAM,UAAU,MAAM,kBAAkB;AAC1C,0BAAY,kBAAkB,WAAW,cAAc,MAAM;AAAA,YAC/D,OAAO;AACL,0BAAY;AAAA,YACd;AAAA,UACF,OAAO;AAEL,gBAAI,MAAM,QAAQ;AAEhB,kBAAI,MAAM,kBAAkB;AAC1B,4BACE,kBAAkB,WAAW,cAAc,MAAM;AAAA,cACrD,OAAO;AACL,4BAAY;AAAA,cACd;AAAA,YACF,WAAW,MAAM,SAAS;AAExB,0BAAY;AAAA,YACd,OAAO;AAEL,0BAAY,eAAe,WAAW,mBAAmB;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAEA,YAAI,WAAW;AACb,cAAI,OAAO;AAAA,YACT,4CAA4C,cAAc,gBAAgB,MAAM,IAAI,YAAY,MAAM,MAAM,aAAa,MAAM,OAAO,gBAAgB,cAAc;AAAA,UACtK;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAGD,kBAAY;AAAA,QACV,CAAC,GAAG,MAAM,KAAK,qBAAqB,CAAC,IAAI,KAAK,qBAAqB,CAAC;AAAA,MACtE;AAEA,YAAM,oBAAoB,YAAY;AAAA,QACpC,CAAC,MACC,GAAG,EAAE,KAAK,SAAS,CAAC,KAClB,EAAE,SAAS,SAAS,EAAE,UAAU,UAAU,YAC5C;AAAA,MACJ;AACA,UAAI,OAAO;AAAA,QACT,SAAS,YAAY,MAAM,oBAAoB,kBAAkB;AAAA,UAC/D;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,UAAU,YAAY,KAAK,CAAC,MAAM,EAAE,MAAM;AAChD,YAAM,WAAW,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAElD,UAAI,CAAC,YAAY,QAAQ;AACvB,cAAM,WAAW,oCAAoC,cAAc;AACnE,YAAI,OAAO,MAAM,QAAQ;AACzB,cAAM,IAAI,mBAAmB,cAAc;AAAA,MAC7C;AAGA,YAAM,WAAW,OAAO,UAAiC;AACvD,cAAM,QAAQ,YAAY,KAAK;AAC/B,YAAI,CAAC,OAAO;AAEV;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,SAAS,QAAQ,CAAC;AAErC,cAAM,YACJ,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,KAAK,SAAS;AAEpE,cAAM,YAAY,MAAM,SACpB,SACA,MAAM,UACJ,UACA;AACN,YAAI,OAAO,IAAI,cAAc,SAAS,KAAK,SAAS,EAAE;AAEtD,YAAI;AACF,cAAI,IAAI,mBAAmB;AACzB,gBAAI,kBAAkB;AAAA,UACxB;AAGA,gBAAM,MAAM,QAAQ,KAAK,IAAI;AAE7B,cAAI,OAAO,IAAI,eAAe,SAAS,KAAK,SAAS,EAAE;AAAA,QACzD,SAAS,KAAK;AACZ,cAAI,OAAO;AAAA,YACT,YAAY,SAAS,oBAAoB,SAAS;AAAA,YAClD;AAAA,UACF;AACA,gBAAM;AAAA,QACR,UAAE;AACA,cAAI,IAAI,iBAAiB;AACvB,gBAAI,gBAAgB;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,CAAC;AAChB;AAAA,IACF,UAAE;AAAA,IAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OACEA,OACA,gBASU;AACV,SAAK,OAAO,IAAI,8BAA8BA,KAAI,EAAE;AACpD,UAAM,OAAO;AAGb,QAAI,8BAAmD;AACvD,UAAM,6BAA6B,IAAI,QAAc,CAAC,YAAY;AAChE,oCAA8B;AAAA,IAChC,CAAC;AAID,WAAO,8BAA8B;AAAA,MACnC,QAAQ,sBAAsB;AAAA,QAC5B,kBAAkB,eAAe,QAAQ;AAAA,QACzC,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,gBAAM,eAAe,IAAI,aAAkC,MAAM;AACjE,gBAAM,YAAY,WAAW;AAE7B,gBAAM,MAGF;AAAA,YACF,GAAG;AAAA,YACH,SAAS;AAAA,cACP,GAAG,eAAe;AAAA,cAClB,MAAMA;AAAA;AAAA,YACR;AAAA,YACA,OAAO,CAAC;AAAA,YACR,kBAAkB,EAAE,aAAaA,OAAM,WAAW,EAAE;AAAA,YACpD;AAAA,YACA,QAAQ,KAAK,cAAc,WAAWA,OAAM,CAAC;AAAA,YAC7C,UAAU;AAAA,cACR,GAAG;AAAA,cACH,sBAAsB,aAAa;AAAA,cACnC,iBAAiB,aAAa;AAAA,cAC9B,mBAAmB,aAAa;AAAA,cAChC;AAAA,YACF;AAAA,YACA,MAAM;AAAA;AAAA,YACN,mBAAmB,MAAM;AACvB,mBAAK;AACL,mBAAK,OAAO;AAAA,gBACV,uDAAuD,KAAK,iBAAiB;AAAA,cAC/E;AAAA,YACF;AAAA,YACA,iBAAiB,MAAM;AACrB,mBAAK;AACL,mBAAK,OAAO;AAAA,gBACV,qDAAqD,KAAK,iBAAiB;AAAA,cAC7E;AACA,kBAAI,KAAK,sBAAsB,KAAK,6BAA6B;AAC/D,qBAAK,OAAO;AAAA,kBACV;AAAA,gBACF;AACA,4CAA4B;AAAA,cAC9B;AAAA,YACF;AAAA,UACF;AACA,cAAI,OAAO,IAAI;AAAA,YACb;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAEA,cAAI,kBAAkB;AACtB,eAAK,OAAO;AAAA,YACV;AAAA,UACF;AAgBA,cAAI;AACF,kBAAM,KAAK,SAASA,OAAM,GAAG;AAAA,UAC/B,SAAS,KAAK;AACZ,gBAAI,OAAO,MAAM,2CAA2C,GAAG;AAAA,UACjE,UAAE;AACA,gBAAI,gBAAgB;AACpB,iBAAK,OAAO;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAUA,gBAAM;AACN,eAAK,OAAO;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,IAAM,cAAN,MAKE;AAAA,EAGA,YACU,KACA,QACA,kBACA,gBACR,YACA;AALQ;AACA;AACA;AACA;AAGR,SAAK,eAAe,KAAK,OAAO,QAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,UACJ,WACA,QACA,SACgE;AAChE,SAAK,iBAAiB;AACtB,QAAI;AACF,YAAM,eAAe,KAAK,IAAI,iBAAiB,aAAa;AAC5D,UAAI,gBAAgB,KAAK,cAAc;AACrC,cAAM,MAAM,IAAI,0BAA0B,KAAK,YAAY;AAC3D,aAAK,IAAI,OAAO,MAAM,yBAAyB,IAAI,OAAO,EAAE;AAC5D,cAAM;AAAA,MACR;AACA,YAAM,aAAa,KAAK,IAAI,iBAAiB,eAAe;AAC5D,YAAM,eAAgB,KAAK,OAAe;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAEA,WAAK,IAAI,OAAO,IAAI,gCAAgC,YAAY,GAAG;AAEnE,YAAM,aAAc,KAAK,OAAe,kBAAkB,KAAK,KAAK;AAAA,QAClE,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,UAAU,KAAK,IAAI,QAAQ;AAAA,MAC7B,CAAC;AACD,YAAM,OAAO,MAAO,KAAK,OAAe;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,EAAE,IAAI,MAAM,KAAK;AAAA,IAC1B,SAAS,OAAY;AACnB,WAAK,IAAI,OAAO,MAAM,sBAAsB,KAAK;AACjD,aAAO,EAAE,IAAI,OAAO,MAAM;AAAA,IAC5B,UAAE;AACA,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,UACA,QACA,SACgE;AAChE,SAAK,iBAAiB;AACtB,QAAI;AACF,YAAM,aAAa,KAAK,IAAI,iBAAiB,eAAe;AAC5D,YAAM,eAAgB,KAAK,OAAe;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAEA,WAAK,IAAI,OAAO,IAAI,+BAA+B,YAAY,GAAG;AAElE,YAAM,aAAc,KAAK,OAAe,kBAAkB,KAAK,KAAK;AAAA,QAClE,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,UAAU,KAAK,IAAI,QAAQ;AAAA,MAC7B,CAAC;AACD,YAAM,OAAO,MAAO,KAAK,OAAe;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,EAAE,IAAI,MAAM,KAAK;AAAA,IAC1B,SAAS,OAAY;AACnB,WAAK,IAAI,OAAO,MAAM,qBAAqB,KAAK;AAChD,aAAO,EAAE,IAAI,OAAO,MAAM;AAAA,IAC5B,UAAE;AACA,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,WACE,UACA,OAC4B;AAC5B,UAAM,aAAa,KAAK,IAAI,iBAAiB,eAAe;AAC5D,UAAM,eAAgB,KAAK,OAAe;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AACA,SAAK,IAAI,OAAO,IAAI,iCAAiC,YAAY,GAAG;AAEpE,UAAM,QAAS,KAAK,OAAe,MAAM,KAAK,CAAC,MAAW;AACxD,UAAI,CAAC,EAAE,OAAQ,QAAO;AACtB,UAAI,EAAE,SAAS,aAAc,QAAO;AACpC,UAAI,EAAE,oBAAoB,OAAO,EAAE,SAAS,UAAU;AACpD,eAAO,kBAAkB,EAAE,MAAM,YAAY,MAAM;AAAA,MACrD;AACA,aAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,SAAS,CAAC,MAAM,aAAa;AAChC,WAAK,IAAI,OAAO;AAAA,QACd,iDAAiD,YAAY;AAAA,MAC/D;AACA,YAAM,IAAI,kBAAkB,YAAY;AAAA,IAC1C;AACA,QAAI,MAAM,YAAY,SAAS,WAAW;AACxC,aAAO,MAAM,YAAY,QAAQ,KAAK,GAAG;AAAA,IAC3C;AACA,UAAM,EAAE,aAAa,OAAO,IAAI,MAAM;AACtC,WAAO;AAAA,MACL;AAAA,MACA,aAAa;AAAA,MACb,GAAI,SAAS,CAAC;AAAA,MACd,SAAS,OAAO,QAAyB,YAA6B;AACpE,YAAI,OAAO,SAAS;AAClB,iBAAO,MAAM,MAAM,UAAU,QAAe,OAAO;AAAA,QACrD;AACA,cAAM,SAAS,MAAM,KAAK,SAAS,UAAU,QAAQ,OAAO;AAC5D,YAAI,CAAC,OAAO,IAAI;AACd,gBAAM,OAAO;AAAA,QACf;AACA,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YACE,WACA,gBACA;AACA,UAAM,aAAa,KAAK,IAAI,iBAAiB,eAAe;AAC5D,UAAM,eAAgB,KAAK,OAAe;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AACA,QAAI;AACJ,UAAM,aAAa,CAAC,YAAY;AAEhC,QAAI,UAAU,WAAW,GAAG,GAAG;AAC7B,iBAAW,QAAQ,SAAS;AAAA,IAC9B;AACA,eAAW,aAAa,YAAY;AAClC,iBAAW,CAAC,KAAK,KAAK,KAAM,KAAK,OAAe,sBAAsB;AACpE,YAAI,OAAO,QAAQ,UAAU;AAE3B,cAAI,QAAQ,WAAW;AACrB,yBAAa;AACb;AAAA,UACF;AAEA,cAAI,kBAAkB,KAAK,SAAS,MAAM,MAAM;AAC9C,yBAAa;AACb;AAAA,UACF;AAAA,QACF;AAEA,YAAI,eAAe,UAAU,IAAI,KAAK,SAAS,GAAG;AAChD,uBAAa;AACb;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAY;AAAA,IAClB;AAEA,UAAM,aAAa,kBAAkB;AACrC,QAAI,CAAC,YAAY;AACf,WAAK,IAAI,OAAO;AAAA,QACd,iEAAiE,YAAY;AAAA,MAC/E;AACA,YAAM,IAAI,4BAA4B,YAAY;AAAA,IACpD;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,OAAO,QAAa,YAAiB;AAC5C,cAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,OAAO;AAC9D,YAAI,CAAC,OAAO,IAAI;AACd,gBAAM,OAAO;AAAA,QACf;AACA,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;","names":["tool","path"]}
1
+ {"version":3,"sources":["../src/router.ts","../../../node_modules/nanoid/index.js","../src/helper.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} from 'ai';\nimport { StreamWriter } from './helper.js';\nimport { UITools } from './types.js';\nimport { z, ZodObject } from 'zod';\nimport path from 'path';\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\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\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,\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\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?: Record<string, any>;\n [key: string]: any;\n };\n /** A shared, mutable state object that persists for the lifetime of a single request. */\n state: ContextState;\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<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, PARTS, TOOLS, ContextState>;\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<void>;\n/** A function that handles a request for a specific agent path. */\nexport type AiHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Promise<void>;\n\n/** A function that handles a request for a specific tool path, with validated parameters. */\nexport type AiToolHandler<\n METADATA,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> =\n | ((\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n params: Record<string, any>\n ) => Promise<any>)\n | ((ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => Tool<any, any>);\n\n/** A function that creates a Tool on-demand with access to the request context. */\nexport type AiToolFactory<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> = (ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>) => 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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = (\n ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n next: NextFunction\n) => Promise<void>;\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = Record<string, any>,\n> = {\n path: string | RegExp;\n handler: AiMiddleware<METADATA, PARTS, TOOLS, ContextState>;\n isTool: boolean;\n toolOptions?:\n | {\n type: 'static';\n schema: ZodObject<any>;\n description?: string;\n handler: AiToolHandler<METADATA, PARTS, TOOLS, ContextState>;\n }\n | {\n type: 'factory';\n factory: AiToolFactory<METADATA, PARTS, TOOLS, ContextState>;\n };\n isAgent: boolean;\n // Dynamic parameter support\n hasDynamicParams?: boolean;\n paramNames?: string[];\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,\n PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n ContextState extends Record<string, any> = {},\n> {\n private stack: Layer<KIT_METADATA, PARTS, TOOLS, any>[] = [];\n private actAsToolDefinitions: Map<\n string | RegExp,\n { description?: string; inputSchema: ZodObject<any> }\n > = new Map();\n private logger: AiLogger = console;\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, PARTS, TOOLS, any>[],\n options?: { maxCallDepth?: number; logger?: AiLogger }\n ) {\n this.logger = options?.logger ?? console;\n this.logger.log('AiAgentKit v3 initialized.');\n if (stack) {\n this.stack = stack;\n }\n if (options?.maxCallDepth) {\n this.options.maxCallDepth = options.maxCallDepth;\n }\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 MW_METADATA,\n MW_TOOLS extends UITools,\n MW_STATE extends Record<string, any>,\n >(\n agentPath:\n | string\n | RegExp\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>,\n ...agents: (\n | AiMiddleware<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n | AiRouter<MW_METADATA, PARTS, MW_TOOLS, ContextState & MW_STATE>\n )[]\n ): AiRouter<\n KIT_METADATA | MW_METADATA,\n PARTS,\n TOOLS & MW_TOOLS,\n ContextState & MW_STATE\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 mountPathArg: string | RegExp,\n handler:\n | AiMiddleware<KIT_METADATA, PARTS, TOOLS, ContextState>\n | AiRouter<any, any, any, any>\n ): this {\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 path: string | RegExp,\n options: {\n description?: string;\n inputSchema: ZodObject<any>;\n }\n ) {\n this.actAsToolDefinitions.set(path, options);\n this.logger.log(\n `[actAsTool] Added definition: ${path} -> ${JSON.stringify(options)}`\n );\n this.logger.log(\n `[actAsTool] Router now has ${this.actAsToolDefinitions.size} definitions`\n );\n return this;\n }\n\n // Overload for factory-based tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends 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 // Overload for static tools\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 // Implementation\n tool<\n TOOL_METADATA,\n TOOL_TOOLS extends UITools,\n TOOL_STATE extends Record<string, any>,\n TOOL_PARAMS extends 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.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> = 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 PARTS,\n TOOL_TOOLS,\n ContextState & TOOL_STATE\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 };\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>,\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 * 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, PARTS, TOOLS, ContextState>,\n options: {\n type: 'agent' | 'tool';\n path: string;\n messages?: UIMessage<KIT_METADATA, PARTS, TOOLS>[];\n params?: Record<string, any>;\n }\n ) {\n const parentDepth = parentCtx.executionContext.callDepth ?? 0;\n const newCallDepth = parentDepth + (options.type === 'agent' ? 1 : 0);\n\n const subContext: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> = {\n ...parentCtx,\n // Deep clone state and execution context to prevent race conditions.\n state: JSON.parse(JSON.stringify(parentCtx.state)),\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 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 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[]) => this.logger.log(fullPrefix, ...args),\n warn: (...args: any[]) => this.logger.warn(fullPrefix, ...args),\n error: (...args: any[]) => this.logger.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(layer: Layer<any, any, any, any>): 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, PARTS, TOOLS, ContextState>,\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<void> => {\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 await layer.handler(ctx, next);\n\n ctx.logger.log(`<- Finished ${layerType}: ${layerPath}`);\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 await dispatch(0);\n return;\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, PARTS, TOOLS, ContextState>,\n | 'state'\n | 'response'\n | 'next'\n | 'requestId'\n | 'logger'\n | 'executionContext'\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: 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 const ctx: AiContext<KIT_METADATA, PARTS, TOOLS, ContextState> & {\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 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 await self._execute(path, ctx);\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\nclass NextHandler<\n METADATA,\n PARTS extends UIDataTypes,\n TOOLS extends UITools,\n ContextState extends Record<string, any>,\n> {\n public maxCallDepth: number;\n\n constructor(\n private ctx: AiContext<METADATA, PARTS, TOOLS, ContextState>,\n private router: AiRouter<METADATA, PARTS, TOOLS, ContextState>,\n private onExecutionStart: () => void,\n private onExecutionEnd: () => void,\n parentNext?: NextHandler<METADATA, PARTS, TOOLS, ContextState>\n ) {\n this.maxCallDepth = this.router.options.maxCallDepth;\n }\n\n async callAgent(\n agentPath: string,\n params?: Record<string, any>,\n options?: ToolCallOptions\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,\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(`[callAgent] Error:`, error);\n return { ok: false, error };\n } finally {\n this.onExecutionEnd();\n }\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.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,\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 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 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?: Tool<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 return {\n ...definition,\n execute: async (params: any, options: any) => {\n const result = await this.callAgent(agentPath, params, options);\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n },\n } as Tool<INPUT, OUTPUT>;\n }\n}\n","import crypto from 'crypto'\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\n// It is best to make fewer, larger requests to the crypto module to\n// avoid system call overhead. So, random numbers are generated in a\n// pool. The pool is a Buffer that is larger than the initial random\n// request size by this multiplier. The pool is enlarged if subsequent\n// requests exceed the maximum buffer size.\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\n\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}\n\nlet random = bytes => {\n // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\n\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n // A compact alternative for `for (let i = 0; i < step; i++)`.\n let i = step\n while (i--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\n\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nlet nanoid = (size = 21) => {\n // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution\n fillPool((size |= 0))\n let id = ''\n // We are reading directly from the random pool to avoid creating new array\n for (let i = poolOffset - size; i < poolOffset; i++) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\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>(\n tool: {\n toolCallId?: string;\n toolName: K;\n inputTextDelta?: string[];\n input?: any;\n output?: any;\n } & Omit<TOOLS[K], 'toolCallId'>\n ) => {\n const 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 || tool.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 || tool.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 || tool.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 || tool.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 }) => {\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 usage: tool.result.usage,\n warnings: tool.result.warnings,\n finishReason: tool.result.finishReason,\n },\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"],"mappings":"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","names":["tool","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microfox/ai-router",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "A Router-based Framework built on top of ai-sdk to support Multi-Agentic Workflows.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "ai": "^5.0.0-alpha.15",
29
+ "ai": "5.0.0-alpha.15",
30
30
  "zod": "^3.24.3"
31
31
  },
32
32
  "devDependencies": {