zeitlich 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/task/tool.ts","../src/tools/task/handler.ts","../src/tools/bash/tool.ts","../src/tools/task-create/tool.ts","../src/lib/tool-router.ts","../src/lib/session.ts","../src/lib/types.ts","../src/lib/state-manager.ts","../src/tools/ask-user-question/tool.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read/tool.ts","../src/tools/write/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/handler.ts","../src/tools/task-get/tool.ts","../src/tools/task-get/handler.ts","../src/tools/task-list/tool.ts","../src/tools/task-list/handler.ts","../src/tools/task-update/tool.ts","../src/tools/task-update/handler.ts","../node_modules/uuid/dist/esm-node/stringify.js","../node_modules/uuid/dist/esm-node/rng.js","../node_modules/uuid/dist/esm-node/native.js","../node_modules/uuid/dist/esm-node/v4.js","../src/lib/thread-manager.ts","../src/activities.ts","../src/plugin.ts","../src/lib/model-invoker.ts","../src/tools/ask-user-question/handler.ts","../src/tools/glob/handler.ts","../src/tools/edit/handler.ts","../src/tools/bash/handler.ts","../src/lib/fs.ts"],"names":["z","workflowInfo","uuid4","executeChild","proxyActivities","results","defineQuery","setHandler","crypto","HumanMessage","AIMessage","ToolMessage","SystemMessage","mapStoredMessageToChatMessage","SimplePlugin","Context","messages","mapStoredMessagesToChatMessages","Bash","tab"],"mappings":"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","file":"index.cjs","sourcesContent":["import z from \"zod\";\nimport type { SubagentConfig } from \"../../lib/types\";\n\nconst TASK_TOOL = \"Task\" as const;\n\n/**\n * Builds the tool description with available subagent information\n */\nfunction buildTaskDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Launch a new agent to handle complex, multi-step tasks autonomously.\n\nThe ${TASK_TOOL} tool launches specialized agents (subprocesses) that autonomously handle complex tasks. Each agent type has specific capabilities and tools available to it.\n\nAvailable agent types:\n\n${subagentList}\n\nWhen using the ${TASK_TOOL} tool, you must specify a subagent parameter to select which agent type to use.\n\nUsage notes:\n\n- Always include a short description (3-5 words) summarizing what the agent will do\n- Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n- When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n- Each invocation starts fresh - provide a detailed task description with all necessary context.\n- Provide clear, detailed prompts so the agent can work autonomously and return exactly the information you need.\n- The agent's outputs should generally be trusted\n- Clearly tell the agent what type of work you expect since it is not aware of the user's intent\n- If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.`;\n}\n\n/**\n * Creates a Task tool configured with the available subagents.\n *\n * @param subagents - Array of subagent configurations (must have at least one)\n * @returns A tool definition with dynamic schema based on available subagents\n *\n * @example\n * const taskTool = createTaskTool([\n * {\n * name: \"researcher\",\n * description: \"Researches topics and gathers information\",\n * workflowType: \"researcherWorkflow\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * ]);\n */\nexport function createTaskTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n subagent: z.ZodEnum<Record<string, string>>;\n description: z.ZodString;\n prompt: z.ZodString;\n }>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createTaskTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.name);\n\n return {\n name: TASK_TOOL,\n description: buildTaskDescription(subagents),\n schema: z.object({\n subagent: z.enum(names).describe(\"The type of subagent to launch\"),\n description: z\n .string()\n .describe(\"A short (3-5 word) description of the task\"),\n prompt: z.string().describe(\"The task for the agent to perform\"),\n }),\n } as const;\n}\n\n/**\n * Infer the schema type for a task tool created with specific subagents\n */\nexport type TaskToolSchemaType<T extends SubagentConfig[]> = z.infer<\n ReturnType<typeof createTaskTool<T>>[\"schema\"]\n>;\n\n/**\n * Generic task tool schema type (when subagent names are not known at compile time)\n */\nexport type GenericTaskToolSchemaType = {\n subagent: string;\n description: string;\n prompt: string;\n};\n","import { executeChild, workflowInfo, uuid4 } from \"@temporalio/workflow\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { SubagentConfig, SubagentInput } from \"../../lib/types\";\nimport type { GenericTaskToolSchemaType } from \"./tool\";\n\n/**\n * Result from a task handler execution\n */\nexport interface TaskHandlerResult<TResult = unknown> {\n /** The validated result from the child workflow */\n result: TResult;\n /** The child workflow ID (for reference/debugging) */\n childWorkflowId: string;\n}\n\n/**\n * Creates a Task tool handler that spawns child workflows for configured subagents.\n *\n * @param subagents - Array of subagent configurations\n * @returns A tool handler function that can be used with the tool router\n *\n * @example\n * const taskHandler = taskHandler([\n * {\n * name: \"researcher\",\n * description: \"Researches topics\",\n * workflowType: \"researcherWorkflow\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * ]);\n */\nexport function createTaskHandler(subagents: SubagentConfig[]) {\n const { workflowId: parentWorkflowId, taskQueue: parentTaskQueue } =\n workflowInfo();\n\n return async (\n args: GenericTaskToolSchemaType\n ): Promise<ToolHandlerResponse<TaskHandlerResult>> => {\n const config = subagents.find((s) => s.name === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.name).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${parentWorkflowId}-${args.subagent}-${uuid4()}`;\n\n // Execute the child workflow\n const childResult = await executeChild(config.workflowType, {\n workflowId: childWorkflowId,\n args: [{ prompt: args.prompt } satisfies SubagentInput],\n taskQueue: config.taskQueue ?? parentTaskQueue,\n });\n\n // Validate result if schema provided, otherwise pass through as-is\n const validated = config.resultSchema\n ? config.resultSchema.parse(childResult)\n : childResult;\n\n // Format content - stringify objects, pass strings through\n const content =\n typeof validated === \"string\"\n ? validated\n : JSON.stringify(validated, null, 2);\n\n return {\n content,\n result: {\n result: validated,\n childWorkflowId,\n },\n };\n };\n}\n","import z from \"zod\";\n\nexport const createBashToolDescription = ({\n fileTree,\n}: {\n fileTree: string;\n}): string => `tool to execute bash commands, the file tree is: ${fileTree}`;\n\nexport const bashTool = {\n name: \"Bash\" as const,\n description: \"tool to execute bash commands\",\n schema: z.object({\n command: z\n .string()\n .describe(\"stringified command to be executed inside the Bash\"),\n }),\n strict: true,\n};\n\nexport type bashToolSchemaType = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list for the control test. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n It also helps the user understand the progress of the task and overall progress of their requests.\n \n ## When to Use This Tool\n \n Use this tool proactively in these scenarios:\n \n - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n - User explicitly requests todo list - When the user directly asks you to use the todo list\n - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n - After receiving new instructions - Immediately capture user requirements as tasks\n - When you start working on a task - Mark it as in_progress BEFORE beginning work\n - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n \n ## When NOT to Use This Tool\n \n Skip using this tool when:\n - There is only a single, straightforward task\n - The task is trivial and tracking it provides no organizational benefit\n - The task can be completed in less than 3 trivial steps\n - The task is purely conversational or informational\n \n NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n \n ## Task Fields\n \n - **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n - **description**: Detailed description of what needs to be done, including context and acceptance criteria\n - **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n \n **IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n \n ## Tips\n \n - Create tasks with clear, specific subjects that describe the outcome\n - Include enough detail in the description for another agent to understand and complete the task\n - After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n - Check TaskList first to avoid creating duplicate tasks`,\n schema: z.object({\n subject: z\n .string()\n .describe(\n 'A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")'\n ),\n description: z\n .string()\n .describe(\n \"Detailed description of what needs to be done, including context and acceptance criteria\"\n ),\n activeForm: z\n .string()\n .describe(\n 'Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.'\n ),\n metadata: z\n .record(z.string(), z.string())\n .describe(\"Arbitrary key-value pairs for tracking\"),\n }),\n};\n\nexport type TaskCreateToolSchemaType = z.infer<typeof taskCreateTool.schema>;\n","import type { MessageToolDefinition } from \"@langchain/core/messages\";\nimport type { ToolMessageContent } from \"./thread-manager\";\nimport type { Hooks, SubagentConfig, ToolResultConfig } from \"./types\";\n\nimport type { z } from \"zod\";\nimport { proxyActivities } from \"@temporalio/workflow\";\nimport type { ZeitlichSharedActivities } from \"../activities\";\nimport { createTaskTool } from \"../tools/task/tool\";\nimport { createTaskHandler } from \"../tools/task/handler\";\nimport type { createTaskCreateHandler } from \"../tools/task-create/handler\";\nimport { bashTool, createBashToolDescription } from \"../tools/bash/tool\";\nimport { taskCreateTool } from \"../tools/task-create/tool\";\nimport type { handleBashTool } from \"../tools/bash/handler\";\n\nexport type { ToolMessageContent };\n\n// ============================================================================\n// Tool Definition Types (merged from tool-registry.ts)\n// ============================================================================\n\n/**\n * A tool definition with a name, description, and Zod schema for arguments.\n * Does not include a handler - use ToolWithHandler for tools with handlers.\n */\nexport interface ToolDefinition<\n TName extends string = string,\n TSchema extends z.ZodType = z.ZodType,\n> {\n name: TName;\n description: string;\n schema: TSchema;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * A tool definition with an integrated handler function.\n * This is the primary type for defining tools in the router.\n */\nexport interface ToolWithHandler<\n TName extends string = string,\n TSchema extends z.ZodType = z.ZodType,\n TResult = unknown,\n TContext = ToolHandlerContext,\n> {\n name: TName;\n description: string;\n schema: TSchema;\n handler: ToolHandler<z.infer<TSchema>, TResult, TContext>;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * A map of tool keys to tool definitions with handlers.\n */\nexport type ToolMap = Record<\n string,\n {\n name: string;\n description: string;\n schema: z.ZodType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n handler: (\n args: any,\n context: any\n ) => ToolHandlerResponse<any> | Promise<ToolHandlerResponse<any>>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n strict?: boolean;\n max_uses?: number;\n }\n>;\n\n/**\n * Converts a ToolMap to MessageStructure-compatible tools type.\n * Maps each tool's name to a MessageToolDefinition with inferred input type from the schema.\n */\nexport type ToolMapToMessageTools<T extends ToolMap> = {\n [K in keyof T as T[K][\"name\"]]: MessageToolDefinition<\n z.infer<T[K][\"schema\"]>\n >;\n};\n\n/**\n * Extract the tool names from a tool map (uses the tool's name property, not the key).\n */\nexport type ToolNames<T extends ToolMap> = T[keyof T][\"name\"];\n\n/**\n * A raw tool call as received from the LLM before parsing.\n */\nexport interface RawToolCall {\n id?: string;\n name: string;\n args: unknown;\n}\n\n/**\n * A parsed tool call with validated arguments for a specific tool.\n */\nexport interface ParsedToolCall<\n TName extends string = string,\n TArgs = unknown,\n> {\n id: string;\n name: TName;\n args: TArgs;\n}\n\n/**\n * Union type of all possible parsed tool calls from a tool map.\n */\nexport type ParsedToolCallUnion<T extends ToolMap> = {\n [K in keyof T]: ParsedToolCall<T[K][\"name\"], z.infer<T[K][\"schema\"]>>;\n}[keyof T];\n\n// ============================================================================\n// Handler Types\n// ============================================================================\n\n/**\n * Function signature for appending tool results to a thread.\n */\nexport type AppendToolResultFn = (config: ToolResultConfig) => Promise<void>;\n\n/**\n * The response from a tool handler.\n * Contains the content for the tool message and the result to return from processToolCalls.\n */\nexport interface ToolHandlerResponse<TResult> {\n /** Content for the tool message added to the thread */\n content: ToolMessageContent;\n /** Result returned from processToolCalls */\n result: TResult;\n}\n\n/**\n * Context passed to tool handlers for additional data beyond tool args.\n * Use this to pass workflow state like file trees, user context, etc.\n */\nexport interface ToolHandlerContext {\n /** Additional context data - define your own shape */\n [key: string]: unknown;\n}\n\nexport interface BuildInToolDefinitions {\n [bashTool.name]: typeof bashTool & {\n handler: ReturnType<typeof handleBashTool>;\n };\n [taskCreateTool.name]: typeof taskCreateTool & {\n handler: ReturnType<typeof createTaskCreateHandler>;\n };\n}\n\nexport const buildIntoolDefinitions: Record<\n keyof BuildInToolDefinitions,\n ToolDefinition\n> = {\n [bashTool.name]: bashTool,\n [taskCreateTool.name]: taskCreateTool,\n};\n\n/**\n * A handler function for a specific tool.\n * Receives the parsed args and context, returns a response with content and result.\n * Context always has a value (defaults to empty object if not provided).\n */\nexport type ToolHandler<TArgs, TResult, TContext = ToolHandlerContext> = (\n args: TArgs,\n context: TContext\n) => ToolHandlerResponse<TResult> | Promise<ToolHandlerResponse<TResult>>;\n\n/**\n * Activity-compatible tool handler that always returns a Promise.\n * Use this for tool handlers registered as Temporal activities.\n * Context always has a value (defaults to empty object if not provided).\n *\n * @example\n * ```typescript\n * // Filesystem handler with context\n * const readHandler: ActivityToolHandler<\n * ReadToolSchemaType,\n * ReadResult,\n * { scopedNodes: FileNode[]; provider: FileSystemProvider }\n * > = async (args, context) => {\n * return readHandler(args, context.scopedNodes, context.provider);\n * };\n * ```\n */\nexport type ActivityToolHandler<\n TArgs,\n TResult,\n TContext = ToolHandlerContext,\n> = (args: TArgs, context: TContext) => Promise<ToolHandlerResponse<TResult>>;\n\n/**\n * Extract the args type for a specific tool name from a tool map.\n */\nexport type ToolArgs<T extends ToolMap, TName extends ToolNames<T>> = z.infer<\n Extract<T[keyof T], { name: TName }>[\"schema\"]\n>;\n\n/**\n * Extract the result type for a specific tool name from a tool map.\n */\nexport type ToolResult<T extends ToolMap, TName extends ToolNames<T>> =\n Extract<T[keyof T], { name: TName }>[\"handler\"] extends ToolHandler<\n unknown,\n infer R,\n unknown\n >\n ? Awaited<R>\n : never;\n\n// ============================================================================\n// Tool Call Result Types\n// ============================================================================\n\n/**\n * The result of processing a tool call.\n */\nexport interface ToolCallResult<\n TName extends string = string,\n TResult = unknown,\n> {\n toolCallId: string;\n name: TName;\n result: TResult;\n}\n\n/**\n * Options for creating a tool router.\n */\nexport interface ToolRouterOptions<T extends ToolMap> {\n /** File tree for the agent */\n fileTree: string;\n /** Map of tools with their handlers */\n tools: T;\n /** Thread ID for appending tool results */\n threadId: string;\n /** Function to append tool results to the thread (called automatically after each handler) */\n appendToolResult: AppendToolResultFn;\n /** Whether to process tools in parallel (default: true) */\n parallel?: boolean;\n /** Lifecycle hooks for tool execution */\n hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>>;\n /** Subagent configurations */\n subagents?: SubagentConfig[];\n /** Build in tools - accepts raw handlers or proxied activities */\n buildInTools?: {\n [K in keyof BuildInToolDefinitions]?: BuildInToolDefinitions[K][\"handler\"];\n };\n}\n\n/**\n * Infer result types from a tool map based on handler return types.\n */\nexport type InferToolResults<T extends ToolMap> = {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n [K in keyof T as T[K][\"name\"]]: T[K][\"handler\"] extends ToolHandler<\n any,\n infer R,\n any\n >\n ? /* eslint-enable @typescript-eslint/no-explicit-any */\n Awaited<R>\n : never;\n};\n\n/**\n * Union of all possible tool call results based on handler return types.\n */\nexport type ToolCallResultUnion<TResults extends Record<string, unknown>> = {\n [TName in keyof TResults & string]: ToolCallResult<TName, TResults[TName]>;\n}[keyof TResults & string];\n\n/**\n * Context passed to processToolCalls for hook execution and handler invocation\n */\nexport interface ProcessToolCallsContext<THandlerContext = ToolHandlerContext> {\n /** Current turn number (for hooks) */\n turn?: number;\n /** Context passed to each tool handler (scopedNodes, provider, etc.) */\n handlerContext?: THandlerContext;\n}\n\n// ============================================================================\n// Router Interface\n// ============================================================================\n\n/**\n * The tool router interface with full type inference for both args and results.\n */\nexport interface ToolRouter<T extends ToolMap> {\n /** Check if the router has any tools */\n hasTools(): boolean;\n // --- Methods from registry ---\n\n /**\n * Parse and validate a raw tool call against the router's tools.\n * Returns a typed tool call with validated arguments.\n */\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T>;\n\n /**\n * Check if a tool with the given name exists in the router.\n */\n hasTool(name: string): boolean;\n\n /**\n * Get all tool names in the router.\n */\n getToolNames(): ToolNames<T>[];\n\n /**\n * Get all tool definitions (without handlers) for passing to LLM.\n */\n getToolDefinitions(): ToolDefinition[];\n\n // --- Methods for processing tool calls ---\n\n /**\n * Process all tool calls using the registered handlers.\n * Returns typed results based on handler return types.\n * @param toolCalls - Array of parsed tool calls to process\n * @param context - Optional context including turn number for hooks\n */\n processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResultUnion<InferToolResults<T>>[]>;\n\n /**\n * Process tool calls matching a specific name with a custom handler.\n * Useful for overriding the default handler for specific cases.\n */\n processToolCallsByName<\n TName extends ToolNames<T>,\n TResult,\n TContext = ToolHandlerContext,\n >(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult, TContext>,\n context?: ProcessToolCallsContext<TContext>\n ): Promise<ToolCallResult<TName, TResult>[]>;\n\n // --- Utility methods ---\n\n /**\n * Filter tool calls by name.\n */\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[];\n\n /**\n * Check if any tool call matches the given name.\n */\n hasToolCall(toolCalls: ParsedToolCallUnion<T>[], name: ToolNames<T>): boolean;\n\n /**\n * Filter results by tool name.\n */\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<InferToolResults<T>>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[];\n}\n\n// ============================================================================\n// Router Factory\n// ============================================================================\n\n/**\n * Creates a tool router for declarative tool call processing.\n * Combines tool definitions with handlers in a single API.\n *\n * @example\n * ```typescript\n * const router = createToolRouter({\n * threadId,\n * tools: {\n * Read: {\n * name: \"FileRead\",\n * description: \"Read file contents\",\n * schema: z.object({ path: z.string() }),\n * handler: async (args, ctx) => ({\n * content: `Read ${args.path}`,\n * result: { path: args.path, content: \"...\" },\n * }),\n * },\n * },\n * hooks: { onPreToolUse, onPostToolUse },\n * });\n *\n * // Parse raw tool calls from LLM\n * const parsed = router.parseToolCall(rawToolCall);\n *\n * // Process tool calls\n * const results = await router.processToolCalls([parsed]);\n * ```\n */\nexport function createToolRouter<T extends ToolMap>(\n options: ToolRouterOptions<T>\n): ToolRouter<T> {\n const { appendToolResult } = proxyActivities<ZeitlichSharedActivities>({\n startToCloseTimeout: \"2m\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n });\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\n // Use ToolMap's value type to allow both user tools and the dynamic Task tool\n const toolMap = new Map<string, ToolMap[string]>();\n for (const [_key, tool] of Object.entries(options.tools)) {\n toolMap.set(tool.name, tool as T[keyof T]);\n }\n\n if (options.subagents) {\n toolMap.set(\"Task\", {\n ...createTaskTool(options.subagents),\n handler: createTaskHandler(options.subagents),\n });\n }\n\n if (options.buildInTools) {\n for (const [key, value] of Object.entries(options.buildInTools)) {\n if (key === bashTool.name) {\n toolMap.set(key, {\n ...buildIntoolDefinitions[key as keyof BuildInToolDefinitions],\n description: createBashToolDescription({\n fileTree: options.fileTree,\n }),\n handler: value,\n });\n } else {\n toolMap.set(key, {\n ...buildIntoolDefinitions[key as keyof BuildInToolDefinitions],\n handler: value,\n });\n }\n }\n }\n\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n handlerContext?: ToolHandlerContext\n ): Promise<ToolCallResultUnion<TResults> | null> {\n const startTime = Date.now();\n\n // PreToolUse hook - can skip or modify args\n let effectiveArgs: unknown = toolCall.args;\n if (options.hooks?.onPreToolUse) {\n const preResult = await options.hooks.onPreToolUse({\n toolCall,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) {\n // Skip this tool call - append a skip message and return null\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return null;\n }\n if (preResult?.modifiedArgs !== undefined) {\n effectiveArgs = preResult.modifiedArgs;\n }\n }\n\n const tool = toolMap.get(toolCall.name);\n let result: unknown;\n let content: ToolMessageContent;\n\n try {\n if (tool) {\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n (handlerContext ?? {}) as Parameters<typeof tool.handler>[1]\n );\n result = response.result;\n content = response.content;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n // PostToolUseFailure hook - can recover from errors\n if (options.hooks?.onPostToolUseFailure) {\n const failureResult = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: error instanceof Error ? error : new Error(String(error)),\n threadId: options.threadId,\n turn,\n });\n if (failureResult?.fallbackContent !== undefined) {\n content = failureResult.fallbackContent;\n result = { error: String(error), recovered: true };\n } else if (failureResult?.suppress) {\n content = JSON.stringify({ error: String(error), suppressed: true });\n result = { error: String(error), suppressed: true };\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n\n // Automatically append tool result to thread\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content,\n });\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n result,\n } as ToolCallResultUnion<TResults>;\n\n // PostToolUse hook - called after successful execution\n if (options.hooks?.onPostToolUse) {\n const durationMs = Date.now() - startTime;\n await options.hooks.onPostToolUse({\n toolCall,\n result: toolResult,\n threadId: options.threadId,\n turn,\n durationMs,\n });\n }\n\n return toolResult;\n }\n\n return {\n // --- Methods from registry ---\n\n hasTools(): boolean {\n return toolMap.size > 0;\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n // Parse and validate args using the tool's schema\n const parsedArgs = tool.schema.parse(toolCall.args);\n\n return {\n id: toolCall.id ?? \"\",\n name: toolCall.name,\n args: parsedArgs,\n } as ParsedToolCallUnion<T>;\n },\n\n hasTool(name: string): boolean {\n return toolMap.has(name);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.keys()) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap).map(([name, tool]) => ({\n name,\n description: tool.description,\n schema: tool.schema,\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n // --- Methods for processing tool calls ---\n\n async processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResultUnion<TResults>[]> {\n if (toolCalls.length === 0) {\n return [];\n }\n\n const turn = context?.turn ?? 0;\n const handlerContext = context?.handlerContext;\n\n if (options.parallel) {\n const results = await Promise.all(\n toolCalls.map((tc) => processToolCall(tc, turn, handlerContext))\n );\n // Filter out null results (skipped tool calls)\n return results.filter(\n (r): r is NonNullable<typeof r> => r !== null\n ) as ToolCallResultUnion<TResults>[];\n }\n\n // Sequential processing\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const result = await processToolCall(toolCall, turn, handlerContext);\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n },\n\n async processToolCallsByName<\n TName extends ToolNames<T>,\n TResult,\n TContext = ToolHandlerContext,\n >(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult, TContext>,\n context?: ProcessToolCallsContext<TContext>\n ): Promise<ToolCallResult<TName, TResult>[]> {\n const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);\n\n if (matchingCalls.length === 0) {\n return [];\n }\n\n const handlerContext = (context?.handlerContext ?? {}) as TContext;\n\n const processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n handlerContext\n );\n\n // Automatically append tool result to thread\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content: response.content,\n });\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n result: response.result,\n };\n };\n\n if (options.parallel) {\n return Promise.all(matchingCalls.map(processOne));\n }\n\n const results: ToolCallResult<TName, TResult>[] = [];\n for (const toolCall of matchingCalls) {\n results.push(await processOne(toolCall));\n }\n return results;\n },\n\n // --- Utility methods ---\n\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[] {\n return toolCalls.filter(\n (tc): tc is ParsedToolCall<TName, ToolArgs<T, TName>> =>\n tc.name === name\n );\n },\n\n hasToolCall(\n toolCalls: ParsedToolCallUnion<T>[],\n name: ToolNames<T>\n ): boolean {\n return toolCalls.some((tc) => tc.name === name);\n },\n\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<TResults>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[] {\n return results.filter((r) => r.name === name) as ToolCallResult<\n TName,\n ToolResult<T, TName>\n >[];\n },\n };\n}\n\n/**\n * Utility to check if there were no tool calls besides a specific one\n */\nexport function hasNoOtherToolCalls<T extends ToolMap>(\n toolCalls: ParsedToolCallUnion<T>[],\n excludeName: ToolNames<T>\n): boolean {\n return toolCalls.filter((tc) => tc.name !== excludeName).length === 0;\n}\n","import { proxyActivities } from \"@temporalio/workflow\";\nimport type { ZeitlichSharedActivities } from \"../activities\";\nimport type {\n ZeitlichAgentConfig,\n SessionStartHook,\n SessionEndHook,\n SessionExitReason,\n SubagentConfig,\n} from \"./types\";\nimport { type AgentStateManager, type JsonSerializable } from \"./state-manager\";\nimport {\n createToolRouter,\n type ParsedToolCall,\n type ParsedToolCallUnion,\n type RawToolCall,\n type ToolMap,\n} from \"./tool-router\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport { createTaskTool, type TaskToolSchemaType } from \"../tools/task/tool\";\n\nexport interface ZeitlichSession {\n runSession<T extends JsonSerializable<T>>(args: {\n stateManager: AgentStateManager<T>;\n }): Promise<StoredMessage | null>;\n}\n\nasync function resolvePrompt(\n prompt: string | (() => string | Promise<string>)\n): Promise<string> {\n if (typeof prompt === \"function\") {\n return prompt();\n }\n return prompt;\n}\n\n/**\n * Session-level hooks for lifecycle events\n */\nexport interface SessionLifecycleHooks {\n /** Called when session starts */\n onSessionStart?: SessionStartHook;\n /** Called when session ends */\n onSessionEnd?: SessionEndHook;\n}\n\nexport const createSession = async <T extends ToolMap>({\n threadId,\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n baseSystemPrompt,\n instructionsPrompt,\n buildContextMessage,\n buildFileTree = async (): Promise<string> => \"\",\n subagents,\n tools = {} as T,\n processToolsInParallel = true,\n buildInTools = {},\n hooks = {},\n}: ZeitlichAgentConfig<T>): Promise<ZeitlichSession> => {\n const {\n initializeThread,\n appendHumanMessage,\n parseToolCalls,\n appendToolResult,\n appendSystemMessage,\n } = proxyActivities<ZeitlichSharedActivities>({\n startToCloseTimeout: \"30m\",\n retry: {\n maximumAttempts: 6,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n heartbeatTimeout: \"5m\",\n });\n\n const fileTree = await buildFileTree();\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n hooks,\n buildInTools,\n fileTree,\n subagents,\n parallel: processToolsInParallel,\n });\n\n // Helper to call session end hook\n const callSessionEnd = async (\n exitReason: SessionExitReason,\n turns: number\n ): Promise<void> => {\n if (hooks.onSessionEnd) {\n await hooks.onSessionEnd({\n threadId,\n agentName,\n exitReason,\n turns,\n metadata,\n });\n }\n };\n\n return {\n runSession: async ({ stateManager }): Promise<StoredMessage | null> => {\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n\n stateManager.setTools(toolRouter.getToolDefinitions());\n\n await initializeThread(threadId);\n await appendSystemMessage(\n threadId,\n [\n await resolvePrompt(baseSystemPrompt),\n await resolvePrompt(instructionsPrompt),\n ].join(\"\\n\")\n );\n await appendHumanMessage(threadId, await buildContextMessage());\n\n let exitReason: SessionExitReason = \"completed\";\n\n try {\n while (\n stateManager.isRunning() &&\n !stateManager.isTerminal() &&\n stateManager.getTurns() < maxTurns\n ) {\n stateManager.incrementTurns();\n const currentTurn = stateManager.getTurns();\n\n const { message, stopReason } = await runAgent({\n threadId,\n agentName,\n metadata,\n });\n\n if (stopReason === \"end_turn\") {\n stateManager.complete();\n exitReason = \"completed\";\n return message;\n }\n\n // No tools configured - treat any non-end_turn as completed\n if (!toolRouter.hasTools()) {\n stateManager.complete();\n exitReason = \"completed\";\n return message;\n }\n\n const rawToolCalls: RawToolCall[] = await parseToolCalls(message);\n const parsedToolCalls = rawToolCalls\n .filter((tc: RawToolCall) => tc.name !== \"Task\")\n .map((tc: RawToolCall) => toolRouter.parseToolCall(tc));\n const taskToolCalls =\n subagents && subagents.length > 0\n ? rawToolCalls\n .filter((tc: RawToolCall) => tc.name === \"Task\")\n .map((tc: RawToolCall) => {\n // Parse and validate args using the tool's schema\n const parsedArgs = createTaskTool(subagents).schema.parse(\n tc.args\n );\n\n return {\n id: tc.id ?? \"\",\n name: tc.name,\n args: parsedArgs,\n } as ParsedToolCall<\n \"Task\",\n TaskToolSchemaType<SubagentConfig[]>\n >;\n })\n : [];\n\n // Hooks can call stateManager.waitForInput() to pause the session\n await toolRouter.processToolCalls(\n [...parsedToolCalls, ...taskToolCalls] as ParsedToolCallUnion<\n T & { Task: TaskToolSchemaType<SubagentConfig[]> }\n >[],\n {\n turn: currentTurn,\n }\n );\n\n if (stateManager.getStatus() === \"WAITING_FOR_INPUT\") {\n exitReason = \"waiting_for_input\";\n break;\n }\n }\n\n // Check if we hit max turns\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n }\n } catch (error) {\n exitReason = \"failed\";\n throw error;\n } finally {\n // SessionEnd hook - always called\n await callSessionEnd(exitReason, stateManager.getTurns());\n }\n\n return null;\n },\n };\n};\n","import type { ToolMessageContent } from \"./thread-manager\";\nimport type {\n BuildInToolDefinitions,\n InferToolResults,\n ParsedToolCallUnion,\n ToolCallResultUnion,\n ToolDefinition,\n ToolMap,\n} from \"./tool-router\";\n\nimport type { MessageContent, StoredMessage } from \"@langchain/core/messages\";\nimport type { z } from \"zod\";\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"RUNNING\"\n | \"WAITING_FOR_INPUT\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\n/**\n * Base state that all agents must have\n */\nexport interface BaseAgentState {\n tools: ToolDefinition[];\n status: AgentStatus;\n version: number;\n turns: number;\n tasks: Map<string, WorkflowTask>;\n}\n\n/**\n * File representation for agent workflows\n */\nexport interface AgentFile {\n /** Database/S3 file ID */\n id: string;\n /** Virtual path for agent (e.g., \"evidence/invoice.pdf\") */\n path: string;\n /** Original filename */\n filename: string;\n /** Generic description for prompt */\n description?: string;\n /** MIME type of the file */\n mimeType?: string;\n}\n\n/**\n * Agent response from LLM invocation\n */\nexport interface AgentResponse {\n message: StoredMessage;\n stopReason: string | null;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n };\n}\n\n/**\n * Configuration for a Zeitlich agent session\n */\nexport interface ZeitlichAgentConfig<T extends ToolMap> {\n buildFileTree?: () => Promise<string>;\n threadId: string;\n agentName: string;\n metadata?: Record<string, unknown>;\n maxTurns?: number;\n /** Workflow-specific runAgent activity (with tools pre-bound) */\n runAgent: RunAgentActivity;\n /** Tool router for processing tool calls (optional if agent has no tools) */\n tools?: T;\n /** Subagent configurations */\n subagents?: SubagentConfig[];\n /** Session lifecycle hooks */\n hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>>;\n /** Whether to process tools in parallel */\n processToolsInParallel?: boolean;\n /**\n * Base system prompt (e.g., Auditron identity).\n * Can be a static string or async function.\n */\n baseSystemPrompt: string | (() => string | Promise<string>);\n /**\n * Agent-specific instructions prompt.\n * Can be a static string or async function.\n */\n instructionsPrompt: string | (() => string | Promise<string>);\n /**\n * Build context message content from agent-specific context.\n * Returns MessageContent array for the initial HumanMessage.\n */\n buildContextMessage: () => MessageContent | Promise<MessageContent>;\n /**\n * Build in tools - accepts raw handlers or proxied activities\n */\n buildInTools?: {\n [K in keyof BuildInToolDefinitions]?: BuildInToolDefinitions[K][\"handler\"];\n };\n}\n\n/**\n * Configuration passed to runAgent activity\n */\nexport interface RunAgentConfig {\n threadId: string;\n agentName: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Type signature for workflow-specific runAgent activity\n */\nexport type RunAgentActivity = (\n config: RunAgentConfig\n) => Promise<AgentResponse>;\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n toolCallId: string;\n /** Content for the tool message (string or complex content parts) */\n content: ToolMessageContent;\n}\n\n// ============================================================================\n// Subagent Configuration\n// ============================================================================\n\n/**\n * Configuration for a subagent that can be spawned by the parent workflow.\n *\n * @template TResult - Zod schema type for validating the child workflow's result\n */\nexport interface SubagentConfig<TResult extends z.ZodType = z.ZodType> {\n /** Identifier used in Task tool's subagent parameter */\n name: string;\n /** Description shown to the parent agent explaining what this subagent does */\n description: string;\n /** Temporal workflow type name (used with executeChild) */\n workflowType: string;\n /** Optional task queue - defaults to parent's queue if not specified */\n taskQueue?: string;\n /** Optional Zod schema to validate the child workflow's result. If omitted, result is passed through as-is. */\n resultSchema?: TResult;\n}\n\n/**\n * Input passed to child workflows when spawned as subagents\n */\nexport interface SubagentInput {\n /** The prompt/task from the parent agent */\n prompt: string;\n}\n\n// ============================================================================\n// Workflow Tasks\n// ============================================================================\n\n/**\n * Status of a workflow task\n */\nexport type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A task managed within a workflow for tracking work items\n */\nexport interface WorkflowTask {\n /** Unique task identifier */\n id: string;\n /** Brief, actionable title in imperative form */\n subject: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Present continuous form shown in spinner when in_progress */\n activeForm: string;\n /** Current status of the task */\n status: TaskStatus;\n /** Arbitrary key-value pairs for tracking */\n metadata: Record<string, string>;\n /** IDs of tasks that must complete before this one can start */\n blockedBy: string[];\n /** IDs of tasks that are waiting for this one to complete */\n blocks: string[];\n}\n\n// ============================================================================\n// Session Lifecycle Hooks\n// ============================================================================\n\n/**\n * Exit reasons for session termination\n */\nexport type SessionExitReason =\n | \"completed\"\n | \"max_turns\"\n | \"waiting_for_input\"\n | \"failed\"\n | \"cancelled\";\n\n/**\n * Context for PreToolUse hook - called before tool execution\n */\nexport interface PreToolUseHookContext<T extends ToolMap> {\n /** The tool call about to be executed */\n toolCall: ParsedToolCallUnion<T>;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n}\n\n/**\n * Result from PreToolUse hook - can block or modify execution\n */\nexport interface PreToolUseHookResult {\n /** Skip this tool call entirely */\n skip?: boolean;\n /** Modified args to use instead (must match schema) */\n modifiedArgs?: unknown;\n}\n\n/**\n * PreToolUse hook - called before tool execution, can block or modify\n */\nexport type PreToolUseHook<T extends ToolMap> = (\n ctx: PreToolUseHookContext<T>\n) => PreToolUseHookResult | Promise<PreToolUseHookResult>;\n\n/**\n * Context for PostToolUse hook - called after successful tool execution\n */\nexport interface PostToolUseHookContext<T extends ToolMap, TResult = unknown> {\n /** The tool call that was executed */\n toolCall: ParsedToolCallUnion<T>;\n /** The result from the tool handler */\n result: TResult;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * PostToolUse hook - called after successful tool execution\n */\nexport type PostToolUseHook<T extends ToolMap, TResult = unknown> = (\n ctx: PostToolUseHookContext<T, TResult>\n) => void | Promise<void>;\n\n/**\n * Context for PostToolUseFailure hook - called when tool execution fails\n */\nexport interface PostToolUseFailureHookContext<T extends ToolMap> {\n /** The tool call that failed */\n toolCall: ParsedToolCallUnion<T>;\n /** The error that occurred */\n error: Error;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n}\n\n/**\n * Result from PostToolUseFailure hook - can recover from errors\n */\nexport interface PostToolUseFailureHookResult {\n /** Provide a fallback result instead of throwing */\n fallbackContent?: ToolMessageContent;\n /** Whether to suppress the error (still logs, but continues) */\n suppress?: boolean;\n}\n\n/**\n * PostToolUseFailure hook - called when tool execution fails\n */\nexport type PostToolUseFailureHook<T extends ToolMap> = (\n ctx: PostToolUseFailureHookContext<T>\n) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;\n\n/**\n * Context for SessionStart hook - called when session begins\n */\nexport interface SessionStartHookContext {\n /** Thread identifier */\n threadId: string;\n /** Name of the agent */\n agentName: string;\n /** Session metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * SessionStart hook - called when session begins\n */\nexport type SessionStartHook = (\n ctx: SessionStartHookContext\n) => void | Promise<void>;\n\n/**\n * Context for SessionEnd hook - called when session ends\n */\nexport interface SessionEndHookContext {\n /** Thread identifier */\n threadId: string;\n /** Name of the agent */\n agentName: string;\n /** Reason the session ended */\n exitReason: SessionExitReason;\n /** Total turns executed */\n turns: number;\n /** Session metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * SessionEnd hook - called when session ends\n */\nexport type SessionEndHook = (\n ctx: SessionEndHookContext\n) => void | Promise<void>;\n\n/**\n * Combined hooks interface for session lifecycle\n */\nexport interface Hooks<T extends ToolMap, TResult = unknown> {\n /** Called before each tool execution - can block or modify */\n onPreToolUse?: PreToolUseHook<T>;\n /** Called after each successful tool execution */\n onPostToolUse?: PostToolUseHook<T, TResult>;\n /** Called when tool execution fails */\n onPostToolUseFailure?: PostToolUseFailureHook<T>;\n /** Called when session starts */\n onSessionStart?: SessionStartHook;\n /** Called when session ends */\n onSessionEnd?: SessionEndHook;\n}\n\n/**\n * Helper to check if status is terminal\n */\nexport function isTerminalStatus(status: AgentStatus): boolean {\n return (\n status === \"COMPLETED\" || status === \"FAILED\" || status === \"CANCELLED\"\n );\n}\n","import { defineQuery, setHandler } from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"./types\";\nimport type { ToolDefinition } from \"./tool-router\";\n\n/**\n * JSON primitive types that Temporal can serialize\n */\nexport type JsonPrimitive = string | number | boolean | null | undefined;\n\n/**\n * JSON-serializable value (recursive type for Temporal compatibility)\n */\nexport type JsonValue =\n | JsonPrimitive\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/**\n * Type constraint ensuring T only contains JSON-serializable values.\n * Use this for custom state to ensure Temporal workflow compatibility.\n *\n * Allows: primitives, arrays, plain objects, and JsonValue\n * Rejects: functions, symbols, undefined, class instances with methods\n */\nexport type JsonSerializable<T> = {\n [K in keyof T]: T[K] extends JsonValue\n ? T[K]\n : T[K] extends JsonPrimitive\n ? T[K]\n : T[K] extends (infer U)[]\n ? U extends JsonValue\n ? T[K]\n : JsonSerializable<U>[]\n : T[K] extends object\n ? JsonSerializable<T[K]>\n : never;\n};\n\n/**\n * Full state type combining base state with custom state\n */\nexport type AgentState<TCustom extends JsonSerializable<TCustom>> =\n BaseAgentState & TCustom;\n\n/**\n * Agent state manager interface\n * Note: Temporal handlers must be set up in the workflow file due to\n * Temporal's workflow isolation requirements. This manager provides\n * the state and helpers needed for those handlers.\n */\nexport interface AgentStateManager<TCustom extends JsonSerializable<TCustom>> {\n /** Get current status */\n getStatus(): AgentStatus;\n /** Check if agent is running */\n isRunning(): boolean;\n /** Check if agent is in terminal state */\n isTerminal(): boolean;\n /** Get current state version */\n getVersion(): number;\n\n /** Set status to RUNNING */\n run(): void;\n /** Set status to WAITING_FOR_INPUT */\n waitForInput(): void;\n /** Set status to COMPLETED */\n complete(): void;\n /** Set status to FAILED */\n fail(): void;\n /** Set status to CANCELLED */\n cancel(): void;\n\n /** Increment state version (call after state changes) */\n incrementVersion(): void;\n\n /** Increment turns (call after each turn) */\n incrementTurns(): void;\n\n /** Get current turns */\n getTurns(): number;\n\n /** Get a custom state value by key */\n get<K extends keyof TCustom>(key: K): TCustom[K];\n\n /** Set a custom state value by key */\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void;\n\n /** Get full state for query handler */\n getCurrentState(): AgentState<TCustom>;\n\n /** Check if should return from waitForStateChange */\n shouldReturnFromWait(lastKnownVersion: number): boolean;\n\n // Task management methods\n /** Get all tasks */\n getTasks(): WorkflowTask[];\n /** Get a task by ID */\n getTask(id: string): WorkflowTask | undefined;\n /** Add or update a task */\n setTask(task: WorkflowTask): void;\n /** Delete a task by ID */\n deleteTask(id: string): boolean;\n\n /** Set the tools */\n setTools(newTools: ToolDefinition[]): void;\n}\n\nexport const getStateQuery = defineQuery<BaseAgentState>(\"getState\");\n\n/**\n * Creates an agent state manager for tracking workflow state.\n *\n * @param initialState - Optional initial values for base and custom state\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty, fileTree=[]\n *\n * Note: Due to Temporal's workflow isolation, handlers must be set up\n * in the workflow file using defineQuery/defineUpdate and setHandler.\n * This manager provides the state and logic needed for those handlers.\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>(\n initialState?: Partial<BaseAgentState> & TCustom\n): AgentStateManager<TCustom> {\n // Default state (BaseAgentState fields)\n let status: AgentStatus = initialState?.status ?? \"RUNNING\";\n let version = initialState?.version ?? 0;\n let turns = initialState?.turns ?? 0;\n let tools = initialState?.tools ?? [];\n\n // Tasks state\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\n // Custom state - extract only custom fields (exclude base state keys)\n const {\n status: _,\n version: __,\n turns: ___,\n tasks: ____,\n tools: _____,\n ...custom\n } = initialState ?? {};\n const customState = custom as TCustom;\n\n function buildState(): AgentState<TCustom> {\n return {\n status,\n version,\n turns,\n tools,\n ...customState,\n } as AgentState<TCustom>;\n }\n\n setHandler(getStateQuery, () => {\n return buildState();\n });\n\n return {\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n isTerminal(): boolean {\n return isTerminalStatus(status);\n },\n\n getTurns(): number {\n return turns;\n },\n\n getVersion(): number {\n return version;\n },\n\n run(): void {\n status = \"RUNNING\";\n version++;\n },\n\n waitForInput(): void {\n status = \"WAITING_FOR_INPUT\";\n version++;\n },\n\n complete(): void {\n status = \"COMPLETED\";\n version++;\n },\n\n fail(): void {\n status = \"FAILED\";\n version++;\n },\n\n cancel(): void {\n status = \"CANCELLED\";\n version++;\n },\n\n incrementVersion(): void {\n version++;\n },\n\n incrementTurns(): void {\n turns++;\n },\n\n get<K extends keyof TCustom>(key: K): TCustom[K] {\n return customState[key];\n },\n\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void {\n customState[key] = value;\n version++;\n },\n\n getCurrentState(): AgentState<TCustom> {\n return buildState();\n },\n\n shouldReturnFromWait(lastKnownVersion: number): boolean {\n return version > lastKnownVersion || isTerminalStatus(status);\n },\n\n getTasks(): WorkflowTask[] {\n return Array.from(tasks.values());\n },\n\n getTask(id: string): WorkflowTask | undefined {\n return tasks.get(id);\n },\n\n setTask(task: WorkflowTask): void {\n tasks.set(task.id, task);\n version++;\n },\n\n setTools(newTools: ToolDefinition[]): void {\n tools = newTools;\n },\n\n deleteTask(id: string): boolean {\n const deleted = tasks.delete(id);\n if (deleted) {\n version++;\n }\n return deleted;\n },\n };\n}\n\n/**\n * Handler names used across agents\n */\nexport const AGENT_HANDLER_NAMES = {\n getAgentState: \"getAgentState\",\n waitForStateChange: \"waitForStateChange\",\n addMessage: \"addMessage\",\n} as const;\n","import z from \"zod\";\n\nexport const askUserQuestionTool = {\n name: \"AskUserQuestion\" as const,\n description: `Use this tool when you need to ask the user questions during execution. This allows you to:\n\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nUsage notes:\n\n* Users will always be able to select \"Other\" to provide custom text input\n* Use multiSelect: true to allow multiple answers to be selected for a question\n* If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label\n`,\n schema: z.object({\n questions: z.array(\n z.object({\n question: z.string().describe(\"The full question text to display\"),\n header: z\n .string()\n .describe(\"Short label for the question (max 12 characters)\"),\n options: z\n .array(\n z.object({\n label: z.string(),\n description: z.string(),\n })\n )\n .min(0)\n .max(4)\n .describe(\"Array of 0-4 choices, each with label and description\"),\n multiSelect: z\n .boolean()\n .describe(\"If true, users can select multiple options\"),\n })\n ),\n }),\n strict: true,\n};\n\nexport type AskUserQuestionToolSchemaType = z.infer<\n typeof askUserQuestionTool.schema\n>;\n","import { z } from \"zod\";\n\nexport const globTool = {\n name: \"Glob\" as const,\n description: `Search for files matching a glob pattern within the available file system.\n\nUsage:\n- Use glob patterns like \"**/*.ts\" to find all TypeScript files\n- Use \"docs/**\" to find all files in the docs directory\n- Patterns are matched against virtual paths in the file system\n\nExamples:\n- \"*.md\" - Find all markdown files in the root\n- \"**/*.test.ts\" - Find all test files recursively\n- \"src/**/*.ts\" - Find all TypeScript files in src directory\n`,\n schema: z.object({\n pattern: z.string().describe(\"Glob pattern to match files against\"),\n root: z\n .string()\n .optional()\n .describe(\"Optional root directory to search from\"),\n }),\n strict: true,\n};\n\nexport type GlobToolSchemaType = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\n\nexport const grepTool = {\n name: \"Grep\" as const,\n description: `Search file contents for a pattern within the available file system.\n\nUsage:\n- Searches for a regex pattern across file contents\n- Returns matching lines with file paths and line numbers\n- Can filter by file patterns and limit results\n\nExamples:\n- Search for \"TODO\" in all files\n- Search for function definitions with \"function.*handleClick\"\n- Search case-insensitively with ignoreCase: true\n`,\n schema: z.object({\n pattern: z\n .string()\n .describe(\"Regex pattern to search for in file contents\"),\n ignoreCase: z\n .boolean()\n .optional()\n .describe(\"Case-insensitive search (default: false)\"),\n maxMatches: z\n .number()\n .optional()\n .describe(\"Maximum number of matches to return (default: 50)\"),\n includePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to include (e.g., ['*.ts', '*.js'])\"),\n excludePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to exclude (e.g., ['*.test.ts'])\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of context lines to show around matches\"),\n }),\n strict: true,\n};\n\nexport type GrepToolSchemaType = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\n\nexport const readTool = {\n name: \"FileRead\" as const,\n description: `Read file contents with optional pagination.\n\nUsage:\n- Provide the virtual path to the file you want to read\n- Supports text files, images, and PDFs\n- For large files, use offset and limit to read specific portions\n\nThe tool returns the file content in an appropriate format:\n- Text files: Plain text content\n- Images: Base64-encoded image data\n- PDFs: Extracted text content\n`,\n schema: z.object({\n path: z.string().describe(\"Virtual path to the file to read\"),\n offset: z\n .number()\n .optional()\n .describe(\n \"Line number to start reading from (1-indexed, for text files)\"\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of lines to read (for text files)\"),\n }),\n strict: true,\n};\n\nexport type ReadToolSchemaType = z.infer<typeof readTool.schema>;\n","import { z } from \"zod\";\n\nexport const writeTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\n- Provide the absolute virtual path to the file\n- The file will be created if it doesn't exist\n- If the file exists, it will be completely overwritten\n\nIMPORTANT:\n- You must read the file first (in this session) before writing to it\n- This is an atomic write operation - the entire file is replaced\n- Path must be absolute (e.g., \"/docs/readme.md\", not \"docs/readme.md\")\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n};\n\nexport type WriteToolSchemaType = z.infer<typeof writeTool.schema>;\n","import { z } from \"zod\";\n\nexport const editTool = {\n name: \"FileEdit\" as const,\n description: `Edit specific sections of a file by replacing text.\n\nUsage:\n- Provide the exact text to find and replace\n- The old_string must match exactly (whitespace-sensitive)\n- By default, only replaces the first occurrence\n- Use replace_all: true to replace all occurrences\n\nIMPORTANT:\n- You must read the file first (in this session) before editing it\n- old_string must be unique in the file (unless using replace_all)\n- The operation fails if old_string is not found\n- old_string and new_string must be different\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to modify\"),\n old_string: z.string().describe(\"The exact text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\"\n ),\n replace_all: z\n .boolean()\n .optional()\n .describe(\n \"If true, replace all occurrences of old_string (default: false)\"\n ),\n }),\n strict: true,\n};\n\nexport type EditToolSchemaType = z.infer<typeof editTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskCreateToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskCreate handler that adds tasks to the workflow state.\n *\n * @param stateManager - State manager containing tasks state\n * @param idGenerator - Function to generate unique task IDs (e.g., uuid4 from Temporal)\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskCreateHandler(stateManager, uuid4);\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>({\n stateManager,\n idGenerator,\n}: {\n stateManager: AgentStateManager<TCustom>;\n idGenerator: () => string;\n}): (args: TaskCreateToolSchemaType) => ToolHandlerResponse<WorkflowTask> {\n return (\n args: TaskCreateToolSchemaType\n ): ToolHandlerResponse<WorkflowTask> => {\n const task: WorkflowTask = {\n id: idGenerator(),\n subject: args.subject,\n description: args.description,\n activeForm: args.activeForm,\n status: \"pending\",\n metadata: args.metadata ?? {},\n blockedBy: [],\n blocks: [],\n };\n\n stateManager.setTask(task);\n\n return {\n content: JSON.stringify(task, null, 2),\n result: task,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskGetTool = {\n name: \"TaskGet\" as const,\n description: `Retrieve full task details including dependencies.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n }),\n};\n\nexport type TaskGetToolSchemaType = z.infer<typeof taskGetTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskGet handler that retrieves a task by ID.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskGetHandler(stateManager);\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): (args: TaskGetToolSchemaType) => ToolHandlerResponse<WorkflowTask | null> {\n return (\n args: TaskGetToolSchemaType\n ): ToolHandlerResponse<WorkflowTask | null> => {\n const task = stateManager.getTask(args.taskId) ?? null;\n\n if (!task) {\n return {\n content: JSON.stringify({ error: `Task not found: ${args.taskId}` }),\n result: null,\n };\n }\n\n return {\n content: JSON.stringify(task, null, 2),\n result: task,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n};\n\nexport type TaskListToolSchemaType = z.infer<typeof taskListTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskList handler that returns all tasks.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskListHandler(stateManager);\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): (args: TaskListToolSchemaType) => ToolHandlerResponse<WorkflowTask[]> {\n return (\n _args: TaskListToolSchemaType\n ): ToolHandlerResponse<WorkflowTask[]> => {\n const taskList = stateManager.getTasks();\n\n return {\n content: JSON.stringify(taskList, null, 2),\n result: taskList,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskUpdateTool = {\n name: \"TaskUpdate\" as const,\n description: `Update status, add blockers, modify details.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"The status of the task\"),\n addBlockedBy: z\n .array(z.string())\n .describe(\"The IDs of the tasks that are blocking this task\"),\n addBlocks: z\n .array(z.string())\n .describe(\"The IDs of the tasks that this task is blocking\"),\n }),\n};\n\nexport type TaskUpdateToolSchemaType = z.infer<typeof taskUpdateTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskUpdate handler that modifies task status and dependencies.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskUpdateHandler(stateManager);\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): (\n args: TaskUpdateToolSchemaType\n) => ToolHandlerResponse<WorkflowTask | null> {\n return (\n args: TaskUpdateToolSchemaType\n ): ToolHandlerResponse<WorkflowTask | null> => {\n const task = stateManager.getTask(args.taskId);\n\n if (!task) {\n return {\n content: JSON.stringify({ error: `Task not found: ${args.taskId}` }),\n result: null,\n };\n }\n\n // Update status if provided\n if (args.status) {\n task.status = args.status;\n }\n\n // Add blockedBy relationships (bidirectional)\n if (args.addBlockedBy) {\n for (const blockerId of args.addBlockedBy) {\n if (!task.blockedBy.includes(blockerId)) {\n task.blockedBy.push(blockerId);\n }\n // Update the blocker task's blocks array\n const blockerTask = stateManager.getTask(blockerId);\n if (blockerTask && !blockerTask.blocks.includes(task.id)) {\n blockerTask.blocks.push(task.id);\n stateManager.setTask(blockerTask);\n }\n }\n }\n\n // Add blocks relationships (bidirectional)\n if (args.addBlocks) {\n for (const blockedId of args.addBlocks) {\n if (!task.blocks.includes(blockedId)) {\n task.blocks.push(blockedId);\n }\n // Update the blocked task's blockedBy array\n const blockedTask = stateManager.getTask(blockedId);\n if (blockedTask && !blockedTask.blockedBy.includes(task.id)) {\n blockedTask.blockedBy.push(task.id);\n stateManager.setTask(blockedTask);\n }\n }\n }\n\n stateManager.setTask(task);\n\n return {\n content: JSON.stringify(task, null, 2),\n result: task,\n };\n };\n}\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","import crypto from 'node:crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import crypto from 'node:crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import type Redis from \"ioredis\";\n\nimport {\n type $InferMessageContent,\n AIMessage,\n HumanMessage,\n type MessageContent,\n type MessageStructure,\n type StoredMessage,\n SystemMessage,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Content for a tool message response.\n * Can be a simple string or complex content parts (text, images, cache points, etc.)\n */\nexport type ToolMessageContent = $InferMessageContent<MessageStructure, \"tool\">;\n\nexport interface ThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n}\n\nexport interface ThreadManager {\n /** Append a system message to the thread */\n appendSystemMessage(content: string): Promise<void>;\n /** Initialize an empty thread */\n initialize(): Promise<void>;\n /** Load all messages from the thread */\n load(): Promise<StoredMessage[]>;\n /** Append messages to the thread */\n append(messages: StoredMessage[]): Promise<void>;\n /** Delete the thread */\n delete(): Promise<void>;\n\n /** Create a SystemMessage (returns StoredMessage for storage) */\n createSystemMessage(content: string): StoredMessage;\n\n /** Create a HumanMessage (returns StoredMessage for storage) */\n createHumanMessage(content: string | MessageContent): StoredMessage;\n\n /** Create an AIMessage with optional additional kwargs */\n createAIMessage(\n content: string | MessageContent,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean }\n ): StoredMessage;\n\n /** Create a ToolMessage */\n createToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): StoredMessage;\n\n /** Create and append a HumanMessage */\n appendHumanMessage(content: string | MessageContent): Promise<void>;\n /** Create and append a ToolMessage */\n appendToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): Promise<void>;\n /** Create and append an AIMessage */\n appendAIMessage(content: string | MessageContent): Promise<void>;\n}\n\n/**\n * Creates a thread manager for handling conversation state in Redis.\n */\nexport function createThreadManager(\n config: ThreadManagerConfig\n): ThreadManager {\n const { redis, threadId, key = \"messages\" } = config;\n const redisKey = getThreadKey(threadId, key);\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n },\n\n async load(): Promise<StoredMessage[]> {\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map((item) => JSON.parse(item) as StoredMessage);\n },\n\n async append(messages: StoredMessage[]): Promise<void> {\n if (messages.length > 0) {\n await redis.rpush(redisKey, ...messages.map((m) => JSON.stringify(m)));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey);\n },\n\n createHumanMessage(content: string | MessageContent): StoredMessage {\n return new HumanMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createAIMessage(\n content: string,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean }\n ): StoredMessage {\n return new AIMessage({\n id: uuidv4(),\n content,\n additional_kwargs: kwargs\n ? {\n header: kwargs.header,\n options: kwargs.options,\n multiSelect: kwargs.multiSelect,\n }\n : undefined,\n }).toDict();\n },\n\n createToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): StoredMessage {\n return new ToolMessage({\n // Cast needed due to langchain type compatibility\n content: content as MessageContent,\n tool_call_id: toolCallId,\n }).toDict();\n },\n\n createSystemMessage(content: string): StoredMessage {\n return new SystemMessage({\n content,\n }).toDict();\n },\n\n async appendSystemMessage(content: string): Promise<void> {\n const message = this.createSystemMessage(content);\n await this.append([message]);\n },\n\n async appendHumanMessage(content: string | MessageContent): Promise<void> {\n const message = this.createHumanMessage(content);\n await this.append([message]);\n },\n\n async appendToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): Promise<void> {\n const message = this.createToolMessage(content, toolCallId);\n await this.append([message]);\n },\n\n async appendAIMessage(content: string | MessageContent): Promise<void> {\n const message = this.createAIMessage(content);\n await this.append([message]);\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport { createThreadManager } from \"./lib/thread-manager\";\nimport type { ToolResultConfig } from \"./lib/types\";\nimport {\n type AIMessage,\n mapStoredMessageToChatMessage,\n type MessageContent,\n type StoredMessage,\n} from \"@langchain/core/messages\";\nimport type { RawToolCall } from \"./lib/tool-router\";\n/**\n * Shared Zeitlich activities - thread management and message handling\n * Note: runAgent is workflow-specific and should be created per-workflow\n */\nexport interface ZeitlichSharedActivities {\n appendSystemMessage(threadId: string, content: string): Promise<void>;\n /**\n * Append a tool result to the thread.\n * Handles JSON serialization and optional cache points.\n */\n appendToolResult(config: ToolResultConfig): Promise<void>;\n\n /**\n * Initialize an empty thread.\n */\n initializeThread(threadId: string): Promise<void>;\n\n /**\n * Append a system message to a thread.\n */\n appendSystemMessage(threadId: string, content: string): Promise<void>;\n\n /**\n * Append messages to a thread.\n */\n appendThreadMessages(\n threadId: string,\n messages: StoredMessage[]\n ): Promise<void>;\n\n /**\n * Append a human message to a thread.\n */\n appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void>;\n\n /**\n * Extract raw tool calls from a stored message.\n * Returns unvalidated tool calls - use toolRegistry.parseToolCall() to validate.\n */\n parseToolCalls(storedMessage: StoredMessage): Promise<RawToolCall[]>;\n}\n\n/**\n * Creates shared Temporal activities for thread management\n *\n * @returns An object containing the shared activity functions\n *\n * @experimental The Zeitlich integration is an experimental feature; APIs may change without notice.\n */\nexport function createSharedActivities(redis: Redis): ZeitlichSharedActivities {\n return {\n async appendSystemMessage(\n threadId: string,\n content: string\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.appendSystemMessage(content);\n },\n\n async appendToolResult(config: ToolResultConfig): Promise<void> {\n const { threadId, toolCallId, content } = config;\n const thread = createThreadManager({ redis, threadId });\n\n await thread.appendToolMessage(content, toolCallId);\n },\n\n async initializeThread(threadId: string): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.initialize();\n },\n\n async appendThreadMessages(\n threadId: string,\n messages: StoredMessage[]\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.append(messages);\n },\n\n async appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.appendHumanMessage(content);\n },\n\n async parseToolCalls(storedMessage: StoredMessage): Promise<RawToolCall[]> {\n const message = mapStoredMessageToChatMessage(storedMessage) as AIMessage;\n const toolCalls = message.tool_calls ?? [];\n\n return toolCalls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }));\n },\n };\n}\n","import { SimplePlugin } from \"@temporalio/plugin\";\nimport { createSharedActivities } from \"./activities\";\nimport type Redis from \"ioredis\";\n\n/**\n * Options for the Zeitlich plugin\n *\n * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.\n */\nexport interface ZeitlichPluginOptions {\n redis: Redis;\n}\n\n/**\n * A Temporal plugin that integrates Zeitlich for use in workflows.\n * This plugin creates shared activities for thread management.\n * Workflow-specific activities (like runAgent) should be created separately.\n *\n * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.\n */\nexport class ZeitlichPlugin extends SimplePlugin {\n constructor(options: ZeitlichPluginOptions) {\n super({\n name: \"ZeitlichPlugin\",\n activities: createSharedActivities(options.redis),\n });\n }\n}\n","import type Redis from \"ioredis\";\nimport { createThreadManager } from \"./thread-manager\";\nimport type { AgentResponse } from \"./types\";\nimport { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport { mapStoredMessagesToChatMessages } from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n BaseChatModel,\n BaseChatModelCallOptions,\n BindToolsInput,\n} from \"@langchain/core/language_models/chat_models\";\nimport { getStateQuery } from \"./state-manager\";\n\n/**\n * Configuration for invoking the model\n */\nexport interface InvokeModelConfig {\n threadId: string;\n agentName: string;\n}\n\n/**\n * Core model invocation logic - shared utility for workflow-specific activities\n *\n * @param redis - Redis client for thread management\n * @param config - Model invocation configuration\n * @param model - Pre-instantiated LangChain chat model\n * @param invocationConfig - Per-invocation configuration (system prompt, etc.)\n * @returns Agent response with message and metadata\n */\nexport async function invokeModel({\n redis,\n model,\n client,\n config: { threadId, agentName },\n}: {\n redis: Redis;\n client: WorkflowClient;\n config: InvokeModelConfig;\n model: BaseChatModel<BaseChatModelCallOptions & { tools?: BindToolsInput }>;\n}): Promise<AgentResponse> {\n const thread = createThreadManager({ redis, threadId });\n const runId = uuidv4();\n\n const info = Context.current().info; // Activity info\n const parentWorkflowId = info.workflowExecution.workflowId;\n const parentRunId = info.workflowExecution.runId;\n\n const handle = client.getHandle(parentWorkflowId, parentRunId);\n const { tools } = await handle.query(getStateQuery);\n\n const messages = await thread.load();\n const response = await model.invoke(\n [...mapStoredMessagesToChatMessages(messages)],\n {\n runName: agentName,\n runId,\n metadata: { thread_id: threadId },\n tools,\n }\n );\n\n await thread.append([response.toDict()]);\n\n return {\n message: response.toDict(),\n stopReason: (response.response_metadata?.stop_reason as string) ?? null,\n usage: {\n input_tokens: response.usage_metadata?.input_tokens,\n output_tokens: response.usage_metadata?.output_tokens,\n total_tokens: response.usage_metadata?.total_tokens,\n },\n };\n}\n","import { AIMessage, type StoredMessage } from \"@langchain/core/messages\";\nimport type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionToolSchemaType } from \"./tool\";\n\n/**\n * Handle user interaction tool result - creates AI messages for display.\n */\nexport const handleAskUserQuestionToolResult: ActivityToolHandler<\n AskUserQuestionToolSchemaType,\n { chatMessages: StoredMessage[] }\n> = async (args) => {\n const messages = args.questions.map(\n ({ question, header, options, multiSelect }) =>\n new AIMessage({\n content: question,\n additional_kwargs: {\n header,\n options,\n multiSelect,\n },\n }).toDict()\n );\n\n return { content: \"Question submitted\", result: { chatMessages: messages } };\n};\n","import type { IFileSystem } from \"just-bash\";\nimport { Bash } from \"just-bash\";\nimport type { GlobToolSchemaType } from \"./tool\";\n\n/**\n * Result of a glob operation\n */\nexport interface GlobResult {\n files: string[];\n}\n\n/**\n * Glob handler response\n */\nexport interface GlobHandlerResponse {\n content: string;\n result: GlobResult;\n}\n\n/**\n * Glob handler that searches within the scoped file tree.\n *\n * @param args - Tool arguments (pattern, root)\n * @param provider - FileSystemProvider for I/O operations\n */\nexport async function globHandler(\n _args: GlobToolSchemaType,\n fs: IFileSystem\n): Promise<GlobHandlerResponse> {\n // const { pattern, root } = args;\n const _bash = new Bash({ fs });\n\n return Promise.resolve({\n content: \"Hello, world!\",\n result: { files: [] },\n });\n\n // try {\n // const matches = await bash.exec(`glob ${root} -name \"${pattern}\"`);\n\n // if (matches.length === 0) {\n // return {\n // content: `No files found matching pattern: ${pattern}`,\n // result: { files: [] },\n // };\n // }\n\n // const paths = matches.map((node) => node.path);\n // const fileList = paths.map((p) => ` ${p}`).join(\"\\n\");\n\n // return {\n // content: `Found ${matches.length} file(s) matching \"${pattern}\":\\n${fileList}`,\n // result: { files: matches },\n // };\n // } catch (error) {\n // const message = error instanceof Error ? error.message : \"Unknown error\";\n // return {\n // content: `Error searching for files: ${message}`,\n // result: { files: [] },\n // };\n // }\n}\n","import type { EditToolSchemaType } from \"./tool\";\nimport type { IFileSystem } from \"just-bash\";\n\n/**\n * Result of an edit operation\n */\nexport interface EditResult {\n path: string;\n success: boolean;\n replacements: number;\n}\n\n/**\n * Edit handler response\n */\nexport interface EditHandlerResponse {\n content: string;\n result: EditResult;\n}\n\n/**\n * Options for edit handler\n */\nexport interface EditHandlerOptions {\n /**\n * Set of file paths that have been read in this session.\n * Required for enforcing read-before-write policy.\n */\n readFiles: Set<string>;\n /**\n * If true, skip the read-before-write check (not recommended)\n */\n skipReadCheck?: boolean;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Edit handler that edits files within the scoped file tree.\n *\n * @param args - Tool arguments (file_path, old_string, new_string, replace_all)\n * @param options - Additional options (readFiles, skipReadCheck)\n */\nexport async function editHandler(\n args: EditToolSchemaType,\n fs: IFileSystem\n): Promise<EditHandlerResponse> {\n const { file_path, old_string, new_string, replace_all = false } = args;\n\n // Validate old_string !== new_string\n if (old_string === new_string) {\n return {\n content: `Error: old_string and new_string must be different.`,\n result: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n try {\n // Check if file exists\n const exists = await fs.exists(file_path);\n if (!exists) {\n return {\n content: `Error: File \"${file_path}\" does not exist.`,\n result: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Read current content\n const content = await fs.readFile(file_path);\n\n // Check if old_string exists in the file\n if (!content.includes(old_string)) {\n return {\n content: `Error: Could not find the specified text in \"${file_path}\". Make sure old_string matches exactly (whitespace-sensitive).`,\n result: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Count occurrences\n const escapedOldString = escapeRegExp(old_string);\n const globalRegex = new RegExp(escapedOldString, \"g\");\n const occurrences = (content.match(globalRegex) || []).length;\n\n // Check uniqueness if not replace_all\n if (!replace_all && occurrences > 1) {\n return {\n content: `Error: old_string appears ${occurrences} times in \"${file_path}\". Either provide more context to make it unique, or use replace_all: true.`,\n result: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Perform replacement\n let newContent: string;\n let replacements: number;\n\n if (replace_all) {\n newContent = content.split(old_string).join(new_string);\n replacements = occurrences;\n } else {\n // Replace only the first occurrence\n const index = content.indexOf(old_string);\n newContent =\n content.slice(0, index) +\n new_string +\n content.slice(index + old_string.length);\n replacements = 1;\n }\n\n // Write the modified content\n await fs.writeFile(file_path, newContent);\n\n const summary = replace_all\n ? `Replaced ${replacements} occurrence(s)`\n : `Replaced 1 occurrence`;\n\n return {\n content: `${summary} in ${file_path}`,\n result: {\n path: file_path,\n success: true,\n replacements,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: `Error editing file \"${file_path}\": ${message}`,\n result: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n}\n","import type { ActivityToolHandler } from \"../../workflow\";\nimport type { bashToolSchemaType } from \"./tool\";\nimport { Bash, type IFileSystem } from \"just-bash\";\n\ntype BashExecOut = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\nexport const handleBashTool: (\n fs: IFileSystem\n) => ActivityToolHandler<bashToolSchemaType, BashExecOut | null> =\n (fs: IFileSystem) => async (args: bashToolSchemaType, _context) => {\n const { command } = args;\n\n const bashOptions = fs ? { fs } : {};\n\n const bash = new Bash(bashOptions);\n\n try {\n const { exitCode, stderr, stdout } = await bash.exec(command);\n const bashExecOut = { exitCode, stderr, stdout };\n\n return {\n content: `Exit code: ${exitCode}\\n\\nstdout:\\n${stdout}\\n\\nstderr:\\n${stderr}`,\n result: bashExecOut,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(\"Unknown error\");\n return {\n content: `Error executing bash command: ${err.message}`,\n result: null,\n };\n }\n };\n","import type { IFileSystem } from \"just-bash\";\n\nconst basename = (path: string, separator: string): string => {\n if (path[path.length - 1] === separator) path = path.slice(0, -1);\n const lastSlashIndex = path.lastIndexOf(separator);\n return lastSlashIndex === -1 ? path : path.slice(lastSlashIndex + 1);\n};\n\nconst printTree = async (\n tab = \"\",\n children: ((tab: string) => Promise<string | null>)[]\n): Promise<string> => {\n let str = \"\";\n let last = children.length - 1;\n for (; last >= 0; last--) if (children[last]) break;\n for (let i = 0; i <= last; i++) {\n const fn = children[i];\n if (!fn) continue;\n const isLast = i === last;\n const child = await fn(tab + (isLast ? \" \" : \"│\") + \" \");\n const branch = child ? (isLast ? \"└─\" : \"├─\") : \"│\";\n str += \"\\n\" + tab + branch + (child ? \" \" + child : \"\");\n }\n return str;\n};\n\nexport const toTree = async (\n fs: IFileSystem,\n opts: {\n dir?: string;\n separator?: \"/\" | \"\\\\\";\n depth?: number;\n tab?: string;\n sort?: boolean;\n } = {}\n): Promise<string> => {\n const separator = opts.separator || \"/\";\n let dir = opts.dir || separator;\n if (dir[dir.length - 1] !== separator) dir += separator;\n const tab = opts.tab || \"\";\n const depth = opts.depth ?? 10;\n const sort = opts.sort ?? true;\n let subtree = \" (...)\";\n if (depth > 0) {\n const list = (await fs.readdirWithFileTypes?.(dir)) || [];\n if (sort) {\n list.sort((a, b) => {\n if (a.isDirectory && b.isDirectory) {\n return a.name.toString().localeCompare(b.name.toString());\n } else if (a.isDirectory) {\n return -1;\n } else if (b.isDirectory) {\n return 1;\n } else {\n return a.name.toString().localeCompare(b.name.toString());\n }\n });\n }\n subtree = await printTree(\n tab,\n list.map((entry) => async (tab): Promise<string | null> => {\n if (entry.isDirectory) {\n return toTree(fs, {\n dir: dir + entry.name,\n depth: depth - 1,\n tab,\n });\n } else if (entry.isSymbolicLink) {\n return (\n \"\" + entry.name + \" → \" + (await fs.readlink(dir + entry.name))\n );\n } else {\n return \"\" + entry.name;\n }\n })\n );\n }\n const base = basename(dir, separator) + separator;\n return base + subtree;\n};\n"]}
1
+ {"version":3,"sources":["../src/tools/task/tool.ts","../src/tools/task/handler.ts","../src/tools/bash/tool.ts","../src/tools/task-create/tool.ts","../src/lib/tool-router.ts","../src/lib/session.ts","../src/lib/types.ts","../src/lib/state-manager.ts","../src/tools/ask-user-question/tool.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read/tool.ts","../src/tools/write/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/handler.ts","../src/tools/task-get/tool.ts","../src/tools/task-get/handler.ts","../src/tools/task-list/tool.ts","../src/tools/task-list/handler.ts","../src/tools/task-update/tool.ts","../src/tools/task-update/handler.ts","../node_modules/uuid/dist/esm-node/stringify.js","../node_modules/uuid/dist/esm-node/rng.js","../node_modules/uuid/dist/esm-node/native.js","../node_modules/uuid/dist/esm-node/v4.js","../src/lib/thread-manager.ts","../src/activities.ts","../src/plugin.ts","../src/lib/model-invoker.ts","../src/tools/ask-user-question/handler.ts","../src/tools/glob/handler.ts","../src/tools/edit/handler.ts","../src/tools/bash/handler.ts","../src/lib/fs.ts"],"names":["z","workflowInfo","uuid4","executeChild","proxyActivities","results","tc","defineQuery","setHandler","crypto","HumanMessage","AIMessage","ToolMessage","SystemMessage","mapStoredMessageToChatMessage","SimplePlugin","Context","messages","mapStoredMessagesToChatMessages","Bash","tab"],"mappings":"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","file":"index.cjs","sourcesContent":["import z from \"zod\";\nimport type { SubagentConfig } from \"../../lib/types\";\n\nconst TASK_TOOL = \"Task\" as const;\n\n/**\n * Builds the tool description with available subagent information\n */\nfunction buildTaskDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Launch a new agent to handle complex, multi-step tasks autonomously.\n\nThe ${TASK_TOOL} tool launches specialized agents (subprocesses) that autonomously handle complex tasks. Each agent type has specific capabilities and tools available to it.\n\nAvailable agent types:\n\n${subagentList}\n\nWhen using the ${TASK_TOOL} tool, you must specify a subagent parameter to select which agent type to use.\n\nUsage notes:\n\n- Always include a short description (3-5 words) summarizing what the agent will do\n- Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n- When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n- Each invocation starts fresh - provide a detailed task description with all necessary context.\n- Provide clear, detailed prompts so the agent can work autonomously and return exactly the information you need.\n- The agent's outputs should generally be trusted\n- Clearly tell the agent what type of work you expect since it is not aware of the user's intent\n- If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.`;\n}\n\n/**\n * Creates a Task tool configured with the available subagents.\n *\n * @param subagents - Array of subagent configurations (must have at least one)\n * @returns A tool definition with dynamic schema based on available subagents\n *\n * @example\n * const taskTool = createTaskTool([\n * {\n * name: \"researcher\",\n * description: \"Researches topics and gathers information\",\n * workflow: \"researcherWorkflow\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * ]);\n */\nexport function createTaskTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n subagent: z.ZodEnum<Record<string, string>>;\n description: z.ZodString;\n prompt: z.ZodString;\n }>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createTaskTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.name);\n\n return {\n name: TASK_TOOL,\n description: buildTaskDescription(subagents),\n schema: z.object({\n subagent: z.enum(names).describe(\"The type of subagent to launch\"),\n description: z\n .string()\n .describe(\"A short (3-5 word) description of the task\"),\n prompt: z.string().describe(\"The task for the agent to perform\"),\n }),\n } as const;\n}\n\n/**\n * Infer the schema type for a task tool created with specific subagents\n */\nexport type TaskToolSchemaType<T extends SubagentConfig[]> = z.infer<\n ReturnType<typeof createTaskTool<T>>[\"schema\"]\n>;\n\n/**\n * Generic task tool schema type (when subagent names are not known at compile time)\n */\nexport type GenericTaskToolSchemaType = {\n subagent: string;\n description: string;\n prompt: string;\n};\n","import { executeChild, workflowInfo, uuid4 } from \"@temporalio/workflow\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { SubagentConfig, SubagentInput } from \"../../lib/types\";\nimport type { GenericTaskToolSchemaType } from \"./tool\";\n\n/**\n * Result from a task handler execution\n */\nexport interface TaskHandlerResult<TResult = unknown> {\n /** The validated result from the child workflow */\n result: TResult;\n /** The child workflow ID (for reference/debugging) */\n childWorkflowId: string;\n}\n\n/**\n * Creates a Task tool handler that spawns child workflows for configured subagents.\n *\n * @param subagents - Array of subagent configurations\n * @returns A tool handler function that can be used with the tool router\n *\n * @example\n * const taskHandler = taskHandler([\n * {\n * name: \"researcher\",\n * description: \"Researches topics\",\n * workflow: \"researcherWorkflow\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * ]);\n */\nexport function createTaskHandler(subagents: SubagentConfig[]) {\n const { workflowId: parentWorkflowId, taskQueue: parentTaskQueue } =\n workflowInfo();\n\n return async (\n args: GenericTaskToolSchemaType\n ): Promise<ToolHandlerResponse<TaskHandlerResult>> => {\n const config = subagents.find((s) => s.name === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.name).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${parentWorkflowId}-${args.subagent}-${uuid4()}`;\n\n // Execute the child workflow\n const input: SubagentInput = {\n prompt: args.prompt,\n ...(config.context && { context: config.context }),\n };\n\n const childOpts = {\n workflowId: childWorkflowId,\n args: [input],\n taskQueue: config.taskQueue ?? parentTaskQueue,\n };\n\n const childResult =\n typeof config.workflow === \"string\"\n ? await executeChild(config.workflow, childOpts)\n : await executeChild(config.workflow, childOpts);\n\n // Validate result if schema provided, otherwise pass through as-is\n const validated = config.resultSchema\n ? config.resultSchema.parse(childResult)\n : childResult;\n\n // Format content - stringify objects, pass strings through\n const toolResponse =\n typeof validated === \"string\"\n ? validated\n : JSON.stringify(validated, null, 2);\n\n return {\n toolResponse,\n data: {\n result: validated,\n childWorkflowId,\n },\n };\n };\n}\n","import z from \"zod\";\n\nexport const createBashToolDescription = ({\n fileTree,\n}: {\n fileTree: string;\n}): string => `Execute shell commands in a bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n\nCurrent file tree:\n${fileTree}`;\n\nexport const bashTool = {\n name: \"Bash\" as const,\n description: `Execute shell commands in a sandboxed bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n`,\n schema: z.object({\n command: z\n .string()\n .describe(\n \"The bash command to execute. Can include pipes (|), redirects (>, >>), logical operators (&&, ||), and shell features like command substitution $(...).\"\n ),\n }),\n strict: true,\n};\n\nexport type bashToolSchemaType = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list for the control test. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n It also helps the user understand the progress of the task and overall progress of their requests.\n \n ## When to Use This Tool\n \n Use this tool proactively in these scenarios:\n \n - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n - User explicitly requests todo list - When the user directly asks you to use the todo list\n - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n - After receiving new instructions - Immediately capture user requirements as tasks\n - When you start working on a task - Mark it as in_progress BEFORE beginning work\n - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n \n ## When NOT to Use This Tool\n \n Skip using this tool when:\n - There is only a single, straightforward task\n - The task is trivial and tracking it provides no organizational benefit\n - The task can be completed in less than 3 trivial steps\n - The task is purely conversational or informational\n \n NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n \n ## Task Fields\n \n - **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n - **description**: Detailed description of what needs to be done, including context and acceptance criteria\n - **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n \n **IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n \n ## Tips\n \n - Create tasks with clear, specific subjects that describe the outcome\n - Include enough detail in the description for another agent to understand and complete the task\n - After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n - Check TaskList first to avoid creating duplicate tasks`,\n schema: z.object({\n subject: z\n .string()\n .describe(\n 'A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")'\n ),\n description: z\n .string()\n .describe(\n \"Detailed description of what needs to be done, including context and acceptance criteria\"\n ),\n activeForm: z\n .string()\n .describe(\n 'Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.'\n ),\n metadata: z\n .record(z.string(), z.string())\n .describe(\"Arbitrary key-value pairs for tracking\"),\n }),\n};\n\nexport type TaskCreateToolSchemaType = z.infer<typeof taskCreateTool.schema>;\n","import type { MessageToolDefinition } from \"@langchain/core/messages\";\nimport type { ToolMessageContent } from \"./thread-manager\";\nimport type {\n Hooks,\n PostToolUseFailureHookResult,\n PreToolUseHookResult,\n SubagentConfig,\n SubagentHooks,\n ToolHooks,\n ToolResultConfig,\n} from \"./types\";\nimport type { GenericTaskToolSchemaType } from \"../tools/task/tool\";\n\nimport type { z } from \"zod\";\nimport { proxyActivities } from \"@temporalio/workflow\";\nimport type { ZeitlichSharedActivities } from \"../activities\";\nimport { createTaskTool } from \"../tools/task/tool\";\nimport { createTaskHandler } from \"../tools/task/handler\";\nimport type { createTaskCreateHandler } from \"../tools/task-create/handler\";\nimport { bashTool, createBashToolDescription } from \"../tools/bash/tool\";\nimport { taskCreateTool } from \"../tools/task-create/tool\";\nimport type { handleBashTool } from \"../tools/bash/handler\";\n\nexport type { ToolMessageContent };\n\n// ============================================================================\n// Tool Definition Types (merged from tool-registry.ts)\n// ============================================================================\n\n/**\n * A tool definition with a name, description, and Zod schema for arguments.\n * Does not include a handler - use ToolWithHandler for tools with handlers.\n */\nexport interface ToolDefinition<\n TName extends string = string,\n TSchema extends z.ZodType = z.ZodType,\n> {\n name: TName;\n description: string;\n schema: TSchema;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * A tool definition with an integrated handler function.\n * This is the primary type for defining tools in the router.\n */\nexport interface ToolWithHandler<\n TName extends string = string,\n TSchema extends z.ZodType = z.ZodType,\n TResult = unknown,\n TContext = ToolHandlerContext,\n> {\n name: TName;\n description: string;\n schema: TSchema;\n handler: ToolHandler<z.infer<TSchema>, TResult, TContext>;\n strict?: boolean;\n max_uses?: number;\n /** Per-tool lifecycle hooks (run in addition to global hooks) */\n hooks?: ToolHooks<z.infer<TSchema>, TResult>;\n}\n\n/**\n * A map of tool keys to tool definitions with handlers.\n */\nexport type ToolMap = Record<\n string,\n {\n name: string;\n description: string;\n schema: z.ZodType;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n handler: (\n args: any,\n context: any\n ) => ToolHandlerResponse<any> | Promise<ToolHandlerResponse<any>>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n strict?: boolean;\n max_uses?: number;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n hooks?: ToolHooks<any, any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n>;\n\n/**\n * Converts a ToolMap to MessageStructure-compatible tools type.\n * Maps each tool's name to a MessageToolDefinition with inferred input type from the schema.\n */\nexport type ToolMapToMessageTools<T extends ToolMap> = {\n [K in keyof T as T[K][\"name\"]]: MessageToolDefinition<\n z.infer<T[K][\"schema\"]>\n >;\n};\n\n/**\n * Extract the tool names from a tool map (uses the tool's name property, not the key).\n */\nexport type ToolNames<T extends ToolMap> = T[keyof T][\"name\"];\n\n/**\n * A raw tool call as received from the LLM before parsing.\n */\nexport interface RawToolCall {\n id?: string;\n name: string;\n args: unknown;\n}\n\n/**\n * A parsed tool call with validated arguments for a specific tool.\n */\nexport interface ParsedToolCall<\n TName extends string = string,\n TArgs = unknown,\n> {\n id: string;\n name: TName;\n args: TArgs;\n}\n\n/**\n * Union type of all possible parsed tool calls from a tool map.\n */\nexport type ParsedToolCallUnion<T extends ToolMap> = {\n [K in keyof T]: ParsedToolCall<T[K][\"name\"], z.infer<T[K][\"schema\"]>>;\n}[keyof T];\n\n// ============================================================================\n// Handler Types\n// ============================================================================\n\n/**\n * Function signature for appending tool results to a thread.\n */\nexport type AppendToolResultFn = (config: ToolResultConfig) => Promise<void>;\n\n/**\n * The response from a tool handler.\n * Contains the content for the tool message and the result to return from processToolCalls.\n */\nexport interface ToolHandlerResponse<TResult> {\n /** Content sent back to the LLM as the tool call response */\n toolResponse: ToolMessageContent;\n /** Data returned to the workflow and hooks for further processing */\n data: TResult | null;\n}\n\n/**\n * Context passed to tool handlers for additional data beyond tool args.\n * Use this to pass workflow state like file trees, user context, etc.\n */\nexport interface ToolHandlerContext {\n /** Additional context data - define your own shape */\n [key: string]: unknown;\n}\n\nexport interface BuildInToolDefinitions {\n [bashTool.name]: typeof bashTool & {\n handler: ReturnType<typeof handleBashTool>;\n };\n [taskCreateTool.name]: typeof taskCreateTool & {\n handler: ReturnType<typeof createTaskCreateHandler>;\n };\n}\n\nexport const buildIntoolDefinitions: Record<\n keyof BuildInToolDefinitions,\n ToolDefinition\n> = {\n [bashTool.name]: bashTool,\n [taskCreateTool.name]: taskCreateTool,\n};\n\n/**\n * A handler function for a specific tool.\n * Receives the parsed args and context, returns a response with content and result.\n * Context always has a value (defaults to empty object if not provided).\n */\nexport type ToolHandler<TArgs, TResult, TContext = ToolHandlerContext> = (\n args: TArgs,\n context: TContext\n) => ToolHandlerResponse<TResult> | Promise<ToolHandlerResponse<TResult>>;\n\n/**\n * Activity-compatible tool handler that always returns a Promise.\n * Use this for tool handlers registered as Temporal activities.\n * Context always has a value (defaults to empty object if not provided).\n *\n * @example\n * ```typescript\n * // Filesystem handler with context\n * const readHandler: ActivityToolHandler<\n * ReadToolSchemaType,\n * ReadResult,\n * { scopedNodes: FileNode[]; provider: FileSystemProvider }\n * > = async (args, context) => {\n * return readHandler(args, context.scopedNodes, context.provider);\n * };\n * ```\n */\nexport type ActivityToolHandler<\n TArgs,\n TResult,\n TContext = ToolHandlerContext,\n> = (args: TArgs, context: TContext) => Promise<ToolHandlerResponse<TResult>>;\n\n/**\n * Extract the args type for a specific tool name from a tool map.\n */\nexport type ToolArgs<T extends ToolMap, TName extends ToolNames<T>> = z.infer<\n Extract<T[keyof T], { name: TName }>[\"schema\"]\n>;\n\n/**\n * Extract the result type for a specific tool name from a tool map.\n */\nexport type ToolResult<T extends ToolMap, TName extends ToolNames<T>> =\n Extract<T[keyof T], { name: TName }>[\"handler\"] extends ToolHandler<\n unknown,\n infer R,\n unknown\n >\n ? Awaited<R>\n : never;\n\n// ============================================================================\n// Tool Call Result Types\n// ============================================================================\n\n/**\n * The result of processing a tool call.\n */\nexport interface ToolCallResult<\n TName extends string = string,\n TResult = unknown,\n> {\n toolCallId: string;\n name: TName;\n data: TResult | null;\n}\n\n/**\n * Options for creating a tool router.\n */\nexport interface ToolRouterOptions<T extends ToolMap> {\n /** File tree for the agent */\n fileTree: string;\n /** Map of tools with their handlers */\n tools: T;\n /** Thread ID for appending tool results */\n threadId: string;\n /** Function to append tool results to the thread (called automatically after each handler) */\n appendToolResult: AppendToolResultFn;\n /** Whether to process tools in parallel (default: true) */\n parallel?: boolean;\n /** Lifecycle hooks for tool execution */\n hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>>;\n /** Subagent configurations */\n subagents?: SubagentConfig[];\n /** Build in tools - accepts raw handlers or proxied activities */\n buildInTools?: {\n [K in keyof BuildInToolDefinitions]?: BuildInToolDefinitions[K][\"handler\"];\n };\n}\n\n/**\n * Infer result types from a tool map based on handler return types.\n */\nexport type InferToolResults<T extends ToolMap> = {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n [K in keyof T as T[K][\"name\"]]: T[K][\"handler\"] extends ToolHandler<\n any,\n infer R,\n any\n >\n ? /* eslint-enable @typescript-eslint/no-explicit-any */\n Awaited<R>\n : never;\n};\n\n/**\n * Union of all possible tool call results based on handler return types.\n */\nexport type ToolCallResultUnion<TResults extends Record<string, unknown>> = {\n [TName in keyof TResults & string]: ToolCallResult<TName, TResults[TName]>;\n}[keyof TResults & string];\n\n/**\n * Context passed to processToolCalls for hook execution and handler invocation\n */\nexport interface ProcessToolCallsContext<THandlerContext = ToolHandlerContext> {\n /** Current turn number (for hooks) */\n turn?: number;\n /** Context passed to each tool handler (scopedNodes, provider, etc.) */\n handlerContext?: THandlerContext;\n}\n\n// ============================================================================\n// Router Interface\n// ============================================================================\n\n/**\n * The tool router interface with full type inference for both args and results.\n */\nexport interface ToolRouter<T extends ToolMap> {\n /** Check if the router has any tools */\n hasTools(): boolean;\n // --- Methods from registry ---\n\n /**\n * Parse and validate a raw tool call against the router's tools.\n * Returns a typed tool call with validated arguments.\n */\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T>;\n\n /**\n * Check if a tool with the given name exists in the router.\n */\n hasTool(name: string): boolean;\n\n /**\n * Get all tool names in the router.\n */\n getToolNames(): ToolNames<T>[];\n\n /**\n * Get all tool definitions (without handlers) for passing to LLM.\n */\n getToolDefinitions(): ToolDefinition[];\n\n // --- Methods for processing tool calls ---\n\n /**\n * Process all tool calls using the registered handlers.\n * Returns typed results based on handler return types.\n * @param toolCalls - Array of parsed tool calls to process\n * @param context - Optional context including turn number for hooks\n */\n processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResultUnion<InferToolResults<T>>[]>;\n\n /**\n * Process tool calls matching a specific name with a custom handler.\n * Useful for overriding the default handler for specific cases.\n */\n processToolCallsByName<\n TName extends ToolNames<T>,\n TResult,\n TContext = ToolHandlerContext,\n >(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult, TContext>,\n context?: ProcessToolCallsContext<TContext>\n ): Promise<ToolCallResult<TName, TResult>[]>;\n\n // --- Utility methods ---\n\n /**\n * Filter tool calls by name.\n */\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[];\n\n /**\n * Check if any tool call matches the given name.\n */\n hasToolCall(toolCalls: ParsedToolCallUnion<T>[], name: ToolNames<T>): boolean;\n\n /**\n * Filter results by tool name.\n */\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<InferToolResults<T>>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[];\n}\n\n// ============================================================================\n// Router Factory\n// ============================================================================\n\n/**\n * Creates a tool router for declarative tool call processing.\n * Combines tool definitions with handlers in a single API.\n *\n * @example\n * ```typescript\n * const router = createToolRouter({\n * threadId,\n * tools: {\n * Read: {\n * name: \"FileRead\",\n * description: \"Read file contents\",\n * schema: z.object({ path: z.string() }),\n * handler: async (args, ctx) => ({\n * content: `Read ${args.path}`,\n * result: { path: args.path, content: \"...\" },\n * }),\n * },\n * },\n * hooks: { onPreToolUse, onPostToolUse },\n * });\n *\n * // Parse raw tool calls from LLM\n * const parsed = router.parseToolCall(rawToolCall);\n *\n * // Process tool calls\n * const results = await router.processToolCalls([parsed]);\n * ```\n */\nexport function createToolRouter<T extends ToolMap>(\n options: ToolRouterOptions<T>\n): ToolRouter<T> {\n const { appendToolResult } = proxyActivities<ZeitlichSharedActivities>({\n startToCloseTimeout: \"2m\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n });\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\n // Use ToolMap's value type to allow both user tools and the dynamic Task tool\n const toolMap = new Map<string, ToolMap[string]>();\n for (const [_key, tool] of Object.entries(options.tools)) {\n toolMap.set(tool.name, tool as T[keyof T]);\n }\n\n if (options.subagents) {\n // Build per-subagent hook dispatcher keyed by subagent name\n const subagentHooksMap = new Map<string, SubagentHooks>();\n for (const s of options.subagents) {\n if (s.hooks) subagentHooksMap.set(s.name, s.hooks);\n }\n\n const resolveSubagentName = (args: unknown): string =>\n (args as GenericTaskToolSchemaType).subagent;\n\n toolMap.set(\"Task\", {\n ...createTaskTool(options.subagents),\n handler: createTaskHandler(options.subagents),\n ...(subagentHooksMap.size > 0 && {\n hooks: {\n onPreToolUse: async (ctx): Promise<PreToolUseHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onPreExecution?.(ctx) ?? {};\n },\n onPostToolUse: async (ctx): Promise<void> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n await hooks?.onPostExecution?.(ctx);\n },\n onPostToolUseFailure: async (\n ctx\n ): Promise<PostToolUseFailureHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onExecutionFailure?.(ctx) ?? {};\n },\n } satisfies ToolHooks,\n }),\n });\n }\n\n if (options.buildInTools) {\n for (const [key, value] of Object.entries(options.buildInTools)) {\n if (key === bashTool.name) {\n toolMap.set(key, {\n ...buildIntoolDefinitions[key as keyof BuildInToolDefinitions],\n description: createBashToolDescription({\n fileTree: options.fileTree,\n }),\n handler: value,\n });\n } else {\n toolMap.set(key, {\n ...buildIntoolDefinitions[key as keyof BuildInToolDefinitions],\n handler: value,\n });\n }\n }\n }\n\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n handlerContext?: ToolHandlerContext\n ): Promise<ToolCallResultUnion<TResults> | null> {\n const startTime = Date.now();\n const tool = toolMap.get(toolCall.name);\n const toolHooks = tool?.hooks;\n\n // --- PreToolUse: global then per-tool ---\n let effectiveArgs: unknown = toolCall.args;\n if (options.hooks?.onPreToolUse) {\n const preResult = await options.hooks.onPreToolUse({\n toolCall,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) {\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return null;\n }\n if (preResult?.modifiedArgs !== undefined) {\n effectiveArgs = preResult.modifiedArgs;\n }\n }\n if (toolHooks?.onPreToolUse) {\n const preResult = await toolHooks.onPreToolUse({\n args: effectiveArgs,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) {\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by tool PreToolUse hook\",\n }),\n });\n return null;\n }\n if (preResult?.modifiedArgs !== undefined) {\n effectiveArgs = preResult.modifiedArgs;\n }\n }\n\n // --- Execute handler ---\n let result: unknown;\n let content!: ToolMessageContent;\n\n try {\n if (tool) {\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n (handlerContext ?? {}) as Parameters<typeof tool.handler>[1]\n );\n result = response.data;\n content = response.toolResponse;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n // --- PostToolUseFailure: per-tool then global ---\n const err = error instanceof Error ? error : new Error(String(error));\n let recovered = false;\n\n if (toolHooks?.onPostToolUseFailure) {\n const failureResult = await toolHooks.onPostToolUseFailure({\n args: effectiveArgs,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (failureResult?.fallbackContent !== undefined) {\n content = failureResult.fallbackContent;\n result = { error: String(error), recovered: true };\n recovered = true;\n } else if (failureResult?.suppress) {\n content = JSON.stringify({ error: String(error), suppressed: true });\n result = { error: String(error), suppressed: true };\n recovered = true;\n }\n }\n\n if (!recovered && options.hooks?.onPostToolUseFailure) {\n const failureResult = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (failureResult?.fallbackContent !== undefined) {\n content = failureResult.fallbackContent;\n result = { error: String(error), recovered: true };\n recovered = true;\n } else if (failureResult?.suppress) {\n content = JSON.stringify({ error: String(error), suppressed: true });\n result = { error: String(error), suppressed: true };\n recovered = true;\n }\n }\n\n if (!recovered) {\n throw error;\n }\n }\n\n // Automatically append tool result to thread\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content,\n });\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n data: result,\n } as ToolCallResultUnion<TResults>;\n\n // --- PostToolUse: per-tool then global ---\n const durationMs = Date.now() - startTime;\n if (toolHooks?.onPostToolUse) {\n await toolHooks.onPostToolUse({\n args: effectiveArgs,\n result: result,\n threadId: options.threadId,\n turn,\n durationMs,\n });\n }\n if (options.hooks?.onPostToolUse) {\n await options.hooks.onPostToolUse({\n toolCall,\n result: toolResult,\n threadId: options.threadId,\n turn,\n durationMs,\n });\n }\n\n return toolResult;\n }\n\n return {\n // --- Methods from registry ---\n\n hasTools(): boolean {\n return toolMap.size > 0;\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n // Parse and validate args using the tool's schema\n const parsedArgs = tool.schema.parse(toolCall.args);\n\n return {\n id: toolCall.id ?? \"\",\n name: toolCall.name,\n args: parsedArgs,\n } as ParsedToolCallUnion<T>;\n },\n\n hasTool(name: string): boolean {\n return toolMap.has(name);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.keys()) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap).map(([name, tool]) => ({\n name,\n description: tool.description,\n schema: tool.schema,\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n // --- Methods for processing tool calls ---\n\n async processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResultUnion<TResults>[]> {\n if (toolCalls.length === 0) {\n return [];\n }\n\n const turn = context?.turn ?? 0;\n const handlerContext = context?.handlerContext;\n\n if (options.parallel) {\n const results = await Promise.all(\n toolCalls.map((tc) => processToolCall(tc, turn, handlerContext))\n );\n // Filter out null results (skipped tool calls)\n return results.filter(\n (r): r is NonNullable<typeof r> => r !== null\n ) as ToolCallResultUnion<TResults>[];\n }\n\n // Sequential processing\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const result = await processToolCall(toolCall, turn, handlerContext);\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n },\n\n async processToolCallsByName<\n TName extends ToolNames<T>,\n TResult,\n TContext = ToolHandlerContext,\n >(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult, TContext>,\n context?: ProcessToolCallsContext<TContext>\n ): Promise<ToolCallResult<TName, TResult>[]> {\n const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);\n\n if (matchingCalls.length === 0) {\n return [];\n }\n\n const handlerContext = (context?.handlerContext ?? {}) as TContext;\n\n const processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n handlerContext\n );\n\n // Automatically append tool result to thread\n await appendToolResult({\n threadId: options.threadId,\n toolCallId: toolCall.id,\n content: response.toolResponse,\n });\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n data: response.data ?? null,\n };\n };\n\n if (options.parallel) {\n return Promise.all(matchingCalls.map(processOne));\n }\n\n const results: ToolCallResult<TName, TResult>[] = [];\n for (const toolCall of matchingCalls) {\n results.push(await processOne(toolCall));\n }\n return results;\n },\n\n // --- Utility methods ---\n\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[] {\n return toolCalls.filter(\n (tc): tc is ParsedToolCall<TName, ToolArgs<T, TName>> =>\n tc.name === name\n );\n },\n\n hasToolCall(\n toolCalls: ParsedToolCallUnion<T>[],\n name: ToolNames<T>\n ): boolean {\n return toolCalls.some((tc) => tc.name === name);\n },\n\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<TResults>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[] {\n return results.filter((r) => r.name === name) as ToolCallResult<\n TName,\n ToolResult<T, TName>\n >[];\n },\n };\n}\n\n/**\n * Identity function that creates a generic inference context for a tool definition.\n * TypeScript infers TResult from the handler and flows it to hooks automatically.\n *\n * @example\n * ```typescript\n * tools: {\n * AskUser: defineTool({\n * ...askUserTool,\n * handler: handleAskUser,\n * hooks: {\n * onPostToolUse: ({ result }) => {\n * // result is correctly typed as the handler's return data type\n * },\n * },\n * }),\n * }\n * ```\n */\nexport function defineTool<\n TName extends string,\n TSchema extends z.ZodType,\n TResult,\n TContext = ToolHandlerContext,\n>(\n tool: ToolWithHandler<TName, TSchema, TResult, TContext>\n): ToolWithHandler<TName, TSchema, TResult, TContext> {\n return tool;\n}\n\n/**\n * Identity function that provides full type inference for subagent configurations.\n * Verifies the workflow function's input parameters match the configured context,\n * and properly types the lifecycle hooks with Task tool args and inferred result type.\n *\n * @example\n * ```ts\n * // With typed context — workflow must accept { prompt, context }\n * const researcher = defineSubagent({\n * name: \"researcher\",\n * description: \"Researches topics\",\n * workflow: researcherWorkflow, // (input: { prompt: string; context: { apiKey: string } }) => Promise<...>\n * context: { apiKey: \"...\" },\n * resultSchema: z.object({ findings: z.string() }),\n * hooks: {\n * onPostExecution: ({ result }) => {\n * // result is typed as { findings: string }\n * },\n * },\n * });\n *\n * // Without context — workflow only needs { prompt }\n * const writer = defineSubagent({\n * name: \"writer\",\n * description: \"Writes content\",\n * workflow: writerWorkflow, // (input: { prompt: string }) => Promise<...>\n * resultSchema: z.object({ content: z.string() }),\n * });\n * ```\n */\n// With context — verifies workflow accepts { prompt, context: TContext }\nexport function defineSubagent<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: Omit<SubagentConfig<TResult>, \"hooks\" | \"workflow\" | \"context\"> & {\n workflow:\n | string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | ((input: { prompt: string; context: TContext }) => Promise<any>);\n context: TContext;\n hooks?: SubagentHooks<GenericTaskToolSchemaType, z.infer<TResult>>;\n }\n): SubagentConfig<TResult>;\n// Without context — verifies workflow accepts { prompt }\nexport function defineSubagent<TResult extends z.ZodType = z.ZodType>(\n config: Omit<SubagentConfig<TResult>, \"hooks\" | \"workflow\"> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n workflow: string | ((input: { prompt: string }) => Promise<any>);\n hooks?: SubagentHooks<GenericTaskToolSchemaType, z.infer<TResult>>;\n }\n): SubagentConfig<TResult>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function defineSubagent(config: any): SubagentConfig {\n return config;\n}\n\n/**\n * Utility to check if there were no tool calls besides a specific one\n */\nexport function hasNoOtherToolCalls<T extends ToolMap>(\n toolCalls: ParsedToolCallUnion<T>[],\n excludeName: ToolNames<T>\n): boolean {\n return toolCalls.filter((tc) => tc.name !== excludeName).length === 0;\n}\n","import { proxyActivities } from \"@temporalio/workflow\";\nimport type { ZeitlichSharedActivities } from \"../activities\";\nimport type {\n ZeitlichAgentConfig,\n SessionStartHook,\n SessionEndHook,\n SessionExitReason,\n SubagentConfig,\n} from \"./types\";\nimport { type AgentStateManager, type JsonSerializable } from \"./state-manager\";\nimport {\n createToolRouter,\n type ParsedToolCall,\n type ParsedToolCallUnion,\n type RawToolCall,\n type ToolMap,\n} from \"./tool-router\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport { createTaskTool, type TaskToolSchemaType } from \"../tools/task/tool\";\n\nexport interface ZeitlichSession {\n runSession<T extends JsonSerializable<T>>(args: {\n stateManager: AgentStateManager<T>;\n }): Promise<StoredMessage | null>;\n}\n\nasync function resolvePrompt(\n prompt: string | (() => string | Promise<string>)\n): Promise<string> {\n if (typeof prompt === \"function\") {\n return prompt();\n }\n return prompt;\n}\n\n/**\n * Session-level hooks for lifecycle events\n */\nexport interface SessionLifecycleHooks {\n /** Called when session starts */\n onSessionStart?: SessionStartHook;\n /** Called when session ends */\n onSessionEnd?: SessionEndHook;\n}\n\nexport const createSession = async <T extends ToolMap>({\n threadId,\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n baseSystemPrompt,\n instructionsPrompt,\n buildContextMessage,\n buildFileTree = async (): Promise<string> => \"\",\n subagents,\n tools = {} as T,\n processToolsInParallel = true,\n buildInTools = {},\n hooks = {},\n}: ZeitlichAgentConfig<T>): Promise<ZeitlichSession> => {\n const {\n initializeThread,\n appendHumanMessage,\n parseToolCalls,\n appendToolResult,\n appendSystemMessage,\n } = proxyActivities<ZeitlichSharedActivities>({\n startToCloseTimeout: \"30m\",\n retry: {\n maximumAttempts: 6,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n heartbeatTimeout: \"5m\",\n });\n\n const fileTree = await buildFileTree();\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n hooks,\n buildInTools,\n fileTree,\n subagents,\n parallel: processToolsInParallel,\n });\n\n // Helper to call session end hook\n const callSessionEnd = async (\n exitReason: SessionExitReason,\n turns: number\n ): Promise<void> => {\n if (hooks.onSessionEnd) {\n await hooks.onSessionEnd({\n threadId,\n agentName,\n exitReason,\n turns,\n metadata,\n });\n }\n };\n\n return {\n runSession: async ({ stateManager }): Promise<StoredMessage | null> => {\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n stateManager.setTools(toolRouter.getToolDefinitions());\n\n await initializeThread(threadId);\n await appendSystemMessage(\n threadId,\n [\n await resolvePrompt(baseSystemPrompt),\n await resolvePrompt(instructionsPrompt),\n ].join(\"\\n\")\n );\n await appendHumanMessage(threadId, await buildContextMessage());\n\n let exitReason: SessionExitReason = \"completed\";\n\n try {\n while (\n stateManager.isRunning() &&\n !stateManager.isTerminal() &&\n stateManager.getTurns() < maxTurns\n ) {\n stateManager.incrementTurns();\n const currentTurn = stateManager.getTurns();\n\n const { message, stopReason } = await runAgent({\n threadId,\n agentName,\n metadata,\n });\n\n if (stopReason === \"end_turn\") {\n stateManager.complete();\n exitReason = \"completed\";\n return message;\n }\n\n // No tools configured - treat any non-end_turn as completed\n if (!toolRouter.hasTools()) {\n stateManager.complete();\n exitReason = \"completed\";\n return message;\n }\n\n const rawToolCalls: RawToolCall[] = await parseToolCalls(message);\n\n // Parse tool calls, catching schema errors and returning them to the agent\n const parsedToolCalls: ParsedToolCallUnion<T>[] = [];\n for (const tc of rawToolCalls.filter(\n (tc: RawToolCall) => tc.name !== \"Task\"\n )) {\n try {\n parsedToolCalls.push(toolRouter.parseToolCall(tc));\n } catch (error) {\n await appendToolResult({\n threadId,\n toolCallId: tc.id ?? \"\",\n content: JSON.stringify({\n error: `Invalid tool call for \"${tc.name}\": ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n }\n }\n\n const taskToolCalls: ParsedToolCall<\n \"Task\",\n TaskToolSchemaType<SubagentConfig[]>\n >[] = [];\n if (subagents && subagents.length > 0) {\n for (const tc of rawToolCalls.filter(\n (tc: RawToolCall) => tc.name === \"Task\"\n )) {\n try {\n const parsedArgs = createTaskTool(subagents).schema.parse(\n tc.args\n );\n taskToolCalls.push({\n id: tc.id ?? \"\",\n name: tc.name,\n args: parsedArgs,\n } as ParsedToolCall<\n \"Task\",\n TaskToolSchemaType<SubagentConfig[]>\n >);\n } catch (error) {\n await appendToolResult({\n threadId,\n toolCallId: tc.id ?? \"\",\n content: JSON.stringify({\n error: `Invalid tool call for \"Task\": ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n }\n }\n }\n\n // Hooks can call stateManager.waitForInput() to pause the session\n await toolRouter.processToolCalls(\n [...parsedToolCalls, ...taskToolCalls] as ParsedToolCallUnion<\n T & { Task: TaskToolSchemaType<SubagentConfig[]> }\n >[],\n {\n turn: currentTurn,\n }\n );\n\n if (stateManager.getStatus() === \"WAITING_FOR_INPUT\") {\n exitReason = \"waiting_for_input\";\n break;\n }\n }\n\n // Check if we hit max turns\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n }\n } catch (error) {\n exitReason = \"failed\";\n throw error;\n } finally {\n // SessionEnd hook - always called\n await callSessionEnd(exitReason, stateManager.getTurns());\n }\n\n return null;\n },\n };\n};\n","import type { ToolMessageContent } from \"./thread-manager\";\nimport type {\n BuildInToolDefinitions,\n InferToolResults,\n ParsedToolCallUnion,\n ToolCallResultUnion,\n ToolMap,\n} from \"./tool-router\";\n\nimport type { MessageContent, StoredMessage } from \"@langchain/core/messages\";\nimport type { Workflow } from \"@temporalio/workflow\";\nimport type { z } from \"zod\";\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"RUNNING\"\n | \"WAITING_FOR_INPUT\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\n/**\n * Base state that all agents must have\n */\nexport interface BaseAgentState {\n tools: SerializableToolDefinition[];\n status: AgentStatus;\n version: number;\n turns: number;\n tasks: Map<string, WorkflowTask>;\n}\n\n/**\n * File representation for agent workflows\n */\nexport interface AgentFile {\n /** Database/S3 file ID */\n id: string;\n /** Virtual path for agent (e.g., \"evidence/invoice.pdf\") */\n path: string;\n /** Original filename */\n filename: string;\n /** Generic description for prompt */\n description?: string;\n /** MIME type of the file */\n mimeType?: string;\n}\n\n/**\n * Agent response from LLM invocation\n */\nexport interface AgentResponse {\n message: StoredMessage;\n stopReason: string | null;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n };\n}\n\n/**\n * Configuration for a Zeitlich agent session\n */\nexport interface ZeitlichAgentConfig<T extends ToolMap> {\n buildFileTree?: () => Promise<string>;\n threadId: string;\n agentName: string;\n metadata?: Record<string, unknown>;\n maxTurns?: number;\n /** Workflow-specific runAgent activity (with tools pre-bound) */\n runAgent: RunAgentActivity;\n /** Tool router for processing tool calls (optional if agent has no tools) */\n tools?: T;\n /** Subagent configurations */\n subagents?: SubagentConfig[];\n /** Session lifecycle hooks */\n hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>>;\n /** Whether to process tools in parallel */\n processToolsInParallel?: boolean;\n /**\n * Base system prompt (e.g., Auditron identity).\n * Can be a static string or async function.\n */\n baseSystemPrompt: string | (() => string | Promise<string>);\n /**\n * Agent-specific instructions prompt.\n * Can be a static string or async function.\n */\n instructionsPrompt: string | (() => string | Promise<string>);\n /**\n * Build context message content from agent-specific context.\n * Returns MessageContent array for the initial HumanMessage.\n */\n buildContextMessage: () => MessageContent | Promise<MessageContent>;\n /**\n * Build in tools - accepts raw handlers or proxied activities\n */\n buildInTools?: {\n [K in keyof BuildInToolDefinitions]?: BuildInToolDefinitions[K][\"handler\"];\n };\n}\n\n/**\n * A JSON-serializable tool definition for state storage.\n * Uses a plain JSON Schema object instead of a live Zod instance,\n * so it survives Temporal serialization without losing constraints (min, max, etc.).\n */\nexport interface SerializableToolDefinition {\n name: string;\n description: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * Configuration passed to runAgent activity\n */\nexport interface RunAgentConfig {\n threadId: string;\n agentName: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Type signature for workflow-specific runAgent activity\n */\nexport type RunAgentActivity = (\n config: RunAgentConfig\n) => Promise<AgentResponse>;\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n toolCallId: string;\n /** Content for the tool message (string or complex content parts) */\n content: ToolMessageContent;\n}\n\n// ============================================================================\n// Subagent Configuration\n// ============================================================================\n\n/**\n * Configuration for a subagent that can be spawned by the parent workflow.\n *\n * @template TResult - Zod schema type for validating the child workflow's result\n */\nexport interface SubagentConfig<TResult extends z.ZodType = z.ZodType> {\n /** Identifier used in Task tool's subagent parameter */\n name: string;\n /** Description shown to the parent agent explaining what this subagent does */\n description: string;\n /** Temporal workflow function or type name (used with executeChild) */\n workflow: string | Workflow;\n /** Optional task queue - defaults to parent's queue if not specified */\n taskQueue?: string;\n /** Optional Zod schema to validate the child workflow's result. If omitted, result is passed through as-is. */\n resultSchema?: TResult;\n /** Optional static context passed to the subagent on every invocation */\n context?: Record<string, unknown>;\n /** Per-subagent lifecycle hooks */\n hooks?: SubagentHooks;\n}\n\n/**\n * Per-subagent lifecycle hooks - defined on a SubagentConfig.\n * Runs in addition to global hooks (global pre → subagent pre → execute → subagent post → global post).\n */\nexport interface SubagentHooks<TArgs = unknown, TResult = unknown> {\n /** Called before this subagent executes - can skip or modify args */\n onPreExecution?: (ctx: {\n args: TArgs;\n threadId: string;\n turn: number;\n }) => PreToolUseHookResult | Promise<PreToolUseHookResult>;\n /** Called after this subagent executes successfully */\n onPostExecution?: (ctx: {\n args: TArgs;\n result: TResult;\n threadId: string;\n turn: number;\n durationMs: number;\n }) => void | Promise<void>;\n /** Called when this subagent execution fails */\n onExecutionFailure?: (ctx: {\n args: TArgs;\n error: Error;\n threadId: string;\n turn: number;\n }) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;\n}\n\n/**\n * Input passed to child workflows when spawned as subagents\n */\nexport interface SubagentInput {\n /** The prompt/task from the parent agent */\n prompt: string;\n /** Optional context parameters passed from the parent agent */\n context?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Workflow Tasks\n// ============================================================================\n\n/**\n * Status of a workflow task\n */\nexport type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A task managed within a workflow for tracking work items\n */\nexport interface WorkflowTask {\n /** Unique task identifier */\n id: string;\n /** Brief, actionable title in imperative form */\n subject: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Present continuous form shown in spinner when in_progress */\n activeForm: string;\n /** Current status of the task */\n status: TaskStatus;\n /** Arbitrary key-value pairs for tracking */\n metadata: Record<string, string>;\n /** IDs of tasks that must complete before this one can start */\n blockedBy: string[];\n /** IDs of tasks that are waiting for this one to complete */\n blocks: string[];\n}\n\n// ============================================================================\n// Session Lifecycle Hooks\n// ============================================================================\n\n/**\n * Exit reasons for session termination\n */\nexport type SessionExitReason =\n | \"completed\"\n | \"max_turns\"\n | \"waiting_for_input\"\n | \"failed\"\n | \"cancelled\";\n\n/**\n * Context for PreToolUse hook - called before tool execution\n */\nexport interface PreToolUseHookContext<T extends ToolMap> {\n /** The tool call about to be executed */\n toolCall: ParsedToolCallUnion<T>;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n}\n\n/**\n * Result from PreToolUse hook - can block or modify execution\n */\nexport interface PreToolUseHookResult {\n /** Skip this tool call entirely */\n skip?: boolean;\n /** Modified args to use instead (must match schema) */\n modifiedArgs?: unknown;\n}\n\n/**\n * PreToolUse hook - called before tool execution, can block or modify\n */\nexport type PreToolUseHook<T extends ToolMap> = (\n ctx: PreToolUseHookContext<T>\n) => PreToolUseHookResult | Promise<PreToolUseHookResult>;\n\n/**\n * Context for PostToolUse hook - called after successful tool execution\n */\nexport interface PostToolUseHookContext<T extends ToolMap, TResult = unknown> {\n /** The tool call that was executed */\n toolCall: ParsedToolCallUnion<T>;\n /** The result from the tool handler */\n result: TResult;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * PostToolUse hook - called after successful tool execution\n */\nexport type PostToolUseHook<T extends ToolMap, TResult = unknown> = (\n ctx: PostToolUseHookContext<T, TResult>\n) => void | Promise<void>;\n\n/**\n * Context for PostToolUseFailure hook - called when tool execution fails\n */\nexport interface PostToolUseFailureHookContext<T extends ToolMap> {\n /** The tool call that failed */\n toolCall: ParsedToolCallUnion<T>;\n /** The error that occurred */\n error: Error;\n /** Thread identifier */\n threadId: string;\n /** Current turn number */\n turn: number;\n}\n\n/**\n * Result from PostToolUseFailure hook - can recover from errors\n */\nexport interface PostToolUseFailureHookResult {\n /** Provide a fallback result instead of throwing */\n fallbackContent?: ToolMessageContent;\n /** Whether to suppress the error (still logs, but continues) */\n suppress?: boolean;\n}\n\n/**\n * PostToolUseFailure hook - called when tool execution fails\n */\nexport type PostToolUseFailureHook<T extends ToolMap> = (\n ctx: PostToolUseFailureHookContext<T>\n) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;\n\n/**\n * Context for SessionStart hook - called when session begins\n */\nexport interface SessionStartHookContext {\n /** Thread identifier */\n threadId: string;\n /** Name of the agent */\n agentName: string;\n /** Session metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * SessionStart hook - called when session begins\n */\nexport type SessionStartHook = (\n ctx: SessionStartHookContext\n) => void | Promise<void>;\n\n/**\n * Context for SessionEnd hook - called when session ends\n */\nexport interface SessionEndHookContext {\n /** Thread identifier */\n threadId: string;\n /** Name of the agent */\n agentName: string;\n /** Reason the session ended */\n exitReason: SessionExitReason;\n /** Total turns executed */\n turns: number;\n /** Session metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * SessionEnd hook - called when session ends\n */\nexport type SessionEndHook = (\n ctx: SessionEndHookContext\n) => void | Promise<void>;\n\n/**\n * Per-tool lifecycle hooks - defined directly on a tool definition.\n * Runs in addition to global hooks (global pre → tool pre → execute → tool post → global post).\n */\nexport interface ToolHooks<TArgs = unknown, TResult = unknown> {\n /** Called before this tool executes - can skip or modify args */\n onPreToolUse?: (ctx: {\n args: TArgs;\n threadId: string;\n turn: number;\n }) => PreToolUseHookResult | Promise<PreToolUseHookResult>;\n /** Called after this tool executes successfully */\n onPostToolUse?: (ctx: {\n args: TArgs;\n result: TResult | null;\n threadId: string;\n turn: number;\n durationMs: number;\n }) => void | Promise<void>;\n /** Called when this tool execution fails */\n onPostToolUseFailure?: (ctx: {\n args: TArgs;\n error: Error;\n threadId: string;\n turn: number;\n }) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;\n}\n\n/**\n * Combined hooks interface for session lifecycle\n */\nexport interface Hooks<T extends ToolMap, TResult = unknown> {\n /** Called before each tool execution - can block or modify */\n onPreToolUse?: PreToolUseHook<T>;\n /** Called after each successful tool execution */\n onPostToolUse?: PostToolUseHook<T, TResult>;\n /** Called when tool execution fails */\n onPostToolUseFailure?: PostToolUseFailureHook<T>;\n /** Called when session starts */\n onSessionStart?: SessionStartHook;\n /** Called when session ends */\n onSessionEnd?: SessionEndHook;\n}\n\n/**\n * Helper to check if status is terminal\n */\nexport function isTerminalStatus(status: AgentStatus): boolean {\n return (\n status === \"COMPLETED\" || status === \"FAILED\" || status === \"CANCELLED\"\n );\n}\n","import { defineQuery, setHandler } from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"./types\";\nimport type { ToolDefinition } from \"./tool-router\";\nimport { z } from \"zod\";\n\n/**\n * JSON primitive types that Temporal can serialize\n */\nexport type JsonPrimitive = string | number | boolean | null | undefined;\n\n/**\n * JSON-serializable value (recursive type for Temporal compatibility)\n */\nexport type JsonValue =\n | JsonPrimitive\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/**\n * Type constraint ensuring T only contains JSON-serializable values.\n * Use this for custom state to ensure Temporal workflow compatibility.\n *\n * Allows: primitives, arrays, plain objects, and JsonValue\n * Rejects: functions, symbols, undefined, class instances with methods\n */\nexport type JsonSerializable<T> = {\n [K in keyof T]: T[K] extends JsonValue\n ? T[K]\n : T[K] extends JsonPrimitive\n ? T[K]\n : T[K] extends (infer U)[]\n ? U extends JsonValue\n ? T[K]\n : JsonSerializable<U>[]\n : T[K] extends object\n ? JsonSerializable<T[K]>\n : never;\n};\n\n/**\n * Full state type combining base state with custom state\n */\nexport type AgentState<TCustom extends JsonSerializable<TCustom>> =\n BaseAgentState & TCustom;\n\n/**\n * Agent state manager interface\n * Note: Temporal handlers must be set up in the workflow file due to\n * Temporal's workflow isolation requirements. This manager provides\n * the state and helpers needed for those handlers.\n */\nexport interface AgentStateManager<TCustom extends JsonSerializable<TCustom>> {\n /** Get current status */\n getStatus(): AgentStatus;\n /** Check if agent is running */\n isRunning(): boolean;\n /** Check if agent is in terminal state */\n isTerminal(): boolean;\n /** Get current state version */\n getVersion(): number;\n\n /** Set status to RUNNING */\n run(): void;\n /** Set status to WAITING_FOR_INPUT */\n waitForInput(): void;\n /** Set status to COMPLETED */\n complete(): void;\n /** Set status to FAILED */\n fail(): void;\n /** Set status to CANCELLED */\n cancel(): void;\n\n /** Increment state version (call after state changes) */\n incrementVersion(): void;\n\n /** Increment turns (call after each turn) */\n incrementTurns(): void;\n\n /** Get current turns */\n getTurns(): number;\n\n /** Get a custom state value by key */\n get<K extends keyof TCustom>(key: K): TCustom[K];\n\n /** Set a custom state value by key */\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void;\n\n /** Get full state for query handler */\n getCurrentState(): AgentState<TCustom>;\n\n /** Check if should return from waitForStateChange */\n shouldReturnFromWait(lastKnownVersion: number): boolean;\n\n // Task management methods\n /** Get all tasks */\n getTasks(): WorkflowTask[];\n /** Get a task by ID */\n getTask(id: string): WorkflowTask | undefined;\n /** Add or update a task */\n setTask(task: WorkflowTask): void;\n /** Delete a task by ID */\n deleteTask(id: string): boolean;\n\n /** Set the tools (converts Zod schemas to JSON Schema for serialization) */\n setTools(newTools: ToolDefinition[]): void;\n}\n\nexport const getStateQuery = defineQuery<BaseAgentState>(\"getState\");\n\n/**\n * Creates an agent state manager for tracking workflow state.\n *\n * @param initialState - Optional initial values for base and custom state\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty, fileTree=[]\n *\n * Note: Due to Temporal's workflow isolation, handlers must be set up\n * in the workflow file using defineQuery/defineUpdate and setHandler.\n * This manager provides the state and logic needed for those handlers.\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>(\n initialState?: Partial<BaseAgentState> & TCustom\n): AgentStateManager<TCustom> {\n // Default state (BaseAgentState fields)\n let status: AgentStatus = initialState?.status ?? \"RUNNING\";\n let version = initialState?.version ?? 0;\n let turns = initialState?.turns ?? 0;\n let tools = initialState?.tools ?? [];\n\n // Tasks state\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\n // Custom state - extract only custom fields (exclude base state keys)\n const {\n status: _,\n version: __,\n turns: ___,\n tasks: ____,\n tools: _____,\n ...custom\n } = initialState ?? {};\n const customState = custom as TCustom;\n\n function buildState(): AgentState<TCustom> {\n return {\n status,\n version,\n turns,\n tools,\n ...customState,\n } as AgentState<TCustom>;\n }\n\n setHandler(getStateQuery, () => {\n return buildState();\n });\n\n return {\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n isTerminal(): boolean {\n return isTerminalStatus(status);\n },\n\n getTurns(): number {\n return turns;\n },\n\n getVersion(): number {\n return version;\n },\n\n run(): void {\n status = \"RUNNING\";\n version++;\n },\n\n waitForInput(): void {\n status = \"WAITING_FOR_INPUT\";\n version++;\n },\n\n complete(): void {\n status = \"COMPLETED\";\n version++;\n },\n\n fail(): void {\n status = \"FAILED\";\n version++;\n },\n\n cancel(): void {\n status = \"CANCELLED\";\n version++;\n },\n\n incrementVersion(): void {\n version++;\n },\n\n incrementTurns(): void {\n turns++;\n },\n\n get<K extends keyof TCustom>(key: K): TCustom[K] {\n return customState[key];\n },\n\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void {\n customState[key] = value;\n version++;\n },\n\n getCurrentState(): AgentState<TCustom> {\n return buildState();\n },\n\n shouldReturnFromWait(lastKnownVersion: number): boolean {\n return version > lastKnownVersion || isTerminalStatus(status);\n },\n\n getTasks(): WorkflowTask[] {\n return Array.from(tasks.values());\n },\n\n getTask(id: string): WorkflowTask | undefined {\n return tasks.get(id);\n },\n\n setTask(task: WorkflowTask): void {\n tasks.set(task.id, task);\n version++;\n },\n\n setTools(newTools: ToolDefinition[]): void {\n tools = newTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n schema: z.toJSONSchema(tool.schema) as Record<string, unknown>,\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n deleteTask(id: string): boolean {\n const deleted = tasks.delete(id);\n if (deleted) {\n version++;\n }\n return deleted;\n },\n };\n}\n\n/**\n * Handler names used across agents\n */\nexport const AGENT_HANDLER_NAMES = {\n getAgentState: \"getAgentState\",\n waitForStateChange: \"waitForStateChange\",\n addMessage: \"addMessage\",\n} as const;\n","import z from \"zod\";\n\nexport const askUserQuestionTool = {\n name: \"AskUserQuestion\" as const,\n description: `Use this tool when you need to ask the user questions during execution. This allows you to:\n\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nUsage notes:\n\n* Users will always be able to select \"Other\" to provide custom text input\n* Use multiSelect: true to allow multiple answers to be selected for a question\n* If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label\n`,\n schema: z.object({\n questions: z.array(\n z.object({\n question: z.string().describe(\"The full question text to display\"),\n header: z\n .string()\n .describe(\"Short label for the question (max 12 characters)\"),\n options: z\n .array(\n z.object({\n label: z.string(),\n description: z.string(),\n })\n )\n .min(0)\n .max(4)\n .describe(\"Array of 0-4 choices, each with label and description\"),\n multiSelect: z\n .boolean()\n .describe(\"If true, users can select multiple options\"),\n })\n ),\n }),\n strict: true,\n};\n\nexport type AskUserQuestionToolSchemaType = z.infer<\n typeof askUserQuestionTool.schema\n>;\n","import { z } from \"zod\";\n\nexport const globTool = {\n name: \"Glob\" as const,\n description: `Search for files matching a glob pattern within the available file system.\n\nUsage:\n- Use glob patterns like \"**/*.ts\" to find all TypeScript files\n- Use \"docs/**\" to find all files in the docs directory\n- Patterns are matched against virtual paths in the file system\n\nExamples:\n- \"*.md\" - Find all markdown files in the root\n- \"**/*.test.ts\" - Find all test files recursively\n- \"src/**/*.ts\" - Find all TypeScript files in src directory\n`,\n schema: z.object({\n pattern: z.string().describe(\"Glob pattern to match files against\"),\n root: z\n .string()\n .optional()\n .describe(\"Optional root directory to search from\"),\n }),\n strict: true,\n};\n\nexport type GlobToolSchemaType = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\n\nexport const grepTool = {\n name: \"Grep\" as const,\n description: `Search file contents for a pattern within the available file system.\n\nUsage:\n- Searches for a regex pattern across file contents\n- Returns matching lines with file paths and line numbers\n- Can filter by file patterns and limit results\n\nExamples:\n- Search for \"TODO\" in all files\n- Search for function definitions with \"function.*handleClick\"\n- Search case-insensitively with ignoreCase: true\n`,\n schema: z.object({\n pattern: z\n .string()\n .describe(\"Regex pattern to search for in file contents\"),\n ignoreCase: z\n .boolean()\n .optional()\n .describe(\"Case-insensitive search (default: false)\"),\n maxMatches: z\n .number()\n .optional()\n .describe(\"Maximum number of matches to return (default: 50)\"),\n includePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to include (e.g., ['*.ts', '*.js'])\"),\n excludePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to exclude (e.g., ['*.test.ts'])\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of context lines to show around matches\"),\n }),\n strict: true,\n};\n\nexport type GrepToolSchemaType = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\n\nexport const readTool = {\n name: \"FileRead\" as const,\n description: `Read file contents with optional pagination.\n\nUsage:\n- Provide the virtual path to the file you want to read\n- Supports text files, images, and PDFs\n- For large files, use offset and limit to read specific portions\n\nThe tool returns the file content in an appropriate format:\n- Text files: Plain text content\n- Images: Base64-encoded image data\n- PDFs: Extracted text content\n`,\n schema: z.object({\n path: z.string().describe(\"Virtual path to the file to read\"),\n offset: z\n .number()\n .optional()\n .describe(\n \"Line number to start reading from (1-indexed, for text files)\"\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of lines to read (for text files)\"),\n }),\n strict: true,\n};\n\nexport type ReadToolSchemaType = z.infer<typeof readTool.schema>;\n","import { z } from \"zod\";\n\nexport const writeTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\n- Provide the absolute virtual path to the file\n- The file will be created if it doesn't exist\n- If the file exists, it will be completely overwritten\n\nIMPORTANT:\n- You must read the file first (in this session) before writing to it\n- This is an atomic write operation - the entire file is replaced\n- Path must be absolute (e.g., \"/docs/readme.md\", not \"docs/readme.md\")\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n};\n\nexport type WriteToolSchemaType = z.infer<typeof writeTool.schema>;\n","import { z } from \"zod\";\n\nexport const editTool = {\n name: \"FileEdit\" as const,\n description: `Edit specific sections of a file by replacing text.\n\nUsage:\n- Provide the exact text to find and replace\n- The old_string must match exactly (whitespace-sensitive)\n- By default, only replaces the first occurrence\n- Use replace_all: true to replace all occurrences\n\nIMPORTANT:\n- You must read the file first (in this session) before editing it\n- old_string must be unique in the file (unless using replace_all)\n- The operation fails if old_string is not found\n- old_string and new_string must be different\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to modify\"),\n old_string: z.string().describe(\"The exact text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\"\n ),\n replace_all: z\n .boolean()\n .optional()\n .describe(\n \"If true, replace all occurrences of old_string (default: false)\"\n ),\n }),\n strict: true,\n};\n\nexport type EditToolSchemaType = z.infer<typeof editTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskCreateToolSchemaType } from \"./tool\";\nimport { uuid4 } from \"@temporalio/workflow\";\n\n/**\n * Creates a TaskCreate handler that adds tasks to the workflow state.\n *\n * @param stateManager - State manager containing tasks state\n * @param idGenerator - Function to generate unique task IDs (e.g., uuid4 from Temporal)\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskCreateHandler(stateManager, uuid4);\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): (args: TaskCreateToolSchemaType) => ToolHandlerResponse<WorkflowTask> {\n return (\n args: TaskCreateToolSchemaType\n ): ToolHandlerResponse<WorkflowTask> => {\n const task: WorkflowTask = {\n id: uuid4(),\n subject: args.subject,\n description: args.description,\n activeForm: args.activeForm,\n status: \"pending\",\n metadata: args.metadata ?? {},\n blockedBy: [],\n blocks: [],\n };\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskGetTool = {\n name: \"TaskGet\" as const,\n description: `Retrieve full task details including dependencies.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n }),\n};\n\nexport type TaskGetToolSchemaType = z.infer<typeof taskGetTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskGet handler that retrieves a task by ID.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskGetHandler(stateManager);\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): (args: TaskGetToolSchemaType) => ToolHandlerResponse<WorkflowTask | null> {\n return (\n args: TaskGetToolSchemaType\n ): ToolHandlerResponse<WorkflowTask | null> => {\n const task = stateManager.getTask(args.taskId) ?? null;\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({ error: `Task not found: ${args.taskId}` }),\n data: null,\n };\n }\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n};\n\nexport type TaskListToolSchemaType = z.infer<typeof taskListTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskList handler that returns all tasks.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskListHandler(stateManager);\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): (args: TaskListToolSchemaType) => ToolHandlerResponse<WorkflowTask[]> {\n return (\n _args: TaskListToolSchemaType\n ): ToolHandlerResponse<WorkflowTask[]> => {\n const taskList = stateManager.getTasks();\n\n return {\n toolResponse: JSON.stringify(taskList, null, 2),\n data: taskList,\n };\n };\n}\n","import z from \"zod\";\n\nexport const taskUpdateTool = {\n name: \"TaskUpdate\" as const,\n description: `Update status, add blockers, modify details.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"The status of the task\"),\n addBlockedBy: z\n .array(z.string())\n .describe(\"The IDs of the tasks that are blocking this task\"),\n addBlocks: z\n .array(z.string())\n .describe(\"The IDs of the tasks that this task is blocking\"),\n }),\n};\n\nexport type TaskUpdateToolSchemaType = z.infer<typeof taskUpdateTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state-manager\";\nimport type { ToolHandlerResponse } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateToolSchemaType } from \"./tool\";\n\n/**\n * Creates a TaskUpdate handler that modifies task status and dependencies.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A tool handler function\n *\n * @example\n * const handler = createTaskUpdateHandler(stateManager);\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): (\n args: TaskUpdateToolSchemaType\n) => ToolHandlerResponse<WorkflowTask | null> {\n return (\n args: TaskUpdateToolSchemaType\n ): ToolHandlerResponse<WorkflowTask | null> => {\n const task = stateManager.getTask(args.taskId);\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({ error: `Task not found: ${args.taskId}` }),\n data: null,\n };\n }\n\n // Update status if provided\n if (args.status) {\n task.status = args.status;\n }\n\n // Add blockedBy relationships (bidirectional)\n if (args.addBlockedBy) {\n for (const blockerId of args.addBlockedBy) {\n if (!task.blockedBy.includes(blockerId)) {\n task.blockedBy.push(blockerId);\n }\n // Update the blocker task's blocks array\n const blockerTask = stateManager.getTask(blockerId);\n if (blockerTask && !blockerTask.blocks.includes(task.id)) {\n blockerTask.blocks.push(task.id);\n stateManager.setTask(blockerTask);\n }\n }\n }\n\n // Add blocks relationships (bidirectional)\n if (args.addBlocks) {\n for (const blockedId of args.addBlocks) {\n if (!task.blocks.includes(blockedId)) {\n task.blocks.push(blockedId);\n }\n // Update the blocked task's blockedBy array\n const blockedTask = stateManager.getTask(blockedId);\n if (blockedTask && !blockedTask.blockedBy.includes(task.id)) {\n blockedTask.blockedBy.push(task.id);\n stateManager.setTask(blockedTask);\n }\n }\n }\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","import crypto from 'node:crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import crypto from 'node:crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import type Redis from \"ioredis\";\n\nimport {\n type $InferMessageContent,\n AIMessage,\n HumanMessage,\n type MessageContent,\n type MessageStructure,\n type StoredMessage,\n SystemMessage,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Content for a tool message response.\n * Can be a simple string or complex content parts (text, images, cache points, etc.)\n */\nexport type ToolMessageContent = $InferMessageContent<MessageStructure, \"tool\">;\n\nexport interface ThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n}\n\nexport interface ThreadManager {\n /** Append a system message to the thread */\n appendSystemMessage(content: string): Promise<void>;\n /** Initialize an empty thread */\n initialize(): Promise<void>;\n /** Load all messages from the thread */\n load(): Promise<StoredMessage[]>;\n /** Append messages to the thread */\n append(messages: StoredMessage[]): Promise<void>;\n /** Delete the thread */\n delete(): Promise<void>;\n\n /** Create a SystemMessage (returns StoredMessage for storage) */\n createSystemMessage(content: string): StoredMessage;\n\n /** Create a HumanMessage (returns StoredMessage for storage) */\n createHumanMessage(content: string | MessageContent): StoredMessage;\n\n /** Create an AIMessage with optional additional kwargs */\n createAIMessage(\n content: string | MessageContent,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean }\n ): StoredMessage;\n\n /** Create a ToolMessage */\n createToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): StoredMessage;\n\n /** Create and append a HumanMessage */\n appendHumanMessage(content: string | MessageContent): Promise<void>;\n /** Create and append a ToolMessage */\n appendToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): Promise<void>;\n /** Create and append an AIMessage */\n appendAIMessage(content: string | MessageContent): Promise<void>;\n}\n\n/**\n * Creates a thread manager for handling conversation state in Redis.\n */\nexport function createThreadManager(\n config: ThreadManagerConfig\n): ThreadManager {\n const { redis, threadId, key = \"messages\" } = config;\n const redisKey = getThreadKey(threadId, key);\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n },\n\n async load(): Promise<StoredMessage[]> {\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map((item) => JSON.parse(item) as StoredMessage);\n },\n\n async append(messages: StoredMessage[]): Promise<void> {\n if (messages.length > 0) {\n await redis.rpush(redisKey, ...messages.map((m) => JSON.stringify(m)));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey);\n },\n\n createHumanMessage(content: string | MessageContent): StoredMessage {\n return new HumanMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createAIMessage(\n content: string,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean }\n ): StoredMessage {\n return new AIMessage({\n id: uuidv4(),\n content,\n additional_kwargs: kwargs\n ? {\n header: kwargs.header,\n options: kwargs.options,\n multiSelect: kwargs.multiSelect,\n }\n : undefined,\n }).toDict();\n },\n\n createToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): StoredMessage {\n return new ToolMessage({\n // Cast needed due to langchain type compatibility\n content: content as MessageContent,\n tool_call_id: toolCallId,\n }).toDict();\n },\n\n createSystemMessage(content: string): StoredMessage {\n return new SystemMessage({\n content,\n }).toDict();\n },\n\n async appendSystemMessage(content: string): Promise<void> {\n const message = this.createSystemMessage(content);\n await this.append([message]);\n },\n\n async appendHumanMessage(content: string | MessageContent): Promise<void> {\n const message = this.createHumanMessage(content);\n await this.append([message]);\n },\n\n async appendToolMessage(\n content: ToolMessageContent,\n toolCallId: string\n ): Promise<void> {\n const message = this.createToolMessage(content, toolCallId);\n await this.append([message]);\n },\n\n async appendAIMessage(content: string | MessageContent): Promise<void> {\n const message = this.createAIMessage(content);\n await this.append([message]);\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport { createThreadManager } from \"./lib/thread-manager\";\nimport type { ToolResultConfig } from \"./lib/types\";\nimport {\n type AIMessage,\n mapStoredMessageToChatMessage,\n type MessageContent,\n type StoredMessage,\n} from \"@langchain/core/messages\";\nimport type { RawToolCall } from \"./lib/tool-router\";\n/**\n * Shared Zeitlich activities - thread management and message handling\n * Note: runAgent is workflow-specific and should be created per-workflow\n */\nexport interface ZeitlichSharedActivities {\n appendSystemMessage(threadId: string, content: string): Promise<void>;\n /**\n * Append a tool result to the thread.\n * Handles JSON serialization and optional cache points.\n */\n appendToolResult(config: ToolResultConfig): Promise<void>;\n\n /**\n * Initialize an empty thread.\n */\n initializeThread(threadId: string): Promise<void>;\n\n /**\n * Append a system message to a thread.\n */\n appendSystemMessage(threadId: string, content: string): Promise<void>;\n\n /**\n * Append messages to a thread.\n */\n appendThreadMessages(\n threadId: string,\n messages: StoredMessage[]\n ): Promise<void>;\n\n /**\n * Append a human message to a thread.\n */\n appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void>;\n\n /**\n * Extract raw tool calls from a stored message.\n * Returns unvalidated tool calls - use toolRegistry.parseToolCall() to validate.\n */\n parseToolCalls(storedMessage: StoredMessage): Promise<RawToolCall[]>;\n}\n\n/**\n * Creates shared Temporal activities for thread management\n *\n * @returns An object containing the shared activity functions\n *\n * @experimental The Zeitlich integration is an experimental feature; APIs may change without notice.\n */\nexport function createSharedActivities(redis: Redis): ZeitlichSharedActivities {\n return {\n async appendSystemMessage(\n threadId: string,\n content: string\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.appendSystemMessage(content);\n },\n\n async appendToolResult(config: ToolResultConfig): Promise<void> {\n const { threadId, toolCallId, content } = config;\n const thread = createThreadManager({ redis, threadId });\n\n await thread.appendToolMessage(content, toolCallId);\n },\n\n async initializeThread(threadId: string): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.initialize();\n },\n\n async appendThreadMessages(\n threadId: string,\n messages: StoredMessage[]\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.append(messages);\n },\n\n async appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void> {\n const thread = createThreadManager({ redis, threadId });\n await thread.appendHumanMessage(content);\n },\n\n async parseToolCalls(storedMessage: StoredMessage): Promise<RawToolCall[]> {\n const message = mapStoredMessageToChatMessage(storedMessage) as AIMessage;\n const toolCalls = message.tool_calls ?? [];\n\n return toolCalls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }));\n },\n };\n}\n","import { SimplePlugin } from \"@temporalio/plugin\";\nimport { createSharedActivities } from \"./activities\";\nimport type Redis from \"ioredis\";\n\n/**\n * Options for the Zeitlich plugin\n *\n * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.\n */\nexport interface ZeitlichPluginOptions {\n redis: Redis;\n}\n\n/**\n * A Temporal plugin that integrates Zeitlich for use in workflows.\n * This plugin creates shared activities for thread management.\n * Workflow-specific activities (like runAgent) should be created separately.\n *\n * @experimental The Zeitlich plugin is an experimental feature; APIs may change without notice.\n */\nexport class ZeitlichPlugin extends SimplePlugin {\n constructor(options: ZeitlichPluginOptions) {\n super({\n name: \"ZeitlichPlugin\",\n activities: createSharedActivities(options.redis),\n });\n }\n}\n","import type Redis from \"ioredis\";\nimport { createThreadManager } from \"./thread-manager\";\nimport type { AgentResponse } from \"./types\";\nimport { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport { mapStoredMessagesToChatMessages } from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type {\n BaseChatModel,\n BaseChatModelCallOptions,\n BindToolsInput,\n} from \"@langchain/core/language_models/chat_models\";\nimport { getStateQuery } from \"./state-manager\";\n\n/**\n * Configuration for invoking the model\n */\nexport interface InvokeModelConfig {\n threadId: string;\n agentName: string;\n}\n\n/**\n * Core model invocation logic - shared utility for workflow-specific activities\n *\n * @param redis - Redis client for thread management\n * @param config - Model invocation configuration\n * @param model - Pre-instantiated LangChain chat model\n * @param invocationConfig - Per-invocation configuration (system prompt, etc.)\n * @returns Agent response with message and metadata\n */\nexport async function invokeModel({\n redis,\n model,\n client,\n config: { threadId, agentName },\n}: {\n redis: Redis;\n client: WorkflowClient;\n config: InvokeModelConfig;\n model: BaseChatModel<BaseChatModelCallOptions & { tools?: BindToolsInput }>;\n}): Promise<AgentResponse> {\n const thread = createThreadManager({ redis, threadId });\n const runId = uuidv4();\n\n const info = Context.current().info; // Activity info\n const parentWorkflowId = info.workflowExecution.workflowId;\n const parentRunId = info.workflowExecution.runId;\n\n const handle = client.getHandle(parentWorkflowId, parentRunId);\n const { tools } = await handle.query(getStateQuery);\n\n const messages = await thread.load();\n const response = await model.invoke(\n [...mapStoredMessagesToChatMessages(messages)],\n {\n runName: agentName,\n runId,\n metadata: { thread_id: threadId },\n tools,\n }\n );\n\n await thread.append([response.toDict()]);\n\n return {\n message: response.toDict(),\n stopReason: (response.response_metadata?.stop_reason as string) ?? null,\n usage: {\n input_tokens: response.usage_metadata?.input_tokens,\n output_tokens: response.usage_metadata?.output_tokens,\n total_tokens: response.usage_metadata?.total_tokens,\n },\n };\n}\n","import { AIMessage, type StoredMessage } from \"@langchain/core/messages\";\nimport type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionToolSchemaType } from \"./tool\";\n\n/**\n * Handle user interaction tool result - creates AI messages for display.\n */\nexport const handleAskUserQuestionToolResult: ActivityToolHandler<\n AskUserQuestionToolSchemaType,\n { chatMessages: StoredMessage[] }\n> = async (args) => {\n const messages = args.questions.map(\n ({ question, header, options, multiSelect }) =>\n new AIMessage({\n content: question,\n additional_kwargs: {\n header,\n options,\n multiSelect,\n },\n }).toDict()\n );\n\n return { toolResponse: \"Question submitted\", data: { chatMessages: messages } };\n};\n","import type { IFileSystem } from \"just-bash\";\nimport { Bash } from \"just-bash\";\nimport type { GlobToolSchemaType } from \"./tool\";\n\n/**\n * Result of a glob operation\n */\nexport interface GlobResult {\n files: string[];\n}\n\n/**\n * Glob handler response\n */\nexport interface GlobHandlerResponse {\n toolResponse: string;\n data: GlobResult;\n}\n\n/**\n * Glob handler that searches within the scoped file tree.\n *\n * @param args - Tool arguments (pattern, root)\n * @param provider - FileSystemProvider for I/O operations\n */\nexport async function globHandler(\n _args: GlobToolSchemaType,\n fs: IFileSystem\n): Promise<GlobHandlerResponse> {\n // const { pattern, root } = args;\n const _bash = new Bash({ fs });\n\n return Promise.resolve({\n toolResponse: \"Hello, world!\",\n data: { files: [] },\n });\n\n // try {\n // const matches = await bash.exec(`glob ${root} -name \"${pattern}\"`);\n\n // if (matches.length === 0) {\n // return {\n // content: `No files found matching pattern: ${pattern}`,\n // result: { files: [] },\n // };\n // }\n\n // const paths = matches.map((node) => node.path);\n // const fileList = paths.map((p) => ` ${p}`).join(\"\\n\");\n\n // return {\n // content: `Found ${matches.length} file(s) matching \"${pattern}\":\\n${fileList}`,\n // result: { files: matches },\n // };\n // } catch (error) {\n // const message = error instanceof Error ? error.message : \"Unknown error\";\n // return {\n // content: `Error searching for files: ${message}`,\n // result: { files: [] },\n // };\n // }\n}\n","import type { EditToolSchemaType } from \"./tool\";\nimport type { IFileSystem } from \"just-bash\";\n\n/**\n * Result of an edit operation\n */\nexport interface EditResult {\n path: string;\n success: boolean;\n replacements: number;\n}\n\n/**\n * Edit handler response\n */\nexport interface EditHandlerResponse {\n toolResponse: string;\n data: EditResult;\n}\n\n/**\n * Options for edit handler\n */\nexport interface EditHandlerOptions {\n /**\n * Set of file paths that have been read in this session.\n * Required for enforcing read-before-write policy.\n */\n readFiles: Set<string>;\n /**\n * If true, skip the read-before-write check (not recommended)\n */\n skipReadCheck?: boolean;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Edit handler that edits files within the scoped file tree.\n *\n * @param args - Tool arguments (file_path, old_string, new_string, replace_all)\n * @param options - Additional options (readFiles, skipReadCheck)\n */\nexport async function editHandler(\n args: EditToolSchemaType,\n fs: IFileSystem\n): Promise<EditHandlerResponse> {\n const { file_path, old_string, new_string, replace_all = false } = args;\n\n // Validate old_string !== new_string\n if (old_string === new_string) {\n return {\n toolResponse: `Error: old_string and new_string must be different.`,\n data: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n try {\n // Check if file exists\n const exists = await fs.exists(file_path);\n if (!exists) {\n return {\n toolResponse: `Error: File \"${file_path}\" does not exist.`,\n data: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Read current content\n const content = await fs.readFile(file_path);\n\n // Check if old_string exists in the file\n if (!content.includes(old_string)) {\n return {\n toolResponse: `Error: Could not find the specified text in \"${file_path}\". Make sure old_string matches exactly (whitespace-sensitive).`,\n data: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Count occurrences\n const escapedOldString = escapeRegExp(old_string);\n const globalRegex = new RegExp(escapedOldString, \"g\");\n const occurrences = (content.match(globalRegex) || []).length;\n\n // Check uniqueness if not replace_all\n if (!replace_all && occurrences > 1) {\n return {\n toolResponse: `Error: old_string appears ${occurrences} times in \"${file_path}\". Either provide more context to make it unique, or use replace_all: true.`,\n data: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n\n // Perform replacement\n let newContent: string;\n let replacements: number;\n\n if (replace_all) {\n newContent = content.split(old_string).join(new_string);\n replacements = occurrences;\n } else {\n // Replace only the first occurrence\n const index = content.indexOf(old_string);\n newContent =\n content.slice(0, index) +\n new_string +\n content.slice(index + old_string.length);\n replacements = 1;\n }\n\n // Write the modified content\n await fs.writeFile(file_path, newContent);\n\n const summary = replace_all\n ? `Replaced ${replacements} occurrence(s)`\n : `Replaced 1 occurrence`;\n\n return {\n toolResponse: `${summary} in ${file_path}`,\n data: {\n path: file_path,\n success: true,\n replacements,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error editing file \"${file_path}\": ${message}`,\n data: {\n path: file_path,\n success: false,\n replacements: 0,\n },\n };\n }\n}\n","import type { ActivityToolHandler } from \"../../workflow\";\nimport type { bashToolSchemaType } from \"./tool\";\nimport { Bash, type BashOptions } from \"just-bash\";\n\ntype BashExecOut = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\n/** BashOptions with `fs` required */\ntype BashToolOptions = Required<Pick<BashOptions, \"fs\">> & Omit<BashOptions, \"fs\">;\n\nexport const handleBashTool: (\n bashOptions: BashToolOptions,\n) => ActivityToolHandler<bashToolSchemaType, BashExecOut | null> =\n (bashOptions: BashToolOptions) => async (args: bashToolSchemaType, _context) => {\n const { command } = args;\n\n const mergedOptions: BashOptions = {\n ...bashOptions,\n executionLimits: {\n maxStringLength: 52428800, // 50MB default\n ...bashOptions.executionLimits,\n },\n };\n\n const bash = new Bash(mergedOptions);\n\n try {\n const { exitCode, stderr, stdout } = await bash.exec(command);\n const bashExecOut = { exitCode, stderr, stdout };\n\n return {\n toolResponse: `Exit code: ${exitCode}\\n\\nstdout:\\n${stdout}\\n\\nstderr:\\n${stderr}`,\n data: bashExecOut,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(\"Unknown error\");\n return {\n toolResponse: `Error executing bash command: ${err.message}`,\n data: null,\n };\n }\n };\n","import type { IFileSystem } from \"just-bash\";\n\nconst basename = (path: string, separator: string): string => {\n if (path[path.length - 1] === separator) path = path.slice(0, -1);\n const lastSlashIndex = path.lastIndexOf(separator);\n return lastSlashIndex === -1 ? path : path.slice(lastSlashIndex + 1);\n};\n\nconst printTree = async (\n tab = \"\",\n children: ((tab: string) => Promise<string | null>)[]\n): Promise<string> => {\n let str = \"\";\n let last = children.length - 1;\n for (; last >= 0; last--) if (children[last]) break;\n for (let i = 0; i <= last; i++) {\n const fn = children[i];\n if (!fn) continue;\n const isLast = i === last;\n const child = await fn(tab + (isLast ? \" \" : \"│\") + \" \");\n const branch = child ? (isLast ? \"└─\" : \"├─\") : \"│\";\n str += \"\\n\" + tab + branch + (child ? \" \" + child : \"\");\n }\n return str;\n};\n\nexport const toTree = async (\n fs: IFileSystem,\n opts: {\n dir?: string;\n separator?: \"/\" | \"\\\\\";\n depth?: number;\n tab?: string;\n sort?: boolean;\n } = {}\n): Promise<string> => {\n const separator = opts.separator || \"/\";\n let dir = opts.dir || separator;\n if (dir[dir.length - 1] !== separator) dir += separator;\n const tab = opts.tab || \"\";\n const depth = opts.depth ?? 10;\n const sort = opts.sort ?? true;\n let subtree = \" (...)\";\n if (depth > 0) {\n const list = (await fs.readdirWithFileTypes?.(dir)) || [];\n if (sort) {\n list.sort((a, b) => {\n if (a.isDirectory && b.isDirectory) {\n return a.name.toString().localeCompare(b.name.toString());\n } else if (a.isDirectory) {\n return -1;\n } else if (b.isDirectory) {\n return 1;\n } else {\n return a.name.toString().localeCompare(b.name.toString());\n }\n });\n }\n subtree = await printTree(\n tab,\n list.map((entry) => async (tab): Promise<string | null> => {\n if (entry.isDirectory) {\n return toTree(fs, {\n dir: dir + entry.name,\n depth: depth - 1,\n tab,\n });\n } else if (entry.isSymbolicLink) {\n return (\n \"\" + entry.name + \" → \" + (await fs.readlink(dir + entry.name))\n );\n } else {\n return \"\" + entry.name;\n }\n })\n );\n }\n const base = basename(dir, separator) + separator;\n return base + subtree;\n};\n"]}