zeitlich 0.2.21 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -55
- package/dist/adapters/sandbox/daytona/index.cjs +3 -0
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +2 -1
- package/dist/adapters/sandbox/daytona/index.d.ts +2 -1
- package/dist/adapters/sandbox/daytona/index.js +3 -0
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.cjs +32 -0
- package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/daytona/workflow.d.cts +27 -0
- package/dist/adapters/sandbox/daytona/workflow.d.ts +27 -0
- package/dist/adapters/sandbox/daytona/workflow.js +30 -0
- package/dist/adapters/sandbox/daytona/workflow.js.map +1 -0
- package/dist/adapters/sandbox/inmemory/index.cjs +4 -1
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +3 -2
- package/dist/adapters/sandbox/inmemory/index.d.ts +3 -2
- package/dist/adapters/sandbox/inmemory/index.js +4 -1
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +32 -0
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +25 -0
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +25 -0
- package/dist/adapters/sandbox/inmemory/workflow.js +30 -0
- package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -0
- package/dist/adapters/sandbox/virtual/index.cjs +3 -0
- package/dist/adapters/sandbox/virtual/index.cjs.map +1 -1
- package/dist/adapters/sandbox/virtual/index.d.cts +6 -4
- package/dist/adapters/sandbox/virtual/index.d.ts +6 -4
- package/dist/adapters/sandbox/virtual/index.js +3 -0
- package/dist/adapters/sandbox/virtual/index.js.map +1 -1
- package/dist/adapters/sandbox/virtual/workflow.cjs +32 -0
- package/dist/adapters/sandbox/virtual/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/virtual/workflow.d.cts +27 -0
- package/dist/adapters/sandbox/virtual/workflow.d.ts +27 -0
- package/dist/adapters/sandbox/virtual/workflow.js +30 -0
- package/dist/adapters/sandbox/virtual/workflow.js.map +1 -0
- package/dist/adapters/thread/google-genai/index.cjs +9 -1
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +30 -18
- package/dist/adapters/thread/google-genai/index.d.ts +30 -18
- package/dist/adapters/thread/google-genai/index.js +9 -1
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.cjs +33 -0
- package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -0
- package/dist/adapters/thread/google-genai/workflow.d.cts +32 -0
- package/dist/adapters/thread/google-genai/workflow.d.ts +32 -0
- package/dist/adapters/thread/google-genai/workflow.js +31 -0
- package/dist/adapters/thread/google-genai/workflow.js.map +1 -0
- package/dist/adapters/thread/langchain/index.cjs +9 -1
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +26 -15
- package/dist/adapters/thread/langchain/index.d.ts +26 -15
- package/dist/adapters/thread/langchain/index.js +9 -1
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.cjs +33 -0
- package/dist/adapters/thread/langchain/workflow.cjs.map +1 -0
- package/dist/adapters/thread/langchain/workflow.d.cts +32 -0
- package/dist/adapters/thread/langchain/workflow.d.ts +32 -0
- package/dist/adapters/thread/langchain/workflow.js +31 -0
- package/dist/adapters/thread/langchain/workflow.js.map +1 -0
- package/dist/index.cjs +36 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -14
- package/dist/index.d.ts +35 -14
- package/dist/index.js +38 -34
- package/dist/index.js.map +1 -1
- package/dist/queries-Bw6WEPMw.d.cts +44 -0
- package/dist/queries-C27raDaB.d.ts +44 -0
- package/dist/{queries-CHa2iv_I.d.cts → types-BJ8itUAl.d.cts} +2 -43
- package/dist/{types-BkAYmc96.d.ts → types-C5bkx6kQ.d.ts} +33 -5
- package/dist/{types-CES_30qx.d.cts → types-ClsHhtwL.d.cts} +33 -5
- package/dist/{queries-6Avfh74U.d.ts → types-ENYCKFBk.d.ts} +2 -43
- package/dist/{types-BMRzfELQ.d.cts → types-HBosetv3.d.cts} +15 -1
- package/dist/{types-BMRzfELQ.d.ts → types-HBosetv3.d.ts} +15 -1
- package/dist/workflow.cjs +4 -30
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +13 -41
- package/dist/workflow.d.ts +13 -41
- package/dist/workflow.js +6 -30
- package/dist/workflow.js.map +1 -1
- package/package.json +53 -1
- package/src/adapters/sandbox/daytona/index.ts +4 -0
- package/src/adapters/sandbox/daytona/proxy.ts +55 -0
- package/src/adapters/sandbox/e2b/filesystem.ts +147 -0
- package/src/adapters/sandbox/e2b/index.ts +159 -0
- package/src/adapters/sandbox/e2b/types.ts +23 -0
- package/src/adapters/sandbox/inmemory/index.ts +5 -1
- package/src/adapters/sandbox/inmemory/proxy.ts +53 -0
- package/src/adapters/sandbox/virtual/provider.ts +5 -1
- package/src/adapters/sandbox/virtual/proxy.ts +52 -0
- package/src/adapters/thread/google-genai/activities.ts +51 -17
- package/src/adapters/thread/google-genai/index.ts +1 -0
- package/src/adapters/thread/google-genai/proxy.ts +61 -0
- package/src/adapters/thread/langchain/activities.ts +47 -14
- package/src/adapters/thread/langchain/index.ts +1 -0
- package/src/adapters/thread/langchain/proxy.ts +61 -0
- package/src/lib/sandbox/manager.ts +40 -6
- package/src/lib/sandbox/sandbox.test.ts +12 -11
- package/src/lib/sandbox/types.ts +18 -0
- package/src/lib/session/index.ts +3 -5
- package/src/lib/session/session-edge-cases.integration.test.ts +45 -34
- package/src/lib/session/session.integration.test.ts +40 -48
- package/src/lib/session/session.ts +4 -66
- package/src/lib/session/types.ts +32 -1
- package/src/lib/subagent/define.ts +1 -1
- package/src/lib/subagent/handler.ts +9 -2
- package/src/lib/subagent/index.ts +1 -0
- package/src/lib/subagent/subagent.integration.test.ts +62 -0
- package/src/lib/subagent/types.ts +7 -2
- package/src/lib/tool-router/router-edge-cases.integration.test.ts +4 -1
- package/src/lib/tool-router/router.integration.test.ts +4 -1
- package/src/lib/workflow.test.ts +19 -10
- package/src/lib/workflow.ts +4 -1
- package/src/tools/bash/bash.test.ts +16 -7
- package/src/workflow.ts +6 -14
- package/tsup.config.ts +6 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/tool-router/router.ts","../src/lib/thread/id.ts","../src/lib/subagent/tool.ts","../src/lib/subagent/handler.ts","../src/lib/subagent/register.ts","../src/lib/skills/tool.ts","../src/lib/skills/handler.ts","../src/lib/skills/register.ts","../src/lib/session/session.ts","../src/lib/workflow.ts","../src/lib/types.ts","../src/lib/state/manager.ts","../node_modules/uuid/dist/esm/stringify.js","../node_modules/uuid/dist/esm/rng.js","../node_modules/uuid/dist/esm/native.js","../node_modules/uuid/dist/esm/v4.js","../src/lib/tool-router/auto-append.ts","../src/lib/tool-router/with-sandbox.ts","../src/lib/subagent/define.ts","../src/lib/subagent/workflow.ts","../src/lib/sandbox/types.ts","../src/adapters/sandbox/virtual/mutations.ts","../src/adapters/sandbox/virtual/tree.ts","../src/adapters/sandbox/virtual/queries.ts","../src/lib/skills/parse.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read-file/tool.ts","../src/tools/write-file/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/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","../src/tools/bash/tool.ts","../src/tools/ask-user-question/tool.ts","../src/tools/ask-user-question/handler.ts","../src/lib/skills/fs-provider.ts","../src/lib/thread/manager.ts","../src/lib/activity.ts","../src/lib/sandbox/manager.ts","../src/tools/bash/handler.ts","../src/tools/edit/handler.ts","../src/tools/glob/handler.ts","../src/tools/read-file/handler.ts","../src/tools/write-file/handler.ts","../src/lib/sandbox/tree.ts"],"names":["ApplicationFailure","uuid4","results","z","workflowInfo","executeChild","setHandler","defineUpdate","condition","proxyActivities","defineQuery","randomFillSync","randomUUID","key","rawVal","join","Context","numbered","tab"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolMessageContent } from \"../types\";\nimport type {\n ToolMap,\n ToolDefinition,\n RouterContext,\n ToolHandler,\n RawToolCall,\n ParsedToolCallUnion,\n ParsedToolCall,\n ToolCallResult,\n ToolCallResultUnion,\n InferToolResults,\n ToolRouterOptions,\n ToolRouter,\n ToolNames,\n ToolArgs,\n ToolResult,\n ProcessToolCallsContext,\n ToolWithHandler,\n} from \"./types\";\n\nimport type { z } from \"zod\";\nimport { ApplicationFailure, uuid4 } from \"@temporalio/workflow\";\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 } = options;\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\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 const resolve = <T>(v: T | (() => T)): T =>\n typeof v === \"function\" ? (v as () => T)() : v;\n\n const isEnabled = (tool: ToolMap[string]): boolean =>\n resolve(tool.enabled) ?? true;\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n toolMap.set(plugin.name, plugin);\n }\n }\n\n /** Run global → per-tool pre-hooks. Returns null to skip, or the (possibly modified) args. */\n async function runPreHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n turn: number\n ): Promise<{ skip: true } | { skip: false; args: unknown }> {\n let effectiveArgs: unknown = toolCall.args;\n\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) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n if (tool?.hooks?.onPreToolUse) {\n const preResult = await tool.hooks.onPreToolUse({\n args: effectiveArgs,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n return { skip: false, args: effectiveArgs };\n }\n\n /**\n * Run per-tool → global failure hooks. Returns recovery content/result,\n * or throws if no hook recovers.\n */\n async function runFailureHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n error: unknown,\n effectiveArgs: unknown,\n turn: number\n ): Promise<{ content: ToolMessageContent; result: unknown }> {\n const err = error instanceof Error ? error : new Error(String(error));\n const errorStr = String(error);\n\n if (tool?.hooks?.onPostToolUseFailure) {\n const r = await tool.hooks.onPostToolUseFailure({\n args: effectiveArgs,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n if (options.hooks?.onPostToolUseFailure) {\n const r = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n throw ApplicationFailure.fromError(error, { nonRetryable: true });\n }\n\n /** Run per-tool → global post-hooks. */\n async function runPostHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n toolResult: ToolCallResultUnion<TResults>,\n effectiveArgs: unknown,\n turn: number,\n durationMs: number\n ): Promise<void> {\n if (tool?.hooks?.onPostToolUse) {\n await tool.hooks.onPostToolUse({\n args: effectiveArgs,\n result: toolResult.data,\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\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n sandboxId?: string\n ): Promise<ToolCallResultUnion<TResults> | null> {\n const startTime = Date.now();\n const tool = toolMap.get(toolCall.name);\n\n // --- Pre-hooks: may skip or modify args ---\n const preResult = await runPreHooks(toolCall, tool, turn);\n if (preResult.skip) {\n await appendToolResult(uuid4(), {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return null;\n }\n const effectiveArgs = preResult.args;\n\n // --- Execute handler ---\n let result: unknown;\n let content!: ToolMessageContent;\n let resultAppended = false;\n\n try {\n if (tool) {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n ...(sandboxId !== undefined && { sandboxId }),\n };\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n routerContext as Parameters<typeof tool.handler>[1]\n );\n result = response.data;\n content = response.toolResponse;\n resultAppended = response.resultAppended === true;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n const recovery = await runFailureHooks(\n toolCall,\n tool,\n error,\n effectiveArgs,\n turn\n );\n result = recovery.result;\n content = recovery.content;\n }\n\n // --- Append result to thread (unless handler already did) ---\n if (!resultAppended) {\n const config = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content,\n };\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [uuid4(), config]\n );\n }\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n data: result,\n } as ToolCallResultUnion<TResults>;\n\n // --- Post-hooks ---\n await runPostHooks(\n toolCall,\n tool,\n toolResult,\n effectiveArgs,\n turn,\n Date.now() - startTime\n );\n\n return toolResult;\n }\n\n return {\n hasTools(): boolean {\n return Array.from(toolMap.values()).some(isEnabled);\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool || !isEnabled(tool)) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n const parsedArgs = resolve(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 const tool = toolMap.get(name);\n return tool !== undefined && isEnabled(tool);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.entries())\n .filter(([, tool]) => isEnabled(tool))\n .map(([name]) => name) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap)\n .filter(([, tool]) => isEnabled(tool))\n .map(([name, tool]) => ({\n name,\n description: resolve(tool.description),\n schema: resolve(tool.schema),\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\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 sandboxId = context?.sandboxId;\n\n if (options.parallel) {\n const results = await Promise.all(\n toolCalls.map((tc) => processToolCall(tc, turn, sandboxId))\n );\n return results.filter(\n (r): r is NonNullable<typeof r> => r !== null\n ) as ToolCallResultUnion<TResults>[];\n }\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const result = await processToolCall(toolCall, turn, sandboxId);\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n },\n\n async processToolCallsByName<TName extends ToolNames<T>, TResult>(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult>,\n context?: ProcessToolCallsContext\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 processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name as TName,\n ...(context?.sandboxId !== undefined && {\n sandboxId: context.sandboxId,\n }),\n };\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n routerContext as Parameters<typeof handler>[1]\n );\n\n if (!response.resultAppended) {\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [\n uuid4(),\n {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: response.toolResponse,\n },\n ]\n );\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n data: response.data,\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 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 extends RouterContext = RouterContext,\n>(\n tool: ToolWithHandler<TName, TSchema, TResult, TContext>\n): ToolWithHandler<TName, TSchema, TResult, TContext> {\n return tool;\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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import z from \"zod\";\nimport type { SubagentConfig } from \"./types\";\n\nexport const SUBAGENT_TOOL_NAME = \"Subagent\" as const;\n\nfunction buildSubagentDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => {\n const continuation = s.allowThreadContinuation\n ? \"\\n*(Supports thread continuation — pass a threadId to resume a previous conversation)*\"\n : \"\";\n return `## ${s.agentName}\\n${s.description}${continuation}`;\n })\n .join(\"\\n\\n\");\n\n return `The ${SUBAGENT_TOOL_NAME} tool launches specialized agents (subagents) that autonomously handle complex work. Each agent type has specific capabilities and tools available to it.\n\n# Available subagents:\n${subagentList}\n`;\n}\n\n/**\n * Creates a Subagent 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 */\nexport function createSubagentTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n readonly name: typeof SUBAGENT_TOOL_NAME;\n readonly description: string;\n readonly schema: z.ZodObject<z.ZodRawShape>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createSubagentTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.agentName);\n const hasThreadContinuation = subagents.some(\n (s) => s.allowThreadContinuation\n );\n\n const baseFields = {\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\n const schema = hasThreadContinuation\n ? z.object({\n ...baseFields,\n threadId: z\n .string()\n .nullable()\n .describe(\n \"Thread ID to continue an existing conversation from the same subagent, or null to start a new one\"\n ),\n })\n : z.object(baseFields);\n\n return {\n name: SUBAGENT_TOOL_NAME,\n description: buildSubagentDescription(subagents),\n schema,\n } as const;\n}\n\n/**\n * Subagent tool args type (when subagent names are not known at compile time)\n */\nexport type SubagentArgs = {\n subagent: string;\n description: string;\n prompt: string;\n threadId?: string | null;\n};\n","import { executeChild, workflowInfo } from \"@temporalio/workflow\";\nimport { getShortId } from \"../thread/id\";\nimport type { ToolHandlerResponse, RouterContext } from \"../tool-router\";\nimport type { ToolMessageContent } from \"../types\";\nimport type {\n InferSubagentResult,\n SubagentConfig,\n SubagentWorkflowInput,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\nimport type { z } from \"zod\";\n\n/**\n * Creates a Subagent 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 */\nexport function createSubagentHandler<\n const T extends readonly SubagentConfig[],\n>(subagents: [...T]) {\n const { taskQueue: parentTaskQueue } = workflowInfo();\n\n return async (\n args: SubagentArgs,\n context: RouterContext\n ): Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>> => {\n const config = subagents.find((s) => s.agentName === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.agentName).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${args.subagent}-${getShortId()}`;\n\n const { sandboxId: parentSandboxId } = context;\n const inheritSandbox = config.sandbox !== \"own\" && !!parentSandboxId;\n\n const workflowInput: SubagentWorkflowInput = {\n ...(args.threadId &&\n args.threadId !== null &&\n config.allowThreadContinuation && {\n previousThreadId: args.threadId,\n }),\n ...(inheritSandbox && { sandboxId: parentSandboxId }),\n };\n\n const childOpts = {\n workflowId: childWorkflowId,\n args:\n config.context === undefined\n ? ([args.prompt, workflowInput] as const)\n : ([args.prompt, workflowInput, config.context] as const),\n taskQueue: config.taskQueue ?? parentTaskQueue,\n };\n\n const {\n toolResponse,\n data,\n usage,\n threadId: childThreadId,\n } = typeof config.workflow === \"string\"\n ? await executeChild(config.workflow, childOpts)\n : await executeChild(config.workflow, childOpts);\n\n if (!toolResponse) {\n return {\n toolResponse: \"Subagent workflow returned no response\",\n data: null,\n ...(usage && { usage }),\n };\n }\n\n const validated = (\n config.resultSchema ? config.resultSchema.safeParse(data) : null\n ) as z.ZodSafeParseResult<InferSubagentResult<T[number]>> | null;\n\n if (validated && !validated.success) {\n return {\n toolResponse: `Subagent workflow returned invalid data: ${validated.error.message}`,\n data: null,\n ...(usage && { usage }),\n };\n }\n\n let finalToolResponse: ToolMessageContent = toolResponse;\n if (config.allowThreadContinuation && childThreadId) {\n finalToolResponse =\n typeof toolResponse === \"string\"\n ? `${toolResponse}\\n\\n[${config.agentName} Thread ID: ${childThreadId}]`\n : toolResponse;\n }\n\n return {\n toolResponse: finalToolResponse,\n data: validated ? validated.data : data,\n ...(usage && { usage }),\n };\n };\n}\n","import type {\n PreToolUseHookResult,\n PostToolUseFailureHookResult,\n ToolHooks,\n ToolMap,\n} from \"../tool-router/types\";\nimport type { SubagentConfig, SubagentHooks } from \"./types\";\nimport type { z } from \"zod\";\nimport { createSubagentTool, SUBAGENT_TOOL_NAME, type SubagentArgs } from \"./tool\";\nimport { createSubagentHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the Subagent tool,\n * including per-subagent hook delegation.\n *\n * Lazily evaluates `enabled` (supports `boolean | () => boolean`)\n * so that `description` and `schema` reflect the current set of\n * active subagents each time getToolDefinitions() is called.\n *\n * Returns null if no subagents are configured.\n */\nexport function buildSubagentRegistration(\n subagents: SubagentConfig[]\n): ToolMap[string] | null {\n if (subagents.length === 0) return null;\n\n const getEnabled = (): SubagentConfig[] =>\n subagents.filter((s) =>\n typeof s.enabled === \"function\" ? s.enabled() : (s.enabled ?? true),\n );\n\n const subagentHooksMap = new Map<string, SubagentHooks>();\n for (const s of subagents) {\n if (s.hooks) subagentHooksMap.set(s.agentName, s.hooks);\n }\n\n const resolveSubagentName = (args: unknown): string =>\n (args as SubagentArgs).subagent;\n\n return {\n name: SUBAGENT_TOOL_NAME,\n enabled: (): boolean => getEnabled().length > 0,\n description: (): string => createSubagentTool(getEnabled()).description,\n schema: (): z.ZodObject<z.ZodRawShape> => createSubagentTool(getEnabled()).schema,\n handler: createSubagentHandler(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","import z from \"zod\";\nimport type { Skill } from \"./types\";\n\nexport const READ_SKILL_TOOL_NAME = \"ReadSkill\" as const;\n\nfunction buildReadSkillDescription(skills: Skill[]): string {\n const skillList = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Load the full instructions for a skill. Read the skill before following its instructions.\n\n# Available skills:\n${skillList}\n`;\n}\n\n/**\n * Creates a ReadSkill tool configured with the available skills.\n * The tool description embeds skill metadata so the agent discovers\n * skills purely through the tool definition.\n */\nexport function createReadSkillTool(skills: Skill[]): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n skill_name: z.ZodEnum<Record<string, string>>;\n }>;\n} {\n if (skills.length === 0) {\n throw new Error(\"createReadSkillTool requires at least one skill\");\n }\n\n const names = skills.map((s) => s.name);\n\n return {\n name: READ_SKILL_TOOL_NAME,\n description: buildReadSkillDescription(skills),\n schema: z.object({\n skill_name: z.enum(names).describe(\"The name of the skill to load\"),\n }),\n } as const;\n}\n\nexport type ReadSkillArgs = {\n skill_name: string;\n};\n","import type { Skill } from \"./types\";\nimport type { ToolHandlerResponse } from \"../tool-router\";\nimport type { ReadSkillArgs } from \"./tool\";\n\n/**\n * Creates a ReadSkill handler that looks up skills from an in-memory array.\n * Runs directly in the workflow (like task tools) — no activity needed.\n */\nexport function createReadSkillHandler(\n skills: Skill[]\n): (args: ReadSkillArgs) => ToolHandlerResponse<null> {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n return (args: ReadSkillArgs): ToolHandlerResponse<null> => {\n const skill = skillMap.get(args.skill_name);\n\n if (!skill) {\n return {\n toolResponse: JSON.stringify({\n error: `Skill \"${args.skill_name}\" not found`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: skill.instructions,\n data: null,\n };\n };\n}\n","import type { ToolMap } from \"../tool-router/types\";\nimport type { Skill } from \"./types\";\nimport { createReadSkillTool } from \"./tool\";\nimport { createReadSkillHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the ReadSkill tool.\n *\n * Returns null if no skills are provided.\n */\nexport function buildSkillRegistration(\n skills: Skill[]\n): ToolMap[string] | null {\n if (skills.length === 0) return null;\n\n return {\n ...createReadSkillTool(skills),\n handler: createReadSkillHandler(skills),\n };\n}\n","import {\n proxyActivities,\n condition,\n defineUpdate,\n setHandler,\n ApplicationFailure,\n type ActivityInterfaceFor,\n} from \"@temporalio/workflow\";\nimport type { SessionExitReason, MessageContent } from \"../types\";\nimport type { ThreadOps, SessionConfig, ZeitlichSession } from \"./types\";\nimport type { SandboxOps } from \"../sandbox/types\";\nimport { type AgentStateManager, type JsonSerializable } from \"../state/types\";\nimport { createToolRouter } from \"../tool-router/router\";\nimport type { ParsedToolCallUnion, ToolMap } from \"../tool-router/types\";\nimport { getShortId } from \"../thread/id\";\nimport { buildSubagentRegistration } from \"../subagent/register\";\nimport { buildSkillRegistration } from \"../skills/register\";\nimport { uuid4 } from \"@temporalio/workflow\";\n\n/**\n * Creates an agent session that manages the agent loop: LLM invocation,\n * tool routing, subagent coordination, and lifecycle hooks.\n *\n * @param config - Session and agent configuration (merged `SessionConfig` and `AgentConfig`)\n * @returns A session object with `runSession()` to start the agent loop\n *\n * @example\n * ```typescript\n * import { createSession, createAgentStateManager, defineTool, bashTool } from 'zeitlich/workflow';\n *\n * const stateManager = createAgentStateManager({\n * initialState: { systemPrompt: \"You are a helpful assistant.\" },\n * agentName: \"my-agent\",\n * });\n *\n * const session = await createSession({\n * agentName: \"my-agent\",\n * maxTurns: 20,\n * threadId: runId,\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * subagents: [researcherSubagent],\n * tools: {\n * Bash: defineTool({ ...bashTool, handler: bashHandlerActivity }),\n * },\n * });\n *\n * const { finalMessage, exitReason } = await session.runSession({ stateManager });\n * ```\n */\nexport const createSession = async <T extends ToolMap, M = unknown>({\n threadId: providedThreadId,\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n threadOps,\n buildContextMessage,\n subagents,\n skills,\n tools = {} as T,\n processToolsInParallel = true,\n hooks = {},\n appendSystemPrompt = true,\n continueThread = false,\n waitForInputTimeout = \"48h\",\n sandbox: sandboxOps,\n sandboxId: inheritedSandboxId,\n}: SessionConfig<T, M>): Promise<ZeitlichSession<M>> => {\n const sourceThreadId = continueThread ? providedThreadId : undefined;\n const threadId =\n continueThread && providedThreadId\n ? getShortId()\n : (providedThreadId ?? getShortId());\n\n const {\n appendToolResult,\n appendHumanMessage,\n initializeThread,\n appendSystemMessage,\n forkThread,\n } = threadOps ?? proxyDefaultThreadOps();\n\n const plugins: ToolMap[string][] = [];\n if (subagents) {\n const reg = buildSubagentRegistration(subagents);\n if (reg) plugins.push(reg);\n }\n if (skills) {\n const reg = buildSkillRegistration(skills);\n if (reg) plugins.push(reg);\n }\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n hooks,\n plugins,\n parallel: processToolsInParallel,\n });\n\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 <TState extends JsonSerializable<TState>>({\n stateManager,\n }: {\n stateManager: AgentStateManager<TState>;\n }): Promise<{\n threadId: string;\n finalMessage: M | null;\n exitReason: SessionExitReason;\n usage: ReturnType<AgentStateManager<TState>[\"getTotalUsage\"]>;\n }> => {\n setHandler(\n defineUpdate<unknown, [MessageContent]>(`add${agentName}Message`),\n async (message: MessageContent) => {\n if (hooks.onPreHumanMessageAppend) {\n await hooks.onPreHumanMessageAppend({\n message,\n threadId,\n });\n }\n await appendHumanMessage(threadId, uuid4(), message);\n if (hooks.onPostHumanMessageAppend) {\n await hooks.onPostHumanMessageAppend({\n message,\n threadId,\n });\n }\n stateManager.run();\n }\n );\n\n // --- Sandbox lifecycle: create or inherit ---\n let sandboxId: string | undefined = inheritedSandboxId;\n const ownsSandbox = !sandboxId && !!sandboxOps;\n if (ownsSandbox) {\n const result = await sandboxOps.createSandbox({ id: threadId });\n sandboxId = result.sandboxId;\n if (result.stateUpdate) {\n stateManager.mergeUpdate(result.stateUpdate as Partial<TState>);\n }\n }\n\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n\n const systemPrompt = stateManager.getSystemPrompt();\n\n if (continueThread && sourceThreadId) {\n await forkThread(sourceThreadId, threadId);\n } else {\n if (appendSystemPrompt) {\n if (!systemPrompt || systemPrompt.trim() === \"\") {\n throw ApplicationFailure.create({\n message: \"No system prompt in state\",\n nonRetryable: true,\n });\n }\n await appendSystemMessage(threadId, uuid4(), systemPrompt);\n } else {\n await initializeThread(threadId);\n }\n }\n await appendHumanMessage(threadId, uuid4(), 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 stateManager.setTools(toolRouter.getToolDefinitions());\n\n const { message, rawToolCalls, usage } = await runAgent({\n threadId,\n agentName,\n metadata,\n });\n\n if (usage) {\n stateManager.updateUsage(usage);\n }\n\n if (!toolRouter.hasTools() || rawToolCalls.length === 0) {\n stateManager.complete();\n exitReason = \"completed\";\n return {\n threadId,\n finalMessage: message,\n exitReason,\n usage: stateManager.getTotalUsage(),\n };\n }\n\n const parsedToolCalls: ParsedToolCallUnion<T>[] = [];\n for (const tc of rawToolCalls) {\n try {\n parsedToolCalls.push(toolRouter.parseToolCall(tc));\n } catch (error) {\n await appendToolResult(uuid4(), {\n threadId,\n toolCallId: tc.id ?? \"\",\n toolName: tc.name,\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 toolCallResults = await toolRouter.processToolCalls(\n parsedToolCalls,\n {\n turn: currentTurn,\n ...(sandboxId !== undefined && { sandboxId }),\n }\n );\n\n for (const result of toolCallResults) {\n if (result.usage) {\n stateManager.updateUsage(result.usage);\n }\n }\n\n if (stateManager.getStatus() === \"WAITING_FOR_INPUT\") {\n const conditionMet = await condition(\n () => stateManager.getStatus() === \"RUNNING\",\n waitForInputTimeout\n );\n if (!conditionMet) {\n stateManager.cancel();\n exitReason = \"cancelled\";\n await condition(() => false, \"2s\");\n break;\n }\n }\n }\n\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n }\n } catch (error) {\n exitReason = \"failed\";\n throw ApplicationFailure.fromError(error);\n } finally {\n await callSessionEnd(exitReason, stateManager.getTurns());\n\n if (ownsSandbox && sandboxId && sandboxOps) {\n await sandboxOps.destroySandbox(sandboxId);\n }\n }\n\n return {\n threadId,\n finalMessage: null,\n exitReason,\n usage: stateManager.getTotalUsage(),\n };\n },\n };\n};\n\n/**\n * Proxy the adapter's thread operations as Temporal activities.\n * Call this in workflow code to delegate thread operations to the\n * adapter-provided activities registered on the worker.\n *\n * @example\n * ```typescript\n * const session = await createSession({\n * threadOps: proxyDefaultThreadOps(),\n * // ...\n * });\n * ```\n */\nexport function proxyDefaultThreadOps(\n options?: Parameters<typeof proxyActivities>[0]\n): ActivityInterfaceFor<ThreadOps> {\n return proxyActivities<ThreadOps>(\n options ?? {\n startToCloseTimeout: \"10s\",\n retry: {\n maximumAttempts: 6,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n }\n );\n}\n\n/**\n * Proxy sandbox lifecycle operations as Temporal activities.\n * Call this in workflow code when the agent needs a sandbox.\n *\n * @example\n * ```typescript\n * const session = await createSession({\n * sandbox: proxySandboxOps(),\n * // ...\n * });\n * ```\n */\nexport function proxySandboxOps(\n options?: Parameters<typeof proxyActivities>[0]\n): SandboxOps {\n return proxyActivities<SandboxOps>(\n options ?? {\n startToCloseTimeout: \"30s\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"2s\",\n maximumInterval: \"30s\",\n backoffCoefficient: 2,\n },\n }\n );\n}\n","/**\n * Session config fields derived from a main workflow input, ready to spread\n * into `createSession`.\n */\nexport interface WorkflowSessionInput {\n /** Thread ID to continue (set from `input.previousThreadId`) */\n threadId?: string;\n /** Whether to continue an existing thread (true when `previousThreadId` is present) */\n continueThread?: boolean;\n /** Optional sandbox ID forwarded to the session */\n sandboxId?: string;\n}\n\n/** Raw workflow input fields that map into `WorkflowSessionInput`. */\nexport interface WorkflowInput {\n /** When set, continue this thread instead of starting fresh */\n previousThreadId?: string;\n /** Optional sandbox ID to reuse */\n sandboxId?: string;\n}\n\nexport interface WorkflowConfig {\n /** Workflow name — used as the Temporal workflow function name */\n name: string;\n}\n\n/**\n * Wraps a main workflow function, translating workflow input fields into\n * session-compatible fields that can be spread directly into `createSession`.\n *\n * The wrapper:\n * - Accepts a `config` with at least a `name` (used for Temporal workflow naming)\n * - Accepts a handler `fn` receiving `(input, sessionInput)`\n * - Derives `threadId` + `continueThread` from `workflowInput.previousThreadId`\n * - Derives `sandboxId` from `workflowInput.sandboxId`\n */\nexport function defineWorkflow<TInput, TResult>(\n config: WorkflowConfig,\n fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult>,\n): (input: TInput, workflowInput?: WorkflowInput) => Promise<TResult> {\n const workflow = async (input: TInput, workflowInput: WorkflowInput = {}) => {\n const sessionInput: WorkflowSessionInput = {\n ...(workflowInput.previousThreadId && {\n threadId: workflowInput.previousThreadId,\n continueThread: true,\n }),\n ...(workflowInput.sandboxId && { sandboxId: workflowInput.sandboxId }),\n };\n return fn(input, sessionInput);\n };\n\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return workflow;\n}\n","// ============================================================================\n// Framework-agnostic message types\n// ============================================================================\n\n/** A single content part within a structured message (text, image, etc.) */\nexport type ContentPart = { type: string; [key: string]: unknown };\n\n/** Message content — plain string or an array of structured content parts */\nexport type MessageContent = string | ContentPart[];\n\n/** Content returned by a tool handler */\nexport type ToolMessageContent = MessageContent;\n\n// ============================================================================\n// Agent core types\n// ============================================================================\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 systemPrompt?: string;\n totalInputTokens: number;\n totalOutputTokens: number;\n cachedWriteTokens: number;\n cachedReadTokens: number;\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\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n}\n\n/**\n * Configuration for a Zeitlich agent\n */\nexport interface AgentConfig {\n /** The name of the agent, should be unique within the workflows, ideally Pascal Case */\n agentName: string;\n /** Description, used for sub agents */\n description?: string;\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 extends AgentConfig {\n /** The thread ID to use for the session */\n threadId: string;\n /** Metadata for the session */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n toolCallId: string;\n /** The name of the tool that produced this result */\n toolName: string;\n /** Content for the tool message (string or complex content parts) */\n content: ToolMessageContent;\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 exit\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 * 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 {\n condition,\n defineQuery,\n defineUpdate,\n setHandler,\n} from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"../types\";\nimport type { ToolDefinition } from \"../tool-router/types\";\nimport type { AgentState, AgentStateManager, JsonSerializable } from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Creates an agent state manager for tracking workflow state.\n * Automatically registers Temporal query and update handlers for the agent.\n *\n * @param options.agentName - Unique agent name, used to derive query/update handler names\n * @param options.initialState - Optional initial values for base and custom state.\n * Use `systemPrompt` here to set the agent's system prompt.\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty\n *\n * @example\n * ```typescript\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: \"You are a helpful assistant.\",\n * },\n * agentName: \"my-agent\",\n * });\n *\n * // With custom state fields\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: agentConfig.systemPrompt,\n * customField: \"value\",\n * },\n * agentName: agentConfig.agentName,\n * });\n * ```\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>({\n initialState,\n}: {\n initialState?: Partial<BaseAgentState> & TCustom;\n}): AgentStateManager<TCustom> {\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 let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCachedWriteTokens = 0;\n let totalCachedReadTokens = 0;\n let totalReasonTokens = 0;\n let systemPrompt = initialState?.systemPrompt;\n\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\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 const stateQuery = defineQuery<AgentState<TCustom>>(\"getAgentState\");\n const stateChangeUpdate = defineUpdate<AgentState<TCustom>, [number]>(\n \"waitForAgentStateChange\"\n );\n\n setHandler(stateQuery, () => buildState());\n setHandler(stateChangeUpdate, async (lastKnownVersion: number) => {\n await condition(\n () => version > lastKnownVersion || isTerminalStatus(status),\n \"55s\"\n );\n return buildState();\n });\n\n return {\n stateQuery,\n stateChangeUpdate,\n\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n getSystemPrompt(): string | undefined {\n return systemPrompt;\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 mergeUpdate(update: Partial<TCustom>): void {\n Object.assign(customState as object, update);\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 setSystemPrompt(newSystemPrompt: string): void {\n systemPrompt = newSystemPrompt;\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 updateUsage(usage: {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n }): void {\n totalInputTokens += usage.inputTokens ?? 0;\n totalOutputTokens += usage.outputTokens ?? 0;\n totalCachedWriteTokens += usage.cachedWriteTokens ?? 0;\n totalCachedReadTokens += usage.cachedReadTokens ?? 0;\n totalReasonTokens += usage.reasonTokens ?? 0;\n },\n\n getTotalUsage(): {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n } {\n return {\n totalInputTokens,\n totalOutputTokens,\n totalCachedWriteTokens,\n totalCachedReadTokens,\n totalReasonTokens,\n turns,\n };\n },\n };\n}\n","import validate from './validate.js';\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 return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { 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 if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\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;\n","import type { ToolResultConfig } from \"../types\";\nimport type { ActivityToolHandler, RouterContext } from \"./types\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/**\n * Wraps a tool handler to automatically append its result directly to the\n * thread and sets `resultAppended: true` on the response.\n *\n * Use this for tools whose responses may exceed Temporal's activity payload\n * limit. The wrapper appends to the thread inside the activity (where Redis\n * is available), then replaces `toolResponse` with an empty string so the\n * large payload never travels through the Temporal workflow boundary.\n *\n * @param getThread - Factory that returns a thread manager for the given threadId\n * @param handler - The original tool handler\n * @returns A wrapped handler that auto-appends and flags the response\n *\n * @example\n * ```typescript\n * import { withAutoAppend } from '@bead-ai/zeitlich/workflow';\n * import { createThreadManager } from '@bead-ai/zeitlich';\n *\n * const handler = withAutoAppend(\n * (threadId) => createThreadManager({ redis, threadId }),\n * async (args, ctx) => ({\n * toolResponse: JSON.stringify(largeResult), // appended directly to Redis\n * data: { summary: \"...\" }, // small data for workflow\n * }),\n * );\n * ```\n */\nexport function withAutoAppend<\n TArgs,\n TResult,\n TContext extends RouterContext = RouterContext,\n>(\n threadHandler: (id: string, config: ToolResultConfig) => Promise<void>,\n handler: ActivityToolHandler<TArgs, TResult, TContext>\n): ActivityToolHandler<TArgs, TResult, TContext> {\n return async (args: TArgs, context: TContext) => {\n const response = await handler(args, context);\n\n await threadHandler(uuidv4(), {\n threadId: context.threadId,\n toolCallId: context.toolCallId,\n toolName: context.toolName,\n content: response.toolResponse,\n });\n\n return {\n toolResponse: \"Response appended via withAutoAppend\",\n data: response.data,\n resultAppended: true,\n };\n };\n}\n","import type { Sandbox } from \"../sandbox/types\";\nimport type { ActivityToolHandler, RouterContext, ToolHandlerResponse } from \"./types\";\n\n/**\n * Extended router context with a resolved {@link Sandbox} instance.\n *\n * Handlers typed with this context are guaranteed to have a live sandbox\n * and a non-optional `sandboxId`. Use with {@link withSandbox} to\n * automatically resolve the sandbox from the manager.\n */\nexport interface SandboxContext extends RouterContext {\n sandbox: Sandbox;\n sandboxId: string;\n}\n\n/**\n * Wraps a tool handler that requires a {@link Sandbox}, automatically\n * resolving it from the manager via the `sandboxId` on the router context.\n *\n * If no `sandboxId` is present the wrapper short-circuits with an error\n * response and `data: null`, so the inner handler never runs without a\n * valid sandbox.\n *\n * The sandbox type parameter `TSandbox` is inferred from the manager's\n * `getSandbox` return type, allowing handlers to receive provider-specific\n * sandbox subtypes (e.g. `DaytonaSandbox`) without manual casting.\n *\n * @param manager - Any object with a `getSandbox` method (e.g. {@link SandboxManager})\n * @param handler - The inner handler that expects a sandbox context\n * @returns A standard `ActivityToolHandler` that can be registered on the router\n *\n * @example\n * ```typescript\n * import { withSandbox, type SandboxContext } from 'zeitlich';\n *\n * // Generic sandbox — works with any provider:\n * const bashHandler: ActivityToolHandler<BashArgs, ExecResult, SandboxContext> =\n * async (args, { sandbox }) => {\n * const result = await sandbox.exec(args.command);\n * return { toolResponse: result.stdout, data: result };\n * };\n * const handler = withSandbox(manager, bashHandler);\n *\n * // Provider-specific sandbox — use SandboxManager<DaytonaSandbox>:\n * const daytonaManager = new SandboxManager<DaytonaSandbox>(provider);\n * const handler2 = withSandbox(daytonaManager, async (args, { sandbox }) => {\n * // sandbox is typed as DaytonaSandbox here\n * await sandbox.fs.uploadFiles([...]);\n * return { toolResponse: 'ok', data: null };\n * });\n * ```\n */\nexport function withSandbox<TArgs, TResult, TSandbox extends Sandbox = Sandbox>(\n manager: { getSandbox(id: string): Promise<TSandbox> },\n handler: (\n args: TArgs,\n context: RouterContext & { sandbox: TSandbox; sandboxId: string },\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult | null> {\n return async (args, context) => {\n if (!context.sandboxId) {\n return {\n toolResponse: `Error: No sandbox configured for this agent. The ${context.toolName} tool requires a sandbox.`,\n data: null,\n };\n }\n const sandbox = await manager.getSandbox(context.sandboxId);\n return handler(args, { ...context, sandbox, sandboxId: context.sandboxId });\n };\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentConfig,\n SubagentDefinition,\n SubagentHooks,\n SubagentWorkflow,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\n\n/**\n * Creates a `SubagentConfig` from a `SubagentDefinition` (returned by `defineSubagentWorkflow`).\n * Metadata (name, description, resultSchema) is read from the definition — only configure\n * what's specific to this usage in the parent workflow.\n *\n * @example\n * ```ts\n * // Minimal — all metadata comes from the definition\n * export const researcher = defineSubagent(researcherWorkflow);\n *\n * // With parent-specific overrides\n * export const researcher = defineSubagent(researcherWorkflow, {\n * allowThreadContinuation: true,\n * sandbox: \"own\",\n * hooks: {\n * onPostExecution: ({ result }) => console.log(result),\n * },\n * });\n *\n * // With typed context\n * export const researcher = defineSubagent(researcherWorkflow, {\n * context: { apiKey: \"...\" },\n * });\n * ```\n */\nexport function defineSubagent<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n definition: SubagentDefinition<TResult, TContext>,\n overrides?: {\n context?: TContext;\n hooks?: SubagentHooks<SubagentArgs, z.infer<TResult>>;\n enabled?: boolean | (() => boolean);\n taskQueue?: string;\n allowThreadContinuation?: boolean;\n sandbox?: \"inherit\" | \"own\";\n },\n): SubagentConfig<TResult> {\n return {\n agentName: definition.agentName,\n description: definition.description,\n workflow: definition as SubagentWorkflow<TResult>,\n ...(definition.resultSchema !== undefined && {\n resultSchema: definition.resultSchema,\n }),\n ...overrides,\n } as SubagentConfig<TResult>;\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentDefinition,\n SubagentHandlerResponse,\n SubagentWorkflowInput,\n SubagentSessionInput,\n} from \"./types\";\n\n/**\n * Defines a subagent workflow with embedded metadata (name, description, resultSchema).\n * The returned value can be passed directly to `defineSubagent` — no need to repeat\n * the name, description, or resultSchema in the parent workflow.\n *\n * Internally maps `SubagentWorkflowInput` fields to session-compatible `SubagentSessionInput`.\n *\n * @example\n * ```ts\n * import {\n * defineSubagentWorkflow,\n * defineSubagent,\n * createSession,\n * createAgentStateManager,\n * } from 'zeitlich/workflow';\n *\n * // Define once — carries name, description, resultSchema\n * export const researcherWorkflow = defineSubagentWorkflow(\n * {\n * name: \"researcher\",\n * description: \"Researches topics on the web\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * async (prompt, sessionInput) => {\n * const stateManager = createAgentStateManager({\n * initialState: { systemPrompt: \"You are a researcher.\" },\n * });\n *\n * const session = await createSession({\n * ...sessionInput,\n * agentName: \"researcher\",\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * });\n *\n * const { finalMessage, threadId } = await session.runSession({ stateManager });\n * return { toolResponse: finalMessage ?? \"No response\", data: null, threadId };\n * },\n * );\n *\n * // Use in parent — only configure what's parent-specific\n * export const researcher = defineSubagent(researcherWorkflow, {\n * hooks: { onPostExecution: ({ result }) => console.log(result) },\n * });\n * ```\n */\n// Without resultSchema — data is null\nexport function defineSubagentWorkflow<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: { name: string; description: string },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentHandlerResponse<null>>\n): SubagentDefinition<z.ZodNull, TContext>;\n// With resultSchema — data is inferred from the schema\nexport function defineSubagentWorkflow<\n TResult extends z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: { name: string; description: string; resultSchema: TResult },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentHandlerResponse<z.infer<TResult> | null>>\n): SubagentDefinition<TResult, TContext>;\nexport function defineSubagentWorkflow(\n config: { name: string; description: string; resultSchema?: z.ZodType },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: Record<string, unknown>\n ) => Promise<SubagentHandlerResponse<unknown>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): SubagentDefinition<any, any> {\n const workflow = async (\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: Record<string, unknown>\n ): Promise<SubagentHandlerResponse<unknown>> => {\n const sessionInput: SubagentSessionInput = {\n agentName: config.name,\n ...(workflowInput.previousThreadId && {\n threadId: workflowInput.previousThreadId,\n continueThread: true,\n }),\n ...(workflowInput.sandboxId && { sandboxId: workflowInput.sandboxId }),\n };\n return fn(prompt, sessionInput, context ?? {});\n };\n\n // for temporal workflow name\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return Object.assign(workflow, {\n agentName: config.name,\n description: config.description,\n ...(config.resultSchema !== undefined && {\n resultSchema: config.resultSchema,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as SubagentDefinition<any, any>;\n}\n","// ============================================================================\n// Sandbox Filesystem\n// ============================================================================\n\nexport interface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface FileStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mtime: Date;\n}\n\n/**\n * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n cp(src: string, dest: string, options?: { recursive?: boolean }): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n /** Optional state to merge into the workflow's `AgentState` via the session. */\n stateUpdate?: Record<string, unknown>;\n}\n\nexport interface SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> {\n createSandbox(\n options?: TOptions,\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }>;\n destroySandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true,\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type { FileEntryMetadata, VirtualFileTree, TreeMutation } from \"./types\";\n\n/**\n * Apply a list of {@link TreeMutation}s to the `fileTree` stored in a state\n * manager instance, updating it in place and returning the new tree.\n *\n * The `stateManager` parameter is structurally typed so any\n * {@link AgentStateManager} whose custom state includes\n * `fileTree: VirtualFileTree<TMeta>` will satisfy it.\n */\nexport function applyVirtualTreeMutations<TMeta = FileEntryMetadata>(\n stateManager: {\n get(key: \"fileTree\"): VirtualFileTree<TMeta>;\n set(key: \"fileTree\", value: VirtualFileTree<TMeta>): void;\n },\n mutations: TreeMutation<TMeta>[],\n): VirtualFileTree<TMeta> {\n let tree = [...stateManager.get(\"fileTree\")];\n\n for (const m of mutations) {\n switch (m.type) {\n case \"add\":\n tree.push(m.entry);\n break;\n case \"remove\":\n tree = tree.filter((e) => e.path !== m.path);\n break;\n case \"update\":\n tree = tree.map((e) =>\n e.path === m.path ? { ...e, ...m.entry } : e\n );\n break;\n }\n }\n\n stateManager.set(\"fileTree\", tree);\n return tree;\n}\n","import type { FileEntry } from \"./types\";\n\ninterface TreeNode {\n name: string;\n children: Map<string, TreeNode>;\n isFile: boolean;\n}\n\nconst buildTree = <T>(entries: FileEntry<T>[]): TreeNode => {\n const root: TreeNode = { name: \"/\", children: new Map(), isFile: false };\n\n for (const entry of entries) {\n const parts = entry.path.split(\"/\").filter(Boolean);\n let current = root;\n for (const part of parts) {\n let child = current.children.get(part);\n if (!child) {\n child = { name: part, children: new Map(), isFile: false };\n current.children.set(part, child);\n }\n current = child;\n }\n current.isFile = current.children.size === 0;\n }\n\n return root;\n};\n\nconst printNode = (node: TreeNode, tab: string, sort: boolean): string => {\n const entries = [...node.children.values()];\n if (sort) {\n entries.sort((a, b) => {\n if (!a.isFile && !b.isFile) return a.name.localeCompare(b.name);\n if (!a.isFile) return -1;\n if (!b.isFile) return 1;\n return a.name.localeCompare(b.name);\n });\n }\n\n let str = \"\";\n for (const [i, entry] of entries.entries()) {\n const isLast = i === entries.length - 1;\n const branch = isLast ? \"└─\" : \"├─\";\n const childTab = tab + (isLast ? \" \" : \"│ \");\n\n if (entry.isFile) {\n str += \"\\n\" + tab + branch + \" \" + entry.name;\n } else {\n const subtree = printNode(entry, childTab, sort);\n str += \"\\n\" + tab + branch + \" \" + entry.name + \"/\" + subtree;\n }\n }\n return str;\n};\n\n/**\n * Generates a formatted file tree string from a flat {@link FileEntry} list.\n * Directories are inferred from file paths — no filesystem access needed.\n *\n * @param entries - Flat list of file entries\n * @param opts - Optional configuration\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * const tree = formatVirtualFileTree(state.fileTree);\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport function formatVirtualFileTree<T>(\n entries: FileEntry<T>[],\n opts: { sort?: boolean } = {}\n): string {\n const sort = opts.sort ?? true;\n const root = buildTree(entries);\n return \"/\" + printNode(root, \"\", sort);\n}\n","import type { FileEntry } from \"./types\";\n\n/**\n * Structural constraint: accepts any `AgentStateManager<T>` whose custom\n * state includes `fileTree: FileEntry<TMeta>[]`.\n */\nexport interface FileTreeAccessor<TMeta> {\n get(key: \"fileTree\"): FileEntry<TMeta>[];\n}\n\n/**\n * Check whether any file in the tree has a `metadata.mimeType` that matches\n * the given pattern.\n *\n * Patterns:\n * - Exact: `\"application/pdf\"`\n * - Wildcard type: `\"image/*\"`\n *\n * Useful for conditionally enabling tools:\n *\n * ```ts\n * { enabled: hasFileWithMimeType(stateManager, \"image/*\") }\n * { enabled: hasFileWithMimeType(stateManager, [\"image/*\", \"application/pdf\"]) }\n * ```\n */\nexport function hasFileWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string | string[],\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(buildMatcher);\n return tree.some((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && matchers.some((m) => m(mime));\n });\n}\n\n/**\n * Return all entries whose `metadata.mimeType` matches the given pattern.\n */\nexport function filesWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): FileEntry<TMeta>[] {\n const tree = stateManager.get(\"fileTree\");\n const match = buildMatcher(pattern);\n return tree.filter((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && match(mime);\n });\n}\n\n/**\n * Check whether the tree contains a directory whose name matches the given\n * pattern. Directories are inferred from file paths.\n *\n * Patterns:\n * - Exact: `\"src\"`\n * - Glob with `*` wildcard: `\"test*\"`, `\"*.generated\"`\n *\n * ```ts\n * { enabled: hasDirectory(stateManager, \"test*\") }\n * ```\n */\nexport function hasDirectory<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const match = buildGlobMatcher(pattern);\n return tree.some((entry) => {\n const segments = entry.path.split(\"/\").filter(Boolean);\n return segments.slice(0, -1).some(match);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal matchers\n// ---------------------------------------------------------------------------\n\nfunction buildMatcher(pattern: string): (value: string) => boolean {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return (v) => v.startsWith(prefix);\n }\n return (v) => v === pattern;\n}\n\nfunction buildGlobMatcher(pattern: string): (value: string) => boolean {\n if (!pattern.includes(\"*\")) return (v) => v === pattern;\n const re = new RegExp(\n \"^\" + pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\",\n );\n return (v) => re.test(v);\n}\n","import type { SkillMetadata } from \"./types\";\n\n/**\n * Parse a SKILL.md file into its frontmatter fields and markdown body.\n *\n * Handles the limited YAML subset used by the agentskills.io spec:\n * flat key-value pairs plus one-level nested `metadata` map.\n * No external YAML dependency required.\n */\nexport function parseSkillFile(raw: string): {\n frontmatter: SkillMetadata;\n body: string;\n} {\n const trimmed = raw.replace(/^\\uFEFF/, \"\"); // strip BOM\n const match = trimmed.match(/^---[ \\t]*\\r?\\n([\\s\\S]*?)\\r?\\n---[ \\t]*\\r?\\n?([\\s\\S]*)$/);\n\n if (!match) {\n throw new Error(\n \"SKILL.md must start with YAML frontmatter delimited by ---\"\n );\n }\n\n const [, yamlBlock, body] = match as [string, string, string];\n const frontmatter = parseSimpleYaml(yamlBlock);\n\n if (!frontmatter.name || typeof frontmatter.name !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'name' field\");\n }\n if (!frontmatter.description || typeof frontmatter.description !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'description' field\");\n }\n\n const result: SkillMetadata = {\n name: frontmatter.name,\n description: frontmatter.description,\n };\n\n if (frontmatter.license) result.license = String(frontmatter.license);\n if (frontmatter.compatibility)\n result.compatibility = String(frontmatter.compatibility);\n if (frontmatter[\"allowed-tools\"]) {\n result.allowedTools = String(frontmatter[\"allowed-tools\"])\n .split(/\\s+/)\n .filter(Boolean);\n }\n if (\n frontmatter.metadata &&\n typeof frontmatter.metadata === \"object\" &&\n !Array.isArray(frontmatter.metadata)\n ) {\n result.metadata = frontmatter.metadata as Record<string, string>;\n }\n\n return { frontmatter: result, body: body.trim() };\n}\n\ntype YamlValue = string | Record<string, string>;\n\n/**\n * Minimal YAML parser for the agentskills.io frontmatter subset.\n * Supports: scalar key-value pairs, one-level nested maps (metadata).\n * Does NOT support arrays, multi-line strings, anchors, etc.\n */\nfunction parseSimpleYaml(yaml: string): Record<string, YamlValue> {\n const result: Record<string, YamlValue> = {};\n const lines = yaml.split(/\\r?\\n/);\n\n let currentMapKey: string | null = null;\n let currentMap: Record<string, string> | null = null;\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.trim().startsWith(\"#\")) continue;\n\n const nestedMatch = line.match(/^(\\s{2,}|\\t+)(\\S+)\\s*:\\s*(.*)$/);\n if (nestedMatch && currentMapKey && currentMap) {\n const [, , key, rawVal] = nestedMatch as [string, string, string, string];\n currentMap[key] = unquote(rawVal.trim());\n continue;\n }\n\n // Flush any pending nested map\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n currentMapKey = null;\n currentMap = null;\n }\n\n const topMatch = line.match(/^(\\S+)\\s*:\\s*(.*)$/);\n if (!topMatch) continue;\n\n const [, key, rawVal] = topMatch as [string, string, string];\n const val = rawVal.trim();\n\n if (val === \"\" || val === \"|\" || val === \">\") {\n currentMapKey = key;\n currentMap = {};\n } else {\n result[key] = unquote(val);\n }\n }\n\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n }\n\n return result;\n}\n\nfunction unquote(s: string): string {\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type GlobArgs = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type GrepArgs = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const readFileTool = {\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} satisfies ToolDefinition;\n\nexport type FileReadArgs = z.infer<typeof readFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const writeFileTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\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 relative to the root of the file system (e.g., \"docs/readme.md\", not \"/docs/readme.md\")\n`,\n schema: z.object({\n file_path: z.string().describe(\"The path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileWriteArgs = z.infer<typeof writeFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type FileEditArgs = z.infer<typeof editTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list. 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} satisfies ToolDefinition;\n\nexport type TaskCreateArgs = z.infer<typeof taskCreateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport { getShortId } from \"../../workflow\";\nimport type { TaskCreateArgs } 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 * @returns A ToolHandler for TaskCreate tool calls\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskCreateArgs, WorkflowTask> {\n return (args) => {\n const task: WorkflowTask = {\n id: getShortId(),\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type TaskGetArgs = z.infer<typeof taskGetTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetArgs } 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 ToolHandler for TaskGet tool calls\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskGetArgs, WorkflowTask | null> {\n return (args) => {\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n} satisfies ToolDefinition;\n\nexport type TaskListArgs = z.infer<typeof taskListTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListArgs } 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 ToolHandler for TaskList tool calls\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskListArgs, WorkflowTask[]> {\n return () => {\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type TaskUpdateArgs = z.infer<typeof taskUpdateTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateArgs } 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 ToolHandler for TaskUpdate tool calls\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskUpdateArgs, WorkflowTask | null> {\n return (args) => {\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 z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type BashArgs = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type AskUserQuestionArgs = z.infer<\n typeof askUserQuestionTool.schema\n>;\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionArgs } from \"./tool\";\n\n/**\n * Creates a handler for the AskUserQuestion tool.\n * Returns question data for display to the user via your UI layer.\n *\n * Typically paired with `stateManager.waitForInput()` in a `hooks.onPostToolUse`\n * callback to pause the agent loop until the user responds.\n *\n * @example\n * ```typescript\n * import { createAskUserQuestionHandler } from 'zeitlich';\n * import { askUserQuestionTool, defineTool } from 'zeitlich/workflow';\n *\n * // In activities\n * const askUserQuestionHandlerActivity = createAskUserQuestionHandler();\n *\n * // In workflow\n * tools: {\n * AskUserQuestion: defineTool({\n * ...askUserQuestionTool,\n * handler: askUserQuestionHandlerActivity,\n * hooks: {\n * onPostToolUse: () => { stateManager.waitForInput(); },\n * },\n * }),\n * }\n * ```\n */\nexport const createAskUserQuestionHandler =\n (): ActivityToolHandler<\n AskUserQuestionArgs,\n {\n questions: {\n question: string;\n header: string;\n options: { label: string; description: string }[];\n multiSelect: boolean;\n }[];\n }\n > =>\n async (args) => {\n return {\n toolResponse: \"Question submitted\",\n data: { questions: args.questions },\n };\n };\n","import { join } from \"node:path\";\nimport type { SandboxFileSystem } from \"../sandbox/types\";\nimport type { Skill, SkillMetadata, SkillProvider } from \"./types\";\nimport { parseSkillFile } from \"./parse\";\n\n/**\n * Loads skills from a directory following the agentskills.io layout:\n *\n * ```\n * skills/\n * ├── code-review/\n * │ └── SKILL.md\n * ├── pdf-processing/\n * │ └── SKILL.md\n * ```\n *\n * Uses the sandbox filesystem abstraction — works with any backend\n * (in-memory, host FS, Wasmer, Daytona, etc.).\n */\nexport class FileSystemSkillProvider implements SkillProvider {\n constructor(\n private readonly fs: SandboxFileSystem,\n private readonly baseDir: string,\n ) {}\n\n async listSkills(): Promise<SkillMetadata[]> {\n const dirs = await this.discoverSkillDirs();\n const skills: SkillMetadata[] = [];\n\n for (const dir of dirs) {\n const raw = await this.fs.readFile(join(this.baseDir, dir, \"SKILL.md\"));\n const { frontmatter } = parseSkillFile(raw);\n skills.push(frontmatter);\n }\n\n return skills;\n }\n\n async getSkill(name: string): Promise<Skill> {\n const raw = await this.fs.readFile(\n join(this.baseDir, name, \"SKILL.md\"),\n );\n const { frontmatter, body } = parseSkillFile(raw);\n\n if (frontmatter.name !== name) {\n throw new Error(\n `Skill directory \"${name}\" contains SKILL.md with mismatched name \"${frontmatter.name}\"`,\n );\n }\n\n return { ...frontmatter, instructions: body };\n }\n\n /**\n * Convenience method to load all skills with full instructions.\n * Returns `Skill[]` ready to pass into a workflow.\n */\n async loadAll(): Promise<Skill[]> {\n const dirs = await this.discoverSkillDirs();\n const skills: Skill[] = [];\n\n for (const dir of dirs) {\n const raw = await this.fs.readFile(join(this.baseDir, dir, \"SKILL.md\"));\n const { frontmatter, body } = parseSkillFile(raw);\n skills.push({ ...frontmatter, instructions: body });\n }\n\n return skills;\n }\n\n private async discoverSkillDirs(): Promise<string[]> {\n const entries = await this.fs.readdirWithFileTypes(this.baseDir);\n const dirs: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory) continue;\n const skillPath = join(this.baseDir, entry.name, \"SKILL.md\");\n if (await this.fs.exists(skillPath)) {\n dirs.push(entry.name);\n }\n }\n\n return dirs;\n }\n}\n","import type {\n ThreadManagerConfig,\n BaseThreadManager,\n} from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>,\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize),\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n };\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent\n * workflow's agent state before each invocation.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n *\n * const invoker = createLangChainModelInvoker({ redis, model });\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\nexport function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n): (config: RunAgentConfig) => Promise<R> {\n return async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<S extends BaseAgentState = BaseAgentState> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<TArgs, TResult, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>,\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type {\n Sandbox,\n SandboxCreateOptions,\n SandboxOps,\n SandboxProvider,\n SandboxSnapshot,\n} from \"./types\";\n\n/**\n * Stateless facade over a {@link SandboxProvider}.\n *\n * Delegates all lifecycle operations to the provider, which is responsible\n * for its own instance management strategy (e.g. in-memory map, remote API).\n *\n * @example\n * ```typescript\n * const manager = new SandboxManager(new InMemorySandboxProvider());\n * const activities = {\n * ...manager.createActivities(),\n * bashHandler: withSandbox(manager, bashHandler),\n * };\n * ```\n */\nexport class SandboxManager<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n constructor(private provider: SandboxProvider<TOptions, TSandbox>) {}\n\n async create(\n options?: TOptions\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }> {\n const { sandbox, stateUpdate } = await this.provider.create(options);\n return { sandboxId: sandbox.id, ...(stateUpdate && { stateUpdate }) };\n }\n\n async getSandbox(id: string): Promise<TSandbox> {\n return this.provider.get(id);\n }\n\n async destroy(id: string): Promise<void> {\n await this.provider.destroy(id);\n }\n\n async snapshot(id: string): Promise<SandboxSnapshot> {\n return this.provider.snapshot(id);\n }\n\n async restore(snapshot: SandboxSnapshot): Promise<string> {\n const sandbox = await this.provider.restore(snapshot);\n return sandbox.id;\n }\n\n /**\n * Returns Temporal activity functions matching {@link SandboxOps}.\n * Spread these into your worker's activity map.\n */\n createActivities(): SandboxOps<TOptions> {\n return {\n createSandbox: async (\n options?: TOptions\n ): Promise<{\n sandboxId: string;\n stateUpdate?: Record<string, unknown>;\n }> => {\n return this.create(options);\n },\n destroySandbox: async (sandboxId: string): Promise<void> => {\n await this.destroy(sandboxId);\n },\n snapshotSandbox: async (sandboxId: string): Promise<SandboxSnapshot> => {\n return this.snapshot(sandboxId);\n },\n };\n }\n}\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { BashArgs } from \"./tool\";\nimport type { ExecResult } from \"../../lib/sandbox/types\";\n\n/**\n * Bash tool handler — executes shell commands inside a {@link Sandbox}.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const bashHandler: ActivityToolHandler<\n BashArgs,\n ExecResult | null,\n SandboxContext\n> = async (args, { sandbox }) => {\n try {\n const result = await sandbox.exec(args.command);\n return {\n toolResponse: `Exit code: ${result.exitCode}\\n\\nstdout:\\n${result.stdout}\\n\\nstderr:\\n${result.stderr}`,\n data: result,\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 { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileEditArgs } from \"./tool\";\n\ninterface EditResult {\n path: string;\n success: boolean;\n replacements: number;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Edit tool handler — performs string replacements in sandbox files.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const editHandler: ActivityToolHandler<\n FileEditArgs,\n EditResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { file_path, old_string, new_string, replace_all = false } = args;\n\n if (old_string === new_string) {\n return {\n toolResponse: `Error: old_string and new_string must be different.`,\n data: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n try {\n const exists = await fs.exists(file_path);\n if (!exists) {\n return {\n toolResponse: `Error: File \"${file_path}\" does not exist.`,\n data: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n const content = await fs.readFile(file_path);\n\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n const escapedOldString = escapeRegExp(old_string);\n const globalRegex = new RegExp(escapedOldString, \"g\");\n const occurrences = (content.match(globalRegex) || []).length;\n\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n\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 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 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: { path: file_path, success: true, replacements },\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { GlobArgs } from \"./tool\";\nimport type { Sandbox } from \"../../lib/sandbox/types\";\n\ninterface GlobResult {\n files: string[];\n}\n\n/**\n * Simple glob-style matcher (supports `*` and `**`).\n */\nfunction matchGlob(pattern: string, path: string): boolean {\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(`^${regex}$`).test(path);\n}\n\nasync function walk(\n fs: Sandbox[\"fs\"],\n dir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdirWithFileTypes(dir);\n for (const entry of entries) {\n const full = dir === \"/\" ? `/${entry.name}` : `${dir}/${entry.name}`;\n if (entry.isDirectory) {\n results.push(...(await walk(fs, full)));\n } else {\n results.push(full);\n }\n }\n return results;\n}\n\n/**\n * Glob tool handler — searches files within a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const globHandler: ActivityToolHandler<\n GlobArgs,\n GlobResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { pattern, root = \"/\" } = args;\n\n try {\n const allFiles = await walk(fs, root);\n const relativeTo = root.endsWith(\"/\") ? root : `${root}/`;\n const matched = allFiles\n .map((f) => (f.startsWith(relativeTo) ? f.slice(relativeTo.length) : f))\n .filter((f) => matchGlob(pattern, f));\n\n return {\n toolResponse:\n matched.length > 0\n ? `Found ${matched.length} file(s):\\n${matched.join(\"\\n\")}`\n : `No files matched pattern \"${pattern}\"`,\n data: { files: matched },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error running glob: ${message}`,\n data: { files: [] },\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileReadArgs } from \"./tool\";\n\ninterface ReadFileResult {\n path: string;\n content: string;\n totalLines?: number;\n}\n\n/**\n * Read-file tool handler — reads files from a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const readFileHandler: ActivityToolHandler<\n FileReadArgs,\n ReadFileResult | null,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { path, offset, limit } = args;\n\n try {\n const exists = await fs.exists(path);\n if (!exists) {\n return {\n toolResponse: `Error: File \"${path}\" does not exist.`,\n data: null,\n };\n }\n\n const raw = await fs.readFile(path);\n const lines = raw.split(\"\\n\");\n const totalLines = lines.length;\n\n if (offset !== undefined || limit !== undefined) {\n const start = Math.max(0, (offset ?? 1) - 1);\n const end = limit !== undefined ? start + limit : lines.length;\n const slice = lines.slice(start, end);\n const numbered = slice\n .map((line, i) => `${String(start + i + 1).padStart(6)}|${line}`)\n .join(\"\\n\");\n\n return {\n toolResponse: numbered,\n data: { path, content: numbered, totalLines },\n };\n }\n\n const numbered = lines\n .map((line, i) => `${String(i + 1).padStart(6)}|${line}`)\n .join(\"\\n\");\n\n return {\n toolResponse: numbered,\n data: { path, content: numbered, totalLines },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error reading file \"${path}\": ${message}`,\n data: null,\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileWriteArgs } from \"./tool\";\n\ninterface WriteFileResult {\n path: string;\n success: boolean;\n}\n\n/**\n * Write-file tool handler — writes files to a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const writeFileHandler: ActivityToolHandler<\n FileWriteArgs,\n WriteFileResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { file_path, content } = args;\n\n try {\n const lastSlash = file_path.lastIndexOf(\"/\");\n if (lastSlash > 0) {\n const dir = file_path.slice(0, lastSlash);\n const dirExists = await fs.exists(dir);\n if (!dirExists) {\n await fs.mkdir(dir, { recursive: true });\n }\n }\n\n await fs.writeFile(file_path, content);\n\n return {\n toolResponse: `Successfully wrote to ${file_path}`,\n data: { path: file_path, success: true },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error writing file \"${file_path}\": ${message}`,\n data: { path: file_path, success: false },\n };\n }\n};\n","import type { SandboxFileSystem } from \"./types\";\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\n/**\n * Generates a formatted file tree string from a {@link SandboxFileSystem}.\n * Useful for including filesystem context in agent prompts.\n *\n * @param fs - Sandbox filesystem implementation\n * @param opts - Optional configuration for tree generation\n * @param opts.dir - Root directory to start from (defaults to `/`)\n * @param opts.separator - Path separator (`/` or `\\\\`, defaults to `/`)\n * @param opts.depth - Maximum directory depth (defaults to 10)\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * import { toTree } from 'zeitlich';\n *\n * const fileTree = await toTree(sandbox.fs);\n * // Returns:\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport const toTree = async (\n fs: SandboxFileSystem,\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/lib/tool-router/router.ts","../src/lib/thread/id.ts","../src/lib/subagent/tool.ts","../src/lib/subagent/handler.ts","../src/lib/subagent/register.ts","../src/lib/skills/tool.ts","../src/lib/skills/handler.ts","../src/lib/skills/register.ts","../src/lib/session/session.ts","../src/lib/workflow.ts","../src/lib/types.ts","../src/lib/state/manager.ts","../node_modules/uuid/dist/esm/stringify.js","../node_modules/uuid/dist/esm/rng.js","../node_modules/uuid/dist/esm/native.js","../node_modules/uuid/dist/esm/v4.js","../src/lib/tool-router/auto-append.ts","../src/lib/tool-router/with-sandbox.ts","../src/lib/subagent/define.ts","../src/lib/subagent/workflow.ts","../src/lib/sandbox/types.ts","../src/adapters/sandbox/virtual/mutations.ts","../src/adapters/sandbox/virtual/tree.ts","../src/adapters/sandbox/virtual/queries.ts","../src/lib/skills/parse.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read-file/tool.ts","../src/tools/write-file/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/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","../src/tools/bash/tool.ts","../src/tools/ask-user-question/tool.ts","../src/tools/ask-user-question/handler.ts","../src/lib/skills/fs-provider.ts","../src/lib/thread/manager.ts","../src/lib/activity.ts","../src/lib/sandbox/manager.ts","../src/tools/bash/handler.ts","../src/tools/edit/handler.ts","../src/tools/glob/handler.ts","../src/tools/read-file/handler.ts","../src/tools/write-file/handler.ts","../src/lib/sandbox/tree.ts"],"names":["ApplicationFailure","uuid4","results","z","workflowInfo","executeChild","setHandler","defineUpdate","condition","defineQuery","randomFillSync","randomUUID","key","rawVal","join","Context","numbered","tab"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolMessageContent } from \"../types\";\nimport type {\n ToolMap,\n ToolDefinition,\n RouterContext,\n ToolHandler,\n RawToolCall,\n ParsedToolCallUnion,\n ParsedToolCall,\n ToolCallResult,\n ToolCallResultUnion,\n InferToolResults,\n ToolRouterOptions,\n ToolRouter,\n ToolNames,\n ToolArgs,\n ToolResult,\n ProcessToolCallsContext,\n ToolWithHandler,\n} from \"./types\";\n\nimport type { z } from \"zod\";\nimport { ApplicationFailure, uuid4 } from \"@temporalio/workflow\";\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 } = options;\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\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 const resolve = <T>(v: T | (() => T)): T =>\n typeof v === \"function\" ? (v as () => T)() : v;\n\n const isEnabled = (tool: ToolMap[string]): boolean =>\n resolve(tool.enabled) ?? true;\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n toolMap.set(plugin.name, plugin);\n }\n }\n\n /** Run global → per-tool pre-hooks. Returns null to skip, or the (possibly modified) args. */\n async function runPreHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n turn: number\n ): Promise<{ skip: true } | { skip: false; args: unknown }> {\n let effectiveArgs: unknown = toolCall.args;\n\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) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n if (tool?.hooks?.onPreToolUse) {\n const preResult = await tool.hooks.onPreToolUse({\n args: effectiveArgs,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n return { skip: false, args: effectiveArgs };\n }\n\n /**\n * Run per-tool → global failure hooks. Returns recovery content/result,\n * or throws if no hook recovers.\n */\n async function runFailureHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n error: unknown,\n effectiveArgs: unknown,\n turn: number\n ): Promise<{ content: ToolMessageContent; result: unknown }> {\n const err = error instanceof Error ? error : new Error(String(error));\n const errorStr = String(error);\n\n if (tool?.hooks?.onPostToolUseFailure) {\n const r = await tool.hooks.onPostToolUseFailure({\n args: effectiveArgs,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n if (options.hooks?.onPostToolUseFailure) {\n const r = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n throw ApplicationFailure.fromError(error, { nonRetryable: true });\n }\n\n /** Run per-tool → global post-hooks. */\n async function runPostHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n toolResult: ToolCallResultUnion<TResults>,\n effectiveArgs: unknown,\n turn: number,\n durationMs: number\n ): Promise<void> {\n if (tool?.hooks?.onPostToolUse) {\n await tool.hooks.onPostToolUse({\n args: effectiveArgs,\n result: toolResult.data,\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\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n sandboxId?: string\n ): Promise<ToolCallResultUnion<TResults> | null> {\n const startTime = Date.now();\n const tool = toolMap.get(toolCall.name);\n\n // --- Pre-hooks: may skip or modify args ---\n const preResult = await runPreHooks(toolCall, tool, turn);\n if (preResult.skip) {\n await appendToolResult(uuid4(), {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return null;\n }\n const effectiveArgs = preResult.args;\n\n // --- Execute handler ---\n let result: unknown;\n let content!: ToolMessageContent;\n let resultAppended = false;\n\n try {\n if (tool) {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n ...(sandboxId !== undefined && { sandboxId }),\n };\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n routerContext as Parameters<typeof tool.handler>[1]\n );\n result = response.data;\n content = response.toolResponse;\n resultAppended = response.resultAppended === true;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n const recovery = await runFailureHooks(\n toolCall,\n tool,\n error,\n effectiveArgs,\n turn\n );\n result = recovery.result;\n content = recovery.content;\n }\n\n // --- Append result to thread (unless handler already did) ---\n if (!resultAppended) {\n const config = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content,\n };\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [uuid4(), config]\n );\n }\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n data: result,\n } as ToolCallResultUnion<TResults>;\n\n // --- Post-hooks ---\n await runPostHooks(\n toolCall,\n tool,\n toolResult,\n effectiveArgs,\n turn,\n Date.now() - startTime\n );\n\n return toolResult;\n }\n\n return {\n hasTools(): boolean {\n return Array.from(toolMap.values()).some(isEnabled);\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool || !isEnabled(tool)) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n const parsedArgs = resolve(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 const tool = toolMap.get(name);\n return tool !== undefined && isEnabled(tool);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.entries())\n .filter(([, tool]) => isEnabled(tool))\n .map(([name]) => name) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap)\n .filter(([, tool]) => isEnabled(tool))\n .map(([name, tool]) => ({\n name,\n description: resolve(tool.description),\n schema: resolve(tool.schema),\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\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 sandboxId = context?.sandboxId;\n\n if (options.parallel) {\n const results = await Promise.all(\n toolCalls.map((tc) => processToolCall(tc, turn, sandboxId))\n );\n return results.filter(\n (r): r is NonNullable<typeof r> => r !== null\n ) as ToolCallResultUnion<TResults>[];\n }\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const result = await processToolCall(toolCall, turn, sandboxId);\n if (result !== null) {\n results.push(result);\n }\n }\n return results;\n },\n\n async processToolCallsByName<TName extends ToolNames<T>, TResult>(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult>,\n context?: ProcessToolCallsContext\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 processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name as TName,\n ...(context?.sandboxId !== undefined && {\n sandboxId: context.sandboxId,\n }),\n };\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n routerContext as Parameters<typeof handler>[1]\n );\n\n if (!response.resultAppended) {\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [\n uuid4(),\n {\n threadId: options.threadId,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: response.toolResponse,\n },\n ]\n );\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n data: response.data,\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 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 extends RouterContext = RouterContext,\n>(\n tool: ToolWithHandler<TName, TSchema, TResult, TContext>\n): ToolWithHandler<TName, TSchema, TResult, TContext> {\n return tool;\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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import z from \"zod\";\nimport type { SubagentConfig } from \"./types\";\n\nexport const SUBAGENT_TOOL_NAME = \"Subagent\" as const;\n\nfunction buildSubagentDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => {\n const continuation = s.allowThreadContinuation\n ? \"\\n*(Supports thread continuation — pass a threadId to resume a previous conversation)*\"\n : \"\";\n return `## ${s.agentName}\\n${s.description}${continuation}`;\n })\n .join(\"\\n\\n\");\n\n return `The ${SUBAGENT_TOOL_NAME} tool launches specialized agents (subagents) that autonomously handle complex work. Each agent type has specific capabilities and tools available to it.\n\n# Available subagents:\n${subagentList}\n`;\n}\n\n/**\n * Creates a Subagent 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 */\nexport function createSubagentTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n readonly name: typeof SUBAGENT_TOOL_NAME;\n readonly description: string;\n readonly schema: z.ZodObject<z.ZodRawShape>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createSubagentTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.agentName);\n const hasThreadContinuation = subagents.some(\n (s) => s.allowThreadContinuation\n );\n\n const baseFields = {\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\n const schema = hasThreadContinuation\n ? z.object({\n ...baseFields,\n threadId: z\n .string()\n .nullable()\n .describe(\n \"Thread ID to continue an existing conversation from the same subagent, or null to start a new one\"\n ),\n })\n : z.object(baseFields);\n\n return {\n name: SUBAGENT_TOOL_NAME,\n description: buildSubagentDescription(subagents),\n schema,\n } as const;\n}\n\n/**\n * Subagent tool args type (when subagent names are not known at compile time)\n */\nexport type SubagentArgs = {\n subagent: string;\n description: string;\n prompt: string;\n threadId?: string | null;\n};\n","import { executeChild, workflowInfo } from \"@temporalio/workflow\";\nimport { getShortId } from \"../thread/id\";\nimport type { ToolHandlerResponse, RouterContext } from \"../tool-router\";\nimport type { ToolMessageContent } from \"../types\";\nimport type {\n InferSubagentResult,\n SubagentConfig,\n SubagentWorkflowInput,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\nimport type { z } from \"zod\";\n\n/**\n * Creates a Subagent 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 */\nexport function createSubagentHandler<\n const T extends readonly SubagentConfig[],\n>(subagents: [...T]) {\n const { taskQueue: parentTaskQueue } = workflowInfo();\n\n return async (\n args: SubagentArgs,\n context: RouterContext\n ): Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>> => {\n const config = subagents.find((s) => s.agentName === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.agentName).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${args.subagent}-${getShortId()}`;\n\n const { sandboxId: parentSandboxId } = context;\n const inheritSandbox = config.sandbox !== \"own\" && !!parentSandboxId;\n\n const workflowInput: SubagentWorkflowInput = {\n ...(args.threadId &&\n args.threadId !== null &&\n config.allowThreadContinuation && {\n previousThreadId: args.threadId,\n }),\n ...(inheritSandbox && { sandboxId: parentSandboxId }),\n };\n\n const resolvedContext =\n config.context === undefined\n ? undefined\n : typeof config.context === \"function\"\n ? config.context()\n : config.context;\n\n const childOpts = {\n workflowId: childWorkflowId,\n args:\n resolvedContext === undefined\n ? ([args.prompt, workflowInput] as const)\n : ([args.prompt, workflowInput, resolvedContext] as const),\n taskQueue: config.taskQueue ?? parentTaskQueue,\n };\n\n const {\n toolResponse,\n data,\n usage,\n threadId: childThreadId,\n } = typeof config.workflow === \"string\"\n ? await executeChild(config.workflow, childOpts)\n : await executeChild(config.workflow, childOpts);\n\n if (!toolResponse) {\n return {\n toolResponse: \"Subagent workflow returned no response\",\n data: null,\n ...(usage && { usage }),\n };\n }\n\n const validated = (\n config.resultSchema ? config.resultSchema.safeParse(data) : null\n ) as z.ZodSafeParseResult<InferSubagentResult<T[number]>> | null;\n\n if (validated && !validated.success) {\n return {\n toolResponse: `Subagent workflow returned invalid data: ${validated.error.message}`,\n data: null,\n ...(usage && { usage }),\n };\n }\n\n let finalToolResponse: ToolMessageContent = toolResponse;\n if (config.allowThreadContinuation && childThreadId) {\n finalToolResponse =\n typeof toolResponse === \"string\"\n ? `${toolResponse}\\n\\n[${config.agentName} Thread ID: ${childThreadId}]`\n : toolResponse;\n }\n\n return {\n toolResponse: finalToolResponse,\n data: validated ? validated.data : data,\n ...(usage && { usage }),\n };\n };\n}\n","import type {\n PreToolUseHookResult,\n PostToolUseFailureHookResult,\n ToolHooks,\n ToolMap,\n} from \"../tool-router/types\";\nimport type { SubagentConfig, SubagentHooks } from \"./types\";\nimport type { z } from \"zod\";\nimport { createSubagentTool, SUBAGENT_TOOL_NAME, type SubagentArgs } from \"./tool\";\nimport { createSubagentHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the Subagent tool,\n * including per-subagent hook delegation.\n *\n * Lazily evaluates `enabled` (supports `boolean | () => boolean`)\n * so that `description` and `schema` reflect the current set of\n * active subagents each time getToolDefinitions() is called.\n *\n * Returns null if no subagents are configured.\n */\nexport function buildSubagentRegistration(\n subagents: SubagentConfig[]\n): ToolMap[string] | null {\n if (subagents.length === 0) return null;\n\n const getEnabled = (): SubagentConfig[] =>\n subagents.filter((s) =>\n typeof s.enabled === \"function\" ? s.enabled() : (s.enabled ?? true),\n );\n\n const subagentHooksMap = new Map<string, SubagentHooks>();\n for (const s of subagents) {\n if (s.hooks) subagentHooksMap.set(s.agentName, s.hooks);\n }\n\n const resolveSubagentName = (args: unknown): string =>\n (args as SubagentArgs).subagent;\n\n return {\n name: SUBAGENT_TOOL_NAME,\n enabled: (): boolean => getEnabled().length > 0,\n description: (): string => createSubagentTool(getEnabled()).description,\n schema: (): z.ZodObject<z.ZodRawShape> => createSubagentTool(getEnabled()).schema,\n handler: createSubagentHandler(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","import z from \"zod\";\nimport type { Skill } from \"./types\";\n\nexport const READ_SKILL_TOOL_NAME = \"ReadSkill\" as const;\n\nfunction buildReadSkillDescription(skills: Skill[]): string {\n const skillList = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Load the full instructions for a skill. Read the skill before following its instructions.\n\n# Available skills:\n${skillList}\n`;\n}\n\n/**\n * Creates a ReadSkill tool configured with the available skills.\n * The tool description embeds skill metadata so the agent discovers\n * skills purely through the tool definition.\n */\nexport function createReadSkillTool(skills: Skill[]): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n skill_name: z.ZodEnum<Record<string, string>>;\n }>;\n} {\n if (skills.length === 0) {\n throw new Error(\"createReadSkillTool requires at least one skill\");\n }\n\n const names = skills.map((s) => s.name);\n\n return {\n name: READ_SKILL_TOOL_NAME,\n description: buildReadSkillDescription(skills),\n schema: z.object({\n skill_name: z.enum(names).describe(\"The name of the skill to load\"),\n }),\n } as const;\n}\n\nexport type ReadSkillArgs = {\n skill_name: string;\n};\n","import type { Skill } from \"./types\";\nimport type { ToolHandlerResponse } from \"../tool-router\";\nimport type { ReadSkillArgs } from \"./tool\";\n\n/**\n * Creates a ReadSkill handler that looks up skills from an in-memory array.\n * Runs directly in the workflow (like task tools) — no activity needed.\n */\nexport function createReadSkillHandler(\n skills: Skill[]\n): (args: ReadSkillArgs) => ToolHandlerResponse<null> {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n return (args: ReadSkillArgs): ToolHandlerResponse<null> => {\n const skill = skillMap.get(args.skill_name);\n\n if (!skill) {\n return {\n toolResponse: JSON.stringify({\n error: `Skill \"${args.skill_name}\" not found`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: skill.instructions,\n data: null,\n };\n };\n}\n","import type { ToolMap } from \"../tool-router/types\";\nimport type { Skill } from \"./types\";\nimport { createReadSkillTool } from \"./tool\";\nimport { createReadSkillHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the ReadSkill tool.\n *\n * Returns null if no skills are provided.\n */\nexport function buildSkillRegistration(\n skills: Skill[]\n): ToolMap[string] | null {\n if (skills.length === 0) return null;\n\n return {\n ...createReadSkillTool(skills),\n handler: createReadSkillHandler(skills),\n };\n}\n","import {\n condition,\n defineUpdate,\n setHandler,\n ApplicationFailure,\n} from \"@temporalio/workflow\";\nimport type { SessionExitReason, MessageContent } from \"../types\";\nimport type { SessionConfig, ZeitlichSession } from \"./types\";\nimport { type AgentStateManager, type JsonSerializable } from \"../state/types\";\nimport { createToolRouter } from \"../tool-router/router\";\nimport type { ParsedToolCallUnion, ToolMap } from \"../tool-router/types\";\nimport { getShortId } from \"../thread/id\";\nimport { buildSubagentRegistration } from \"../subagent/register\";\nimport { buildSkillRegistration } from \"../skills/register\";\nimport { uuid4 } from \"@temporalio/workflow\";\n\n/**\n * Creates an agent session that manages the agent loop: LLM invocation,\n * tool routing, subagent coordination, and lifecycle hooks.\n *\n * @param config - Session and agent configuration (merged `SessionConfig` and `AgentConfig`)\n * @returns A session object with `runSession()` to start the agent loop\n *\n * @example\n * ```typescript\n * import { createSession, createAgentStateManager, defineTool, bashTool } from 'zeitlich/workflow';\n * import { proxyGoogleGenAIThreadOps } from 'zeitlich/adapters/thread/google-genai/workflow';\n *\n * const session = await createSession({\n * agentName: \"my-agent\",\n * maxTurns: 20,\n * threadId: runId,\n * threadOps: proxyGoogleGenAIThreadOps(), // auto-scoped to current workflow\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * subagents: [researcherSubagent],\n * tools: {\n * Bash: defineTool({ ...bashTool, handler: bashHandlerActivity }),\n * },\n * });\n *\n * const { finalMessage, exitReason } = await session.runSession({ stateManager });\n * ```\n */\nexport const createSession = async <T extends ToolMap, M = unknown>({\n threadId: providedThreadId,\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n threadOps,\n buildContextMessage,\n subagents,\n skills,\n tools = {} as T,\n processToolsInParallel = true,\n hooks = {},\n appendSystemPrompt = true,\n continueThread = false,\n waitForInputTimeout = \"48h\",\n sandbox: sandboxOps,\n sandboxId: inheritedSandboxId,\n}: SessionConfig<T, M>): Promise<ZeitlichSession<M>> => {\n const sourceThreadId = continueThread ? providedThreadId : undefined;\n const threadId =\n continueThread && providedThreadId\n ? getShortId()\n : (providedThreadId ?? getShortId());\n\n const {\n appendToolResult,\n appendHumanMessage,\n initializeThread,\n appendSystemMessage,\n forkThread,\n } = threadOps;\n\n const plugins: ToolMap[string][] = [];\n if (subagents) {\n const reg = buildSubagentRegistration(subagents);\n if (reg) plugins.push(reg);\n }\n if (skills) {\n const reg = buildSkillRegistration(skills);\n if (reg) plugins.push(reg);\n }\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n hooks,\n plugins,\n parallel: processToolsInParallel,\n });\n\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 <TState extends JsonSerializable<TState>>({\n stateManager,\n }: {\n stateManager: AgentStateManager<TState>;\n }): Promise<{\n threadId: string;\n finalMessage: M | null;\n exitReason: SessionExitReason;\n usage: ReturnType<AgentStateManager<TState>[\"getTotalUsage\"]>;\n }> => {\n setHandler(\n defineUpdate<unknown, [MessageContent]>(`add${agentName}Message`),\n async (message: MessageContent) => {\n if (hooks.onPreHumanMessageAppend) {\n await hooks.onPreHumanMessageAppend({\n message,\n threadId,\n });\n }\n await appendHumanMessage(threadId, uuid4(), message);\n if (hooks.onPostHumanMessageAppend) {\n await hooks.onPostHumanMessageAppend({\n message,\n threadId,\n });\n }\n stateManager.run();\n }\n );\n\n // --- Sandbox lifecycle: create or inherit ---\n let sandboxId: string | undefined = inheritedSandboxId;\n const ownsSandbox = !sandboxId && !!sandboxOps;\n if (ownsSandbox) {\n const result = await sandboxOps.createSandbox({ id: threadId });\n sandboxId = result.sandboxId;\n if (result.stateUpdate) {\n stateManager.mergeUpdate(result.stateUpdate as Partial<TState>);\n }\n }\n\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n\n const systemPrompt = stateManager.getSystemPrompt();\n\n if (continueThread && sourceThreadId) {\n await forkThread(sourceThreadId, threadId);\n } else {\n if (appendSystemPrompt) {\n if (!systemPrompt || systemPrompt.trim() === \"\") {\n throw ApplicationFailure.create({\n message: \"No system prompt in state\",\n nonRetryable: true,\n });\n }\n await appendSystemMessage(threadId, uuid4(), systemPrompt);\n } else {\n await initializeThread(threadId);\n }\n }\n await appendHumanMessage(threadId, uuid4(), 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 stateManager.setTools(toolRouter.getToolDefinitions());\n\n const { message, rawToolCalls, usage } = await runAgent({\n threadId,\n agentName,\n metadata,\n });\n\n if (usage) {\n stateManager.updateUsage(usage);\n }\n\n if (!toolRouter.hasTools() || rawToolCalls.length === 0) {\n stateManager.complete();\n exitReason = \"completed\";\n return {\n threadId,\n finalMessage: message,\n exitReason,\n usage: stateManager.getTotalUsage(),\n };\n }\n\n const parsedToolCalls: ParsedToolCallUnion<T>[] = [];\n for (const tc of rawToolCalls) {\n try {\n parsedToolCalls.push(toolRouter.parseToolCall(tc));\n } catch (error) {\n await appendToolResult(uuid4(), {\n threadId,\n toolCallId: tc.id ?? \"\",\n toolName: tc.name,\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 toolCallResults = await toolRouter.processToolCalls(\n parsedToolCalls,\n {\n turn: currentTurn,\n ...(sandboxId !== undefined && { sandboxId }),\n }\n );\n\n for (const result of toolCallResults) {\n if (result.usage) {\n stateManager.updateUsage(result.usage);\n }\n }\n\n if (stateManager.getStatus() === \"WAITING_FOR_INPUT\") {\n const conditionMet = await condition(\n () => stateManager.getStatus() === \"RUNNING\",\n waitForInputTimeout\n );\n if (!conditionMet) {\n stateManager.cancel();\n exitReason = \"cancelled\";\n await condition(() => false, \"2s\");\n break;\n }\n }\n }\n\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n }\n } catch (error) {\n exitReason = \"failed\";\n throw ApplicationFailure.fromError(error);\n } finally {\n await callSessionEnd(exitReason, stateManager.getTurns());\n\n if (ownsSandbox && sandboxId && sandboxOps) {\n await sandboxOps.destroySandbox(sandboxId);\n }\n }\n\n return {\n threadId,\n finalMessage: null,\n exitReason,\n usage: stateManager.getTotalUsage(),\n };\n },\n };\n};\n\n","/**\n * Session config fields derived from a main workflow input, ready to spread\n * into `createSession`.\n */\nexport interface WorkflowSessionInput {\n /** Agent name — spread directly into `createSession` */\n agentName: string;\n /** Thread ID to continue (set from `input.previousThreadId`) */\n threadId?: string;\n /** Whether to continue an existing thread (true when `previousThreadId` is present) */\n continueThread?: boolean;\n /** Optional sandbox ID forwarded to the session */\n sandboxId?: string;\n}\n\n/** Raw workflow input fields that map into `WorkflowSessionInput`. */\nexport interface WorkflowInput {\n /** When set, continue this thread instead of starting fresh */\n previousThreadId?: string;\n /** Optional sandbox ID to reuse */\n sandboxId?: string;\n}\n\nexport interface WorkflowConfig {\n /** Workflow name — used as the Temporal workflow function name */\n name: string;\n}\n\n/**\n * Wraps a main workflow function, translating workflow input fields into\n * session-compatible fields that can be spread directly into `createSession`.\n *\n * The wrapper:\n * - Accepts a `config` with at least a `name` (used for Temporal workflow naming)\n * - Accepts a handler `fn` receiving `(input, sessionInput)`\n * - Derives `threadId` + `continueThread` from `workflowInput.previousThreadId`\n * - Derives `sandboxId` from `workflowInput.sandboxId`\n */\nexport function defineWorkflow<TInput, TResult>(\n config: WorkflowConfig,\n fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult>\n): (input: TInput, workflowInput?: WorkflowInput) => Promise<TResult> {\n const workflow = async (input: TInput, workflowInput: WorkflowInput = {}) => {\n const sessionInput: WorkflowSessionInput = {\n agentName: config.name,\n ...(workflowInput.previousThreadId && {\n threadId: workflowInput.previousThreadId,\n continueThread: true,\n }),\n ...(workflowInput.sandboxId && { sandboxId: workflowInput.sandboxId }),\n };\n return fn(input, sessionInput);\n };\n\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return workflow;\n}\n","// ============================================================================\n// Framework-agnostic message types\n// ============================================================================\n\n/** A single content part within a structured message (text, image, etc.) */\nexport type ContentPart = { type: string; [key: string]: unknown };\n\n/** Message content — plain string or an array of structured content parts */\nexport type MessageContent = string | ContentPart[];\n\n/** Content returned by a tool handler */\nexport type ToolMessageContent = MessageContent;\n\n// ============================================================================\n// Agent core types\n// ============================================================================\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 systemPrompt?: string;\n totalInputTokens: number;\n totalOutputTokens: number;\n cachedWriteTokens: number;\n cachedReadTokens: number;\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\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n}\n\n/**\n * Configuration for a Zeitlich agent\n */\nexport interface AgentConfig {\n /** The name of the agent, should be unique within the workflows, ideally Pascal Case */\n agentName: string;\n /** Description, used for sub agents */\n description?: string;\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 extends AgentConfig {\n /** The thread ID to use for the session */\n threadId: string;\n /** Metadata for the session */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n toolCallId: string;\n /** The name of the tool that produced this result */\n toolName: string;\n /** Content for the tool message (string or complex content parts) */\n content: ToolMessageContent;\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 exit\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 * 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 {\n condition,\n defineQuery,\n defineUpdate,\n setHandler,\n} from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"../types\";\nimport type { ToolDefinition } from \"../tool-router/types\";\nimport type { AgentState, AgentStateManager, JsonSerializable } from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Creates an agent state manager for tracking workflow state.\n * Automatically registers Temporal query and update handlers for the agent.\n *\n * @param options.agentName - Unique agent name, used to derive query/update handler names\n * @param options.initialState - Optional initial values for base and custom state.\n * Use `systemPrompt` here to set the agent's system prompt.\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty\n *\n * @example\n * ```typescript\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: \"You are a helpful assistant.\",\n * },\n * agentName: \"my-agent\",\n * });\n *\n * // With custom state fields\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: agentConfig.systemPrompt,\n * customField: \"value\",\n * },\n * agentName: agentConfig.agentName,\n * });\n * ```\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>({\n initialState,\n}: {\n initialState?: Partial<BaseAgentState> & TCustom;\n}): AgentStateManager<TCustom> {\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 let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCachedWriteTokens = 0;\n let totalCachedReadTokens = 0;\n let totalReasonTokens = 0;\n let systemPrompt = initialState?.systemPrompt;\n\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\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 const stateQuery = defineQuery<AgentState<TCustom>>(\"getAgentState\");\n const stateChangeUpdate = defineUpdate<AgentState<TCustom>, [number]>(\n \"waitForAgentStateChange\"\n );\n\n setHandler(stateQuery, () => buildState());\n setHandler(stateChangeUpdate, async (lastKnownVersion: number) => {\n await condition(\n () => version > lastKnownVersion || isTerminalStatus(status),\n \"55s\"\n );\n return buildState();\n });\n\n return {\n stateQuery,\n stateChangeUpdate,\n\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n getSystemPrompt(): string | undefined {\n return systemPrompt;\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 mergeUpdate(update: Partial<TCustom>): void {\n Object.assign(customState as object, update);\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 setSystemPrompt(newSystemPrompt: string): void {\n systemPrompt = newSystemPrompt;\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 updateUsage(usage: {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n }): void {\n totalInputTokens += usage.inputTokens ?? 0;\n totalOutputTokens += usage.outputTokens ?? 0;\n totalCachedWriteTokens += usage.cachedWriteTokens ?? 0;\n totalCachedReadTokens += usage.cachedReadTokens ?? 0;\n totalReasonTokens += usage.reasonTokens ?? 0;\n },\n\n getTotalUsage(): {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n } {\n return {\n totalInputTokens,\n totalOutputTokens,\n totalCachedWriteTokens,\n totalCachedReadTokens,\n totalReasonTokens,\n turns,\n };\n },\n };\n}\n","import validate from './validate.js';\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 return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { 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 if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\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;\n","import type { ToolResultConfig } from \"../types\";\nimport type { ActivityToolHandler, RouterContext } from \"./types\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/**\n * Wraps a tool handler to automatically append its result directly to the\n * thread and sets `resultAppended: true` on the response.\n *\n * Use this for tools whose responses may exceed Temporal's activity payload\n * limit. The wrapper appends to the thread inside the activity (where Redis\n * is available), then replaces `toolResponse` with an empty string so the\n * large payload never travels through the Temporal workflow boundary.\n *\n * @param getThread - Factory that returns a thread manager for the given threadId\n * @param handler - The original tool handler\n * @returns A wrapped handler that auto-appends and flags the response\n *\n * @example\n * ```typescript\n * import { withAutoAppend } from '@bead-ai/zeitlich/workflow';\n * import { createThreadManager } from '@bead-ai/zeitlich';\n *\n * const handler = withAutoAppend(\n * (threadId) => createThreadManager({ redis, threadId }),\n * async (args, ctx) => ({\n * toolResponse: JSON.stringify(largeResult), // appended directly to Redis\n * data: { summary: \"...\" }, // small data for workflow\n * }),\n * );\n * ```\n */\nexport function withAutoAppend<\n TArgs,\n TResult,\n TContext extends RouterContext = RouterContext,\n>(\n threadHandler: (id: string, config: ToolResultConfig) => Promise<void>,\n handler: ActivityToolHandler<TArgs, TResult, TContext>\n): ActivityToolHandler<TArgs, TResult, TContext> {\n return async (args: TArgs, context: TContext) => {\n const response = await handler(args, context);\n\n await threadHandler(uuidv4(), {\n threadId: context.threadId,\n toolCallId: context.toolCallId,\n toolName: context.toolName,\n content: response.toolResponse,\n });\n\n return {\n toolResponse: \"Response appended via withAutoAppend\",\n data: response.data,\n resultAppended: true,\n };\n };\n}\n","import type { Sandbox } from \"../sandbox/types\";\nimport type { ActivityToolHandler, RouterContext, ToolHandlerResponse } from \"./types\";\n\n/**\n * Extended router context with a resolved {@link Sandbox} instance.\n *\n * Handlers typed with this context are guaranteed to have a live sandbox\n * and a non-optional `sandboxId`. Use with {@link withSandbox} to\n * automatically resolve the sandbox from the manager.\n */\nexport interface SandboxContext extends RouterContext {\n sandbox: Sandbox;\n sandboxId: string;\n}\n\n/**\n * Wraps a tool handler that requires a {@link Sandbox}, automatically\n * resolving it from the manager via the `sandboxId` on the router context.\n *\n * If no `sandboxId` is present the wrapper short-circuits with an error\n * response and `data: null`, so the inner handler never runs without a\n * valid sandbox.\n *\n * The sandbox type parameter `TSandbox` is inferred from the manager's\n * `getSandbox` return type, allowing handlers to receive provider-specific\n * sandbox subtypes (e.g. `DaytonaSandbox`) without manual casting.\n *\n * @param manager - Any object with a `getSandbox` method (e.g. {@link SandboxManager})\n * @param handler - The inner handler that expects a sandbox context\n * @returns A standard `ActivityToolHandler` that can be registered on the router\n *\n * @example\n * ```typescript\n * import { withSandbox, type SandboxContext } from 'zeitlich';\n *\n * // Generic sandbox — works with any provider:\n * const bashHandler: ActivityToolHandler<BashArgs, ExecResult, SandboxContext> =\n * async (args, { sandbox }) => {\n * const result = await sandbox.exec(args.command);\n * return { toolResponse: result.stdout, data: result };\n * };\n * const handler = withSandbox(manager, bashHandler);\n *\n * // Provider-specific sandbox — use SandboxManager<DaytonaSandbox>:\n * const daytonaManager = new SandboxManager<DaytonaSandbox>(provider);\n * const handler2 = withSandbox(daytonaManager, async (args, { sandbox }) => {\n * // sandbox is typed as DaytonaSandbox here\n * await sandbox.fs.uploadFiles([...]);\n * return { toolResponse: 'ok', data: null };\n * });\n * ```\n */\nexport function withSandbox<TArgs, TResult, TSandbox extends Sandbox = Sandbox>(\n manager: { getSandbox(id: string): Promise<TSandbox> },\n handler: (\n args: TArgs,\n context: RouterContext & { sandbox: TSandbox; sandboxId: string },\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult | null> {\n return async (args, context) => {\n if (!context.sandboxId) {\n return {\n toolResponse: `Error: No sandbox configured for this agent. The ${context.toolName} tool requires a sandbox.`,\n data: null,\n };\n }\n const sandbox = await manager.getSandbox(context.sandboxId);\n return handler(args, { ...context, sandbox, sandboxId: context.sandboxId });\n };\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentConfig,\n SubagentDefinition,\n SubagentHooks,\n SubagentWorkflow,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\n\n/**\n * Creates a `SubagentConfig` from a `SubagentDefinition` (returned by `defineSubagentWorkflow`).\n * Metadata (name, description, resultSchema) is read from the definition — only configure\n * what's specific to this usage in the parent workflow.\n *\n * @example\n * ```ts\n * // Minimal — all metadata comes from the definition\n * export const researcher = defineSubagent(researcherWorkflow);\n *\n * // With parent-specific overrides\n * export const researcher = defineSubagent(researcherWorkflow, {\n * allowThreadContinuation: true,\n * sandbox: \"own\",\n * hooks: {\n * onPostExecution: ({ result }) => console.log(result),\n * },\n * });\n *\n * // With typed context\n * export const researcher = defineSubagent(researcherWorkflow, {\n * context: { apiKey: \"...\" },\n * });\n * ```\n */\nexport function defineSubagent<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n definition: SubagentDefinition<TResult, TContext>,\n overrides?: {\n context?: TContext | (() => TContext);\n hooks?: SubagentHooks<SubagentArgs, z.infer<TResult>>;\n enabled?: boolean | (() => boolean);\n taskQueue?: string;\n allowThreadContinuation?: boolean;\n sandbox?: \"inherit\" | \"own\";\n },\n): SubagentConfig<TResult> {\n return {\n agentName: definition.agentName,\n description: definition.description,\n workflow: definition as SubagentWorkflow<TResult>,\n ...(definition.resultSchema !== undefined && {\n resultSchema: definition.resultSchema,\n }),\n ...overrides,\n } as SubagentConfig<TResult>;\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentDefinition,\n SubagentHandlerResponse,\n SubagentWorkflowInput,\n SubagentSessionInput,\n} from \"./types\";\n\n/**\n * Defines a subagent workflow with embedded metadata (name, description, resultSchema).\n * The returned value can be passed directly to `defineSubagent` — no need to repeat\n * the name, description, or resultSchema in the parent workflow.\n *\n * Internally maps `SubagentWorkflowInput` fields to session-compatible `SubagentSessionInput`.\n *\n * @example\n * ```ts\n * import {\n * defineSubagentWorkflow,\n * defineSubagent,\n * createSession,\n * createAgentStateManager,\n * } from 'zeitlich/workflow';\n *\n * // Define once — carries name, description, resultSchema\n * export const researcherWorkflow = defineSubagentWorkflow(\n * {\n * name: \"researcher\",\n * description: \"Researches topics on the web\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * async (prompt, sessionInput) => {\n * const stateManager = createAgentStateManager({\n * initialState: { systemPrompt: \"You are a researcher.\" },\n * });\n *\n * const session = await createSession({\n * ...sessionInput,\n * agentName: \"researcher\",\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * });\n *\n * const { finalMessage, threadId } = await session.runSession({ stateManager });\n * return { toolResponse: finalMessage ?? \"No response\", data: null, threadId };\n * },\n * );\n *\n * // Use in parent — only configure what's parent-specific\n * export const researcher = defineSubagent(researcherWorkflow, {\n * hooks: { onPostExecution: ({ result }) => console.log(result) },\n * });\n * ```\n */\n// Without resultSchema — data is null\nexport function defineSubagentWorkflow<\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: { name: string; description: string },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentHandlerResponse<null>>\n): SubagentDefinition<z.ZodNull, TContext>;\n// With resultSchema — data is inferred from the schema\nexport function defineSubagentWorkflow<\n TResult extends z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: { name: string; description: string; resultSchema: TResult },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentHandlerResponse<z.infer<TResult> | null>>\n): SubagentDefinition<TResult, TContext>;\nexport function defineSubagentWorkflow(\n config: { name: string; description: string; resultSchema?: z.ZodType },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: Record<string, unknown>\n ) => Promise<SubagentHandlerResponse<unknown>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): SubagentDefinition<any, any> {\n const workflow = async (\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: Record<string, unknown>\n ): Promise<SubagentHandlerResponse<unknown>> => {\n const sessionInput: SubagentSessionInput = {\n agentName: config.name,\n ...(workflowInput.previousThreadId && {\n threadId: workflowInput.previousThreadId,\n continueThread: true,\n }),\n ...(workflowInput.sandboxId && { sandboxId: workflowInput.sandboxId }),\n };\n return fn(prompt, sessionInput, context ?? {});\n };\n\n // for temporal workflow name\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return Object.assign(workflow, {\n agentName: config.name,\n description: config.description,\n ...(config.resultSchema !== undefined && {\n resultSchema: config.resultSchema,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as SubagentDefinition<any, any>;\n}\n","// ============================================================================\n// Sandbox Filesystem\n// ============================================================================\n\nexport interface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface FileStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mtime: Date;\n}\n\n/**\n * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n cp(src: string, dest: string, options?: { recursive?: boolean }): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n /** Optional state to merge into the workflow's `AgentState` via the session. */\n stateUpdate?: Record<string, unknown>;\n}\n\nexport interface SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n fork(sandboxId: string): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> {\n createSandbox(\n options?: TOptions,\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }>;\n destroySandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n forkSandbox(sandboxId: string): Promise<string>;\n}\n\n/**\n * Maps generic {@link SandboxOps} method names to adapter-prefixed names.\n *\n * @example\n * ```typescript\n * type InMemOps = PrefixedSandboxOps<\"inMemory\">;\n * // → { inMemoryCreateSandbox, inMemoryDestroySandbox, inMemorySnapshotSandbox }\n * ```\n */\nexport type PrefixedSandboxOps<\n TPrefix extends string,\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> = {\n [K in keyof SandboxOps<TOptions> as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions>[K];\n};\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true,\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type { FileEntryMetadata, VirtualFileTree, TreeMutation } from \"./types\";\n\n/**\n * Apply a list of {@link TreeMutation}s to the `fileTree` stored in a state\n * manager instance, updating it in place and returning the new tree.\n *\n * The `stateManager` parameter is structurally typed so any\n * {@link AgentStateManager} whose custom state includes\n * `fileTree: VirtualFileTree<TMeta>` will satisfy it.\n */\nexport function applyVirtualTreeMutations<TMeta = FileEntryMetadata>(\n stateManager: {\n get(key: \"fileTree\"): VirtualFileTree<TMeta>;\n set(key: \"fileTree\", value: VirtualFileTree<TMeta>): void;\n },\n mutations: TreeMutation<TMeta>[],\n): VirtualFileTree<TMeta> {\n let tree = [...stateManager.get(\"fileTree\")];\n\n for (const m of mutations) {\n switch (m.type) {\n case \"add\":\n tree.push(m.entry);\n break;\n case \"remove\":\n tree = tree.filter((e) => e.path !== m.path);\n break;\n case \"update\":\n tree = tree.map((e) =>\n e.path === m.path ? { ...e, ...m.entry } : e\n );\n break;\n }\n }\n\n stateManager.set(\"fileTree\", tree);\n return tree;\n}\n","import type { FileEntry } from \"./types\";\n\ninterface TreeNode {\n name: string;\n children: Map<string, TreeNode>;\n isFile: boolean;\n}\n\nconst buildTree = <T>(entries: FileEntry<T>[]): TreeNode => {\n const root: TreeNode = { name: \"/\", children: new Map(), isFile: false };\n\n for (const entry of entries) {\n const parts = entry.path.split(\"/\").filter(Boolean);\n let current = root;\n for (const part of parts) {\n let child = current.children.get(part);\n if (!child) {\n child = { name: part, children: new Map(), isFile: false };\n current.children.set(part, child);\n }\n current = child;\n }\n current.isFile = current.children.size === 0;\n }\n\n return root;\n};\n\nconst printNode = (node: TreeNode, tab: string, sort: boolean): string => {\n const entries = [...node.children.values()];\n if (sort) {\n entries.sort((a, b) => {\n if (!a.isFile && !b.isFile) return a.name.localeCompare(b.name);\n if (!a.isFile) return -1;\n if (!b.isFile) return 1;\n return a.name.localeCompare(b.name);\n });\n }\n\n let str = \"\";\n for (const [i, entry] of entries.entries()) {\n const isLast = i === entries.length - 1;\n const branch = isLast ? \"└─\" : \"├─\";\n const childTab = tab + (isLast ? \" \" : \"│ \");\n\n if (entry.isFile) {\n str += \"\\n\" + tab + branch + \" \" + entry.name;\n } else {\n const subtree = printNode(entry, childTab, sort);\n str += \"\\n\" + tab + branch + \" \" + entry.name + \"/\" + subtree;\n }\n }\n return str;\n};\n\n/**\n * Generates a formatted file tree string from a flat {@link FileEntry} list.\n * Directories are inferred from file paths — no filesystem access needed.\n *\n * @param entries - Flat list of file entries\n * @param opts - Optional configuration\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * const tree = formatVirtualFileTree(state.fileTree);\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport function formatVirtualFileTree<T>(\n entries: FileEntry<T>[],\n opts: { sort?: boolean } = {}\n): string {\n const sort = opts.sort ?? true;\n const root = buildTree(entries);\n return \"/\" + printNode(root, \"\", sort);\n}\n","import type { FileEntry } from \"./types\";\n\n/**\n * Structural constraint: accepts any `AgentStateManager<T>` whose custom\n * state includes `fileTree: FileEntry<TMeta>[]`.\n */\nexport interface FileTreeAccessor<TMeta> {\n get(key: \"fileTree\"): FileEntry<TMeta>[];\n}\n\n/**\n * Check whether any file in the tree has a `metadata.mimeType` that matches\n * the given pattern.\n *\n * Patterns:\n * - Exact: `\"application/pdf\"`\n * - Wildcard type: `\"image/*\"`\n *\n * Useful for conditionally enabling tools:\n *\n * ```ts\n * { enabled: hasFileWithMimeType(stateManager, \"image/*\") }\n * { enabled: hasFileWithMimeType(stateManager, [\"image/*\", \"application/pdf\"]) }\n * ```\n */\nexport function hasFileWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string | string[],\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(buildMatcher);\n return tree.some((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && matchers.some((m) => m(mime));\n });\n}\n\n/**\n * Return all entries whose `metadata.mimeType` matches the given pattern.\n */\nexport function filesWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): FileEntry<TMeta>[] {\n const tree = stateManager.get(\"fileTree\");\n const match = buildMatcher(pattern);\n return tree.filter((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && match(mime);\n });\n}\n\n/**\n * Check whether the tree contains a directory whose name matches the given\n * pattern. Directories are inferred from file paths.\n *\n * Patterns:\n * - Exact: `\"src\"`\n * - Glob with `*` wildcard: `\"test*\"`, `\"*.generated\"`\n *\n * ```ts\n * { enabled: hasDirectory(stateManager, \"test*\") }\n * ```\n */\nexport function hasDirectory<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const match = buildGlobMatcher(pattern);\n return tree.some((entry) => {\n const segments = entry.path.split(\"/\").filter(Boolean);\n return segments.slice(0, -1).some(match);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal matchers\n// ---------------------------------------------------------------------------\n\nfunction buildMatcher(pattern: string): (value: string) => boolean {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return (v) => v.startsWith(prefix);\n }\n return (v) => v === pattern;\n}\n\nfunction buildGlobMatcher(pattern: string): (value: string) => boolean {\n if (!pattern.includes(\"*\")) return (v) => v === pattern;\n const re = new RegExp(\n \"^\" + pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\",\n );\n return (v) => re.test(v);\n}\n","import type { SkillMetadata } from \"./types\";\n\n/**\n * Parse a SKILL.md file into its frontmatter fields and markdown body.\n *\n * Handles the limited YAML subset used by the agentskills.io spec:\n * flat key-value pairs plus one-level nested `metadata` map.\n * No external YAML dependency required.\n */\nexport function parseSkillFile(raw: string): {\n frontmatter: SkillMetadata;\n body: string;\n} {\n const trimmed = raw.replace(/^\\uFEFF/, \"\"); // strip BOM\n const match = trimmed.match(/^---[ \\t]*\\r?\\n([\\s\\S]*?)\\r?\\n---[ \\t]*\\r?\\n?([\\s\\S]*)$/);\n\n if (!match) {\n throw new Error(\n \"SKILL.md must start with YAML frontmatter delimited by ---\"\n );\n }\n\n const [, yamlBlock, body] = match as [string, string, string];\n const frontmatter = parseSimpleYaml(yamlBlock);\n\n if (!frontmatter.name || typeof frontmatter.name !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'name' field\");\n }\n if (!frontmatter.description || typeof frontmatter.description !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'description' field\");\n }\n\n const result: SkillMetadata = {\n name: frontmatter.name,\n description: frontmatter.description,\n };\n\n if (frontmatter.license) result.license = String(frontmatter.license);\n if (frontmatter.compatibility)\n result.compatibility = String(frontmatter.compatibility);\n if (frontmatter[\"allowed-tools\"]) {\n result.allowedTools = String(frontmatter[\"allowed-tools\"])\n .split(/\\s+/)\n .filter(Boolean);\n }\n if (\n frontmatter.metadata &&\n typeof frontmatter.metadata === \"object\" &&\n !Array.isArray(frontmatter.metadata)\n ) {\n result.metadata = frontmatter.metadata as Record<string, string>;\n }\n\n return { frontmatter: result, body: body.trim() };\n}\n\ntype YamlValue = string | Record<string, string>;\n\n/**\n * Minimal YAML parser for the agentskills.io frontmatter subset.\n * Supports: scalar key-value pairs, one-level nested maps (metadata).\n * Does NOT support arrays, multi-line strings, anchors, etc.\n */\nfunction parseSimpleYaml(yaml: string): Record<string, YamlValue> {\n const result: Record<string, YamlValue> = {};\n const lines = yaml.split(/\\r?\\n/);\n\n let currentMapKey: string | null = null;\n let currentMap: Record<string, string> | null = null;\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.trim().startsWith(\"#\")) continue;\n\n const nestedMatch = line.match(/^(\\s{2,}|\\t+)(\\S+)\\s*:\\s*(.*)$/);\n if (nestedMatch && currentMapKey && currentMap) {\n const [, , key, rawVal] = nestedMatch as [string, string, string, string];\n currentMap[key] = unquote(rawVal.trim());\n continue;\n }\n\n // Flush any pending nested map\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n currentMapKey = null;\n currentMap = null;\n }\n\n const topMatch = line.match(/^(\\S+)\\s*:\\s*(.*)$/);\n if (!topMatch) continue;\n\n const [, key, rawVal] = topMatch as [string, string, string];\n const val = rawVal.trim();\n\n if (val === \"\" || val === \"|\" || val === \">\") {\n currentMapKey = key;\n currentMap = {};\n } else {\n result[key] = unquote(val);\n }\n }\n\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n }\n\n return result;\n}\n\nfunction unquote(s: string): string {\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type GlobArgs = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type GrepArgs = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const readFileTool = {\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} satisfies ToolDefinition;\n\nexport type FileReadArgs = z.infer<typeof readFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const writeFileTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\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 relative to the root of the file system (e.g., \"docs/readme.md\", not \"/docs/readme.md\")\n`,\n schema: z.object({\n file_path: z.string().describe(\"The path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileWriteArgs = z.infer<typeof writeFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type FileEditArgs = z.infer<typeof editTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list. 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} satisfies ToolDefinition;\n\nexport type TaskCreateArgs = z.infer<typeof taskCreateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport { getShortId } from \"../../workflow\";\nimport type { TaskCreateArgs } 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 * @returns A ToolHandler for TaskCreate tool calls\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskCreateArgs, WorkflowTask> {\n return (args) => {\n const task: WorkflowTask = {\n id: getShortId(),\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type TaskGetArgs = z.infer<typeof taskGetTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetArgs } 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 ToolHandler for TaskGet tool calls\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskGetArgs, WorkflowTask | null> {\n return (args) => {\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n} satisfies ToolDefinition;\n\nexport type TaskListArgs = z.infer<typeof taskListTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListArgs } 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 ToolHandler for TaskList tool calls\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskListArgs, WorkflowTask[]> {\n return () => {\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\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type TaskUpdateArgs = z.infer<typeof taskUpdateTool.schema>;\n","import type {\n AgentStateManager,\n JsonSerializable,\n} from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateArgs } 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 ToolHandler for TaskUpdate tool calls\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskUpdateArgs, WorkflowTask | null> {\n return (args) => {\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 z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type BashArgs = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\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} satisfies ToolDefinition;\n\nexport type AskUserQuestionArgs = z.infer<\n typeof askUserQuestionTool.schema\n>;\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionArgs } from \"./tool\";\n\n/**\n * Creates a handler for the AskUserQuestion tool.\n * Returns question data for display to the user via your UI layer.\n *\n * Typically paired with `stateManager.waitForInput()` in a `hooks.onPostToolUse`\n * callback to pause the agent loop until the user responds.\n *\n * @example\n * ```typescript\n * import { createAskUserQuestionHandler } from 'zeitlich';\n * import { askUserQuestionTool, defineTool } from 'zeitlich/workflow';\n *\n * // In activities\n * const askUserQuestionHandlerActivity = createAskUserQuestionHandler();\n *\n * // In workflow\n * tools: {\n * AskUserQuestion: defineTool({\n * ...askUserQuestionTool,\n * handler: askUserQuestionHandlerActivity,\n * hooks: {\n * onPostToolUse: () => { stateManager.waitForInput(); },\n * },\n * }),\n * }\n * ```\n */\nexport const createAskUserQuestionHandler =\n (): ActivityToolHandler<\n AskUserQuestionArgs,\n {\n questions: {\n question: string;\n header: string;\n options: { label: string; description: string }[];\n multiSelect: boolean;\n }[];\n }\n > =>\n async (args) => {\n return {\n toolResponse: \"Question submitted\",\n data: { questions: args.questions },\n };\n };\n","import { join } from \"node:path\";\nimport type { SandboxFileSystem } from \"../sandbox/types\";\nimport type { Skill, SkillMetadata, SkillProvider } from \"./types\";\nimport { parseSkillFile } from \"./parse\";\n\n/**\n * Loads skills from a directory following the agentskills.io layout:\n *\n * ```\n * skills/\n * ├── code-review/\n * │ └── SKILL.md\n * ├── pdf-processing/\n * │ └── SKILL.md\n * ```\n *\n * Uses the sandbox filesystem abstraction — works with any backend\n * (in-memory, host FS, Wasmer, Daytona, etc.).\n */\nexport class FileSystemSkillProvider implements SkillProvider {\n constructor(\n private readonly fs: SandboxFileSystem,\n private readonly baseDir: string,\n ) {}\n\n async listSkills(): Promise<SkillMetadata[]> {\n const dirs = await this.discoverSkillDirs();\n const skills: SkillMetadata[] = [];\n\n for (const dir of dirs) {\n const raw = await this.fs.readFile(join(this.baseDir, dir, \"SKILL.md\"));\n const { frontmatter } = parseSkillFile(raw);\n skills.push(frontmatter);\n }\n\n return skills;\n }\n\n async getSkill(name: string): Promise<Skill> {\n const raw = await this.fs.readFile(\n join(this.baseDir, name, \"SKILL.md\"),\n );\n const { frontmatter, body } = parseSkillFile(raw);\n\n if (frontmatter.name !== name) {\n throw new Error(\n `Skill directory \"${name}\" contains SKILL.md with mismatched name \"${frontmatter.name}\"`,\n );\n }\n\n return { ...frontmatter, instructions: body };\n }\n\n /**\n * Convenience method to load all skills with full instructions.\n * Returns `Skill[]` ready to pass into a workflow.\n */\n async loadAll(): Promise<Skill[]> {\n const dirs = await this.discoverSkillDirs();\n const skills: Skill[] = [];\n\n for (const dir of dirs) {\n const raw = await this.fs.readFile(join(this.baseDir, dir, \"SKILL.md\"));\n const { frontmatter, body } = parseSkillFile(raw);\n skills.push({ ...frontmatter, instructions: body });\n }\n\n return skills;\n }\n\n private async discoverSkillDirs(): Promise<string[]> {\n const entries = await this.fs.readdirWithFileTypes(this.baseDir);\n const dirs: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory) continue;\n const skillPath = join(this.baseDir, entry.name, \"SKILL.md\");\n if (await this.fs.exists(skillPath)) {\n dirs.push(entry.name);\n }\n }\n\n return dirs;\n }\n}\n","import type {\n ThreadManagerConfig,\n BaseThreadManager,\n} from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>,\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize),\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n };\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent\n * workflow's agent state before each invocation.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n *\n * const invoker = createLangChainModelInvoker({ redis, model });\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\nexport function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n): (config: RunAgentConfig) => Promise<R> {\n return async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<S extends BaseAgentState = BaseAgentState> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<TArgs, TResult, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>,\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type {\n Sandbox,\n SandboxCreateOptions,\n SandboxOps,\n PrefixedSandboxOps,\n SandboxProvider,\n SandboxSnapshot,\n} from \"./types\";\n\n/**\n * Stateless facade over a {@link SandboxProvider}.\n *\n * Delegates all lifecycle operations to the provider, which is responsible\n * for its own instance management strategy (e.g. in-memory map, remote API).\n *\n * @example\n * ```typescript\n * const manager = new SandboxManager(new InMemorySandboxProvider());\n * const activities = {\n * ...manager.createActivities(\"CodingAgent\"),\n * bashHandler: withSandbox(manager, bashHandler),\n * };\n * // registers: inMemoryCodingAgentCreateSandbox, …\n * ```\n */\nexport class SandboxManager<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n TId extends string = string,\n> {\n constructor(private provider: SandboxProvider<TOptions, TSandbox> & { readonly id: TId }) {}\n\n async create(\n options?: TOptions\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }> {\n const { sandbox, stateUpdate } = await this.provider.create(options);\n return { sandboxId: sandbox.id, ...(stateUpdate && { stateUpdate }) };\n }\n\n async getSandbox(id: string): Promise<TSandbox> {\n return this.provider.get(id);\n }\n\n async destroy(id: string): Promise<void> {\n await this.provider.destroy(id);\n }\n\n async snapshot(id: string): Promise<SandboxSnapshot> {\n return this.provider.snapshot(id);\n }\n\n async restore(snapshot: SandboxSnapshot): Promise<string> {\n const sandbox = await this.provider.restore(snapshot);\n return sandbox.id;\n }\n\n async fork(sandboxId: string): Promise<string> {\n const sandbox = await this.provider.fork(sandboxId);\n return sandbox.id;\n }\n\n /**\n * Returns Temporal activity functions with prefixed names.\n *\n * The provider's `id` is automatically prepended, so you only need\n * to pass the workflow/scope name. Use the matching `proxy*SandboxOps()`\n * helper from the adapter's `/workflow` entrypoint on the workflow side.\n *\n * @param scope - Workflow name (appended to the provider id)\n *\n * @example\n * ```typescript\n * const manager = new SandboxManager(new InMemorySandboxProvider());\n * manager.createActivities(\"CodingAgent\");\n * // registers: inMemoryCodingAgentCreateSandbox, inMemoryCodingAgentDestroySandbox, …\n *\n * const vmgr = new SandboxManager(new VirtualSandboxProvider(resolver));\n * vmgr.createActivities(\"CodingAgent\");\n * // registers: virtualCodingAgentCreateSandbox, …\n * ```\n */\n createActivities<S extends string>(\n scope: S\n ): PrefixedSandboxOps<`${TId}${Capitalize<S>}`, TOptions> {\n const prefix = `${this.provider.id}${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;\n const ops: SandboxOps<TOptions> = {\n createSandbox: async (\n options?: TOptions\n ): Promise<{\n sandboxId: string;\n stateUpdate?: Record<string, unknown>;\n }> => {\n return this.create(options);\n },\n destroySandbox: async (sandboxId: string): Promise<void> => {\n await this.destroy(sandboxId);\n },\n snapshotSandbox: async (sandboxId: string): Promise<SandboxSnapshot> => {\n return this.snapshot(sandboxId);\n },\n forkSandbox: async (sandboxId: string): Promise<string> => {\n return this.fork(sandboxId);\n },\n };\n const cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);\n return Object.fromEntries(\n Object.entries(ops).map(([k, v]) => [`${prefix}${cap(k)}`, v])\n ) as PrefixedSandboxOps<`${TId}${Capitalize<S>}`, TOptions>;\n }\n}\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { BashArgs } from \"./tool\";\nimport type { ExecResult } from \"../../lib/sandbox/types\";\n\n/**\n * Bash tool handler — executes shell commands inside a {@link Sandbox}.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const bashHandler: ActivityToolHandler<\n BashArgs,\n ExecResult | null,\n SandboxContext\n> = async (args, { sandbox }) => {\n try {\n const result = await sandbox.exec(args.command);\n return {\n toolResponse: `Exit code: ${result.exitCode}\\n\\nstdout:\\n${result.stdout}\\n\\nstderr:\\n${result.stderr}`,\n data: result,\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 { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileEditArgs } from \"./tool\";\n\ninterface EditResult {\n path: string;\n success: boolean;\n replacements: number;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Edit tool handler — performs string replacements in sandbox files.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const editHandler: ActivityToolHandler<\n FileEditArgs,\n EditResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { file_path, old_string, new_string, replace_all = false } = args;\n\n if (old_string === new_string) {\n return {\n toolResponse: `Error: old_string and new_string must be different.`,\n data: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n try {\n const exists = await fs.exists(file_path);\n if (!exists) {\n return {\n toolResponse: `Error: File \"${file_path}\" does not exist.`,\n data: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n const content = await fs.readFile(file_path);\n\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n\n const escapedOldString = escapeRegExp(old_string);\n const globalRegex = new RegExp(escapedOldString, \"g\");\n const occurrences = (content.match(globalRegex) || []).length;\n\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n\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 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 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: { path: file_path, success: true, replacements },\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: { path: file_path, success: false, replacements: 0 },\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { GlobArgs } from \"./tool\";\nimport type { Sandbox } from \"../../lib/sandbox/types\";\n\ninterface GlobResult {\n files: string[];\n}\n\n/**\n * Simple glob-style matcher (supports `*` and `**`).\n */\nfunction matchGlob(pattern: string, path: string): boolean {\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(`^${regex}$`).test(path);\n}\n\nasync function walk(\n fs: Sandbox[\"fs\"],\n dir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdirWithFileTypes(dir);\n for (const entry of entries) {\n const full = dir === \"/\" ? `/${entry.name}` : `${dir}/${entry.name}`;\n if (entry.isDirectory) {\n results.push(...(await walk(fs, full)));\n } else {\n results.push(full);\n }\n }\n return results;\n}\n\n/**\n * Glob tool handler — searches files within a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const globHandler: ActivityToolHandler<\n GlobArgs,\n GlobResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { pattern, root = \"/\" } = args;\n\n try {\n const allFiles = await walk(fs, root);\n const relativeTo = root.endsWith(\"/\") ? root : `${root}/`;\n const matched = allFiles\n .map((f) => (f.startsWith(relativeTo) ? f.slice(relativeTo.length) : f))\n .filter((f) => matchGlob(pattern, f));\n\n return {\n toolResponse:\n matched.length > 0\n ? `Found ${matched.length} file(s):\\n${matched.join(\"\\n\")}`\n : `No files matched pattern \"${pattern}\"`,\n data: { files: matched },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error running glob: ${message}`,\n data: { files: [] },\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileReadArgs } from \"./tool\";\n\ninterface ReadFileResult {\n path: string;\n content: string;\n totalLines?: number;\n}\n\n/**\n * Read-file tool handler — reads files from a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const readFileHandler: ActivityToolHandler<\n FileReadArgs,\n ReadFileResult | null,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { path, offset, limit } = args;\n\n try {\n const exists = await fs.exists(path);\n if (!exists) {\n return {\n toolResponse: `Error: File \"${path}\" does not exist.`,\n data: null,\n };\n }\n\n const raw = await fs.readFile(path);\n const lines = raw.split(\"\\n\");\n const totalLines = lines.length;\n\n if (offset !== undefined || limit !== undefined) {\n const start = Math.max(0, (offset ?? 1) - 1);\n const end = limit !== undefined ? start + limit : lines.length;\n const slice = lines.slice(start, end);\n const numbered = slice\n .map((line, i) => `${String(start + i + 1).padStart(6)}|${line}`)\n .join(\"\\n\");\n\n return {\n toolResponse: numbered,\n data: { path, content: numbered, totalLines },\n };\n }\n\n const numbered = lines\n .map((line, i) => `${String(i + 1).padStart(6)}|${line}`)\n .join(\"\\n\");\n\n return {\n toolResponse: numbered,\n data: { path, content: numbered, totalLines },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error reading file \"${path}\": ${message}`,\n data: null,\n };\n }\n};\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { SandboxContext } from \"../../lib/tool-router/with-sandbox\";\nimport type { FileWriteArgs } from \"./tool\";\n\ninterface WriteFileResult {\n path: string;\n success: boolean;\n}\n\n/**\n * Write-file tool handler — writes files to a {@link Sandbox} filesystem.\n *\n * Wrap with {@link withSandbox} at activity registration time to inject the\n * sandbox automatically.\n */\nexport const writeFileHandler: ActivityToolHandler<\n FileWriteArgs,\n WriteFileResult,\n SandboxContext\n> = async (args, { sandbox }) => {\n const { fs } = sandbox;\n const { file_path, content } = args;\n\n try {\n const lastSlash = file_path.lastIndexOf(\"/\");\n if (lastSlash > 0) {\n const dir = file_path.slice(0, lastSlash);\n const dirExists = await fs.exists(dir);\n if (!dirExists) {\n await fs.mkdir(dir, { recursive: true });\n }\n }\n\n await fs.writeFile(file_path, content);\n\n return {\n toolResponse: `Successfully wrote to ${file_path}`,\n data: { path: file_path, success: true },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n toolResponse: `Error writing file \"${file_path}\": ${message}`,\n data: { path: file_path, success: false },\n };\n }\n};\n","import type { SandboxFileSystem } from \"./types\";\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\n/**\n * Generates a formatted file tree string from a {@link SandboxFileSystem}.\n * Useful for including filesystem context in agent prompts.\n *\n * @param fs - Sandbox filesystem implementation\n * @param opts - Optional configuration for tree generation\n * @param opts.dir - Root directory to start from (defaults to `/`)\n * @param opts.separator - Path separator (`/` or `\\\\`, defaults to `/`)\n * @param opts.depth - Maximum directory depth (defaults to 10)\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * import { toTree } from 'zeitlich';\n *\n * const fileTree = await toTree(sandbox.fs);\n * // Returns:\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport const toTree = async (\n fs: SandboxFileSystem,\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"]}
|