zeitlich 0.2.16 → 0.2.18

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.
Files changed (50) hide show
  1. package/README.md +75 -64
  2. package/dist/adapters/sandbox/virtual/index.cjs +45 -0
  3. package/dist/adapters/sandbox/virtual/index.cjs.map +1 -1
  4. package/dist/adapters/sandbox/virtual/index.d.cts +3 -3
  5. package/dist/adapters/sandbox/virtual/index.d.ts +3 -3
  6. package/dist/adapters/sandbox/virtual/index.js +43 -1
  7. package/dist/adapters/sandbox/virtual/index.js.map +1 -1
  8. package/dist/adapters/thread/google-genai/index.d.cts +2 -2
  9. package/dist/adapters/thread/google-genai/index.d.ts +2 -2
  10. package/dist/adapters/thread/langchain/index.cjs +2 -2
  11. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  12. package/dist/adapters/thread/langchain/index.d.cts +2 -2
  13. package/dist/adapters/thread/langchain/index.d.ts +2 -2
  14. package/dist/adapters/thread/langchain/index.js +2 -2
  15. package/dist/adapters/thread/langchain/index.js.map +1 -1
  16. package/dist/index.cjs +104 -9
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +6 -6
  19. package/dist/index.d.ts +6 -6
  20. package/dist/index.js +100 -10
  21. package/dist/index.js.map +1 -1
  22. package/dist/{types-DCi2qXjN.d.cts → queries-DnX72m_Y.d.cts} +43 -2
  23. package/dist/{types-BSOte_8s.d.ts → queries-TwukRZ8b.d.ts} +43 -2
  24. package/dist/{types-XPtivmSJ.d.ts → types-CdB2D5Sq.d.ts} +32 -13
  25. package/dist/{types-BMXzv7TN.d.cts → types-CmOSypVk.d.cts} +2 -2
  26. package/dist/{types-BMXzv7TN.d.ts → types-CmOSypVk.d.ts} +2 -2
  27. package/dist/{types-Drli9aCK.d.cts → types-DRvq2miV.d.cts} +32 -13
  28. package/dist/workflow.cjs +104 -9
  29. package/dist/workflow.cjs.map +1 -1
  30. package/dist/workflow.d.cts +114 -40
  31. package/dist/workflow.d.ts +114 -40
  32. package/dist/workflow.js +100 -10
  33. package/dist/workflow.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/adapters/sandbox/virtual/index.ts +2 -0
  36. package/src/adapters/sandbox/virtual/queries.ts +97 -0
  37. package/src/adapters/thread/langchain/activities.ts +7 -5
  38. package/src/lib/session/session.integration.test.ts +1 -0
  39. package/src/lib/subagent/define.ts +34 -47
  40. package/src/lib/subagent/handler.ts +9 -6
  41. package/src/lib/subagent/index.ts +4 -1
  42. package/src/lib/subagent/register.ts +7 -4
  43. package/src/lib/subagent/subagent.integration.test.ts +206 -51
  44. package/src/lib/subagent/types.ts +41 -11
  45. package/src/lib/subagent/workflow.ts +114 -0
  46. package/src/lib/tool-router/router.ts +2 -1
  47. package/src/lib/tool-router/types.ts +2 -2
  48. package/src/lib/workflow.test.ts +131 -0
  49. package/src/lib/workflow.ts +45 -0
  50. package/src/workflow.ts +12 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/adapters/sandbox/virtual/filesystem.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/virtual/provider.ts","../../../../src/lib/activity.ts","../../../../src/adapters/sandbox/virtual/with-virtual-sandbox.ts","../../../../src/adapters/sandbox/virtual/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 * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n cp(src: string, dest: string, options?: { recursive?: boolean }): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n /** Optional state to merge into the workflow's `AgentState` via the session. */\n stateUpdate?: Record<string, unknown>;\n}\n\nexport interface SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> {\n createSandbox(\n options?: TOptions,\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }>;\n destroySandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true,\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type {\n SandboxFileSystem,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { posix } from \"node:path\";\nimport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n TreeMutation,\n} from \"./types\";\n\n/** Normalize a path against the provided workspace base. */\nfunction normalisePath(p: string, workspaceBase = \"/\"): string {\n return posix.resolve(workspaceBase, p);\n}\n\n/** Return the parent directory of a normalised path (\"/a/b\" → \"/a\"). */\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf(\"/\");\n return idx <= 0 ? \"/\" : p.slice(0, idx);\n}\n\n/**\n * Collect the set of implicit directory paths from a flat file list.\n * E.g. \"/a/b/c.ts\" contributes \"/a/b\", \"/a\", \"/\".\n */\nfunction inferDirectories(\n entries: { path: string }[],\n workspaceBase: string,\n): Set<string> {\n const dirs = new Set<string>();\n dirs.add(\"/\");\n for (const entry of entries) {\n let dir = parentDir(normalisePath(entry.path, workspaceBase));\n while (dir !== \"/\" && !dirs.has(dir)) {\n dirs.add(dir);\n dir = parentDir(dir);\n }\n dirs.add(\"/\");\n }\n return dirs;\n}\n\n/**\n * Ephemeral {@link SandboxFileSystem} backed by a {@link FileResolver}.\n *\n * Created fresh for each tool invocation from the current workflow file tree.\n * Directory structure is inferred from file paths. All mutations are tracked\n * and can be retrieved via {@link getMutations} after the handler completes.\n */\nexport class VirtualSandboxFileSystem<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements SandboxFileSystem\n{\n readonly workspaceBase: string;\n private entries: Map<string, FileEntry<TMeta>>;\n private directories: Set<string>;\n private mutations: TreeMutation<TMeta>[] = [];\n\n constructor(\n tree: FileEntry<TMeta>[],\n private resolver: FileResolver<TCtx, TMeta>,\n private ctx: TCtx,\n workspaceBase = \"/\",\n ) {\n this.workspaceBase = normalisePath(workspaceBase);\n this.entries = new Map(\n tree.map((e) => [normalisePath(e.path, this.workspaceBase), e]),\n );\n this.directories = inferDirectories(tree, this.workspaceBase);\n }\n\n /** Return all mutations accumulated during this invocation. */\n getMutations(): TreeMutation<TMeta>[] {\n return this.mutations;\n }\n\n /** Look up a file entry by virtual path. */\n getEntry(path: string): FileEntry<TMeta> | undefined {\n return this.entries.get(normalisePath(path, this.workspaceBase));\n }\n\n // --------------------------------------------------------------------------\n // Read operations — delegate to resolver lazily\n // --------------------------------------------------------------------------\n\n async readFile(path: string): Promise<string> {\n const entry = this.entries.get(normalisePath(path, this.workspaceBase));\n if (!entry) throw new Error(`ENOENT: no such file: ${path}`);\n return this.resolver.readFile(entry.id, this.ctx);\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const entry = this.entries.get(normalisePath(path, this.workspaceBase));\n if (!entry) throw new Error(`ENOENT: no such file: ${path}`);\n return this.resolver.readFileBuffer(entry.id, this.ctx);\n }\n\n // --------------------------------------------------------------------------\n // Metadata operations — pure, resolved from the tree\n // --------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const norm = normalisePath(path, this.workspaceBase);\n return this.entries.has(norm) || this.directories.has(norm);\n }\n\n async stat(path: string): Promise<FileStat> {\n const norm = normalisePath(path, this.workspaceBase);\n const entry = this.entries.get(norm);\n if (entry) {\n return {\n isFile: true,\n isDirectory: false,\n isSymbolicLink: false,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n if (this.directories.has(norm)) {\n return {\n isFile: false,\n isDirectory: true,\n isSymbolicLink: false,\n size: 0,\n mtime: new Date(),\n };\n }\n throw new Error(`ENOENT: no such file or directory: ${path}`);\n }\n\n async readdir(path: string): Promise<string[]> {\n const norm = normalisePath(path, this.workspaceBase);\n if (!this.directories.has(norm)) {\n throw new Error(`ENOENT: no such directory: ${path}`);\n }\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n const names = new Set<string>();\n\n for (const p of this.entries.keys()) {\n if (p.startsWith(prefix)) {\n const rest = p.slice(prefix.length);\n const seg = rest.split(\"/\")[0];\n if (seg) names.add(seg);\n }\n }\n for (const d of this.directories) {\n if (d.startsWith(prefix) && d !== norm) {\n const rest = d.slice(prefix.length);\n const seg = rest.split(\"/\")[0];\n if (seg) names.add(seg);\n }\n }\n return [...names].sort();\n }\n\n async readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n const names = await this.readdir(path);\n const norm = normalisePath(path, this.workspaceBase);\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n\n return names.map((name) => {\n const full = prefix + name;\n const isFile = this.entries.has(full);\n const isDirectory = this.directories.has(full);\n return { name, isFile, isDirectory, isSymbolicLink: false };\n });\n }\n\n // --------------------------------------------------------------------------\n // Write operations — delegate to resolver, record mutations\n // --------------------------------------------------------------------------\n\n async writeFile(path: string, content: string | Uint8Array): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const existing = this.entries.get(norm);\n\n if (existing) {\n await this.resolver.writeFile(existing.id, content, this.ctx);\n const size =\n typeof content === \"string\"\n ? new TextEncoder().encode(content).byteLength\n : content.byteLength;\n const updated: FileEntry<TMeta> = {\n ...existing,\n size,\n mtime: new Date().toISOString(),\n };\n this.entries.set(norm, updated);\n this.mutations.push({ type: \"update\", path: norm, entry: updated });\n } else {\n const entry = await this.resolver.createFile(norm, content, this.ctx);\n const normalised = { ...entry, path: norm };\n this.entries.set(norm, normalised);\n this.addParentDirectories(norm);\n this.mutations.push({ type: \"add\", entry: normalised });\n }\n }\n\n async appendFile(path: string, content: string | Uint8Array): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const existing = this.entries.get(norm);\n\n if (!existing) {\n return this.writeFile(path, content);\n }\n\n const current = await this.resolver.readFile(existing.id, this.ctx);\n const appended =\n typeof content === \"string\"\n ? current + content\n : current + new TextDecoder().decode(content);\n await this.resolver.writeFile(existing.id, appended, this.ctx);\n\n const size = new TextEncoder().encode(appended).byteLength;\n const updated: FileEntry<TMeta> = {\n ...existing,\n size,\n mtime: new Date().toISOString(),\n };\n this.entries.set(norm, updated);\n this.mutations.push({ type: \"update\", path: norm, entry: updated });\n }\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n const norm = normalisePath(_path, this.workspaceBase);\n if (this.directories.has(norm)) return;\n\n if (_options?.recursive) {\n this.addParentDirectories(norm + \"/placeholder\");\n this.directories.add(norm);\n } else {\n const parent = parentDir(norm);\n if (!this.directories.has(parent)) {\n throw new Error(`ENOENT: no such directory: ${parent}`);\n }\n this.directories.add(norm);\n }\n }\n\n async rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean },\n ): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const entry = this.entries.get(norm);\n\n if (entry) {\n await this.resolver.deleteFile(entry.id, this.ctx);\n this.entries.delete(norm);\n this.mutations.push({ type: \"remove\", path: norm });\n return;\n }\n\n if (this.directories.has(norm)) {\n if (!options?.recursive) {\n throw new Error(`EISDIR: is a directory (use recursive): ${path}`);\n }\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n for (const [p, e] of this.entries) {\n if (p.startsWith(prefix)) {\n await this.resolver.deleteFile(e.id, this.ctx);\n this.entries.delete(p);\n this.mutations.push({ type: \"remove\", path: p });\n }\n }\n for (const d of this.directories) {\n if (d.startsWith(prefix)) this.directories.delete(d);\n }\n this.directories.delete(norm);\n return;\n }\n\n if (!options?.force) {\n throw new Error(`ENOENT: no such file or directory: ${path}`);\n }\n }\n\n async cp(\n src: string,\n dest: string,\n _options?: { recursive?: boolean },\n ): Promise<void> {\n const normSrc = normalisePath(src, this.workspaceBase);\n const normDest = normalisePath(dest, this.workspaceBase);\n\n const entry = this.entries.get(normSrc);\n if (entry) {\n const content = await this.resolver.readFile(entry.id, this.ctx);\n await this.writeFile(normDest, content);\n return;\n }\n\n if (!this.directories.has(normSrc)) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n if (!_options?.recursive) {\n throw new Error(`EISDIR: is a directory (use recursive): ${src}`);\n }\n\n const prefix = normSrc === \"/\" ? \"/\" : normSrc + \"/\";\n for (const [p, e] of this.entries) {\n if (p.startsWith(prefix)) {\n const relative = p.slice(normSrc.length);\n const content = await this.resolver.readFile(e.id, this.ctx);\n await this.writeFile(normDest + relative, content);\n }\n }\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.cp(src, dest, { recursive: true });\n await this.rm(src, { recursive: true });\n }\n\n // --------------------------------------------------------------------------\n // Unsupported\n // --------------------------------------------------------------------------\n\n async readlink(_path: string): Promise<string> {\n throw new SandboxNotSupportedError(\"readlink\");\n }\n\n resolvePath(base: string, path: string): string {\n return posix.resolve(normalisePath(base, this.workspaceBase), path);\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n private addParentDirectories(filePath: string): void {\n let dir = parentDir(normalisePath(filePath, this.workspaceBase));\n while (!this.directories.has(dir)) {\n this.directories.add(dir);\n dir = parentDir(dir);\n }\n }\n}\n","import { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import type {\n SandboxCapabilities,\n SandboxCreateResult,\n SandboxProvider,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\nimport { createVirtualSandbox } from \"./index\";\nimport type {\n FileEntryMetadata,\n FileResolver,\n VirtualSandboxCreateOptions,\n} from \"./types\";\n\n/**\n * Stateless {@link SandboxProvider} backed by a {@link FileResolver}.\n *\n * The provider holds **no internal state**. All sandbox state (sandboxId,\n * fileTree, resolverContext, workspaceBase) is returned as a `stateUpdate` from\n * {@link create} and merged into the workflow's `AgentState` by the session.\n * {@link withVirtualSandbox} reads this state back on every tool invocation.\n *\n * @example\n * ```typescript\n * const provider = new VirtualSandboxProvider(resolver);\n * const manager = new SandboxManager(provider);\n *\n * export const activities = {\n * ...manager.createActivities(),\n * readFile: withVirtualSandbox(client, provider, readHandler),\n * };\n * ```\n */\nexport class VirtualSandboxProvider<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements SandboxProvider<VirtualSandboxCreateOptions<TCtx>> {\n readonly id = \"virtual\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: false,\n persistence: true,\n };\n\n readonly resolver: FileResolver<TCtx, TMeta>;\n\n constructor(resolver: FileResolver<TCtx, TMeta>) {\n this.resolver = resolver;\n }\n\n async create(\n options?: VirtualSandboxCreateOptions<TCtx>\n ): Promise<SandboxCreateResult> {\n if (!options || !(\"resolverContext\" in options)) {\n throw new Error(\"VirtualSandboxProvider.create requires resolverContext\");\n }\n\n const sandboxId = options.id ?? getShortId();\n const fileTree = await this.resolver.resolveEntries(\n options.resolverContext\n );\n const workspaceBase = options.workspaceBase ?? \"/\";\n\n const sandbox = createVirtualSandbox(\n sandboxId,\n fileTree,\n this.resolver,\n options.resolverContext,\n workspaceBase,\n );\n\n return {\n sandbox,\n stateUpdate: {\n sandboxId,\n fileTree,\n resolverContext: options.resolverContext,\n workspaceBase,\n },\n };\n }\n\n async get(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"get (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n\n async destroy(): Promise<void> {\n // No-op — no internal state to clean up\n }\n\n async snapshot(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"snapshot (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n\n async restore(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"restore (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent\n * workflow's agent state before each invocation.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n *\n * const invoker = createLangChainModelInvoker({ redis, model });\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\nexport function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n): (config: RunAgentConfig) => Promise<R> {\n return async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<S extends BaseAgentState = BaseAgentState> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<TArgs, TResult, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>,\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type { WorkflowClient } from \"@temporalio/client\";\nimport { queryParentWorkflowState } from \"../../../lib/activity\";\nimport type { ActivityToolHandler } from \"../../../lib/tool-router/types\";\nimport type {\n FileEntryMetadata,\n TreeMutation,\n VirtualSandboxContext,\n VirtualSandboxState,\n} from \"./types\";\nimport type { VirtualSandboxProvider } from \"./provider\";\nimport { createVirtualSandbox } from \"./index\";\n\n/**\n * Wraps a tool handler that needs a virtual sandbox, automatically querying\n * the parent workflow for the current file tree and resolver context.\n *\n * On each invocation the wrapper:\n * 1. Queries the workflow's `AgentState` for `fileTree`, `resolverContext`, and `workspaceBase`\n * 2. Creates an ephemeral {@link VirtualSandbox} from tree + provider's resolver\n * 3. Runs the inner handler\n * 4. Returns the handler's result together with any {@link TreeMutation}s\n *\n * The consumer applies mutations back to workflow state via a post-tool hook.\n *\n * @param client - Temporal `WorkflowClient` for querying the parent workflow\n * @param agentName - Agent name (used to derive the state query name)\n * @param provider - {@link VirtualSandboxProvider} (wraps the resolver)\n * @param handler - Inner handler expecting a {@link VirtualSandboxContext}\n *\n * @example\n * ```typescript\n * import { withVirtualSandbox, type VirtualSandboxContext } from 'zeitlich';\n *\n * const readHandler: ActivityToolHandler<FileReadArgs, ReadResult, VirtualSandboxContext> =\n * async (args, { sandbox }) => {\n * const content = await sandbox.fs.readFile(args.path);\n * return { toolResponse: content, data: { path: args.path, content } };\n * };\n *\n * // At activity registration:\n * const provider = new VirtualSandboxProvider(resolver);\n * const handler = withVirtualSandbox(client, \"myAgent\", provider, readHandler);\n * ```\n */\nexport function withVirtualSandbox<\n TArgs,\n TResult,\n TCtx,\n TMeta = FileEntryMetadata,\n>(\n client: WorkflowClient,\n provider: VirtualSandboxProvider<TCtx, TMeta>,\n handler: ActivityToolHandler<\n TArgs,\n TResult,\n VirtualSandboxContext<TCtx, TMeta>\n >\n): ActivityToolHandler<\n TArgs,\n (TResult & { treeMutations: TreeMutation<TMeta>[] }) | null\n> {\n return async (args, context) => {\n const state =\n await queryParentWorkflowState<VirtualSandboxState<TCtx, TMeta>>(client);\n\n const { sandboxId, fileTree, resolverContext, workspaceBase } = state;\n if (!fileTree || !sandboxId) {\n return {\n toolResponse: `Error: No fileTree/sandboxId in agent state. The ${context.toolName} tool requires a virtual sandbox.`,\n data: null,\n };\n }\n\n const sandbox = createVirtualSandbox(\n sandboxId,\n fileTree,\n provider.resolver,\n resolverContext,\n workspaceBase ?? \"/\",\n );\n const response = await handler(args, { ...context, sandbox });\n const mutations = sandbox.fs.getMutations();\n\n return {\n toolResponse: response.toolResponse,\n data: {\n ...(response.data ?? {}),\n treeMutations: mutations,\n } as TResult & { treeMutations: TreeMutation<TMeta>[] },\n };\n };\n}\n","import type {\n Sandbox,\n SandboxCapabilities,\n ExecOptions,\n ExecResult,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { VirtualSandboxFileSystem } from \"./filesystem\";\nimport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n VirtualSandbox,\n} from \"./types\";\n\n// ============================================================================\n// VirtualSandbox\n// ============================================================================\n\nclass VirtualSandboxImpl<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements Sandbox\n{\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: false,\n persistence: true,\n };\n\n readonly fs: VirtualSandboxFileSystem<TCtx, TMeta>;\n\n constructor(\n readonly id: string,\n tree: FileEntry<TMeta>[],\n resolver: FileResolver<TCtx, TMeta>,\n ctx: TCtx,\n workspaceBase = \"/\",\n ) {\n this.fs = new VirtualSandboxFileSystem(tree, resolver, ctx, workspaceBase);\n }\n\n async exec(_command: string, _options?: ExecOptions): Promise<ExecResult> {\n throw new SandboxNotSupportedError(\"exec\");\n }\n\n async destroy(): Promise<void> {\n // Ephemeral — nothing to clean up\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an ephemeral {@link Sandbox} from a file tree and resolver.\n *\n * Used internally by {@link withVirtualSandbox} and\n * {@link VirtualSandboxProvider}; consumers can also call this directly\n * if they need a sandbox outside the wrapper pattern.\n */\nexport function createVirtualSandbox<\n TCtx,\n TMeta = FileEntryMetadata,\n>(\n id: string,\n tree: FileEntry<TMeta>[],\n resolver: FileResolver<TCtx, TMeta>,\n ctx: TCtx,\n workspaceBase = \"/\",\n): VirtualSandbox<TCtx, TMeta> {\n return new VirtualSandboxImpl(id, tree, resolver, ctx, workspaceBase);\n}\n\n// Re-exports for convenience\nexport { VirtualSandboxFileSystem } from \"./filesystem\";\nexport { VirtualSandboxProvider } from \"./provider\";\nexport { withVirtualSandbox } from \"./with-virtual-sandbox\";\nexport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n VirtualFileTree,\n VirtualSandboxCreateOptions,\n VirtualSandboxState,\n VirtualSandboxContext,\n VirtualSandbox,\n TreeMutation,\n} from \"./types\";\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/sandbox/types.ts","../../../../src/adapters/sandbox/virtual/filesystem.ts","../../../../src/lib/thread/id.ts","../../../../src/adapters/sandbox/virtual/provider.ts","../../../../src/lib/activity.ts","../../../../src/adapters/sandbox/virtual/with-virtual-sandbox.ts","../../../../src/adapters/sandbox/virtual/queries.ts","../../../../src/adapters/sandbox/virtual/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 * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n cp(src: string, dest: string, options?: { recursive?: boolean }): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n /** Optional state to merge into the workflow's `AgentState` via the session. */\n stateUpdate?: Record<string, unknown>;\n}\n\nexport interface SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n snapshot(sandboxId: string): Promise<SandboxSnapshot>;\n restore(snapshot: SandboxSnapshot): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> {\n createSandbox(\n options?: TOptions,\n ): Promise<{ sandboxId: string; stateUpdate?: Record<string, unknown> }>;\n destroySandbox(sandboxId: string): Promise<void>;\n snapshotSandbox(sandboxId: string): Promise<SandboxSnapshot>;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true,\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type {\n SandboxFileSystem,\n DirentEntry,\n FileStat,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { posix } from \"node:path\";\nimport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n TreeMutation,\n} from \"./types\";\n\n/** Normalize a path against the provided workspace base. */\nfunction normalisePath(p: string, workspaceBase = \"/\"): string {\n return posix.resolve(workspaceBase, p);\n}\n\n/** Return the parent directory of a normalised path (\"/a/b\" → \"/a\"). */\nfunction parentDir(p: string): string {\n const idx = p.lastIndexOf(\"/\");\n return idx <= 0 ? \"/\" : p.slice(0, idx);\n}\n\n/**\n * Collect the set of implicit directory paths from a flat file list.\n * E.g. \"/a/b/c.ts\" contributes \"/a/b\", \"/a\", \"/\".\n */\nfunction inferDirectories(\n entries: { path: string }[],\n workspaceBase: string,\n): Set<string> {\n const dirs = new Set<string>();\n dirs.add(\"/\");\n for (const entry of entries) {\n let dir = parentDir(normalisePath(entry.path, workspaceBase));\n while (dir !== \"/\" && !dirs.has(dir)) {\n dirs.add(dir);\n dir = parentDir(dir);\n }\n dirs.add(\"/\");\n }\n return dirs;\n}\n\n/**\n * Ephemeral {@link SandboxFileSystem} backed by a {@link FileResolver}.\n *\n * Created fresh for each tool invocation from the current workflow file tree.\n * Directory structure is inferred from file paths. All mutations are tracked\n * and can be retrieved via {@link getMutations} after the handler completes.\n */\nexport class VirtualSandboxFileSystem<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements SandboxFileSystem\n{\n readonly workspaceBase: string;\n private entries: Map<string, FileEntry<TMeta>>;\n private directories: Set<string>;\n private mutations: TreeMutation<TMeta>[] = [];\n\n constructor(\n tree: FileEntry<TMeta>[],\n private resolver: FileResolver<TCtx, TMeta>,\n private ctx: TCtx,\n workspaceBase = \"/\",\n ) {\n this.workspaceBase = normalisePath(workspaceBase);\n this.entries = new Map(\n tree.map((e) => [normalisePath(e.path, this.workspaceBase), e]),\n );\n this.directories = inferDirectories(tree, this.workspaceBase);\n }\n\n /** Return all mutations accumulated during this invocation. */\n getMutations(): TreeMutation<TMeta>[] {\n return this.mutations;\n }\n\n /** Look up a file entry by virtual path. */\n getEntry(path: string): FileEntry<TMeta> | undefined {\n return this.entries.get(normalisePath(path, this.workspaceBase));\n }\n\n // --------------------------------------------------------------------------\n // Read operations — delegate to resolver lazily\n // --------------------------------------------------------------------------\n\n async readFile(path: string): Promise<string> {\n const entry = this.entries.get(normalisePath(path, this.workspaceBase));\n if (!entry) throw new Error(`ENOENT: no such file: ${path}`);\n return this.resolver.readFile(entry.id, this.ctx);\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const entry = this.entries.get(normalisePath(path, this.workspaceBase));\n if (!entry) throw new Error(`ENOENT: no such file: ${path}`);\n return this.resolver.readFileBuffer(entry.id, this.ctx);\n }\n\n // --------------------------------------------------------------------------\n // Metadata operations — pure, resolved from the tree\n // --------------------------------------------------------------------------\n\n async exists(path: string): Promise<boolean> {\n const norm = normalisePath(path, this.workspaceBase);\n return this.entries.has(norm) || this.directories.has(norm);\n }\n\n async stat(path: string): Promise<FileStat> {\n const norm = normalisePath(path, this.workspaceBase);\n const entry = this.entries.get(norm);\n if (entry) {\n return {\n isFile: true,\n isDirectory: false,\n isSymbolicLink: false,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n if (this.directories.has(norm)) {\n return {\n isFile: false,\n isDirectory: true,\n isSymbolicLink: false,\n size: 0,\n mtime: new Date(),\n };\n }\n throw new Error(`ENOENT: no such file or directory: ${path}`);\n }\n\n async readdir(path: string): Promise<string[]> {\n const norm = normalisePath(path, this.workspaceBase);\n if (!this.directories.has(norm)) {\n throw new Error(`ENOENT: no such directory: ${path}`);\n }\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n const names = new Set<string>();\n\n for (const p of this.entries.keys()) {\n if (p.startsWith(prefix)) {\n const rest = p.slice(prefix.length);\n const seg = rest.split(\"/\")[0];\n if (seg) names.add(seg);\n }\n }\n for (const d of this.directories) {\n if (d.startsWith(prefix) && d !== norm) {\n const rest = d.slice(prefix.length);\n const seg = rest.split(\"/\")[0];\n if (seg) names.add(seg);\n }\n }\n return [...names].sort();\n }\n\n async readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n const names = await this.readdir(path);\n const norm = normalisePath(path, this.workspaceBase);\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n\n return names.map((name) => {\n const full = prefix + name;\n const isFile = this.entries.has(full);\n const isDirectory = this.directories.has(full);\n return { name, isFile, isDirectory, isSymbolicLink: false };\n });\n }\n\n // --------------------------------------------------------------------------\n // Write operations — delegate to resolver, record mutations\n // --------------------------------------------------------------------------\n\n async writeFile(path: string, content: string | Uint8Array): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const existing = this.entries.get(norm);\n\n if (existing) {\n await this.resolver.writeFile(existing.id, content, this.ctx);\n const size =\n typeof content === \"string\"\n ? new TextEncoder().encode(content).byteLength\n : content.byteLength;\n const updated: FileEntry<TMeta> = {\n ...existing,\n size,\n mtime: new Date().toISOString(),\n };\n this.entries.set(norm, updated);\n this.mutations.push({ type: \"update\", path: norm, entry: updated });\n } else {\n const entry = await this.resolver.createFile(norm, content, this.ctx);\n const normalised = { ...entry, path: norm };\n this.entries.set(norm, normalised);\n this.addParentDirectories(norm);\n this.mutations.push({ type: \"add\", entry: normalised });\n }\n }\n\n async appendFile(path: string, content: string | Uint8Array): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const existing = this.entries.get(norm);\n\n if (!existing) {\n return this.writeFile(path, content);\n }\n\n const current = await this.resolver.readFile(existing.id, this.ctx);\n const appended =\n typeof content === \"string\"\n ? current + content\n : current + new TextDecoder().decode(content);\n await this.resolver.writeFile(existing.id, appended, this.ctx);\n\n const size = new TextEncoder().encode(appended).byteLength;\n const updated: FileEntry<TMeta> = {\n ...existing,\n size,\n mtime: new Date().toISOString(),\n };\n this.entries.set(norm, updated);\n this.mutations.push({ type: \"update\", path: norm, entry: updated });\n }\n\n async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {\n const norm = normalisePath(_path, this.workspaceBase);\n if (this.directories.has(norm)) return;\n\n if (_options?.recursive) {\n this.addParentDirectories(norm + \"/placeholder\");\n this.directories.add(norm);\n } else {\n const parent = parentDir(norm);\n if (!this.directories.has(parent)) {\n throw new Error(`ENOENT: no such directory: ${parent}`);\n }\n this.directories.add(norm);\n }\n }\n\n async rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean },\n ): Promise<void> {\n const norm = normalisePath(path, this.workspaceBase);\n const entry = this.entries.get(norm);\n\n if (entry) {\n await this.resolver.deleteFile(entry.id, this.ctx);\n this.entries.delete(norm);\n this.mutations.push({ type: \"remove\", path: norm });\n return;\n }\n\n if (this.directories.has(norm)) {\n if (!options?.recursive) {\n throw new Error(`EISDIR: is a directory (use recursive): ${path}`);\n }\n const prefix = norm === \"/\" ? \"/\" : norm + \"/\";\n for (const [p, e] of this.entries) {\n if (p.startsWith(prefix)) {\n await this.resolver.deleteFile(e.id, this.ctx);\n this.entries.delete(p);\n this.mutations.push({ type: \"remove\", path: p });\n }\n }\n for (const d of this.directories) {\n if (d.startsWith(prefix)) this.directories.delete(d);\n }\n this.directories.delete(norm);\n return;\n }\n\n if (!options?.force) {\n throw new Error(`ENOENT: no such file or directory: ${path}`);\n }\n }\n\n async cp(\n src: string,\n dest: string,\n _options?: { recursive?: boolean },\n ): Promise<void> {\n const normSrc = normalisePath(src, this.workspaceBase);\n const normDest = normalisePath(dest, this.workspaceBase);\n\n const entry = this.entries.get(normSrc);\n if (entry) {\n const content = await this.resolver.readFile(entry.id, this.ctx);\n await this.writeFile(normDest, content);\n return;\n }\n\n if (!this.directories.has(normSrc)) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n if (!_options?.recursive) {\n throw new Error(`EISDIR: is a directory (use recursive): ${src}`);\n }\n\n const prefix = normSrc === \"/\" ? \"/\" : normSrc + \"/\";\n for (const [p, e] of this.entries) {\n if (p.startsWith(prefix)) {\n const relative = p.slice(normSrc.length);\n const content = await this.resolver.readFile(e.id, this.ctx);\n await this.writeFile(normDest + relative, content);\n }\n }\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.cp(src, dest, { recursive: true });\n await this.rm(src, { recursive: true });\n }\n\n // --------------------------------------------------------------------------\n // Unsupported\n // --------------------------------------------------------------------------\n\n async readlink(_path: string): Promise<string> {\n throw new SandboxNotSupportedError(\"readlink\");\n }\n\n resolvePath(base: string, path: string): string {\n return posix.resolve(normalisePath(base, this.workspaceBase), path);\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n private addParentDirectories(filePath: string): void {\n let dir = parentDir(normalisePath(filePath, this.workspaceBase));\n while (!this.directories.has(dir)) {\n this.directories.add(dir);\n dir = parentDir(dir);\n }\n }\n}\n","import { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import type {\n SandboxCapabilities,\n SandboxCreateResult,\n SandboxProvider,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { getShortId } from \"../../../lib/thread/id\";\nimport { createVirtualSandbox } from \"./index\";\nimport type {\n FileEntryMetadata,\n FileResolver,\n VirtualSandboxCreateOptions,\n} from \"./types\";\n\n/**\n * Stateless {@link SandboxProvider} backed by a {@link FileResolver}.\n *\n * The provider holds **no internal state**. All sandbox state (sandboxId,\n * fileTree, resolverContext, workspaceBase) is returned as a `stateUpdate` from\n * {@link create} and merged into the workflow's `AgentState` by the session.\n * {@link withVirtualSandbox} reads this state back on every tool invocation.\n *\n * @example\n * ```typescript\n * const provider = new VirtualSandboxProvider(resolver);\n * const manager = new SandboxManager(provider);\n *\n * export const activities = {\n * ...manager.createActivities(),\n * readFile: withVirtualSandbox(client, provider, readHandler),\n * };\n * ```\n */\nexport class VirtualSandboxProvider<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements SandboxProvider<VirtualSandboxCreateOptions<TCtx>> {\n readonly id = \"virtual\";\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: false,\n persistence: true,\n };\n\n readonly resolver: FileResolver<TCtx, TMeta>;\n\n constructor(resolver: FileResolver<TCtx, TMeta>) {\n this.resolver = resolver;\n }\n\n async create(\n options?: VirtualSandboxCreateOptions<TCtx>\n ): Promise<SandboxCreateResult> {\n if (!options || !(\"resolverContext\" in options)) {\n throw new Error(\"VirtualSandboxProvider.create requires resolverContext\");\n }\n\n const sandboxId = options.id ?? getShortId();\n const fileTree = await this.resolver.resolveEntries(\n options.resolverContext\n );\n const workspaceBase = options.workspaceBase ?? \"/\";\n\n const sandbox = createVirtualSandbox(\n sandboxId,\n fileTree,\n this.resolver,\n options.resolverContext,\n workspaceBase,\n );\n\n return {\n sandbox,\n stateUpdate: {\n sandboxId,\n fileTree,\n resolverContext: options.resolverContext,\n workspaceBase,\n },\n };\n }\n\n async get(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"get (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n\n async destroy(): Promise<void> {\n // No-op — no internal state to clean up\n }\n\n async snapshot(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"snapshot (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n\n async restore(): Promise<never> {\n throw new SandboxNotSupportedError(\n \"restore (virtual sandbox state lives in workflow AgentState)\"\n );\n }\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent\n * workflow's agent state before each invocation.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n *\n * const invoker = createLangChainModelInvoker({ redis, model });\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\nexport function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n): (config: RunAgentConfig) => Promise<R> {\n return async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<S extends BaseAgentState = BaseAgentState> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<TArgs, TResult, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>,\n ) => Promise<ToolHandlerResponse<TResult>>,\n): ActivityToolHandler<TArgs, TResult> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type { WorkflowClient } from \"@temporalio/client\";\nimport { queryParentWorkflowState } from \"../../../lib/activity\";\nimport type { ActivityToolHandler } from \"../../../lib/tool-router/types\";\nimport type {\n FileEntryMetadata,\n TreeMutation,\n VirtualSandboxContext,\n VirtualSandboxState,\n} from \"./types\";\nimport type { VirtualSandboxProvider } from \"./provider\";\nimport { createVirtualSandbox } from \"./index\";\n\n/**\n * Wraps a tool handler that needs a virtual sandbox, automatically querying\n * the parent workflow for the current file tree and resolver context.\n *\n * On each invocation the wrapper:\n * 1. Queries the workflow's `AgentState` for `fileTree`, `resolverContext`, and `workspaceBase`\n * 2. Creates an ephemeral {@link VirtualSandbox} from tree + provider's resolver\n * 3. Runs the inner handler\n * 4. Returns the handler's result together with any {@link TreeMutation}s\n *\n * The consumer applies mutations back to workflow state via a post-tool hook.\n *\n * @param client - Temporal `WorkflowClient` for querying the parent workflow\n * @param agentName - Agent name (used to derive the state query name)\n * @param provider - {@link VirtualSandboxProvider} (wraps the resolver)\n * @param handler - Inner handler expecting a {@link VirtualSandboxContext}\n *\n * @example\n * ```typescript\n * import { withVirtualSandbox, type VirtualSandboxContext } from 'zeitlich';\n *\n * const readHandler: ActivityToolHandler<FileReadArgs, ReadResult, VirtualSandboxContext> =\n * async (args, { sandbox }) => {\n * const content = await sandbox.fs.readFile(args.path);\n * return { toolResponse: content, data: { path: args.path, content } };\n * };\n *\n * // At activity registration:\n * const provider = new VirtualSandboxProvider(resolver);\n * const handler = withVirtualSandbox(client, \"myAgent\", provider, readHandler);\n * ```\n */\nexport function withVirtualSandbox<\n TArgs,\n TResult,\n TCtx,\n TMeta = FileEntryMetadata,\n>(\n client: WorkflowClient,\n provider: VirtualSandboxProvider<TCtx, TMeta>,\n handler: ActivityToolHandler<\n TArgs,\n TResult,\n VirtualSandboxContext<TCtx, TMeta>\n >\n): ActivityToolHandler<\n TArgs,\n (TResult & { treeMutations: TreeMutation<TMeta>[] }) | null\n> {\n return async (args, context) => {\n const state =\n await queryParentWorkflowState<VirtualSandboxState<TCtx, TMeta>>(client);\n\n const { sandboxId, fileTree, resolverContext, workspaceBase } = state;\n if (!fileTree || !sandboxId) {\n return {\n toolResponse: `Error: No fileTree/sandboxId in agent state. The ${context.toolName} tool requires a virtual sandbox.`,\n data: null,\n };\n }\n\n const sandbox = createVirtualSandbox(\n sandboxId,\n fileTree,\n provider.resolver,\n resolverContext,\n workspaceBase ?? \"/\",\n );\n const response = await handler(args, { ...context, sandbox });\n const mutations = sandbox.fs.getMutations();\n\n return {\n toolResponse: response.toolResponse,\n data: {\n ...(response.data ?? {}),\n treeMutations: mutations,\n } as TResult & { treeMutations: TreeMutation<TMeta>[] },\n };\n };\n}\n","import type { FileEntry } from \"./types\";\n\n/**\n * Structural constraint: accepts any `AgentStateManager<T>` whose custom\n * state includes `fileTree: FileEntry<TMeta>[]`.\n */\nexport interface FileTreeAccessor<TMeta> {\n get(key: \"fileTree\"): FileEntry<TMeta>[];\n}\n\n/**\n * Check whether any file in the tree has a `metadata.mimeType` that matches\n * the given pattern.\n *\n * Patterns:\n * - Exact: `\"application/pdf\"`\n * - Wildcard type: `\"image/*\"`\n *\n * Useful for conditionally enabling tools:\n *\n * ```ts\n * { enabled: hasFileWithMimeType(stateManager, \"image/*\") }\n * { enabled: hasFileWithMimeType(stateManager, [\"image/*\", \"application/pdf\"]) }\n * ```\n */\nexport function hasFileWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string | string[],\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(buildMatcher);\n return tree.some((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && matchers.some((m) => m(mime));\n });\n}\n\n/**\n * Return all entries whose `metadata.mimeType` matches the given pattern.\n */\nexport function filesWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): FileEntry<TMeta>[] {\n const tree = stateManager.get(\"fileTree\");\n const match = buildMatcher(pattern);\n return tree.filter((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && match(mime);\n });\n}\n\n/**\n * Check whether the tree contains a directory whose name matches the given\n * pattern. Directories are inferred from file paths.\n *\n * Patterns:\n * - Exact: `\"src\"`\n * - Glob with `*` wildcard: `\"test*\"`, `\"*.generated\"`\n *\n * ```ts\n * { enabled: hasDirectory(stateManager, \"test*\") }\n * ```\n */\nexport function hasDirectory<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string,\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const match = buildGlobMatcher(pattern);\n return tree.some((entry) => {\n const segments = entry.path.split(\"/\").filter(Boolean);\n return segments.slice(0, -1).some(match);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal matchers\n// ---------------------------------------------------------------------------\n\nfunction buildMatcher(pattern: string): (value: string) => boolean {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return (v) => v.startsWith(prefix);\n }\n return (v) => v === pattern;\n}\n\nfunction buildGlobMatcher(pattern: string): (value: string) => boolean {\n if (!pattern.includes(\"*\")) return (v) => v === pattern;\n const re = new RegExp(\n \"^\" + pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\",\n );\n return (v) => re.test(v);\n}\n","import type {\n Sandbox,\n SandboxCapabilities,\n ExecOptions,\n ExecResult,\n} from \"../../../lib/sandbox/types\";\nimport { SandboxNotSupportedError } from \"../../../lib/sandbox/types\";\nimport { VirtualSandboxFileSystem } from \"./filesystem\";\nimport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n VirtualSandbox,\n} from \"./types\";\n\n// ============================================================================\n// VirtualSandbox\n// ============================================================================\n\nclass VirtualSandboxImpl<\n TCtx = unknown,\n TMeta = FileEntryMetadata,\n> implements Sandbox\n{\n readonly capabilities: SandboxCapabilities = {\n filesystem: true,\n execution: false,\n persistence: true,\n };\n\n readonly fs: VirtualSandboxFileSystem<TCtx, TMeta>;\n\n constructor(\n readonly id: string,\n tree: FileEntry<TMeta>[],\n resolver: FileResolver<TCtx, TMeta>,\n ctx: TCtx,\n workspaceBase = \"/\",\n ) {\n this.fs = new VirtualSandboxFileSystem(tree, resolver, ctx, workspaceBase);\n }\n\n async exec(_command: string, _options?: ExecOptions): Promise<ExecResult> {\n throw new SandboxNotSupportedError(\"exec\");\n }\n\n async destroy(): Promise<void> {\n // Ephemeral — nothing to clean up\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an ephemeral {@link Sandbox} from a file tree and resolver.\n *\n * Used internally by {@link withVirtualSandbox} and\n * {@link VirtualSandboxProvider}; consumers can also call this directly\n * if they need a sandbox outside the wrapper pattern.\n */\nexport function createVirtualSandbox<\n TCtx,\n TMeta = FileEntryMetadata,\n>(\n id: string,\n tree: FileEntry<TMeta>[],\n resolver: FileResolver<TCtx, TMeta>,\n ctx: TCtx,\n workspaceBase = \"/\",\n): VirtualSandbox<TCtx, TMeta> {\n return new VirtualSandboxImpl(id, tree, resolver, ctx, workspaceBase);\n}\n\n// Re-exports for convenience\nexport { VirtualSandboxFileSystem } from \"./filesystem\";\nexport { VirtualSandboxProvider } from \"./provider\";\nexport { withVirtualSandbox } from \"./with-virtual-sandbox\";\nexport { hasFileWithMimeType, filesWithMimeType, hasDirectory } from \"./queries\";\nexport type { FileTreeAccessor } from \"./queries\";\nexport type {\n FileEntry,\n FileEntryMetadata,\n FileResolver,\n VirtualFileTree,\n VirtualSandboxCreateOptions,\n VirtualSandboxState,\n VirtualSandboxContext,\n VirtualSandbox,\n TreeMutation,\n} from \"./types\";\n"]}
@@ -1,8 +1,8 @@
1
1
  import Redis from 'ioredis';
2
2
  import { Content, GoogleGenAI, Part } from '@google/genai';
3
- import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-Drli9aCK.cjs';
3
+ import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-DRvq2miV.cjs';
4
4
  import { B as BaseThreadManager } from '../../../types-35POpVfa.cjs';
5
- import { M as MessageContent, T as ToolMessageContent } from '../../../types-BMXzv7TN.cjs';
5
+ import { M as MessageContent, T as ToolMessageContent } from '../../../types-CmOSypVk.cjs';
6
6
  import '@temporalio/common';
7
7
  import 'zod';
8
8
  import '../../../types-BMRzfELQ.cjs';
@@ -1,8 +1,8 @@
1
1
  import Redis from 'ioredis';
2
2
  import { Content, GoogleGenAI, Part } from '@google/genai';
3
- import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-XPtivmSJ.js';
3
+ import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-CdB2D5Sq.js';
4
4
  import { B as BaseThreadManager } from '../../../types-35POpVfa.js';
5
- import { M as MessageContent, T as ToolMessageContent } from '../../../types-BMXzv7TN.js';
5
+ import { M as MessageContent, T as ToolMessageContent } from '../../../types-CmOSypVk.js';
6
6
  import '@temporalio/common';
7
7
  import 'zod';
8
8
  import '../../../types-BMRzfELQ.js';
@@ -270,11 +270,11 @@ function createLangChainAdapter(config) {
270
270
  }
271
271
  };
272
272
  const makeInvoker = (model) => createLangChainModelInvoker({ redis, model });
273
- const invoker = config.model ? makeInvoker(config.model) : (() => {
273
+ const invoker = config.model ? makeInvoker(config.model) : () => {
274
274
  throw new Error(
275
275
  "No default model provided to createLangChainAdapter. Either pass `model` in the config or use `createModelInvoker(model)` instead."
276
276
  );
277
- });
277
+ };
278
278
  return {
279
279
  threadOps,
280
280
  invoker,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/uuid/dist/esm/stringify.js","../../../../node_modules/uuid/dist/esm/rng.js","../../../../node_modules/uuid/dist/esm/native.js","../../../../node_modules/uuid/dist/esm/v4.js","../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/langchain/thread-manager.ts","../../../../src/adapters/thread/langchain/model-invoker.ts","../../../../src/adapters/thread/langchain/activities.ts"],"names":["randomFillSync","randomUUID","HumanMessage","SystemMessage","AIMessage","ToolMessage","invokeLangChainModel","messages","mapStoredMessagesToChatMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import type {\n ThreadManagerConfig,\n BaseThreadManager,\n} from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>,\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize),\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport {\n type $InferMessageContent,\n AIMessage,\n HumanMessage,\n type MessageContent,\n type MessageStructure,\n type StoredMessage,\n SystemMessage,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n createThreadManager,\n type BaseThreadManager,\n type ThreadManagerConfig,\n} from \"../../../lib/thread\";\n\nexport type LangChainToolMessageContent = $InferMessageContent<\n MessageStructure,\n \"tool\"\n>;\n\nexport interface LangChainThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n}\n\n/** Thread manager with LangChain StoredMessage convenience helpers */\nexport interface LangChainThreadManager extends BaseThreadManager<StoredMessage> {\n createHumanMessage(content: string | MessageContent): StoredMessage;\n createSystemMessage(content: string): StoredMessage;\n createAIMessage(\n content: string | MessageContent,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean },\n ): StoredMessage;\n createToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): StoredMessage;\n appendHumanMessage(content: string | MessageContent): Promise<void>;\n appendSystemMessage(content: string): Promise<void>;\n appendToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): Promise<void>;\n appendAIMessage(content: string | MessageContent): Promise<void>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.data.id ?? \"\";\n}\n\n/**\n * Creates a LangChain-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed LangChain messages.\n */\nexport function createLangChainThreadManager(\n config: LangChainThreadManagerConfig,\n): LangChainThreadManager {\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 = {\n createHumanMessage(content: string | MessageContent): StoredMessage {\n return new HumanMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createSystemMessage(content: string): StoredMessage {\n return new SystemMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createAIMessage(\n content: string,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean },\n ): StoredMessage {\n return new AIMessage({\n id: uuidv4(),\n content,\n additional_kwargs: kwargs\n ? {\n header: kwargs.header,\n options: kwargs.options,\n multiSelect: kwargs.multiSelect,\n }\n : undefined,\n }).toDict();\n },\n\n createToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): StoredMessage {\n return new ToolMessage({\n id: uuidv4(),\n content: content as MessageContent,\n tool_call_id: toolCallId,\n }).toDict();\n },\n\n async appendHumanMessage(content: string | MessageContent): Promise<void> {\n const message = helpers.createHumanMessage(content);\n await base.append([message]);\n },\n\n async appendToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): Promise<void> {\n const message = helpers.createToolMessage(content, toolCallId);\n await base.append([message]);\n },\n\n async appendAIMessage(content: string | MessageContent): Promise<void> {\n const message = helpers.createAIMessage(content as string);\n await base.append([message]);\n },\n\n async appendSystemMessage(content: string): Promise<void> {\n const message = helpers.createSystemMessage(content);\n await base.initialize();\n await base.append([message]);\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import type Redis from \"ioredis\";\nimport type { AgentResponse } from \"../../../lib/model\";\nimport type { ModelInvokerConfig } from \"../../../lib/model\";\nimport { mapStoredMessagesToChatMessages } from \"@langchain/core/messages\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { createLangChainThreadManager } from \"./thread-manager\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface LangChainModelInvokerConfig<TModel extends BaseChatModel<any> = BaseChatModel<any>> {\n redis: Redis;\n model: TModel;\n}\n\n/**\n * Creates a LangChain-based model invoker that satisfies the generic\n * `ModelInvoker<StoredMessage>` contract.\n *\n * Loads the conversation thread from Redis, invokes a LangChain chat model,\n * appends the AI response, and returns a normalised AgentResponse.\n *\n * @example\n * ```typescript\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n * import { createRunAgentActivity } from 'zeitlich';\n * import { ChatAnthropic } from '@langchain/anthropic';\n *\n * const model = new ChatAnthropic({ model: \"claude-sonnet-4-6\" });\n * const invoker = createLangChainModelInvoker({ redis, model });\n *\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createLangChainModelInvoker<TModel extends BaseChatModel<any> = BaseChatModel<any>>(\n { redis, model }: LangChainModelInvokerConfig<TModel>,\n) {\n return async function invokeLangChainModel(\n config: ModelInvokerConfig\n ): Promise<AgentResponse<StoredMessage>> {\n const { threadId, agentName, state, metadata } = config;\n\n const thread = createLangChainThreadManager({ redis, threadId });\n const runId = uuidv4();\n\n const messages = await thread.load();\n const response = await model.invoke(\n [...mapStoredMessagesToChatMessages(messages)],\n {\n runName: agentName,\n runId,\n metadata: { thread_id: `${agentName}-${threadId}`, ...metadata },\n tools: state.tools,\n }\n );\n\n await thread.append([response.toDict()]);\n\n const toolCalls = response.tool_calls ?? [];\n\n return {\n message: response.toDict(),\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n })),\n usage: {\n inputTokens: response.usage_metadata?.input_tokens,\n outputTokens: response.usage_metadata?.output_tokens,\n reasonTokens: response.usage_metadata?.output_token_details?.reasoning,\n cachedWriteTokens:\n response.usage_metadata?.input_token_details?.cache_creation,\n cachedReadTokens:\n response.usage_metadata?.input_token_details?.cache_read,\n },\n };\n };\n}\n\n/**\n * Standalone function for one-shot LangChain model invocation.\n * Convenience wrapper around createLangChainModelInvoker for cases where\n * you don't need to reuse the invoker.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function invokeLangChainModel<TModel extends BaseChatModel<any> = BaseChatModel<any>>({\n redis,\n model,\n config,\n}: {\n redis: Redis;\n config: ModelInvokerConfig;\n model: TModel;\n}): Promise<AgentResponse<StoredMessage>> {\n const invoker = createLangChainModelInvoker({ redis, model });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type { MessageContent } from \"@langchain/core/messages\";\nimport type { ThreadOps } from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { createLangChainThreadManager } from \"./thread-manager\";\nimport { createLangChainModelInvoker } from \"./model-invoker\";\n\nexport interface LangChainAdapterConfig {\n redis: Redis;\n /** Optional default model — if omitted, use `createModelInvoker()` to create invokers later */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n model?: BaseChatModel<any>;\n}\n\nexport interface LangChainAdapter {\n /** Thread operations (register these as Temporal activities on the worker) */\n threadOps: ThreadOps;\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<StoredMessage>;\n /** Create an invoker for a specific model (for multi-model setups) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createModelInvoker(model: BaseChatModel<any>): ModelInvoker<StoredMessage>;\n}\n\n/**\n * Creates a LangChain adapter that bundles thread operations and model\n * invocation using a consistent message format (StoredMessage).\n *\n * The returned `threadOps` should be registered as Temporal activities on\n * the worker. The `invoker` (or invokers created via `createModelInvoker`)\n * should be wrapped with `createRunAgentActivity` for per-agent activities.\n *\n * @example\n * ```typescript\n * import { createLangChainAdapter } from 'zeitlich/adapters/thread/langchain';\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * const adapter = createLangChainAdapter({ redis, model });\n *\n * export function createActivities(client: WorkflowClient) {\n * return {\n * ...adapter.threadOps,\n * runAgent: createRunAgentActivity(client, adapter.invoker),\n * };\n * }\n * ```\n *\n * @example Multi-model setup\n * ```typescript\n * const adapter = createLangChainAdapter({ redis });\n *\n * export function createActivities(client: WorkflowClient) {\n * return {\n * ...adapter.threadOps,\n * runResearchAgent: createRunAgentActivity(client, adapter.createModelInvoker(claude)),\n * runWriterAgent: createRunAgentActivity(client, adapter.createModelInvoker(gpt4)),\n * };\n * }\n * ```\n */\nexport function createLangChainAdapter(\n config: LangChainAdapterConfig\n): LangChainAdapter {\n const { redis } = config;\n\n const threadOps: ThreadOps = {\n async initializeThread(threadId: string): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendHumanMessage(content);\n },\n\n async appendSystemMessage(\n threadId: string,\n content: string\n ): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendSystemMessage(content);\n },\n\n async appendToolResult(cfg: ToolResultConfig): Promise<void> {\n const { threadId, toolCallId, content } = cfg;\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendToolMessage(content, toolCallId);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n ): Promise<void> {\n const thread = createLangChainThreadManager({\n redis,\n threadId: sourceThreadId,\n });\n await thread.fork(targetThreadId);\n },\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const makeInvoker = (model: BaseChatModel<any>): ModelInvoker<StoredMessage> =>\n createLangChainModelInvoker({ redis, model });\n\n const invoker: ModelInvoker<StoredMessage> = config.model\n ? makeInvoker(config.model)\n : ((() => {\n throw new Error(\n \"No default model provided to createLangChainAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\"\n );\n }) as unknown as ModelInvoker<StoredMessage>);\n\n return {\n threadOps,\n invoker,\n createModelInvoker: makeInvoker,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../../../node_modules/uuid/dist/esm/stringify.js","../../../../node_modules/uuid/dist/esm/rng.js","../../../../node_modules/uuid/dist/esm/native.js","../../../../node_modules/uuid/dist/esm/v4.js","../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/langchain/thread-manager.ts","../../../../src/adapters/thread/langchain/model-invoker.ts","../../../../src/adapters/thread/langchain/activities.ts"],"names":["randomFillSync","randomUUID","HumanMessage","SystemMessage","AIMessage","ToolMessage","invokeLangChainModel","messages","mapStoredMessagesToChatMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import type {\n ThreadManagerConfig,\n BaseThreadManager,\n} from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `thread:${threadId}:${key}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>,\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize),\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport {\n type $InferMessageContent,\n AIMessage,\n HumanMessage,\n type MessageContent,\n type MessageStructure,\n type StoredMessage,\n SystemMessage,\n ToolMessage,\n} from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n createThreadManager,\n type BaseThreadManager,\n type ThreadManagerConfig,\n} from \"../../../lib/thread\";\n\nexport type LangChainToolMessageContent = $InferMessageContent<\n MessageStructure,\n \"tool\"\n>;\n\nexport interface LangChainThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n}\n\n/** Thread manager with LangChain StoredMessage convenience helpers */\nexport interface LangChainThreadManager extends BaseThreadManager<StoredMessage> {\n createHumanMessage(content: string | MessageContent): StoredMessage;\n createSystemMessage(content: string): StoredMessage;\n createAIMessage(\n content: string | MessageContent,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean },\n ): StoredMessage;\n createToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): StoredMessage;\n appendHumanMessage(content: string | MessageContent): Promise<void>;\n appendSystemMessage(content: string): Promise<void>;\n appendToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): Promise<void>;\n appendAIMessage(content: string | MessageContent): Promise<void>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.data.id ?? \"\";\n}\n\n/**\n * Creates a LangChain-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed LangChain messages.\n */\nexport function createLangChainThreadManager(\n config: LangChainThreadManagerConfig,\n): LangChainThreadManager {\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 = {\n createHumanMessage(content: string | MessageContent): StoredMessage {\n return new HumanMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createSystemMessage(content: string): StoredMessage {\n return new SystemMessage({\n id: uuidv4(),\n content: content as string,\n }).toDict();\n },\n\n createAIMessage(\n content: string,\n kwargs?: { header?: string; options?: string[]; multiSelect?: boolean },\n ): StoredMessage {\n return new AIMessage({\n id: uuidv4(),\n content,\n additional_kwargs: kwargs\n ? {\n header: kwargs.header,\n options: kwargs.options,\n multiSelect: kwargs.multiSelect,\n }\n : undefined,\n }).toDict();\n },\n\n createToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): StoredMessage {\n return new ToolMessage({\n id: uuidv4(),\n content: content as MessageContent,\n tool_call_id: toolCallId,\n }).toDict();\n },\n\n async appendHumanMessage(content: string | MessageContent): Promise<void> {\n const message = helpers.createHumanMessage(content);\n await base.append([message]);\n },\n\n async appendToolMessage(\n content: LangChainToolMessageContent,\n toolCallId: string,\n ): Promise<void> {\n const message = helpers.createToolMessage(content, toolCallId);\n await base.append([message]);\n },\n\n async appendAIMessage(content: string | MessageContent): Promise<void> {\n const message = helpers.createAIMessage(content as string);\n await base.append([message]);\n },\n\n async appendSystemMessage(content: string): Promise<void> {\n const message = helpers.createSystemMessage(content);\n await base.initialize();\n await base.append([message]);\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import type Redis from \"ioredis\";\nimport type { AgentResponse } from \"../../../lib/model\";\nimport type { ModelInvokerConfig } from \"../../../lib/model\";\nimport { mapStoredMessagesToChatMessages } from \"@langchain/core/messages\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { createLangChainThreadManager } from \"./thread-manager\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface LangChainModelInvokerConfig<TModel extends BaseChatModel<any> = BaseChatModel<any>> {\n redis: Redis;\n model: TModel;\n}\n\n/**\n * Creates a LangChain-based model invoker that satisfies the generic\n * `ModelInvoker<StoredMessage>` contract.\n *\n * Loads the conversation thread from Redis, invokes a LangChain chat model,\n * appends the AI response, and returns a normalised AgentResponse.\n *\n * @example\n * ```typescript\n * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';\n * import { createRunAgentActivity } from 'zeitlich';\n * import { ChatAnthropic } from '@langchain/anthropic';\n *\n * const model = new ChatAnthropic({ model: \"claude-sonnet-4-6\" });\n * const invoker = createLangChainModelInvoker({ redis, model });\n *\n * return { runAgent: createRunAgentActivity(client, invoker) };\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createLangChainModelInvoker<TModel extends BaseChatModel<any> = BaseChatModel<any>>(\n { redis, model }: LangChainModelInvokerConfig<TModel>,\n) {\n return async function invokeLangChainModel(\n config: ModelInvokerConfig\n ): Promise<AgentResponse<StoredMessage>> {\n const { threadId, agentName, state, metadata } = config;\n\n const thread = createLangChainThreadManager({ redis, threadId });\n const runId = uuidv4();\n\n const messages = await thread.load();\n const response = await model.invoke(\n [...mapStoredMessagesToChatMessages(messages)],\n {\n runName: agentName,\n runId,\n metadata: { thread_id: `${agentName}-${threadId}`, ...metadata },\n tools: state.tools,\n }\n );\n\n await thread.append([response.toDict()]);\n\n const toolCalls = response.tool_calls ?? [];\n\n return {\n message: response.toDict(),\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n })),\n usage: {\n inputTokens: response.usage_metadata?.input_tokens,\n outputTokens: response.usage_metadata?.output_tokens,\n reasonTokens: response.usage_metadata?.output_token_details?.reasoning,\n cachedWriteTokens:\n response.usage_metadata?.input_token_details?.cache_creation,\n cachedReadTokens:\n response.usage_metadata?.input_token_details?.cache_read,\n },\n };\n };\n}\n\n/**\n * Standalone function for one-shot LangChain model invocation.\n * Convenience wrapper around createLangChainModelInvoker for cases where\n * you don't need to reuse the invoker.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function invokeLangChainModel<TModel extends BaseChatModel<any> = BaseChatModel<any>>({\n redis,\n model,\n config,\n}: {\n redis: Redis;\n config: ModelInvokerConfig;\n model: TModel;\n}): Promise<AgentResponse<StoredMessage>> {\n const invoker = createLangChainModelInvoker({ redis, model });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type { MessageContent } from \"@langchain/core/messages\";\nimport type { ThreadOps } from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport type { StoredMessage } from \"@langchain/core/messages\";\nimport type { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { createLangChainThreadManager } from \"./thread-manager\";\nimport { createLangChainModelInvoker } from \"./model-invoker\";\n\nexport interface LangChainAdapterConfig {\n redis: Redis;\n /** Optional default model — if omitted, use `createModelInvoker()` to create invokers later */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n model?: BaseChatModel<any>;\n}\n\nexport interface LangChainAdapter {\n /** Thread operations (register these as Temporal activities on the worker) */\n threadOps: ThreadOps;\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<StoredMessage>;\n /** Create an invoker for a specific model (for multi-model setups) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createModelInvoker(model: BaseChatModel<any>): ModelInvoker<StoredMessage>;\n}\n\n/**\n * Creates a LangChain adapter that bundles thread operations and model\n * invocation using a consistent message format (StoredMessage).\n *\n * The returned `threadOps` should be registered as Temporal activities on\n * the worker. The `invoker` (or invokers created via `createModelInvoker`)\n * should be wrapped with `createRunAgentActivity` for per-agent activities.\n *\n * @example\n * ```typescript\n * import { createLangChainAdapter } from 'zeitlich/adapters/thread/langchain';\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * const adapter = createLangChainAdapter({ redis, model });\n *\n * export function createActivities(client: WorkflowClient) {\n * return {\n * ...adapter.threadOps,\n * runAgent: createRunAgentActivity(client, adapter.invoker),\n * };\n * }\n * ```\n *\n * @example Multi-model setup\n * ```typescript\n * const adapter = createLangChainAdapter({ redis });\n *\n * export function createActivities(client: WorkflowClient) {\n * return {\n * ...adapter.threadOps,\n * runResearchAgent: createRunAgentActivity(client, adapter.createModelInvoker(claude)),\n * runWriterAgent: createRunAgentActivity(client, adapter.createModelInvoker(gpt4)),\n * };\n * }\n * ```\n */\nexport function createLangChainAdapter(\n config: LangChainAdapterConfig\n): LangChainAdapter {\n const { redis } = config;\n\n const threadOps: ThreadOps = {\n async initializeThread(threadId: string): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n content: string | MessageContent\n ): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendHumanMessage(content);\n },\n\n async appendSystemMessage(\n threadId: string,\n content: string\n ): Promise<void> {\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendSystemMessage(content);\n },\n\n async appendToolResult(cfg: ToolResultConfig): Promise<void> {\n const { threadId, toolCallId, content } = cfg;\n const thread = createLangChainThreadManager({ redis, threadId });\n await thread.appendToolMessage(content, toolCallId);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string\n ): Promise<void> {\n const thread = createLangChainThreadManager({\n redis,\n threadId: sourceThreadId,\n });\n await thread.fork(targetThreadId);\n },\n };\n\n const makeInvoker = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n model: BaseChatModel<any>\n ): ModelInvoker<StoredMessage> =>\n createLangChainModelInvoker({ redis, model });\n\n const invoker: ModelInvoker<StoredMessage> = config.model\n ? makeInvoker(config.model)\n : () => {\n throw new Error(\n \"No default model provided to createLangChainAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\"\n );\n };\n\n return {\n threadOps,\n invoker,\n createModelInvoker: makeInvoker,\n };\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  import Redis from 'ioredis';
2
- import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-Drli9aCK.cjs';
2
+ import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-DRvq2miV.cjs';
3
3
  import { StoredMessage, MessageContent, $InferMessageContent, MessageStructure } from '@langchain/core/messages';
4
4
  import { BaseChatModel } from '@langchain/core/language_models/chat_models';
5
5
  import { B as BaseThreadManager } from '../../../types-35POpVfa.cjs';
6
6
  import '@temporalio/common';
7
- import '../../../types-BMXzv7TN.cjs';
7
+ import '../../../types-CmOSypVk.cjs';
8
8
  import 'zod';
9
9
  import '../../../types-BMRzfELQ.cjs';
10
10
  import '@temporalio/workflow';
@@ -1,10 +1,10 @@
1
1
  import Redis from 'ioredis';
2
- import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-XPtivmSJ.js';
2
+ import { T as ThreadOps, M as ModelInvoker, a as ModelInvokerConfig, A as AgentResponse } from '../../../types-CdB2D5Sq.js';
3
3
  import { StoredMessage, MessageContent, $InferMessageContent, MessageStructure } from '@langchain/core/messages';
4
4
  import { BaseChatModel } from '@langchain/core/language_models/chat_models';
5
5
  import { B as BaseThreadManager } from '../../../types-35POpVfa.js';
6
6
  import '@temporalio/common';
7
- import '../../../types-BMXzv7TN.js';
7
+ import '../../../types-CmOSypVk.js';
8
8
  import 'zod';
9
9
  import '../../../types-BMRzfELQ.js';
10
10
  import '@temporalio/workflow';
@@ -268,11 +268,11 @@ function createLangChainAdapter(config) {
268
268
  }
269
269
  };
270
270
  const makeInvoker = (model) => createLangChainModelInvoker({ redis, model });
271
- const invoker = config.model ? makeInvoker(config.model) : (() => {
271
+ const invoker = config.model ? makeInvoker(config.model) : () => {
272
272
  throw new Error(
273
273
  "No default model provided to createLangChainAdapter. Either pass `model` in the config or use `createModelInvoker(model)` instead."
274
274
  );
275
- });
275
+ };
276
276
  return {
277
277
  threadOps,
278
278
  invoker,