zeitlich 0.2.37 → 0.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activities-Bb-nAjwQ.d.ts → activities-BKhMtKDd.d.ts} +4 -2
- package/dist/{activities-vkI4_3CC.d.cts → activities-CDcwkRZs.d.cts} +4 -2
- package/dist/adapters/sandbox/bedrock/index.cjs +3 -3
- package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/index.d.cts +6 -6
- package/dist/adapters/sandbox/bedrock/index.d.ts +6 -6
- package/dist/adapters/sandbox/bedrock/index.js +3 -3
- package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
- package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
- package/dist/adapters/sandbox/daytona/index.cjs +3 -3
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +4 -4
- package/dist/adapters/sandbox/daytona/index.d.ts +4 -4
- package/dist/adapters/sandbox/daytona/index.js +3 -3
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/e2b/index.cjs +26 -14
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +24 -4
- package/dist/adapters/sandbox/e2b/index.d.ts +24 -4
- package/dist/adapters/sandbox/e2b/index.js +26 -14
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/inmemory/index.cjs +3 -3
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +4 -4
- package/dist/adapters/sandbox/inmemory/index.d.ts +4 -4
- package/dist/adapters/sandbox/inmemory/index.js +3 -3
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
- package/dist/adapters/thread/anthropic/index.cjs +23 -3
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +5 -5
- package/dist/adapters/thread/anthropic/index.d.ts +5 -5
- package/dist/adapters/thread/anthropic/index.js +23 -3
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.cjs +2 -1
- package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
- package/dist/adapters/thread/anthropic/workflow.js +2 -1
- package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
- package/dist/adapters/thread/google-genai/index.cjs +27 -3
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +5 -5
- package/dist/adapters/thread/google-genai/index.d.ts +5 -5
- package/dist/adapters/thread/google-genai/index.js +27 -3
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.cjs +2 -1
- package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
- package/dist/adapters/thread/google-genai/workflow.js +2 -1
- package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
- package/dist/adapters/thread/langchain/index.cjs +23 -3
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +5 -5
- package/dist/adapters/thread/langchain/index.d.ts +5 -5
- package/dist/adapters/thread/langchain/index.js +23 -3
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.cjs +2 -1
- package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
- package/dist/adapters/thread/langchain/workflow.js +2 -1
- package/dist/adapters/thread/langchain/workflow.js.map +1 -1
- package/dist/index.cjs +120 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.js +121 -31
- package/dist/index.js.map +1 -1
- package/dist/{proxy-0smGKvx8.d.ts → proxy-CUlKSvZS.d.ts} +1 -1
- package/dist/{proxy-DEtowJyd.d.cts → proxy-D_3x7RN4.d.cts} +1 -1
- package/dist/{thread-manager-C-C4pI2z.d.ts → thread-manager-CVu7o2cs.d.ts} +4 -2
- package/dist/{thread-manager-D4vgzYrh.d.cts → thread-manager-HSwyh28L.d.cts} +4 -2
- package/dist/{thread-manager-3fszQih4.d.ts → thread-manager-c1gPopAG.d.ts} +4 -2
- package/dist/{thread-manager-CzYln2OC.d.cts → thread-manager-wGi-LqIP.d.cts} +4 -2
- package/dist/{types-B37hKoWA.d.ts → types-BH_IRryz.d.ts} +10 -1
- package/dist/{types-D08CXPh8.d.cts → types-BaOw4hKI.d.cts} +10 -1
- package/dist/{types-CPKDl-y_.d.ts → types-C06FwR96.d.cts} +59 -4
- package/dist/{types-CNuWnvy9.d.ts → types-DAsQ21Rt.d.ts} +1 -1
- package/dist/{types-BO7Yju20.d.cts → types-DNr31FzL.d.ts} +59 -4
- package/dist/{types-DWEUmYAJ.d.cts → types-lm8tMNJQ.d.cts} +1 -1
- package/dist/{types-tQL9njTu.d.cts → types-yx0LzPGn.d.cts} +21 -7
- package/dist/{types-tQL9njTu.d.ts → types-yx0LzPGn.d.ts} +21 -7
- package/dist/{workflow-CjXHbZZc.d.ts → workflow-CSCkpwAL.d.ts} +2 -2
- package/dist/{workflow-Do_lzJpT.d.cts → workflow-DuvMZ8Vm.d.cts} +2 -2
- package/dist/workflow.cjs +94 -18
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3 -3
- package/dist/workflow.d.ts +3 -3
- package/dist/workflow.js +95 -19
- package/dist/workflow.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/sandbox/bedrock/index.ts +12 -3
- package/src/adapters/sandbox/daytona/index.ts +12 -3
- package/src/adapters/sandbox/e2b/index.ts +36 -14
- package/src/adapters/sandbox/e2b/types.ts +16 -0
- package/src/adapters/sandbox/inmemory/index.ts +12 -3
- package/src/adapters/thread/anthropic/activities.ts +9 -0
- package/src/adapters/thread/anthropic/model-invoker.ts +3 -1
- package/src/adapters/thread/anthropic/thread-manager.ts +3 -0
- package/src/adapters/thread/google-genai/activities.ts +13 -0
- package/src/adapters/thread/google-genai/model-invoker.ts +3 -1
- package/src/adapters/thread/google-genai/thread-manager.ts +3 -0
- package/src/adapters/thread/langchain/activities.ts +9 -0
- package/src/adapters/thread/langchain/model-invoker.ts +2 -1
- package/src/adapters/thread/langchain/thread-manager.ts +3 -0
- package/src/lib/lifecycle.ts +11 -4
- package/src/lib/model/types.ts +10 -0
- package/src/lib/sandbox/manager.ts +26 -18
- package/src/lib/sandbox/types.ts +27 -7
- package/src/lib/session/session-edge-cases.integration.test.ts +265 -1
- package/src/lib/session/session.integration.test.ts +22 -1
- package/src/lib/session/session.ts +61 -7
- package/src/lib/session/types.ts +12 -0
- package/src/lib/subagent/subagent.integration.test.ts +100 -104
- package/src/lib/thread/manager.ts +18 -0
- package/src/lib/thread/proxy.ts +1 -0
- package/src/lib/thread/types.ts +9 -0
- package/src/lib/tool-router/index.ts +2 -0
- package/src/lib/tool-router/router-edge-cases.integration.test.ts +92 -0
- package/src/lib/tool-router/router.integration.test.ts +12 -0
- package/src/lib/tool-router/router.ts +89 -16
- package/src/lib/tool-router/types.ts +34 -1
- package/src/workflow.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/inmemory/index.ts"],"names":["ApplicationFailure","uuid4","Bash","InMemoryFs"],"mappings":"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","file":"index.cjs","sourcesContent":["// ============================================================================\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// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\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(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): 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 /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\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 pause(sandboxId: string, ttlSeconds?: number): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resume(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSnapshot(snapshot: SandboxSnapshot): Promise<void>;\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 TCtx = unknown,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n pauseSandbox(sandboxId: string): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resumeSandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n /** Create a fresh sandbox from a previously captured snapshot. */\n restoreSandbox(snapshot: SandboxSnapshot): Promise<string>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSandboxSnapshot(snapshot: SandboxSnapshot): Promise<void>;\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 TCtx = unknown,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions, TCtx>[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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"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 {\n Bash,\n InMemoryFs,\n type BashOptions,\n type IFileSystem,\n type InitialFiles,\n} from \"just-bash\";\nimport type {\n Sandbox,\n SandboxCapabilities,\n SandboxCreateOptions,\n SandboxCreateResult,\n SandboxFileSystem,\n SandboxProvider,\n SandboxSnapshot,\n ExecOptions,\n ExecResult,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotFoundError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\n\n// ============================================================================\n// Adapter: IFileSystem → SandboxFileSystem\n// ============================================================================\n\nfunction toSandboxFs(fs: IFileSystem): SandboxFileSystem {\n const workspaceBase = \"/\";\n const normalisePath = (path: string): string =>\n fs.resolvePath(workspaceBase, path);\n\n return {\n workspaceBase,\n readFile: (path) => fs.readFile(normalisePath(path)),\n readFileBuffer: (path) => fs.readFileBuffer(normalisePath(path)),\n writeFile: (path, content) => fs.writeFile(normalisePath(path), content),\n appendFile: (path, content) => fs.appendFile(normalisePath(path), content),\n exists: (path) => fs.exists(normalisePath(path)),\n stat: async (path): Promise<FileStat> => {\n const s = await fs.stat(normalisePath(path));\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mtime: s.mtime,\n };\n },\n mkdir: (path, opts) => fs.mkdir(normalisePath(path), opts),\n readdir: (path) => fs.readdir(normalisePath(path)),\n readdirWithFileTypes: async (path): Promise<DirentEntry[]> => {\n const dirPath = normalisePath(path);\n if (!fs.readdirWithFileTypes) {\n const names = await fs.readdir(dirPath);\n return Promise.all(\n names.map(async (name) => {\n const childPath = fs.resolvePath(dirPath, name);\n const s = await fs.stat(childPath);\n return {\n name,\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n };\n })\n );\n }\n return fs.readdirWithFileTypes(dirPath);\n },\n rm: (path, opts) => fs.rm(normalisePath(path), opts),\n cp: (src, dest, opts) =>\n fs.cp(normalisePath(src), normalisePath(dest), opts),\n mv: (src, dest) => fs.mv(normalisePath(src), normalisePath(dest)),\n readlink: (path) => fs.readlink(normalisePath(path)),\n resolvePath: (base, p) => fs.resolvePath(normalisePath(base), p),\n };\n}\n\n// ============================================================================\n// InMemorySandbox\n// ============================================================================\n\nexport interface InMemorySandboxOptions {\n /** Options forwarded to `just-bash` `Bash` (minus `fs` which is managed) */\n bashOptions?: Omit<BashOptions, \"fs\">;\n}\n\n/**\n * An in-memory {@link Sandbox} backed by `just-bash`.\n */\nexport type InMemorySandbox = Sandbox & { fs: SandboxFileSystem };\n\nclass InMemorySandboxImpl implements Sandbox {\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n readonly fs: SandboxFileSystem;\n private bashOptions: Omit<BashOptions, \"fs\">;\n\n constructor(\n readonly id: string,\n private justBashFs: IFileSystem,\n options?: InMemorySandboxOptions\n ) {\n this.fs = toSandboxFs(justBashFs);\n this.bashOptions = {\n executionLimits: { maxStringLength: 52_428_800 },\n ...options?.bashOptions,\n };\n }\n\n async exec(command: string, _options?: ExecOptions): Promise<ExecResult> {\n const bash = new Bash({ ...this.bashOptions, fs: this.justBashFs });\n const { exitCode, stderr, stdout } = await bash.exec(command);\n return { exitCode, stdout, stderr };\n }\n\n async destroy(): Promise<void> {\n // In-memory: nothing to clean up\n }\n\n /** Expose the underlying IFileSystem for snapshot serialisation */\n _getJustBashFs(): IFileSystem {\n return this.justBashFs;\n }\n}\n\n// ============================================================================\n// InMemorySandboxProvider\n// ============================================================================\n\nexport class InMemorySandboxProvider implements SandboxProvider {\n readonly id = \"inMemory\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n private sandboxes = new Map<string, InMemorySandboxImpl>();\n\n constructor(private defaultOptions?: InMemorySandboxOptions) {}\n\n async get(id: string): Promise<Sandbox> {\n const sandbox = this.sandboxes.get(id);\n if (!sandbox) throw new SandboxNotFoundError(id);\n return sandbox;\n }\n\n async destroy(id: string): Promise<void> {\n const sandbox = this.sandboxes.get(id);\n if (sandbox) {\n await sandbox.destroy();\n this.sandboxes.delete(id);\n }\n }\n\n async pause(_sandboxId: string, _ttlSeconds?: number): Promise<void> {\n // In-memory: nothing to pause\n }\n\n async resume(_sandboxId: string): Promise<void> {\n // In-memory: nothing to resume\n }\n\n async create(options?: SandboxCreateOptions): Promise<SandboxCreateResult> {\n const id = options?.id ?? getShortId();\n const initialFiles: InitialFiles = {};\n\n if (options?.initialFiles) {\n for (const [path, content] of Object.entries(options.initialFiles)) {\n initialFiles[path] = content;\n }\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(id, fs, this.defaultOptions);\n this.sandboxes.set(id, sandbox);\n return { sandbox };\n }\n\n async snapshot(sandboxId: string): Promise<SandboxSnapshot> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) throw new SandboxNotFoundError(sandboxId);\n\n const fs = sandbox._getJustBashFs();\n const paths = fs.getAllPaths();\n const files: Record<string, string> = {};\n\n for (const p of paths) {\n try {\n const stat = await fs.stat(p);\n if (stat.isFile) {\n files[p] = await fs.readFile(p);\n }\n } catch {\n // skip entries that can't be read (e.g. broken symlinks)\n }\n }\n\n return {\n sandboxId,\n providerId: this.id,\n data: { files },\n createdAt: new Date().toISOString(),\n };\n }\n\n async fork(sandboxId: string): Promise<Sandbox> {\n const sandbox = await this.get(sandboxId);\n\n const entries = await sandbox.fs.readdirWithFileTypes(\"/\");\n const initialFiles: Record<string, Uint8Array> = {};\n for (const entry of entries) {\n if (entry.isFile) {\n initialFiles[entry.name] = await sandbox.fs.readFileBuffer(entry.name);\n }\n }\n\n const newSandbox = await this.create({\n id: getShortId(),\n initialFiles,\n });\n return newSandbox.sandbox;\n }\n\n async restore(snapshot: SandboxSnapshot): Promise<Sandbox> {\n const { files } = snapshot.data as { files: Record<string, string> };\n const initialFiles: InitialFiles = {};\n for (const [path, content] of Object.entries(files)) {\n initialFiles[path] = content;\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(\n snapshot.sandboxId,\n fs,\n this.defaultOptions\n );\n this.sandboxes.set(sandbox.id, sandbox);\n return sandbox;\n }\n\n async deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void> {\n // In-memory snapshots are opaque data held by the caller — nothing to\n // delete on the provider side.\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/inmemory/index.ts"],"names":["ApplicationFailure","uuid4","Bash","InMemoryFs"],"mappings":"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","file":"index.cjs","sourcesContent":["// ============================================================================\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// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\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(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): 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 /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\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 pause(sandboxId: string, ttlSeconds?: number): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resume(sandboxId: string): Promise<void>;\n /**\n * Capture a snapshot of a running sandbox. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n snapshot(sandboxId: string, options?: TOptions): Promise<SandboxSnapshot>;\n /**\n * Restore a sandbox from a snapshot. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n restore(snapshot: SandboxSnapshot, options?: TOptions): Promise<Sandbox>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /**\n * Fork a running sandbox into a new one. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n fork(sandboxId: string, options?: TOptions): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n pauseSandbox(sandboxId: string): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resumeSandbox(sandboxId: string): Promise<void>;\n /** Capture a snapshot. `options` is a per-call override merged on top of provider defaults. */\n snapshotSandbox(\n sandboxId: string,\n options?: TOptions\n ): Promise<SandboxSnapshot>;\n /** Create a fresh sandbox from a snapshot. `options` is a per-call override merged on top of provider defaults. */\n restoreSandbox(\n snapshot: SandboxSnapshot,\n options?: TOptions\n ): Promise<string>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSandboxSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /** Fork a running sandbox. `options` is a per-call override merged on top of provider defaults. */\n forkSandbox(sandboxId: string, options?: TOptions): 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 TCtx = unknown,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions, TCtx>[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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"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 {\n Bash,\n InMemoryFs,\n type BashOptions,\n type IFileSystem,\n type InitialFiles,\n} from \"just-bash\";\nimport type {\n Sandbox,\n SandboxCapabilities,\n SandboxCreateOptions,\n SandboxCreateResult,\n SandboxFileSystem,\n SandboxProvider,\n SandboxSnapshot,\n ExecOptions,\n ExecResult,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotFoundError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\n\n// ============================================================================\n// Adapter: IFileSystem → SandboxFileSystem\n// ============================================================================\n\nfunction toSandboxFs(fs: IFileSystem): SandboxFileSystem {\n const workspaceBase = \"/\";\n const normalisePath = (path: string): string =>\n fs.resolvePath(workspaceBase, path);\n\n return {\n workspaceBase,\n readFile: (path) => fs.readFile(normalisePath(path)),\n readFileBuffer: (path) => fs.readFileBuffer(normalisePath(path)),\n writeFile: (path, content) => fs.writeFile(normalisePath(path), content),\n appendFile: (path, content) => fs.appendFile(normalisePath(path), content),\n exists: (path) => fs.exists(normalisePath(path)),\n stat: async (path): Promise<FileStat> => {\n const s = await fs.stat(normalisePath(path));\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mtime: s.mtime,\n };\n },\n mkdir: (path, opts) => fs.mkdir(normalisePath(path), opts),\n readdir: (path) => fs.readdir(normalisePath(path)),\n readdirWithFileTypes: async (path): Promise<DirentEntry[]> => {\n const dirPath = normalisePath(path);\n if (!fs.readdirWithFileTypes) {\n const names = await fs.readdir(dirPath);\n return Promise.all(\n names.map(async (name) => {\n const childPath = fs.resolvePath(dirPath, name);\n const s = await fs.stat(childPath);\n return {\n name,\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n };\n })\n );\n }\n return fs.readdirWithFileTypes(dirPath);\n },\n rm: (path, opts) => fs.rm(normalisePath(path), opts),\n cp: (src, dest, opts) =>\n fs.cp(normalisePath(src), normalisePath(dest), opts),\n mv: (src, dest) => fs.mv(normalisePath(src), normalisePath(dest)),\n readlink: (path) => fs.readlink(normalisePath(path)),\n resolvePath: (base, p) => fs.resolvePath(normalisePath(base), p),\n };\n}\n\n// ============================================================================\n// InMemorySandbox\n// ============================================================================\n\nexport interface InMemorySandboxOptions {\n /** Options forwarded to `just-bash` `Bash` (minus `fs` which is managed) */\n bashOptions?: Omit<BashOptions, \"fs\">;\n}\n\n/**\n * An in-memory {@link Sandbox} backed by `just-bash`.\n */\nexport type InMemorySandbox = Sandbox & { fs: SandboxFileSystem };\n\nclass InMemorySandboxImpl implements Sandbox {\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n readonly fs: SandboxFileSystem;\n private bashOptions: Omit<BashOptions, \"fs\">;\n\n constructor(\n readonly id: string,\n private justBashFs: IFileSystem,\n options?: InMemorySandboxOptions\n ) {\n this.fs = toSandboxFs(justBashFs);\n this.bashOptions = {\n executionLimits: { maxStringLength: 52_428_800 },\n ...options?.bashOptions,\n };\n }\n\n async exec(command: string, _options?: ExecOptions): Promise<ExecResult> {\n const bash = new Bash({ ...this.bashOptions, fs: this.justBashFs });\n const { exitCode, stderr, stdout } = await bash.exec(command);\n return { exitCode, stdout, stderr };\n }\n\n async destroy(): Promise<void> {\n // In-memory: nothing to clean up\n }\n\n /** Expose the underlying IFileSystem for snapshot serialisation */\n _getJustBashFs(): IFileSystem {\n return this.justBashFs;\n }\n}\n\n// ============================================================================\n// InMemorySandboxProvider\n// ============================================================================\n\nexport class InMemorySandboxProvider implements SandboxProvider {\n readonly id = \"inMemory\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n private sandboxes = new Map<string, InMemorySandboxImpl>();\n\n constructor(private defaultOptions?: InMemorySandboxOptions) {}\n\n async get(id: string): Promise<Sandbox> {\n const sandbox = this.sandboxes.get(id);\n if (!sandbox) throw new SandboxNotFoundError(id);\n return sandbox;\n }\n\n async destroy(id: string): Promise<void> {\n const sandbox = this.sandboxes.get(id);\n if (sandbox) {\n await sandbox.destroy();\n this.sandboxes.delete(id);\n }\n }\n\n async pause(_sandboxId: string, _ttlSeconds?: number): Promise<void> {\n // In-memory: nothing to pause\n }\n\n async resume(_sandboxId: string): Promise<void> {\n // In-memory: nothing to resume\n }\n\n async create(options?: SandboxCreateOptions): Promise<SandboxCreateResult> {\n const id = options?.id ?? getShortId();\n const initialFiles: InitialFiles = {};\n\n if (options?.initialFiles) {\n for (const [path, content] of Object.entries(options.initialFiles)) {\n initialFiles[path] = content;\n }\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(id, fs, this.defaultOptions);\n this.sandboxes.set(id, sandbox);\n return { sandbox };\n }\n\n async snapshot(\n sandboxId: string,\n _options?: SandboxCreateOptions\n ): Promise<SandboxSnapshot> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) throw new SandboxNotFoundError(sandboxId);\n\n const fs = sandbox._getJustBashFs();\n const paths = fs.getAllPaths();\n const files: Record<string, string> = {};\n\n for (const p of paths) {\n try {\n const stat = await fs.stat(p);\n if (stat.isFile) {\n files[p] = await fs.readFile(p);\n }\n } catch {\n // skip entries that can't be read (e.g. broken symlinks)\n }\n }\n\n return {\n sandboxId,\n providerId: this.id,\n data: { files },\n createdAt: new Date().toISOString(),\n };\n }\n\n async fork(\n sandboxId: string,\n _options?: SandboxCreateOptions\n ): Promise<Sandbox> {\n const sandbox = await this.get(sandboxId);\n\n const entries = await sandbox.fs.readdirWithFileTypes(\"/\");\n const initialFiles: Record<string, Uint8Array> = {};\n for (const entry of entries) {\n if (entry.isFile) {\n initialFiles[entry.name] = await sandbox.fs.readFileBuffer(entry.name);\n }\n }\n\n const newSandbox = await this.create({\n id: getShortId(),\n initialFiles,\n });\n return newSandbox.sandbox;\n }\n\n async restore(\n snapshot: SandboxSnapshot,\n _options?: SandboxCreateOptions\n ): Promise<Sandbox> {\n const { files } = snapshot.data as { files: Record<string, string> };\n const initialFiles: InitialFiles = {};\n for (const [path, content] of Object.entries(files)) {\n initialFiles[path] = content;\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(\n snapshot.sandboxId,\n fs,\n this.defaultOptions\n );\n this.sandboxes.set(sandbox.id, sandbox);\n return sandbox;\n }\n\n async deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void> {\n // In-memory snapshots are opaque data held by the caller — nothing to\n // delete on the provider side.\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BashOptions } from 'just-bash';
|
|
2
|
-
import { S as Sandbox, a as SandboxFileSystem, b as SandboxProvider, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, f as SandboxSnapshot } from '../../../types-
|
|
2
|
+
import { S as Sandbox, a as SandboxFileSystem, b as SandboxProvider, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, f as SandboxSnapshot } from '../../../types-yx0LzPGn.cjs';
|
|
3
3
|
import '@temporalio/common';
|
|
4
4
|
|
|
5
5
|
interface InMemorySandboxOptions {
|
|
@@ -23,9 +23,9 @@ declare class InMemorySandboxProvider implements SandboxProvider {
|
|
|
23
23
|
pause(_sandboxId: string, _ttlSeconds?: number): Promise<void>;
|
|
24
24
|
resume(_sandboxId: string): Promise<void>;
|
|
25
25
|
create(options?: SandboxCreateOptions): Promise<SandboxCreateResult>;
|
|
26
|
-
snapshot(sandboxId: string): Promise<SandboxSnapshot>;
|
|
27
|
-
fork(sandboxId: string): Promise<Sandbox>;
|
|
28
|
-
restore(snapshot: SandboxSnapshot): Promise<Sandbox>;
|
|
26
|
+
snapshot(sandboxId: string, _options?: SandboxCreateOptions): Promise<SandboxSnapshot>;
|
|
27
|
+
fork(sandboxId: string, _options?: SandboxCreateOptions): Promise<Sandbox>;
|
|
28
|
+
restore(snapshot: SandboxSnapshot, _options?: SandboxCreateOptions): Promise<Sandbox>;
|
|
29
29
|
deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BashOptions } from 'just-bash';
|
|
2
|
-
import { S as Sandbox, a as SandboxFileSystem, b as SandboxProvider, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, f as SandboxSnapshot } from '../../../types-
|
|
2
|
+
import { S as Sandbox, a as SandboxFileSystem, b as SandboxProvider, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, f as SandboxSnapshot } from '../../../types-yx0LzPGn.js';
|
|
3
3
|
import '@temporalio/common';
|
|
4
4
|
|
|
5
5
|
interface InMemorySandboxOptions {
|
|
@@ -23,9 +23,9 @@ declare class InMemorySandboxProvider implements SandboxProvider {
|
|
|
23
23
|
pause(_sandboxId: string, _ttlSeconds?: number): Promise<void>;
|
|
24
24
|
resume(_sandboxId: string): Promise<void>;
|
|
25
25
|
create(options?: SandboxCreateOptions): Promise<SandboxCreateResult>;
|
|
26
|
-
snapshot(sandboxId: string): Promise<SandboxSnapshot>;
|
|
27
|
-
fork(sandboxId: string): Promise<Sandbox>;
|
|
28
|
-
restore(snapshot: SandboxSnapshot): Promise<Sandbox>;
|
|
26
|
+
snapshot(sandboxId: string, _options?: SandboxCreateOptions): Promise<SandboxSnapshot>;
|
|
27
|
+
fork(sandboxId: string, _options?: SandboxCreateOptions): Promise<Sandbox>;
|
|
28
|
+
restore(snapshot: SandboxSnapshot, _options?: SandboxCreateOptions): Promise<Sandbox>;
|
|
29
29
|
deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -140,7 +140,7 @@ var InMemorySandboxProvider = class {
|
|
|
140
140
|
this.sandboxes.set(id, sandbox);
|
|
141
141
|
return { sandbox };
|
|
142
142
|
}
|
|
143
|
-
async snapshot(sandboxId) {
|
|
143
|
+
async snapshot(sandboxId, _options) {
|
|
144
144
|
const sandbox = this.sandboxes.get(sandboxId);
|
|
145
145
|
if (!sandbox) throw new SandboxNotFoundError(sandboxId);
|
|
146
146
|
const fs = sandbox._getJustBashFs();
|
|
@@ -162,7 +162,7 @@ var InMemorySandboxProvider = class {
|
|
|
162
162
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
|
-
async fork(sandboxId) {
|
|
165
|
+
async fork(sandboxId, _options) {
|
|
166
166
|
const sandbox = await this.get(sandboxId);
|
|
167
167
|
const entries = await sandbox.fs.readdirWithFileTypes("/");
|
|
168
168
|
const initialFiles = {};
|
|
@@ -177,7 +177,7 @@ var InMemorySandboxProvider = class {
|
|
|
177
177
|
});
|
|
178
178
|
return newSandbox.sandbox;
|
|
179
179
|
}
|
|
180
|
-
async restore(snapshot) {
|
|
180
|
+
async restore(snapshot, _options) {
|
|
181
181
|
const { files } = snapshot.data;
|
|
182
182
|
const initialFiles = {};
|
|
183
183
|
for (const [path, content] of Object.entries(files)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/inmemory/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\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(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): 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 /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\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 pause(sandboxId: string, ttlSeconds?: number): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resume(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSnapshot(snapshot: SandboxSnapshot): Promise<void>;\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 TCtx = unknown,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n pauseSandbox(sandboxId: string): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resumeSandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n /** Create a fresh sandbox from a previously captured snapshot. */\n restoreSandbox(snapshot: SandboxSnapshot): Promise<string>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSandboxSnapshot(snapshot: SandboxSnapshot): Promise<void>;\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 TCtx = unknown,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions, TCtx>[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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"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 {\n Bash,\n InMemoryFs,\n type BashOptions,\n type IFileSystem,\n type InitialFiles,\n} from \"just-bash\";\nimport type {\n Sandbox,\n SandboxCapabilities,\n SandboxCreateOptions,\n SandboxCreateResult,\n SandboxFileSystem,\n SandboxProvider,\n SandboxSnapshot,\n ExecOptions,\n ExecResult,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotFoundError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\n\n// ============================================================================\n// Adapter: IFileSystem → SandboxFileSystem\n// ============================================================================\n\nfunction toSandboxFs(fs: IFileSystem): SandboxFileSystem {\n const workspaceBase = \"/\";\n const normalisePath = (path: string): string =>\n fs.resolvePath(workspaceBase, path);\n\n return {\n workspaceBase,\n readFile: (path) => fs.readFile(normalisePath(path)),\n readFileBuffer: (path) => fs.readFileBuffer(normalisePath(path)),\n writeFile: (path, content) => fs.writeFile(normalisePath(path), content),\n appendFile: (path, content) => fs.appendFile(normalisePath(path), content),\n exists: (path) => fs.exists(normalisePath(path)),\n stat: async (path): Promise<FileStat> => {\n const s = await fs.stat(normalisePath(path));\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mtime: s.mtime,\n };\n },\n mkdir: (path, opts) => fs.mkdir(normalisePath(path), opts),\n readdir: (path) => fs.readdir(normalisePath(path)),\n readdirWithFileTypes: async (path): Promise<DirentEntry[]> => {\n const dirPath = normalisePath(path);\n if (!fs.readdirWithFileTypes) {\n const names = await fs.readdir(dirPath);\n return Promise.all(\n names.map(async (name) => {\n const childPath = fs.resolvePath(dirPath, name);\n const s = await fs.stat(childPath);\n return {\n name,\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n };\n })\n );\n }\n return fs.readdirWithFileTypes(dirPath);\n },\n rm: (path, opts) => fs.rm(normalisePath(path), opts),\n cp: (src, dest, opts) =>\n fs.cp(normalisePath(src), normalisePath(dest), opts),\n mv: (src, dest) => fs.mv(normalisePath(src), normalisePath(dest)),\n readlink: (path) => fs.readlink(normalisePath(path)),\n resolvePath: (base, p) => fs.resolvePath(normalisePath(base), p),\n };\n}\n\n// ============================================================================\n// InMemorySandbox\n// ============================================================================\n\nexport interface InMemorySandboxOptions {\n /** Options forwarded to `just-bash` `Bash` (minus `fs` which is managed) */\n bashOptions?: Omit<BashOptions, \"fs\">;\n}\n\n/**\n * An in-memory {@link Sandbox} backed by `just-bash`.\n */\nexport type InMemorySandbox = Sandbox & { fs: SandboxFileSystem };\n\nclass InMemorySandboxImpl implements Sandbox {\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n readonly fs: SandboxFileSystem;\n private bashOptions: Omit<BashOptions, \"fs\">;\n\n constructor(\n readonly id: string,\n private justBashFs: IFileSystem,\n options?: InMemorySandboxOptions\n ) {\n this.fs = toSandboxFs(justBashFs);\n this.bashOptions = {\n executionLimits: { maxStringLength: 52_428_800 },\n ...options?.bashOptions,\n };\n }\n\n async exec(command: string, _options?: ExecOptions): Promise<ExecResult> {\n const bash = new Bash({ ...this.bashOptions, fs: this.justBashFs });\n const { exitCode, stderr, stdout } = await bash.exec(command);\n return { exitCode, stdout, stderr };\n }\n\n async destroy(): Promise<void> {\n // In-memory: nothing to clean up\n }\n\n /** Expose the underlying IFileSystem for snapshot serialisation */\n _getJustBashFs(): IFileSystem {\n return this.justBashFs;\n }\n}\n\n// ============================================================================\n// InMemorySandboxProvider\n// ============================================================================\n\nexport class InMemorySandboxProvider implements SandboxProvider {\n readonly id = \"inMemory\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n private sandboxes = new Map<string, InMemorySandboxImpl>();\n\n constructor(private defaultOptions?: InMemorySandboxOptions) {}\n\n async get(id: string): Promise<Sandbox> {\n const sandbox = this.sandboxes.get(id);\n if (!sandbox) throw new SandboxNotFoundError(id);\n return sandbox;\n }\n\n async destroy(id: string): Promise<void> {\n const sandbox = this.sandboxes.get(id);\n if (sandbox) {\n await sandbox.destroy();\n this.sandboxes.delete(id);\n }\n }\n\n async pause(_sandboxId: string, _ttlSeconds?: number): Promise<void> {\n // In-memory: nothing to pause\n }\n\n async resume(_sandboxId: string): Promise<void> {\n // In-memory: nothing to resume\n }\n\n async create(options?: SandboxCreateOptions): Promise<SandboxCreateResult> {\n const id = options?.id ?? getShortId();\n const initialFiles: InitialFiles = {};\n\n if (options?.initialFiles) {\n for (const [path, content] of Object.entries(options.initialFiles)) {\n initialFiles[path] = content;\n }\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(id, fs, this.defaultOptions);\n this.sandboxes.set(id, sandbox);\n return { sandbox };\n }\n\n async snapshot(sandboxId: string): Promise<SandboxSnapshot> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) throw new SandboxNotFoundError(sandboxId);\n\n const fs = sandbox._getJustBashFs();\n const paths = fs.getAllPaths();\n const files: Record<string, string> = {};\n\n for (const p of paths) {\n try {\n const stat = await fs.stat(p);\n if (stat.isFile) {\n files[p] = await fs.readFile(p);\n }\n } catch {\n // skip entries that can't be read (e.g. broken symlinks)\n }\n }\n\n return {\n sandboxId,\n providerId: this.id,\n data: { files },\n createdAt: new Date().toISOString(),\n };\n }\n\n async fork(sandboxId: string): Promise<Sandbox> {\n const sandbox = await this.get(sandboxId);\n\n const entries = await sandbox.fs.readdirWithFileTypes(\"/\");\n const initialFiles: Record<string, Uint8Array> = {};\n for (const entry of entries) {\n if (entry.isFile) {\n initialFiles[entry.name] = await sandbox.fs.readFileBuffer(entry.name);\n }\n }\n\n const newSandbox = await this.create({\n id: getShortId(),\n initialFiles,\n });\n return newSandbox.sandbox;\n }\n\n async restore(snapshot: SandboxSnapshot): Promise<Sandbox> {\n const { files } = snapshot.data as { files: Record<string, string> };\n const initialFiles: InitialFiles = {};\n for (const [path, content] of Object.entries(files)) {\n initialFiles[path] = content;\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(\n snapshot.sandboxId,\n fs,\n this.defaultOptions\n );\n this.sandboxes.set(sandbox.id, sandbox);\n return sandbox;\n }\n\n async deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void> {\n // In-memory snapshots are opaque data held by the caller — nothing to\n // delete on the provider side.\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/inmemory/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\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(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): 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 /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\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 pause(sandboxId: string, ttlSeconds?: number): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resume(sandboxId: string): Promise<void>;\n /**\n * Capture a snapshot of a running sandbox. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n snapshot(sandboxId: string, options?: TOptions): Promise<SandboxSnapshot>;\n /**\n * Restore a sandbox from a snapshot. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n restore(snapshot: SandboxSnapshot, options?: TOptions): Promise<Sandbox>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /**\n * Fork a running sandbox into a new one. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n fork(sandboxId: string, options?: TOptions): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n pauseSandbox(sandboxId: string): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resumeSandbox(sandboxId: string): Promise<void>;\n /** Capture a snapshot. `options` is a per-call override merged on top of provider defaults. */\n snapshotSandbox(\n sandboxId: string,\n options?: TOptions\n ): Promise<SandboxSnapshot>;\n /** Create a fresh sandbox from a snapshot. `options` is a per-call override merged on top of provider defaults. */\n restoreSandbox(\n snapshot: SandboxSnapshot,\n options?: TOptions\n ): Promise<string>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSandboxSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /** Fork a running sandbox. `options` is a per-call override merged on top of provider defaults. */\n forkSandbox(sandboxId: string, options?: TOptions): 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 TCtx = unknown,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions, TCtx>[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 { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"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 {\n Bash,\n InMemoryFs,\n type BashOptions,\n type IFileSystem,\n type InitialFiles,\n} from \"just-bash\";\nimport type {\n Sandbox,\n SandboxCapabilities,\n SandboxCreateOptions,\n SandboxCreateResult,\n SandboxFileSystem,\n SandboxProvider,\n SandboxSnapshot,\n ExecOptions,\n ExecResult,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotFoundError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\n\n// ============================================================================\n// Adapter: IFileSystem → SandboxFileSystem\n// ============================================================================\n\nfunction toSandboxFs(fs: IFileSystem): SandboxFileSystem {\n const workspaceBase = \"/\";\n const normalisePath = (path: string): string =>\n fs.resolvePath(workspaceBase, path);\n\n return {\n workspaceBase,\n readFile: (path) => fs.readFile(normalisePath(path)),\n readFileBuffer: (path) => fs.readFileBuffer(normalisePath(path)),\n writeFile: (path, content) => fs.writeFile(normalisePath(path), content),\n appendFile: (path, content) => fs.appendFile(normalisePath(path), content),\n exists: (path) => fs.exists(normalisePath(path)),\n stat: async (path): Promise<FileStat> => {\n const s = await fs.stat(normalisePath(path));\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mtime: s.mtime,\n };\n },\n mkdir: (path, opts) => fs.mkdir(normalisePath(path), opts),\n readdir: (path) => fs.readdir(normalisePath(path)),\n readdirWithFileTypes: async (path): Promise<DirentEntry[]> => {\n const dirPath = normalisePath(path);\n if (!fs.readdirWithFileTypes) {\n const names = await fs.readdir(dirPath);\n return Promise.all(\n names.map(async (name) => {\n const childPath = fs.resolvePath(dirPath, name);\n const s = await fs.stat(childPath);\n return {\n name,\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n };\n })\n );\n }\n return fs.readdirWithFileTypes(dirPath);\n },\n rm: (path, opts) => fs.rm(normalisePath(path), opts),\n cp: (src, dest, opts) =>\n fs.cp(normalisePath(src), normalisePath(dest), opts),\n mv: (src, dest) => fs.mv(normalisePath(src), normalisePath(dest)),\n readlink: (path) => fs.readlink(normalisePath(path)),\n resolvePath: (base, p) => fs.resolvePath(normalisePath(base), p),\n };\n}\n\n// ============================================================================\n// InMemorySandbox\n// ============================================================================\n\nexport interface InMemorySandboxOptions {\n /** Options forwarded to `just-bash` `Bash` (minus `fs` which is managed) */\n bashOptions?: Omit<BashOptions, \"fs\">;\n}\n\n/**\n * An in-memory {@link Sandbox} backed by `just-bash`.\n */\nexport type InMemorySandbox = Sandbox & { fs: SandboxFileSystem };\n\nclass InMemorySandboxImpl implements Sandbox {\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n readonly fs: SandboxFileSystem;\n private bashOptions: Omit<BashOptions, \"fs\">;\n\n constructor(\n readonly id: string,\n private justBashFs: IFileSystem,\n options?: InMemorySandboxOptions\n ) {\n this.fs = toSandboxFs(justBashFs);\n this.bashOptions = {\n executionLimits: { maxStringLength: 52_428_800 },\n ...options?.bashOptions,\n };\n }\n\n async exec(command: string, _options?: ExecOptions): Promise<ExecResult> {\n const bash = new Bash({ ...this.bashOptions, fs: this.justBashFs });\n const { exitCode, stderr, stdout } = await bash.exec(command);\n return { exitCode, stdout, stderr };\n }\n\n async destroy(): Promise<void> {\n // In-memory: nothing to clean up\n }\n\n /** Expose the underlying IFileSystem for snapshot serialisation */\n _getJustBashFs(): IFileSystem {\n return this.justBashFs;\n }\n}\n\n// ============================================================================\n// InMemorySandboxProvider\n// ============================================================================\n\nexport class InMemorySandboxProvider implements SandboxProvider {\n readonly id = \"inMemory\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: true,\n persistence: true,\n };\n\n private sandboxes = new Map<string, InMemorySandboxImpl>();\n\n constructor(private defaultOptions?: InMemorySandboxOptions) {}\n\n async get(id: string): Promise<Sandbox> {\n const sandbox = this.sandboxes.get(id);\n if (!sandbox) throw new SandboxNotFoundError(id);\n return sandbox;\n }\n\n async destroy(id: string): Promise<void> {\n const sandbox = this.sandboxes.get(id);\n if (sandbox) {\n await sandbox.destroy();\n this.sandboxes.delete(id);\n }\n }\n\n async pause(_sandboxId: string, _ttlSeconds?: number): Promise<void> {\n // In-memory: nothing to pause\n }\n\n async resume(_sandboxId: string): Promise<void> {\n // In-memory: nothing to resume\n }\n\n async create(options?: SandboxCreateOptions): Promise<SandboxCreateResult> {\n const id = options?.id ?? getShortId();\n const initialFiles: InitialFiles = {};\n\n if (options?.initialFiles) {\n for (const [path, content] of Object.entries(options.initialFiles)) {\n initialFiles[path] = content;\n }\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(id, fs, this.defaultOptions);\n this.sandboxes.set(id, sandbox);\n return { sandbox };\n }\n\n async snapshot(\n sandboxId: string,\n _options?: SandboxCreateOptions\n ): Promise<SandboxSnapshot> {\n const sandbox = this.sandboxes.get(sandboxId);\n if (!sandbox) throw new SandboxNotFoundError(sandboxId);\n\n const fs = sandbox._getJustBashFs();\n const paths = fs.getAllPaths();\n const files: Record<string, string> = {};\n\n for (const p of paths) {\n try {\n const stat = await fs.stat(p);\n if (stat.isFile) {\n files[p] = await fs.readFile(p);\n }\n } catch {\n // skip entries that can't be read (e.g. broken symlinks)\n }\n }\n\n return {\n sandboxId,\n providerId: this.id,\n data: { files },\n createdAt: new Date().toISOString(),\n };\n }\n\n async fork(\n sandboxId: string,\n _options?: SandboxCreateOptions\n ): Promise<Sandbox> {\n const sandbox = await this.get(sandboxId);\n\n const entries = await sandbox.fs.readdirWithFileTypes(\"/\");\n const initialFiles: Record<string, Uint8Array> = {};\n for (const entry of entries) {\n if (entry.isFile) {\n initialFiles[entry.name] = await sandbox.fs.readFileBuffer(entry.name);\n }\n }\n\n const newSandbox = await this.create({\n id: getShortId(),\n initialFiles,\n });\n return newSandbox.sandbox;\n }\n\n async restore(\n snapshot: SandboxSnapshot,\n _options?: SandboxCreateOptions\n ): Promise<Sandbox> {\n const { files } = snapshot.data as { files: Record<string, string> };\n const initialFiles: InitialFiles = {};\n for (const [path, content] of Object.entries(files)) {\n initialFiles[path] = content;\n }\n\n const fs = new InMemoryFs(initialFiles);\n const sandbox = new InMemorySandboxImpl(\n snapshot.sandboxId,\n fs,\n this.defaultOptions\n );\n this.sandboxes.set(sandbox.id, sandbox);\n return sandbox;\n }\n\n async deleteSnapshot(_snapshot: SandboxSnapshot): Promise<void> {\n // In-memory snapshots are opaque data held by the caller — nothing to\n // delete on the provider side.\n }\n}\n"]}
|
|
@@ -81,6 +81,20 @@ function createThreadManager(config) {
|
|
|
81
81
|
},
|
|
82
82
|
async delete() {
|
|
83
83
|
await redis.del(redisKey, metaKey);
|
|
84
|
+
},
|
|
85
|
+
async length() {
|
|
86
|
+
await assertThreadExists();
|
|
87
|
+
return redis.llen(redisKey);
|
|
88
|
+
},
|
|
89
|
+
async truncate(length) {
|
|
90
|
+
await assertThreadExists();
|
|
91
|
+
if (length <= 0) {
|
|
92
|
+
await redis.del(redisKey);
|
|
93
|
+
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
94
|
+
} else {
|
|
95
|
+
await redis.ltrim(redisKey, 0, length - 1);
|
|
96
|
+
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
97
|
+
}
|
|
84
98
|
}
|
|
85
99
|
};
|
|
86
100
|
}
|
|
@@ -189,7 +203,8 @@ function createAnthropicThreadManager(config) {
|
|
|
189
203
|
const messages = mergeConsecutiveMessages(conversationMessages);
|
|
190
204
|
return {
|
|
191
205
|
messages: onPreparedMessage ? messages.map((msg, i) => onPreparedMessage(msg, i, messages)) : messages,
|
|
192
|
-
...system ? { system } : {}
|
|
206
|
+
...system ? { system } : {},
|
|
207
|
+
storedLength: stored.length
|
|
193
208
|
};
|
|
194
209
|
}
|
|
195
210
|
};
|
|
@@ -228,7 +243,7 @@ function createAnthropicModelInvoker({
|
|
|
228
243
|
key: threadKey,
|
|
229
244
|
hooks
|
|
230
245
|
});
|
|
231
|
-
const { messages, system } = await thread.prepareForInvocation();
|
|
246
|
+
const { messages, system, storedLength } = await thread.prepareForInvocation();
|
|
232
247
|
const anthropicTools = toAnthropicTools(state.tools);
|
|
233
248
|
const tools = anthropicTools.length > 0 ? anthropicTools : void 0;
|
|
234
249
|
const params = {
|
|
@@ -258,7 +273,8 @@ function createAnthropicModelInvoker({
|
|
|
258
273
|
outputTokens: response.usage.output_tokens,
|
|
259
274
|
cachedWriteTokens: response.usage.cache_creation_input_tokens ?? void 0,
|
|
260
275
|
cachedReadTokens: response.usage.cache_read_input_tokens ?? void 0
|
|
261
|
-
}
|
|
276
|
+
},
|
|
277
|
+
threadLengthAtCall: storedLength
|
|
262
278
|
};
|
|
263
279
|
};
|
|
264
280
|
}
|
|
@@ -333,6 +349,10 @@ function createAnthropicAdapter(config) {
|
|
|
333
349
|
key: threadKey
|
|
334
350
|
});
|
|
335
351
|
await thread.fork(targetThreadId);
|
|
352
|
+
},
|
|
353
|
+
async truncateThread(threadId, length, threadKey) {
|
|
354
|
+
const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });
|
|
355
|
+
await thread.truncate(length);
|
|
336
356
|
}
|
|
337
357
|
};
|
|
338
358
|
function createActivities(scope) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/anthropic/thread-manager.ts","../../../../src/lib/activity.ts","../../../../src/adapters/thread/anthropic/model-invoker.ts","../../../../src/adapters/thread/anthropic/activities.ts"],"names":["Context","invokeAnthropicModel"],"mappings":";;;;;AAEA,IAAM,kBAAA,GAAqB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAW1C,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYjC,SAAS,YAAA,CAAa,UAAkB,GAAA,EAAqB;AAC3D,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAClC;AAMO,SAAS,oBACd,MAAA,EACsB;AACtB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA,GAAM,UAAA;AAAA,IACN,SAAA,GAAY,CAAC,CAAA,KAAiB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC9C,WAAA,GAAc,CAAC,GAAA,KAAmB,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAChD;AAAA,GACF,GAAI,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAA;AAEpD,EAAA,eAAe,kBAAA,GAAoC;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,QAAA,EAAW,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,GAA4B;AAChC,MAAA,MAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AACxB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,MAAM,kBAAkB,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,IAAA,GAAqB;AACzB,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,MAAM,OAAO,QAAA,EAA8B;AACzC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,kBAAA,EAAmB;AAEzB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,CAAM,IAAA;AAAA,UACV,wBAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,kBAAkB,CAAA;AAAA,UACzB,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS;AAAA,SAC3B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,EAAU,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS,CAAC,CAAA;AACtD,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,kBAAkB,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,WAAA,EAAoD;AAC7D,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,QACjC,GAAG,MAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,OAAO,UAAA,EAAW;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AAC5C,QAAA,MAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,GAAG,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,GAAwB;AAC5B,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,IACnC;AAAA,GACF;AACF;;;AChDA,SAAS,gBAAgB,GAAA,EAA4B;AACnD,EAAA,OAAO,GAAA,CAAI,EAAA;AACb;AAGA,SAAS,gBACP,OAAA,EACwC;AACxC,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,yBACP,QAAA,EACmC;AACnC,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,GAAA,CAAI,IAAA,EAAM;AAClC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAC1C,IAAA,CAAK,OAAA,GACL,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAClD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GACxC,GAAA,CAAI,OAAA,GACJ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,GAAA;AAAA,QACH,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI;AAAA,OAC9D,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,6BACd,MAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAiD;AAAA,IACrD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,IAAA,GAAO,oBAAoB,UAAU,CAAA;AAE3C,EAAA,MAAM,OAAA,GAA2D;AAAA,IAC/D,MAAM,iBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,eAAA,CAAgB,OAAO,CAAA;AAAE;AAC7D,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA;AAAA;AAAA,UAGA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN;AAAA,WACF;AAAA,UACA,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,sBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,WAAA;AAAA,YACN;AAAA;AAEF;AACF,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,gBAAA,CACJ,EAAA,EACA,UAAA,EACA,WACA,OAAA,EACe;AACf,MAAA,MAAM,WAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,OAAA,GACA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAClB,OAAA,GACD,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9B,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP;AAAA,gBACE,IAAA,EAAM,aAAA;AAAA,gBACN,WAAA,EAAa,UAAA;AAAA,gBACb,OAAA,EAAS;AAAA;AACX;AACF;AACF;AACF,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,oBAAA,GAA4D;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,MAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,MAAA,CAAO,SAAS,EAAC;AACjE,MAAA,MAAM,MAAA,GAAS,gBAAA,GACX,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,MAAM,CAAC,CAAA,GACvD,MAAA;AAEJ,MAAA,IAAI,MAAA;AACJ,MAAA,MAAM,uBAA0D,EAAC;AAEjE,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,MAAA,GAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QAGxB,CAAA,MAAO;AACL,UAAA,oBAAA,CAAqB,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QACxC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,yBAAyB,oBAAoB,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,iBAAA,GACN,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,iBAAA,CAAkB,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAC,CAAA,GAC5D,QAAA;AAAA,QACJ,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,OAC7B;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AACpC;ACrNO,SAAS,kBAAA,GAGd;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMA,iBAAQ,OAAA,EAAQ;AAC5B,IAAA,OAAO,EAAE,WAAW,MAAM,GAAA,CAAI,WAAU,EAAG,MAAA,EAAQ,IAAI,kBAAA,EAAmB;AAAA,EAC5E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACLA,SAAS,iBACP,KAAA,EAC2B;AAC3B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,cAAc,CAAA,CAAE;AAAA,GAClB,CAAE,CAAA;AACJ;AA0BO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAgC;AAC9B,EAAA,OAAO,eAAeC,sBACpB,MAAA,EACoD;AACpD,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM,GAAI,MAAA;AACvC,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,kBAAA,EAAmB;AAEjD,IAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,MAC1C,KAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA,EAAK,SAAA;AAAA,MACL;AAAA,KACD,CAAA;AACD,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,MAAM,OAAO,oBAAA,EAAqB;AAE/D,IAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,MAAA;AAE3D,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,KAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC3B;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAExD,IAAA,WAAA,MAAiB,UAAU,MAAA,EAAQ;AACjC,MAAA,SAAA,IAAY;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAuC,MAAM,MAAA,CAAO,YAAA,EAAa;AAEvE,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjC,CAAC,KAAA,KACC,KAAA,CAAM,IAAA,KAAS;AAAA,KACnB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA,EAAc,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QACnC,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,IAAA,EAAO,EAAA,CAAG,KAAA,IAAqC;AAAC,OAClD,CAAE,CAAA;AAAA,MACF,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,SAAS,KAAA,CAAM,YAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,QAC7B,iBAAA,EACE,QAAA,CAAS,KAAA,CAAM,2BAAA,IAA+B,MAAA;AAAA,QAChD,gBAAA,EAAkB,QAAA,CAAS,KAAA,CAAM,uBAAA,IAA2B;AAAA;AAC9D,KACF;AAAA,EACF,CAAA;AACF;AAOA,eAAsB,oBAAA,CAAqB;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAOuD;AACrD,EAAA,MAAM,UAAU,2BAAA,CAA4B;AAAA,IAC1C,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,QAAQ,MAAM,CAAA;AACvB;;;ACvHA,IAAM,cAAA,GAAiB,WAAA;AA2GhB,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAE1B,EAAA,MAAM,SAAA,GAAyC;AAAA,IAC7C,MAAM,gBAAA,CACJ,QAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,OAAO,UAAA,EAAW;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,iBAAA,CAAkB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,MAAM,gBAAA,CAAiB,EAAA,EAAY,GAAA,EAAsC;AACvE,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,SAAQ,GAAI,GAAA;AAC/D,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,gBAAA,CAAiB,EAAA,EAAI,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,IACjE,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,sBAAA,CAAuB,EAAA,EAAI,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzD,CAAA;AAAA,IAEA,MAAM,UAAA,CACJ,cAAA,EACA,cAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA,EAAU,cAAA;AAAA,QACV,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,SAAS,iBACP,KAAA,EACuB;AACvB,IAAA,MAAM,SAAS,KAAA,GACX,CAAA,EAAG,cAAc,CAAA,EAAG,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,cAAA;AACJ,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAsB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACxE,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,OAAO,OAAA,CAAQ,SAAS,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,CAClB,KAAA,EACA,SAAA,KAC6C;AAC7C,IAAA,MAAM,aAAA,GAA6C;AAAA,MACjD,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,MAAA,CAAO,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,MAAA,GAChD,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAC9B,EAAC;AAAA,MACL,OAAO,MAAA,CAAO;AAAA,KAChB;AACA,IAAA,OAAO,4BAA4B,aAAa,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,UAAoD,MAAA,CAAO,KAAA,GAC7D,YAAY,MAAA,CAAO,KAAK,KACtB,MAAM;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF,CAAA,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,kBAAA,EAAoB,WAAA;AAAA,IACpB,WAAA,EAAa,CAAC,OAAA,KAAY;AAAA,GAC5B;AACF","file":"index.cjs","sourcesContent":["import type { ThreadManagerConfig, BaseThreadManager } 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 `${key}:thread:${threadId}`;\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 type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { JsonValue } from \"../../../lib/state/types\";\nimport { createThreadManager } from \"../../../lib/thread/manager\";\nimport type {\n ProviderThreadManager,\n ThreadManagerConfig,\n ThreadManagerHooks,\n} from \"../../../lib/thread/types\";\n\n/** SDK-native content type for Anthropic human messages */\nexport type AnthropicContent = string | Anthropic.Messages.ContentBlockParam[];\n\n/** SDK-native content type for Anthropic system prompts (supports cache_control blocks) */\nexport type AnthropicSystemContent =\n | string\n | Anthropic.Messages.TextBlockParam[];\n\n/** A MessageParam with a unique ID for idempotent Redis storage */\nexport interface StoredMessage {\n id: string;\n message: Anthropic.Messages.MessageParam;\n /** System messages are stored separately since Anthropic passes them via config */\n isSystem?: boolean;\n}\n\nexport type AnthropicThreadManagerHooks = ThreadManagerHooks<\n StoredMessage,\n Anthropic.Messages.MessageParam\n>;\n\nexport interface AnthropicThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/** Prepared payload ready to send to the Anthropic API */\nexport interface AnthropicInvocationPayload {\n messages: Anthropic.Messages.MessageParam[];\n system?: string | Anthropic.Messages.TextBlockParam[];\n}\n\n/** Thread manager with Anthropic MessageParam convenience helpers */\nexport interface AnthropicThreadManager extends ProviderThreadManager<\n StoredMessage,\n AnthropicContent,\n JsonValue,\n AnthropicSystemContent\n> {\n appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void>;\n prepareForInvocation(): Promise<AnthropicInvocationPayload>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.id;\n}\n\n/** Normalise content into an array of ContentBlockParam */\nfunction toContentBlocks(\n content: AnthropicContent\n): Anthropic.Messages.ContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n return content;\n}\n\n/**\n * Merge consecutive messages with the same role.\n * The Anthropic API requires alternating user/assistant turns; without\n * merging, multiple sequential tool-result messages would violate this.\n */\nfunction mergeConsecutiveMessages(\n messages: Anthropic.Messages.MessageParam[]\n): Anthropic.Messages.MessageParam[] {\n const merged: Anthropic.Messages.MessageParam[] = [];\n for (const msg of messages) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content)\n ? last.content\n : [{ type: \"text\" as const, text: last.content }];\n const msgContent = Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\" as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({\n ...msg,\n content: Array.isArray(msg.content) ? [...msg.content] : msg.content,\n });\n }\n }\n return merged;\n}\n\n/**\n * Creates an Anthropic-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed messages.\n */\nexport function createAnthropicThreadManager(\n config: AnthropicThreadManagerConfig\n): AnthropicThreadManager {\n const baseConfig: ThreadManagerConfig<StoredMessage> = {\n redis: config.redis,\n threadId: config.threadId,\n key: config.key,\n idOf: storedMessageId,\n };\n\n const base = createThreadManager(baseConfig);\n\n const helpers: Omit<AnthropicThreadManager, keyof typeof base> = {\n async appendUserMessage(\n id: string,\n content: AnthropicContent\n ): Promise<void> {\n await base.append([\n {\n id,\n message: { role: \"user\", content: toContentBlocks(content) },\n },\n ]);\n },\n\n async appendSystemMessage(\n id: string,\n content: AnthropicSystemContent\n ): Promise<void> {\n await base.initialize();\n await base.append([\n {\n id,\n // Stored under a user-role placeholder to satisfy the MessageParam\n // shape; the `isSystem` flag steers extraction in prepareForInvocation.\n message: {\n role: \"user\",\n content: content as Anthropic.Messages.MessageParam[\"content\"],\n },\n isSystem: true,\n },\n ]);\n },\n\n async appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void> {\n await base.append([\n {\n id,\n message: {\n role: \"assistant\",\n content:\n content as unknown as Anthropic.Messages.ContentBlockParam[],\n },\n },\n ]);\n },\n\n async appendToolResult(\n id: string,\n toolCallId: string,\n _toolName: string,\n content: JsonValue\n ): Promise<void> {\n const toolContent =\n typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as unknown as Anthropic.Messages.ToolResultBlockParam[\"content\"])\n : JSON.stringify(content);\n await base.append([\n {\n id,\n message: {\n role: \"user\",\n content: [\n {\n type: \"tool_result\" as const,\n tool_use_id: toolCallId,\n content: toolContent,\n },\n ],\n },\n },\n ]);\n },\n\n async prepareForInvocation(): Promise<AnthropicInvocationPayload> {\n const stored = await base.load();\n const { onPrepareMessage, onPreparedMessage } = config.hooks ?? {};\n const mapped = onPrepareMessage\n ? stored.map((msg, i) => onPrepareMessage(msg, i, stored))\n : stored;\n\n let system: string | Anthropic.Messages.TextBlockParam[] | undefined;\n const conversationMessages: Anthropic.Messages.MessageParam[] = [];\n\n for (const item of mapped) {\n if (item.isSystem) {\n system = item.message.content as\n | string\n | Anthropic.Messages.TextBlockParam[];\n } else {\n conversationMessages.push(item.message);\n }\n }\n\n const messages = mergeConsecutiveMessages(conversationMessages);\n return {\n messages: onPreparedMessage\n ? messages.map((msg, i) => onPreparedMessage(msg, i, messages))\n : messages,\n ...(system ? { system } : {}),\n };\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type { JsonValue } from \"./state/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Safely retrieve Temporal activity heartbeat and cancellation signal.\n * Returns empty object when called outside a Temporal activity (e.g. tests).\n */\nexport function getActivityContext(): {\n heartbeat?: () => void;\n signal?: AbortSignal;\n} {\n try {\n const ctx = Context.current();\n return { heartbeat: () => ctx.heartbeat(), signal: ctx.cancellationSignal };\n } catch {\n return {};\n }\n}\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 scope-prefixed `RunAgentActivity` by auto-fetching\n * the parent workflow's agent state before each invocation.\n *\n * Returns a `Record` with a single key `run<Scope>` so it can be spread\n * into the activities object alongside adapter activities.\n *\n * @param scope - Workflow scope used to derive the activity name.\n * `\"myAgentWorkflow\"` produces `{ runMyAgentWorkflow: fn }`.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * return {\n * ...adapter.createActivities(\"myAgentWorkflow\"),\n * ...createRunAgentActivity(client, adapter.invoker, \"myAgentWorkflow\"),\n * };\n * ```\n */\nexport function createRunAgentActivity<\n R,\n S extends BaseAgentState = BaseAgentState,\n>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n scope: string\n): Record<string, (config: RunAgentConfig) => Promise<R>> {\n const name = `run${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;\n return {\n [name]: async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n },\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<\n S extends BaseAgentState = BaseAgentState,\n> 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<\n TArgs,\n TResult,\n S extends BaseAgentState = BaseAgentState,\n TToolResponse = JsonValue,\n>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>\n ) => Promise<ToolHandlerResponse<TResult, TToolResponse>>\n): ActivityToolHandler<TArgs, TResult, RouterContext, TToolResponse> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { SerializableToolDefinition } from \"../../../lib/types\";\nimport type { AgentResponse, ModelInvokerConfig } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport { getActivityContext } from \"../../../lib/activity\";\n\nexport interface AnthropicModelInvokerConfig {\n redis: Redis;\n client: Anthropic;\n model: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\nfunction toAnthropicTools(\n tools: SerializableToolDefinition[]\n): Anthropic.Messages.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.schema as Anthropic.Messages.Tool.InputSchema,\n }));\n}\n\n/**\n * Creates an Anthropic model invoker that satisfies the generic\n * `ModelInvoker<Anthropic.Messages.Message>` contract.\n *\n * Internally streams the response and emits Temporal heartbeats on each\n * event so that long-running LLM calls remain visible to the scheduler.\n * The caller is responsible for appending the response to the thread.\n *\n * @example\n * ```typescript\n * import { createAnthropicModelInvoker } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const invoker = createAnthropicModelInvoker({\n * redis,\n * client,\n * model: 'claude-sonnet-4-20250514',\n * });\n *\n * return { ...createRunAgentActivity(client, invoker, \"myAgent\") };\n * ```\n */\nexport function createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens = 16384,\n hooks,\n}: AnthropicModelInvokerConfig) {\n return async function invokeAnthropicModel(\n config: ModelInvokerConfig\n ): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const { threadId, threadKey, state } = config;\n const { heartbeat, signal } = getActivityContext();\n\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n hooks,\n });\n const { messages, system } = await thread.prepareForInvocation();\n\n const anthropicTools = toAnthropicTools(state.tools);\n const tools = anthropicTools.length > 0 ? anthropicTools : undefined;\n\n const params: Anthropic.MessageCreateParams = {\n model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(tools ? { tools } : {}),\n };\n\n const stream = client.messages.stream(params, { signal });\n\n for await (const _event of stream) {\n heartbeat?.();\n }\n\n const response: Anthropic.Messages.Message = await stream.finalMessage();\n\n const toolCalls = response.content.filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\"\n );\n\n return {\n message: response,\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: (tc.input as Record<string, unknown>) ?? {},\n })),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cachedWriteTokens:\n response.usage.cache_creation_input_tokens ?? undefined,\n cachedReadTokens: response.usage.cache_read_input_tokens ?? undefined,\n },\n };\n };\n}\n\n/**\n * Standalone function for one-shot Anthropic model invocation.\n * Convenience wrapper around createAnthropicModelInvoker for cases\n * where you don't need to reuse the invoker.\n */\nexport async function invokeAnthropicModel({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n config,\n}: {\n redis: Redis;\n client: Anthropic;\n model: string;\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n config: ModelInvokerConfig;\n}): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const invoker = createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"../../../lib/tool-router/types\";\nimport type {\n ThreadOps,\n PrefixedThreadOps,\n ScopedPrefix,\n} from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicContent,\n type AnthropicSystemContent,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport {\n createAnthropicModelInvoker,\n type AnthropicModelInvokerConfig,\n} from \"./model-invoker\";\n\nconst ADAPTER_PREFIX = \"anthropic\" as const;\n\nexport type AnthropicThreadOps<TScope extends string = \"\"> = PrefixedThreadOps<\n ScopedPrefix<TScope, typeof ADAPTER_PREFIX>,\n AnthropicContent\n>;\n\nexport interface AnthropicAdapterConfig {\n redis: Redis;\n client: Anthropic;\n /** Default model name (e.g. 'claude-sonnet-4-20250514'). If omitted, use `createModelInvoker()` */\n model?: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/**\n * Tool response type accepted by the Anthropic adapter.\n *\n * Handlers can return:\n * - **`string`** — plain text content for the tool result.\n * - **`Anthropic.Messages.ToolResultBlockParam[\"content\"]`** — array of content blocks\n * (e.g. `{ type: \"text\", text: \"...\" }`, `{ type: \"image\", source: { ... } }`).\n * Passed through as-is to the `tool_result` block.\n */\nexport type AnthropicToolResponse =\n Anthropic.Messages.ToolResultBlockParam[\"content\"];\n\nexport interface AnthropicAdapter {\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<Anthropic.Messages.Message>;\n /** Create an invoker for a specific model name (for multi-model setups) */\n createModelInvoker(\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message>;\n /**\n * Create prefixed thread activities for registration on the worker.\n *\n * @param scope - Workflow name appended to the adapter prefix.\n * Use different scopes for the main agent vs subagents to avoid collisions.\n *\n * @example\n * ```typescript\n * adapter.createActivities(\"codingAgent\")\n * // → { anthropicCodingAgentInitializeThread, anthropicCodingAgentAppendHumanMessage, … }\n *\n * adapter.createActivities(\"researchAgent\")\n * // → { anthropicResearchAgentInitializeThread, … }\n * ```\n */\n createActivities<S extends string = \"\">(scope?: S): AnthropicThreadOps<S>;\n\n /**\n * Identity wrapper that types a tool handler for this adapter.\n * Constrains `toolResponse` to {@link AnthropicToolResponse}.\n */\n wrapHandler<TArgs, TResult, TContext extends RouterContext = RouterContext>(\n handler: (\n args: TArgs,\n context: TContext\n ) => Promise<ToolHandlerResponse<TResult, AnthropicToolResponse>>\n ): ActivityToolHandler<TArgs, TResult, TContext, AnthropicToolResponse>;\n}\n\n/**\n * Creates an Anthropic adapter that bundles thread operations and model\n * invocation using the `@anthropic-ai/sdk`.\n *\n * Use `createActivities(scope)` to register scoped thread operations as\n * Temporal activities on the worker. The `invoker` (or invokers created via\n * `createModelInvoker`) should be wrapped with `createRunAgentActivity`.\n *\n * @example\n * ```typescript\n * import { createAnthropicAdapter } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const adapter = createAnthropicAdapter({ redis, client, model: 'claude-sonnet-4-20250514' });\n *\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * };\n * }\n * ```\n *\n * @example Multi-agent worker (main + subagent share the adapter)\n * ```typescript\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...adapter.createActivities(\"researchAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * ...createRunAgentActivity(\n * temporalClient,\n * adapter.createModelInvoker('claude-sonnet-4-20250514'),\n * \"researchAgent\",\n * ),\n * };\n * }\n * ```\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig\n): AnthropicAdapter {\n const { redis, client } = config;\n\n const threadOps: ThreadOps<AnthropicContent> = {\n async initializeThread(\n threadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n id: string,\n content: AnthropicContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendUserMessage(id, content);\n },\n\n async appendSystemMessage(\n threadId: string,\n id: string,\n content: AnthropicSystemContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendSystemMessage(id, content);\n },\n\n async appendToolResult(id: string, cfg: ToolResultConfig): Promise<void> {\n const { threadId, threadKey, toolCallId, toolName, content } = cfg;\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendToolResult(id, toolCallId, toolName, content);\n },\n\n async appendAgentMessage(\n threadId: string,\n id: string,\n message: Anthropic.Messages.Message,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendAssistantMessage(id, message.content);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId: sourceThreadId,\n key: threadKey,\n });\n await thread.fork(targetThreadId);\n },\n };\n\n function createActivities<S extends string = \"\">(\n scope?: S\n ): AnthropicThreadOps<S> {\n const prefix = scope\n ? `${ADAPTER_PREFIX}${scope.charAt(0).toUpperCase()}${scope.slice(1)}`\n : ADAPTER_PREFIX;\n const cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);\n return Object.fromEntries(\n Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v])\n ) as AnthropicThreadOps<S>;\n }\n\n const makeInvoker = (\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message> => {\n const invokerConfig: AnthropicModelInvokerConfig = {\n redis,\n client,\n model,\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(config.maxTokens !== undefined && maxTokens === undefined\n ? { maxTokens: config.maxTokens }\n : {}),\n hooks: config.hooks,\n };\n return createAnthropicModelInvoker(invokerConfig);\n };\n\n const invoker: ModelInvoker<Anthropic.Messages.Message> = config.model\n ? makeInvoker(config.model)\n : ((() => {\n throw new Error(\n \"No default model provided to createAnthropicAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\"\n );\n }) as unknown as ModelInvoker<Anthropic.Messages.Message>);\n\n return {\n createActivities,\n invoker,\n createModelInvoker: makeInvoker,\n wrapHandler: (handler) => handler,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/anthropic/thread-manager.ts","../../../../src/lib/activity.ts","../../../../src/adapters/thread/anthropic/model-invoker.ts","../../../../src/adapters/thread/anthropic/activities.ts"],"names":["Context","invokeAnthropicModel"],"mappings":";;;;;AAEA,IAAM,kBAAA,GAAqB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAW1C,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYjC,SAAS,YAAA,CAAa,UAAkB,GAAA,EAAqB;AAC3D,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAClC;AAMO,SAAS,oBACd,MAAA,EACsB;AACtB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA,GAAM,UAAA;AAAA,IACN,SAAA,GAAY,CAAC,CAAA,KAAiB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC9C,WAAA,GAAc,CAAC,GAAA,KAAmB,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAChD;AAAA,GACF,GAAI,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAA;AAEpD,EAAA,eAAe,kBAAA,GAAoC;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,QAAA,EAAW,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,GAA4B;AAChC,MAAA,MAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AACxB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,MAAM,kBAAkB,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,IAAA,GAAqB;AACzB,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,MAAM,OAAO,QAAA,EAA8B;AACzC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,kBAAA,EAAmB;AAEzB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,CAAM,IAAA;AAAA,UACV,wBAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,kBAAkB,CAAA;AAAA,UACzB,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS;AAAA,SAC3B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,EAAU,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS,CAAC,CAAA;AACtD,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,kBAAkB,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,WAAA,EAAoD;AAC7D,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,QACjC,GAAG,MAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,OAAO,UAAA,EAAW;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AAC5C,QAAA,MAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,GAAG,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,GAAwB;AAC5B,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,MAAA,GAA0B;AAC9B,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,SAAS,MAAA,EAA+B;AAC5C,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AACxB,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,kBAAkB,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAC,CAAA;AACzC,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,kBAAkB,CAAA;AAAA,MACjD;AAAA,IAGF;AAAA,GACF;AACF;;;AChEA,SAAS,gBAAgB,GAAA,EAA4B;AACnD,EAAA,OAAO,GAAA,CAAI,EAAA;AACb;AAGA,SAAS,gBACP,OAAA,EACwC;AACxC,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,yBACP,QAAA,EACmC;AACnC,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,GAAA,CAAI,IAAA,EAAM;AAClC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAC1C,IAAA,CAAK,OAAA,GACL,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAClD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GACxC,GAAA,CAAI,OAAA,GACJ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,GAAA;AAAA,QACH,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI;AAAA,OAC9D,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,6BACd,MAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAiD;AAAA,IACrD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,IAAA,GAAO,oBAAoB,UAAU,CAAA;AAE3C,EAAA,MAAM,OAAA,GAA2D;AAAA,IAC/D,MAAM,iBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,eAAA,CAAgB,OAAO,CAAA;AAAE;AAC7D,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA;AAAA;AAAA,UAGA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN;AAAA,WACF;AAAA,UACA,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,sBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,WAAA;AAAA,YACN;AAAA;AAEF;AACF,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,gBAAA,CACJ,EAAA,EACA,UAAA,EACA,WACA,OAAA,EACe;AACf,MAAA,MAAM,WAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,OAAA,GACA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAClB,OAAA,GACD,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9B,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB;AAAA,UACE,EAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP;AAAA,gBACE,IAAA,EAAM,aAAA;AAAA,gBACN,WAAA,EAAa,UAAA;AAAA,gBACb,OAAA,EAAS;AAAA;AACX;AACF;AACF;AACF,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,oBAAA,GAA4D;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,MAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,MAAA,CAAO,SAAS,EAAC;AACjE,MAAA,MAAM,MAAA,GAAS,gBAAA,GACX,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,MAAM,CAAC,CAAA,GACvD,MAAA;AAEJ,MAAA,IAAI,MAAA;AACJ,MAAA,MAAM,uBAA0D,EAAC;AAEjE,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,MAAA,GAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QAGxB,CAAA,MAAO;AACL,UAAA,oBAAA,CAAqB,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QACxC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,yBAAyB,oBAAoB,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,iBAAA,GACN,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,iBAAA,CAAkB,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAC,CAAA,GAC5D,QAAA;AAAA,QACJ,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,QAC3B,cAAc,MAAA,CAAO;AAAA,OACvB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AACpC;ACxNO,SAAS,kBAAA,GAGd;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMA,iBAAQ,OAAA,EAAQ;AAC5B,IAAA,OAAO,EAAE,WAAW,MAAM,GAAA,CAAI,WAAU,EAAG,MAAA,EAAQ,IAAI,kBAAA,EAAmB;AAAA,EAC5E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACLA,SAAS,iBACP,KAAA,EAC2B;AAC3B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,cAAc,CAAA,CAAE;AAAA,GAClB,CAAE,CAAA;AACJ;AA0BO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAgC;AAC9B,EAAA,OAAO,eAAeC,sBACpB,MAAA,EACoD;AACpD,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM,GAAI,MAAA;AACvC,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,kBAAA,EAAmB;AAEjD,IAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,MAC1C,KAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA,EAAK,SAAA;AAAA,MACL;AAAA,KACD,CAAA;AACD,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,cAAa,GACrC,MAAM,OAAO,oBAAA,EAAqB;AAEpC,IAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,MAAA;AAE3D,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,KAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC3B;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAExD,IAAA,WAAA,MAAiB,UAAU,MAAA,EAAQ;AACjC,MAAA,SAAA,IAAY;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAuC,MAAM,MAAA,CAAO,YAAA,EAAa;AAEvE,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjC,CAAC,KAAA,KACC,KAAA,CAAM,IAAA,KAAS;AAAA,KACnB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA,EAAc,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QACnC,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,IAAA,EAAO,EAAA,CAAG,KAAA,IAAqC;AAAC,OAClD,CAAE,CAAA;AAAA,MACF,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,SAAS,KAAA,CAAM,YAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,QAC7B,iBAAA,EACE,QAAA,CAAS,KAAA,CAAM,2BAAA,IAA+B,MAAA;AAAA,QAChD,gBAAA,EAAkB,QAAA,CAAS,KAAA,CAAM,uBAAA,IAA2B;AAAA,OAC9D;AAAA,MACA,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF,CAAA;AACF;AAOA,eAAsB,oBAAA,CAAqB;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAOuD;AACrD,EAAA,MAAM,UAAU,2BAAA,CAA4B;AAAA,IAC1C,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,QAAQ,MAAM,CAAA;AACvB;;;ACzHA,IAAM,cAAA,GAAiB,WAAA;AA2GhB,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAE1B,EAAA,MAAM,SAAA,GAAyC;AAAA,IAC7C,MAAM,gBAAA,CACJ,QAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,OAAO,UAAA,EAAW;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,iBAAA,CAAkB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,MAAM,gBAAA,CAAiB,EAAA,EAAY,GAAA,EAAsC;AACvE,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,SAAQ,GAAI,GAAA;AAC/D,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,gBAAA,CAAiB,EAAA,EAAI,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,IACjE,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,sBAAA,CAAuB,EAAA,EAAI,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzD,CAAA;AAAA,IAEA,MAAM,UAAA,CACJ,cAAA,EACA,cAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA,EAAU,cAAA;AAAA,QACV,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,MAAM,cAAA,CACJ,QAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,IAC9B;AAAA,GACF;AAEA,EAAA,SAAS,iBACP,KAAA,EACuB;AACvB,IAAA,MAAM,SAAS,KAAA,GACX,CAAA,EAAG,cAAc,CAAA,EAAG,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,cAAA;AACJ,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAsB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACxE,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,OAAO,OAAA,CAAQ,SAAS,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,CAClB,KAAA,EACA,SAAA,KAC6C;AAC7C,IAAA,MAAM,aAAA,GAA6C;AAAA,MACjD,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,MAAA,CAAO,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,MAAA,GAChD,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAC9B,EAAC;AAAA,MACL,OAAO,MAAA,CAAO;AAAA,KAChB;AACA,IAAA,OAAO,4BAA4B,aAAa,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,UAAoD,MAAA,CAAO,KAAA,GAC7D,YAAY,MAAA,CAAO,KAAK,KACtB,MAAM;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF,CAAA,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,kBAAA,EAAoB,WAAA;AAAA,IACpB,WAAA,EAAa,CAAC,OAAA,KAAY;AAAA,GAC5B;AACF","file":"index.cjs","sourcesContent":["import type { ThreadManagerConfig, BaseThreadManager } 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 `${key}:thread:${threadId}`;\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 async length(): Promise<number> {\n await assertThreadExists();\n return redis.llen(redisKey);\n },\n\n async truncate(length: number): Promise<void> {\n await assertThreadExists();\n if (length <= 0) {\n await redis.del(redisKey);\n await redis.expire(metaKey, THREAD_TTL_SECONDS);\n } else {\n await redis.ltrim(redisKey, 0, length - 1);\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n // Dedup keys for removed messages are left to expire via their TTL.\n // Post-truncate appends use fresh ids so collisions do not occur in practice.\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { JsonValue } from \"../../../lib/state/types\";\nimport { createThreadManager } from \"../../../lib/thread/manager\";\nimport type {\n ProviderThreadManager,\n ThreadManagerConfig,\n ThreadManagerHooks,\n} from \"../../../lib/thread/types\";\n\n/** SDK-native content type for Anthropic human messages */\nexport type AnthropicContent = string | Anthropic.Messages.ContentBlockParam[];\n\n/** SDK-native content type for Anthropic system prompts (supports cache_control blocks) */\nexport type AnthropicSystemContent =\n | string\n | Anthropic.Messages.TextBlockParam[];\n\n/** A MessageParam with a unique ID for idempotent Redis storage */\nexport interface StoredMessage {\n id: string;\n message: Anthropic.Messages.MessageParam;\n /** System messages are stored separately since Anthropic passes them via config */\n isSystem?: boolean;\n}\n\nexport type AnthropicThreadManagerHooks = ThreadManagerHooks<\n StoredMessage,\n Anthropic.Messages.MessageParam\n>;\n\nexport interface AnthropicThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/** Prepared payload ready to send to the Anthropic API */\nexport interface AnthropicInvocationPayload {\n messages: Anthropic.Messages.MessageParam[];\n system?: string | Anthropic.Messages.TextBlockParam[];\n /** Number of stored messages loaded from Redis before preparation. */\n storedLength: number;\n}\n\n/** Thread manager with Anthropic MessageParam convenience helpers */\nexport interface AnthropicThreadManager extends ProviderThreadManager<\n StoredMessage,\n AnthropicContent,\n JsonValue,\n AnthropicSystemContent\n> {\n appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void>;\n prepareForInvocation(): Promise<AnthropicInvocationPayload>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.id;\n}\n\n/** Normalise content into an array of ContentBlockParam */\nfunction toContentBlocks(\n content: AnthropicContent\n): Anthropic.Messages.ContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n return content;\n}\n\n/**\n * Merge consecutive messages with the same role.\n * The Anthropic API requires alternating user/assistant turns; without\n * merging, multiple sequential tool-result messages would violate this.\n */\nfunction mergeConsecutiveMessages(\n messages: Anthropic.Messages.MessageParam[]\n): Anthropic.Messages.MessageParam[] {\n const merged: Anthropic.Messages.MessageParam[] = [];\n for (const msg of messages) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content)\n ? last.content\n : [{ type: \"text\" as const, text: last.content }];\n const msgContent = Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\" as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({\n ...msg,\n content: Array.isArray(msg.content) ? [...msg.content] : msg.content,\n });\n }\n }\n return merged;\n}\n\n/**\n * Creates an Anthropic-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed messages.\n */\nexport function createAnthropicThreadManager(\n config: AnthropicThreadManagerConfig\n): AnthropicThreadManager {\n const baseConfig: ThreadManagerConfig<StoredMessage> = {\n redis: config.redis,\n threadId: config.threadId,\n key: config.key,\n idOf: storedMessageId,\n };\n\n const base = createThreadManager(baseConfig);\n\n const helpers: Omit<AnthropicThreadManager, keyof typeof base> = {\n async appendUserMessage(\n id: string,\n content: AnthropicContent\n ): Promise<void> {\n await base.append([\n {\n id,\n message: { role: \"user\", content: toContentBlocks(content) },\n },\n ]);\n },\n\n async appendSystemMessage(\n id: string,\n content: AnthropicSystemContent\n ): Promise<void> {\n await base.initialize();\n await base.append([\n {\n id,\n // Stored under a user-role placeholder to satisfy the MessageParam\n // shape; the `isSystem` flag steers extraction in prepareForInvocation.\n message: {\n role: \"user\",\n content: content as Anthropic.Messages.MessageParam[\"content\"],\n },\n isSystem: true,\n },\n ]);\n },\n\n async appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void> {\n await base.append([\n {\n id,\n message: {\n role: \"assistant\",\n content:\n content as unknown as Anthropic.Messages.ContentBlockParam[],\n },\n },\n ]);\n },\n\n async appendToolResult(\n id: string,\n toolCallId: string,\n _toolName: string,\n content: JsonValue\n ): Promise<void> {\n const toolContent =\n typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as unknown as Anthropic.Messages.ToolResultBlockParam[\"content\"])\n : JSON.stringify(content);\n await base.append([\n {\n id,\n message: {\n role: \"user\",\n content: [\n {\n type: \"tool_result\" as const,\n tool_use_id: toolCallId,\n content: toolContent,\n },\n ],\n },\n },\n ]);\n },\n\n async prepareForInvocation(): Promise<AnthropicInvocationPayload> {\n const stored = await base.load();\n const { onPrepareMessage, onPreparedMessage } = config.hooks ?? {};\n const mapped = onPrepareMessage\n ? stored.map((msg, i) => onPrepareMessage(msg, i, stored))\n : stored;\n\n let system: string | Anthropic.Messages.TextBlockParam[] | undefined;\n const conversationMessages: Anthropic.Messages.MessageParam[] = [];\n\n for (const item of mapped) {\n if (item.isSystem) {\n system = item.message.content as\n | string\n | Anthropic.Messages.TextBlockParam[];\n } else {\n conversationMessages.push(item.message);\n }\n }\n\n const messages = mergeConsecutiveMessages(conversationMessages);\n return {\n messages: onPreparedMessage\n ? messages.map((msg, i) => onPreparedMessage(msg, i, messages))\n : messages,\n ...(system ? { system } : {}),\n storedLength: stored.length,\n };\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type { JsonValue } from \"./state/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Safely retrieve Temporal activity heartbeat and cancellation signal.\n * Returns empty object when called outside a Temporal activity (e.g. tests).\n */\nexport function getActivityContext(): {\n heartbeat?: () => void;\n signal?: AbortSignal;\n} {\n try {\n const ctx = Context.current();\n return { heartbeat: () => ctx.heartbeat(), signal: ctx.cancellationSignal };\n } catch {\n return {};\n }\n}\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 scope-prefixed `RunAgentActivity` by auto-fetching\n * the parent workflow's agent state before each invocation.\n *\n * Returns a `Record` with a single key `run<Scope>` so it can be spread\n * into the activities object alongside adapter activities.\n *\n * @param scope - Workflow scope used to derive the activity name.\n * `\"myAgentWorkflow\"` produces `{ runMyAgentWorkflow: fn }`.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * return {\n * ...adapter.createActivities(\"myAgentWorkflow\"),\n * ...createRunAgentActivity(client, adapter.invoker, \"myAgentWorkflow\"),\n * };\n * ```\n */\nexport function createRunAgentActivity<\n R,\n S extends BaseAgentState = BaseAgentState,\n>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n scope: string\n): Record<string, (config: RunAgentConfig) => Promise<R>> {\n const name = `run${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;\n return {\n [name]: async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n },\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<\n S extends BaseAgentState = BaseAgentState,\n> 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<\n TArgs,\n TResult,\n S extends BaseAgentState = BaseAgentState,\n TToolResponse = JsonValue,\n>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>\n ) => Promise<ToolHandlerResponse<TResult, TToolResponse>>\n): ActivityToolHandler<TArgs, TResult, RouterContext, TToolResponse> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { SerializableToolDefinition } from \"../../../lib/types\";\nimport type { AgentResponse, ModelInvokerConfig } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport { getActivityContext } from \"../../../lib/activity\";\n\nexport interface AnthropicModelInvokerConfig {\n redis: Redis;\n client: Anthropic;\n model: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\nfunction toAnthropicTools(\n tools: SerializableToolDefinition[]\n): Anthropic.Messages.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.schema as Anthropic.Messages.Tool.InputSchema,\n }));\n}\n\n/**\n * Creates an Anthropic model invoker that satisfies the generic\n * `ModelInvoker<Anthropic.Messages.Message>` contract.\n *\n * Internally streams the response and emits Temporal heartbeats on each\n * event so that long-running LLM calls remain visible to the scheduler.\n * The caller is responsible for appending the response to the thread.\n *\n * @example\n * ```typescript\n * import { createAnthropicModelInvoker } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const invoker = createAnthropicModelInvoker({\n * redis,\n * client,\n * model: 'claude-sonnet-4-20250514',\n * });\n *\n * return { ...createRunAgentActivity(client, invoker, \"myAgent\") };\n * ```\n */\nexport function createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens = 16384,\n hooks,\n}: AnthropicModelInvokerConfig) {\n return async function invokeAnthropicModel(\n config: ModelInvokerConfig\n ): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const { threadId, threadKey, state } = config;\n const { heartbeat, signal } = getActivityContext();\n\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n hooks,\n });\n const { messages, system, storedLength } =\n await thread.prepareForInvocation();\n\n const anthropicTools = toAnthropicTools(state.tools);\n const tools = anthropicTools.length > 0 ? anthropicTools : undefined;\n\n const params: Anthropic.MessageCreateParams = {\n model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(tools ? { tools } : {}),\n };\n\n const stream = client.messages.stream(params, { signal });\n\n for await (const _event of stream) {\n heartbeat?.();\n }\n\n const response: Anthropic.Messages.Message = await stream.finalMessage();\n\n const toolCalls = response.content.filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\"\n );\n\n return {\n message: response,\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: (tc.input as Record<string, unknown>) ?? {},\n })),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cachedWriteTokens:\n response.usage.cache_creation_input_tokens ?? undefined,\n cachedReadTokens: response.usage.cache_read_input_tokens ?? undefined,\n },\n threadLengthAtCall: storedLength,\n };\n };\n}\n\n/**\n * Standalone function for one-shot Anthropic model invocation.\n * Convenience wrapper around createAnthropicModelInvoker for cases\n * where you don't need to reuse the invoker.\n */\nexport async function invokeAnthropicModel({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n config,\n}: {\n redis: Redis;\n client: Anthropic;\n model: string;\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n config: ModelInvokerConfig;\n}): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const invoker = createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"../../../lib/tool-router/types\";\nimport type {\n ThreadOps,\n PrefixedThreadOps,\n ScopedPrefix,\n} from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicContent,\n type AnthropicSystemContent,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport {\n createAnthropicModelInvoker,\n type AnthropicModelInvokerConfig,\n} from \"./model-invoker\";\n\nconst ADAPTER_PREFIX = \"anthropic\" as const;\n\nexport type AnthropicThreadOps<TScope extends string = \"\"> = PrefixedThreadOps<\n ScopedPrefix<TScope, typeof ADAPTER_PREFIX>,\n AnthropicContent\n>;\n\nexport interface AnthropicAdapterConfig {\n redis: Redis;\n client: Anthropic;\n /** Default model name (e.g. 'claude-sonnet-4-20250514'). If omitted, use `createModelInvoker()` */\n model?: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/**\n * Tool response type accepted by the Anthropic adapter.\n *\n * Handlers can return:\n * - **`string`** — plain text content for the tool result.\n * - **`Anthropic.Messages.ToolResultBlockParam[\"content\"]`** — array of content blocks\n * (e.g. `{ type: \"text\", text: \"...\" }`, `{ type: \"image\", source: { ... } }`).\n * Passed through as-is to the `tool_result` block.\n */\nexport type AnthropicToolResponse =\n Anthropic.Messages.ToolResultBlockParam[\"content\"];\n\nexport interface AnthropicAdapter {\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<Anthropic.Messages.Message>;\n /** Create an invoker for a specific model name (for multi-model setups) */\n createModelInvoker(\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message>;\n /**\n * Create prefixed thread activities for registration on the worker.\n *\n * @param scope - Workflow name appended to the adapter prefix.\n * Use different scopes for the main agent vs subagents to avoid collisions.\n *\n * @example\n * ```typescript\n * adapter.createActivities(\"codingAgent\")\n * // → { anthropicCodingAgentInitializeThread, anthropicCodingAgentAppendHumanMessage, … }\n *\n * adapter.createActivities(\"researchAgent\")\n * // → { anthropicResearchAgentInitializeThread, … }\n * ```\n */\n createActivities<S extends string = \"\">(scope?: S): AnthropicThreadOps<S>;\n\n /**\n * Identity wrapper that types a tool handler for this adapter.\n * Constrains `toolResponse` to {@link AnthropicToolResponse}.\n */\n wrapHandler<TArgs, TResult, TContext extends RouterContext = RouterContext>(\n handler: (\n args: TArgs,\n context: TContext\n ) => Promise<ToolHandlerResponse<TResult, AnthropicToolResponse>>\n ): ActivityToolHandler<TArgs, TResult, TContext, AnthropicToolResponse>;\n}\n\n/**\n * Creates an Anthropic adapter that bundles thread operations and model\n * invocation using the `@anthropic-ai/sdk`.\n *\n * Use `createActivities(scope)` to register scoped thread operations as\n * Temporal activities on the worker. The `invoker` (or invokers created via\n * `createModelInvoker`) should be wrapped with `createRunAgentActivity`.\n *\n * @example\n * ```typescript\n * import { createAnthropicAdapter } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const adapter = createAnthropicAdapter({ redis, client, model: 'claude-sonnet-4-20250514' });\n *\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * };\n * }\n * ```\n *\n * @example Multi-agent worker (main + subagent share the adapter)\n * ```typescript\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...adapter.createActivities(\"researchAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * ...createRunAgentActivity(\n * temporalClient,\n * adapter.createModelInvoker('claude-sonnet-4-20250514'),\n * \"researchAgent\",\n * ),\n * };\n * }\n * ```\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig\n): AnthropicAdapter {\n const { redis, client } = config;\n\n const threadOps: ThreadOps<AnthropicContent> = {\n async initializeThread(\n threadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n id: string,\n content: AnthropicContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendUserMessage(id, content);\n },\n\n async appendSystemMessage(\n threadId: string,\n id: string,\n content: AnthropicSystemContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendSystemMessage(id, content);\n },\n\n async appendToolResult(id: string, cfg: ToolResultConfig): Promise<void> {\n const { threadId, threadKey, toolCallId, toolName, content } = cfg;\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendToolResult(id, toolCallId, toolName, content);\n },\n\n async appendAgentMessage(\n threadId: string,\n id: string,\n message: Anthropic.Messages.Message,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendAssistantMessage(id, message.content);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId: sourceThreadId,\n key: threadKey,\n });\n await thread.fork(targetThreadId);\n },\n\n async truncateThread(\n threadId: string,\n length: number,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.truncate(length);\n },\n };\n\n function createActivities<S extends string = \"\">(\n scope?: S\n ): AnthropicThreadOps<S> {\n const prefix = scope\n ? `${ADAPTER_PREFIX}${scope.charAt(0).toUpperCase()}${scope.slice(1)}`\n : ADAPTER_PREFIX;\n const cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);\n return Object.fromEntries(\n Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v])\n ) as AnthropicThreadOps<S>;\n }\n\n const makeInvoker = (\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message> => {\n const invokerConfig: AnthropicModelInvokerConfig = {\n redis,\n client,\n model,\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(config.maxTokens !== undefined && maxTokens === undefined\n ? { maxTokens: config.maxTokens }\n : {}),\n hooks: config.hooks,\n };\n return createAnthropicModelInvoker(invokerConfig);\n };\n\n const invoker: ModelInvoker<Anthropic.Messages.Message> = config.model\n ? makeInvoker(config.model)\n : ((() => {\n throw new Error(\n \"No default model provided to createAnthropicAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\"\n );\n }) as unknown as ModelInvoker<Anthropic.Messages.Message>);\n\n return {\n createActivities,\n invoker,\n createModelInvoker: makeInvoker,\n wrapHandler: (handler) => handler,\n };\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import Redis from 'ioredis';
|
|
2
2
|
import Anthropic from '@anthropic-ai/sdk';
|
|
3
|
-
import { a as ModelInvoker, P as PrefixedThreadOps, S as ScopedPrefix, R as RouterContext, b as ToolHandlerResponse, c as ActivityToolHandler, M as ModelInvokerConfig, A as AgentResponse } from '../../../types-
|
|
4
|
-
import { A as AnthropicContent, a as AnthropicThreadManagerHooks } from '../../../thread-manager-
|
|
5
|
-
export { b as AnthropicInvocationPayload, c as AnthropicThreadManager, d as AnthropicThreadManagerConfig, S as StoredMessage, e as createAnthropicThreadManager } from '../../../thread-manager-
|
|
3
|
+
import { a as ModelInvoker, P as PrefixedThreadOps, S as ScopedPrefix, R as RouterContext, b as ToolHandlerResponse, c as ActivityToolHandler, M as ModelInvokerConfig, A as AgentResponse } from '../../../types-C06FwR96.cjs';
|
|
4
|
+
import { A as AnthropicContent, a as AnthropicThreadManagerHooks } from '../../../thread-manager-HSwyh28L.cjs';
|
|
5
|
+
export { b as AnthropicInvocationPayload, c as AnthropicThreadManager, d as AnthropicThreadManagerConfig, S as StoredMessage, e as createAnthropicThreadManager } from '../../../thread-manager-HSwyh28L.cjs';
|
|
6
6
|
import '@temporalio/common';
|
|
7
7
|
import '@temporalio/workflow';
|
|
8
8
|
import '@temporalio/common/lib/interfaces';
|
|
9
9
|
import 'zod';
|
|
10
|
-
import '../../../types-
|
|
11
|
-
import '../../../types-
|
|
10
|
+
import '../../../types-yx0LzPGn.cjs';
|
|
11
|
+
import '../../../types-BaOw4hKI.cjs';
|
|
12
12
|
|
|
13
13
|
declare const ADAPTER_PREFIX: "anthropic";
|
|
14
14
|
type AnthropicThreadOps<TScope extends string = ""> = PrefixedThreadOps<ScopedPrefix<TScope, typeof ADAPTER_PREFIX>, AnthropicContent>;
|