@theokit/sdk 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1571 -0
- package/LICENSE +201 -0
- package/README.md +80 -0
- package/bin/theokit-migrate-config.mjs +269 -0
- package/bin/theokit-migrate-memory.mjs +116 -0
- package/dist/agent-builder.d.ts +52 -0
- package/dist/agent-factory.d.ts +39 -0
- package/dist/agent.d.ts +175 -0
- package/dist/batch.d.ts +11 -0
- package/dist/budget.d.ts +48 -0
- package/dist/cache.d.ts +74 -0
- package/dist/cron-1yxL3K2S.d.cts +221 -0
- package/dist/cron-BYVdYzob.d.ts +221 -0
- package/dist/cron.cjs +14655 -0
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.d.cts +3 -0
- package/dist/cron.d.ts +71 -0
- package/dist/cron.js +14652 -0
- package/dist/cron.js.map +1 -0
- package/dist/define-tool.d.ts +35 -0
- package/dist/errors-CK8brCJ1.d.cts +448 -0
- package/dist/errors-CvAeEWgE.d.ts +448 -0
- package/dist/errors.cjs +255 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +3 -0
- package/dist/errors.d.ts +356 -0
- package/dist/errors.js +238 -0
- package/dist/errors.js.map +1 -0
- package/dist/eval.cjs +14826 -0
- package/dist/eval.cjs.map +1 -0
- package/dist/eval.d.cts +35 -0
- package/dist/eval.d.ts +35 -0
- package/dist/eval.js +14821 -0
- package/dist/eval.js.map +1 -0
- package/dist/generate-object.d.ts +67 -0
- package/dist/handoff.d.ts +55 -0
- package/dist/index.cjs +17127 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1878 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +17095 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/agent-loop/loop-types.d.ts +29 -0
- package/dist/internal/agent-loop/loop.d.ts +2 -0
- package/dist/internal/agent-loop/message-builders.d.ts +6 -0
- package/dist/internal/agent-loop/tool-dispatch.d.ts +4 -0
- package/dist/internal/agent-loop/usage-and-cost.d.ts +25 -0
- package/dist/internal/budget/calendar-window.d.ts +19 -0
- package/dist/internal/budget/compute-cost.d.ts +28 -0
- package/dist/internal/budget/enforcement.d.ts +32 -0
- package/dist/internal/budget/ledger.d.ts +25 -0
- package/dist/internal/budget/normalize-usage.d.ts +27 -0
- package/dist/internal/budget/pricing-registry.d.ts +36 -0
- package/dist/internal/budget/registry.d.ts +16 -0
- package/dist/internal/budget/usage-accumulator.d.ts +31 -0
- package/dist/internal/cache/cosine.d.ts +14 -0
- package/dist/internal/cache/embed-helper.d.ts +15 -0
- package/dist/internal/cache/key.d.ts +15 -0
- package/dist/internal/cache/lookup.d.ts +28 -0
- package/dist/internal/cache/store-handler.d.ts +24 -0
- package/dist/internal/cache/store-json.d.ts +48 -0
- package/dist/internal/cache/store.d.ts +54 -0
- package/dist/internal/cache/telemetry.d.ts +20 -0
- package/dist/internal/cache/ttl.d.ts +11 -0
- package/dist/internal/catalog/fixtures.d.ts +16 -0
- package/dist/internal/catalog/local-models.d.ts +24 -0
- package/dist/internal/cron/run-job.d.ts +1 -0
- package/dist/internal/cron/scheduler.d.ts +1 -0
- package/dist/internal/cron/store.d.ts +1 -0
- package/dist/internal/cron/validate.d.ts +1 -0
- package/dist/internal/env.d.ts +1 -0
- package/dist/internal/errors/mappers/anthropic.d.ts +30 -0
- package/dist/internal/errors/mappers/bedrock.d.ts +16 -0
- package/dist/internal/errors/mappers/ollama.d.ts +41 -0
- package/dist/internal/errors/mappers/openai-compatible.d.ts +25 -0
- package/dist/internal/errors/mappers/shared.d.ts +10 -0
- package/dist/internal/errors/mappers/vertex.d.ts +15 -0
- package/dist/internal/eval/aggregate.d.ts +9 -0
- package/dist/internal/eval/dataset-iter.d.ts +9 -0
- package/dist/internal/eval/runner.d.ts +9 -0
- package/dist/internal/eval/single-flight.d.ts +16 -0
- package/dist/internal/eval/telemetry.d.ts +23 -0
- package/dist/internal/fixture-mode.d.ts +16 -0
- package/dist/internal/handoff/dispatcher.d.ts +29 -0
- package/dist/internal/handoff/registry.d.ts +23 -0
- package/dist/internal/handoff/telemetry.d.ts +18 -0
- package/dist/internal/handoff/tool-injector.d.ts +34 -0
- package/dist/internal/http.d.ts +1 -0
- package/dist/internal/ids.d.ts +1 -0
- package/dist/internal/judge/judge-call.d.ts +35 -0
- package/dist/internal/judge/parse-verdict.d.ts +11 -0
- package/dist/internal/judge/types.d.ts +17 -0
- package/dist/internal/llm/anthropic-shared.d.ts +89 -0
- package/dist/internal/llm/anthropic.d.ts +9 -0
- package/dist/internal/llm/bedrock-anthropic.d.ts +36 -0
- package/dist/internal/llm/bedrock-token-cache.d.ts +18 -0
- package/dist/internal/llm/credential-pool-context.d.ts +11 -0
- package/dist/internal/llm/credential-pool-types.d.ts +22 -0
- package/dist/internal/llm/credential-pool.d.ts +18 -0
- package/dist/internal/llm/fallback-client.d.ts +1 -0
- package/dist/internal/llm/fault-injection.d.ts +50 -0
- package/dist/internal/llm/finish.d.ts +1 -0
- package/dist/internal/llm/model-identifier.d.ts +24 -0
- package/dist/internal/llm/ollama-native.d.ts +27 -0
- package/dist/internal/llm/openai.d.ts +9 -0
- package/dist/internal/llm/pool-aware-client.d.ts +16 -0
- package/dist/internal/llm/router.d.ts +17 -0
- package/dist/internal/llm/sse.d.ts +9 -0
- package/dist/internal/llm/stream-relay.d.ts +17 -0
- package/dist/internal/llm/types.d.ts +70 -0
- package/dist/internal/llm/vertex-anthropic.d.ts +40 -0
- package/dist/internal/llm/vertex-auth.d.ts +30 -0
- package/dist/internal/llm/vertex-gemini.d.ts +28 -0
- package/dist/internal/llm/vertex-router.d.ts +21 -0
- package/dist/internal/mcp/client.d.ts +16 -0
- package/dist/internal/memory/active-memory-cache.d.ts +10 -0
- package/dist/internal/memory/active-memory.d.ts +45 -0
- package/dist/internal/memory/adapters/catalog.d.ts +1 -0
- package/dist/internal/memory/adapters/deepinfra-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/mistral-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/ollama-embedding.d.ts +34 -0
- package/dist/internal/memory/adapters/openai-compatible.d.ts +23 -0
- package/dist/internal/memory/adapters/openai-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/openrouter-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/voyage-embedding.d.ts +2 -0
- package/dist/internal/memory/atomic-write.d.ts +7 -0
- package/dist/internal/memory/chunk-markdown.d.ts +2 -0
- package/dist/internal/memory/circuit-breaker.d.ts +22 -0
- package/dist/internal/memory/cwd-mutex.d.ts +1 -0
- package/dist/internal/memory/dreaming/diary.d.ts +4 -0
- package/dist/internal/memory/dreaming/phases.d.ts +15 -0
- package/dist/internal/memory/dreaming/run.d.ts +10 -0
- package/dist/internal/memory/embedding-adapter.d.ts +42 -0
- package/dist/internal/memory/embedding-cache.d.ts +1 -0
- package/dist/internal/memory/index-db.d.ts +10 -0
- package/dist/internal/memory/index-manager-dispatch.d.ts +23 -0
- package/dist/internal/memory/index-manager.d.ts +68 -0
- package/dist/internal/memory/index-schema.d.ts +21 -0
- package/dist/internal/memory/lance-index.d.ts +32 -0
- package/dist/internal/memory/lance-memory-adapter.d.ts +43 -0
- package/dist/internal/memory/markdown-store.d.ts +16 -0
- package/dist/internal/memory/memory-index.d.ts +52 -0
- package/dist/internal/memory/migrate-sqlite-to-lance.d.ts +15 -0
- package/dist/internal/memory/migration.d.ts +9 -0
- package/dist/internal/memory/reader.d.ts +8 -0
- package/dist/internal/memory/session-loader.d.ts +1 -0
- package/dist/internal/memory/session-summary-writer.d.ts +2 -0
- package/dist/internal/memory/sqlite-vec-loader.d.ts +3 -0
- package/dist/internal/memory/tools.d.ts +14 -0
- package/dist/internal/memory/transcript-store.d.ts +1 -0
- package/dist/internal/memory/types.d.ts +17 -0
- package/dist/internal/memory/vec-index.d.ts +28 -0
- package/dist/internal/memory/wiki-loader.d.ts +2 -0
- package/dist/internal/observability/tracer-loader.d.ts +20 -0
- package/dist/internal/persistence/atomic-write.d.ts +1 -0
- package/dist/internal/persistence/conversation-storage-fs.d.ts +37 -0
- package/dist/internal/persistence/conversation-storage-memory.d.ts +24 -0
- package/dist/internal/persistence/cwd-mutex.d.ts +1 -0
- package/dist/internal/persistence/file-lock.d.ts +14 -0
- package/dist/internal/persistence/fts5-sanitize.d.ts +16 -0
- package/dist/internal/persistence/markdown-config-loader.d.ts +35 -0
- package/dist/internal/persistence/paths.d.ts +19 -0
- package/dist/internal/persistence/persistence-schema.d.ts +17 -0
- package/dist/internal/persistence/schema-version.d.ts +13 -0
- package/dist/internal/persistence/sqlite-wal.d.ts +10 -0
- package/dist/internal/personality/context.d.ts +17 -0
- package/dist/internal/personality/registry.d.ts +17 -0
- package/dist/internal/personality/store.d.ts +27 -0
- package/dist/internal/personality/switch.d.ts +36 -0
- package/dist/internal/personality/types.d.ts +18 -0
- package/dist/internal/plugins/context.d.ts +31 -0
- package/dist/internal/plugins/manager.d.ts +37 -0
- package/dist/internal/plugins/types.d.ts +102 -0
- package/dist/internal/providers/builtin/anthropic.d.ts +2 -0
- package/dist/internal/providers/builtin/bedrock.d.ts +25 -0
- package/dist/internal/providers/builtin/gemini.d.ts +10 -0
- package/dist/internal/providers/builtin/index.d.ts +19 -0
- package/dist/internal/providers/builtin/llamacpp.d.ts +1 -0
- package/dist/internal/providers/builtin/lmstudio.d.ts +1 -0
- package/dist/internal/providers/builtin/ollama.d.ts +17 -0
- package/dist/internal/providers/builtin/openai.d.ts +2 -0
- package/dist/internal/providers/builtin/openrouter.d.ts +2 -0
- package/dist/internal/providers/builtin/vertex.d.ts +27 -0
- package/dist/internal/providers/discovery.d.ts +14 -0
- package/dist/internal/providers/index.d.ts +8 -0
- package/dist/internal/providers/registry.d.ts +12 -0
- package/dist/internal/providers/types.d.ts +27 -0
- package/dist/internal/runtime/abort-utils.d.ts +21 -0
- package/dist/internal/runtime/agent-factory-registry.d.ts +16 -0
- package/dist/internal/runtime/agent-registry-store.d.ts +61 -0
- package/dist/internal/runtime/agent-registry.d.ts +34 -0
- package/dist/internal/runtime/agent-session-store.d.ts +3 -0
- package/dist/internal/runtime/agent-session.d.ts +2 -0
- package/dist/internal/runtime/async-local-storage.d.ts +20 -0
- package/dist/internal/runtime/async-semaphore.d.ts +24 -0
- package/dist/internal/runtime/budget.d.ts +36 -0
- package/dist/internal/runtime/cloud-agent.d.ts +1 -0
- package/dist/internal/runtime/cloud-config-serializer.d.ts +3 -0
- package/dist/internal/runtime/cloud-payload-types.d.ts +56 -0
- package/dist/internal/runtime/cloud-run.d.ts +1 -0
- package/dist/internal/runtime/cloud-tool-parity.d.ts +1 -0
- package/dist/internal/runtime/context-aggregator.d.ts +26 -0
- package/dist/internal/runtime/context-discovery-runner.d.ts +27 -0
- package/dist/internal/runtime/context-discovery.d.ts +21 -0
- package/dist/internal/runtime/context-frontmatter.d.ts +16 -0
- package/dist/internal/runtime/context-import-resolver.d.ts +24 -0
- package/dist/internal/runtime/context-loaders.d.ts +42 -0
- package/dist/internal/runtime/context-manager.d.ts +11 -0
- package/dist/internal/runtime/context-mdc-parser.d.ts +24 -0
- package/dist/internal/runtime/default-model.d.ts +1 -0
- package/dist/internal/runtime/fixture-events.d.ts +12 -0
- package/dist/internal/runtime/fixture-responder.d.ts +1 -0
- package/dist/internal/runtime/fixture-run-base.d.ts +45 -0
- package/dist/internal/runtime/fixture-scripts.d.ts +21 -0
- package/dist/internal/runtime/fixture-types.d.ts +1 -0
- package/dist/internal/runtime/fork-agent.d.ts +15 -0
- package/dist/internal/runtime/hooks-executor.d.ts +35 -0
- package/dist/internal/runtime/hooks-frontmatter.d.ts +26 -0
- package/dist/internal/runtime/hooks-source.d.ts +22 -0
- package/dist/internal/runtime/live-agent-registry.d.ts +87 -0
- package/dist/internal/runtime/local-agent-bootstrap.d.ts +37 -0
- package/dist/internal/runtime/local-agent-dispatch.d.ts +57 -0
- package/dist/internal/runtime/local-agent-invalidate.d.ts +8 -0
- package/dist/internal/runtime/local-agent-memory-direct.d.ts +12 -0
- package/dist/internal/runtime/local-agent-memory-hooks.d.ts +41 -0
- package/dist/internal/runtime/local-agent-memory.d.ts +1 -0
- package/dist/internal/runtime/local-agent-personality-extensions.d.ts +19 -0
- package/dist/internal/runtime/local-agent-plugins.d.ts +13 -0
- package/dist/internal/runtime/local-agent-runtime-extensions.d.ts +13 -0
- package/dist/internal/runtime/local-agent-task-wrap.d.ts +11 -0
- package/dist/internal/runtime/local-agent.d.ts +1 -0
- package/dist/internal/runtime/local-run.d.ts +1 -0
- package/dist/internal/runtime/memory-store.d.ts +4 -0
- package/dist/internal/runtime/plugin-frontmatter.d.ts +17 -0
- package/dist/internal/runtime/plugins-manager.d.ts +1 -0
- package/dist/internal/runtime/post-run-lifecycle.d.ts +1 -0
- package/dist/internal/runtime/providers-manager.d.ts +1 -0
- package/dist/internal/runtime/real-cloud-run.d.ts +2 -0
- package/dist/internal/runtime/real-local-run.d.ts +2 -0
- package/dist/internal/runtime/run-registry.d.ts +5 -0
- package/dist/internal/runtime/run-until.d.ts +22 -0
- package/dist/internal/runtime/shell-tool.d.ts +7 -0
- package/dist/internal/runtime/skill-frontmatter.d.ts +1 -0
- package/dist/internal/runtime/skills-manager.d.ts +1 -0
- package/dist/internal/runtime/spawn-collect.d.ts +8 -0
- package/dist/internal/runtime/subagents-loader.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/escape.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/local-assembly.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/pipeline.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/providers/active-memory-provider.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/providers/base-provider.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/providers/context-provider.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/providers/memory-provider.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/providers/skills-provider.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/safe-call.d.ts +1 -0
- package/dist/internal/runtime/system-prompt/types.d.ts +5 -0
- package/dist/internal/runtime/system-prompt.d.ts +1 -0
- package/dist/internal/runtime/validate-agent-options.d.ts +1 -0
- package/dist/internal/runtime/workspace-dir.d.ts +9 -0
- package/dist/internal/runtime/yaml-frontmatter.d.ts +20 -0
- package/dist/internal/scorers/llm-judge.d.ts +24 -0
- package/dist/internal/security/index.d.ts +11 -0
- package/dist/internal/security/path-guard.d.ts +56 -0
- package/dist/internal/security/redact.d.ts +21 -0
- package/dist/internal/structured-output-helpers.d.ts +54 -0
- package/dist/internal/task/registry.d.ts +61 -0
- package/dist/internal/task/ring-buffer.d.ts +10 -0
- package/dist/internal/task/store.d.ts +59 -0
- package/dist/internal/task/subscribe.d.ts +15 -0
- package/dist/internal/task/telemetry.d.ts +27 -0
- package/dist/internal/telemetry/adapter-registry.d.ts +2 -0
- package/dist/internal/telemetry/adapters/langfuse.d.ts +2 -0
- package/dist/internal/telemetry/adapters/posthog.d.ts +2 -0
- package/dist/internal/telemetry/adapters/sentry.d.ts +2 -0
- package/dist/internal/telemetry/safe-require.d.ts +1 -0
- package/dist/internal/telemetry/tracer.d.ts +18 -0
- package/dist/internal/tool-dispatch/repair-middleware.d.ts +34 -0
- package/dist/internal/tool-dispatch/strip-think.d.ts +22 -0
- package/dist/internal/tool-registry/personality-filter.d.ts +37 -0
- package/dist/internal/workflow/ctx.d.ts +19 -0
- package/dist/internal/workflow/error-shape.d.ts +7 -0
- package/dist/internal/workflow/executor.d.ts +15 -0
- package/dist/internal/workflow/index.d.ts +12 -0
- package/dist/internal/workflow/retry-policy.d.ts +14 -0
- package/dist/internal/workflow/run-id.d.ts +9 -0
- package/dist/internal/workflow/single-flight.d.ts +18 -0
- package/dist/internal/workflow/snapshot-store.d.ts +23 -0
- package/dist/internal/workflow/step-agent.d.ts +12 -0
- package/dist/internal/workflow/step-branch.d.ts +10 -0
- package/dist/internal/workflow/step-dowhile.d.ts +8 -0
- package/dist/internal/workflow/step-fn.d.ts +10 -0
- package/dist/internal/workflow/step-foreach.d.ts +11 -0
- package/dist/internal/workflow/step-parallel.d.ts +17 -0
- package/dist/internal/workflow/step-sleep.d.ts +7 -0
- package/dist/internal/workflow/telemetry.d.ts +23 -0
- package/dist/internal/zod/to-json-schema.d.ts +21 -0
- package/dist/memory-adapter-helpers.d.ts +28 -0
- package/dist/memory.d.ts +123 -0
- package/dist/migrate.d.ts +33 -0
- package/dist/path-safety.cjs +126 -0
- package/dist/path-safety.cjs.map +1 -0
- package/dist/path-safety.d.cts +15 -0
- package/dist/path-safety.d.ts +15 -0
- package/dist/path-safety.js +120 -0
- package/dist/path-safety.js.map +1 -0
- package/dist/run-DkCD5DeO.d.cts +2181 -0
- package/dist/run-DkCD5DeO.d.ts +2181 -0
- package/dist/scorers.d.ts +75 -0
- package/dist/security.d.ts +67 -0
- package/dist/stream-object.d.ts +74 -0
- package/dist/task-store.cjs +237 -0
- package/dist/task-store.cjs.map +1 -0
- package/dist/task-store.d.cts +8 -0
- package/dist/task-store.d.ts +8 -0
- package/dist/task-store.js +233 -0
- package/dist/task-store.js.map +1 -0
- package/dist/task.d.ts +87 -0
- package/dist/theokit.d.ts +84 -0
- package/dist/tools/_path-scope.d.cts +8 -0
- package/dist/tools/_path-scope.d.ts +8 -0
- package/dist/tools/_subprocess.d.cts +28 -0
- package/dist/tools/_subprocess.d.ts +28 -0
- package/dist/tools/git-diff.d.cts +22 -0
- package/dist/tools/git-diff.d.ts +22 -0
- package/dist/tools/index.d.cts +29 -0
- package/dist/tools/index.d.ts +29 -0
- package/dist/tools/list-dir.d.cts +26 -0
- package/dist/tools/list-dir.d.ts +26 -0
- package/dist/tools/read-file.d.cts +31 -0
- package/dist/tools/read-file.d.ts +31 -0
- package/dist/tools/run-vitest.d.cts +46 -0
- package/dist/tools/run-vitest.d.ts +46 -0
- package/dist/tools/search-text.d.cts +32 -0
- package/dist/tools/search-text.d.ts +32 -0
- package/dist/tools.cjs +690 -0
- package/dist/tools.cjs.map +1 -0
- package/dist/tools.js +683 -0
- package/dist/tools.js.map +1 -0
- package/dist/trajectory-helpers.d.ts +31 -0
- package/dist/types/agent.d.ts +771 -0
- package/dist/types/batch.d.ts +112 -0
- package/dist/types/budget.d.ts +88 -0
- package/dist/types/cache.d.ts +76 -0
- package/dist/types/context.d.ts +93 -0
- package/dist/types/conversation-storage.d.ts +76 -0
- package/dist/types/conversation.d.ts +90 -0
- package/dist/types/cron.d.ts +150 -0
- package/dist/types/eval.d.ts +132 -0
- package/dist/types/goal-events.d.ts +95 -0
- package/dist/types/handoff.d.ts +135 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/mcp.d.ts +64 -0
- package/dist/types/memory-adapter.d.ts +175 -0
- package/dist/types/messages.d.ts +154 -0
- package/dist/types/providers.d.ts +102 -0
- package/dist/types/run.d.ts +215 -0
- package/dist/types/task.d.ts +131 -0
- package/dist/types/theokit.d.ts +61 -0
- package/dist/types/trajectory.d.ts +49 -0
- package/dist/types/updates.d.ts +148 -0
- package/dist/types/usage.d.ts +61 -0
- package/dist/types/workflow.d.ts +217 -0
- package/dist/workflow.cjs +2405 -0
- package/dist/workflow.cjs.map +1 -0
- package/dist/workflow.d.cts +97 -0
- package/dist/workflow.d.ts +97 -0
- package/dist/workflow.js +2398 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +183 -0
package/dist/cron.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/internal/runtime/agent-factory-registry.ts","../src/internal/persistence/cwd-mutex.ts","../src/internal/persistence/atomic-write.ts","../src/internal/memory/cwd-mutex.ts","../src/internal/runtime/yaml-frontmatter.ts","../src/internal/persistence/markdown-config-loader.ts","../src/internal/runtime/hooks-frontmatter.ts","../src/internal/runtime/hooks-source.ts","../src/internal/runtime/async-local-storage.ts","../src/internal/llm/credential-pool-types.ts","../src/internal/llm/credential-pool.ts","../src/internal/llm/credential-pool-context.ts","../src/internal/personality/context.ts","../src/internal/runtime/local-agent-plugins.ts","../src/internal/runtime/run-until.ts","../src/internal/judge/parse-verdict.ts","../src/internal/judge/judge-call.ts","../src/internal/runtime/fork-agent.ts","../src/types/task.ts","../src/internal/runtime/async-semaphore.ts","../src/internal/task/ring-buffer.ts","../src/internal/task/store.ts","../src/internal/task/subscribe.ts","../src/internal/observability/tracer-loader.ts","../src/internal/task/telemetry.ts","../src/internal/task/registry.ts","../src/internal/zod/to-json-schema.ts","../src/internal/structured-output-helpers.ts","../src/generate-object.ts","../src/stream-object.ts","../src/batch.ts","../src/types/handoff.ts","../src/internal/handoff/registry.ts","../src/internal/handoff/telemetry.ts","../src/internal/handoff/dispatcher.ts","../src/internal/handoff/tool-injector.ts","../src/cron.ts","../src/agent-builder.ts","../src/agent.ts","../src/internal/env.ts","../src/internal/fixture-mode.ts","../src/internal/http.ts","../src/internal/ids.ts","../src/internal/runtime/agent-registry-store.ts","../src/internal/persistence/schema-version.ts","../src/internal/runtime/agent-registry.ts","../src/internal/runtime/cloud-agent.ts","../src/internal/runtime/cloud-config-serializer.ts","../src/internal/security/path-guard.ts","../src/internal/security/redact.ts","../src/internal/runtime/fixture-events.ts","../src/internal/memory/atomic-write.ts","../src/internal/memory/markdown-store.ts","../src/internal/memory/types.ts","../src/internal/memory/migration.ts","../src/internal/runtime/memory-store.ts","../src/internal/runtime/fixture-scripts.ts","../src/internal/runtime/fixture-responder.ts","../src/internal/runtime/fixture-run-base.ts","../src/internal/runtime/cloud-run.ts","../src/internal/runtime/default-model.ts","../src/internal/runtime/real-cloud-run.ts","../src/internal/llm/sse.ts","../src/internal/runtime/system-prompt.ts","../src/internal/runtime/cloud-tool-parity.ts","../src/internal/runtime/live-agent-registry.ts","../src/internal/runtime/local-agent.ts","../src/internal/personality/store.ts","../src/internal/persistence/file-lock.ts","../src/internal/persistence/paths.ts","../src/internal/plugins/context.ts","../src/internal/plugins/manager.ts","../src/internal/runtime/abort-utils.ts","../src/internal/runtime/agent-session-store.ts","../src/internal/persistence/conversation-storage-fs.ts","../src/internal/runtime/agent-session.ts","../src/internal/runtime/hooks-executor.ts","../src/internal/runtime/spawn-collect.ts","../src/internal/runtime/context-manager.ts","../src/internal/runtime/context-loaders.ts","../src/internal/runtime/context-aggregator.ts","../src/internal/runtime/context-discovery.ts","../src/internal/runtime/context-import-resolver.ts","../src/internal/runtime/context-mdc-parser.ts","../src/internal/runtime/context-discovery-runner.ts","../src/internal/runtime/context-frontmatter.ts","../src/internal/runtime/plugins-manager.ts","../src/internal/runtime/plugin-frontmatter.ts","../src/internal/runtime/workspace-dir.ts","../src/internal/runtime/providers-manager.ts","../src/internal/runtime/skills-manager.ts","../src/internal/runtime/skill-frontmatter.ts","../src/internal/runtime/local-agent-bootstrap.ts","../src/internal/runtime/run-registry.ts","../src/internal/runtime/local-run.ts","../src/internal/budget/usage-accumulator.ts","../src/internal/runtime/budget.ts","../src/internal/runtime/system-prompt/safe-call.ts","../src/internal/tool-dispatch/strip-think.ts","../src/internal/agent-loop/message-builders.ts","../src/internal/agent-loop/tool-dispatch.ts","../src/internal/runtime/shell-tool.ts","../src/internal/tool-dispatch/repair-middleware.ts","../src/internal/budget/pricing-data.json","../src/internal/budget/pricing-registry.ts","../src/internal/budget/compute-cost.ts","../src/internal/llm/model-identifier.ts","../src/internal/agent-loop/usage-and-cost.ts","../src/internal/agent-loop/loop.ts","../src/internal/llm/fallback-client.ts","../src/internal/llm/stream-relay.ts","../src/internal/llm/router.ts","../src/internal/providers/registry.ts","../src/internal/providers/builtin/anthropic.ts","../src/internal/providers/builtin/bedrock.ts","../src/internal/providers/builtin/gemini.ts","../src/internal/providers/builtin/llamacpp.ts","../src/internal/providers/builtin/lmstudio.ts","../src/internal/providers/builtin/ollama.ts","../src/internal/providers/builtin/openai.ts","../src/internal/providers/builtin/openrouter.ts","../src/internal/providers/builtin/vertex.ts","../src/internal/providers/builtin/index.ts","../src/internal/errors/mappers/anthropic.ts","../src/internal/errors/mappers/shared.ts","../src/internal/llm/finish.ts","../src/internal/llm/anthropic-shared.ts","../src/internal/llm/anthropic.ts","../src/internal/llm/bedrock-anthropic.ts","../src/internal/errors/mappers/bedrock.ts","../src/internal/llm/bedrock-token-cache.ts","../src/internal/errors/mappers/openai-compatible.ts","../src/internal/llm/fault-injection.ts","../src/internal/errors/mappers/ollama.ts","../src/internal/llm/ollama-native.ts","../src/internal/llm/openai.ts","../src/internal/llm/pool-aware-client.ts","../src/internal/llm/vertex-anthropic.ts","../src/internal/errors/mappers/vertex.ts","../src/internal/llm/vertex-auth.ts","../src/internal/llm/vertex-gemini.ts","../src/internal/llm/vertex-router.ts","../src/internal/mcp/client.ts","../src/internal/telemetry/safe-require.ts","../src/internal/telemetry/adapters/langfuse.ts","../src/internal/telemetry/adapters/posthog.ts","../src/internal/telemetry/adapters/sentry.ts","../src/internal/telemetry/adapter-registry.ts","../src/internal/telemetry/tracer.ts","../src/internal/tool-registry/personality-filter.ts","../src/internal/runtime/real-local-run.ts","../src/internal/runtime/local-agent-dispatch.ts","../src/internal/runtime/local-agent-invalidate.ts","../src/internal/memory/transcript-store.ts","../src/internal/memory/active-memory.ts","../src/internal/memory/active-memory-cache.ts","../src/internal/memory/adapters/openai-compatible.ts","../src/internal/memory/embedding-cache.ts","../src/internal/memory/adapters/deepinfra-embedding.ts","../src/internal/memory/adapters/mistral-embedding.ts","../src/internal/memory/adapters/ollama-embedding.ts","../src/internal/memory/adapters/openai-embedding.ts","../src/internal/memory/adapters/openrouter-embedding.ts","../src/internal/memory/adapters/voyage-embedding.ts","../src/internal/memory/adapters/catalog.ts","../src/internal/memory/circuit-breaker.ts","../src/internal/persistence/fts5-sanitize.ts","../src/internal/memory/chunk-markdown.ts","../src/internal/memory/index-db.ts","../src/internal/persistence/sqlite-wal.ts","../src/internal/memory/index-schema.ts","../src/internal/memory/index-manager-dispatch.ts","../src/internal/memory/lance-index.ts","../src/internal/memory/memory-index.ts","../src/internal/memory/lance-memory-adapter.ts","../src/internal/memory/session-summary-writer.ts","../src/internal/memory/session-loader.ts","../src/internal/memory/sqlite-vec-loader.ts","../src/internal/memory/vec-index.ts","../src/internal/memory/wiki-loader.ts","../src/internal/memory/index-manager.ts","../src/internal/memory/tools.ts","../src/internal/memory/reader.ts","../src/internal/runtime/local-agent-memory.ts","../src/internal/runtime/local-agent-memory-direct.ts","../src/internal/runtime/local-agent-memory-hooks.ts","../src/internal/runtime/local-agent-personality-extensions.ts","../src/internal/personality/registry.ts","../src/internal/personality/types.ts","../src/internal/personality/switch.ts","../src/internal/runtime/local-agent-runtime-extensions.ts","../src/internal/runtime/local-agent-task-wrap.ts","../src/internal/runtime/post-run-lifecycle.ts","../src/internal/runtime/subagents-loader.ts","../src/internal/runtime/system-prompt/local-assembly.ts","../src/internal/runtime/system-prompt/pipeline.ts","../src/internal/runtime/system-prompt/escape.ts","../src/internal/runtime/system-prompt/providers/active-memory-provider.ts","../src/internal/runtime/system-prompt/providers/base-provider.ts","../src/internal/runtime/system-prompt/providers/context-provider.ts","../src/internal/runtime/system-prompt/providers/memory-provider.ts","../src/internal/runtime/system-prompt/providers/skills-provider.ts","../src/internal/runtime/validate-agent-options.ts","../src/internal/cron/run-job.ts","../src/internal/cron/store.ts","../src/internal/cron/scheduler.ts","../src/internal/cron/validate.ts"],"names":["data","init_cwd_mutex","readFile","readdir","join","existsSync","picked","AsyncLocalStorage","resolve","state","mkdirSync","unlink","cached","createRequire","randomUUID","z","extractUsage","init_registry","safe","TRACER_NAME","init_telemetry","agents","serializeCloud","serializeAgents","serializeProviders","serializeMemory","stat","dirname","resolvePath","mkdir","sep","UnsupportedTaskOperationError","entry","SCHEMA_VERSION","realpathSync","homedir","isAbsolute","parseSimpleYaml","logFallback","registered","body","formatMessage","extractModelName","joinTextParts","buildClient","abortError","parseBody","inner","apiKey","resolveApiKey","spawn","registeredHere","createHash","DIMENSION_BY_MODEL","DEFAULT_COOLDOWN_MS","rename","get","relativeToRoot","relative","runUntilImpl","judgeCallImpl","getAgentCreate","forkAgentImpl","withPersonalityContext","splitFrontmatter","generateObjectImpl","streamObjectImpl","batchImpl","normalizeHandoffs","buildHandoffTool","Croner"],"mappings":"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","file":"cron.js","sourcesContent":["import type { RunOperation } from \"./types/run.js\";\n\n/**\n * Finite, machine-readable error codes for provider-originated errors\n * (ADR D66). Consumers can `switch (err.metadata?.code)` exhaustively\n * — adding a new variant is an explicit decision + test coverage.\n *\n * @public\n */\nexport type ErrorCode =\n | \"rate_limit\"\n | \"auth_failed\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"context_too_long\"\n | \"content_filtered\"\n | \"model_unavailable\"\n | \"network\"\n | \"unknown\";\n\n/**\n * Codes used by {@link AgentRunError} (Production-Readiness #3, ADR D311).\n *\n * Superset of {@link ErrorCode} extended with codes that do NOT originate\n * from a provider HTTP response:\n *\n * - `quota_exceeded` — billing limit hit (provider 402 or signalled error)\n * - `tool_runtime_error` — custom tool handler threw inside dispatch\n * - `aborted` — caller's `AbortSignal` fired (Phase 4)\n * - `invalid_model` — model id rejected by provider (400 \"model not found\")\n * - `safety_blocked` — provider safety filter blocked req or resp\n * - `provider_unreachable` — DNS/TCP/timeout/5xx at transport boundary\n *\n * The `& {}` tail keeps the literal-union ergonomics (autocomplete) while\n * accepting any string for forward compatibility with constructor calls\n * that pass arbitrary code values (legacy callers).\n *\n * @public\n */\nexport type AgentRunErrorCode =\n | ErrorCode\n | \"quota_exceeded\"\n | \"tool_runtime_error\"\n | \"aborted\"\n | \"invalid_model\"\n | \"safety_blocked\"\n | \"provider_unreachable\"\n | (string & {});\n\n/**\n * Structured context for errors that originated from a provider HTTP\n * call (ADR D65). Lets callers retry with the right backoff (`retryAfter`),\n * surface actionable diagnostics (`provider`, `endpoint`), and inspect the\n * raw response body when needed (`raw`, capped at ~2KB by the mapper).\n *\n * @public\n */\nexport interface ErrorMetadata {\n /** Provider canonical name (e.g., `\"anthropic\"`, `\"openai\"`, `\"openrouter\"`, `\"gemini\"`). */\n provider: string;\n /** HTTP endpoint that failed (e.g., `\"/v1/messages\"`, `\"/v1/chat/completions\"`). */\n endpoint: string;\n /** Machine-readable error code (finite enum). */\n code: ErrorCode;\n /** HTTP status code if applicable. */\n statusCode?: number;\n /** Seconds to wait before retry, per provider's `retry-after` header (numeric form only). */\n retryAfter?: number;\n /** Raw response body for debugging (truncated to ~2KB by the mapper). */\n raw?: unknown;\n}\n\n/**\n * Base class for all errors thrown by `@theokit/sdk`.\n *\n * Use `isRetryable` to drive retry/backoff logic. `code` and `protoErrorCode`\n * are populated for server-originated errors when available. `metadata`\n * (ADR D65) carries structured `{ provider, endpoint, code, ... }` when\n * the error originated from a provider HTTP call.\n *\n * @public\n */\nexport class TheokitAgentError extends Error {\n override readonly name: string = \"TheokitAgentError\";\n readonly isRetryable: boolean;\n readonly code?: string;\n readonly protoErrorCode?: string;\n readonly metadata?: ErrorMetadata;\n\n constructor(\n message: string,\n options: {\n isRetryable?: boolean;\n code?: string;\n protoErrorCode?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n } = {},\n ) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.isRetryable = options.isRetryable ?? false;\n if (options.code !== undefined) this.code = options.code;\n if (options.protoErrorCode !== undefined) this.protoErrorCode = options.protoErrorCode;\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n}\n\n/**\n * Invalid API key, not logged in, insufficient permissions.\n *\n * @public\n */\nexport class AuthenticationError extends TheokitAgentError {\n override readonly name: string = \"AuthenticationError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Too many requests or usage limits exceeded.\n *\n * @public\n */\nexport class RateLimitError extends TheokitAgentError {\n override readonly name: string = \"RateLimitError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: true });\n }\n}\n\n/**\n * Invalid model, bad request parameters, malformed options.\n *\n * @public\n */\nexport class ConfigurationError extends TheokitAgentError {\n override readonly name: string = \"ConfigurationError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Thrown when creating a cloud agent for a repo whose SCM provider is not\n * connected. Use `helpUrl` to point the user at the right reconnect flow.\n *\n * @public\n */\nexport class IntegrationNotConnectedError extends ConfigurationError {\n override readonly name: string = \"IntegrationNotConnectedError\";\n readonly provider: string;\n readonly helpUrl: string;\n\n constructor(\n message: string,\n options: {\n provider: string;\n helpUrl: string;\n code?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, options);\n this.provider = options.provider;\n this.helpUrl = options.helpUrl;\n }\n}\n\n/**\n * Service unavailable, timeout, transport-level failure.\n *\n * @public\n */\nexport class NetworkError extends TheokitAgentError {\n override readonly name: string = \"NetworkError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: true });\n }\n}\n\n/**\n * Catch-all for unclassified server or runtime errors.\n *\n * @public\n */\nexport class UnknownAgentError extends TheokitAgentError {\n override readonly name: string = \"UnknownAgentError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Thrown by `Agent.prompt` (and helpers that go through `run.wait()`) when\n * the option `{ throwOnError: true }` is set and the run terminates with\n * `status: 'error'`. Carries the structured `RunResult.error` fields so\n * callers can `catch` once and branch on `code` / `provider` instead of\n * unwrapping the run.\n *\n * Extends {@link TheokitAgentError} per ADR D65 — no new hierarchy.\n *\n * @example\n * try {\n * await Agent.prompt(msg, { apiKey, model, throwOnError: true });\n * } catch (err) {\n * if (err instanceof AgentRunError && err.code === 'auth_failed') {\n * // bad key\n * }\n * }\n *\n * @public\n */\nexport class AgentRunError extends TheokitAgentError {\n override readonly name: string = \"AgentRunError\";\n readonly provider?: string;\n readonly raw?: string;\n /** Provider's request id (`x-request-id` / `request-id` header). Useful for support tickets. */\n readonly requestId?: string;\n /** SDK conversation id this error was raised inside. */\n readonly conversationId?: string;\n\n constructor(\n message: string,\n options: {\n code: AgentRunErrorCode;\n provider?: string;\n raw?: string;\n requestId?: string;\n conversationId?: string;\n retriable?: boolean;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n code: options.code,\n cause: options.cause,\n metadata: options.metadata,\n // D311: most AgentRunErrors are not retriable (auth, validation, abort).\n // Provider mappers (D314) override per-status — explicit `retriable` wins\n // over the implicit default when supplied.\n isRetryable: options.retriable ?? defaultRetriableForCode(options.code),\n });\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.raw !== undefined) this.raw = options.raw;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.conversationId !== undefined) this.conversationId = options.conversationId;\n }\n\n /**\n * Production-Readiness #3 (ADR D311): alias for `isRetryable` exposed as\n * `retriable` to match the handoff contract. Future v2 will deprecate\n * `isRetryable` in favor of this.\n */\n get retriable(): boolean {\n return this.isRetryable;\n }\n\n /**\n * D312: provider's `Retry-After` header in **milliseconds**. Mappers store\n * the header value (seconds) in `metadata.retryAfter`; this getter\n * multiplies by 1000 so the result composes with `Date.now()`/`setTimeout`.\n *\n * Returns `undefined` when no hint was provided. `0` is a legitimate value\n * — use `=== undefined` check rather than truthy check.\n */\n get retryAfterMs(): number | undefined {\n if (this.metadata?.retryAfter === undefined) return undefined;\n return this.metadata.retryAfter * 1000;\n }\n\n /**\n * D313: alias for `metadata.raw`. Provider response body for debugging.\n * Available but NEVER serialized into `.message` (anti-leak invariant).\n */\n get providerError(): unknown {\n return this.metadata?.raw;\n }\n}\n\n/**\n * D311 helper: choose a sensible default `isRetryable` value when the\n * caller did not supply `retriable` explicitly. Conservative defaults —\n * provider mappers override per-status when they know better.\n *\n * @internal\n */\nfunction defaultRetriableForCode(code: AgentRunErrorCode): boolean {\n switch (code) {\n case \"rate_limit\":\n case \"timeout\":\n case \"server_error\":\n case \"network\":\n case \"provider_unreachable\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Thrown when a {@link Run} or agent operation is not available on the current\n * runtime. Check first with `run.supports(operation)`.\n *\n * Extends {@link TheokitAgentError} (so error-catching code that branches on\n * `instanceof TheokitAgentError` continues to work) but is never retryable —\n * an unsupported operation will not become supported on retry.\n *\n * @public\n */\nexport class UnsupportedRunOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedRunOperationError\";\n readonly operation: RunOperation;\n\n constructor(\n message: string,\n operation: RunOperation,\n options: { code?: string; cause?: unknown } = {},\n ) {\n super(message, {\n ...options,\n isRetryable: false,\n code: options.code ?? \"unsupported_run_operation\",\n });\n this.operation = operation;\n }\n}\n\n/**\n * Thrown when every credential in a per-provider pool is in cooldown\n * and no healthy key is available (ADR D133). The caller's\n * {@link import(\"./internal/llm/fallback-client.js\").FallbackLlmClient}\n * catches this and tries the next provider in the fallback chain.\n *\n * `metadata.nextRetryAt` (epoch ms) tells callers when the soonest\n * pool entry resumes — useful for manual retry scheduling.\n *\n * @public\n */\nexport class CredentialPoolExhaustedError extends TheokitAgentError {\n override readonly name: string = \"CredentialPoolExhaustedError\";\n readonly provider: string;\n readonly nextRetryAt: number | undefined;\n\n constructor(\n message: string,\n options: {\n provider: string;\n nextRetryAt?: number;\n code?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n ...options,\n isRetryable: true,\n code: options.code ?? \"credential_pool_exhausted\",\n });\n this.provider = options.provider;\n this.nextRetryAt = options.nextRetryAt;\n }\n}\n\n/**\n * Finite error codes specific to memory adapter operations (ADR D141).\n *\n * @public\n */\nexport type MemoryAdapterErrorCode =\n | \"auth_failed\"\n | \"rate_limited\"\n | \"not_found\"\n | \"network\"\n | \"invalid_input\"\n | \"unknown\";\n\n/**\n * Error raised by `@theokit-memory-*` adapters. Carries `adapterId`\n * so callers can branch on which provider failed (ADR D141).\n *\n * @public\n */\nexport class MemoryAdapterError extends TheokitAgentError {\n override readonly name: string = \"MemoryAdapterError\";\n readonly adapterId: string;\n\n constructor(\n message: string,\n options: {\n adapterId: string;\n code: MemoryAdapterErrorCode;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n isRetryable: options.code === \"rate_limited\" || options.code === \"network\",\n code: options.code,\n ...(options.cause !== undefined ? { cause: options.cause } : {}),\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n });\n this.adapterId = options.adapterId;\n }\n}\n\n/**\n * Thrown when a user-supplied task ID violates the grammar\n * `^[a-z0-9][a-z0-9_-]*$` (D368) OR starts with a reserved adapter\n * prefix (`wf-` / `b-` / `cron-`, EC-5).\n *\n * @public\n */\nexport class InvalidTaskIdError extends TheokitAgentError {\n override readonly name: string = \"InvalidTaskIdError\";\n readonly taskId: string;\n\n constructor(message: string, taskId: string, options: { cause?: unknown } = {}) {\n super(message, {\n ...options,\n isRetryable: false,\n code: \"invalid_task_id\",\n });\n this.taskId = taskId;\n }\n}\n\n/**\n * Thrown when `Task.subscribe(id)` is called for a task that has been\n * evicted, never submitted, or evicted after retention (D373).\n *\n * @public\n */\nexport class TaskNotFoundError extends TheokitAgentError {\n override readonly name: string = \"TaskNotFoundError\";\n readonly taskId: string;\n\n constructor(taskId: string, options: { cause?: unknown } = {}) {\n super(`Task not found: ${taskId}`, {\n ...options,\n isRetryable: false,\n code: \"task_not_found\",\n });\n this.taskId = taskId;\n }\n}\n\n/**\n * Thrown when `CloudAgent` is asked to wrap a task (D370). Cloud\n * task observability is deferred until Theo PaaS GA.\n *\n * @public\n */\nexport class UnsupportedTaskOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedTaskOperationError\";\n readonly operation: string;\n\n constructor(operation: string, options: { cause?: unknown } = {}) {\n super(\n `Task operation \"${operation}\" is not supported on CloudAgent (pre-release; see ADR D370)`,\n {\n ...options,\n isRetryable: false,\n code: \"task_op_unsupported\",\n },\n );\n this.operation = operation;\n }\n}\n\n/**\n * Thrown by `Budget` enforcement (ADR D386) when a `mode: \"block\"`\n * budget would be exceeded by the upcoming LLM call. Caller pega\n * tipado para retry-after-window-reset or surface to the user.\n *\n * @public\n */\nexport class BudgetExceededError extends TheokitAgentError {\n override readonly name: string = \"BudgetExceededError\";\n readonly budgetName: string;\n readonly window: import(\"./types/budget.js\").BudgetWindow;\n readonly spentUsd: number;\n readonly limitUsd: number;\n readonly mode: import(\"./types/budget.js\").BudgetMode;\n\n constructor(args: {\n budgetName: string;\n window: import(\"./types/budget.js\").BudgetWindow;\n spentUsd: number;\n limitUsd: number;\n mode: import(\"./types/budget.js\").BudgetMode;\n cause?: unknown;\n }) {\n super(\n `Budget \"${args.budgetName}\" exceeded for window ${args.window}: spent $${args.spentUsd.toFixed(4)} > limit $${args.limitUsd.toFixed(4)}`,\n {\n ...(args.cause !== undefined ? { cause: args.cause } : {}),\n isRetryable: false,\n code: \"budget_exceeded\",\n },\n );\n this.budgetName = args.budgetName;\n this.window = args.window;\n this.spentUsd = args.spentUsd;\n this.limitUsd = args.limitUsd;\n this.mode = args.mode;\n }\n}\n\n/**\n * Thrown when `CloudAgent.send({ budget })` is invoked (D388). Cloud\n * budget surface waits for Theo PaaS GA.\n *\n * @public\n */\nexport class UnsupportedBudgetOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedBudgetOperationError\";\n readonly operation: string;\n\n constructor(operation: string, options: { cause?: unknown } = {}) {\n super(\n `Budget operation \"${operation}\" is not supported on CloudAgent (pre-release; see ADR D388)`,\n {\n ...options,\n isRetryable: false,\n code: \"budget_op_unsupported\",\n },\n );\n this.operation = operation;\n }\n}\n","/**\n * Tiny DI registry for `Agent.create` (T4.2 + T4.3 wiring).\n *\n * `LocalAgent.runUntil` and `LocalAgent.fork` need to spawn auxiliary\n * agents via `Agent.create`. A direct import would form a cycle\n * (`agent.ts` already imports `LocalAgent`). This module is the seam:\n * `agent.ts` registers the factory at module init time; LocalAgent\n * reads it on-demand.\n *\n * Throws if accessed before registration — should never happen because\n * `agent.ts` evaluation always precedes `LocalAgent.runUntil()` calls\n * (the user must call `Agent.create()` to obtain the LocalAgent first).\n *\n * @internal\n */\n\nimport type { AgentOptions, SDKAgent } from \"../../types/agent.js\";\n\nexport type AgentCreateFn = (options: AgentOptions) => Promise<SDKAgent>;\n\nlet registered: AgentCreateFn | undefined;\n\n/**\n * Registered by `agent.ts` at module-init time. Idempotent: re-registration\n * replaces the previous reference (useful for tests that swap implementations).\n *\n * @internal\n */\nexport function setAgentCreate(fn: AgentCreateFn): void {\n registered = fn;\n}\n\n/**\n * Resolve the registered `Agent.create` for fork/judge auxiliaries.\n *\n * @internal\n */\nexport function getAgentCreate(): AgentCreateFn {\n if (registered === undefined) {\n throw new Error(\n \"internal: Agent.create not registered. The `agent.ts` module must be loaded before LocalAgent.runUntil/fork are invoked.\",\n );\n }\n return registered;\n}\n","/**\n * Per-key serialization. Returns a promise that resolves after the previous\n * `withCwdMutex(key, fn)` call for the same key has completed. Prevents\n * read-modify-write races on `MEMORY.md` within a single process.\n *\n * Multi-process safety is NOT covered (would need OS file locks — see\n * `withFileLock` in `./file-lock.ts`).\n *\n * @internal\n */\nconst tails = new Map<string, Promise<unknown>>();\n\nexport function withCwdMutex<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const prev = tails.get(key) ?? Promise.resolve();\n const next = prev.then(fn, fn); // run fn whether prev fulfilled or rejected\n // Save the new tail. Store the .then() chain that swallows the result so a\n // failure here doesn't poison subsequent waiters.\n tails.set(\n key,\n next.then(\n () => undefined,\n () => undefined,\n ),\n );\n return next;\n}\n","import { mkdir, open, rename, unlink } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\n/**\n * Atomic file replacement: write content to a per-call unique tmp path,\n * fsync, then rename over the target. Crash mid-write leaves either the old\n * file intact or the new file complete — never a half-written file.\n *\n * The tmp suffix is `<pid>.<rand>.tmp` so parallel processes (and concurrent\n * burst writes within one process) never collide on the same tmp path — a\n * race that would manifest as `ENOENT` on `rename` after the rival process\n * already moved its tmp into place.\n *\n * Mirrors OpenClaw's `replaceFileAtomic` from\n * `referencia/openclaw/packages/memory-host-sdk/src/host/fs-utils.ts` with\n * the multi-writer robustness fix.\n *\n * @internal\n */\nexport async function replaceFileAtomic(filePath: string, content: string): Promise<void> {\n const tmp = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2, 10)}.tmp`;\n const handle = await open(tmp, \"w\");\n try {\n await handle.writeFile(content, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n try {\n await rename(tmp, filePath);\n } catch (cause) {\n // Cleanup tmp on rename failure so we don't leak stale .tmp files.\n await unlink(tmp).catch(() => undefined);\n throw cause;\n }\n}\n\n/**\n * Options for `atomicWriteJson`.\n *\n * @internal\n */\nexport interface AtomicWriteJsonOptions {\n /** Indent passed to `JSON.stringify`. Default: 2. */\n indent?: number;\n /** Whether to append a trailing newline (POSIX convention). Default: true. */\n trailingNewline?: boolean;\n}\n\n/**\n * Typed JSON atomic write helper.\n *\n * Serializes `data` to JSON, then delegates to `replaceFileAtomic`. The\n * parent directory is auto-created (recursive `mkdir`) to make this helper\n * safe for callers who haven't ensured the directory exists (EC-4 in the\n * persistence-state-hardening plan).\n *\n * Throws `TypeError` on circular refs or `undefined` data (propagates from\n * `JSON.stringify`).\n *\n * @internal\n */\nexport async function atomicWriteJson<T>(\n filePath: string,\n data: T,\n options?: AtomicWriteJsonOptions,\n): Promise<void> {\n const indent = options?.indent ?? 2;\n const trailingNewline = options?.trailingNewline ?? true;\n const json = JSON.stringify(data, null, indent);\n if (json === undefined) {\n throw new TypeError(\"atomicWriteJson: cannot serialize undefined\");\n }\n const content = trailingNewline ? `${json}\\n` : json;\n await mkdir(dirname(filePath), { recursive: true });\n await replaceFileAtomic(filePath, content);\n}\n\n/**\n * Atomic text write. Same crash-safety guarantees as `replaceFileAtomic` +\n * auto-mkdir of the parent directory. Used by `theokit-migrate-config`\n * (T4.1, EC-2 MUST FIX) so a crash mid-migration leaves previous MD files\n * intact rather than corrupting them.\n *\n * @internal\n */\nexport async function atomicWriteText(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await replaceFileAtomic(filePath, content);\n}\n","/**\n * @deprecated Import from `../persistence/cwd-mutex.js` instead.\n * Maintained as re-export for backward compatibility (ADR D59).\n *\n * @internal\n */\nexport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\n","/**\n * Tiny YAML-frontmatter parser shared by the file-based loaders (skills,\n * subagents, hooks, context, plugins). Supports four scalar shapes:\n *\n * key: bar → \"bar\" (string)\n * key: 42 → 42 (number)\n * key: true → true (boolean)\n * key: [a, b, c] → [\"a\",\"b\",\"c\"](string[])\n * key: → undefined (caller's Zod default kicks in)\n *\n * Limitations (intentional — keep parser tiny, no dep):\n * - No nested objects (use flat keys like `providerId` not `provider.id`).\n * - No quoted strings — `match: \"1\"` becomes the literal 3-char string `\"1\"`.\n * - List values cannot contain a literal comma inside an element; the\n * `tags: [a,b, c]` splitter is greedy on `,`. Use multi-line lists or\n * reword if you need this.\n *\n * @internal\n */\n\nexport type FrontmatterValue = string | number | boolean | string[];\n\nexport function parseSimpleYaml(text: string): Record<string, FrontmatterValue | undefined> {\n const fields: Record<string, FrontmatterValue | undefined> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex === -1) continue;\n const key = line.slice(0, colonIndex).trim();\n if (key.length === 0) continue;\n const raw = line.slice(colonIndex + 1).trim();\n fields[key] = coerce(raw);\n }\n return fields;\n}\n\nfunction coerce(raw: string): FrontmatterValue | undefined {\n // EC-3: empty value → undefined so Zod `.optional().default(...)` applies.\n if (raw.length === 0) return undefined;\n if (raw.startsWith(\"[\") && raw.endsWith(\"]\")) {\n return raw\n .slice(1, -1)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n if (raw === \"true\" || raw === \"false\") return raw === \"true\";\n const n = Number(raw);\n if (Number.isFinite(n) && raw === String(n)) return n;\n return raw;\n}\n","/**\n * Shared loader for `.theokit/<dir>/<name>.md` (or `.theokit/<dir>/<name>/PLUGIN.md`)\n * config files. Mirrors the SKILL.md pattern: YAML frontmatter delimited by\n * `---` blocks + optional markdown body for prose / rationale.\n *\n * Consumed by hooks-loader (T1.2), context-manager (T2.2), and\n * plugins-manager (T3.2) — DRY across all 3 user-edited config surfaces.\n *\n * ADRs: D74 (markdown format), D75 (1 file = 1 entity), D76 (Zod schema).\n *\n * @internal\n */\n\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { z } from \"zod\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { parseSimpleYaml } from \"../runtime/yaml-frontmatter.js\";\n\nexport interface MarkdownEntity<T> {\n /** Slug from filename (without `.md`) for flat pattern, or subdir name for nested. */\n slug: string;\n /** Validated frontmatter. */\n frontmatter: T;\n /** Markdown body (everything after the closing `---`). May be empty. */\n body: string;\n /** Absolute source path for audit / error context. */\n source: string;\n}\n\nexport interface LoadOptions<T> {\n /** Absolute path to the directory containing `*.md` files (flat) or\n * subdirs with `PLUGIN.md` (nested). */\n dir: string;\n /** Zod schema validating the frontmatter shape. */\n schema: z.ZodType<T>;\n /** `\"flat\"` = top-level `<slug>.md` files; `\"nested\"` = subdirs each with\n * `PLUGIN.md`. Default: `\"flat\"`. */\n pattern?: \"flat\" | \"nested\";\n /** Error code prefix (e.g., `\"hook\"` → `\"hook_frontmatter_invalid\"`). */\n errorCodePrefix: string;\n}\n\n/**\n * Load all markdown config entities from a directory, validating each\n * file's frontmatter against the provided Zod schema.\n *\n * Edge cases handled:\n * - **ENOENT on dir** → returns `[]` graciously.\n * - **EACCES on dir** → throws `<prefix>_dir_read_error` (EC-11 distinct).\n * - **Missing frontmatter `---` block** → throws `<prefix>_missing_frontmatter`.\n * - **Frontmatter delimited by `+++`** (Hugo/TOML) → throws `<prefix>_missing_frontmatter`.\n * - **Truncated frontmatter (no closing `---`)** → throws `<prefix>_missing_frontmatter`.\n * - **Body containing `---` horizontal rule** → NOT confused with frontmatter\n * end; only the first `---...---` block at file head is the frontmatter.\n * - **Zod schema validation failure** → throws `<prefix>_frontmatter_invalid`\n * with Zod error path embedded in the message.\n *\n * Note on cross-platform: filenames are case-sensitive in Linux, case-insensitive\n * in macOS/Windows. Use lowercase slug convention to avoid collisions.\n * No file size cap enforced — `.theokit/` is trusted source.\n *\n * @internal\n */\nexport async function loadMarkdownEntities<T>(opts: LoadOptions<T>): Promise<MarkdownEntity<T>[]> {\n const { dir, schema, pattern = \"flat\", errorCodePrefix } = opts;\n const entries = await readDirSafe(dir, errorCodePrefix);\n if (entries === null) return [];\n\n const out: MarkdownEntity<T>[] = [];\n for (const entry of entries) {\n const resolved = resolveEntryPath(entry, pattern, dir);\n if (resolved === null) continue;\n const raw = await readFile(resolved.source, \"utf8\").catch(() => null);\n if (raw === null) continue;\n const split = splitFrontmatter(raw, resolved.source, errorCodePrefix);\n const fields = parseSimpleYaml(split.frontmatter);\n const parsed = schema.safeParse(fields);\n if (!parsed.success) {\n throw new ConfigurationError(\n `Invalid frontmatter in ${resolved.source}: ${parsed.error.message}`,\n { code: `${errorCodePrefix}_frontmatter_invalid` },\n );\n }\n out.push({\n slug: resolved.slug,\n frontmatter: parsed.data,\n body: split.body.trim(),\n source: resolved.source,\n });\n }\n return out;\n}\n\nasync function readDirSafe(\n dir: string,\n errorCodePrefix: string,\n): Promise<import(\"node:fs\").Dirent[] | null> {\n try {\n return (await readdir(dir, { withFileTypes: true })) as import(\"node:fs\").Dirent[];\n } catch (cause) {\n const code = (cause as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return null;\n throw new ConfigurationError(`Failed to read ${dir}`, {\n code: `${errorCodePrefix}_dir_read_error`,\n cause,\n });\n }\n}\n\nfunction resolveEntryPath(\n entry: { name: string; isFile(): boolean; isDirectory(): boolean },\n pattern: \"flat\" | \"nested\",\n dir: string,\n): { slug: string; source: string } | null {\n if (pattern === \"flat\") {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) return null;\n return { slug: entry.name.slice(0, -3), source: join(dir, entry.name) };\n }\n if (!entry.isDirectory()) return null;\n return { slug: entry.name, source: join(dir, entry.name, \"PLUGIN.md\") };\n}\n\n/**\n * Split a markdown file into frontmatter (between two `---` lines at the top)\n * and body. Rejects `+++` (Hugo/TOML), truncated frontmatter, and missing\n * frontmatter with typed `ConfigurationError`.\n *\n * @internal\n */\nfunction splitFrontmatter(\n raw: string,\n source: string,\n errorCodePrefix: string,\n): { frontmatter: string; body: string } {\n // Strict: file MUST start with `---\\n`, then frontmatter content, then `---\\n`.\n // The body is whatever follows the closing `---`. Other `---` lines in body\n // (horizontal rules) are NOT confused with the frontmatter delim because\n // the regex anchors `^---\\s*\\n` at the start of the file.\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*(?:\\n|$)/.exec(raw);\n if (match === null) {\n throw new ConfigurationError(\n `Missing or malformed frontmatter in ${source} (expected \\`---\\` delimited block at file head)`,\n { code: `${errorCodePrefix}_missing_frontmatter` },\n );\n }\n return {\n frontmatter: match[1] ?? \"\",\n body: raw.slice(match[0].length),\n };\n}\n","/**\n * Hook frontmatter schema (ADR D76 — mirrors D10 SkillFrontmatter pattern).\n *\n * Used by the markdown hooks loader (`hooks/<name>.md`). Each .md file\n * represents one hook entry with structured frontmatter + optional prose\n * body explaining rationale.\n *\n * @internal\n */\n\nimport { z } from \"zod\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\n/** Hook events supported by the SDK runtime. Mirrors HookEvent in hooks-executor.ts. */\nexport const HOOK_EVENTS = [\"preRun\", \"postRun\", \"preToolUse\", \"postToolUse\", \"stop\"] as const;\n\nexport const HookFrontmatterSchema = z.object({\n /** Lifecycle event the hook subscribes to. */\n event: z.enum(HOOK_EVENTS),\n /** Regex source compiled at exec time; restricts the hook to matching\n * tool names (preToolUse/postToolUse) or other names (other events). */\n matcher: z.string().min(1),\n /** Shell command to spawn; receives the hook payload on stdin. */\n command: z.string().min(1),\n /** Disabled hooks are skipped at exec time (rename `.md.disabled` also works). */\n enabled: z.boolean().optional().default(true),\n /** Lower = runs first when multiple hooks match the same event/matcher. */\n priority: z.number().int().optional().default(0),\n /** Optional command timeout in ms; defaults to 30s downstream. */\n timeoutMs: z.number().int().positive().optional(),\n});\n\nexport type HookFrontmatter = z.infer<typeof HookFrontmatterSchema>;\n\n/**\n * Parse + validate hook frontmatter from a raw `Record<string, ...>` (output\n * of `parseSimpleYaml`). Wraps Zod errors in `ConfigurationError` with the\n * `hook_frontmatter_invalid` code so callers can pattern-match.\n *\n * @throws ConfigurationError(code: \"hook_frontmatter_invalid\")\n *\n * @internal\n */\nexport function parseHookFrontmatter(\n fields: Record<string, unknown>,\n slug: string,\n): HookFrontmatter {\n const parsed = HookFrontmatterSchema.safeParse(fields);\n if (!parsed.success) {\n throw new ConfigurationError(\n `Invalid hook frontmatter for \"${slug}\": ${parsed.error.message}`,\n { code: \"hook_frontmatter_invalid\" },\n );\n }\n return parsed.data;\n}\n","/**\n * Single source of truth for loading the hooks config (T1.2, ADR D77).\n *\n * Detection order:\n * 1. `.theokit/hooks/*.md` (markdown, frontmatter-validated) — canonical.\n * 2. `.theokit/hooks.json` — legacy. Emits one-time deprecation warn.\n * 3. Neither → empty config (no hooks).\n *\n * Consumed by `hooks-loader.ts` (boot-time validation) and\n * `hooks-executor.ts` (runtime dispatch).\n *\n * @internal\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { z } from \"zod\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { loadMarkdownEntities } from \"../persistence/markdown-config-loader.js\";\nimport { HookFrontmatterSchema } from \"./hooks-frontmatter.js\";\n\nexport type HookEvent = \"preRun\" | \"postRun\" | \"preToolUse\" | \"postToolUse\" | \"stop\";\n\nexport interface HookCommand {\n command: string;\n matcher?: string;\n timeoutMs?: number;\n}\n\nexport interface HookConfig {\n hooks?: Partial<Record<HookEvent, HookCommand[]>>;\n}\n\nconst warned = new Set<string>();\n\n/**\n * Emit a stderr warn once per process per unique key. Helps surface the\n * deprecation path without spamming when the loader is called many times\n * during a session (cron + send + skills all hit this).\n *\n * Note: spawned workers (cron, subagent) start fresh processes — warn\n * re-emits there, by design (1 per process boot, not per call).\n *\n * @internal\n */\nexport function warnOnce(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n process.stderr.write(`${message}\\n`);\n}\n\n/** Reset for tests; not exported via barrel. @internal */\nexport function _resetWarnOnceForTests(): void {\n warned.clear();\n}\n\n/**\n * Load hooks from `.theokit/hooks/*.md` (preferred) or `.theokit/hooks.json`\n * (legacy fallback).\n *\n * @internal\n */\nexport async function loadHookConfig(cwd: string): Promise<HookConfig> {\n const mdDir = join(cwd, \".theokit\", \"hooks\");\n const jsonPath = join(cwd, \".theokit\", \"hooks.json\");\n\n const mdEntities = await loadMarkdownEntities({\n dir: mdDir,\n schema: HookFrontmatterSchema,\n pattern: \"flat\",\n errorCodePrefix: \"hook\",\n });\n\n if (mdEntities.length > 0) {\n if (existsSync(jsonPath)) {\n warnOnce(\n \"hooks-both-present\",\n \"[theokit-sdk] both .theokit/hooks/ and .theokit/hooks.json detected — using markdown; remove hooks.json\",\n );\n }\n return buildConfigFromMarkdown(mdEntities);\n }\n\n // Fallback: JSON\n if (!existsSync(jsonPath)) return {};\n\n warnOnce(\n \"hooks-json-deprecated\",\n \"[theokit-sdk] .theokit/hooks.json is deprecated; migrate to .theokit/hooks/<name>.md via theokit-migrate-config\",\n );\n\n let raw: string;\n try {\n raw = await readFile(jsonPath, \"utf8\");\n } catch (cause) {\n throw new ConfigurationError(`Failed to read hooks config: ${jsonPath}`, {\n code: \"hooks_read_error\",\n cause,\n });\n }\n try {\n return JSON.parse(raw) as HookConfig;\n } catch (cause) {\n throw new ConfigurationError(`Invalid JSON in hooks config: ${jsonPath}`, {\n code: \"hooks_json_invalid\",\n cause,\n });\n }\n}\n\n// `z.input` matches what `loadMarkdownEntities` actually returns — Zod's\n// `ZodType<T>` is variant on INPUT, so the generic T resolves to the pre-default\n// shape (`enabled?: boolean | undefined`). `buildConfigFromMarkdown` already\n// handles `?? 0` for priority and `=== false` for enabled, so the loose shape\n// is the right contract here.\ntype HookEntities = Awaited<\n ReturnType<typeof loadMarkdownEntities<z.input<typeof HookFrontmatterSchema>>>\n>;\n\nfunction buildConfigFromMarkdown(entities: HookEntities): HookConfig {\n const grouped: Partial<Record<HookEvent, HookCommand[]>> = {};\n // Sort by priority asc so lower priority runs first when grouped.\n const sorted = [...entities].sort(\n (a, b) => (a.frontmatter.priority ?? 0) - (b.frontmatter.priority ?? 0),\n );\n for (const entity of sorted) {\n if (entity.frontmatter.enabled === false) continue;\n const event = entity.frontmatter.event as HookEvent;\n const list = grouped[event] ?? [];\n const command: HookCommand = {\n command: entity.frontmatter.command,\n matcher: entity.frontmatter.matcher,\n };\n if (entity.frontmatter.timeoutMs !== undefined) {\n command.timeoutMs = entity.frontmatter.timeoutMs;\n }\n list.push(command);\n grouped[event] = list;\n }\n return { hooks: grouped };\n}\n","/**\n * Per-fork tool whitelist via `AsyncLocalStorage` (ADR D111).\n *\n * Forked agents (background review, curator, judge) need a tool subset\n * distinct from the parent's. A global mutable `let _whitelist` would\n * corrupt state when two forks run in parallel. `AsyncLocalStorage`\n * propagates the whitelist through the async chain so each fork sees its\n * own — no cross-fork bleed.\n *\n * Outside a `withToolWhitelist(...)` scope, `currentToolWhitelist()`\n * returns `undefined` and `checkToolWhitelist` allows every tool — the\n * parent agent is unaffected.\n *\n * Wire site: `internal/agent-loop/tool-dispatch.ts:dispatchSingleCall`\n * calls `checkToolWhitelist` after the repair middleware and before\n * `tools.find`.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst toolWhitelistStore = new AsyncLocalStorage<Set<string>>();\n\n/**\n * Run `fn` with `whitelist` as the active tool filter. Nested calls\n * shadow the outer set; the outer is restored on return (EC-F).\n *\n * @internal\n */\nexport async function withToolWhitelist<T>(\n whitelist: Set<string>,\n fn: () => Promise<T>,\n): Promise<T> {\n return toolWhitelistStore.run(whitelist, fn);\n}\n\n/**\n * Active tool whitelist for the current async context, or `undefined`\n * when not inside a `withToolWhitelist(...)` scope.\n *\n * @internal\n */\nexport function currentToolWhitelist(): Set<string> | undefined {\n return toolWhitelistStore.getStore();\n}\n\n/**\n * Decision returned by {@link checkToolWhitelist}.\n *\n * @internal\n */\nexport interface ToolWhitelistDecision {\n allowed: boolean;\n /** Populated only when `allowed === false`. */\n reason?: string;\n}\n\n/**\n * Check whether `toolName` is allowed in the current fork context.\n * Returns `{ allowed: true }` when no fork is active — preserves the\n * parent agent's full tool surface.\n *\n * @internal\n */\nexport function checkToolWhitelist(toolName: string): ToolWhitelistDecision {\n const whitelist = currentToolWhitelist();\n if (whitelist === undefined) return { allowed: true };\n if (!whitelist.has(toolName)) {\n return {\n allowed: false,\n reason: `Tool \"${toolName}\" not available in this fork context`,\n };\n }\n return { allowed: true };\n}\n","/**\n * Types for the credential pool subsystem (ADRs D123-D133).\n *\n * Pool a developer's multiple API keys for the SAME provider so the SDK\n * can rotate transparently on HTTP 429/402/401 instead of jumping\n * straight to a different provider via `FallbackLlmClient`.\n *\n * @internal\n */\n\n/**\n * Rotation strategy when picking the next credential from a pool.\n *\n * - `fill_first` (default): use entries[0] until exhausted, then [1]…\n * - `round_robin`: rotate after each `select()`\n * - `least_used`: pick the entry with the lowest `requestCount`\n * - `random`: random pick among healthy entries\n *\n * Closed enum per ADR D124 — adding a strategy is an explicit semver\n * minor that updates `selectByStrategy` exhaustively.\n *\n * @internal\n */\nexport type CredentialPoolStrategy = \"fill_first\" | \"round_robin\" | \"least_used\" | \"random\";\n\n/** Health flag tracked per credential. */\nexport type CredentialStatus = \"ok\" | \"exhausted\";\n\n/**\n * Provenance of a credential — where it came from when seeded.\n * Free-form string; conventional prefixes:\n *\n * - `env:<VAR_NAME>` — auto-discovered from environment variable\n * - `manual` — added via explicit `apiKeys` config\n * - `explicit-apikey` — wrapped from `AgentOptions.apiKey` single-key path (D132)\n */\nexport type CredentialSource = string;\n\n/**\n * Single credential entry inside a {@link CredentialPool}.\n *\n * `accessToken` is the sensitive field — must never be logged unredacted.\n * The lint gate `tests/lint/no-unredacted-pool-token.test.ts` enforces this.\n *\n * @internal\n */\nexport interface PooledCredential {\n /** Stable identifier (uuid v4) for log lines + telemetry. */\n id: string;\n /** Human-readable label for `Theokit.credentialPool.list()`. */\n label: string;\n /** Provider name (matches `ProviderProfile.name`). */\n provider: string;\n /** Sort key; lower = earlier in fill_first. Unique within a pool. */\n priority: number;\n /** Provenance string. */\n source: CredentialSource;\n /** Sensitive API key. NEVER LOG UNREDACTED. */\n accessToken: string;\n /** Current health. */\n lastStatus: CredentialStatus;\n /** Epoch ms of the last status change. */\n lastStatusAt: number | undefined;\n /** HTTP code that caused exhaustion (401/402/429). */\n lastErrorCode: number | undefined;\n /** Provider-supplied \"retry after this epoch ms\" hint. Overrides cooldown defaults. */\n lastErrorResetAt: number | undefined;\n /** Bumped per successful `select()` for `least_used` strategy. Lazy-persisted. */\n requestCount: number;\n}\n\n/**\n * Serializable snapshot of a single provider's pool. Used by the\n * persistence layer (T2.1) to read/write `~/.theokit/credential-pool.json`.\n *\n * @internal\n */\nexport interface CredentialPoolSnapshot {\n provider: string;\n strategy: CredentialPoolStrategy;\n entries: PooledCredential[];\n}\n\n/**\n * Cooldown ladder by HTTP error code (ADR D125). Provider-supplied\n * `lastErrorResetAt` overrides these defaults when present.\n *\n * @internal\n */\nexport const COOLDOWN_MS: Readonly<Record<number, number>> = {\n 401: 5 * 60 * 1000, // 5 minutes — OAuth refresh can recover quickly\n 402: 60 * 60 * 1000, // 1 hour — billing quota typically hourly+\n 429: 60 * 60 * 1000, // 1 hour — daily-rate-limit windows\n};\n\n/** Default cooldown when no specific code matches. */\nexport const DEFAULT_COOLDOWN_MS = 60 * 60 * 1000;\n","/**\n * In-memory credential pool with strategy-based rotation (ADRs D123-D133).\n *\n * Pure logic. No I/O — persistence lives in `internal/persistence/\n * credential-pool-store.ts`. The pool is the single source of truth for\n * rotation state within a process; if it diverges from disk (e.g.,\n * process killed mid-rotation per EC-I), the next save heals the\n * inconsistency — at the cost of one extra HTTP 429 per crash.\n *\n * Thread safety: the pool uses an in-process async-aware mutex\n * (`cwd-mutex` D9 keyed by `credential-pool:${provider}`). Cross-process\n * safety happens at the persistence layer via `withFileLock` (D61).\n * Two Node processes sharing the same file may double-pick momentarily\n * (worst case = 1 extra 429 per race) — acceptable per ADR D128.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { withCwdMutex } from \"../memory/cwd-mutex.js\";\nimport {\n COOLDOWN_MS,\n type CredentialPoolSnapshot,\n type CredentialPoolStrategy,\n DEFAULT_COOLDOWN_MS,\n type PooledCredential,\n} from \"./credential-pool-types.js\";\n\n/**\n * Construct a `PooledCredential` with sane defaults.\n *\n * @internal\n */\nexport function newPooledCredential(args: {\n provider: string;\n accessToken: string;\n priority: number;\n source: string;\n label?: string;\n}): PooledCredential {\n return {\n id: globalThis.crypto.randomUUID(),\n label: args.label ?? labelFromSource(args.source, args.accessToken),\n provider: args.provider,\n priority: args.priority,\n source: args.source,\n accessToken: args.accessToken,\n lastStatus: \"ok\",\n lastStatusAt: undefined,\n lastErrorCode: undefined,\n lastErrorResetAt: undefined,\n requestCount: 0,\n };\n}\n\n/**\n * Build a human-readable label from the credential source. Used for\n * `Theokit.credentialPool.list()` UX. NEVER includes the raw token.\n *\n * @internal\n */\nfunction labelFromSource(source: string, accessToken: string): string {\n if (source.startsWith(\"env:\")) return source.slice(4);\n const masked =\n accessToken.length > 8 ? `${accessToken.slice(0, 4)}…${accessToken.slice(-4)}` : \"***\";\n return `${source}:${masked}`;\n}\n\n/**\n * Per-provider credential pool. Construct with one or more entries\n * sorted by priority. Throws `ConfigurationError` on empty input.\n *\n * EC-C: identical `accessToken`s are deduplicated during construction\n * (3 copies of \"k1\" → 1 entry). Otherwise an exhaustion event would\n * mark \"k1\" exhausted 3× wastefully.\n *\n * @internal\n */\nexport class CredentialPool {\n readonly provider: string;\n private readonly strategy: CredentialPoolStrategy;\n private entries: PooledCredential[];\n\n constructor(\n provider: string,\n entries: PooledCredential[],\n strategy: CredentialPoolStrategy = \"fill_first\",\n ) {\n if (entries.length === 0) {\n throw new ConfigurationError(\n `credential-pool: cannot construct empty pool for provider \"${provider}\"`,\n { code: \"credential_pool_empty\" },\n );\n }\n this.provider = provider;\n this.strategy = strategy;\n // EC-C: dedupe by accessToken before sort.\n this.entries = dedupeByToken(entries).sort((a, b) => a.priority - b.priority);\n }\n\n /** True if the pool was seeded with at least one entry. */\n hasCredentials(): boolean {\n return this.entries.length > 0;\n }\n\n /** True iff at least one entry is healthy (auto-healed if cooldown expired). */\n hasAvailable(): boolean {\n return this.availableEntries().length > 0;\n }\n\n /** Live (frozen) view of all entries. */\n list(): readonly PooledCredential[] {\n return this.entries;\n }\n\n /**\n * Pick a healthy entry according to the configured strategy.\n * Mutates `requestCount` and (for round_robin) entry order.\n * Returns null if every entry is in cooldown.\n *\n * @internal\n */\n async select(): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => this.selectLocked());\n }\n\n /**\n * Mark the entry whose id matches `entryId` as exhausted with the\n * appropriate cooldown, then return the next healthy entry (or null).\n * If `entryId` is undefined, marks all currently-active entries (rare —\n * only used by admin reset scenarios).\n *\n * @internal\n */\n async markExhaustedAndRotate(args: {\n entryId: string;\n statusCode: number;\n resetAtMs?: number;\n }): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => {\n const entry = this.entries.find((e) => e.id === args.entryId);\n if (entry !== undefined) {\n const now = Date.now();\n const cooldown = COOLDOWN_MS[args.statusCode] ?? DEFAULT_COOLDOWN_MS;\n entry.lastStatus = \"exhausted\";\n entry.lastStatusAt = now;\n entry.lastErrorCode = args.statusCode;\n // EC-5: negative or stale resetAt → ignore, fall through to default.\n entry.lastErrorResetAt =\n args.resetAtMs !== undefined && args.resetAtMs > now ? args.resetAtMs : now + cooldown;\n }\n return this.selectLocked();\n });\n }\n\n /** Admin escape hatch: clear all cooldowns. */\n async resetAll(): Promise<void> {\n await withCwdMutex(`credential-pool:${this.provider}`, async () => {\n for (const e of this.entries) {\n e.lastStatus = \"ok\";\n e.lastStatusAt = undefined;\n e.lastErrorCode = undefined;\n e.lastErrorResetAt = undefined;\n }\n });\n }\n\n /** Materialize for persistence. */\n toSnapshot(): CredentialPoolSnapshot {\n return {\n provider: this.provider,\n strategy: this.strategy,\n entries: this.entries.map((e) => ({ ...e })),\n };\n }\n\n /** Hydrate from a previously-saved snapshot. */\n static fromSnapshot(snapshot: CredentialPoolSnapshot): CredentialPool {\n return new CredentialPool(snapshot.provider, snapshot.entries, snapshot.strategy);\n }\n\n // ─── Internal helpers (always called inside the mutex) ───\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: strategy dispatch must branch on 4 enum values (random/least_used/round_robin/fill_first) with 1-entry short-circuits per strategy. Each branch is 5-10 lines of focused logic; extracting per-strategy methods fragments the linear narrative.\n private selectLocked(): PooledCredential | null {\n const available = this.availableEntries();\n if (available.length === 0) return null;\n\n if (this.strategy === \"random\") {\n const idx = Math.floor(Math.random() * available.length);\n const picked = available[idx];\n if (picked === undefined) return null; // unreachable; satisfies strict\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"least_used\" && available.length > 1) {\n // EC-3: tie-break by priority ascending (first wins).\n const picked = [...available].sort(\n (a, b) => a.requestCount - b.requestCount || a.priority - b.priority,\n )[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"round_robin\" && available.length > 1) {\n // Pick head; move it to the end of `entries` so next call picks the next.\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n const rest = this.entries.filter((e) => e.id !== picked.id);\n // Re-assign priorities: rotated entry gets the highest priority value\n // so it sorts last after `fromSnapshot` rehydration. This makes EC-F\n // (round-robin state survives save/load) work without a separate field.\n const maxPriority = this.entries.length - 1;\n rest.forEach((e, i) => {\n e.priority = i;\n });\n picked.priority = maxPriority;\n this.entries = [...rest, picked];\n return picked;\n }\n\n // fill_first (default) and 1-entry edge case for round_robin/least_used\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n private availableEntries(): PooledCredential[] {\n const now = Date.now();\n const out: PooledCredential[] = [];\n for (const entry of this.entries) {\n if (entry.lastStatus === \"ok\") {\n out.push(entry);\n continue;\n }\n // EC-1: auto-heal expired cooldowns inline.\n const resetAt = entry.lastErrorResetAt;\n if (resetAt !== undefined && now >= resetAt) {\n entry.lastStatus = \"ok\";\n entry.lastStatusAt = undefined;\n entry.lastErrorCode = undefined;\n entry.lastErrorResetAt = undefined;\n out.push(entry);\n }\n }\n return out;\n }\n}\n\n/**\n * Drop duplicates by `accessToken`. Keeps the first occurrence (lowest\n * priority wins after sort). EC-C from the edge-case review.\n */\nfunction dedupeByToken(entries: PooledCredential[]): PooledCredential[] {\n const seen = new Set<string>();\n const out: PooledCredential[] = [];\n for (const e of entries) {\n if (seen.has(e.accessToken)) continue;\n seen.add(e.accessToken);\n out.push(e);\n }\n return out;\n}\n","/**\n * Per-fork credential-pool inheritance via `AsyncLocalStorage` (ADR D131).\n *\n * Mirrors the whitelist context pattern from D111\n * (`runtime/async-local-storage.ts`). Forked sub-agents inherit the\n * parent's pool *by reference* so concurrent rotations all observe\n * the same cooldown state — the desired behavior per Hermes parity.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { CredentialPool } from \"./credential-pool.js\";\n\n/** ALS slot — keyed by provider name → pool. */\nconst credentialPoolStore = new AsyncLocalStorage<Map<string, CredentialPool>>();\n\n/**\n * Run `fn` with `pools` as the active credential-pool registry for the\n * current async context. Nested calls shadow the outer map (parent\n * pools are not visible to children when the child sets its own).\n *\n * @internal\n */\nexport async function withCredentialPool<T>(\n pools: Map<string, CredentialPool>,\n fn: () => Promise<T>,\n): Promise<T> {\n return credentialPoolStore.run(pools, fn);\n}\n\n/**\n * Pool registered for `provider` in the current async context, or\n * `undefined` when no `withCredentialPool(...)` scope is active.\n *\n * @internal\n */\nexport function currentCredentialPool(provider: string): CredentialPool | undefined {\n return credentialPoolStore.getStore()?.get(provider);\n}\n","/**\n * Personality fork-context (ADR D168 + EC-A snapshot semantic).\n *\n * Uses Node's `AsyncLocalStorage` so a fork's execution chain can know\n * that it is running inside a fork AND can see the slug that was active\n * on the parent **at fork-construction time**.\n *\n * **EC-A:** The slug stored here is captured ONCE at the wrap site\n * (`localAgentFork`) — passing `parentStore.active(parentAgentId)`\n * returns a primitive `string | undefined`, which is then frozen\n * inside the ALS context object. Subsequent `usePersonality` calls on\n * the parent do NOT mutate the fork's view, because the fork reads from\n * its own ALS frame, not from the parent's store.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport { warnOnce } from \"../runtime/hooks-source.js\";\n\n/**\n * Snapshot data carried into a fork's async context.\n *\n * @internal\n */\nexport interface PersonalityForkContext {\n /** Parent's active personality slug at fork-construction time. */\n readonly slug: string | undefined;\n /** Always `true` inside this scope (used by guards). */\n readonly isFork: true;\n}\n\nconst storage = new AsyncLocalStorage<PersonalityForkContext>();\n\n/**\n * Run `fn` with `ctx` bound as the active fork context. Nested calls\n * shadow the outer context (EC-22).\n *\n * @internal\n */\nexport function withPersonalityContext<T>(\n ctx: PersonalityForkContext,\n fn: () => Promise<T>,\n): Promise<T> {\n return storage.run(ctx, fn);\n}\n\n/**\n * Return the active fork context, or `undefined` when called outside a\n * fork scope.\n *\n * @internal\n */\nexport function currentPersonalityContext(): PersonalityForkContext | undefined {\n return storage.getStore();\n}\n\n/**\n * Emit one warning per agentId stating that personality switches inside\n * a fork are no-ops. The fork inherits the parent snapshot — runtime\n * mutation is intentionally rejected to keep fork voice deterministic.\n *\n * @internal\n */\nexport function warnPersonalitySwitchInsideFork(agentId: string): void {\n warnOnce(\n `personality-switch-in-fork-${agentId}`,\n `[theokit-sdk] usePersonality is a no-op inside a fork (D168). Subagents inherit the parent's active personality at fork-construction time.`,\n );\n}\n","/**\n * EC-1 (edge-case review): runtime discrimination between legacy plugin\n * metadata `{ enabled: string[] }` (v1.2 shape) and the new code Plugin\n * objects (v1.3+ Plugin discriminated union).\n *\n * Telegram-pro + 7 examples pass `plugins: { enabled: [\"openrouter\"] }`\n * — an OBJECT, not an array. The new Plugin[] is an ARRAY. We discriminate\n * by `Array.isArray` first, then by shape per-kind.\n *\n * @internal\n */\n\nimport type { Plugin } from \"../plugins/types.js\";\n\nexport function isCodePlugin(p: unknown): p is Plugin {\n if (p === null || typeof p !== \"object\" || !(\"kind\" in p)) return false;\n const kind = (p as { kind: unknown }).kind;\n if (kind === \"general\") {\n return \"register\" in p && typeof (p as { register: unknown }).register === \"function\";\n }\n if (kind === \"model-provider\") {\n return (\n \"profile\" in p &&\n typeof (p as { profile: unknown }).profile === \"object\" &&\n (p as { profile: unknown }).profile !== null\n );\n }\n if (kind === \"memory\") {\n return (\n \"createProvider\" in p &&\n typeof (p as { createProvider: unknown }).createProvider === \"function\"\n );\n }\n return false;\n}\n\nexport function extractCodePlugins(value: unknown): Plugin[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCodePlugin);\n}\n","/**\n * Goal-driven Ralph loop (T3.2, ADRs D115-D121).\n *\n * `runUntilImpl` is an `AsyncGenerator<GoalEvent, GoalResult, void>`:\n * yields events as the loop progresses, returns the final result when\n * the goal completes, fails, or is paused. The auxiliary judge model is\n * injected via `deps.judge` so the generator stays free of the `Agent`\n * façade import.\n *\n * EC-C fix: pre-aborted signals emit only `[paused]`, not `[active, paused]`.\n * EC-D: `maxTurns: 0` is supported (vacuous yield active → failed).\n *\n * @internal\n */\n\nimport type { SDKAgent } from \"../../types/agent.js\";\nimport type { GoalEvent, GoalOptions, GoalResult } from \"../../types/goal-events.js\";\nimport type { JudgeContext, JudgeOptions } from \"../judge/judge-call.js\";\nimport type { JudgeResult } from \"../judge/types.js\";\n\n/** DI contract: the judge is the only external touchpoint. */\nexport interface RunUntilDeps {\n judge: (ctx: JudgeContext, opts?: JudgeOptions) => Promise<JudgeResult>;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: the goal-loop interleaves turn-start, send, judge, continuation, abort-check, and failure-bail — extracting helpers harms the linear narrative.\nexport async function* runUntilImpl(\n agent: SDKAgent,\n goal: string,\n options: GoalOptions | undefined,\n deps: RunUntilDeps,\n): AsyncGenerator<GoalEvent, GoalResult, void> {\n const maxTurns = options?.maxTurns ?? 20;\n const maxFails = options?.maxConsecutiveJudgeFailures ?? 3;\n const signal = options?.signal;\n // Use a function (not direct property access) so TS does not narrow\n // `signal.aborted` to `false | undefined` after the initial check.\n // AbortSignal.aborted is a getter that can flip true between calls.\n // biome-ignore lint/complexity/useOptionalChain: optional-chain would re-narrow signal?.aborted to `false | undefined` after the first check, defeating the purpose of this helper.\n const isAborted = (): boolean => signal !== undefined && signal.aborted;\n let turn = 0;\n let consecutiveFailures = 0;\n let lastResponse = \"\";\n\n // EC-C: signal already aborted BEFORE first event → emit only [paused].\n if (isAborted()) {\n yield {\n type: \"status_change\",\n status: \"paused\",\n reason: \"aborted via AbortSignal before first turn\",\n };\n return { status: \"paused\", turnsUsed: 0, finalResponse: undefined };\n }\n\n yield { type: \"status_change\", status: \"active\", reason: \"Goal started\" };\n\n while (turn < maxTurns) {\n if (isAborted()) {\n yield { type: \"status_change\", status: \"paused\", reason: \"aborted via AbortSignal\" };\n return { status: \"paused\", turnsUsed: turn, finalResponse: lastResponse || undefined };\n }\n\n turn += 1;\n yield { type: \"turn_start\", turn, goal };\n\n const continuationPrompt = turn === 1 ? goal : composeContinuation(goal, lastResponse);\n\n const run = await agent.send(continuationPrompt);\n const result = await run.wait();\n lastResponse = result.result ?? \"\";\n yield { type: \"agent_response\", turn, content: lastResponse };\n\n const judgeOpts: JudgeOptions = {};\n if (options?.judgeModel !== undefined) judgeOpts.judgeModel = options.judgeModel;\n if (options?.judgeApiKey !== undefined) judgeOpts.apiKey = options.judgeApiKey;\n const judgeCtx: JudgeContext = { goal, lastResponse };\n if (options?.subgoals !== undefined) judgeCtx.subgoals = options.subgoals;\n const judgment = await deps.judge(judgeCtx, judgeOpts);\n yield {\n type: \"judge_verdict\",\n turn,\n verdict: judgment.verdict,\n reason: judgment.reason,\n parseFailed: judgment.parseFailed,\n };\n\n if (judgment.parseFailed) {\n consecutiveFailures += 1;\n if (consecutiveFailures >= maxFails) {\n yield {\n type: \"status_change\",\n status: \"failed\",\n reason: `judge model too unreliable (${consecutiveFailures} parse failures in a row)`,\n };\n return {\n status: \"failed\",\n turnsUsed: turn,\n finalResponse: lastResponse || undefined,\n };\n }\n } else {\n consecutiveFailures = 0;\n }\n\n if (judgment.verdict === \"done\") {\n yield { type: \"status_change\", status: \"completed\", reason: judgment.reason };\n return { status: \"completed\", turnsUsed: turn, finalResponse: lastResponse || undefined };\n }\n if (judgment.verdict === \"skipped\") {\n yield {\n type: \"status_change\",\n status: \"completed\",\n reason: `skipped: ${judgment.reason}`,\n };\n return { status: \"completed\", turnsUsed: turn, finalResponse: lastResponse || undefined };\n }\n\n yield { type: \"continuation\", turn, prompt: continuationPrompt };\n }\n\n yield {\n type: \"status_change\",\n status: \"failed\",\n reason: `max turns (${maxTurns}) exhausted`,\n };\n return { status: \"failed\", turnsUsed: turn, finalResponse: lastResponse || undefined };\n}\n\n/**\n * Build the continuation user message for turns 2+. Keeps last response\n * preview short so we don't bloat the prompt cache.\n *\n * @internal\n */\nexport function composeContinuation(goal: string, lastResponse: string): string {\n return `Continue working toward the goal: ${goal}\\n\\nYour last response was:\\n${lastResponse.slice(0, 1000)}`;\n}\n","/**\n * Pure verdict parser (T2.1, ADRs D120-D121).\n *\n * Strict prefix matching against `DONE:`, `CONTINUE:`, `SKIPPED:`. Reason\n * is the suffix, trimmed. Anything else is fail-safe: verdict = `continue`,\n * `parseFailed: true` — caller's max-consecutive-failure cap stops the\n * loop after N flakes.\n *\n * @internal\n */\n\nimport type { JudgeResult } from \"./types.js\";\n\nconst DONE_PREFIX = \"DONE:\";\nconst CONTINUE_PREFIX = \"CONTINUE:\";\nconst SKIPPED_PREFIX = \"SKIPPED:\";\n\nexport function parseVerdict(text: string): JudgeResult {\n const trimmed = text.trim();\n\n if (trimmed.startsWith(DONE_PREFIX)) {\n return {\n verdict: \"done\",\n reason: trimmed.slice(DONE_PREFIX.length).trim(),\n parseFailed: false,\n };\n }\n if (trimmed.startsWith(CONTINUE_PREFIX)) {\n return {\n verdict: \"continue\",\n reason: trimmed.slice(CONTINUE_PREFIX.length).trim(),\n parseFailed: false,\n };\n }\n if (trimmed.startsWith(SKIPPED_PREFIX)) {\n return {\n verdict: \"skipped\",\n reason: trimmed.slice(SKIPPED_PREFIX.length).trim(),\n parseFailed: false,\n };\n }\n\n // Fail-safe: ADR D121 — prefer \"continue\" so we don't stop prematurely.\n // The runUntil loop counts consecutive parseFailed responses and bails\n // after `maxConsecutiveJudgeFailures` (default 3).\n return {\n verdict: \"continue\",\n reason: `judge response malformed: \"${trimmed.slice(0, 100)}\"`,\n parseFailed: true,\n };\n}\n","/**\n * Judge call primitive (T2.2, ADRs D119-D121).\n *\n * Instantiates a short-lived auxiliary agent that evaluates whether a\n * goal is satisfied. The auxiliary judge runs with `tools: []` and a\n * cheap model (default `openai/gpt-4o-mini`) — see ADR D119. The judge\n * model needs only API access; we read `OPENROUTER_API_KEY` directly\n * from the environment (EC-A — single source of truth) and let the\n * caller override via {@link JudgeOptions.apiKey} for Anthropic or\n * direct-OpenAI environments.\n *\n * NOTE: judge aux agents created from inside a `forkAgent` context will\n * inherit the parent fork's whitelist via AsyncLocalStorage (EC-J).\n * `tools: []` keeps this benign today; future callers that add tools to\n * a judge should be aware.\n *\n * @internal\n */\n\nimport type { AgentOptions, SDKAgent } from \"../../types/agent.js\";\nimport { parseVerdict } from \"./parse-verdict.js\";\nimport type { JudgeResult } from \"./types.js\";\n\n/** Inputs to the judge — pure data. */\nexport interface JudgeContext {\n goal: string;\n lastResponse: string;\n subgoals?: string[];\n}\n\n/** Caller-supplied tuning knobs for the judge call. */\nexport interface JudgeOptions {\n /** Judge model identifier. Default `\"openai/gpt-4o-mini\"` (ADR D119). */\n judgeModel?: string;\n /** Override env. Default `process.env.OPENROUTER_API_KEY` (EC-A). */\n apiKey?: string;\n}\n\n/** Dependencies injected so `judge-call.ts` stays free of `Agent` import. */\nexport interface JudgeDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n}\n\n/**\n * Run the judge auxiliary agent and parse the verdict. Always returns a\n * `JudgeResult` — failures are folded into `{ parseFailed: true,\n * verdict: \"continue\" }` so the loop can decide based on consecutive\n * failures (ADR D121).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: judge call must (1) check env or override, (2) catch errors as fail-safe, (3) ensure aux dispose runs once regardless of outcome — three concerns linearly arranged, harm clarity to extract.\nexport async function judgeCallImpl(\n ctx: JudgeContext,\n options: JudgeOptions | undefined,\n deps: JudgeDeps,\n): Promise<JudgeResult> {\n const prompt = composeJudgePrompt(ctx);\n // EC-A: single env source — OpenRouter only. No multi-provider fallback.\n const apiKey = options?.apiKey ?? process.env.OPENROUTER_API_KEY;\n if (apiKey === undefined) {\n return {\n verdict: \"continue\",\n reason:\n \"judge unavailable: OPENROUTER_API_KEY missing and no override passed via options.apiKey\",\n parseFailed: true,\n };\n }\n\n const judgeModel = options?.judgeModel ?? \"openai/gpt-4o-mini\";\n let auxAgent: SDKAgent | undefined;\n try {\n auxAgent = await deps.create({\n apiKey,\n model: { id: judgeModel },\n tools: [],\n local: {},\n metadata: { forkOrigin: \"judge\" },\n } as AgentOptions);\n const run = await auxAgent.send(prompt);\n const result = await run.wait();\n return parseVerdict(result.result ?? \"\");\n } catch (err) {\n return {\n verdict: \"continue\",\n reason: `judge call failed: ${err instanceof Error ? err.message : String(err)}`,\n parseFailed: true,\n };\n } finally {\n if (auxAgent !== undefined) {\n try {\n await auxAgent.dispose();\n } catch {\n // dispose errors are non-fatal; judge result is already prepared\n }\n }\n }\n}\n\n/**\n * Build the strict-format prompt the judge expects.\n *\n * @internal\n */\nexport function composeJudgePrompt(ctx: JudgeContext): string {\n const subgoals =\n ctx.subgoals !== undefined && ctx.subgoals.length > 0 ? ctx.subgoals.join(\", \") : \"(none)\";\n return `You are a goal judge. Determine if this goal is satisfied.\n\nGoal: ${ctx.goal}\nSubgoals: ${subgoals}\nLast agent response: ${ctx.lastResponse}\n\nRespond with EXACTLY one of:\n- DONE: <reason>\n- CONTINUE: <what's left>\n- SKIPPED: <why not applicable>\n\nBe strict. If unclear, prefer CONTINUE.`;\n}\n","/**\n * Fork agent primitive (T1.2, ADRs D110-D114).\n *\n * `forkAgentImpl(parent, options, deps)` creates a short-lived auxiliary\n * agent that inherits the parent's credentials and **byte-identical**\n * system prompt (D112 — cache hit) but runs with a reduced tool\n * whitelist enforced via `AsyncLocalStorage` (D111). Memory plugins\n * (`kind: \"memory\"`) are preserved so memory writes carry provenance\n * (D114 + EC-B fix); general/model-provider plugins are dropped because\n * the fork has its own `PluginManager.initialize` and double-registering\n * is redundant.\n *\n * @internal\n */\n\nimport type { AgentOptions, SDKAgent } from \"../../types/agent.js\";\nimport type { Plugin } from \"../plugins/types.js\";\nimport { withToolWhitelist } from \"./async-local-storage.js\";\nimport { isCodePlugin } from \"./local-agent-plugins.js\";\n\n/**\n * Caller-supplied fork configuration. See {@link forkAgentImpl}.\n *\n * @internal\n */\nexport interface ForkOptions {\n /**\n * Tool subset visible to the fork. Names must match the canonical (post-repair)\n * tool name — typically lowercase. Tools not in this set return a `tool_result`\n * with `\"Tool blocked by fork whitelist\"` content (EC-H).\n */\n allowedTools: Set<string>;\n /** Task prompt sent to the fork. */\n prompt: string;\n /** Override system prompt. Default: byte-identical inheritance from parent (D112). */\n systemPrompt?: string;\n /** Memory write provenance tag (D114). Default `\"fork\"`. */\n forkOrigin?: string;\n}\n\n/**\n * Outcome of a fork run.\n *\n * @internal\n */\nexport interface ForkResult {\n /** Final agent response text (`undefined` when the fork produced no result). */\n result: string | undefined;\n /** Tool calls executed inside the fork. */\n toolCalls: ReadonlyArray<{ name: string; input: Record<string, unknown> }>;\n /** Aggregate token usage reported by the run. */\n usage: { inputTokens: number; outputTokens: number };\n}\n\n/**\n * Injected dependency contract — keeps fork-agent acyclic with `Agent`.\n *\n * @internal\n */\nexport interface ForkDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n}\n\n/**\n * Parent shape required by the fork. Any `SDKAgent` plus a `readonly options`\n * accessor (LocalAgent exposes it via the public getter added in T4.3).\n *\n * @internal\n */\nexport interface ForkParent {\n readonly agentId: string;\n readonly options: AgentOptions;\n}\n\n/**\n * Preserve memory plugins (kind: \"memory\") so the fork can write memory\n * with provenance (D114). Drop other kinds — the fork's own\n * `PluginManager` will re-initialize from `forkOptions.plugins`, and\n * general/model-provider re-registration is redundant.\n *\n * EC-B (edge-case review): without this filter, every fork would lose\n * memory writeability when callers use the v1.3 `plugins: Plugin[]`\n * shape (D98).\n *\n * @internal\n */\nexport function filterMemoryPlugins(\n plugins: unknown,\n): Array<Extract<Plugin, { kind: \"memory\" }>> | undefined {\n if (!Array.isArray(plugins)) return undefined;\n const memoryOnly = plugins.filter(\n (p): p is Extract<Plugin, { kind: \"memory\" }> => isCodePlugin(p) && p.kind === \"memory\",\n );\n return memoryOnly.length > 0 ? memoryOnly : undefined;\n}\n\n/**\n * Run a forked sub-agent. Inherits parent credentials and system prompt\n * byte-identical (D112), enforces `allowedTools` via AsyncLocalStorage\n * (D111), disposes the auxiliary agent in `finally` regardless of outcome.\n *\n * @internal\n */\nexport async function forkAgentImpl(\n parent: ForkParent,\n options: ForkOptions,\n deps: ForkDeps,\n): Promise<ForkResult> {\n const parentOptions = parent.options;\n // EC-B fix: preserve memory plugins so fork can attribute memory writes;\n // drop general/model-provider plugins (redundant per-fork re-init).\n const memoryPlugins = filterMemoryPlugins(parentOptions.plugins as unknown);\n\n const forkOptions: AgentOptions = {\n ...parentOptions,\n // Strip fields that don't survive fork:\n agentId: undefined,\n skills: undefined,\n // Override:\n plugins: memoryPlugins as unknown as AgentOptions[\"plugins\"],\n systemPrompt:\n options.systemPrompt ??\n (typeof parentOptions.systemPrompt === \"string\" ? parentOptions.systemPrompt : undefined),\n metadata: {\n ...(parentOptions.metadata ?? {}),\n forkOrigin: options.forkOrigin ?? \"fork\",\n parentAgentId: parent.agentId,\n },\n };\n\n const fork = await deps.create(forkOptions);\n try {\n return await withToolWhitelist(options.allowedTools, async () => {\n const run = await fork.send(options.prompt);\n const result = await run.wait();\n return {\n result: result.result,\n toolCalls: [],\n usage: extractUsage(result),\n };\n });\n } finally {\n await fork.dispose();\n }\n}\n\nfunction extractUsage(result: unknown): { inputTokens: number; outputTokens: number } {\n if (typeof result !== \"object\" || result === null) {\n return { inputTokens: 0, outputTokens: 0 };\n }\n const usage = (result as { usage?: unknown }).usage;\n if (typeof usage !== \"object\" || usage === null) {\n return { inputTokens: 0, outputTokens: 0 };\n }\n const u = usage as { inputTokens?: number; outputTokens?: number };\n return {\n inputTokens: typeof u.inputTokens === \"number\" ? u.inputTokens : 0,\n outputTokens: typeof u.outputTokens === \"number\" ? u.outputTokens : 0,\n };\n}\n","/**\n * Public type contract for the Task observability registry (ADRs D361-D374).\n *\n * Tasks are an opt-in observability layer over async work in the SDK\n * (`Agent.send`, `Agent.batch`, `Workflow.run`, `Cron` fires). They have\n * a closed 5-state lifecycle (D362), discriminated events (D366), and a\n * pluggable store (D364). The `Task` facade in `task.ts` is the public\n * surface; consumers import these types from `@theokit/sdk`.\n *\n * @public\n */\n\n/**\n * Closed enum of the 5 lifecycle states (D362).\n *\n * Transitions are acyclic:\n * queued → running → (finished | error | cancelled)\n * queued → cancelled (direct, no run started)\n */\nexport type TaskState = \"queued\" | \"running\" | \"finished\" | \"error\" | \"cancelled\";\n\n/** Discriminator of the runtime that produced a task (D374). */\nexport type TaskKind = \"run\" | \"batch\" | \"workflow\" | \"cron\" | \"custom\";\n\n/** Discriminated union of task lifecycle events (D366). */\nexport type TaskEvent =\n | {\n readonly type: \"submitted\";\n readonly taskId: string;\n readonly kind: TaskKind;\n readonly submittedAt: number;\n readonly meta?: Record<string, unknown>;\n /** D372 — flag set on the first yielded event when the ring buffer was at cap. */\n readonly truncated?: boolean;\n }\n | { readonly type: \"started\"; readonly taskId: string; readonly startedAt: number }\n | {\n readonly type: \"progress\";\n readonly taskId: string;\n readonly at: number;\n readonly payload: unknown;\n }\n | {\n readonly type: \"finished\";\n readonly taskId: string;\n readonly finishedAt: number;\n readonly result: unknown;\n }\n | {\n readonly type: \"errored\";\n readonly taskId: string;\n readonly erroredAt: number;\n readonly error: { readonly code: string; readonly message: string };\n }\n | {\n readonly type: \"cancelled\";\n readonly taskId: string;\n readonly cancelledAt: number;\n readonly reason?: string;\n };\n\n/** Public read-only view of a task entry in the registry. */\nexport interface TaskHandle {\n readonly id: string;\n readonly kind: TaskKind;\n readonly state: TaskState;\n readonly submittedAt: number;\n readonly startedAt?: number;\n readonly finishedAt?: number;\n readonly cancelledAt?: number;\n readonly erroredAt?: number;\n readonly result?: unknown;\n readonly error?: { readonly code: string; readonly message: string };\n readonly meta?: Record<string, unknown>;\n /**\n * EC-7 — cross-process best-effort cancel flag. Set by CLI\n * `theokit tasks cancel` via JsonFileTaskStore. The owning process\n * polls at checkpoints and honors via AbortController. Always\n * `undefined` for in-process cancel paths (which go directly through\n * AbortController).\n */\n readonly cancelRequested?: boolean;\n}\n\n/** Query filter for `Task.list`. */\nexport interface TaskFilter {\n readonly state?: TaskState | readonly TaskState[];\n readonly kind?: TaskKind | readonly TaskKind[];\n readonly submittedAfter?: number;\n readonly submittedBefore?: number;\n /** Defaults to 100. JsonFileTaskStore hard-caps loaded entries at 256 (D364). */\n readonly limit?: number;\n}\n\n/** Options for `Task.submit`. */\nexport interface TaskSubmitOptions {\n /**\n * Optional user-supplied ID. Must match grammar `^[a-z0-9][a-z0-9_-]*$`\n * and MUST NOT start with the reserved prefixes `wf-` / `b-` / `cron-`\n * (D368, EC-5). When omitted, `crypto.randomUUID()` is used.\n */\n readonly id?: string;\n readonly meta?: Record<string, unknown>;\n /**\n * Optional caller-provided AbortSignal. If already aborted at submit\n * time, the registry short-circuits to `cancelled` without acquiring\n * a semaphore slot (EC-4).\n */\n readonly signal?: AbortSignal;\n}\n\n/** Options shape for `TaskStore` factory (D364). */\nexport type TaskStoreOptions =\n | { readonly backend: \"memory\" }\n | { readonly backend: \"json\"; readonly dir: string };\n\n/** Result of `Task.cancel` (D365 — idempotent). */\nexport interface TaskCancelResult {\n readonly cancelled: boolean;\n readonly alreadyTerminal: boolean;\n}\n\n/**\n * Grammar for user-supplied task IDs (D368).\n * `crypto.randomUUID()` outputs do NOT match this (UUIDs have dashes\n * AND uppercase letters in their canonical form on some Node versions),\n * but the registry normalizes auto-generated IDs to lowercase before\n * insertion, so they pass the same regex.\n */\nconst TASK_ID_GRAMMAR = /^[a-z0-9][a-z0-9_-]*$/;\n\n/** Reserved prefixes for adapter-generated IDs (D368, EC-5). */\nconst RESERVED_PREFIXES = [\"wf-\", \"b-\", \"cron-\"] as const;\n\n/**\n * Validates a task ID against the public grammar + reserved prefixes.\n * Throws `InvalidTaskIdError` from `../errors.js` on rejection.\n *\n * Adapter callers (workflow/batch/cron) MUST set `allowReserved: true`\n * to register their own IDs; user-facing surfaces (`Task.submit`,\n * `agent.send({ task: { id } })`) leave it false.\n */\nexport function isValidTaskId(id: string, allowReserved: boolean): boolean {\n if (!TASK_ID_GRAMMAR.test(id)) return false;\n if (allowReserved) return true;\n for (const prefix of RESERVED_PREFIXES) {\n if (id.startsWith(prefix)) return false;\n }\n return true;\n}\n\n/** Re-exported for adapter implementations + tests. */\nexport const TASK_RESERVED_PREFIXES: readonly string[] = RESERVED_PREFIXES;\n","/**\n * Async-aware counting semaphore (ADR D135).\n *\n * N-permit gate for cooperative concurrency control inside a single\n * Node process. Used by `Agent.batch` to bound parallel agent count\n * without pulling in `p-limit` or `p-queue` (~30 LoC in-house).\n *\n * Contract: `acquire()` returns a release function. Caller MUST call\n * release exactly once when done — typically in a `finally` block.\n * Release is idempotent (multiple calls are no-ops after the first)\n * for defense against caller bugs, but leaking the release function\n * permanently consumes one permit (EC-G — caller responsibility).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\n\nexport interface AsyncSemaphore {\n /** Acquire a permit. Returns the release function (call once). */\n acquire(): Promise<() => void>;\n /** Permits currently held in flight. */\n inFlight(): number;\n /** Total: in-flight + queued waiters. */\n pending(): number;\n}\n\nexport function createSemaphore(permits: number): AsyncSemaphore {\n if (!Number.isInteger(permits) || permits < 1) {\n throw new ConfigurationError(\n `async-semaphore: permits must be a positive integer, got ${permits}`,\n { code: \"invalid_concurrency\" },\n );\n }\n let active = 0;\n const queue: Array<() => void> = [];\n\n function tryGrant(): void {\n if (active < permits && queue.length > 0) {\n const resolve = queue.shift();\n if (resolve !== undefined) {\n active += 1;\n resolve();\n }\n }\n }\n\n return {\n inFlight: () => active,\n pending: () => queue.length + active,\n async acquire() {\n await new Promise<void>((resolve) => {\n queue.push(resolve);\n tryGrant();\n });\n let released = false;\n return () => {\n if (released) return;\n released = true;\n active -= 1;\n tryGrant();\n };\n },\n };\n}\n","/**\n * Bounded FIFO ring buffer for late-attach replay (ADR D372).\n *\n * Push always succeeds; when the buffer is at capacity the oldest\n * entry is dropped and the `truncated` flag flips to `true`. Drain\n * returns a snapshot + the current truncated flag.\n *\n * @internal\n */\n\nexport class RingBuffer<T> {\n private readonly buf: T[] = [];\n private truncated = false;\n\n constructor(private readonly cap: number) {\n if (!Number.isInteger(cap) || cap < 1) {\n throw new Error(`RingBuffer capacity must be a positive integer, got ${cap}`);\n }\n }\n\n push(item: T): void {\n if (this.buf.length >= this.cap) {\n this.buf.shift();\n this.truncated = true;\n }\n this.buf.push(item);\n }\n\n drain(): { readonly items: readonly T[]; readonly truncated: boolean } {\n return { items: this.buf.slice(), truncated: this.truncated };\n }\n\n size(): number {\n return this.buf.length;\n }\n\n wasTruncated(): boolean {\n return this.truncated;\n }\n}\n","/**\n * `TaskStore` interface + 2 implementations (ADR D364).\n *\n * - `InMemoryTaskStore` — default, transient, single-process.\n * - `JsonFileTaskStore` — opt-in, one JSON file per task under a\n * dedicated dir; single-process invariant (EC-15 documented).\n *\n * Edge cases absorbed:\n * - EC-1: constructor auto-creates dir (mkdirSync recursive idempotent).\n * - EC-2: every method validates the task id against the public\n * grammar (D368) BEFORE doing any path I/O — path-traversal defense.\n * - EC-6: `list()` returns `[]` on ENOENT (fresh install path).\n * - EC-8: `list()` skips `.tmp.*` orphan files left by interrupted\n * atomic writes.\n * - EC-14 (DOCUMENT): `list()` JSDoc documents the 256-row hard cap\n * and the `submittedBefore` paging idiom.\n * - EC-15 (DOCUMENT): `JsonFileTaskStore` JSDoc documents the\n * single-process invariant; v0.2 SQLite covers cross-process.\n *\n * @internal\n */\n\nimport { mkdirSync, readdirSync } from \"node:fs\";\nimport { readFile, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { InvalidTaskIdError } from \"../../errors.js\";\nimport {\n isValidTaskId,\n type TaskFilter,\n type TaskHandle,\n type TaskState,\n type TaskStoreOptions,\n} from \"../../types/task.js\";\nimport { atomicWriteText } from \"../persistence/atomic-write.js\";\n\nconst JSON_LOAD_CAP = 256;\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Storage interface used by `TaskRegistry`. */\nexport interface TaskStore {\n insert(handle: TaskHandle): Promise<void>;\n update(id: string, mutate: (h: TaskHandle) => TaskHandle): Promise<TaskHandle | undefined>;\n get(id: string): Promise<TaskHandle | undefined>;\n /**\n * Returns at most `filter.limit ?? 100` matching handles. JsonFile\n * backend hard-caps loaded entries at 256 — callers needing larger\n * pages must use `submittedBefore` to walk the timeline.\n */\n list(filter: TaskFilter): Promise<TaskHandle[]>;\n delete(id: string): Promise<boolean>;\n /** Removes terminal handles whose terminal-timestamp is older than `epochMs`. */\n evictTerminalOlderThan(epochMs: number): Promise<number>;\n}\n\nfunction assertValidIdForStore(id: string): void {\n if (!isValidTaskId(id, /* allowReserved */ true)) {\n throw new InvalidTaskIdError(`store rejects invalid task id: ${id}`, id);\n }\n}\n\nfunction terminalTimestamp(h: TaskHandle): number | undefined {\n if (h.state === \"finished\") return h.finishedAt;\n if (h.state === \"error\") return h.erroredAt;\n if (h.state === \"cancelled\") return h.cancelledAt;\n return undefined;\n}\n\nfunction isTerminal(state: TaskState): boolean {\n return state === \"finished\" || state === \"error\" || state === \"cancelled\";\n}\n\nfunction matchesState(h: TaskHandle, filter: TaskFilter): boolean {\n if (filter.state === undefined) return true;\n const states = Array.isArray(filter.state) ? filter.state : [filter.state];\n return states.includes(h.state);\n}\nfunction matchesKind(h: TaskHandle, filter: TaskFilter): boolean {\n if (filter.kind === undefined) return true;\n const kinds = Array.isArray(filter.kind) ? filter.kind : [filter.kind];\n return kinds.includes(h.kind);\n}\nfunction matchesTime(h: TaskHandle, filter: TaskFilter): boolean {\n if (filter.submittedAfter !== undefined && h.submittedAt <= filter.submittedAfter) return false;\n if (filter.submittedBefore !== undefined && h.submittedAt >= filter.submittedBefore) return false;\n return true;\n}\nfunction matchesFilter(h: TaskHandle, filter: TaskFilter): boolean {\n return matchesState(h, filter) && matchesKind(h, filter) && matchesTime(h, filter);\n}\n\nfunction applyFilter(values: Iterable<TaskHandle>, filter: TaskFilter): TaskHandle[] {\n const limit = filter.limit ?? DEFAULT_LIST_LIMIT;\n const out: TaskHandle[] = [];\n for (const h of values) {\n if (matchesFilter(h, filter)) {\n out.push(h);\n if (out.length >= limit) break;\n }\n }\n return out;\n}\n\n/* ─── InMemory ─── */\n\nexport class InMemoryTaskStore implements TaskStore {\n private readonly map = new Map<string, TaskHandle>();\n\n async insert(handle: TaskHandle): Promise<void> {\n assertValidIdForStore(handle.id);\n this.map.set(handle.id, handle);\n }\n\n async update(id: string, mutate: (h: TaskHandle) => TaskHandle): Promise<TaskHandle | undefined> {\n assertValidIdForStore(id);\n const existing = this.map.get(id);\n if (existing === undefined) return undefined;\n const next = mutate(existing);\n this.map.set(id, next);\n return next;\n }\n\n async get(id: string): Promise<TaskHandle | undefined> {\n assertValidIdForStore(id);\n return this.map.get(id);\n }\n\n async list(filter: TaskFilter): Promise<TaskHandle[]> {\n return applyFilter(this.map.values(), filter);\n }\n\n async delete(id: string): Promise<boolean> {\n assertValidIdForStore(id);\n return this.map.delete(id);\n }\n\n async evictTerminalOlderThan(epochMs: number): Promise<number> {\n let count = 0;\n for (const [id, h] of this.map.entries()) {\n if (!isTerminal(h.state)) continue;\n const ts = terminalTimestamp(h);\n if (ts !== undefined && ts < epochMs) {\n this.map.delete(id);\n count++;\n }\n }\n return count;\n }\n}\n\n/* ─── JsonFile (opt-in) ───\n *\n * IMPORTANT (EC-15): `JsonFileTaskStore` is **single-process**.\n * Concurrent writers from multiple Node processes against the same\n * directory may corrupt entries (atomic-write protects per-file, but\n * the `list()` scan + `update()` read-modify-write cycle is not\n * serialised across processes). Use only when the `TaskRegistry`\n * runs in exactly one process. v0.2 will add a SQLite backend with\n * the same interface for cross-process scenarios (D364 + D61).\n */\nexport class JsonFileTaskStore implements TaskStore {\n constructor(private readonly dir: string) {\n // EC-1: idempotent mkdir; ignore EEXIST.\n try {\n mkdirSync(dir, { recursive: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n }\n }\n\n private filePath(id: string): string {\n return join(this.dir, `${id}.json`);\n }\n\n async insert(handle: TaskHandle): Promise<void> {\n assertValidIdForStore(handle.id);\n await atomicWriteText(this.filePath(handle.id), JSON.stringify(handle));\n }\n\n async update(id: string, mutate: (h: TaskHandle) => TaskHandle): Promise<TaskHandle | undefined> {\n assertValidIdForStore(id);\n const existing = await this.get(id);\n if (existing === undefined) return undefined;\n const next = mutate(existing);\n await atomicWriteText(this.filePath(id), JSON.stringify(next));\n return next;\n }\n\n async get(id: string): Promise<TaskHandle | undefined> {\n assertValidIdForStore(id);\n try {\n const raw = await readFile(this.filePath(id), \"utf8\");\n return JSON.parse(raw) as TaskHandle;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return undefined;\n // Corrupt JSON or other I/O error — log + degrade gracefully (D50/EC-7 cache pattern).\n process.stderr.write(`[task-store] failed to read ${id}: ${(err as Error).message}\\n`);\n return undefined;\n }\n }\n\n async list(filter: TaskFilter): Promise<TaskHandle[]> {\n let entries: string[];\n try {\n entries = readdirSync(this.dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return []; // EC-6\n throw err;\n }\n // EC-8: skip orphan .tmp files left by interrupted atomic writes.\n const candidates = entries\n .filter((name) => name.endsWith(\".json\") && !name.includes(\".tmp\"))\n .slice(0, JSON_LOAD_CAP);\n\n const loaded = await Promise.all(\n candidates.map(async (name) => {\n const id = name.slice(0, -\".json\".length);\n if (!isValidTaskId(id, true)) return undefined;\n return this.get(id);\n }),\n );\n const handles = loaded.filter((h): h is TaskHandle => h !== undefined);\n return applyFilter(handles, filter);\n }\n\n async delete(id: string): Promise<boolean> {\n assertValidIdForStore(id);\n try {\n await unlink(this.filePath(id));\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw err;\n }\n }\n\n async evictTerminalOlderThan(epochMs: number): Promise<number> {\n const handles = await this.list({ state: [\"finished\", \"error\", \"cancelled\"], limit: 256 });\n let count = 0;\n for (const h of handles) {\n const ts = terminalTimestamp(h);\n if (ts !== undefined && ts < epochMs) {\n if (await this.delete(h.id)) count++;\n }\n }\n return count;\n }\n}\n\n/** Factory used by `TaskRegistry.configure` (D364). */\nexport function getTaskStoreFor(options: TaskStoreOptions): TaskStore {\n if (options.backend === \"memory\") return new InMemoryTaskStore();\n return new JsonFileTaskStore(options.dir);\n}\n","/**\n * `subscribe(id)` — emits the per-task event stream (D372 ring buffer\n * + live tail). The returned AsyncIterable implements `return()` for\n * leak-free cleanup (EC-10).\n *\n * @internal\n */\n\nimport { TaskNotFoundError } from \"../../errors.js\";\nimport { isValidTaskId, type TaskEvent } from \"../../types/task.js\";\nimport type { RingBuffer } from \"./ring-buffer.js\";\n\nexport interface SubscribeDeps {\n getBuffer(id: string): RingBuffer<TaskEvent> | undefined;\n getOrCreateSubscriberSet(id: string): Set<(e: TaskEvent) => void>;\n removeSubscriber(id: string, cb: (e: TaskEvent) => void): void;\n}\n\nfunction isTerminalEvent(event: TaskEvent): boolean {\n return event.type === \"finished\" || event.type === \"errored\" || event.type === \"cancelled\";\n}\n\nfunction drainBuffered(buffer: RingBuffer<TaskEvent>): TaskEvent[] {\n const { items, truncated } = buffer.drain();\n const queue = items.slice();\n if (truncated && queue.length > 0) {\n const first = queue[0];\n if (first !== undefined && first.type === \"submitted\") {\n queue[0] = { ...first, truncated: true } satisfies TaskEvent;\n }\n }\n return queue;\n}\n\nclass TaskIterator implements AsyncIterator<TaskEvent> {\n private readonly queue: TaskEvent[];\n private pendingResolve?: (v: IteratorResult<TaskEvent>) => void;\n private done = false;\n private readonly callback: (e: TaskEvent) => void;\n\n constructor(\n buffer: RingBuffer<TaskEvent>,\n private readonly id: string,\n private readonly deps: SubscribeDeps,\n ) {\n this.queue = drainBuffered(buffer);\n this.callback = (e) => this.deliver(e);\n deps.getOrCreateSubscriberSet(id).add(this.callback);\n }\n\n private deliver(e: TaskEvent): void {\n if (this.done) return;\n if (this.pendingResolve !== undefined) {\n const r = this.pendingResolve;\n this.pendingResolve = undefined;\n r({ value: e, done: false });\n } else {\n this.queue.push(e);\n }\n }\n\n private cleanup(): void {\n if (this.done) return;\n this.done = true;\n this.deps.removeSubscriber(this.id, this.callback);\n if (this.pendingResolve !== undefined) {\n const r = this.pendingResolve;\n this.pendingResolve = undefined;\n r({ value: undefined, done: true });\n }\n }\n\n private dequeue(): IteratorResult<TaskEvent> | undefined {\n const event = this.queue.shift();\n if (event === undefined) return undefined;\n if (isTerminalEvent(event)) queueMicrotask(() => this.cleanup());\n return { value: event, done: false };\n }\n\n next(): Promise<IteratorResult<TaskEvent>> {\n if (this.done) return Promise.resolve({ value: undefined, done: true });\n const queued = this.dequeue();\n if (queued !== undefined) return Promise.resolve(queued);\n return new Promise((resolve) => {\n this.pendingResolve = resolve;\n });\n }\n\n return(): Promise<IteratorResult<TaskEvent>> {\n this.cleanup();\n return Promise.resolve({ value: undefined, done: true });\n }\n}\n\nexport function buildSubscribe(deps: SubscribeDeps) {\n return function subscribe(id: string): AsyncIterable<TaskEvent> {\n if (!isValidTaskId(id, true)) throw new TaskNotFoundError(id);\n const buffer = deps.getBuffer(id);\n if (buffer === undefined) throw new TaskNotFoundError(id);\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<TaskEvent> {\n return new TaskIterator(buffer, id, deps);\n },\n };\n };\n}\n","/**\n * Shared OTel tracer loader (extracted to eliminate cross-module clones —\n * was previously inlined in cache/, workflow/, eval/, handoff/ telemetry\n * modules). Lazy-loads `@opentelemetry/api` via `createRequire`; users\n * without OTel installed pay zero cost.\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\nexport interface SpanLike {\n setAttribute(key: string, value: string | number | boolean): SpanLike;\n end(): void;\n}\n\nexport const noopSpan: SpanLike = {\n setAttribute: () => noopSpan,\n end: () => undefined,\n};\n\nexport interface TracerLike {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): SpanLike;\n}\n\ninterface CacheEntry {\n tracer: TracerLike | null;\n}\n\nconst tracerCache = new Map<string, CacheEntry>();\n\nexport function getTracer(name: string, version = \"1.0.0\"): TracerLike | undefined {\n const cached = tracerCache.get(name);\n if (cached !== undefined) return cached.tracer ?? undefined;\n try {\n const r = createRequire(import.meta.url);\n const otel = r(\"@opentelemetry/api\") as {\n trace?: { getTracer: (n: string, v?: string) => TracerLike };\n };\n if (otel.trace?.getTracer === undefined) {\n tracerCache.set(name, { tracer: null });\n return undefined;\n }\n const tracer = otel.trace.getTracer(name, version);\n tracerCache.set(name, { tracer });\n return tracer;\n } catch {\n tracerCache.set(name, { tracer: null });\n return undefined;\n }\n}\n\nexport function resetTracerCacheForTests(): void {\n tracerCache.clear();\n}\n","/**\n * OTel telemetry for the Task registry (ADR D371).\n *\n * Spans:\n * - `task.submit` — short-lived span around the submit + insert.\n * - `task.transition` — per state transition (attrs: from / to).\n * - `task.cancel` — invoked from `Task.cancel` or via cancelRequested honor.\n *\n * Uses the existing tracer seam (D34); when OTel is absent, every helper\n * returns the shared no-op span. No new peer deps.\n *\n * @internal\n */\n\nimport { getTracer, noopSpan, type SpanLike } from \"../observability/tracer-loader.js\";\n\nconst TRACER_NAME = \"@theokit/sdk/task\";\n\nexport function startTaskSubmitSpan(info: { taskId: string; kind: string }): SpanLike {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return noopSpan;\n return tracer.startSpan(\"task.submit\", {\n attributes: {\n \"task.id\": info.taskId,\n \"task.kind\": info.kind,\n },\n });\n}\n\nexport function startTaskTransitionSpan(info: {\n taskId: string;\n from: string;\n to: string;\n}): SpanLike {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return noopSpan;\n return tracer.startSpan(\"task.transition\", {\n attributes: {\n \"task.id\": info.taskId,\n \"task.state.from\": info.from,\n \"task.state.to\": info.to,\n },\n });\n}\n\nexport function startTaskCancelSpan(info: {\n taskId: string;\n reason?: string;\n via: \"api\" | \"cancelRequested\";\n}): SpanLike {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return noopSpan;\n return tracer.startSpan(\"task.cancel\", {\n attributes: {\n \"task.id\": info.taskId,\n \"task.cancel.via\": info.via,\n ...(info.reason !== undefined ? { \"task.cancel.reason\": info.reason } : {}),\n },\n });\n}\n","/**\n * `TaskRegistry` — the singleton coordinating Task submit/list/get/cancel/\n * subscribe. Wraps the pluggable `TaskStore` (D364), the `AsyncSemaphore`\n * (D135 / D369) and a per-task `RingBuffer<TaskEvent>` (D372) for\n * late-attach replay.\n *\n * Edge cases absorbed:\n * - EC-3: work-fn invocation goes through `Promise.resolve().then(...)`\n * so synchronous throws become rejected promises.\n * - EC-4: pre-aborted signal short-circuits to `cancelled` without\n * acquiring a semaphore slot.\n * - EC-7: cross-process cancel via the `cancelRequested` flag on\n * `TaskHandle`. Registry polls at start + each progress event.\n * - EC-9: store-update failures are caught + logged; the event is\n * still emitted so subscribers always observe a terminal event.\n * - EC-10: subscribe iterator implements `return()` for leak-free\n * cleanup.\n * - EC-11: reentrant submit (work-fn calling `Task.submit`) uses an\n * ALS marker to bypass the semaphore queue, avoiding deadlock under\n * low concurrency caps.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { InvalidTaskIdError } from \"../../errors.js\";\nimport {\n isValidTaskId,\n type TaskCancelResult,\n type TaskEvent,\n type TaskFilter,\n type TaskHandle,\n type TaskKind,\n type TaskState,\n type TaskStoreOptions,\n} from \"../../types/task.js\";\nimport { type AsyncSemaphore, createSemaphore } from \"../runtime/async-semaphore.js\";\nimport { RingBuffer } from \"./ring-buffer.js\";\nimport { getTaskStoreFor, InMemoryTaskStore, type TaskStore } from \"./store.js\";\nimport { buildSubscribe } from \"./subscribe.js\";\nimport { startTaskCancelSpan, startTaskSubmitSpan, startTaskTransitionSpan } from \"./telemetry.js\";\n\nconst DEFAULT_CONCURRENCY = 8;\nconst DEFAULT_RETENTION_MS = 60 * 60 * 1000;\nconst EVICTION_INTERVAL_MS = 5 * 60 * 1000;\nconst RING_CAP = 64;\n\n/** EC-11 — ALS flag indicating we are inside a task work-fn. Reentrant submits bypass the semaphore. */\nconst reentryAls = new AsyncLocalStorage<boolean>();\n\nexport interface TaskRegistryOptions {\n readonly store?: TaskStoreOptions;\n readonly maxConcurrent?: number;\n readonly retentionMs?: number;\n}\n\nexport interface TaskWorkContext {\n readonly signal: AbortSignal;\n emit(payload: unknown): void;\n}\n\ntype WorkFn<T> = (ctx: TaskWorkContext) => Promise<T> | T;\n\ninterface InternalState {\n readonly store: TaskStore;\n readonly semaphore: AsyncSemaphore;\n readonly aborters: Map<string, AbortController>;\n readonly buffers: Map<string, RingBuffer<TaskEvent>>;\n readonly subscribers: Map<string, Set<(e: TaskEvent) => void>>;\n retentionMs: number;\n evictTimer?: NodeJS.Timeout;\n firstSubmitSeen: boolean;\n}\n\nfunction buildState(opts: TaskRegistryOptions): InternalState {\n const store = opts.store === undefined ? new InMemoryTaskStore() : getTaskStoreFor(opts.store);\n return {\n store,\n semaphore: createSemaphore(opts.maxConcurrent ?? DEFAULT_CONCURRENCY),\n aborters: new Map(),\n buffers: new Map(),\n subscribers: new Map(),\n retentionMs: opts.retentionMs ?? DEFAULT_RETENTION_MS,\n firstSubmitSeen: false,\n };\n}\n\nlet state: InternalState = buildState({});\n\nexport function __resetTaskRegistryForTests(): void {\n if (state.evictTimer !== undefined) clearInterval(state.evictTimer);\n state = buildState({});\n}\n\nexport function __getSubscribersCountForTests(taskId: string): number {\n return state.subscribers.get(taskId)?.size ?? 0;\n}\n\nexport function __getCancelRequestedForTests(_taskId: string): boolean | undefined {\n // Best-effort: only meaningful for backends that persist the flag.\n // For in-memory check via store read.\n return undefined;\n}\n\nexport function configure(opts: TaskRegistryOptions): void {\n if (state.firstSubmitSeen) {\n process.stderr.write(\n \"[task] configure() ignored — registry already in use; reset via __resetTaskRegistryForTests()\\n\",\n );\n return;\n }\n if (state.evictTimer !== undefined) clearInterval(state.evictTimer);\n state = buildState(opts);\n}\n\nfunction emitToSubscribers(taskId: string, event: TaskEvent): void {\n const buffer = state.buffers.get(taskId);\n if (buffer !== undefined) buffer.push(event);\n const subs = state.subscribers.get(taskId);\n if (subs === undefined) return;\n for (const cb of subs) {\n try {\n cb(event);\n } catch (err) {\n process.stderr.write(`[task] subscriber threw: ${(err as Error).message}\\n`);\n }\n }\n}\n\nasync function safeUpdate(\n taskId: string,\n mutate: (h: TaskHandle) => TaskHandle,\n): Promise<TaskHandle | undefined> {\n try {\n return await state.store.update(taskId, mutate);\n } catch (err) {\n // EC-9: store failure should not swallow the event.\n process.stderr.write(`[task] store.update failed for ${taskId}: ${(err as Error).message}\\n`);\n return undefined;\n }\n}\n\nfunction startEvictTimerIfNeeded(): void {\n if (state.evictTimer !== undefined) return;\n state.evictTimer = setInterval(() => {\n const cutoff = Date.now() - state.retentionMs;\n void state.store\n .evictTerminalOlderThan(cutoff)\n .then((count) => {\n if (count === 0) return;\n // Also drop buffers + subscribers for evicted tasks. We don't\n // know which ones were dropped — clean up any task whose store\n // entry is gone.\n for (const id of state.buffers.keys()) {\n void state.store.get(id).then((h) => {\n if (h === undefined) {\n state.buffers.delete(id);\n state.subscribers.delete(id);\n state.aborters.delete(id);\n }\n });\n }\n })\n .catch(() => {\n /* swallow timer errors */\n });\n }, EVICTION_INTERVAL_MS).unref();\n}\n\nfunction buildSubmittedEvent(handle: TaskHandle): TaskEvent {\n return {\n type: \"submitted\",\n taskId: handle.id,\n kind: handle.kind,\n submittedAt: handle.submittedAt,\n ...(handle.meta !== undefined ? { meta: handle.meta } : {}),\n };\n}\n\nfunction _resolveId(rawId: string | undefined, kind: TaskKind): string {\n if (rawId === undefined) return randomUUID();\n const allowReserved = kind !== \"custom\" && kind !== \"run\";\n // For \"run\" we want to allow user-supplied IDs only — adapter wrapping\n // happens via batch/workflow/cron, which pass their own prefixed IDs.\n if (!isValidTaskId(rawId, allowReserved)) {\n throw new InvalidTaskIdError(`invalid task id: ${rawId}`, rawId);\n }\n return rawId;\n}\n\nasync function shortCircuitAborted(handle: TaskHandle, signal: AbortSignal): Promise<TaskHandle> {\n // EC-4: pre-aborted signal — skip queue/semaphore.\n const cancelled: TaskHandle = {\n ...handle,\n state: \"cancelled\",\n cancelledAt: Date.now(),\n };\n await state.store.insert(cancelled);\n state.buffers.set(handle.id, new RingBuffer(RING_CAP));\n emitToSubscribers(handle.id, buildSubmittedEvent(cancelled));\n emitToSubscribers(handle.id, {\n type: \"cancelled\",\n taskId: handle.id,\n cancelledAt: cancelled.cancelledAt ?? Date.now(),\n reason: signal.reason instanceof Error ? signal.reason.message : \"pre-aborted\",\n });\n return cancelled;\n}\n\nasync function transition<T extends TaskState>(\n taskId: string,\n next: T,\n patch: Partial<TaskHandle>,\n): Promise<void> {\n const before = await state.store.get(taskId);\n const span = startTaskTransitionSpan({\n taskId,\n from: before?.state ?? \"unknown\",\n to: next,\n });\n try {\n await safeUpdate(taskId, (h) => ({ ...h, state: next, ...patch }));\n } finally {\n span.end();\n }\n}\n\ninterface SubmitInternal<T> {\n readonly kind: TaskKind;\n readonly work: WorkFn<T>;\n readonly id?: string;\n readonly meta?: Record<string, unknown>;\n readonly signal?: AbortSignal;\n /** When true (adapter-internal), the validator allows reserved prefixes. */\n readonly allowReservedPrefix?: boolean;\n}\n\nasync function buildAndInsertQueued(\n internal: SubmitInternal<unknown>,\n resolvedId: string,\n): Promise<TaskHandle> {\n const submittedAt = Date.now();\n const handle: TaskHandle = {\n id: resolvedId,\n kind: internal.kind,\n state: \"queued\",\n submittedAt,\n ...(internal.meta !== undefined ? { meta: internal.meta } : {}),\n };\n await state.store.insert(handle);\n state.buffers.set(resolvedId, new RingBuffer(RING_CAP));\n emitToSubscribers(resolvedId, buildSubmittedEvent(handle));\n return handle;\n}\n\nfunction resolveIdInternal(internal: SubmitInternal<unknown>): string {\n if (internal.id === undefined) return randomUUID();\n if (!isValidTaskId(internal.id, internal.allowReservedPrefix ?? false)) {\n throw new InvalidTaskIdError(`invalid task id: ${internal.id}`, internal.id);\n }\n return internal.id;\n}\n\nasync function runWorkAndFinalize<T>(\n taskId: string,\n aborter: AbortController,\n work: WorkFn<T>,\n): Promise<void> {\n const ctx: TaskWorkContext = {\n signal: aborter.signal,\n emit(payload) {\n // EC-7: check cancelRequested at every progress checkpoint.\n void checkCancelRequestedAt(taskId, aborter);\n emitToSubscribers(taskId, {\n type: \"progress\",\n taskId,\n at: Date.now(),\n payload,\n });\n },\n };\n\n try {\n const result = await reentryAls.run(true, () => Promise.resolve().then(() => work(ctx)));\n if (aborter.signal.aborted) {\n const cancelledAt = Date.now();\n await transition(taskId, \"cancelled\", { cancelledAt });\n emitToSubscribers(taskId, { type: \"cancelled\", taskId, cancelledAt });\n return;\n }\n const finishedAt = Date.now();\n await transition(taskId, \"finished\", { finishedAt, result });\n emitToSubscribers(taskId, { type: \"finished\", taskId, finishedAt, result });\n } catch (err) {\n if (aborter.signal.aborted) {\n const cancelledAt = Date.now();\n await transition(taskId, \"cancelled\", { cancelledAt });\n emitToSubscribers(taskId, { type: \"cancelled\", taskId, cancelledAt });\n return;\n }\n const erroredAt = Date.now();\n const error =\n err instanceof Error\n ? { code: (err as { code?: string }).code ?? \"work_threw\", message: err.message }\n : { code: \"work_threw\", message: String(err) };\n await transition(taskId, \"error\", { erroredAt, error });\n emitToSubscribers(taskId, { type: \"errored\", taskId, erroredAt, error });\n }\n}\n\nasync function checkCancelRequestedAt(taskId: string, aborter: AbortController): Promise<void> {\n if (aborter.signal.aborted) return;\n try {\n const handle = await state.store.get(taskId);\n if (handle?.cancelRequested === true) {\n aborter.abort(\"cancelRequested\");\n }\n } catch {\n /* ignore — best-effort poll */\n }\n}\n\nasync function acquireSlot(): Promise<() => void> {\n if (reentryAls.getStore() === true) {\n // EC-11: reentrant submit bypasses the queue.\n return () => {\n /* no-op */\n };\n }\n return state.semaphore.acquire();\n}\n\n/**\n * Submit a task. Validates id (D368, EC-5 via allowReservedPrefix),\n * handles pre-aborted signals (EC-4), enforces single-flight by id\n * (D367), runs work under semaphore (D369/EC-11 reentrant bypass),\n * and produces the canonical event stream (D366).\n */\nexport async function submit<T>(internal: SubmitInternal<T>): Promise<TaskHandle> {\n state.firstSubmitSeen = true;\n startEvictTimerIfNeeded();\n\n const resolvedId = resolveIdInternal(internal);\n const submitSpan = startTaskSubmitSpan({ taskId: resolvedId, kind: internal.kind });\n\n // D367 single-flight.\n const existing = await state.store.get(resolvedId);\n if (existing !== undefined) {\n submitSpan.end();\n return existing;\n }\n\n const queuedHandle = await buildAndInsertQueued(internal, resolvedId);\n submitSpan.end();\n\n // EC-4: pre-aborted signal — short-circuit.\n if (internal.signal?.aborted === true) {\n return shortCircuitAborted(queuedHandle, internal.signal);\n }\n\n const aborter = new AbortController();\n state.aborters.set(resolvedId, aborter);\n if (internal.signal !== undefined) {\n internal.signal.addEventListener(\"abort\", () => aborter.abort(internal.signal?.reason), {\n once: true,\n });\n }\n\n // Fire and forget the actual run; the returned handle is the queued one.\n const release = await acquireSlot();\n void (async () => {\n try {\n // Check cancelRequested before starting (EC-7).\n await checkCancelRequestedAt(resolvedId, aborter);\n if (aborter.signal.aborted) {\n const cancelledAt = Date.now();\n await transition(resolvedId, \"cancelled\", { cancelledAt });\n emitToSubscribers(resolvedId, { type: \"cancelled\", taskId: resolvedId, cancelledAt });\n return;\n }\n const startedAt = Date.now();\n await transition(resolvedId, \"running\", { startedAt });\n emitToSubscribers(resolvedId, { type: \"started\", taskId: resolvedId, startedAt });\n await runWorkAndFinalize(resolvedId, aborter, internal.work as WorkFn<unknown>);\n } finally {\n release();\n state.aborters.delete(resolvedId);\n }\n })();\n\n return queuedHandle;\n}\n\nexport async function list(filter: TaskFilter = {}): Promise<TaskHandle[]> {\n return state.store.list(filter);\n}\n\nexport async function get(id: string): Promise<TaskHandle | undefined> {\n if (!isValidTaskId(id, true)) return undefined;\n return state.store.get(id);\n}\n\nexport async function cancel(id: string, reason?: string): Promise<TaskCancelResult> {\n if (!isValidTaskId(id, true)) return { cancelled: false, alreadyTerminal: false };\n const handle = await state.store.get(id);\n if (handle === undefined) return { cancelled: false, alreadyTerminal: false };\n if (handle.state === \"finished\" || handle.state === \"error\" || handle.state === \"cancelled\") {\n return { cancelled: false, alreadyTerminal: true };\n }\n const span = startTaskCancelSpan({\n taskId: id,\n ...(reason !== undefined ? { reason } : {}),\n via: \"api\",\n });\n try {\n return await cancelInternal(id, handle.state, reason);\n } finally {\n span.end();\n }\n}\n\nasync function cancelInternal(\n id: string,\n currentState: TaskState,\n reason?: string,\n): Promise<TaskCancelResult> {\n if (currentState === \"queued\") {\n const cancelledAt = Date.now();\n await transition(id, \"cancelled\", { cancelledAt });\n emitToSubscribers(id, {\n type: \"cancelled\",\n taskId: id,\n cancelledAt,\n ...(reason !== undefined ? { reason } : {}),\n });\n state.aborters.delete(id);\n return { cancelled: true, alreadyTerminal: false };\n }\n // running: trigger AbortController; runWorkAndFinalize handles the transition.\n const aborter = state.aborters.get(id);\n if (aborter !== undefined) aborter.abort(reason ?? \"cancelled\");\n return { cancelled: true, alreadyTerminal: false };\n}\n\nexport const subscribe = buildSubscribe({\n getBuffer: (id) => state.buffers.get(id),\n getOrCreateSubscriberSet: (id) => {\n let subs = state.subscribers.get(id);\n if (subs === undefined) {\n subs = new Set();\n state.subscribers.set(id, subs);\n }\n return subs;\n },\n removeSubscriber: (id, cb) => {\n const set = state.subscribers.get(id);\n set?.delete(cb);\n if (set !== undefined && set.size === 0) state.subscribers.delete(id);\n },\n});\n\n/** Manual trigger for tests. */\nexport async function evictNow(now: number = Date.now()): Promise<number> {\n return state.store.evictTerminalOlderThan(now - state.retentionMs);\n}\n","/**\n * Zod → JSON Schema universal adapter (FAANG-grade, supports Zod 3 + Zod 4).\n *\n * The SDK declares `zod: \"^3.25.0 || ^4.0.0\"` as optional peer. Implementation\n * MUST work on both versions or the peer-range claim is false.\n *\n * Strategy:\n * 1. Feature-detect Zod 4's native `z.toJSONSchema` (preferred — zero extra\n * dep, ships with Zod 4 core).\n * 2. Fall back to the universal `zod-to-json-schema` library (works for both\n * v3 and v4; ~5KB gzipped, optional peer dep).\n * 3. If neither path resolves, throw an actionable error explaining the\n * install command for the user's Zod major.\n *\n * Output shape is identical across paths: a `Record<string, unknown>` JSON\n * Schema document with `type: \"object\"` root that the LLM tool-use spec\n * accepts unchanged.\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\ntype AnyZodSchema = unknown;\n\ninterface ToJsonSchemaOptions {\n /** Zod 4 option: `\"any\"` keeps transforms/refinements as `{}` (loose). */\n unrepresentable?: \"any\" | \"throw\";\n}\n\nconst requireSdk = createRequire(import.meta.url);\n\nlet cachedZodHasNativeApi: boolean | undefined;\nlet cachedFallbackLib: ((schema: AnyZodSchema) => unknown) | undefined;\nlet triedFallback = false;\n\n/**\n * Convert any Zod schema (v3 or v4) to a JSON Schema object. Feature-detects\n * the native Zod 4 API first; falls back to `zod-to-json-schema` lib on v3.\n *\n * @internal\n */\nexport function toJsonSchema(\n schema: AnyZodSchema,\n options: ToJsonSchemaOptions = { unrepresentable: \"any\" },\n): Record<string, unknown> {\n const native = tryNativeZod4(schema, options);\n if (native !== undefined) return native;\n const fallback = tryFallbackLib(schema);\n if (fallback !== undefined) return fallback;\n throw new Error(\n \"Zod → JSON Schema conversion failed: neither Zod 4's native `z.toJSONSchema` \" +\n \"nor the `zod-to-json-schema` peer dep are available. \" +\n \"On Zod 4: ensure `zod >= 4.0.0` is installed. \" +\n 'On Zod 3: add `\"zod-to-json-schema\": \"^3.24.0\"` to your package.json.',\n );\n}\n\nfunction tryNativeZod4(\n schema: AnyZodSchema,\n options: ToJsonSchemaOptions,\n): Record<string, unknown> | undefined {\n if (cachedZodHasNativeApi === false) return undefined;\n let z: { toJSONSchema?: (s: unknown, o?: unknown) => unknown };\n try {\n z = requireSdk(\"zod\") as typeof z;\n } catch {\n cachedZodHasNativeApi = false;\n return undefined;\n }\n if (typeof z.toJSONSchema !== \"function\") {\n cachedZodHasNativeApi = false;\n return undefined;\n }\n // Cross-version safety net: when the SDK source runs under a dev-server\n // (Vite SSR), `requireSdk(\"zod\")` resolves to the SDK's OWN node_modules\n // (zod 4 in our devDeps), while the schema was built by the CONSUMER's\n // zod (often v3 — see dogfood-app pinned to ^3.25.0). Calling zod 4's\n // `toJSONSchema` with a zod 3 schema throws. Catch + fall through to\n // `zod-to-json-schema` (which understands both v3 and v4 schemas).\n try {\n return z.toJSONSchema(schema, options) as Record<string, unknown>;\n } catch {\n cachedZodHasNativeApi = false;\n return undefined;\n }\n}\n\nfunction tryFallbackLib(schema: AnyZodSchema): Record<string, unknown> | undefined {\n if (cachedFallbackLib !== undefined) {\n return cachedFallbackLib(schema) as Record<string, unknown>;\n }\n if (triedFallback) return undefined;\n triedFallback = true;\n try {\n // `zod-to-json-schema` exports the converter as default OR as named export\n // `zodToJsonSchema` depending on module shape. Probe both.\n const mod = requireSdk(\"zod-to-json-schema\") as {\n default?: (s: unknown) => unknown;\n zodToJsonSchema?: (s: unknown) => unknown;\n };\n const fn =\n typeof mod.zodToJsonSchema === \"function\"\n ? mod.zodToJsonSchema\n : typeof mod.default === \"function\"\n ? mod.default\n : undefined;\n if (fn === undefined) return undefined;\n cachedFallbackLib = fn as (s: AnyZodSchema) => unknown;\n return fn(schema) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Test-only reset (clears the version-detection cache so tests can simulate\n * a different Zod major).\n *\n * @internal\n */\nexport function _resetZodToJsonSchemaCache(): void {\n cachedZodHasNativeApi = undefined;\n cachedFallbackLib = undefined;\n triedFallback = false;\n}\n","import { createRequire } from \"node:module\";\nimport type { z as ZodNamespace, ZodType } from \"zod\";\nimport { ConfigurationError } from \"../errors.js\";\n\nimport type { AgentOptions, CustomTool, LocalOptions, ModelSelection } from \"../types/agent.js\";\nimport type { ProviderRoutingSettings } from \"../types/providers.js\";\nimport { toJsonSchema } from \"./zod/to-json-schema.js\";\n\n/**\n * Shared helpers for `Agent.generateObject` (ADR D33) and\n * `Agent.streamObject` (ADR D39). Both build a transient agent with a\n * single synthetic `output` tool whose handler captures the model's\n * structured response.\n *\n * Extracted from inline duplicates to keep jscpd quiet AND to keep the\n * two public APIs in lockstep.\n *\n * @internal\n */\n\nlet cachedZ: typeof ZodNamespace | undefined;\n\n/**\n * Load Zod via createRequire (it's an optional peer dep). Throws a typed\n * ConfigurationError if Zod isn't installed.\n */\nexport function requireZod(): typeof ZodNamespace {\n if (cachedZ !== undefined) return cachedZ;\n const r = createRequire(import.meta.url);\n let mod: { z?: typeof ZodNamespace } & typeof ZodNamespace;\n try {\n mod = r(\"zod\") as typeof mod;\n } catch (cause) {\n throw new ConfigurationError(\n \"Structured output requires the optional peer dependency `zod`. \" +\n 'Add `\"zod\": \"^3.25.0 || ^4.0.0\"` to your package.json and reinstall.',\n { code: \"zod_not_installed\", cause },\n );\n }\n cachedZ = (mod.z ?? mod) as typeof ZodNamespace;\n return cachedZ;\n}\n\n/**\n * Build the synthetic `output` tool used by both `generateObject` and\n * `streamObject`. The handler captures the raw input on first call only\n * (EC-D10 / EC-6: parallel tool use in Claude 3.5+ may invoke `output`\n * twice; later calls are ignored).\n */\nexport function makeOutputTool(\n jsonSchema: Record<string, unknown>,\n onCapture: (input: unknown) => string | Promise<string> | undefined,\n): CustomTool {\n return {\n name: \"output\",\n description: \"Call this tool with your final structured answer. Match the JSON schema exactly.\",\n inputSchema: jsonSchema,\n handler: (input) => {\n const out = onCapture(input);\n // Some callers throw a sentinel (generate-object) and never return.\n // Others return a string (stream-object). Anything else → empty string.\n if (typeof out === \"string\") return out;\n if (out instanceof Promise) return out;\n return \"\";\n },\n };\n}\n\n/**\n * Assemble the AgentOptions for the transient agent. Shared shape:\n * model + local + tools[output] + systemPrompt + apiKey.\n */\nexport function buildTransientAgentOptions(params: {\n model: ModelSelection;\n local: LocalOptions;\n outputTool: CustomTool;\n systemPrompt?: string;\n apiKey?: string;\n providers?: ProviderRoutingSettings;\n}): AgentOptions {\n return {\n model: params.model,\n local: params.local,\n tools: [params.outputTool],\n systemPrompt:\n params.systemPrompt ??\n \"You produce structured output by calling the `output` tool exactly once. Match the JSON schema.\",\n ...(params.apiKey !== undefined ? { apiKey: params.apiKey } : {}),\n ...(params.providers !== undefined ? { providers: params.providers } : {}),\n };\n}\n\n/**\n * Best-effort extraction of token usage from a run result. Local runtimes\n * may not expose it; default to zeros.\n */\nexport function extractUsage(result: unknown): { inputTokens: number; outputTokens: number } {\n const u = (result as { usage?: { inputTokens?: number; outputTokens?: number } }).usage;\n if (u === undefined) return { inputTokens: 0, outputTokens: 0 };\n return { inputTokens: u.inputTokens ?? 0, outputTokens: u.outputTokens ?? 0 };\n}\n\n/**\n * Build the user-message prompt that instructs the model to call the\n * `output` tool with a schema-matched structured answer.\n */\nexport function buildToolPrompt(prompt: string): string {\n return `${prompt}\\n\\nRespond by calling the \\`output\\` tool with the structured answer that matches the schema.`;\n}\n\n/**\n * One-shot setup shared by both `generateObject` and `streamObject`. Loads\n * Zod, computes the JSON schema, primes the captured-raw / usage / retry\n * state. Returns the values needed by the caller's loop.\n */\nexport function setupStructuredOutput<T extends ZodType>(\n schema: T,\n maxRetries: number | undefined,\n) {\n const z = requireZod();\n // Universal Zod 3+4 conversion (feature-detects native v4, falls back to lib on v3).\n const jsonSchema = toJsonSchema(schema, { unrepresentable: \"any\" });\n return {\n z,\n jsonSchema,\n maxRetries: maxRetries ?? 1,\n initialUsage: { inputTokens: 0, outputTokens: 0 },\n };\n}\n\n/**\n * Cleanup the transient agent after generateObject/streamObject finish.\n * Disposes AND hard-deletes from the registry so the count stays stable.\n *\n * @internal\n */\nexport async function disposeAndDeleteTransient(\n agent: { dispose: () => Promise<void>; agentId: string },\n deletor: (agentId: string) => Promise<void>,\n): Promise<void> {\n await agent.dispose();\n try {\n await deletor(agent.agentId);\n } catch {\n // Best-effort cleanup.\n }\n}\n\nvoid (null as unknown as ZodType); // satisfies unused-import check\n","import type { z as ZodNamespace, ZodType } from \"zod\";\n\nimport {\n buildToolPrompt,\n buildTransientAgentOptions,\n disposeAndDeleteTransient,\n extractUsage,\n makeOutputTool,\n setupStructuredOutput,\n} from \"./internal/structured-output-helpers.js\";\nimport type { AgentOptions, LocalOptions, ModelSelection, SDKAgent } from \"./types/agent.js\";\nimport type { ProviderRoutingSettings } from \"./types/providers.js\";\n\n/**\n * Options accepted by {@link Agent.generateObject}. Returns a typed object\n * matching the supplied Zod schema. See ADR D33.\n *\n * @public\n */\nexport interface GenerateObjectOptions<T extends ZodType> {\n /** Zod schema describing the expected object shape. */\n schema: T;\n /** User prompt — the model is asked to fill the schema given this prompt. */\n prompt: string;\n /** Optional system prompt steering the model. */\n systemPrompt?: string;\n /** Model selection. Required (transient agents need a model). */\n model: ModelSelection;\n /** API key. Falls back to env (THEOKIT_API_KEY etc). */\n apiKey?: string;\n /** Local runtime config (cwd, sandbox). Required to keep the transient agent local-only. */\n local: LocalOptions;\n /**\n * Retry budget on parse failures. Default 1 (initial attempt + 1 retry).\n * The transient agent is REUSED across retries so the registry sees a\n * single entry (EC-3).\n */\n maxRetries?: number;\n /**\n * Optional provider routing forwarded to the transient agent. Required when\n * `model.id` uses a prefix (e.g. `openai/gpt-4o-mini`) but the credential is\n * for a unified gateway (e.g. OpenRouter). Without this, the SDK infers\n * provider from the prefix and may fail with `provider_unresolved` even\n * when the right env key is set under a different provider name.\n */\n providers?: ProviderRoutingSettings;\n}\n\n/**\n * Successful return from {@link Agent.generateObject}.\n *\n * @public\n */\nexport interface GenerateObjectResult<T> {\n /** Typed object parsed via the Zod schema. */\n object: T;\n /** Raw input the model passed to the synthetic tool, before Zod parse. */\n raw: unknown;\n /** Token usage of the LLM call(s) that produced the result. */\n usage: { inputTokens: number; outputTokens: number };\n /** Stop reason of the underlying agent run. */\n finishReason: \"tool_use\" | \"error\";\n}\n\n/**\n * Typed error thrown by {@link Agent.generateObject} when the model refuses\n * to call the synthetic `output` tool or when retries are exhausted.\n *\n * @public\n */\nexport class GenerateObjectError extends Error {\n override readonly name = \"GenerateObjectError\";\n readonly code: \"no_tool_call\" | \"parse_failed\";\n override readonly cause?: unknown;\n constructor(code: \"no_tool_call\" | \"parse_failed\", message: string, cause?: unknown) {\n super(message);\n this.code = code;\n if (cause !== undefined) this.cause = cause;\n }\n}\n\ninterface GenerateObjectDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n /** Hard-delete the transient agent from the registry after dispose. */\n delete: (agentId: string) => Promise<void>;\n}\n\n/**\n * Implementation of `Agent.generateObject`. Receives the `Agent.create`\n * factory as a callback to keep the dependency graph acyclic (mirrors the\n * AgentBuilder pattern in D25 / agent.ts injection).\n *\n * Algorithm:\n * 1. Convert the consumer's Zod schema to JSON Schema.\n * 2. Build a single synthetic `output` CustomTool whose handler captures\n * the raw input and short-circuits the agent loop. The handler\n * THROWS a sentinel so the loop terminates immediately without a\n * second LLM round-trip.\n * 3. Create ONE transient agent (per the entire generateObject call,\n * not per retry — EC-3). Each retry re-sends through the same agent,\n * driving fresh LLM rounds.\n * 4. On each attempt, send a wrapper prompt instructing the model to\n * call the `output` tool. Capture the raw input via the sentinel.\n * 5. Parse the raw input via schema.parse. On success, return typed.\n * On failure, retry until the budget is exhausted.\n * 6. Always dispose the transient agent in `finally`.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: retry loop + capture sentinel + dispose-and-delete is a single transaction; splitting harms locality and the finally block.\nexport async function generateObjectImpl<T extends ZodType>(\n options: GenerateObjectOptions<T>,\n deps: GenerateObjectDeps,\n): Promise<GenerateObjectResult<ZodNamespace.infer<T>>> {\n const { jsonSchema, maxRetries, initialUsage } = setupStructuredOutput(\n options.schema,\n options.maxRetries,\n );\n let capturedRaw: unknown;\n let lastUsage = initialUsage;\n const sentinel = Symbol(\"generate-object-sentinel\");\n class CaptureSentinel extends Error {\n readonly [sentinel] = true;\n constructor(public readonly captured: unknown) {\n super(\"generate-object-capture\");\n }\n }\n\n const outputTool = makeOutputTool(jsonSchema, (input) => {\n // EC-D10 (parallel tool use): first capture wins. Subsequent calls\n // in the same response are ignored.\n if (capturedRaw === undefined) {\n capturedRaw = input;\n }\n throw new CaptureSentinel(input);\n });\n\n const agentOptions: AgentOptions = buildTransientAgentOptions({\n model: options.model,\n local: options.local,\n outputTool,\n ...(options.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : {}),\n ...(options.apiKey !== undefined ? { apiKey: options.apiKey } : {}),\n ...(options.providers !== undefined ? { providers: options.providers } : {}),\n });\n const agent = await deps.create(agentOptions);\n\n try {\n const userMessage = buildToolPrompt(options.prompt);\n let lastParseError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n capturedRaw = undefined;\n const run = await agent.send(userMessage);\n const result = await run.wait();\n lastUsage = extractUsage(result);\n\n if (capturedRaw === undefined) {\n // EC: when the underlying run errored (e.g. provider_unresolved),\n // surface the original cause instead of the misleading \"model\n // returned text\" message — there was no model call at all.\n if (result.status === \"error\" && result.error !== undefined) {\n throw new GenerateObjectError(\n \"no_tool_call\",\n `Agent run failed before the model could reply: ${result.error.message ?? \"unknown error\"} [${result.error.code ?? \"?\"}]`,\n result.error,\n );\n }\n // Model didn't call the output tool.\n if (attempt === maxRetries) {\n throw new GenerateObjectError(\n \"no_tool_call\",\n \"The model returned text instead of calling the `output` tool.\",\n );\n }\n continue;\n }\n\n const parsed = options.schema.safeParse(capturedRaw);\n if (parsed.success) {\n return {\n object: parsed.data,\n raw: capturedRaw,\n usage: lastUsage,\n finishReason: \"tool_use\",\n };\n }\n lastParseError = parsed.error;\n }\n\n throw new GenerateObjectError(\n \"parse_failed\",\n \"Schema parse failed after all retries.\",\n lastParseError,\n );\n } finally {\n // EC-3: dispose AND hard-delete the transient agent so registry count\n // stays stable across retries.\n await disposeAndDeleteTransient(agent, deps.delete);\n }\n}\n","import type { z as ZodNamespace, ZodType } from \"zod\";\n\nimport {\n buildToolPrompt,\n buildTransientAgentOptions,\n disposeAndDeleteTransient,\n extractUsage,\n makeOutputTool,\n setupStructuredOutput,\n} from \"./internal/structured-output-helpers.js\";\nimport type { AgentOptions, LocalOptions, ModelSelection, SDKAgent } from \"./types/agent.js\";\nimport type { ProviderRoutingSettings } from \"./types/providers.js\";\n\n/**\n * Options accepted by {@link Agent.streamObject}. Same shape as\n * `Agent.generateObject` with the addition that the result is an\n * `AsyncIterator<StreamObjectEvent<T>>` rather than a single Promise. See ADR D39.\n *\n * @public\n */\nexport interface StreamObjectOptions<T extends ZodType> {\n schema: T;\n prompt: string;\n systemPrompt?: string;\n model: ModelSelection;\n apiKey?: string;\n local: LocalOptions;\n maxRetries?: number;\n /**\n * Optional provider routing forwarded to the transient agent. Required when\n * `model.id` uses a prefix (e.g. `openai/gpt-4o-mini`) but the credential is\n * for a unified gateway (e.g. OpenRouter). Without this, the SDK infers\n * provider from the prefix and may fail with `provider_unresolved` even\n * when the right env key is set under a different provider name.\n */\n providers?: ProviderRoutingSettings;\n}\n\n/**\n * Recursive partial — `T` where every nested field becomes optional.\n *\n * @public\n */\nexport type DeepPartial<T> = T extends (infer U)[]\n ? Array<DeepPartial<U>>\n : T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T;\n\n/**\n * Event emitted by {@link Agent.streamObject}. Discriminate on `type`.\n *\n * - `partial` events fire zero or more times with monotonically increasing\n * `attempt`, carrying best-effort schema-parsed snapshots of the model's\n * accumulating output.\n * - `complete` fires exactly once at the end, carrying the fully Zod-parsed\n * object alongside usage and finishReason — semantically identical to a\n * successful `Agent.generateObject()` return.\n *\n * @public\n */\nexport type StreamObjectEvent<T> =\n | { type: \"partial\"; partial: DeepPartial<T>; attempt: number }\n | {\n type: \"complete\";\n object: T;\n raw: unknown;\n usage: { inputTokens: number; outputTokens: number };\n finishReason: \"tool_use\" | \"error\";\n };\n\n/**\n * Error thrown by {@link Agent.streamObject} when the model refuses to call\n * the synthetic `output` tool or when all retries fail to produce a\n * schema-valid object. Same code taxonomy as `GenerateObjectError`.\n *\n * @public\n */\nexport class StreamObjectError extends Error {\n override readonly name = \"StreamObjectError\";\n readonly code: \"no_tool_call\" | \"parse_failed\";\n override readonly cause?: unknown;\n constructor(code: \"no_tool_call\" | \"parse_failed\", message: string, cause?: unknown) {\n super(message);\n this.code = code;\n if (cause !== undefined) this.cause = cause;\n }\n}\n\ninterface StreamObjectDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n delete: (agentId: string) => Promise<void>;\n}\n\n/**\n * Implementation of `Agent.streamObject` as an async generator. Mirrors the\n * synthetic-forced-tool pattern from `generate-object.ts` (ADR D33) with the\n * addition of intermediate `partial` events emitted from incremental parsing\n * of accumulating text deltas during the agent loop.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: streaming loop interleaves text-delta accumulation, partial-parse attempts, retries, and final dispose — splitting harms locality of the iterator contract.\nexport async function* streamObjectImpl<T extends ZodType>(\n options: StreamObjectOptions<T>,\n deps: StreamObjectDeps,\n): AsyncGenerator<StreamObjectEvent<ZodNamespace.infer<T>>, void, void> {\n const { jsonSchema, maxRetries, initialUsage } = setupStructuredOutput(\n options.schema,\n options.maxRetries,\n );\n let capturedRaw: unknown;\n let lastUsage = initialUsage;\n\n const outputTool = makeOutputTool(jsonSchema, (input) => {\n // EC-6: first capture wins (parallel tool use in Claude 3.5+).\n if (capturedRaw === undefined) {\n capturedRaw = input;\n }\n return JSON.stringify({ ok: true });\n });\n\n const agentOptions: AgentOptions = buildTransientAgentOptions({\n model: options.model,\n local: options.local,\n outputTool,\n ...(options.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : {}),\n ...(options.apiKey !== undefined ? { apiKey: options.apiKey } : {}),\n ...(options.providers !== undefined ? { providers: options.providers } : {}),\n });\n const agent = await deps.create(agentOptions);\n const userMessage = buildToolPrompt(options.prompt);\n\n try {\n let lastParseError: unknown;\n let attemptCounter = 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n capturedRaw = undefined;\n const run = await agent.send(userMessage);\n\n // Buffer text deltas during streaming; try partial-parse on each.\n let textBuffer = \"\";\n for await (const msg of run.stream()) {\n if (msg.type === \"assistant\") {\n const newText = msg.message.content\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n if (newText.length > 0) {\n textBuffer += newText;\n const partial = bestEffortPartialParse(textBuffer, options.schema);\n if (partial !== undefined) {\n attemptCounter += 1;\n yield {\n type: \"partial\",\n partial: partial as DeepPartial<ZodNamespace.infer<T>>,\n attempt: attemptCounter,\n };\n }\n }\n }\n }\n const result = await run.wait();\n lastUsage = extractUsage(result);\n\n if (capturedRaw === undefined) {\n // EC: when the underlying run errored (e.g. provider_unresolved),\n // surface the original cause instead of the misleading \"model\n // returned text\" message — there was no model call at all.\n if (result.status === \"error\" && result.error !== undefined) {\n throw new StreamObjectError(\n \"no_tool_call\",\n `Agent run failed before the model could reply: ${result.error.message ?? \"unknown error\"} [${result.error.code ?? \"?\"}]`,\n result.error,\n );\n }\n if (attempt === maxRetries) {\n throw new StreamObjectError(\n \"no_tool_call\",\n \"The model returned text instead of calling the `output` tool.\",\n );\n }\n continue;\n }\n\n const parsed = options.schema.safeParse(capturedRaw);\n if (parsed.success) {\n yield {\n type: \"complete\",\n object: parsed.data,\n raw: capturedRaw,\n usage: lastUsage,\n finishReason: \"tool_use\",\n };\n return;\n }\n lastParseError = parsed.error;\n }\n\n throw new StreamObjectError(\n \"parse_failed\",\n \"Schema parse failed after all retries.\",\n lastParseError,\n );\n } finally {\n // EC-4: even if consumer calls iter.return() mid-stream, this finally\n // runs — transient agent is disposed AND removed from registry.\n await disposeAndDeleteTransient(agent, deps.delete);\n }\n}\n\n/**\n * Try to extract a partial JSON object from a possibly-incomplete text\n * buffer and parse it via the schema in lenient mode. Returns `undefined`\n * if nothing parseable is found yet.\n *\n * Strategy: find the first `{`, find the LAST balanced `}` (greedy), parse\n * the substring as JSON, then `safeParse` against `schema.partial()` if the\n * schema supports it, else against the original schema.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: stateful JSON-balancing scanner — string/brace/escape state must be co-located for the parser to remain correct.\nfunction bestEffortPartialParse<T extends ZodType>(text: string, schema: T): unknown | undefined {\n const start = text.indexOf(\"{\");\n if (start < 0) return undefined;\n // Find the longest balanced JSON object from `start`.\n let depth = 0;\n let inString = false;\n let isEscaped = false;\n let end = -1;\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (isEscaped) {\n isEscaped = false;\n continue;\n }\n if (ch === \"\\\\\" && inString) {\n isEscaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n if (ch === \"{\") depth += 1;\n else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) end = i;\n }\n }\n if (end < 0) return undefined;\n const candidate = text.slice(start, end + 1);\n let parsed: unknown;\n try {\n parsed = JSON.parse(candidate);\n } catch {\n return undefined;\n }\n // Try schema.partial() if available (Zod objects support it); else fall\n // back to the original schema (loose match).\n const maybePartial = (schema as unknown as { partial?: () => ZodType }).partial;\n const looseSchema = typeof maybePartial === \"function\" ? maybePartial.call(schema) : schema;\n const result = looseSchema.safeParse(parsed);\n return result.success ? result.data : undefined;\n}\n","/**\n * `Agent.batch(prompts, options)` core (ADRs D134-D140).\n *\n * Fans out N prompts via bounded concurrency, isolates failures per-prompt,\n * preserves input order in the result array, supports streaming callbacks\n * + AbortSignal. The credential pool (D131) is shared across all\n * in-flight agents via `withCredentialPool` ALS scope (EC-A fix).\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { TheokitAgentError } from \"./errors.js\";\nimport { CredentialPool, newPooledCredential } from \"./internal/llm/credential-pool.js\";\nimport { withCredentialPool } from \"./internal/llm/credential-pool-context.js\";\nimport type { CredentialPoolStrategy } from \"./internal/llm/credential-pool-types.js\";\nimport { createSemaphore } from \"./internal/runtime/async-semaphore.js\";\nimport { get as taskRegistryGet, submit as taskRegistrySubmit } from \"./internal/task/registry.js\";\nimport type { AgentOptions, SDKAgent } from \"./types/agent.js\";\nimport type { BatchItem, BatchOptions, BatchProgress, BatchResult } from \"./types/batch.js\";\n\n/** DI contract — keeps batch.ts cycle-free from agent.ts. @internal */\ninterface BatchDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n}\n\n/**\n * Run N prompts in parallel with bounded concurrency.\n *\n * @internal\n */\nexport async function batchImpl(\n prompts: ReadonlyArray<string | BatchItem>,\n options: BatchOptions,\n deps: BatchDeps,\n): Promise<BatchResult[]> {\n // EC-1: empty array → no work, no agents created.\n if (prompts.length === 0) return [];\n\n // EC-A fix: build credential pools ONCE and share via AsyncLocalStorage.\n // Without this each Agent.create() would build its own pool from identical\n // apiKeys → 4× rate-limit wastage per concurrency window.\n const sharedPools = buildPoolsFromApiKeys(\n options.providers?.apiKeys,\n options.providers?.credentialPoolStrategy,\n );\n const exec = (): Promise<BatchResult[]> => runBatch(prompts, options, deps);\n const withPool = (): Promise<BatchResult[]> =>\n sharedPools.size > 0 ? withCredentialPool(sharedPools, exec) : exec();\n // T3.3: opt-in Task wrapping (ADRs D363, D374). Register the whole\n // batch as a single Task (kind=\"batch\") with `b-` prefix (D368/EC-5).\n if (options.task !== undefined) {\n return wrapBatchAsTask(prompts.length, options.task, withPool);\n }\n return withPool();\n}\n\nasync function wrapBatchAsTask(\n total: number,\n taskOpt: true | { id?: string; meta?: Record<string, unknown> },\n exec: () => Promise<BatchResult[]>,\n): Promise<BatchResult[]> {\n const opts = taskOpt === true ? {} : taskOpt;\n const id = opts.id ?? `b-${randomUUID()}`;\n const meta: Record<string, unknown> = {\n total,\n ...(opts.meta ?? {}),\n };\n let results: BatchResult[] = [];\n await taskRegistrySubmit({\n kind: \"batch\",\n work: async (ctx) => {\n results = await exec();\n const succeeded = results.filter((r) => r.ok).length;\n const failed = results.length - succeeded;\n ctx.emit({ total: results.length, succeeded, failed });\n return { total: results.length, succeeded, failed };\n },\n id,\n meta,\n allowReservedPrefix: true,\n });\n // submit returns immediately with a queued handle. Wait for terminal.\n for (let i = 0; i < 5000; i++) {\n const h = await taskRegistryGet(id);\n if (h?.state === \"finished\" || h?.state === \"error\" || h?.state === \"cancelled\") break;\n await new Promise((r) => setTimeout(r, 5));\n }\n return results;\n}\n\nasync function runBatch(\n prompts: ReadonlyArray<string | BatchItem>,\n options: BatchOptions,\n deps: BatchDeps,\n): Promise<BatchResult[]> {\n const requested = options.concurrency ?? 4;\n // createSemaphore throws on invalid (EC-2).\n // EC-3: cap to prompts.length to avoid idle workers.\n const effective = Math.min(requested, prompts.length);\n const semaphore = createSemaphore(effective);\n const items = prompts.map(normalizeItem);\n const results: BatchResult[] = new Array(items.length);\n const counters = { completed: 0, failed: 0 };\n let aborted = false;\n\n const onAbort = (): void => {\n aborted = true;\n };\n options.signal?.addEventListener(\"abort\", onAbort);\n // EC-C: pre-aborted signal — treat as already-aborted before any work.\n if (options.signal?.aborted === true) aborted = true;\n\n try {\n await Promise.all(\n items.map(async (item, index) => {\n const release = await semaphore.acquire();\n try {\n if (aborted) {\n results[index] = abortResult(item, index, options.signal);\n } else {\n results[index] = await runOne(item, index, options, deps);\n }\n } finally {\n release();\n }\n if (results[index].ok) counters.completed += 1;\n else counters.failed += 1;\n await safeCallResult(options.onResult, results[index]);\n safeCallProgress(options.onProgress, {\n total: items.length,\n completed: counters.completed,\n failed: counters.failed,\n inFlight: semaphore.inFlight(),\n pending: Math.max(0, semaphore.pending() - semaphore.inFlight()),\n });\n }),\n );\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n return options.filter ? results.filter(options.filter) : results;\n}\n\nasync function runOne(\n item: BatchItem,\n index: number,\n options: BatchOptions,\n deps: BatchDeps,\n): Promise<BatchResult> {\n const t0 = Date.now();\n const agentOpts = buildAgentOptions(item, options);\n\n try {\n const agent = await deps.create(agentOpts);\n try {\n const run = await agent.send(item.prompt);\n const result = await run.wait();\n return {\n ok: true,\n index,\n prompt: item.prompt,\n result,\n ...(item.metadata !== undefined ? { metadata: item.metadata } : {}),\n durationMs: Date.now() - t0,\n };\n } finally {\n // EC-8: dispose failure → stderr warn, don't fail the result.\n try {\n await agent.dispose();\n } catch (disposeErr) {\n process.stderr.write(\n `[theokit-sdk] batch: agent.dispose failed for prompt ${index}: ${\n disposeErr instanceof Error ? disposeErr.message : String(disposeErr)\n }\\n`,\n );\n }\n }\n } catch (err) {\n return {\n ok: false,\n index,\n prompt: item.prompt,\n error: toTheokitError(err),\n ...(item.metadata !== undefined ? { metadata: item.metadata } : {}),\n durationMs: Date.now() - t0,\n };\n }\n}\n\nfunction buildAgentOptions(item: BatchItem, options: BatchOptions): AgentOptions {\n const {\n concurrency: _c,\n filter: _f,\n onResult: _or,\n onProgress: _op,\n signal: _s,\n task: _t,\n ...rest\n } = options;\n void _c;\n void _f;\n void _or;\n void _op;\n void _s;\n void _t;\n const agentOpts = rest as AgentOptions;\n if (item.systemPrompt !== undefined) {\n return { ...agentOpts, systemPrompt: item.systemPrompt };\n }\n return agentOpts;\n}\n\nfunction normalizeItem(promptOrItem: string | BatchItem): BatchItem {\n return typeof promptOrItem === \"string\" ? { prompt: promptOrItem } : promptOrItem;\n}\n\nfunction abortResult(item: BatchItem, index: number, signal?: AbortSignal): BatchResult {\n // EC-D: propagate signal.reason when set (preserves caller's error).\n let error: TheokitAgentError;\n if (signal?.reason instanceof TheokitAgentError) {\n error = signal.reason;\n } else if (signal?.reason instanceof Error) {\n error = new TheokitAgentError(signal.reason.message, {\n code: \"aborted\",\n cause: signal.reason,\n });\n } else {\n error = new TheokitAgentError(\"Batch aborted via AbortSignal\", { code: \"aborted\" });\n }\n return {\n ok: false,\n index,\n prompt: item.prompt,\n error,\n ...(item.metadata !== undefined ? { metadata: item.metadata } : {}),\n durationMs: 0,\n };\n}\n\nfunction toTheokitError(err: unknown): TheokitAgentError {\n if (err instanceof TheokitAgentError) return err;\n if (err instanceof Error) {\n return new TheokitAgentError(err.message, { code: \"unknown\", cause: err });\n }\n return new TheokitAgentError(String(err), { code: \"unknown\" });\n}\n\nasync function safeCallResult(cb: BatchOptions[\"onResult\"], result: BatchResult): Promise<void> {\n if (cb === undefined) return;\n try {\n await cb(result);\n } catch (err) {\n process.stderr.write(\n `[theokit-sdk] batch: onResult callback threw: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n }\n}\n\nfunction safeCallProgress(cb: BatchOptions[\"onProgress\"], progress: BatchProgress): void {\n if (cb === undefined) return;\n try {\n cb(progress);\n } catch (err) {\n process.stderr.write(\n `[theokit-sdk] batch: onProgress callback threw: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n }\n}\n\n/**\n * EC-A: construct shared pools from options.apiKeys. Empty/invalid → empty Map.\n *\n * @internal\n */\nfunction buildPoolsFromApiKeys(\n apiKeys: Record<string, string[]> | undefined,\n strategy: Record<string, CredentialPoolStrategy> | undefined,\n): Map<string, CredentialPool> {\n const pools = new Map<string, CredentialPool>();\n if (apiKeys === undefined) return pools;\n for (const [provider, keys] of Object.entries(apiKeys)) {\n if (!Array.isArray(keys)) continue;\n const filtered = keys.filter((k): k is string => typeof k === \"string\" && k.length > 0);\n if (filtered.length < 2) continue; // 1-key pools aren't pools\n const entries = filtered.map((token, i) =>\n newPooledCredential({ provider, accessToken: token, priority: i, source: \"manual\" }),\n );\n pools.set(\n provider,\n new CredentialPool(provider, entries, strategy?.[provider] ?? \"fill_first\"),\n );\n }\n return pools;\n}\n","/**\n * Public types for `Agent.create({ handoffs })` + `Handoff.create()` +\n * `Agent.handoffTo()` (Adoption Roadmap #4; ADRs D214-D229).\n *\n * Pattern: handoff-as-tool. Each handoff destination becomes a synthetic\n * `transfer_to_<receiver>` function tool exposed to the LLM. Runtime\n * intercepts the tool call and routes the next turn to the receiver.\n *\n * @public\n */\n\nimport type { ZodType } from \"zod\";\n\nimport type { SDKAgent } from \"./agent.js\";\n\n/**\n * Context handed to `onHandoff` callbacks and `isEnabled` predicates.\n * Read-only snapshot of the handoff dispatch state.\n */\nexport interface HandoffContext {\n readonly senderAgentId: string;\n readonly receiverAgentId: string;\n /** Depth counter AT dispatch time (post-increment; first handoff = 1). */\n readonly currentDepth: number;\n /** Chain of agentIds traversed so far in this send(). Always ends with sender. */\n readonly chain: ReadonlyArray<string>;\n}\n\n/**\n * The transcript wrapper passed to `inputFilter`. `messages` is widened to\n * `unknown[]` so this type doesn't import from `messages.ts` (avoids cycle\n * — implementations cast to `SDKMessage[]` internally).\n */\nexport interface HandoffHistory {\n readonly messages: ReadonlyArray<unknown>;\n}\n\n/**\n * Options accepted by `Handoff.create(target, opts?)`.\n *\n * @public\n */\nexport interface HandoffOptions<TInput extends ZodType = ZodType> {\n /** Override the default tool name `transfer_to_<receiver.name>` (D215). */\n readonly toolName?: string;\n /** Override the default tool description. */\n readonly toolDescription?: string;\n /**\n * Side-effect callback fired BEFORE the receiver takes over.\n *\n * **Semantics (D227):** throwing aborts the handoff — the synthetic tool\n * returns `tool_error: onHandoff_failed: <message>` so the LLM sees the\n * conflict. Logger-style consumers MUST wrap their own try/catch to\n * swallow exceptions.\n */\n readonly onHandoff?: (\n ctx: HandoffContext,\n parsed: TInput extends ZodType ? unknown : undefined,\n ) => void | Promise<void>;\n /**\n * Zod schema for the handoff tool-call arguments (structured payload).\n * When set, LLM-provided args are validated before `onHandoff` fires.\n *\n * **Edge case (D229):** empty/null `inputJson` parses as `{}` before\n * Zod refinements fire — required-field schemas still throw normally.\n */\n readonly inputType?: TInput;\n /**\n * Filter the history passed to the receiver (D216 default = full; D219).\n *\n * **Resilience (D228):** if this callback throws, the runtime logs once\n * to stderr and falls back to the un-filtered history. Use this for\n * privacy redaction; if you need fatal-on-failure semantics, throw in\n * `onHandoff` instead.\n */\n readonly inputFilter?: (history: HandoffHistory) => HandoffHistory | Promise<HandoffHistory>;\n /**\n * Restrict the receiver's tools for the post-handoff turn ONLY (D224).\n * Subsequent receiver-internal turns use the receiver's full tool set.\n */\n readonly tools?: ReadonlyArray<string>;\n /**\n * Dynamically enable/disable this handoff. Bool = static; predicate =\n * called per-`Agent.send()` to evaluate.\n */\n readonly isEnabled?: boolean | ((ctx: HandoffContext) => boolean | Promise<boolean>);\n}\n\n/**\n * Result of a single handoff dispatch (for telemetry / observability).\n *\n * @public\n */\nexport interface HandoffResult {\n readonly from: string;\n readonly to: string;\n readonly depth: number;\n readonly toolName: string;\n readonly reasonFromLlm?: string;\n}\n\n/** Throw when handoff depth exceeds `maxHandoffDepth` (default 5; D218). */\nexport class HandoffLoopError extends Error {\n override readonly name = \"HandoffLoopError\";\n readonly depth: number;\n readonly chain: ReadonlyArray<string>;\n constructor(depth: number, chain: ReadonlyArray<string>) {\n super(\n `Handoff loop exceeded max depth ${depth}. Chain: ${chain.join(\" -> \")}. ` +\n `Use Agent.create({ maxHandoffDepth: N }) to raise the cap.`,\n );\n this.depth = depth;\n this.chain = chain;\n }\n}\n\n/** Throw when the same (sender, receiver) pair invoked twice in one send() (D221). */\nexport class HandoffPairLoopError extends Error {\n override readonly name = \"HandoffPairLoopError\";\n readonly senderAgentId: string;\n readonly receiverAgentId: string;\n constructor(senderAgentId: string, receiverAgentId: string) {\n super(\n `Handoff loop: ${senderAgentId} -> ${receiverAgentId} already invoked in this send() call. ` +\n `Likely a ping-pong loop; revisit your handoff conditions.`,\n );\n this.senderAgentId = senderAgentId;\n this.receiverAgentId = receiverAgentId;\n }\n}\n\n/** Throw when an agent's `handoffs[]` includes a self-reference (EC-6). */\nexport class HandoffSelfReferenceError extends Error {\n override readonly name = \"HandoffSelfReferenceError\";\n readonly agentId: string;\n constructor(agentId: string) {\n super(\n `Agent \"${agentId}\" has a self-reference in its handoffs[]. ` +\n `Self-handoff causes infinite recursion; introduce a sibling agent for re-entry.`,\n );\n this.agentId = agentId;\n }\n}\n\n/** Throw when receiver is disposed at dispatch time (EC-5). */\nexport class HandoffReceiverDisposedError extends Error {\n override readonly name = \"HandoffReceiverDisposedError\";\n readonly receiverAgentId: string;\n constructor(receiverAgentId: string) {\n super(\n `Handoff target agent \"${receiverAgentId}\" is disposed. ` +\n `Don't dispose receivers while their parent is still active.`,\n );\n this.receiverAgentId = receiverAgentId;\n }\n}\n\n/** Throw when two handoffs in the same parent collide on tool name (D215). */\nexport class HandoffNameCollisionError extends Error {\n override readonly name = \"HandoffNameCollisionError\";\n readonly conflictingName: string;\n constructor(conflictingName: string) {\n super(\n `Two handoffs share the same tool name \"${conflictingName}\". ` +\n `Set { toolName } on at least one of them to disambiguate.`,\n );\n this.conflictingName = conflictingName;\n }\n}\n\n/**\n * Public `Handoff` shape — what `Handoff.create()` returns. Read-only\n * accessors only; behavior lives in the engine.\n *\n * @public\n */\nexport interface HandoffDescriptor<TInput extends ZodType = ZodType> {\n readonly target: SDKAgent;\n readonly options: HandoffOptions<TInput>;\n /** Resolved tool name (after applying toolName override or default `transfer_to_<receiver>`). */\n readonly resolvedToolName: string;\n}\n","/**\n * Handoff registry — pure state container per `Agent` instance.\n *\n * Holds the active dispatch chain (for depth + pair tracking) across the\n * lifetime of a single `agent.send()` call. Cleared between calls.\n *\n * @internal\n */\n\nimport { HandoffLoopError, HandoffPairLoopError } from \"../../types/handoff.js\";\n\nexport interface HandoffChainState {\n /** Ordered chain of agentIds traversed so far (oldest first). */\n readonly chain: string[];\n /** Set of \"<sender>-><receiver>\" keys for pair-level loop detection (D221). */\n readonly seenPairs: Set<string>;\n /** Caller-supplied max depth (D218). */\n readonly maxDepth: number;\n}\n\nexport function createChainState(rootAgentId: string, maxDepth: number): HandoffChainState {\n return {\n chain: [rootAgentId],\n seenPairs: new Set(),\n maxDepth,\n };\n}\n\n/**\n * Record a handoff hop. Throws on depth-exceed (D218) or pair-loop (D221).\n * Mutates the state in place.\n */\nexport function recordHop(\n state: HandoffChainState,\n senderAgentId: string,\n receiverAgentId: string,\n): void {\n const pairKey = `${senderAgentId}->${receiverAgentId}`;\n if (state.seenPairs.has(pairKey)) {\n throw new HandoffPairLoopError(senderAgentId, receiverAgentId);\n }\n state.seenPairs.add(pairKey);\n state.chain.push(receiverAgentId);\n // chain.length = nodes; depth = hops = chain.length - 1.\n const depth = state.chain.length - 1;\n if (depth > state.maxDepth) {\n throw new HandoffLoopError(state.maxDepth, [...state.chain]);\n }\n}\n\nexport function currentDepth(state: HandoffChainState): number {\n return state.chain.length - 1;\n}\n","/**\n * D220 — Lazy-loaded OTel `handoff.transfer` span emitter.\n *\n * @internal\n */\n\nimport {\n getTracer,\n resetTracerCacheForTests,\n type SpanLike,\n} from \"../observability/tracer-loader.js\";\n\nconst TRACER_NAME = \"theokit-sdk-handoff\";\n\nexport interface HandoffSpanHandle {\n setAttribute(key: string, value: string | number | boolean): void;\n end(): void;\n}\n\nconst NOOP: HandoffSpanHandle = { setAttribute: () => undefined, end: () => undefined };\n\nfunction safe<T>(fn: () => T, fallback: T): T {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n\nexport function startHandoffSpan(attrs: {\n from: string;\n to: string;\n reason: string;\n depth: number;\n toolName: string;\n}): HandoffSpanHandle {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return NOOP;\n const span: SpanLike | undefined = safe(\n () =>\n tracer.startSpan(\"handoff.transfer\", {\n attributes: {\n \"handoff.from\": attrs.from,\n \"handoff.to\": attrs.to,\n \"handoff.reason\": attrs.reason,\n \"handoff.depth\": attrs.depth,\n \"handoff.tool_name\": attrs.toolName,\n },\n }),\n undefined,\n );\n if (span === undefined) return NOOP;\n return {\n setAttribute: (k, v) => safe(() => span.setAttribute(k, v), undefined),\n end: () => safe(() => span.end(), undefined),\n };\n}\n\n/** Test-only — reset cached OTel handle. */\nexport function __resetHandoffOtelCacheForTests(): void {\n resetTracerCacheForTests();\n}\n","/**\n * Handoff dispatch orchestration.\n *\n * Pragmatic v1: when a handoff fires, the sender calls `receiver.send()`\n * with the (optionally filtered) history. The receiver's reply is returned\n * to the sender, which captures it as the answer to the user's question.\n *\n * NOTE: this is NOT pure peer-to-peer (the sender stays on the call stack\n * until the receiver returns). Pure intercept-and-swap requires deeper\n * agent-loop refactor; deferred to v2. v1 still validates the user-facing\n * value: \"agent A reasoned about routing, agent B answered.\"\n *\n * @internal\n */\n\nimport { z } from \"zod\";\nimport type { SDKAgent } from \"../../types/agent.js\";\nimport type {\n HandoffContext,\n HandoffDescriptor,\n HandoffHistory,\n HandoffResult,\n} from \"../../types/handoff.js\";\nimport { HandoffReceiverDisposedError } from \"../../types/handoff.js\";\nimport { type HandoffChainState, recordHop } from \"./registry.js\";\nimport { startHandoffSpan } from \"./telemetry.js\";\n\n/**\n * EC-2 / D228 — `safeFilter` wraps `inputFilter`. On exception, falls back\n * to the un-filtered history and warns to stderr once per process.\n */\nlet warnedFilterOnce = false;\nasync function safeFilter(\n filter: ((h: HandoffHistory) => HandoffHistory | Promise<HandoffHistory>) | undefined,\n history: HandoffHistory,\n): Promise<HandoffHistory> {\n if (filter === undefined) return history;\n try {\n const result = filter(history);\n return result instanceof Promise ? await result : result;\n } catch (err) {\n if (!warnedFilterOnce) {\n warnedFilterOnce = true;\n process.stderr.write(\n `[handoff] inputFilter threw, falling back to full history: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n return history;\n }\n}\n\n/**\n * EC-4 / D229 — parse the LLM-provided JSON args. Returns undefined when\n * no `inputType` set; returns parsed value otherwise (default to `{}` on\n * empty/null input before Zod refinements).\n */\nfunction parseHandoffInput(descriptor: HandoffDescriptor, raw: unknown): unknown {\n const inputType = descriptor.options.inputType;\n if (inputType === undefined) return undefined;\n const candidate = raw === null || raw === undefined ? {} : raw;\n return inputType.parse(candidate);\n}\n\nfunction isAgentDisposed(agent: SDKAgent): boolean {\n // SDKAgent doesn't expose `disposed` publicly; check via duck-typing on\n // a known internal flag. Safe fallback: if we can't tell, assume alive.\n const maybe = agent as unknown as { disposed?: boolean };\n return maybe.disposed === true;\n}\n\n/**\n * Run a single handoff hop. Returns the receiver's reply text.\n *\n * Algorithm:\n * 1. EC-5: refuse if receiver disposed.\n * 2. Build HandoffContext.\n * 3. Check isEnabled() — if false, refuse with a clear error message.\n * 4. Parse inputType (D229).\n * 5. Run onHandoff(ctx, parsed) — throw aborts (D227).\n * 6. Apply inputFilter (safeFilter — D228).\n * 7. Record hop in chain state (depth + pair guards).\n * 8. Open OTel span (D220).\n * 9. Receiver: build the user-facing message and `await receiver.send(msg).then(wait)`.\n * 10. Close span + return reply.\n */\nasync function assertHandoffEnabled(\n descriptor: HandoffDescriptor,\n ctx: HandoffContext,\n receiverAgentId: string,\n): Promise<void> {\n const opt = descriptor.options.isEnabled;\n let enabled = true;\n if (typeof opt === \"boolean\") enabled = opt;\n else if (typeof opt === \"function\") {\n const r = opt(ctx);\n enabled = r instanceof Promise ? await r : r;\n }\n if (!enabled) {\n throw new Error(`Handoff to ${receiverAgentId} is disabled (isEnabled returned false)`);\n }\n}\n\nfunction parseAndValidate(descriptor: HandoffDescriptor, rawInputJson: unknown): unknown {\n try {\n return parseHandoffInput(descriptor, rawInputJson);\n } catch (err) {\n const detail =\n err instanceof z.ZodError\n ? (err.issues[0]?.message ?? \"schema_invalid\")\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Handoff input validation failed: ${detail}`);\n }\n}\n\nasync function runOnHandoff(\n descriptor: HandoffDescriptor,\n ctx: HandoffContext,\n parsedInput: unknown,\n): Promise<void> {\n const onHandoff = descriptor.options.onHandoff;\n if (onHandoff === undefined) return;\n // biome-ignore lint/suspicious/noExplicitAny: parsedInput is typed unknown by design.\n const result = onHandoff(ctx, parsedInput as any);\n if (result instanceof Promise) await result;\n}\n\nfunction extractUserText(content: unknown): string | undefined {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return undefined;\n const text = content\n .filter((c): c is { type: \"text\"; text: string } => (c as { type?: string })?.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n return text.length > 0 ? text : undefined;\n}\n\nfunction extractLastUserMessage(history: HandoffHistory, senderAgentId: string): string {\n for (let i = history.messages.length - 1; i >= 0; i -= 1) {\n const m = history.messages[i] as {\n type?: string;\n message?: { role?: string; content?: unknown };\n };\n if (m?.type !== \"user\" || m.message?.role !== \"user\") continue;\n const text = extractUserText(m.message.content);\n if (text !== undefined) return text;\n }\n return `(Handoff from ${senderAgentId} — no prior user message in history.)`;\n}\n\nexport async function dispatchHandoff(args: {\n descriptor: HandoffDescriptor;\n senderAgentId: string;\n chainState: HandoffChainState;\n rawInputJson: unknown;\n /** The conversation so far (history wrapper). v1: just the LAST user message. */\n history: HandoffHistory;\n /** Override the message text sent to the receiver. Used by `Agent.handoffTo` imperative. */\n messageOverride?: string;\n}): Promise<{ reply: string; result: HandoffResult }> {\n const { descriptor, senderAgentId, chainState, rawInputJson, history, messageOverride } = args;\n const receiver = descriptor.target;\n\n if (isAgentDisposed(receiver)) {\n throw new HandoffReceiverDisposedError(receiver.agentId);\n }\n\n const depthAfterThisHop = chainState.chain.length;\n const ctx: HandoffContext = {\n senderAgentId,\n receiverAgentId: receiver.agentId,\n currentDepth: depthAfterThisHop,\n chain: [...chainState.chain, receiver.agentId],\n };\n\n await assertHandoffEnabled(descriptor, ctx, receiver.agentId);\n const parsedInput = parseAndValidate(descriptor, rawInputJson);\n await runOnHandoff(descriptor, ctx, parsedInput);\n\n // Filter history (D228 — resilient)\n const filteredHistory = await safeFilter(descriptor.options.inputFilter, history);\n\n // Record hop — may throw HandoffLoopError or HandoffPairLoopError\n recordHop(chainState, senderAgentId, receiver.agentId);\n\n const lastUserMessage = messageOverride ?? extractLastUserMessage(filteredHistory, senderAgentId);\n const reason = extractReason(parsedInput);\n\n const span = startHandoffSpan({\n from: senderAgentId,\n to: receiver.agentId,\n reason,\n depth: depthAfterThisHop,\n toolName: descriptor.resolvedToolName,\n });\n\n try {\n const run = await receiver.send(lastUserMessage);\n const result = await run.wait();\n const reply = buildReply(result, receiver.agentId);\n return {\n reply,\n result: {\n from: senderAgentId,\n to: receiver.agentId,\n depth: depthAfterThisHop,\n toolName: descriptor.resolvedToolName,\n ...(reason !== \"\" ? { reasonFromLlm: reason } : {}),\n },\n };\n } finally {\n span.end();\n }\n}\n\nfunction extractReason(parsedInput: unknown): string {\n if (typeof parsedInput !== \"object\" || parsedInput === null) return \"\";\n if (!(\"reason\" in parsedInput)) return \"\";\n return String((parsedInput as { reason: unknown }).reason ?? \"\");\n}\n\nfunction buildReply(\n result: { status: string; result?: string; error?: { message: string } },\n receiverAgentId: string,\n): string {\n if (result.status === \"finished\" && result.result !== undefined) return result.result;\n const suffix = result.error !== undefined ? `: ${result.error.message}` : \"\";\n return `(Handoff target ${receiverAgentId} returned status=${result.status}${suffix})`;\n}\n","/**\n * Convert `handoffs[]` entries into synthetic `transfer_to_<receiver>` tools\n * for injection into the agent's tool registry at construction time.\n *\n * The synthesized tool's handler calls `dispatchHandoff` internally and\n * returns the receiver's reply as `tool_result`. v1 trade-off documented\n * in dispatcher.ts.\n *\n * @internal\n */\n\nimport { z } from \"zod\";\nimport type { CustomTool, SDKAgent } from \"../../types/agent.js\";\nimport {\n type HandoffDescriptor,\n HandoffNameCollisionError,\n HandoffSelfReferenceError,\n} from \"../../types/handoff.js\";\nimport { toJsonSchema } from \"../zod/to-json-schema.js\";\nimport { dispatchHandoff } from \"./dispatcher.js\";\nimport { createChainState } from \"./registry.js\";\n\ninterface NormalizedHandoff {\n descriptor: HandoffDescriptor;\n}\n\n/**\n * Normalize each `handoffs[]` entry to a `HandoffDescriptor`. Raw `SDKAgent`\n * instances are auto-wrapped with default options. Validates:\n * - EC-6: no self-reference (would cause infinite recursion).\n * - D215: resolved tool names must be unique.\n */\nexport function normalizeHandoffs(\n parentAgentId: string,\n entries: ReadonlyArray<SDKAgent | HandoffDescriptor>,\n): NormalizedHandoff[] {\n if (entries.length === 0) return [];\n const out: NormalizedHandoff[] = [];\n const seenNames = new Set<string>();\n for (const entry of entries) {\n // Detect raw Agent vs HandoffDescriptor by presence of `.target`.\n const isDescriptor =\n typeof entry === \"object\" &&\n entry !== null &&\n \"target\" in entry &&\n \"options\" in entry &&\n \"resolvedToolName\" in entry;\n const descriptor = isDescriptor ? (entry as HandoffDescriptor) : autoWrap(entry as SDKAgent);\n if (descriptor.target.agentId === parentAgentId) {\n throw new HandoffSelfReferenceError(parentAgentId);\n }\n const name = descriptor.resolvedToolName;\n if (seenNames.has(name)) {\n throw new HandoffNameCollisionError(name);\n }\n seenNames.add(name);\n out.push({ descriptor });\n }\n return out;\n}\n\nfunction autoWrap(agent: SDKAgent): HandoffDescriptor {\n const name = resolveTargetName(agent);\n return {\n target: agent,\n options: {},\n resolvedToolName: `transfer_to_${name}`,\n };\n}\n\nfunction resolveTargetName(agent: SDKAgent): string {\n // Prefer a `name` field if exposed; fall back to a short agentId slug.\n const candidate = (agent as unknown as { name?: string }).name ?? agent.agentId ?? \"anonymous\";\n return slugify(candidate);\n}\n\nfunction slugify(input: string): string {\n return (\n input\n .replace(/^agent-/i, \"\")\n .replace(/[^a-zA-Z0-9_-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, 64) || \"anonymous\"\n );\n}\n\n/**\n * Build a `CustomTool` for one handoff descriptor. The handler dispatches\n * the handoff using a fresh chain state per `send()`-level invocation.\n *\n * NOTE: this v1 builds a NEW chain state per tool invocation. Pure\n * cross-tool depth tracking within one send() requires per-Agent context\n * — deferred. The single-flight pair guard catches direct ping-pong even\n * without cross-invocation chain (since each call wraps the same depth\n * counter from 1).\n */\nexport function buildHandoffTool(\n parentAgentId: string,\n descriptor: HandoffDescriptor,\n maxHandoffDepth: number,\n): CustomTool {\n const description =\n descriptor.options.toolDescription ??\n `Transfer the conversation to the ${descriptor.target.agentId} agent. ` +\n `Use this when the user's request matches their specialty.`;\n\n const inputZod =\n descriptor.options.inputType ??\n z.object({\n reason: z.string().optional().describe(\"Brief reason for the transfer (one short sentence).\"),\n });\n // CustomTool.inputSchema expects a JSON schema (Record<string, unknown>),\n // not the raw Zod type. Convert lazily so we don't fail when Zod is missing.\n // Universal Zod 3+4 conversion (feature-detects native v4, falls back to lib on v3).\n const inputSchema = toJsonSchema(inputZod);\n\n return {\n name: descriptor.resolvedToolName,\n description,\n inputSchema,\n handler: async (input: unknown): Promise<string> => {\n const chainState = createChainState(parentAgentId, maxHandoffDepth);\n try {\n const { reply, result } = await dispatchHandoff({\n descriptor,\n senderAgentId: parentAgentId,\n chainState,\n rawInputJson: input,\n history: { messages: [] }, // v1: history replay deferred\n });\n return JSON.stringify({\n ok: true,\n transferred_to: result.to,\n depth: result.depth,\n reply,\n });\n } catch (err) {\n return JSON.stringify({\n ok: false,\n error: err instanceof Error ? err.name : \"HandoffError\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n },\n };\n}\n","import { ConfigurationError, UnknownAgentError } from \"./errors.js\";\nimport { runCronJob } from \"./internal/cron/run-job.js\";\nimport {\n getSchedulerState,\n scheduleJob,\n setCronFireHandler,\n startScheduler,\n stopScheduler,\n unscheduleJob,\n} from \"./internal/cron/scheduler.js\";\nimport { deleteJob, getJob, jobCount, listJobs, upsertJob } from \"./internal/cron/store.js\";\nimport {\n estimateNextRunAt,\n validateCronExpression,\n validateTimezone,\n} from \"./internal/cron/validate.js\";\nimport { resolveApiKey } from \"./internal/env.js\";\nimport { generateCronId } from \"./internal/ids.js\";\nimport { submit as taskRegistrySubmit } from \"./internal/task/registry.js\";\nimport type { AgentOptions, ListResult } from \"./types/agent.js\";\nimport type {\n CronCreateOptions,\n CronGetOptions,\n CronJob,\n CronListOptions,\n CronOperationOptions,\n CronRunOptions,\n CronRuntime,\n CronSchedulerStatus,\n CronStartOptions,\n} from \"./types/cron.js\";\nimport type { Run } from \"./types/run.js\";\n\n/**\n * Static façade for scheduling Theo agent runs on a cron expression.\n *\n * @public\n */\nexport class Cron {\n private constructor() {\n // Static-only façade.\n }\n\n /**\n * Create and persist a cron job.\n *\n * @public\n */\n static async create(options: CronCreateOptions): Promise<CronJob> {\n const job = await createCronJob(options);\n if (job.runtime === \"local\" && job.enabled !== false) scheduleJob(job);\n return job;\n }\n\n /**\n * List cron jobs (local, cloud, or both).\n *\n * @public\n */\n static list(options: CronListOptions = {}): Promise<ListResult<CronJob>> {\n const runtimeFilter = options.runtime;\n const items = listJobs().filter((job) =>\n runtimeFilter === undefined ? true : job.runtime === runtimeFilter,\n );\n return Promise.resolve({ items });\n }\n\n /**\n * Get a single cron job by ID.\n *\n * @public\n */\n static get(jobId: string, _options: CronGetOptions = {}): Promise<CronJob> {\n const job = getJob(jobId);\n if (job === undefined) {\n return Promise.reject(\n new UnknownAgentError(`Cron job ${jobId} not found`, { code: \"unknown_cron_job\" }),\n );\n }\n return Promise.resolve(job);\n }\n\n /**\n * Delete a cron job permanently.\n *\n * @public\n */\n static delete(jobId: string, _options: CronOperationOptions = {}): Promise<void> {\n unscheduleJob(jobId);\n deleteJob(jobId);\n return Promise.resolve();\n }\n\n /**\n * Re-enable a paused cron job.\n *\n * @public\n */\n static async enable(jobId: string, _options: CronOperationOptions = {}): Promise<CronJob> {\n return updateJobStatus(jobId, true);\n }\n\n /**\n * Pause a cron job without deleting it.\n *\n * @public\n */\n static async disable(jobId: string, _options: CronOperationOptions = {}): Promise<CronJob> {\n return updateJobStatus(jobId, false);\n }\n\n /**\n * Manually trigger a cron job off-schedule. Returns the resulting `Run`.\n *\n * @public\n */\n static async run(jobId: string, _options: CronRunOptions = {}): Promise<Run> {\n const job = getJob(jobId);\n if (job === undefined) {\n throw new UnknownAgentError(`Cron job ${jobId} not found`, { code: \"unknown_cron_job\" });\n }\n return runCronJob(job);\n }\n\n /**\n * Activate the in-process scheduler for local cron jobs.\n *\n * @public\n */\n static start(options: CronStartOptions = {}): Promise<void> {\n // Install the default fire handler so timer ticks actually drive a\n // real agent run. Users can override via `setCronFireHandler` from\n // `@theokit/sdk/internal` (test-mode hook).\n setCronFireHandler(async (job) => {\n // T3.5 (ADRs D363/D374): every fire registers as a Task so callers\n // can observe via `theokit tasks list` / `Task.subscribe`. The\n // task id namespace `cron-{jobId}-{fireEpochMs}` honors D368/EC-5.\n const fireTs = Date.now();\n const taskId = `cron-${job.id}-${fireTs}`;\n try {\n await taskRegistrySubmit({\n kind: \"cron\",\n id: taskId,\n allowReservedPrefix: true,\n meta: { jobId: job.id, jobName: job.name, schedule: job.cron, firedAt: fireTs },\n work: async (ctx) => {\n const run = await runCronJob(job);\n ctx.signal.addEventListener(\"abort\", () => void run.cancel().catch(() => {}), {\n once: true,\n });\n const result = await run.wait();\n ctx.emit({ status: result.status, runId: run.id });\n return { status: result.status, runId: run.id };\n },\n });\n } catch {\n // Task registry must not break cron — fall through to legacy path.\n await runCronJob(job).then((run) => run.wait());\n }\n });\n startScheduler(options.cwd);\n return Promise.resolve();\n }\n\n /**\n * Stop the in-process scheduler. Jobs are preserved.\n *\n * @public\n */\n static stop(): Promise<void> {\n stopScheduler();\n return Promise.resolve();\n }\n\n /**\n * Snapshot of the local scheduler.\n *\n * @public\n */\n static status(_options: CronStartOptions = {}): Promise<CronSchedulerStatus> {\n const scheduler = getSchedulerState();\n return Promise.resolve({ running: scheduler.running, jobCount: jobCount() });\n }\n}\n\nasync function createCronJob(options: CronCreateOptions): Promise<CronJob> {\n if (options.agent !== undefined && options.agentId !== undefined) {\n throw new ConfigurationError(\n \"agent and agentId are mutually exclusive — pass either agent (ephemeral) or agentId (reuse).\",\n { code: \"cron_agent_exclusive\" },\n );\n }\n if (options.agent === undefined && options.agentId === undefined) {\n throw new ConfigurationError(\"Cron job requires either agent or agentId\", {\n code: \"cron_missing_agent\",\n });\n }\n\n validateCronExpression(options.cron);\n const timezone = options.timezone ?? \"UTC\";\n validateTimezone(timezone);\n\n // apiKey is accepted but not required for cron-create in fixture mode.\n resolveApiKey(options.apiKey);\n\n const runtime = detectRuntime(options);\n const now = Date.now();\n const job: CronJob = {\n id: generateCronId(),\n cron: options.cron,\n timezone,\n message: options.message,\n enabled: options.enabled ?? true,\n status: options.enabled === false ? \"paused\" : \"scheduled\",\n runtime,\n createdAt: now,\n nextRunAt: estimateNextRunAt(options.cron, timezone),\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.agent !== undefined ? { agent: options.agent } : {}),\n ...(options.agentId !== undefined ? { agentId: options.agentId } : {}),\n };\n upsertJob(job);\n return job;\n}\n\nfunction detectRuntime(options: CronCreateOptions): CronRuntime {\n if (options.agentId !== undefined) {\n return options.agentId.startsWith(\"bc-\") ? \"cloud\" : \"local\";\n }\n const agent = options.agent as AgentOptions | undefined;\n if (agent?.cloud !== undefined) return \"cloud\";\n return \"local\";\n}\n\nasync function updateJobStatus(jobId: string, enabled: boolean): Promise<CronJob> {\n const existing = getJob(jobId);\n if (existing === undefined) {\n throw new UnknownAgentError(`Cron job ${jobId} not found`, { code: \"unknown_cron_job\" });\n }\n const updated: CronJob = {\n ...existing,\n enabled,\n status: enabled ? \"scheduled\" : \"paused\",\n };\n upsertJob(updated);\n if (updated.runtime === \"local\") {\n if (enabled) {\n scheduleJob(updated);\n } else {\n unscheduleJob(updated.id);\n }\n }\n return updated;\n}\n","import type {\n AgentDefinition,\n AgentOptions,\n CloudOptions,\n CustomTool,\n LocalOptions,\n MemorySettings,\n ModelSelection,\n SDKAgent,\n SkillsSettings,\n SystemPromptResolver,\n} from \"./types/agent.js\";\nimport type { ContextSettings } from \"./types/context.js\";\nimport type { McpServerConfig } from \"./types/mcp.js\";\nimport type { PluginsSettings, ProviderRoutingSettings } from \"./types/providers.js\";\n\n/**\n * Terminal-method callbacks injected by `Agent.builder()` so that\n * `agent-builder.ts` does NOT need a static import of `Agent` — keeps the\n * dependency graph acyclic (G6).\n *\n * @internal\n */\ninterface AgentBuilderDeps {\n create: (options: AgentOptions) => Promise<SDKAgent>;\n getOrCreate: (agentId: string, options: AgentOptions) => Promise<SDKAgent>;\n}\n\n/**\n * Fluent builder for {@link AgentOptions}. Chainable setters mutate internal\n * state and return `this`. Three terminals:\n *\n * - `.build()` — synchronous snapshot (shallow clone) of accumulated options.\n * - `.create()` — calls the injected `create` (Agent.create).\n * - `.getOrCreate(agentId)` — calls the injected `getOrCreate` (Agent.getOrCreate).\n *\n * Validation runs inside the terminals via `validateAgentOptions`. See ADR D25.\n *\n * @public\n */\nexport class AgentBuilder {\n private opts: Partial<AgentOptions> = {};\n private readonly deps: AgentBuilderDeps | undefined;\n\n constructor(deps?: AgentBuilderDeps) {\n this.deps = deps;\n }\n\n model(m: ModelSelection): this {\n this.opts.model = m;\n return this;\n }\n apiKey(k: string): this {\n this.opts.apiKey = k;\n return this;\n }\n name(n: string): this {\n this.opts.name = n;\n return this;\n }\n systemPrompt(p: string | SystemPromptResolver): this {\n this.opts.systemPrompt = p;\n return this;\n }\n local(l: LocalOptions): this {\n this.opts.local = l;\n return this;\n }\n cloud(c: CloudOptions): this {\n this.opts.cloud = c;\n return this;\n }\n memory(m: MemorySettings): this {\n this.opts.memory = m;\n return this;\n }\n tools(t: CustomTool[]): this {\n this.opts.tools = t;\n return this;\n }\n mcpServers(s: Record<string, McpServerConfig>): this {\n this.opts.mcpServers = s;\n return this;\n }\n agents(a: Record<string, AgentDefinition>): this {\n this.opts.agents = a;\n return this;\n }\n context(c: ContextSettings): this {\n this.opts.context = c;\n return this;\n }\n providers(p: ProviderRoutingSettings): this {\n this.opts.providers = p;\n return this;\n }\n plugins(p: PluginsSettings): this {\n this.opts.plugins = p;\n return this;\n }\n skills(s: SkillsSettings): this {\n this.opts.skills = s;\n return this;\n }\n agentId(id: string): this {\n this.opts.agentId = id;\n return this;\n }\n\n /**\n * Synchronous snapshot of the accumulated options. Returns a SHALLOW CLONE\n * so external mutation of the result doesn't pollute the builder state (EC-2).\n */\n build(): AgentOptions {\n return { ...this.opts } as AgentOptions;\n }\n\n /**\n * Validate + create a fresh agent. Delegates to `Agent.create` via the\n * injected `deps.create`. Throws if the builder was instantiated without\n * deps (i.e., direct `new AgentBuilder()` instead of `Agent.builder()`).\n */\n create(): Promise<SDKAgent> {\n if (this.deps === undefined) {\n return Promise.reject(\n new Error(\n \"AgentBuilder.create() requires Agent.builder() entry — direct construction has no terminals.\",\n ),\n );\n }\n return this.deps.create(this.build());\n }\n\n /**\n * Resume an existing agent or create one if the ID is unknown. Delegates to\n * `Agent.getOrCreate` via the injected `deps.getOrCreate` (ADR D22).\n */\n getOrCreate(agentId: string): Promise<SDKAgent> {\n if (this.deps === undefined) {\n return Promise.reject(\n new Error(\n \"AgentBuilder.getOrCreate() requires Agent.builder() entry — direct construction has no terminals.\",\n ),\n );\n }\n return this.deps.getOrCreate(agentId, this.build());\n }\n}\n","import { stat } from \"node:fs/promises\";\n\nimport { AgentBuilder } from \"./agent-builder.js\";\nimport {\n AgentRunError,\n AuthenticationError,\n ConfigurationError,\n UnknownAgentError,\n} from \"./errors.js\";\nimport { resolveApiKey } from \"./internal/env.js\";\nimport {\n getConfiguredBaseUrl,\n isFixtureApiKey,\n shouldUseRealLocalRuntime,\n} from \"./internal/fixture-mode.js\";\nimport { httpRequest } from \"./internal/http.js\";\nimport { isLocalAgentId } from \"./internal/ids.js\";\nimport { setAgentCreate } from \"./internal/runtime/agent-factory-registry.js\";\nimport {\n flushRegistrySaves,\n getRegisteredAgent,\n hydrateRegistryFromDisk,\n listRegisteredAgents,\n removeRegisteredAgent,\n updateRegisteredAgent,\n} from \"./internal/runtime/agent-registry.js\";\nimport { CloudAgent } from \"./internal/runtime/cloud-agent.js\";\nimport { validateCloudToolParity } from \"./internal/runtime/cloud-tool-parity.js\";\nimport {\n type LiveAgentRegistry,\n liveAgentRegistry,\n} from \"./internal/runtime/live-agent-registry.js\";\nimport { LocalAgent } from \"./internal/runtime/local-agent.js\";\nimport { getRun as getRegisteredRun, listRunsByAgent } from \"./internal/runtime/run-registry.js\";\nimport { validateAgentOptions } from \"./internal/runtime/validate-agent-options.js\";\nimport type {\n AgentOperationOptions,\n AgentOptions,\n GetAgentOptions,\n GetRunOptions,\n ListAgentsOptions,\n ListResult,\n ListRunsOptions,\n SDKAgent,\n SDKAgentInfo,\n} from \"./types/agent.js\";\nimport type { Run, RunResult } from \"./types/run.js\";\n\n/**\n * Result of a one-shot {@link Agent.prompt} call.\n *\n * @public\n */\nexport type AgentPromptResult = RunResult;\n\n/**\n * Static façade for creating and managing Theo agents.\n *\n * @public\n */\nexport class Agent {\n private constructor() {\n // Static-only façade.\n }\n\n /**\n * Live-agent cache for production deploys (Production-Readiness #2, ADRs D307-D310).\n *\n * Caches `SDKAgent` instances by id with LRU eviction (when `size > maxAgents`)\n * and an idle-timeout sweep. Solves the OOM failure mode for long-running\n * Node servers spawning fresh agents per conversation.\n *\n * Defaults: `maxAgents: 100`, `idleTimeoutMs: 30 min`, sweep `60s`.\n * Configure for high-traffic SaaS:\n *\n * ```ts\n * Agent.registry.configure({ maxAgents: 1000, idleTimeoutMs: 15 * 60_000 });\n * process.on(\"SIGTERM\", () => Agent.registry.evictAll());\n * ```\n *\n * Cache hits are automatic in `Agent.getOrCreate` (T2.6). Disable the cache\n * entirely via `configure({ maxAgents: 0 })` — every getOrCreate then\n * re-initializes.\n *\n * @public\n */\n static readonly registry: LiveAgentRegistry = liveAgentRegistry;\n\n /**\n * Create a new agent. Pass either `local` or `cloud` to pick a runtime.\n *\n * @public\n */\n static async create(options: AgentOptions): Promise<SDKAgent> {\n validateAgentOptions(options);\n validateCloudToolParity(options);\n // EC-1: when the caller pins an agentId, hydrate the persisted registry\n // first and reject collisions explicitly. Without this, restart + create\n // silently wipes the prior agent's metadata.\n if (options.agentId !== undefined) {\n const persistenceCwd = resolveAgentPersistenceCwd(options);\n await hydrateRegistryFromDisk(persistenceCwd);\n if (getRegisteredAgent(options.agentId) !== undefined) {\n throw new ConfigurationError(\n `Agent \"${options.agentId}\" already exists. Use Agent.resume(\"${options.agentId}\") to reattach, or pick a different agentId.`,\n { code: \"agent_id_already_exists\" },\n );\n }\n }\n // D322/D323 — quota gate fires BEFORE any side effects (registry insert,\n // disk persist, MCP boot). Errors propagate (NOT swallowed — gates block).\n if (options.onBeforeCreate !== undefined) {\n const userId =\n typeof options.metadata?.userId === \"string\" ? options.metadata.userId : undefined;\n await options.onBeforeCreate({\n conversationId: options.agentId ?? \"auto\",\n ...(userId !== undefined ? { userId } : {}),\n });\n }\n // D214-D229: when `handoffs[]` is set, synthesize `transfer_to_<X>` tools\n // and merge into options.tools. Validates uniqueness + self-reference\n // before agent construction (EC-6).\n const optionsWithHandoffs = await maybeInjectHandoffTools(options);\n if (optionsWithHandoffs.cloud !== undefined) {\n return createCloudAgent(optionsWithHandoffs);\n }\n return createLocalAgent(optionsWithHandoffs);\n }\n\n /**\n * One-shot prompt: create an agent, send a single message, wait, dispose.\n *\n * When `options.throwOnError === true`, rejects with `AgentRunError` if\n * the run terminates with `status: 'error'` (instead of resolving with the\n * error wrapped in the RunResult). Cancelled runs still resolve normally.\n *\n * @public\n */\n static async prompt(message: string, options: AgentOptions): Promise<AgentPromptResult> {\n const agent = await Agent.create(options);\n try {\n const run = await agent.send(message);\n const result = await run.wait();\n if (\n options.throwOnError === true &&\n result.status === \"error\" &&\n result.error !== undefined\n ) {\n throw new AgentRunError(result.error.message, {\n code: result.error.code ?? \"unknown\",\n cause: result.error.cause,\n });\n }\n return result;\n } finally {\n await agent.dispose();\n }\n }\n\n /**\n * Reattach to an existing agent by ID.\n *\n * @public\n */\n static async resume(agentId: string, options: Partial<AgentOptions> = {}): Promise<SDKAgent> {\n let existing = getRegisteredAgent(agentId);\n if (existing === undefined) {\n // D21: fall back to the persisted registry. Different cwds get isolated\n // registry.json files; we read the cwd the caller is operating in.\n const persistenceCwd = resolveAgentPersistenceCwd(options);\n await hydrateRegistryFromDisk(persistenceCwd);\n existing = getRegisteredAgent(agentId);\n }\n if (existing !== undefined) {\n return await rehydrateExistingAgent(agentId, existing, options);\n }\n // Cold miss: throw UnknownAgentError so chat-assistant bots can\n // explicitly branch to `Agent.create({ agentId, ...full options })` on\n // first contact. The previous silent cold-create with the caller's\n // partial options was a footgun — it persisted incomplete agents\n // (no model, no system prompt) that then failed at first send.\n //\n // Migration: callers that want the OLD \"always succeed\" behaviour\n // should catch `UnknownAgentError` and call `Agent.create` themselves.\n throw new UnknownAgentError(\n `Agent \"${agentId}\" not found. Use Agent.create({ agentId, ... }) for first-time setup, or catch UnknownAgentError to branch resume-vs-create.`,\n { code: \"unknown_agent\" },\n );\n }\n\n /**\n * Start building an {@link AgentOptions} via fluent chain. See ADR D25.\n * Terminals: `.build()`, `.create()`, `.getOrCreate(id)`.\n *\n * The builder receives `create` + `getOrCreate` as injected callbacks so\n * that `agent-builder.ts` doesn't need a static import of `Agent` — keeps\n * the module graph acyclic (G6).\n *\n * @public\n */\n static builder(): AgentBuilder {\n return new AgentBuilder({\n create: (options) => Agent.create(options),\n getOrCreate: (agentId, options) => Agent.getOrCreate(agentId, options),\n });\n }\n\n /**\n * Generate a typed object matching a Zod schema via a synthetic forced\n * tool call (ADR D33). One-shot: create transient agent → send prompt →\n * model calls `output` tool → parse args via Zod → return typed.\n *\n * @public\n */\n static async generateObject<T extends import(\"zod\").ZodType>(\n options: import(\"./generate-object.js\").GenerateObjectOptions<T>,\n ): Promise<import(\"./generate-object.js\").GenerateObjectResult<import(\"zod\").z.infer<T>>> {\n const { generateObjectImpl } = await import(\"./generate-object.js\");\n return generateObjectImpl(options, {\n create: (opts) => Agent.create(opts),\n delete: (agentId) => Agent.delete(agentId),\n });\n }\n\n /**\n * Stream a structured output object alongside intermediate `partial`\n * deltas as the model accumulates its response (ADR D39). Returns an\n * `AsyncIterator<StreamObjectEvent<T>>` that yields zero or more\n * `partial` events and exactly one `complete` event at the end.\n *\n * The `complete` event carries the same `object: z.infer<T>` you would get\n * from `Agent.generateObject` — same prompt + schema + model produces\n * the same final object.\n *\n * @public\n */\n static streamObject<T extends import(\"zod\").ZodType>(\n options: import(\"./stream-object.js\").StreamObjectOptions<T>,\n ): AsyncGenerator<\n import(\"./stream-object.js\").StreamObjectEvent<import(\"zod\").z.infer<T>>,\n void,\n void\n > {\n // Lazy-import the implementation so consumers that never call\n // streamObject don't pay the import cost.\n const deps = {\n create: (opts: import(\"./types/agent.js\").AgentOptions) => Agent.create(opts),\n delete: (agentId: string) => Agent.delete(agentId),\n };\n // Async generator wrapper that defers the actual implementation import.\n async function* wrapper() {\n const { streamObjectImpl } = await import(\"./stream-object.js\");\n yield* streamObjectImpl(options, deps);\n }\n return wrapper();\n }\n\n /**\n * Run N prompts in parallel with bounded concurrency (ADRs D134-D140).\n *\n * Each prompt gets a fresh agent (create → send → wait → dispose). Failures\n * are isolated per-prompt; the batch never throws on a single failure —\n * inspect `result.ok` to discriminate success vs error. Default\n * concurrency is 4. When `options.providers.apiKeys` has ≥2 keys per\n * provider, all in-flight agents share a single credential pool via\n * `AsyncLocalStorage` (EC-A) so rate-limit cooldowns are observed once\n * instead of duplicated per agent.\n *\n * Streaming progress is opt-in via `onResult` / `onProgress`. `AbortSignal`\n * cancels pending prompts; in-flight ones continue to completion (Node\n * AbortSignal semantics). `signal.reason` propagates to `error` when set.\n *\n * @public\n */\n static async batch(\n prompts: ReadonlyArray<string | import(\"./types/batch.js\").BatchItem>,\n options: import(\"./types/batch.js\").BatchOptions,\n ): Promise<import(\"./types/batch.js\").BatchResult[]> {\n const { batchImpl } = await import(\"./batch.js\");\n return batchImpl(prompts, options, { create: (opts) => Agent.create(opts) });\n }\n\n /**\n * Get an existing agent by ID, or create one with the supplied options if\n * the ID is not yet registered. Eliminates the resume-vs-create boilerplate\n * common to chat bots and other long-running agent consumers. See ADR D22.\n *\n * Resolution:\n * 1. Try `Agent.resume(agentId, options)`. Return on success.\n * 2. On `UnknownAgentError`, fall through to `Agent.create({ ...options, agentId })`.\n * 3. On same-process race (`ConfigurationError(code: \"agent_id_already_exists\")`\n * during step 2), retry `Agent.resume` once and return the winner's handle.\n * 4. Any other error propagates verbatim.\n *\n * Caveats:\n * - The function-level `agentId` always wins over `options.agentId`.\n * - Options differ between calls? Last-call-wins for this handle (matches `Agent.resume`).\n * - Disposed agents are NOT auto-deleted from the registry. To force a fresh\n * agent, call `Agent.delete(agentId)` first.\n *\n * @public\n */\n static async getOrCreate(agentId: string, options: AgentOptions): Promise<SDKAgent> {\n // T2.6: live-agent cache hit. `get` refreshes lastUsedAt so the entry\n // resists LRU eviction. Cache disabled via `Agent.registry.configure({ maxAgents: 0 })`\n // — set is no-op, get always returns undefined, so re-initialization runs.\n const cached = Agent.registry.get(agentId);\n if (cached !== undefined) return cached;\n\n const fresh = await getOrCreateUncached(agentId, options);\n Agent.registry.set(agentId, fresh);\n return fresh;\n }\n\n /**\n * List agents (local or cloud).\n *\n * @public\n */\n static async list(options: ListAgentsOptions = {}): Promise<ListResult<SDKAgentInfo>> {\n await hydrateRegistryFromDisk(process.cwd());\n const runtime = options.runtime;\n const all = listRegisteredAgents(runtime);\n const items = all.map((agent) => toAgentInfo(agent));\n return { items };\n }\n\n /**\n * Get metadata for a single agent.\n *\n * @public\n */\n static async get(agentId: string, _options: GetAgentOptions = {}): Promise<SDKAgentInfo> {\n const agent = await getRegisteredAgentOrThrow(agentId);\n return toAgentInfo(agent);\n }\n\n /**\n * List runs for an agent.\n *\n * @public\n */\n static async listRuns(agentId: string, _options: ListRunsOptions = {}): Promise<ListResult<Run>> {\n await getRegisteredAgentOrThrow(agentId);\n return { items: listRunsByAgent(agentId) };\n }\n\n /**\n * Get a single run.\n *\n * @public\n */\n static async getRun(runId: string, options: GetRunOptions = {}): Promise<Run> {\n if (options.runtime === \"cloud\") {\n throw new ConfigurationError(\n \"Cloud runtime is pre-release. Theo PaaS endpoints are not wired yet — getRun({ runtime: 'cloud' }) will be enabled when the PaaS ships.\",\n { code: \"cloud_runtime_pre_release\" },\n );\n }\n const existing = getRegisteredRun(runId);\n if (existing !== undefined) return existing;\n throw new UnknownAgentError(\n `Run ${runId} is not in this process's registry. It may have been disposed, persisted in a previous process, or never created.`,\n { code: \"run_not_found\" },\n );\n }\n\n /**\n * Archive a cloud agent.\n *\n * @public\n */\n static archive(agentId: string, _options: AgentOperationOptions = {}): Promise<void> {\n return setArchivedFlag(agentId, true);\n }\n\n /**\n * Restore an archived cloud agent.\n *\n * @public\n */\n static unarchive(agentId: string, _options: AgentOperationOptions = {}): Promise<void> {\n return setArchivedFlag(agentId, false);\n }\n\n /**\n * Permanently delete a cloud agent.\n *\n * @public\n */\n static async delete(agentId: string, _options: AgentOperationOptions = {}): Promise<void> {\n removeRegisteredAgent(agentId);\n await flushRegistrySaves();\n }\n}\n\n/**\n * Resolve the cwd used for persistence routing. Local agents pin a workspace\n * cwd via `options.local.cwd`; cloud agents and unspecified locals default to\n * `process.cwd()`. Matches the routing key set by `LocalAgent`/`CloudAgent`\n * constructors so disk reads and writes hit the same `<cwd>/.theokit/agents/registry.json`.\n *\n * @internal\n */\n/**\n * D214-D229 — when `options.handoffs` is non-empty, synthesize one\n * `transfer_to_<receiver>` tool per destination and merge into options.tools.\n *\n * Skipped when `maxHandoffDepth === 0` (EC-8 — explicit disable).\n *\n * @internal\n */\n/**\n * Wraps the previous `getOrCreate` body — try resume, on UnknownAgentError\n * fall through to create, on `agent_id_already_exists` race retry resume.\n * Extracted so `Agent.getOrCreate` can short-circuit on cache hit before\n * incurring the resume disk read.\n *\n * @internal\n */\nasync function getOrCreateUncached(agentId: string, options: AgentOptions): Promise<SDKAgent> {\n try {\n return await Agent.resume(agentId, options);\n } catch (err) {\n if (!(err instanceof UnknownAgentError)) throw err;\n }\n try {\n return await Agent.create({ ...options, agentId });\n } catch (err) {\n // EC-1: another caller in the same process won the create race between\n // our resume miss and our create attempt. Reuse their handle instead of\n // surfacing the conflict to the caller.\n if (err instanceof ConfigurationError && err.code === \"agent_id_already_exists\") {\n return await Agent.resume(agentId, options);\n }\n throw err;\n }\n}\n\nasync function maybeInjectHandoffTools(options: AgentOptions): Promise<AgentOptions> {\n const handoffs = options.handoffs;\n if (handoffs === undefined || handoffs.length === 0) return options;\n if (options.maxHandoffDepth === 0) return options;\n\n // Lazy import to keep the cold path lean for non-handoff agents.\n const { normalizeHandoffs, buildHandoffTool } = await import(\n \"./internal/handoff/tool-injector.js\"\n );\n const parentAgentId = options.agentId ?? options.name ?? \"anonymous\";\n const normalized = normalizeHandoffs(parentAgentId, handoffs);\n const maxDepth = options.maxHandoffDepth ?? 5;\n const handoffTools = normalized.map(({ descriptor }) =>\n buildHandoffTool(parentAgentId, descriptor, maxDepth),\n );\n const existingTools = options.tools ?? [];\n return {\n ...options,\n tools: [...existingTools, ...handoffTools],\n };\n}\n\nfunction resolveAgentPersistenceCwd(options: Partial<AgentOptions>): string {\n const localCwd = options.local?.cwd;\n if (typeof localCwd === \"string\") return localCwd;\n if (Array.isArray(localCwd) && typeof localCwd[0] === \"string\") return localCwd[0];\n return process.cwd();\n}\n\n/**\n * D21 validation: when rehydrating a persisted local agent, ensure the\n * recorded workspace cwd still exists on disk. Without this, a stale entry\n * would silently re-initialize against a missing path and fail mysteriously\n * deep inside the loader chain.\n *\n * @internal\n */\n/**\n * Rehydration helper extracted from `Agent.resume` to keep cyclomatic\n * complexity under the 10-cap (G2). Validates the persisted entry, enforces\n * the EC-3 `requiresCustomStorage` integrity check, deep-merges options, then\n * constructs the right runtime class.\n *\n * @internal\n */\nasync function rehydrateExistingAgent(\n agentId: string,\n existing: RegisteredAgent,\n options: Partial<AgentOptions>,\n): Promise<SDKAgent> {\n await validateRehydratedAgent(agentId, existing);\n // EC-3 / D325: refuse silent FS fallback when the agent was created with a\n // custom conversationStorage. Reading an empty `.theokit/agents/<id>/messages.jsonl`\n // for a Postgres-backed agent would corrupt the conversation.\n if (existing.requiresCustomStorage === true && options.conversationStorage === undefined) {\n throw new ConfigurationError(\n `Agent \"${agentId}\" was created with a custom conversationStorage adapter; pass conversationStorage again on resume to avoid losing history.`,\n { code: \"conversation_storage_required\" },\n );\n }\n // Strip inline mcpServers — they don't persist across resume. Deep-merge\n // `local` so callers passing `local: { cwd }` keep persisted settingSources\n // and sandboxOptions (shallow spread previously wiped these).\n const mergedLocal =\n options.local !== undefined && existing.options.local !== undefined\n ? { ...existing.options.local, ...options.local }\n : (options.local ?? existing.options.local);\n const mergedOptions: AgentOptions = {\n ...existing.options,\n ...options,\n ...(mergedLocal !== undefined ? { local: mergedLocal } : {}),\n mcpServers: undefined,\n agentId,\n };\n if (existing.runtime === \"cloud\") {\n return new CloudAgent(mergedOptions, agentId);\n }\n const agent = new LocalAgent({ ...mergedOptions, model: existing.options.model });\n await agent.initialize();\n return agent;\n}\n\nasync function validateRehydratedAgent(\n agentId: string,\n entry: { runtime: \"local\" | \"cloud\"; cwd?: string; options: AgentOptions },\n): Promise<void> {\n if (entry.runtime !== \"local\") return;\n const candidate = entry.options.local?.cwd ?? entry.cwd;\n if (typeof candidate !== \"string\") return;\n try {\n const info = await stat(candidate);\n if (!info.isDirectory()) {\n throw new Error(`Workspace path is not a directory: ${candidate}`);\n }\n } catch (cause) {\n throw new UnknownAgentError(\n `Agent \"${agentId}\" cannot be rehydrated — workspace cwd \"${candidate}\" is missing or inaccessible.`,\n { code: \"agent_rehydration_failed\", cause },\n );\n }\n}\n\nasync function createLocalAgent(options: AgentOptions): Promise<SDKAgent> {\n const apiKey = resolveApiKey(options.apiKey);\n if (apiKey === undefined) {\n throw new AuthenticationError(\"Missing API key\", { code: \"missing_api_key\" });\n }\n if (\n !isFixtureApiKey(apiKey) &&\n getConfiguredBaseUrl() === undefined &&\n !shouldUseRealLocalRuntime(apiKey)\n ) {\n throw new AuthenticationError(\"Invalid API key\", {\n code: \"authentication_error\",\n });\n }\n const agent = new LocalAgent(options);\n await agent.initialize();\n return agent;\n}\n\nasync function createCloudAgent(options: AgentOptions): Promise<SDKAgent> {\n const apiKey = resolveApiKey(options.apiKey);\n if (apiKey === undefined) {\n throw new ConfigurationError(\"Missing API key for cloud agent\", {\n code: \"missing_api_key\",\n });\n }\n\n const baseUrl = getConfiguredBaseUrl();\n if (baseUrl === undefined) {\n return new CloudAgent(options);\n }\n\n type CreateResponse = { agentId: string; model?: { id: string } };\n const response = await httpRequest<CreateResponse>(\"/v1/agents\", {\n apiKey,\n method: \"POST\",\n body: {\n model: options.model,\n name: options.name,\n cloud: options.cloud,\n mcpServers: options.mcpServers,\n agents: options.agents,\n },\n });\n const mergedOptions: AgentOptions = {\n ...options,\n agentId: response.agentId,\n ...(response.model !== undefined ? { model: response.model } : {}),\n };\n return new CloudAgent(mergedOptions, response.agentId);\n}\n\ntype RegisteredAgent = ReturnType<typeof getRegisteredAgent> & object;\n\nfunction toAgentInfo(agent: RegisteredAgent): SDKAgentInfo {\n return isLocalAgentId(agent.agentId) ? toLocalAgentInfo(agent) : toCloudAgentInfo(agent);\n}\n\nfunction commonAgentInfo(agent: RegisteredAgent, fallbackSummary: string) {\n return {\n agentId: agent.agentId,\n name: agent.name ?? \"Untitled agent\",\n summary: agent.summary ?? fallbackSummary,\n lastModified: agent.lastModified,\n createdAt: agent.createdAt,\n ...(agent.status !== undefined ? { status: agent.status } : {}),\n };\n}\n\nfunction toLocalAgentInfo(agent: RegisteredAgent): SDKAgentInfo {\n return {\n ...commonAgentInfo(agent, \"Local contract fixture\"),\n runtime: \"local\",\n ...(agent.cwd !== undefined ? { cwd: agent.cwd } : {}),\n };\n}\n\nfunction toCloudAgentInfo(agent: RegisteredAgent): SDKAgentInfo {\n return {\n ...commonAgentInfo(agent, \"Cloud contract fixture\"),\n archived: agent.archived,\n runtime: \"cloud\",\n env: { type: \"cloud\" },\n ...(agent.repos !== undefined ? { repos: agent.repos } : {}),\n };\n}\n\nasync function setArchivedFlag(agentId: string, archived: boolean): Promise<void> {\n await getRegisteredAgentOrThrow(agentId);\n updateRegisteredAgent(agentId, { archived });\n // Block until disk reflects the flip so subsequent reads observe it (D17).\n await flushRegistrySaves();\n}\n\n/**\n * Lookup a registered agent by ID, falling back to disk rehydration (ADR D21)\n * before throwing {@link UnknownAgentError}. Shared by the surfaces that need\n * the resume-aware contract (`get`, `listRuns`, `setArchivedFlag`).\n */\nasync function getRegisteredAgentOrThrow(agentId: string): Promise<RegisteredAgent> {\n let agent = getRegisteredAgent(agentId);\n if (agent === undefined) {\n await hydrateRegistryFromDisk(process.cwd());\n agent = getRegisteredAgent(agentId);\n }\n if (agent === undefined) {\n throw new UnknownAgentError(`Agent ${agentId} not found`, { code: \"unknown_agent\" });\n }\n return agent;\n}\n\n// Module-init registration so LocalAgent.runUntil / LocalAgent.fork can\n// spawn auxiliary agents without forming an import cycle. See\n// `internal/runtime/agent-factory-registry.ts` for rationale.\nsetAgentCreate((options) => Agent.create(options));\n","/**\n * Environment variable used to provide the default API key.\n *\n * @internal\n */\nexport const API_KEY_ENV_VAR = \"THEOKIT_API_KEY\";\n\n/**\n * Resolve the API key with the documented precedence:\n *\n * 1. Explicit `apiKey` argument.\n * 2. The `THEOKIT_API_KEY` environment variable.\n *\n * Returns `undefined` when neither is set.\n *\n * @internal\n */\nexport function resolveApiKey(explicit?: string): string | undefined {\n if (explicit !== undefined && explicit.length > 0) {\n return explicit;\n }\n const fromEnv = process.env[API_KEY_ENV_VAR];\n if (fromEnv !== undefined && fromEnv.length > 0) {\n return fromEnv;\n }\n return undefined;\n}\n","/**\n * Fixture-mode detection.\n *\n * When `THEOKIT_API_BASE_URL` is NOT set and the API key matches the\n * `theo_test_*` pattern, the SDK runs in fixture mode — it returns\n * deterministic, baked-in responses that match the golden fixtures under\n * `tests/golden/`. This is documented behavior and part of the contract\n * (analogous to Stripe's test keys), NOT a test-side mock.\n *\n * When `THEOKIT_API_BASE_URL` is set (e.g. pointing at a test HTTP server\n * or a real Theo PaaS instance), the SDK always performs real HTTP\n * requests — fixture mode is short-circuited.\n *\n * @internal\n */\n\nimport { existsSync } from \"node:fs\";\n\nconst FIXTURE_API_KEY_PREFIX = \"theo_test_\";\n\n/**\n * Returns `true` when the given API key is a fixture-mode key.\n *\n * @internal\n */\nexport function isFixtureApiKey(apiKey: string | undefined): boolean {\n if (apiKey === undefined) return false;\n return apiKey.startsWith(FIXTURE_API_KEY_PREFIX);\n}\n\n/**\n * Returns the base URL configured via `THEOKIT_API_BASE_URL`, or `undefined`\n * when not set.\n *\n * @internal\n */\nexport function getConfiguredBaseUrl(): string | undefined {\n const value = process.env.THEOKIT_API_BASE_URL;\n if (value === undefined || value.length === 0) return undefined;\n return value;\n}\n\n/**\n * Returns `true` when the SDK should respond from baked-in fixture data\n * instead of performing a real HTTP request.\n *\n * Rule: fixture mode is on iff (no explicit base URL configured) AND\n * (API key matches the fixture-key pattern).\n *\n * @internal\n */\nexport function shouldUseFixtureMode(apiKey: string | undefined): boolean {\n if (getConfiguredBaseUrl() !== undefined) return false;\n return isFixtureApiKey(apiKey);\n}\n\n/**\n * Returns `true` when the local runtime should drive the real LLM agent\n * loop instead of the deterministic fixture responder. Real mode requires\n * a non-fixture API key AND at least one provider env credential.\n *\n * @internal\n */\nexport function shouldUseRealLocalRuntime(apiKey: string | undefined): boolean {\n if (isFixtureApiKey(apiKey)) return false;\n if (apiKey === undefined || apiKey.length === 0) return false;\n // ADR D182 / T1.2: `authType: \"none\"` providers (Ollama, LM Studio,\n // llama.cpp) do not require any provider env var. Treat their presence\n // — signaled via OLLAMA_HOST/LMSTUDIO_HOST/LLAMACPP_HOST OR the\n // implicit-localhost default — as a green-light for real runtime.\n // For zero-config Ollama, we accept the default `http://localhost:11434`\n // unconditionally; the actual call will surface a typed\n // `ollama_unreachable` if Ollama is not running.\n return (\n (typeof process.env.ANTHROPIC_API_KEY === \"string\" &&\n process.env.ANTHROPIC_API_KEY.length > 0) ||\n (typeof process.env.OPENAI_API_KEY === \"string\" && process.env.OPENAI_API_KEY.length > 0) ||\n (typeof process.env.OPENROUTER_API_KEY === \"string\" &&\n process.env.OPENROUTER_API_KEY.length > 0) ||\n isAwsBedrockAuthAvailable() ||\n isGcpVertexAuthAvailable() ||\n isLocalNoAuthProviderAvailable()\n );\n}\n\n/**\n * ADRs D286-D287: Bedrock green-lights real runtime when EITHER\n * `AWS_BEARER_TOKEN_BEDROCK` is set explicitly OR the standard AWS\n * credential chain (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` /\n * `AWS_PROFILE` / instance role) can mint a Bearer via\n * `@aws/bedrock-token-generator`. We only check synchronous signals here;\n * the actual token resolution happens lazily in\n * `BedrockAnthropicClient.stream`.\n */\nfunction isAwsBedrockAuthAvailable(): boolean {\n if (\n typeof process.env.AWS_BEARER_TOKEN_BEDROCK === \"string\" &&\n process.env.AWS_BEARER_TOKEN_BEDROCK.length > 0\n ) {\n return true;\n }\n if (\n typeof process.env.AWS_ACCESS_KEY_ID === \"string\" &&\n process.env.AWS_ACCESS_KEY_ID.length > 0\n ) {\n return true;\n }\n if (typeof process.env.AWS_PROFILE === \"string\" && process.env.AWS_PROFILE.length > 0) {\n return true;\n }\n // Default profile file (~/.aws/credentials). The credential chain will\n // resolve it via fromNodeProviderChain() at stream time, or surface a\n // helpful error if neither file nor IMDS is reachable.\n return awsCredentialsFileExists();\n}\n\nfunction awsCredentialsFileExists(): boolean {\n try {\n const home = process.env.HOME ?? process.env.USERPROFILE;\n if (home === undefined || home.length === 0) return false;\n return existsSync(`${home}/.aws/credentials`) || existsSync(`${home}/.aws/config`);\n } catch {\n return false;\n }\n}\n\n/**\n * ADR D288: Vertex green-lights real runtime when EITHER\n * `GOOGLE_APPLICATION_CREDENTIALS` is set OR `GOOGLE_CLOUD_PROJECT` is set\n * (ADC will use gcloud user creds / metadata server). The actual token\n * resolution happens lazily in `VertexAnthropicClient.stream` /\n * `VertexGeminiClient.stream`.\n */\nfunction isGcpVertexAuthAvailable(): boolean {\n if (\n typeof process.env.GOOGLE_APPLICATION_CREDENTIALS === \"string\" &&\n process.env.GOOGLE_APPLICATION_CREDENTIALS.length > 0\n ) {\n return true;\n }\n if (\n typeof process.env.GOOGLE_CLOUD_PROJECT === \"string\" &&\n process.env.GOOGLE_CLOUD_PROJECT.length > 0\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * ADR D182 / T1.2: zero-config local providers (`authType: \"none\"`) are\n * always available — Ollama defaults to localhost:11434, LM Studio to\n * localhost:1234, llama.cpp to localhost:8080. We don't probe here\n * (would require async); we return `true` when ANY of the documented\n * local hosts is reachable in spirit. The first real LLM call surfaces\n * `ollama_unreachable` via the typed mapper if no daemon is up.\n */\nfunction isLocalNoAuthProviderAvailable(): boolean {\n // Always true — the SDK ships Ollama as a builtin. Caller will see a\n // typed error if it isn't actually running.\n return true;\n}\n","import {\n AuthenticationError,\n ConfigurationError,\n IntegrationNotConnectedError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../errors.js\";\nimport { getConfiguredBaseUrl } from \"./fixture-mode.js\";\n\n/**\n * Default base URL used when neither `THEOKIT_API_BASE_URL` nor an explicit\n * override is provided. The fixture-mode short-circuit normally bypasses this\n * for `theo_test_*` keys; consumers with real keys hit this URL.\n *\n * @internal\n */\nexport const DEFAULT_BASE_URL = \"https://api.usetheo.dev\";\n\n/**\n * HTTP request options accepted by {@link httpRequest}.\n *\n * @internal\n */\nexport interface HttpRequestOptions {\n apiKey: string;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n body?: unknown;\n /** Override the default `fetch` (useful for tests / instrumentation). */\n fetchFn?: typeof globalThis.fetch;\n /** Extra headers merged into the default set. */\n headers?: Record<string, string>;\n}\n\n/**\n * Server-side error envelope (`{ error: { code, message, ... } }` or a flat\n * shape) parsed off non-2xx responses.\n *\n * @internal\n */\ninterface ErrorEnvelope {\n code?: string;\n message?: string;\n protoErrorCode?: string;\n provider?: string;\n helpUrl?: string;\n}\n\n/**\n * Resolve the effective base URL (explicit env > default).\n *\n * @internal\n */\nexport function resolveBaseUrl(): string {\n return getConfiguredBaseUrl() ?? DEFAULT_BASE_URL;\n}\n\n/**\n * Perform an authenticated JSON HTTP request, mapping non-2xx responses to\n * the public typed-error hierarchy. Throws subclasses of `TheokitAgentError`\n * on failure.\n *\n * @internal\n */\nexport async function httpRequest<T>(path: string, options: HttpRequestOptions): Promise<T> {\n const url = `${resolveBaseUrl()}${path}`;\n const fetchFn = options.fetchFn ?? globalThis.fetch;\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${options.apiKey}`,\n ...(options.headers ?? {}),\n };\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n\n const response = await safeFetch(fetchFn, url, {\n method: options.method ?? \"GET\",\n headers,\n body,\n });\n\n if (!response.ok) {\n const parsed = await safeParseJsonResponse(response);\n throw mapHttpStatusToError(response.status, parsed);\n }\n\n return (await safeParseJsonResponse(response)) as T;\n}\n\nasync function safeFetch(\n fetchFn: typeof globalThis.fetch,\n url: string,\n init: RequestInit,\n): Promise<Response> {\n try {\n return await fetchFn(url, init);\n } catch (cause) {\n throw new NetworkError(\"HTTP request failed\", { code: \"network_error\", cause });\n }\n}\n\nasync function safeParseJsonResponse(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Translate an HTTP error response into a typed `TheokitAgentError` subclass.\n *\n * @internal\n */\nexport function mapHttpStatusToError(status: number, body: unknown): TheokitAgentError {\n const envelope = extractErrorEnvelope(body);\n const message = envelope.message ?? `HTTP ${status}`;\n const errorOptions = {\n code: envelope.code,\n protoErrorCode: envelope.protoErrorCode,\n cause: body,\n };\n\n if (envelope.code === \"integration_not_connected\") {\n return new IntegrationNotConnectedError(message, {\n provider: envelope.provider ?? \"unknown\",\n helpUrl: envelope.helpUrl ?? \"\",\n code: envelope.code,\n cause: body,\n });\n }\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, errorOptions);\n }\n if (status === 429) {\n return new RateLimitError(message, errorOptions);\n }\n if (status >= 400 && status < 500) {\n return new ConfigurationError(message, errorOptions);\n }\n if (status >= 500) {\n return new NetworkError(message, errorOptions);\n }\n return new UnknownAgentError(message, errorOptions);\n}\n\nfunction extractErrorEnvelope(body: unknown): ErrorEnvelope {\n if (!body || typeof body !== \"object\") return {};\n const record = body as Record<string, unknown>;\n const inner = record.error;\n const source: unknown = inner && typeof inner === \"object\" ? inner : record;\n return readEnvelopeFields(source as Record<string, unknown>);\n}\n\nfunction readEnvelopeFields(record: Record<string, unknown>): ErrorEnvelope {\n return {\n code: pickString(record, \"code\"),\n message: pickString(record, \"message\"),\n protoErrorCode: pickString(record, \"protoErrorCode\"),\n provider: pickString(record, \"provider\"),\n helpUrl: pickString(record, \"helpUrl\"),\n };\n}\n\nfunction pickString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" ? value : undefined;\n}\n","import { randomUUID } from \"node:crypto\";\n\n/**\n * Stable prefixes that drive runtime auto-detection in `Agent.resume()`,\n * `Agent.get()`, etc. See `.claude/quality-gates.md` and docs.md.\n *\n * @internal\n */\nconst PREFIX = {\n localAgent: \"agent-\",\n cloudAgent: \"bc-\",\n run: \"run-\",\n call: \"call-\",\n cron: \"cron-\",\n request: \"request-\",\n} as const;\n\n/**\n * Generate a local-runtime agent ID. Format: `agent-<uuid>`.\n *\n * @internal\n */\nexport function generateLocalAgentId(): string {\n return `${PREFIX.localAgent}${randomUUID()}`;\n}\n\n/**\n * Generate a cloud-runtime agent ID. Format: `bc-<uuid>`.\n *\n * @internal\n */\nexport function generateCloudAgentId(): string {\n return `${PREFIX.cloudAgent}${randomUUID()}`;\n}\n\n/**\n * Generate a run ID. Format: `run-<uuid>`.\n *\n * @internal\n */\nexport function generateRunId(): string {\n return `${PREFIX.run}${randomUUID()}`;\n}\n\n/**\n * Generate a tool-call ID. Format: `call-<uuid>`.\n *\n * @internal\n */\nexport function generateCallId(): string {\n return `${PREFIX.call}${randomUUID()}`;\n}\n\n/**\n * Generate a cron job ID. Format: `cron-<uuid>`.\n *\n * @internal\n */\nexport function generateCronId(): string {\n return `${PREFIX.cron}${randomUUID()}`;\n}\n\n/**\n * Generate a user-input/approval request ID. Format: `request-<uuid>`.\n *\n * @internal\n */\nexport function generateRequestId(): string {\n return `${PREFIX.request}${randomUUID()}`;\n}\n\n/**\n * Detect whether an agent ID belongs to the local runtime.\n *\n * @internal\n */\nexport function isLocalAgentId(id: string): boolean {\n return id.startsWith(PREFIX.localAgent);\n}\n\n/**\n * Detect whether an agent ID belongs to the cloud runtime.\n *\n * @internal\n */\nexport function isCloudAgentId(id: string): boolean {\n return id.startsWith(PREFIX.cloudAgent);\n}\n","import { join } from \"node:path\";\n\nimport type { AgentOptions } from \"../../types/agent.js\";\nimport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\nimport { readVersionedJson, writeVersionedJson } from \"../persistence/schema-version.js\";\nimport type { AgentRuntime, RegisteredAgent } from \"./agent-registry.js\";\n\n/**\n * Persistent agent registry (ADR D17).\n *\n * Per-cwd JSON file at `.theokit/agents/registry.json`. Atomic writes via\n * `replaceFileAtomic`. Secrets in `options` are stripped before persisting\n * (D17 + reuses the cloud-config-serializer allow-list philosophy).\n *\n * Multi-process write race is the documented limitation: one SDK process per\n * cwd (EC-10).\n *\n * @internal\n */\n\n/** Current numeric schema version for the agent registry (ADR D62). */\nconst SCHEMA_VERSION = 1;\nconst LEGACY_SCHEMA_VERSION_STRING = \"1.0\";\nconst REGISTRY_RELATIVE_PATH = join(\".theokit\", \"agents\", \"registry.json\");\n\n/** Legacy on-disk shape (pre-D62 — `schemaVersion` string field + flat `agents`). */\ninterface LegacyRegistryFile {\n schemaVersion?: string;\n agents?: Record<string, SerializedAgent>;\n}\n\ninterface SerializedAgent {\n agentId: string;\n runtime: AgentRuntime;\n name?: string;\n summary?: string;\n model?: RegisteredAgent[\"model\"];\n createdAt: number;\n lastModified: number;\n archived: boolean;\n options: SerializedAgentOptions;\n cwd?: string;\n repos?: string[];\n status?: RegisteredAgent[\"status\"];\n /**\n * D325 / EC-3: serialized marker recording that the agent was created with\n * a custom `AgentOptions.conversationStorage`. Resume rejects when this is\n * `true` and the caller did not pass `conversationStorage` again — prevents\n * silent FS fallback that loses Postgres/Redis history.\n */\n requiresCustomStorage?: boolean;\n}\n\n/**\n * Strips secrets from AgentOptions before persisting. Mirrors the allow-list\n * approach used by the cloud-config-serializer (ADR D15).\n *\n * @internal\n */\nexport function stripSecretsFromOptions(options: AgentOptions): SerializedAgentOptions {\n // EC-2: apiKey, mcpServers (may contain headers/env secrets), AgentOptions.tools\n // (custom-tool handlers are closures and cannot be serialized), hooks closures —\n // all explicitly NOT forwarded. The agent loop re-resolves these from env on\n // rehydration; custom tools must be re-passed via Agent.resume(id, { tools: [...] }).\n return assignDefined<SerializedAgentOptions>({\n name: options.name,\n model: options.model !== undefined ? { id: options.model.id } : undefined,\n systemPrompt: typeof options.systemPrompt === \"string\" ? options.systemPrompt : undefined,\n local: serializeLocal(options.local),\n cloud: serializeCloud(options.cloud),\n memory: serializeMemory(options.memory),\n skills: serializeEnabledList(options.skills),\n plugins: serializeEnabledList(options.plugins),\n context: serializeContext(options.context),\n providers: serializeProviders(options.providers),\n agents: serializeAgents(options.agents),\n });\n}\n\n/** Drops `undefined` entries from a partial object, preserving the field shape. */\nfunction assignDefined<T extends object>(partial: { [K in keyof T]?: T[K] | undefined }): T {\n const result = {} as T;\n for (const key of Object.keys(partial) as (keyof T)[]) {\n const value = partial[key];\n if (value !== undefined) result[key] = value as T[typeof key];\n }\n return result;\n}\n\nfunction serializeEnabledList(\n list: { enabled?: ReadonlyArray<string> } | undefined,\n): { enabled?: ReadonlyArray<string> } | undefined {\n if (list === undefined) return undefined;\n return list.enabled !== undefined ? { enabled: [...list.enabled] } : {};\n}\n\nfunction serializeLocal(local: AgentOptions[\"local\"]): SerializedAgentOptions[\"local\"] | undefined {\n if (local === undefined) return undefined;\n const out: SerializedAgentOptions[\"local\"] = {};\n if (typeof local.cwd === \"string\") out.cwd = local.cwd;\n if (Array.isArray(local.settingSources)) out.settingSources = [...local.settingSources];\n // Sandbox config — not a secret; needs to survive resume so that\n // safe-by-default doesn't silently regress to unsandboxed on restart.\n if (local.sandboxOptions !== undefined) {\n out.sandboxOptions = { enabled: local.sandboxOptions.enabled === true };\n }\n return out;\n}\n\nfunction serializeCloud(cloud: AgentOptions[\"cloud\"]): SerializedAgentOptions[\"cloud\"] | undefined {\n if (cloud === undefined) return undefined;\n return {\n repos: (cloud.repos ?? []).map((r) => ({\n url: r.url,\n ...(typeof r.startingRef === \"string\" ? { startingRef: r.startingRef } : {}),\n })),\n ...(cloud.autoCreatePR === true ? { autoCreatePR: true } : {}),\n };\n}\n\nfunction serializeMemory(\n memory: AgentOptions[\"memory\"],\n): SerializedAgentOptions[\"memory\"] | undefined {\n if (memory === undefined) return undefined;\n const out: SerializedAgentOptions[\"memory\"] = { enabled: memory.enabled === true };\n if (memory.namespace !== undefined) out.namespace = memory.namespace;\n if (memory.userId !== undefined) out.userId = memory.userId;\n if (memory.scope !== undefined) out.scope = memory.scope;\n if (memory.activeRecall !== undefined) out.activeRecall = { ...memory.activeRecall };\n if (memory.index !== undefined) out.index = serializeMemoryIndex(memory.index);\n return out;\n}\n\nfunction serializeMemoryIndex(\n index: NonNullable<AgentOptions[\"memory\"]>[\"index\"],\n): NonNullable<SerializedAgentOptions[\"memory\"]>[\"index\"] {\n const out: NonNullable<SerializedAgentOptions[\"memory\"]>[\"index\"] = {};\n if (index === undefined) return out;\n if (index.tools !== undefined) out.tools = index.tools;\n if (index.backend !== undefined) out.backend = index.backend;\n if (index.embedding !== undefined) {\n out.embedding = {\n provider: index.embedding.provider,\n ...(index.embedding.model !== undefined ? { model: index.embedding.model } : {}),\n };\n }\n return out;\n}\n\nfunction serializeContext(\n context: AgentOptions[\"context\"],\n): SerializedAgentOptions[\"context\"] | undefined {\n if (context === undefined) return undefined;\n // Context manager config — no secrets, persists for Agent.resume rehydration.\n const out: NonNullable<SerializedAgentOptions[\"context\"]> = {};\n if (context.manager !== undefined) out.manager = context.manager;\n if (context.maxTokens !== undefined) out.maxTokens = context.maxTokens;\n return out;\n}\n\nfunction serializeProviders(\n providers: AgentOptions[\"providers\"],\n): SerializedAgentOptions[\"providers\"] | undefined {\n if (providers === undefined) return undefined;\n // Provider routing — capability/provider/model are public catalog entries.\n return {\n routes: providers.routes.map((r) => ({\n capability: r.capability,\n provider: r.provider,\n ...(r.model !== undefined ? { model: r.model } : {}),\n })),\n ...(providers.fallback !== undefined ? { fallback: [...providers.fallback] } : {}),\n };\n}\n\nfunction serializeAgents(\n agents: AgentOptions[\"agents\"],\n): SerializedAgentOptions[\"agents\"] | undefined {\n if (agents === undefined) return undefined;\n // Subagents (inline `AgentDefinition` map) — persist description + prompt\n // + model. Subagent `mcpServers` MAY carry headers/env secrets, so strip\n // them (same rationale as the parent agent's mcpServers).\n const out: NonNullable<SerializedAgentOptions[\"agents\"]> = {};\n for (const [name, def] of Object.entries(agents)) {\n out[name] = {\n description: def.description,\n prompt: def.prompt,\n ...(def.model !== undefined ? { model: def.model } : {}),\n };\n }\n return out;\n}\n\nexport interface SerializedAgentOptions {\n name?: string;\n model?: { id: string };\n systemPrompt?: string;\n local?: {\n cwd?: string;\n settingSources?: ReadonlyArray<string>;\n sandboxOptions?: { enabled: boolean };\n };\n cloud?: {\n repos: ReadonlyArray<{ url: string; startingRef?: string }>;\n autoCreatePR?: boolean;\n };\n memory?: {\n enabled: boolean;\n namespace?: string;\n userId?: string;\n scope?: string;\n index?: {\n tools?: boolean;\n backend?: string;\n embedding?: { provider: string; model?: string };\n };\n activeRecall?: Record<string, unknown>;\n };\n skills?: { enabled?: ReadonlyArray<string> };\n plugins?: { enabled?: ReadonlyArray<string> };\n context?: { manager?: string; maxTokens?: number };\n providers?: {\n routes: ReadonlyArray<{ capability: string; provider: string; model?: string }>;\n fallback?: ReadonlyArray<string>;\n };\n agents?: Record<\n string,\n { description: string; prompt: string; model?: { id: string } | \"inherit\" }\n >;\n}\n\nfunction registryPath(cwd: string): string {\n return join(cwd, REGISTRY_RELATIVE_PATH);\n}\n\n/**\n * Read the persisted registry from disk. Returns `{}` on missing file OR\n * malformed JSON (EC-4 — never throws on corrupt registry). Emits a stderr\n * warning when corruption is detected.\n *\n * @internal\n */\nexport async function loadRegistry(cwd: string): Promise<Record<string, SerializedAgent>> {\n return readVersionedJson<Record<string, SerializedAgent>>({\n path: registryPath(cwd),\n currentVersion: SCHEMA_VERSION,\n defaultValue: () => ({}),\n // EC-2 fix: `parsed` is the full object so we can detect + migrate legacy\n // shape `{ schemaVersion: \"1.0\", agents: {...} }` (no `_schemaVersion`,\n // no `data` wrapper).\n migrate: (parsed, _fromVersion) => {\n if (typeof parsed !== \"object\" || parsed === null) return {};\n const legacy = parsed as LegacyRegistryFile;\n if (legacy.schemaVersion === LEGACY_SCHEMA_VERSION_STRING && legacy.agents) {\n return legacy.agents;\n }\n return {};\n },\n });\n}\n\n/**\n * Write the registry to disk via `replaceFileAtomic` under a per-cwd mutex.\n * Coalesces concurrent in-process writes; cross-process writes still race\n * (EC-10 documented limitation).\n *\n * @internal\n */\nexport async function saveRegistry(\n cwd: string,\n agents: Record<string, RegisteredAgent>,\n): Promise<void> {\n const serialized: Record<string, SerializedAgent> = {};\n for (const [id, agent] of Object.entries(agents)) {\n serialized[id] = toSerialized(agent);\n }\n const path = registryPath(cwd);\n await withCwdMutex(`registry:${cwd}`, async () => {\n // writeVersionedJson writes `{ _schemaVersion: N, data: serialized }`\n // atomically (parent dir auto-created via atomicWriteJson).\n await writeVersionedJson(path, serialized, SCHEMA_VERSION);\n });\n}\n\nfunction toSerialized(agent: RegisteredAgent): SerializedAgent {\n const out: SerializedAgent = {\n agentId: agent.agentId,\n runtime: agent.runtime,\n createdAt: agent.createdAt,\n lastModified: agent.lastModified,\n archived: agent.archived,\n options: stripSecretsFromOptions(agent.options),\n };\n if (agent.name !== undefined) out.name = agent.name;\n if (agent.summary !== undefined) out.summary = agent.summary;\n if (agent.model !== undefined) out.model = agent.model;\n if (agent.cwd !== undefined) out.cwd = agent.cwd;\n if (agent.repos !== undefined) out.repos = [...agent.repos];\n if (agent.status !== undefined) out.status = agent.status;\n if (agent.requiresCustomStorage === true) out.requiresCustomStorage = true;\n return out;\n}\n\n/**\n * Rehydrate a SerializedAgent from disk into a RegisteredAgent shape.\n * Returns undefined when the persisted options can't be revived (e.g.,\n * `local.cwd` no longer exists — caller throws agent_rehydration_failed).\n *\n * @internal\n */\nexport function fromSerialized(entry: SerializedAgent): RegisteredAgent {\n return {\n agentId: entry.agentId,\n runtime: entry.runtime,\n name: entry.name,\n summary: entry.summary,\n model: entry.model,\n createdAt: entry.createdAt,\n lastModified: entry.lastModified,\n archived: entry.archived,\n options: entry.options as unknown as AgentOptions,\n cwd: entry.cwd,\n repos: entry.repos,\n status: entry.status,\n ...(entry.requiresCustomStorage === true ? { requiresCustomStorage: true } : {}),\n };\n}\n","/**\n * Schema versioning helpers (ADR D62).\n *\n * Two parallel APIs:\n * - `migrateSchema` — SQLite via `PRAGMA user_version` + ordered forward-only migrations.\n * - `readVersionedJson` / `writeVersionedJson` — JSON files with `_schemaVersion` field.\n *\n * Forward-only: never deletes data, never downgrades. Migration callbacks\n * own the transformation; this module owns the bookkeeping.\n *\n * @internal\n */\n\nimport { readFile } from \"node:fs/promises\";\n\nimport { atomicWriteJson } from \"./atomic-write.js\";\n\n// ────────────────────── SQLite migrations ──────────────────────\n\n/**\n * Minimal Database interface so this file does not hard-depend on\n * `better-sqlite3` at module load time. Compatible with the runtime\n * shape exposed by `better-sqlite3`.\n *\n * @internal\n */\nexport interface SqliteLike {\n pragma: (statement: string, options?: { simple?: boolean }) => unknown;\n exec: (sql: string) => void;\n transaction: <Args extends unknown[], R>(fn: (...args: Args) => R) => (...args: Args) => R;\n}\n\n/**\n * One forward migration step. `up` receives the DB inside a transaction;\n * `toVersion` is the value the pragma will be set to AFTER `up` returns.\n *\n * @internal\n */\nexport interface Migration {\n toVersion: number;\n up: (db: SqliteLike) => void;\n}\n\n/**\n * Options for `migrateSchema`.\n *\n * @internal\n */\nexport interface MigrateSchemaOptions {\n db: SqliteLike;\n currentVersion: number;\n migrations: ReadonlyArray<Migration>;\n /** For log/error context (e.g., \"memory-index\", \"registry\"). */\n label?: string;\n}\n\n/**\n * Result of `migrateSchema`.\n *\n * @internal\n */\nexport interface MigrateSchemaResult {\n from: number;\n to: number;\n ran: number;\n}\n\n/**\n * Run pending migrations to bring the DB from its current `user_version` up\n * to `currentVersion`. Migrations are sorted ascending by `toVersion` and\n * only those `> stored && <= currentVersion` execute. Each runs inside the\n * shared transaction.\n *\n * Throws if `stored > currentVersion` (downgrade attempt — forward-only).\n *\n * @internal\n */\nexport function migrateSchema(opts: MigrateSchemaOptions): MigrateSchemaResult {\n const { db, currentVersion, migrations, label = \"db\" } = opts;\n const storedRaw = db.pragma(\"user_version\", { simple: true });\n const stored = typeof storedRaw === \"number\" ? storedRaw : 0;\n\n if (stored > currentVersion) {\n throw new Error(\n `[${label}] schema version ${stored} > current ${currentVersion}; ` +\n \"did you downgrade the SDK? Forward-only migrations only.\",\n );\n }\n\n if (stored === currentVersion) {\n return { from: stored, to: stored, ran: 0 };\n }\n\n const pending = [...migrations]\n .sort((a, b) => a.toVersion - b.toVersion)\n .filter((m) => m.toVersion > stored && m.toVersion <= currentVersion);\n\n let ran = 0;\n let lastApplied = stored;\n\n db.transaction(() => {\n for (const m of pending) {\n m.up(db);\n db.pragma(`user_version = ${m.toVersion}`);\n lastApplied = m.toVersion;\n ran += 1;\n }\n })();\n\n return { from: stored, to: lastApplied, ran };\n}\n\n// ────────────────────── JSON versioned files ──────────────────────\n\n/**\n * Standard wrapper shape: `{ _schemaVersion: N, data: T }`. Use\n * `readVersionedJson` / `writeVersionedJson` for read/write.\n *\n * @internal\n */\nexport interface VersionedJsonFile<T> {\n _schemaVersion: number;\n data: T;\n}\n\n/**\n * Migration callback for `readVersionedJson`. Receives the FULL parsed\n * JSON object (not just `.data`), so legacy shapes without the\n * `_schemaVersion` / `data` wrapper can be migrated correctly (EC-2 fix).\n *\n * @internal\n */\nexport type VersionedJsonMigrate<T> = (parsed: unknown, fromVersion: number) => T;\n\n/**\n * Options for `readVersionedJson`.\n *\n * @internal\n */\nexport interface ReadVersionedJsonOptions<T> {\n path: string;\n currentVersion: number;\n migrate: VersionedJsonMigrate<T>;\n defaultValue: () => T;\n}\n\n/**\n * Read a versioned JSON file. Returns:\n * - file's `.data` when `_schemaVersion === currentVersion`\n * - migrated value (via `migrate(parsed, stored)`) when stored < current\n * - `defaultValue()` when file missing, corrupt, or stored > current\n *\n * Fail-soft: never throws. Corrupt or mismatched-newer files log a stderr\n * warning and fall back to `defaultValue()`.\n *\n * @internal\n */\nexport async function readVersionedJson<T>(opts: ReadVersionedJsonOptions<T>): Promise<T> {\n const { path, currentVersion, migrate, defaultValue } = opts;\n\n let raw: string;\n try {\n raw = await readFile(path, \"utf-8\");\n } catch {\n return defaultValue();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n process.stderr.write(`[theokit-sdk] ${path} is corrupt; using default value.\\n`);\n return defaultValue();\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n return defaultValue();\n }\n\n const file = parsed as { _schemaVersion?: unknown; data?: unknown };\n const storedRaw = file._schemaVersion;\n const stored = typeof storedRaw === \"number\" ? storedRaw : 0;\n\n if (stored === currentVersion) {\n return file.data as T;\n }\n\n if (stored > currentVersion) {\n process.stderr.write(\n `[theokit-sdk] ${path} schema version ${stored} > current ${currentVersion}; ` +\n \"using default value (forward-only).\\n\",\n );\n return defaultValue();\n }\n\n // EC-2 fix: pass the FULL parsed object to migrate, not just `file.data`.\n // Legacy shapes (e.g., `{ schemaVersion: \"1.0\", agents: {...} }` without\n // a `data` field) need to inspect the whole thing.\n return migrate(parsed, stored);\n}\n\n/**\n * Write `data` as a versioned JSON file via atomic write.\n *\n * @internal\n */\nexport async function writeVersionedJson<T>(\n path: string,\n data: T,\n currentVersion: number,\n): Promise<void> {\n const file: VersionedJsonFile<T> = {\n _schemaVersion: currentVersion,\n data,\n };\n await atomicWriteJson(path, file);\n}\n","import type { AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport { fromSerialized, loadRegistry, saveRegistry } from \"./agent-registry-store.js\";\n\n/**\n * Process-wide agent registry. Holds the metadata needed to satisfy\n * Agent.list/Agent.get/Agent.resume across local and cloud runtimes,\n * plus the user-provided config that drives `agent.send()`.\n *\n * Write-through to disk per ADR D17: every mutation schedules a coalesced\n * save to `<cwd>/.theokit/agents/registry.json`. Reads stay sync; the public\n * `Agent.resume` / `Agent.list` / `Agent.get` entry points hydrate from disk\n * lazily via `hydrateRegistryFromDisk`.\n *\n * @internal\n */\n\nexport type AgentRuntime = \"local\" | \"cloud\";\n\nexport interface RegisteredAgent {\n agentId: string;\n runtime: AgentRuntime;\n name?: string;\n summary?: string;\n model?: ModelSelection;\n createdAt: number;\n lastModified: number;\n archived: boolean;\n options: AgentOptions;\n /** Local workspace cwd; only set when runtime is local. Also used as the\n * persistence routing key (cloud agents default to `process.cwd()`). */\n cwd?: string;\n /** Cloud repo URLs; only set when runtime is cloud. */\n repos?: string[];\n /** Optional explicit status reported via SDKAgentInfo.status. */\n status?: \"running\" | \"finished\" | \"error\";\n /**\n * EC-3 (ADR D325): marker set at create-time when\n * `AgentOptions.conversationStorage` was non-undefined. `Agent.resume`\n * checks this flag — if `true` AND the caller did not pass\n * `conversationStorage` again, throws `ConfigurationError(code:\n * \"conversation_storage_required\")` instead of silently falling back to\n * the FS adapter (which would lose Postgres/Redis history).\n */\n requiresCustomStorage?: boolean;\n}\n\nconst agents = new Map<string, RegisteredAgent>();\nconst hydratedCwds = new Set<string>();\nconst pendingSaves = new Map<string, Promise<void>>();\nconst dirtyCwds = new Set<string>();\n\nfunction resolveRegistryCwd(agent: Pick<RegisteredAgent, \"cwd\">): string {\n return agent.cwd ?? process.cwd();\n}\n\nfunction snapshotForCwd(cwd: string): Record<string, RegisteredAgent> {\n const snapshot: Record<string, RegisteredAgent> = {};\n for (const agent of agents.values()) {\n if (resolveRegistryCwd(agent) === cwd) {\n snapshot[agent.agentId] = agent;\n }\n }\n return snapshot;\n}\n\n/**\n * Coalesce burst writes per-cwd: if a save is already pending, the new\n * mutation rides on it (the pending save picks up the latest in-memory state\n * via `snapshotForCwd`).\n *\n * @internal\n */\nfunction scheduleSaveForCwd(cwd: string): Promise<void> {\n // Always mark dirty so a save already in flight will re-loop and pick up\n // this mutation. Without this, two synchronous registerAgent calls would\n // coalesce into ONE save whose snapshot only captured the first agent —\n // the second mutation's data would silently drop off disk.\n dirtyCwds.add(cwd);\n const existing = pendingSaves.get(cwd);\n if (existing !== undefined) return existing;\n const promise = (async () => {\n try {\n while (dirtyCwds.has(cwd)) {\n dirtyCwds.delete(cwd);\n // Yield once so the in-flight microtask burst (registerAgent +\n // updateRegisteredAgent calls fired in the same tick) all commit\n // their `agents.set` before we snapshot.\n await Promise.resolve();\n await saveRegistry(cwd, snapshotForCwd(cwd));\n // Loop guard: if a mutation arrived during saveRegistry's await,\n // dirtyCwds.has(cwd) is true again — go around for another save.\n }\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] registry persist failed (${cwd}): ${msg}\\n`);\n } finally {\n pendingSaves.delete(cwd);\n }\n })();\n pendingSaves.set(cwd, promise);\n return promise;\n}\n\nexport function registerAgent(agent: RegisteredAgent): void {\n agents.set(agent.agentId, agent);\n void scheduleSaveForCwd(resolveRegistryCwd(agent));\n}\n\nexport function getRegisteredAgent(agentId: string): RegisteredAgent | undefined {\n return agents.get(agentId);\n}\n\nexport function listRegisteredAgents(runtime?: AgentRuntime): RegisteredAgent[] {\n const all = Array.from(agents.values());\n if (runtime === undefined) return all;\n return all.filter((agent) => agent.runtime === runtime);\n}\n\nexport function updateRegisteredAgent(\n agentId: string,\n update: Partial<RegisteredAgent>,\n): RegisteredAgent | undefined {\n const existing = agents.get(agentId);\n if (existing === undefined) return undefined;\n const updated: RegisteredAgent = {\n ...existing,\n ...update,\n lastModified: Date.now(),\n };\n agents.set(agentId, updated);\n void scheduleSaveForCwd(resolveRegistryCwd(updated));\n return updated;\n}\n\nexport function removeRegisteredAgent(agentId: string): boolean {\n const existing = agents.get(agentId);\n const removed = agents.delete(agentId);\n if (removed && existing !== undefined) {\n void scheduleSaveForCwd(resolveRegistryCwd(existing));\n }\n return removed;\n}\n\nexport function clearAgentRegistry(): void {\n agents.clear();\n hydratedCwds.clear();\n}\n\n/**\n * Lazily load the persisted registry for `cwd` into the in-memory Map. Skips\n * if this cwd has already been hydrated in this process. Disk-only entries\n * win over the empty in-memory state; in-memory entries (already-registered\n * agents) are never overwritten by hydration.\n *\n * @internal\n */\nexport async function hydrateRegistryFromDisk(cwd: string): Promise<void> {\n if (hydratedCwds.has(cwd)) return;\n hydratedCwds.add(cwd);\n const persisted = await loadRegistry(cwd);\n for (const [id, entry] of Object.entries(persisted)) {\n if (!agents.has(id)) {\n agents.set(id, fromSerialized(entry));\n }\n }\n}\n\n/**\n * Invalidate the hydration cache for `cwd` (or all cwds when omitted). Forces\n * the next `hydrateRegistryFromDisk(cwd)` to re-read from disk. Test-only.\n *\n * @internal\n */\nexport function invalidateRegistryHydration(cwd?: string): void {\n if (cwd !== undefined) hydratedCwds.delete(cwd);\n else hydratedCwds.clear();\n}\n\n/**\n * Wait for all pending registry saves to complete. Used by tests and by the\n * agent dispose path to guarantee on-disk state matches the in-memory state\n * before the caller continues.\n *\n * @internal\n */\nexport async function flushRegistrySaves(cwd?: string): Promise<void> {\n if (cwd !== undefined) {\n await (pendingSaves.get(cwd) ?? Promise.resolve());\n return;\n }\n while (pendingSaves.size > 0) {\n await Promise.all(Array.from(pendingSaves.values()));\n }\n}\n","import {\n ConfigurationError,\n UnknownAgentError,\n UnsupportedRunOperationError,\n} from \"../../errors.js\";\nimport type {\n AgentOptions,\n ModelSelection,\n SDKAgent,\n SDKArtifact,\n SystemPromptContext,\n} from \"../../types/agent.js\";\nimport type { Run, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport { resolveApiKey } from \"../env.js\";\nimport { getConfiguredBaseUrl, isFixtureApiKey } from \"../fixture-mode.js\";\nimport { generateCloudAgentId } from \"../ids.js\";\nimport { withCwdMutex } from \"../memory/cwd-mutex.js\";\nimport { flushRegistrySaves, registerAgent, updateRegisteredAgent } from \"./agent-registry.js\";\nimport { serializeCloudAgentConfig } from \"./cloud-config-serializer.js\";\nimport type { CloudAgentPayload } from \"./cloud-payload-types.js\";\nimport { createCloudRun } from \"./cloud-run.js\";\nimport { DEFAULT_AGENTIC_MODEL_ID } from \"./default-model.js\";\nimport { createRealCloudRun } from \"./real-cloud-run.js\";\nimport { resolveSystemPromptForSend } from \"./system-prompt.js\";\n\n/**\n * Cloud SDKAgent implementation. Holds the cloud configuration and routes\n * runs to the fixture responder (which mimics PaaS behavior) or to real HTTP\n * when `THEOKIT_API_BASE_URL` is set.\n *\n * @internal\n */\nexport class CloudAgent implements SDKAgent {\n readonly agentId: string;\n model: ModelSelection | undefined;\n /**\n * Canonical JSON contract payload (ADR D15) that PaaS receives at runtime.\n * Re-serialized by `reload()` when filesystem state changes.\n * Public for contract testing — consumers can inspect what would be sent.\n */\n cloudPayload: CloudAgentPayload;\n private readonly options: AgentOptions;\n /** Idempotency guard for dispose() (EC-3). */\n private disposed = false;\n\n constructor(options: AgentOptions, providedAgentId?: string) {\n this.agentId = providedAgentId ?? options.agentId ?? generateCloudAgentId();\n this.model = options.model;\n this.options = options;\n this.cloudPayload = serializeCloudAgentConfig({ ...options, agentId: this.agentId });\n\n const repoUrls = (options.cloud?.repos ?? []).map((repo) => repo.url);\n registerAgent({\n agentId: this.agentId,\n runtime: \"cloud\",\n name: options.name,\n summary: this.isFixtureMode() ? \"Cloud contract fixture\" : \"Cloud agent\",\n model: this.model,\n createdAt: Date.now(),\n lastModified: Date.now(),\n archived: false,\n options,\n // Persistence routing only (ADR D17). Cloud agents do not surface `cwd`\n // through `SDKAgentInfo` (toCloudAgentInfo strips it).\n cwd: process.cwd(),\n repos: repoUrls,\n status: \"running\",\n });\n }\n\n /**\n * Fixture-mode is on iff the API key matches the `theo_test_*` test pattern\n * AND no real `THEOKIT_API_BASE_URL` is configured. Outside fixture-mode,\n * cloud operations are pre-release and must surface explicit errors.\n */\n private isFixtureMode(): boolean {\n const apiKey = resolveApiKey(this.options.apiKey);\n return isFixtureApiKey(apiKey) && getConfiguredBaseUrl() === undefined;\n }\n\n async send(message: string | SDKUserMessage, options: SendOptions = {}): Promise<Run> {\n // Custom inline tools are local-only — cloud agents reject per-call\n // tools the same way creation-time tools are rejected (handlers cannot\n // cross the wire). Mirror the ConfigurationError code so callers can\n // catch both surfaces uniformly.\n if (options.tools !== undefined && options.tools.length > 0) {\n throw new ConfigurationError(\n \"Custom inline tools are local-only in SDK v1.0 — cloud agents cannot serialize handler functions\",\n { code: \"cloud_custom_tools_rejected\" },\n );\n }\n // D370: Task wrapping is local-only in v1 (cloud runtime pre-release).\n if (options.task !== undefined) {\n const { UnsupportedTaskOperationError } = await import(\"../../errors.js\");\n throw new UnsupportedTaskOperationError(\"send\", { cause: undefined });\n }\n // ADR D19: same per-agent send mutex as LocalAgent. Holds until the run\n // completes so concurrent sends to the same agentId serialize end-to-end.\n return new Promise<Run>((resolve, reject) => {\n void withCwdMutex(`agent-send:${this.agentId}`, async () => {\n let run: Run;\n try {\n run = await this.sendLocked(message, options);\n } catch (err) {\n reject(err);\n return;\n }\n resolve(run);\n try {\n await run.wait();\n } catch {\n // Caller observes via their own wait/stream.\n }\n });\n });\n }\n\n private async sendLocked(message: string | SDKUserMessage, options: SendOptions): Promise<Run> {\n const overrideModel = options.model;\n if (overrideModel !== undefined) {\n this.model = overrideModel;\n updateRegisteredAgent(this.agentId, { model: overrideModel });\n }\n const userText = typeof message === \"string\" ? message : message.text;\n const systemPrompt = await this.resolveSystemPromptForSend(userText, options);\n const apiKey = resolveApiKey(this.options.apiKey);\n const useRealRuntime =\n apiKey !== undefined && !isFixtureApiKey(apiKey) && getConfiguredBaseUrl() !== undefined;\n return useRealRuntime\n ? createRealCloudRun({\n agentId: this.agentId,\n model: this.model ?? { id: DEFAULT_AGENTIC_MODEL_ID },\n message,\n agentOptions: this.options,\n sendOptions: options,\n agentConfig: this.cloudPayload,\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n })\n : createCloudRun({\n agentId: this.agentId,\n model: this.model ?? { id: DEFAULT_AGENTIC_MODEL_ID },\n message,\n agentOptions: this.options,\n sendOptions: options,\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n });\n }\n\n private resolveSystemPromptForSend(\n userText: string,\n options: SendOptions,\n ): Promise<string | undefined> {\n return resolveSystemPromptForSend(\n this.options.systemPrompt,\n options.systemPrompt,\n (): Promise<SystemPromptContext> =>\n Promise.resolve({\n agentId: this.agentId,\n cwd: undefined,\n model: this.model,\n skills: [],\n userMessage: userText,\n memory: [],\n }),\n );\n }\n\n close(): void {\n // Cloud agents stay registered until explicit dispose/delete.\n }\n\n reload(): Promise<void> {\n // EC-6: re-serialize the cloud payload so filesystem-derived state\n // (skills.enabled may shift as new SKILL.md files appear in repo) is\n // reflected in subsequent send() dispatches.\n this.cloudPayload = serializeCloudAgentConfig({ ...this.options, agentId: this.agentId });\n return Promise.resolve();\n }\n\n async dispose(): Promise<void> {\n // EC-3: idempotent. `await using` may dispatch dispose twice (the using\n // exit hook + explicit `await agent.dispose()`); second call is a no-op.\n if (this.disposed) return;\n this.disposed = true;\n await flushRegistrySaves(process.cwd());\n }\n\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n\n listArtifacts(): Promise<SDKArtifact[]> {\n if (!this.isFixtureMode()) {\n return Promise.reject(\n new ConfigurationError(\n \"Cloud runtime is pre-release. listArtifacts() will return real artifacts when Theo PaaS ships; today it is only available in fixture mode (theo_test_* keys).\",\n { code: \"cloud_runtime_pre_release\" },\n ),\n );\n }\n return Promise.resolve(buildFixtureArtifacts());\n }\n\n downloadArtifact(path: string): Promise<Buffer> {\n if (path.includes(\"..\") || path.startsWith(\"/\")) {\n return Promise.reject(\n new ConfigurationError(`Artifact path must stay inside the workspace: ${path}`, {\n code: \"artifact_path_traversal\",\n }),\n );\n }\n if (!this.isFixtureMode()) {\n return Promise.reject(\n new ConfigurationError(\n \"Cloud runtime is pre-release. downloadArtifact() will fetch real PaaS artifacts when the cloud runtime ships; today it is only available in fixture mode (theo_test_* keys).\",\n { code: \"cloud_runtime_pre_release\" },\n ),\n );\n }\n const match = buildFixtureArtifacts().find((artifact) => artifact.path === path);\n if (match === undefined) {\n return Promise.reject(\n new UnknownAgentError(`Artifact ${path} not found`, { code: \"unknown_artifact\" }),\n );\n }\n return Promise.resolve(Buffer.from(`fixture artifact content for ${path}\\n`));\n }\n\n /**\n * Cloud runtime manages goal loops server-side (ADR D122). The local\n * fork pattern is also not available in cloud — both throw synchronously\n * with `UnsupportedRunOperationError` so callers branch early (EC-G).\n *\n * @public\n */\n runUntil(): never {\n throw new UnsupportedRunOperationError(\n \"Agent.runUntil() is not supported on cloud agents. Cloud runtime manages goal loops server-side. Use a local agent for autonomous Ralph loops.\",\n \"runUntil\",\n );\n }\n\n /**\n * Forked sub-agents are local-only (ADRs D110-D114).\n *\n * @public\n */\n fork(): never {\n throw new UnsupportedRunOperationError(\n \"Agent.fork() is not supported on cloud agents. Fork inheritance requires local credential + system-prompt access. Use a local agent.\",\n \"fork\",\n );\n }\n\n /**\n * Personality presets require consistent server-side enforcement that\n * the cloud runtime (pre-release) does not yet provide. Reject explicitly\n * to avoid silent divergence between local and cloud behaviour (ADR D169).\n *\n * @public\n */\n usePersonality(): Promise<never> {\n return Promise.reject(\n new UnsupportedRunOperationError(\n \"Agent.usePersonality() is not supported on cloud agents (pre-release). Use a local agent or wait for cloud GA.\",\n \"usePersonality\",\n ),\n );\n }\n}\n\n/**\n * Canonical fixture artifact list. Only used when the agent is in fixture\n * mode (theo_test_* keys, no THEOKIT_API_BASE_URL). Real PaaS artifacts will\n * be fetched over HTTP when the cloud runtime ships.\n */\nfunction buildFixtureArtifacts(): SDKArtifact[] {\n return [\n {\n path: \"dist/report.txt\",\n sizeBytes: 42,\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n}\n","import type { AgentOptions } from \"../../types/agent.js\";\nimport type {\n CloudAgentPayload,\n HookRule,\n McpHttpRedacted,\n McpStdioRedacted,\n MemoryPayload,\n ProvidersRedacted,\n SubagentRef,\n} from \"./cloud-payload-types.js\";\n\n/**\n * Pure JSON serializer for the cloud-agent payload (ADR D15, T1.1).\n *\n * Per-feature allow-list (EC-2): every field forwarded to PaaS is explicitly\n * picked from `AgentOptions`. Fields containing secrets (`apiKey`,\n * `headers.Authorization`, mcp `env`, provider-route credentials) are NEVER\n * forwarded, even if present in input.\n *\n * Determinism (EC-1): `canonicalize()` recursively sorts object keys before\n * `JSON.stringify`. Identical conceptual inputs produce byte-identical JSON\n * regardless of insertion order.\n *\n * Size guardrail (EC-7): payloads larger than 1 MB emit a stderr warning\n * (no throw — pure observability).\n *\n * @internal\n */\n\nconst MAX_PAYLOAD_BYTES = 1_048_576; // 1 MB\n\nexport function serializeCloudAgentConfig(options: AgentOptions): CloudAgentPayload {\n if (options.cloud === undefined) {\n throw new Error(\"serializeCloudAgentConfig called without options.cloud\");\n }\n const payload: CloudAgentPayload = {\n schemaVersion: \"1.0\",\n cloud: serializeCloud(options.cloud),\n };\n if (typeof options.agentId === \"string\") payload.agentId = options.agentId;\n if (options.model !== undefined) payload.model = { id: options.model.id };\n if (typeof options.systemPrompt === \"string\") payload.systemPrompt = options.systemPrompt;\n const skills = serializeSkills(options.skills);\n if (skills !== undefined) payload.skills = skills;\n const plugins = serializePlugins(options.plugins);\n if (plugins !== undefined) payload.plugins = plugins;\n const mcp = serializeMcp(options.mcpServers);\n if (mcp !== undefined) payload.mcpServers = mcp;\n const agents = serializeAgents(options.agents);\n if (agents !== undefined) payload.agents = agents;\n const providers = serializeProviders(options.providers);\n if (providers !== undefined) payload.providers = providers;\n const memory = serializeMemory(options.memory);\n if (memory !== undefined) payload.memory = memory;\n return payload;\n}\n\n/**\n * Stringify a payload to canonical JSON. Object keys are sorted\n * recursively before stringify (EC-1). Emits a stderr warning when the\n * result exceeds {@link MAX_PAYLOAD_BYTES} (EC-7).\n *\n * @internal\n */\nexport function stringifyCloudPayload(payload: CloudAgentPayload): string {\n const sorted = canonicalize(payload);\n const json = JSON.stringify(sorted);\n const size = Buffer.byteLength(json, \"utf8\");\n if (size > MAX_PAYLOAD_BYTES) {\n process.stderr.write(\n `[theokit-sdk] cloud agent payload is ${size} bytes (>1 MB) — PaaS may reject large payloads. Consider trimming subagents/context.\\n`,\n );\n }\n return json;\n}\n\n/**\n * Recursively sort object keys for deterministic stringify (EC-1).\n *\n * @internal\n */\nexport function canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value !== null && typeof value === \"object\") {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[key] = canonicalize((value as Record<string, unknown>)[key]);\n }\n return sorted;\n }\n return value;\n}\n\nfunction serializeCloud(cloud: NonNullable<AgentOptions[\"cloud\"]>): CloudAgentPayload[\"cloud\"] {\n const repos = (cloud.repos ?? []).map((r) => {\n const entry: { url: string; startingRef?: string } = { url: r.url };\n if (typeof r.startingRef === \"string\") entry.startingRef = r.startingRef;\n return entry;\n });\n const result: CloudAgentPayload[\"cloud\"] = { repos };\n if (cloud.autoCreatePR === true) result.autoCreatePR = true;\n return result;\n}\n\nfunction serializeSkills(skills: AgentOptions[\"skills\"]): CloudAgentPayload[\"skills\"] | undefined {\n if (skills?.enabled === undefined || skills.enabled.length === 0) return undefined;\n return { enabled: [...skills.enabled] };\n}\n\nfunction serializePlugins(\n plugins: AgentOptions[\"plugins\"],\n): CloudAgentPayload[\"plugins\"] | undefined {\n if (plugins?.enabled === undefined || plugins.enabled.length === 0) return undefined;\n return { enabled: [...plugins.enabled] };\n}\n\nfunction serializeMcp(\n mcpServers: AgentOptions[\"mcpServers\"],\n): CloudAgentPayload[\"mcpServers\"] | undefined {\n if (mcpServers === undefined) return undefined;\n const result: Record<string, McpHttpRedacted | McpStdioRedacted> = {};\n for (const [name, raw] of Object.entries(mcpServers)) {\n const entry = serializeMcpEntry(raw);\n if (entry !== undefined) result[name] = entry;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction serializeMcpEntry(raw: unknown): McpHttpRedacted | McpStdioRedacted | undefined {\n const config = raw as { type?: string; url?: string; command?: string; args?: unknown };\n if (config.type === \"http\" && typeof config.url === \"string\") {\n // EC-2: only `url` + `type` cross to PaaS. Drop headers (Authorization),\n // any other caller-side fields.\n return { type: \"http\", url: config.url };\n }\n if (\n (config.type === \"stdio\" || config.type === undefined) &&\n typeof config.command === \"string\"\n ) {\n // EC-2: drop env entirely (TOKEN, SECRET, etc.). Drop cwd (caller FS).\n const entry: McpStdioRedacted = { type: \"stdio\", command: config.command };\n if (Array.isArray(config.args)) entry.args = config.args.map((a) => String(a));\n return entry;\n }\n return undefined;\n}\n\nfunction serializeAgents(agents: AgentOptions[\"agents\"]): CloudAgentPayload[\"agents\"] | undefined {\n if (agents === undefined) return undefined;\n const result: Record<string, SubagentRef> = {};\n for (const [name, def] of Object.entries(agents)) {\n if (def === undefined || def === null) continue;\n result[name] = buildSubagentRef(def);\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction buildSubagentRef(def: NonNullable<AgentOptions[\"agents\"]>[string]): SubagentRef {\n const ref: SubagentRef = {};\n if (typeof def.description === \"string\") ref.description = def.description;\n if (typeof def.prompt === \"string\") ref.systemPrompt = def.prompt;\n if (def.model !== undefined && def.model !== \"inherit\" && typeof def.model.id === \"string\") {\n ref.model = { id: def.model.id };\n }\n return ref;\n}\n\nfunction serializeProviders(providers: AgentOptions[\"providers\"]): ProvidersRedacted | undefined {\n if (providers === undefined) return undefined;\n const result: ProvidersRedacted = {};\n if (Array.isArray(providers.routes)) {\n // EC-2: route entries strip any credential field; only provider/model cross.\n result.routes = providers.routes.map((r) => {\n const route: { provider: string; model?: string } = { provider: r.provider };\n if (typeof r.model === \"string\") route.model = r.model;\n return route;\n });\n }\n if (Array.isArray(providers.fallback)) {\n result.fallback = [...providers.fallback];\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction serializeMemory(memory: AgentOptions[\"memory\"]): MemoryPayload | undefined {\n if (memory === undefined) return undefined;\n const result: MemoryPayload = { enabled: memory.enabled === true };\n if (memory.index?.backend !== undefined || memory.index?.embedding !== undefined) {\n const index: MemoryPayload[\"index\"] = { backend: memory.index?.backend ?? \"sqlite-vec\" };\n if (memory.index?.embedding !== undefined) {\n // EC-2: embedding config only forwards provider + model. Adapter\n // credentials live in the PaaS-side keystore, never in the payload.\n const emb: { provider: string; model?: string } = {\n provider: memory.index.embedding.provider,\n };\n if (typeof memory.index.embedding.model === \"string\") {\n emb.model = memory.index.embedding.model;\n }\n index.embedding = emb;\n }\n result.index = index;\n }\n return result;\n}\n\n/**\n * Hook rules pass-through. Universal `programmatic_hooks_rejected` validation\n * happens upstream in `validateAgentOptions`; if hooks reach the serializer\n * they're guaranteed declarative-only.\n *\n * @internal\n */\nexport function serializeHookRules(_hooks: unknown): ReadonlyArray<HookRule> | undefined {\n // Reserved for future file-based hook serialization. Today programmatic\n // hooks are rejected upstream; file-based hooks are read by PaaS from the\n // cloned repo (.theokit/hooks.json).\n return undefined;\n}\n","/**\n * Canonical path-guard module (ADRs D79-D81).\n *\n * Three primitives + one typed error:\n * - `safePathJoin(base, ...parts)` — resolve THEN prefix-check (ADR D80).\n * - `assertNoSymlinkEscape(path, base)` — `realpathSync` resolves entire\n * symlink chain (EC-1 fix; Hermes v0.2 #386, #61).\n * - `sanitizeIdentifier(input, { maxLen })` — strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` (ADR D81; case-insensitive on input,\n * lowercase on output).\n * - `PathTraversalError` — extends ConfigurationError with code\n * `path_traversal` (ADR D65: no new hierarchy).\n *\n * Wire at all sites where user input becomes a path. CI lint gate\n * `tests/lint/no-unguarded-path-input.test.ts` prevents regression\n * (ADR D85).\n *\n * @internal\n */\n\nimport { lstatSync, readlinkSync, realpathSync, type Stats } from \"node:fs\";\nimport { dirname, resolve, sep } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\n/**\n * Thrown when a path operation would escape its allowed base directory.\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @internal\n */\nexport class PathTraversalError extends ConfigurationError {\n override readonly name: string = \"PathTraversalError\";\n\n constructor(input: string, resolvedPath: string) {\n super(`Path traversal attempt: ${input} → ${resolvedPath}`, {\n code: \"path_traversal\",\n });\n }\n}\n\n/**\n * Thrown when an agent tool is asked to read or write a sensitive path\n * that the blocklist forbids (`.env`, `.git/`, `node_modules/`, `.theo/`,\n * lock files). Distinct from `PathTraversalError` because the path is\n * lexically inside the project — it is just sensitive.\n *\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @public\n */\nexport class ForbiddenPathError extends ConfigurationError {\n override readonly name: string = \"ForbiddenPathError\";\n\n constructor(path: string) {\n super(\n `Path '${path}' is in the sensitive-file blocklist (.env, .git/, node_modules/, .theo/, lock files)`,\n {\n code: \"forbidden_path\",\n },\n );\n }\n}\n\n/**\n * Join `base` with `...parts` and ensure the resolved absolute path stays\n * under `base`. Resolves FIRST, then prefix-checks (ADR D80) — prevents\n * normalized-escape bypasses like `subdir/.\\\\./bar`.\n *\n * Returns the safe absolute path. Throws `PathTraversalError` if escape.\n *\n * @internal\n */\nexport function safePathJoin(base: string, ...parts: string[]): string {\n if (base === \"\") {\n throw new Error(\"safePathJoin: base must be non-empty\");\n }\n const baseResolved = resolve(base);\n const target = resolve(base, ...parts);\n if (target !== baseResolved && !target.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(parts.join(\"/\"), target);\n }\n return target;\n}\n\n/**\n * Assert that `path` — including every directory component in the chain —\n * stays under `base` after symlink resolution. No-op when nothing on the\n * path exists yet.\n *\n * Two-bug history:\n * 1. **EC-1** (original fix, kept): a multi-level symlink chain A → B → C\n * must be resolved end-to-end. `realpathSync` does this in 1 syscall.\n * 2. **Defence-in-depth** (added v1.x): the previous implementation only\n * called `lstatSync(path)` on the terminal component. If an INTERMEDIATE\n * directory was a symlink (`base/inner-symlink → /outside`), `lstat` on\n * `base/inner-symlink/file.txt` followed the symlink and reported the\n * regular file — escape went undetected. Fix: walk up to the nearest\n * existing ancestor and `realpath` THAT, then re-attach the suffix and\n * check the result against the canonical base.\n *\n * @internal\n */\nexport function assertNoSymlinkEscape(path: string, base: string): void {\n // Canonical base — symlinks in the base path itself are absorbed once here.\n let baseResolved: string;\n try {\n baseResolved = realpathSync(base);\n } catch {\n // base doesn't exist as a real directory yet — fall back to lexical resolve.\n baseResolved = resolve(base);\n }\n\n // Find the deepest ancestor of `path` that exists, then realpath it.\n // Anything from there onward is \"not yet on disk\" and contributes only\n // its lexical suffix. This covers three cases:\n // - path exists (regular file or symlink at any depth) → realpath the full path\n // - path doesn't exist but intermediate dir is a symlink → realpath the ancestor\n // - nothing on the path exists → no escape risk (return)\n const resolved = realpathOfDeepestExisting(path);\n if (resolved === undefined) return; // path has no existing prefix — nothing to attack\n\n if (resolved !== baseResolved && !resolved.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(`symlink ${path}`, resolved);\n }\n}\n\n/**\n * Find the deepest ancestor of `path` that exists on disk, resolve all\n * symlinks in that ancestor via `realpathSync`, and re-attach the\n * lexical suffix. Returns `undefined` when no ancestor exists.\n *\n * Handles dangling symlinks: if the terminal IS a symlink but its target\n * is missing, we still detect escape via `readlinkSync` + parent resolve.\n */\nfunction realpathOfDeepestExisting(path: string): string | undefined {\n // First try the full path — the common case.\n try {\n return realpathSync(path);\n } catch {\n // Not resolvable. Two sub-cases.\n }\n\n // Sub-case A: terminal is a dangling symlink.\n try {\n const stat: Stats = lstatSync(path);\n if (stat.isSymbolicLink()) {\n const target = readlinkSync(path);\n // Resolve target relative to the REAL parent dir, so intermediate\n // symlinks in the parent chain are absorbed.\n const parentReal = realpathOfDeepestExisting(dirname(path));\n const parentBase = parentReal ?? dirname(path);\n return resolve(parentBase, target);\n }\n } catch {\n // lstat failed too — terminal doesn't exist at all.\n }\n\n // Sub-case B: walk up to the nearest existing ancestor, then re-attach\n // the suffix lexically.\n let cursor = dirname(path);\n let suffix = path.slice(cursor.length);\n while (cursor !== dirname(cursor)) {\n try {\n const real = realpathSync(cursor);\n // Reconstruct: ancestor's realpath + remaining (still-lexical) suffix\n return resolve(real, `.${suffix}`);\n } catch {\n suffix = path.slice(dirname(cursor).length);\n cursor = dirname(cursor);\n }\n }\n // Reached filesystem root without finding any existing ancestor.\n return undefined;\n}\n\nconst LOCK_FILES = new Set([\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"bun.lockb\"]);\n\n/**\n * Decide whether a project-relative path points to a known-sensitive file\n * that a coding agent must not read or write.\n *\n * Universal blocklist (works for any agent operating on a project tree):\n *\n * - `.env`, `.env.<anything>` — except `.env.example` (template safe to read)\n * - `.git/` — version control internals\n * - `node_modules/` — dependency cache (changes don't belong to the user)\n * - `.theo/` — TheoKit build artefacts / state\n * - Lock files at any depth: `pnpm-lock.yaml`, `package-lock.json`,\n * `yarn.lock`, `bun.lockb`\n *\n * Operates on path segments (forward-slash normalized). Cross-platform safe.\n *\n * Use together with `safePathJoin` + `assertNoSymlinkEscape`: the former two\n * defeat traversal, this one defeats reading a file that is lexically inside\n * the project but should not be agent-visible.\n *\n * @public\n */\nexport function isForbiddenPath(input: string): boolean {\n // Normalize: forward slashes only, strip leading \"./\"\n const normalized = input.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n if (normalized.length === 0) return false;\n\n const segments = normalized.split(\"/\").filter((s) => s.length > 0);\n if (segments.length === 0) return false;\n\n const first = segments[0]!;\n // .env.example is explicitly allowlisted (template safe to read)\n if (first === \".env.example\") return false;\n if (first === \".env\") return true;\n if (/^\\.env\\./.test(first)) return true;\n\n if (first === \".git\") return true;\n if (first === \"node_modules\") return true;\n if (first === \".theo\") return true;\n\n const basename = segments[segments.length - 1]!;\n if (LOCK_FILES.has(basename)) return true;\n\n return false;\n}\n\nconst IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9\\-_]*$/i;\n\n/**\n * Validate that `input` is a safe path component (skill name, agent ID,\n * namespace, etc.) and return its lowercase form. Strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` rejects path separators, dots, null bytes,\n * whitespace, unicode invisible chars, and any leading `-`/`_`.\n *\n * @param input - User-supplied identifier candidate.\n * @param options.maxLen - Maximum allowed length (default 64).\n * @returns Lowercase form of `input`.\n * @throws `ConfigurationError` with code `invalid_identifier` on rejection.\n *\n * @internal\n */\nexport function sanitizeIdentifier(input: string, options?: { maxLen?: number }): string {\n const maxLen = options?.maxLen ?? 64;\n if (input.length === 0 || input.length > maxLen) {\n throw new ConfigurationError(`Identifier length out of range (1-${maxLen}): \"${input}\"`, {\n code: \"invalid_identifier\",\n });\n }\n if (!IDENTIFIER_PATTERN.test(input)) {\n throw new ConfigurationError(`Identifier contains invalid characters: \"${input}\"`, {\n code: \"invalid_identifier\",\n });\n }\n return input.toLowerCase();\n}\n","/**\n * Canonical secret redaction module (ADRs D68-D73).\n *\n * Single source of truth for credential pattern masking across the SDK.\n * Wired at output boundaries: `ErrorMetadata.raw` (mappers/shared.ts),\n * telemetry span attributes (telemetry/tracer.ts), transcript JSONL\n * appends (agent-session-store.ts), migration logger output\n * (memory/migrate-sqlite-to-lance.ts).\n *\n * - D68: central module, single source of truth (replaces 2 duplicates)\n * - D69: env snapshot at module init (prompt-injection defense)\n * - D70: ON by default, warn on opt-out\n * - D71: two-bucket masking — short fully masked, long preserves prefix+suffix\n * - D72: `codeFile` opt-out for legitimate prefix-shaped content\n * - D73: redact at OUTPUT boundaries, not at storage\n *\n * @internal\n */\n\n// D69: env snapshot captured at module load. Subsequent mutations of\n// process.env.THEOKIT_REDACT_SECRETS are ignored — defends against\n// prompt injection that tries to disable redaction mid-run.\nlet REDACT_ENABLED: boolean = readEnvOnce();\n\nfunction readEnvOnce(): boolean {\n const raw = process.env.THEOKIT_REDACT_SECRETS;\n if (raw === undefined) return true; // D70: default ON\n return [\"1\", \"true\", \"yes\", \"on\"].includes(raw.toLowerCase());\n}\n\n// D70: warn once on opt-out so the user knows they're vulnerable.\nlet warnedOptOut = false;\nif (!REDACT_ENABLED && !warnedOptOut) {\n process.stderr.write(\n \"[theokit-sdk] Secret redaction is DISABLED via THEOKIT_REDACT_SECRETS. \" +\n \"Credentials may leak into errors, telemetry, logs, transcripts.\\n\",\n );\n warnedOptOut = true;\n}\n\n/**\n * Built-in credential patterns. Order matters — more specific prefixes\n * must come before generic ones (e.g., `sk-ant-` before `sk-`). Quantifiers\n * are all bounded `{n,m}` or applied to char classes — linear time, no ReDoS.\n *\n * @internal\n */\nconst BUILTIN_PATTERNS: readonly RegExp[] = [\n /sk-ant-[A-Za-z0-9_-]{10,}/g, // Anthropic\n /sk-proj-[A-Za-z0-9_-]{10,}/g, // OpenAI project key (must precede sk- generic)\n /sk-[A-Za-z0-9_-]{10,}/g, // OpenAI / OpenRouter / DeepInfra. {10,} body floor —\n // real keys are 40+ chars; 10-char floor still skips `sk-test` (4) and\n // `sk-test-key` (8). codeFile mode protects placeholders/examples.\n /ghp_[A-Za-z0-9]{36}/g, // GitHub PAT classic (exact length)\n /github_pat_[A-Za-z0-9_]{82}/g, // GitHub PAT fine-grained\n /glpat-[A-Za-z0-9_-]{20}/g, // GitLab PAT\n /AKIA[A-Z0-9]{16}/g, // AWS access key\n /AIza[A-Za-z0-9_-]{35}/g, // Google API key\n /xox[bpasr]-[A-Za-z0-9-]{10,}/g, //Slack tokens\n /sntrys_[A-Za-z0-9]{40,}/g, // Sentry user auth\n /sk_live_[A-Za-z0-9]{20,}/g, // Stripe secret\n /rk_live_[A-Za-z0-9]{20,}/g, // Stripe restricted\n];\n\n// `Bearer <token>` matched as its own first-class pattern so PARAM_PATTERN\n// doesn't have to handle the unusual `Authorization: Bearer xxx` shape\n// (no `:` or `=` between \"Bearer\" and the value — bare whitespace).\nconst BEARER_PATTERN = /\\b(Bearer\\s+)([A-Za-z0-9_\\-.+/=]{8,})/g;\n\n// Parametric: matches `key=value` and `key: value` (with optional quote\n// between the key and the separator, to handle JSON: `\"api_key\": \"...\"`)\n// in URLs, query strings, JSON-like bodies, HTTP headers. Captures the\n// prefix so we keep it visible while masking the value.\n//\n// `authorization` deliberately excluded — BEARER_PATTERN handles the\n// common `Authorization: Bearer xxx` shape. Including it here causes\n// double-masking (\"Authorization: *** ***\") after Bearer fires.\nconst PARAM_PATTERN =\n /(\\b(?:access_token|api_key|api-key|password|secret|x-api-key)\\b[\"']?\\s*[:=]\\s*[\"']?)([A-Za-z0-9_\\-.+/]+)/gi;\n\nconst _extraPatterns: RegExp[] = [];\n\n/**\n * Add a user-defined redaction pattern. Additive — never removes builtins.\n * Throws if the regex lacks the `/g` flag (without `/g`, `.replace` only\n * substitutes the first match and the rest leaks).\n *\n * @internal — exposed publicly via `Security.addPattern` in `src/security.ts`.\n */\nexport function addPattern(re: RegExp): void {\n if (!re.global) {\n throw new Error(\"Security.addPattern: regex must have /g flag for replace-all semantics\");\n }\n _extraPatterns.push(re);\n}\n\n/**\n * Two-bucket masking (D71):\n * - tokens shorter than 18 chars → fully masked as `***`\n * - tokens >= 18 chars → keep first 6 + `...` + last 4\n *\n * Rationale: long tokens are unique per-account; prefix+suffix preserves\n * debuggability without revealing the secret middle.\n *\n * @internal\n */\nexport function maskToken(token: string): string {\n if (token.length < 18) return \"***\";\n return `${token.slice(0, 6)}...${token.slice(-4)}`;\n}\n\n/**\n * Redact known credential patterns from `text`. Default behavior masks\n * builtins + extras + parametric `key=value` sinks.\n *\n * With `{ codeFile: true }` (D72), skips PARAM_PATTERN to avoid mangling\n * `.env.example`, schema JSON, or test fixtures that legitimately contain\n * prefix-like strings.\n *\n * Returns the redacted string. Coerces non-strings via JSON.stringify;\n * EC-7 fix (edge-case review): wraps in try/catch so circular references\n * never propagate — returns sentinel `\"[unredactable: circular]\"`.\n *\n * @internal\n */\n// Coerce arbitrary input to a string for redaction. Returns `null`\n// sentinel when the value is null/undefined/non-stringifiable, so the\n// caller can short-circuit with `\"\"`. EC-7 fix: circular refs go through\n// the try/catch and produce the sentinel marker, never throwing.\nfunction coerceToString(value: unknown): string | null {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return null;\n if (typeof value === \"object\") {\n try {\n const s = JSON.stringify(value);\n return s === undefined ? null : s;\n } catch {\n return \"[unredactable: circular]\";\n }\n }\n return String(value);\n}\n\nexport function redactSecrets(text: unknown, opts?: { codeFile?: boolean }): string {\n const coerced = coerceToString(text);\n if (coerced === null) return \"\";\n if (!REDACT_ENABLED) return coerced;\n\n let s = coerced;\n for (const re of BUILTIN_PATTERNS) {\n s = s.replace(re, (m) => maskToken(m));\n }\n for (const re of _extraPatterns) {\n s = s.replace(re, (m) => maskToken(m));\n }\n if (!opts?.codeFile) {\n // Bearer first (preserves \"Bearer \" prefix, masks the token after).\n // Must run before PARAM_PATTERN so the bare-whitespace shape doesn't\n // get mis-handled as a value.\n s = s.replace(BEARER_PATTERN, (_, prefix: string) => `${prefix}***`);\n s = s.replace(PARAM_PATTERN, (_, prefix: string) => `${prefix}***`);\n }\n return s;\n}\n\n/**\n * Test-only helper exported for `_test-reset.ts`. NOT included in the\n * `index.ts` barrel — vitest setup imports the dedicated module via\n * explicit path to discourage production callers.\n *\n * @internal\n */\nexport function _resetForTests(opts: { enabled?: boolean; clearExtras?: boolean }): void {\n if (opts.enabled !== undefined) REDACT_ENABLED = opts.enabled;\n if (opts.clearExtras === true) _extraPatterns.length = 0;\n}\n","import type { ConversationTurn } from \"../../types/conversation.js\";\nimport type {\n SDKAssistantMessage,\n SDKRequestMessage,\n SDKStatusMessage,\n SDKSystemMessage,\n SDKTaskMessage,\n SDKThinkingMessage,\n SDKToolUseMessage,\n SDKUserMessageEvent,\n} from \"../../types/messages.js\";\nimport { generateRequestId } from \"../ids.js\";\nimport type { FixtureRequest } from \"./fixture-types.js\";\n\n/**\n * Low-level event builders + tool-list helper used by the fixture script\n * builders. Kept in a dedicated module so individual builder files stay\n * focused on their specific script shape rather than event plumbing.\n *\n * @internal\n */\n\nexport function assistantOnlyConversation(text: string): ConversationTurn[] {\n return [\n {\n type: \"agentConversationTurn\",\n turn: {\n steps: [{ type: \"assistantMessage\", message: { text } }],\n },\n },\n ];\n}\n\nexport function systemEvent(request: FixtureRequest, tools: string[]): SDKSystemMessage {\n return {\n type: \"system\",\n subtype: \"init\",\n agent_id: request.agentId,\n run_id: request.runId,\n model: request.model,\n tools,\n };\n}\n\nexport function userEvent(request: FixtureRequest): SDKUserMessageEvent {\n return {\n type: \"user\",\n agent_id: request.agentId,\n run_id: request.runId,\n message: { role: \"user\", content: [{ type: \"text\", text: request.userMessage }] },\n };\n}\n\nexport function assistantText(request: FixtureRequest, text: string): SDKAssistantMessage {\n return {\n type: \"assistant\",\n agent_id: request.agentId,\n run_id: request.runId,\n message: { role: \"assistant\", content: [{ type: \"text\", text }] },\n };\n}\n\nexport function thinkingEvent(request: FixtureRequest, text: string): SDKThinkingMessage {\n return {\n type: \"thinking\",\n agent_id: request.agentId,\n run_id: request.runId,\n text,\n };\n}\n\nexport function toolCallRunning(\n request: FixtureRequest,\n callId: string,\n name: string,\n): SDKToolUseMessage {\n return {\n type: \"tool_call\",\n agent_id: request.agentId,\n run_id: request.runId,\n call_id: callId,\n name,\n status: \"running\",\n args: { command: \"fixture\" },\n };\n}\n\nexport function toolCallCompleted(\n request: FixtureRequest,\n callId: string,\n name: string,\n): SDKToolUseMessage {\n return {\n type: \"tool_call\",\n agent_id: request.agentId,\n run_id: request.runId,\n call_id: callId,\n name,\n status: \"completed\",\n args: { command: \"fixture\" },\n result: { stdout: \"ok\", exitCode: 0 },\n };\n}\n\nexport function cloudStatus(\n request: FixtureRequest,\n status: SDKStatusMessage[\"status\"],\n): SDKStatusMessage {\n return {\n type: \"status\",\n agent_id: request.agentId,\n run_id: request.runId,\n status,\n };\n}\n\nexport function taskEvent(request: FixtureRequest, status: string): SDKTaskMessage {\n return {\n type: \"task\",\n agent_id: request.agentId,\n run_id: request.runId,\n status,\n };\n}\n\nexport function requestEvent(request: FixtureRequest): SDKRequestMessage {\n return {\n type: \"request\",\n agent_id: request.agentId,\n run_id: request.runId,\n request_id: generateRequestId(),\n };\n}\n\nexport function defaultLocalTools(request: FixtureRequest): string[] {\n const tools: string[] = [\"shell\"];\n const inlineMcp = request.sendOptions.mcpServers ?? request.agentOptions.mcpServers;\n if (inlineMcp !== undefined) {\n for (const name of Object.keys(inlineMcp)) {\n tools.push(`mcp_${sanitizeMcpName(name)}_call`);\n }\n }\n if (request.settingSourcesIncludeProject) {\n for (const name of Object.keys(request.projectMcpServers)) {\n tools.push(`mcp_${sanitizeMcpName(name)}_call`);\n }\n }\n const plugins = request.agentOptions.plugins;\n if (plugins?.enabled !== undefined) {\n for (const _pluginName of plugins.enabled) {\n tools.push(\"mcp_search_provider_web_search\");\n }\n }\n return tools;\n}\n\nfunction sanitizeMcpName(name: string): string {\n // Replace anything that's not alphanumeric or hyphen with an underscore.\n // Hyphens are preserved (some MCP server names like `fixture-shell` rely\n // on them being stable in the public tool list).\n return name.replace(/[^a-zA-Z0-9-]+/g, \"_\").replace(/^[_-]+|[_-]+$/g, \"\");\n}\n","/**\n * @deprecated Import from `../persistence/atomic-write.js` instead.\n * Maintained as re-export for backward compatibility (ADR D59).\n *\n * @internal\n */\n\nexport type { AtomicWriteJsonOptions } from \"../persistence/atomic-write.js\";\nexport { atomicWriteJson, replaceFileAtomic } from \"../persistence/atomic-write.js\";\n","import { mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { replaceFileAtomic } from \"./atomic-write.js\";\nimport { withCwdMutex } from \"./cwd-mutex.js\";\nimport { type MemoryConfig, type MemoryFact, redactSecrets } from \"./types.js\";\n\n/**\n * Markdown-first memory storage (ADR D1 of memory-system-openclaw-parity).\n *\n * Layout:\n * .theokit/memory/\n * ├── MEMORY.md # facts under `## Facts`\n * └── notes/\n * └── <slug>.md # per-topic notes\n *\n * All writes go through `replaceFileAtomic` + a per-cwd mutex (EC-4 of the\n * edge-case review) so concurrent `appendFact` calls within the same process\n * serialize. Multi-process safety is NOT provided.\n *\n * @internal\n */\n\nconst MEMORY_MD_HEADER =\n \"# Memory\\n\\n> Auto-managed by @theokit/sdk. Edit freely — the SDK reads from here.\\n\";\nconst FACTS_HEADING = \"## Facts\";\n\nexport function memoryDir(cwd: string): string {\n return join(cwd, \".theokit\", \"memory\");\n}\n\nexport function memoryMdPath(cwd: string): string {\n return join(memoryDir(cwd), \"MEMORY.md\");\n}\n\nexport function notesDir(cwd: string): string {\n return join(memoryDir(cwd), \"notes\");\n}\n\n/** Read facts from `MEMORY.md`'s `## Facts` section. Returns `[]` when missing. */\nexport async function readFactsFromMarkdown(cwd: string): Promise<MemoryFact[]> {\n let raw: string;\n try {\n raw = await readFile(memoryMdPath(cwd), \"utf8\");\n } catch {\n return [];\n }\n return parseFactsSection(raw);\n}\n\n/** Append a fact to `MEMORY.md ## Facts`. Creates the section if missing. Atomic + serialized. */\nexport function appendFactToMarkdown(cwd: string, fact: MemoryFact): Promise<void> {\n return withCwdMutex(memoryDir(cwd), async () => {\n const path = memoryMdPath(cwd);\n let raw = \"\";\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n raw = \"\";\n }\n const sanitized = redactSecrets(fact.text);\n const next = insertFactBullet(raw, sanitized);\n await mkdir(memoryDir(cwd), { recursive: true });\n await replaceFileAtomic(path, next);\n });\n}\n\nexport interface NoteFile {\n slug: string;\n path: string;\n}\n\nexport async function listNotes(cwd: string): Promise<NoteFile[]> {\n let entries: string[] = [];\n try {\n entries = await readdir(notesDir(cwd));\n } catch {\n return [];\n }\n return entries\n .filter((name) => name.endsWith(\".md\"))\n .map((name) => ({ slug: name.replace(/\\.md$/, \"\"), path: join(notesDir(cwd), name) }));\n}\n\nfunction parseFactsSection(raw: string): MemoryFact[] {\n const idx = raw.indexOf(FACTS_HEADING);\n if (idx === -1) return [];\n const tail = raw.slice(idx + FACTS_HEADING.length);\n // Stop at the next top-level or h2 heading.\n const nextHeading = tail.search(/\\n#{1,2}\\s/);\n const block = nextHeading === -1 ? tail : tail.slice(0, nextHeading);\n return block\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"- \"))\n .map((line) => ({ text: line.slice(2).trim() }));\n}\n\nfunction insertFactBullet(raw: string, fact: string): string {\n const bullet = `- ${fact}`;\n if (raw.length === 0) {\n return `${MEMORY_MD_HEADER}\\n${FACTS_HEADING}\\n\\n${bullet}\\n`;\n }\n const idx = raw.indexOf(FACTS_HEADING);\n if (idx === -1) {\n // Append a new ## Facts section, preserving prior content (EC-5).\n const sep = raw.endsWith(\"\\n\") ? \"\" : \"\\n\";\n return `${raw}${sep}\\n${FACTS_HEADING}\\n\\n${bullet}\\n`;\n }\n // Find end of the facts block (next h2/h1 heading) and insert before it.\n const after = idx + FACTS_HEADING.length;\n const nextHeading = raw.slice(after).search(/\\n#{1,2}\\s/);\n if (nextHeading === -1) {\n const trailing = raw.endsWith(\"\\n\") ? \"\" : \"\\n\";\n return `${raw}${trailing}${bullet}\\n`;\n }\n const insertAt = after + nextHeading;\n return `${raw.slice(0, insertAt)}\\n${bullet}${raw.slice(insertAt)}`;\n}\n\n/** Configuration-aware accessors honoring the existing MemoryConfig contract. */\nexport async function readFacts(cwd: string, config: MemoryConfig): Promise<MemoryFact[]> {\n if (!config.enabled) return [];\n return readFactsFromMarkdown(cwd);\n}\n\nexport async function appendFact(\n cwd: string,\n config: MemoryConfig,\n fact: MemoryFact,\n): Promise<void> {\n if (!config.enabled) return;\n await appendFactToMarkdown(cwd, fact);\n}\n","/**\n * Public memory types (used by runtime + storage + migration + future index).\n *\n * Leaf module — only depends on `node:path` — so neither `runtime/memory-store.ts`\n * nor `internal/memory/markdown-store.ts` introduces a dependency cycle.\n *\n * @internal\n */\nimport { resolve as resolvePath } from \"node:path\";\n\nimport { safePathJoin, sanitizeIdentifier } from \"../security/path-guard.js\";\n\nexport interface MemoryConfig {\n enabled: boolean;\n namespace?: string;\n userId?: string;\n scope?: \"agent\" | \"user\" | \"team\";\n storePath?: string;\n}\n\nexport interface MemoryFact {\n text: string;\n}\n\n// `redactSecrets` is now re-exported from the canonical security module\n// (ADR D68). Pre-T0.2 it was a 3-pattern local fn; consolidated to avoid\n// drift with the central 12-pattern list.\nexport { redactSecrets } from \"../security/index.js\";\n\n/**\n * Resolve the legacy JSON memory path used pre-ADR-D8 (kept for migration\n * helpers + tests). Centralized here so `migration.ts` and the legacy-aware\n * `runtime/memory-store.ts` don't duplicate the path logic (jscpd cleanup).\n */\nexport function legacyMemoryJsonPath(cwd: string, config: MemoryConfig): string {\n // ADRs D79-D81: storePath is programmatic (trusted); namespace/scope/userId\n // are user-shaped and pass sanitizeIdentifier. EC-7 (edge-case review):\n // realistic userIds (UUIDs, hash IDs, \"default\") pass; \"user@example.com\"\n // and similar need to be normalized by the caller before passing.\n if (config.storePath !== undefined) {\n return resolvePath(cwd, config.storePath);\n }\n const namespace = sanitizeIdentifier(config.namespace ?? \"default\");\n const scope = sanitizeIdentifier(config.scope ?? \"agent\", { maxLen: 16 });\n const userId = sanitizeIdentifier(config.userId ?? \"default\");\n return safePathJoin(cwd, \".theokit\", \"memory\", namespace, `${scope}-${userId}.json`);\n}\n\n/**\n * A semantically meaningful slice of a markdown memory file, produced by\n * `chunkMarkdown`. Each chunk carries stable line numbers + a content hash\n * used downstream by the embedding cache.\n *\n * Mirrors OpenClaw's `MemoryChunk` shape\n * (`referencia/openclaw/packages/memory-host-sdk/src/host/engine-storage.ts`).\n *\n * @internal\n */\nexport interface MemoryChunk {\n /** 1-indexed starting line in the source file. */\n startLine: number;\n /** 1-indexed ending line (inclusive). */\n endLine: number;\n /** Slice of markdown source text. */\n text: string;\n /** sha256 of `text`; stable across runs for identical inputs. */\n hash: string;\n /** Optional nearest heading text (without the `#` markers). */\n heading?: string;\n}\n\n/**\n * Result of `reader.readFile`. Contains the bounded slice plus truncation\n * + provenance info.\n *\n * Mirrors OpenClaw's `MemoryReadResult` shape.\n *\n * @internal\n */\nexport interface MemoryReadResult {\n path: string;\n /** Requested starting line (1-indexed, defaults to 1). */\n from: number;\n /** Number of lines actually returned (may be less than `lines` near EOF). */\n linesReturned: number;\n /** Total lines in the file (after the read). */\n totalLines: number;\n /** True when fewer lines were returned than the requested `lines` AND EOF was hit. */\n truncated: boolean;\n /** Lines past the returned slice that remain in the file. */\n remainingLines: number;\n /** Slice text (joined with `\\n`). */\n text: string;\n}\n\n/**\n * Lightweight reference to a markdown file in the memory corpus.\n *\n * Mirrors OpenClaw's `MemoryFileEntry`.\n *\n * @internal\n */\nexport interface MemoryFileEntry {\n /** Absolute path on disk. */\n path: string;\n /** Path relative to the memory root (e.g. \"MEMORY.md\", \"notes/foo.md\"). */\n relPath: string;\n /** ms-since-epoch mtime. */\n mtime: number;\n /** sha256 of the file content; recomputed on each read. */\n hash: string;\n}\n","import { access, readFile, unlink } from \"node:fs/promises\";\n\nimport { appendFactToMarkdown, memoryMdPath } from \"./markdown-store.js\";\nimport { legacyMemoryJsonPath, type MemoryConfig, type MemoryFact } from \"./types.js\";\n\n/**\n * One-shot legacy-JSON → markdown migration (ADR D8 of memory-system-openclaw-parity).\n *\n * Triggers when `.theokit/memory/<namespace>/<scope>-<userId>.json` exists AND\n * `.theokit/memory/MEMORY.md` does not. Reads the JSON facts, writes each\n * bullet to MEMORY.md, then deletes the JSON file. Idempotent.\n *\n * @internal\n */\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readLegacyFacts(jsonPath: string): Promise<MemoryFact[] | undefined> {\n try {\n const raw = await readFile(jsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as { facts?: MemoryFact[] };\n return Array.isArray(parsed.facts) ? parsed.facts : [];\n } catch {\n return undefined;\n }\n}\n\nasync function writeMigratedFacts(\n cwd: string,\n jsonPath: string,\n facts: MemoryFact[],\n): Promise<MigrationResult> {\n try {\n for (const fact of facts) await appendFactToMarkdown(cwd, fact);\n await unlink(jsonPath).catch(() => undefined);\n process.stderr.write(\n `[theokit-sdk] migrated ${facts.length} fact(s) from ${jsonPath} to MEMORY.md\\n`,\n );\n return { migrated: true, factCount: facts.length };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] memory migration failed (readonly fs?): ${message}\\n`);\n return { migrated: false, factCount: 0, reason: \"readonly-fs\" };\n }\n}\n\nconst migrationRun = new Set<string>();\n\nexport interface MigrationResult {\n migrated: boolean;\n factCount: number;\n reason?: \"already-migrated\" | \"no-legacy-json\" | \"markdown-exists\" | \"readonly-fs\";\n}\n\nexport async function migrateLegacyJson(\n cwd: string,\n config: MemoryConfig,\n): Promise<MigrationResult> {\n const key = `${cwd}::${config.namespace ?? \"default\"}::${config.scope ?? \"agent\"}::${config.userId ?? \"default\"}`;\n if (migrationRun.has(key)) return { migrated: false, factCount: 0, reason: \"already-migrated\" };\n migrationRun.add(key);\n\n const jsonPath = legacyMemoryJsonPath(cwd, config);\n if (!(await fileExists(jsonPath))) {\n return { migrated: false, factCount: 0, reason: \"no-legacy-json\" };\n }\n if (await fileExists(memoryMdPath(cwd))) {\n process.stderr.write(\n `[theokit-sdk] memory migration skipped: both MEMORY.md and legacy JSON exist at ${jsonPath}; leaving both intact\\n`,\n );\n return { migrated: false, factCount: 0, reason: \"markdown-exists\" };\n }\n\n const facts = await readLegacyFacts(jsonPath);\n if (facts === undefined) return { migrated: false, factCount: 0, reason: \"no-legacy-json\" };\n return writeMigratedFacts(cwd, jsonPath, facts);\n}\n\n/** Test-only — reset the in-process migration flag map. */\nexport function resetMigrationStateForTests(): void {\n migrationRun.clear();\n}\n","import { appendFact as appendFactMd, readFacts as readFactsMd } from \"../memory/markdown-store.js\";\nimport { migrateLegacyJson } from \"../memory/migration.js\";\nimport {\n legacyMemoryJsonPath,\n type MemoryConfig,\n type MemoryFact,\n redactSecrets,\n} from \"../memory/types.js\";\n\n/**\n * Workspace-level memory store. Storage migrated from JSON-array to\n * markdown-first per memory-system-openclaw-parity-plan ADR D1: facts live in\n * `.theokit/memory/MEMORY.md` under a `## Facts` section. On first read the\n * legacy JSON file is migrated and deleted (ADR D8).\n *\n * Public surface (`readMemoryFacts` + `appendMemoryFact`) is unchanged.\n *\n * @internal\n */\n\nexport type { MemoryConfig, MemoryFact };\nexport { redactSecrets };\n\nconst REMEMBER_PATTERN = /^\\s*Remember(?:\\s+this\\s+durable\\s+preference)?\\s*:\\s*(.+)$/i;\n\n/**\n * Predicate: does the user message opt into memory persistence via the\n * `Remember:` prefix? Anchored at start-of-message; case-insensitive.\n *\n * Shared by the fixture runtime and the real LLM runtime so both paths\n * agree on which user messages persist a fact.\n *\n * @internal\n */\nexport function isMemoryWritePrompt(message: string): boolean {\n return REMEMBER_PATTERN.test(message) || message.includes(\"Remember this durable\");\n}\n\n/**\n * Extract the fact text from a user message that matched\n * {@link isMemoryWritePrompt}. Strips the leading \"Remember:\" prefix and\n * a trailing period. Returns an empty string when the capture group is\n * empty — callers must check for that and skip the persistence call.\n *\n * @internal\n */\nexport function extractMemoryFact(message: string): string {\n const match = REMEMBER_PATTERN.exec(message);\n if (match === null || match[1] === undefined) return \"\";\n return match[1].trim().replace(/\\.$/, \"\");\n}\n\n/** @internal — kept for migration helpers + tests. */\nexport function memoryFilePath(cwd: string, config: MemoryConfig): string {\n return legacyMemoryJsonPath(cwd, config);\n}\n\nexport async function readMemoryFacts(cwd: string, config: MemoryConfig): Promise<MemoryFact[]> {\n if (!config.enabled) return [];\n await migrateLegacyJson(cwd, config);\n return readFactsMd(cwd, config);\n}\n\nexport async function appendMemoryFact(\n cwd: string,\n config: MemoryConfig,\n fact: MemoryFact,\n): Promise<void> {\n if (!config.enabled) return;\n await migrateLegacyJson(cwd, config);\n const sanitized: MemoryFact = { text: redactSecrets(fact.text) };\n await appendFactMd(cwd, config, sanitized);\n}\n","import { generateCallId } from \"../ids.js\";\nimport {\n assistantOnlyConversation,\n assistantText,\n cloudStatus,\n defaultLocalTools,\n requestEvent,\n systemEvent,\n taskEvent,\n thinkingEvent,\n toolCallCompleted,\n toolCallRunning,\n userEvent,\n} from \"./fixture-events.js\";\nimport type { FixtureRequest, FixtureScript } from \"./fixture-types.js\";\n\n/**\n * Concrete fixture script builders. Each function returns a fully assembled\n * `FixtureScript` for one of the prompt patterns recognised by the dispatcher\n * in `fixture-responder.ts`.\n *\n * @internal\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Memory: detect Remember/recall patterns\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { extractMemoryFact } from \"./memory-store.js\";\n\nexport { extractMemoryFact, isMemoryWritePrompt } from \"./memory-store.js\";\n\nexport function isMemoryRecallPrompt(message: string, request: FixtureRequest): boolean {\n if (request.memoryFacts.length === 0 && request.sessionMessages.length === 0) return false;\n if (/^\\s*Remember/i.test(message)) return false;\n return (\n message.toLowerCase().includes(\"preferred\") ||\n message.includes(\"What answer did I ask you to remember\") ||\n message.includes(\"editor and token\") ||\n message.includes(\"What is my\")\n );\n}\n\nexport function memoryWriteScript(request: FixtureRequest): FixtureScript {\n const fact = extractMemoryFactOrMessage(request.userMessage);\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, `Remembered: ${fact}`),\n ],\n finalStatus: \"finished\",\n result: `Remembered: ${fact}`,\n cancellable: false,\n conversation: assistantOnlyConversation(`Remembered: ${fact}`),\n beforeComplete: async () => {\n if (request.persistMemoryFact === undefined) return;\n await request.persistMemoryFact({ text: fact });\n },\n };\n}\n\nexport function memoryRecallScript(request: FixtureRequest): FixtureScript {\n const haystack = [\n ...request.memoryFacts.map((fact) => fact.text),\n ...request.sessionMessages.filter((msg) => msg.role === \"user\").map((msg) => msg.text),\n ];\n const recalled = recallFromHaystack(request.userMessage, haystack);\n const answer = recalled ?? \"I don't have a stored answer for that yet.\";\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, answer),\n ],\n finalStatus: \"finished\",\n result: answer,\n cancellable: false,\n conversation: assistantOnlyConversation(answer),\n };\n}\n\n/**\n * Fixture-script-only wrapper: the shared {@link extractMemoryFact} returns\n * `\"\"` on no match, but the fixture's pre-existing semantics returned the\n * full message. Preserve that behaviour for the fixture path so existing\n * fixture contract tests stay green.\n */\nfunction extractMemoryFactOrMessage(message: string): string {\n const fact = extractMemoryFact(message);\n return fact.length > 0 ? fact : message;\n}\n\nfunction recallFromHaystack(question: string, haystack: string[]): string | undefined {\n const lc = question.toLowerCase();\n if (lc.includes(\"test runner\")) {\n const fact = haystack.find((entry) => /vitest/i.test(entry));\n if (fact !== undefined) return \"Vitest\";\n }\n if (lc.includes(\"answer\")) {\n const fact = haystack.find((entry) => /\\b\\d{2,}\\b/.test(entry));\n if (fact !== undefined) {\n const num = /\\b(\\d{2,})\\b/.exec(fact);\n if (num !== null && num[1] !== undefined) return `The answer is ${num[1]}.`;\n }\n }\n return undefined;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Local script builders\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a \"finished\" fixture script where the assistant simply replies with\n * `text` and the conversation contains a single assistant turn. Most local\n * scripts follow this shape — keeping the helper deduplicates the repeated\n * `{events, finalStatus, result, cancellable, conversation}` literal.\n */\nfunction finishedAssistantScript(request: FixtureRequest, text: string): FixtureScript {\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, text),\n ],\n finalStatus: \"finished\",\n result: text,\n cancellable: false,\n conversation: assistantOnlyConversation(text),\n };\n}\n\nexport function returnAnswerScript(request: FixtureRequest, answer: string): FixtureScript {\n const callId = generateCallId();\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n toolCallCompleted(request, callId, \"shell\"),\n assistantText(request, answer),\n ],\n finalStatus: \"finished\",\n result: answer,\n cancellable: false,\n conversation: assistantOnlyConversation(answer),\n };\n}\n\nexport function buildCloudScript(request: FixtureRequest): FixtureScript {\n const result = \"Cloud run completed.\";\n return {\n events: [\n systemEvent(request, []),\n userEvent(request),\n cloudStatus(request, \"CREATING\"),\n cloudStatus(request, \"RUNNING\"),\n assistantText(request, result),\n cloudStatus(request, \"FINISHED\"),\n ],\n finalStatus: \"finished\",\n result,\n cancellable: false,\n conversation: assistantOnlyConversation(result),\n };\n}\n\nexport function slowRunScript(request: FixtureRequest): FixtureScript {\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, \"Starting the slow command...\"),\n ],\n finalStatus: \"cancelled\",\n cancellable: true,\n conversation: assistantOnlyConversation(\"Starting the slow command...\"),\n };\n}\n\nexport function errorRunScript(request: FixtureRequest): FixtureScript {\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, \"Command failed\"),\n ],\n finalStatus: \"error\",\n result: \"Command failed\",\n cancellable: false,\n conversation: assistantOnlyConversation(\"Command failed\"),\n };\n}\n\nexport function returnOnlyScript(request: FixtureRequest): FixtureScript {\n const trimmed = request.userMessage.replace(/^.*Return only:\\s*/i, \"\").trim();\n const text = trimmed.length === 0 ? \"The answer is 42.\" : trimmed;\n return finishedAssistantScript(request, text);\n}\n\nexport function shellWithApprovalScript(request: FixtureRequest): FixtureScript {\n const callId = generateCallId();\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n thinkingEvent(request, \"Plan: inspect index.js, then ask before editing.\"),\n toolCallCompleted(request, callId, \"shell\"),\n assistantText(request, \"The answer is 42.\"),\n taskEvent(request, \"inspection-complete\"),\n requestEvent(request),\n ],\n finalStatus: \"finished\",\n result: \"The answer is 42.\",\n cancellable: false,\n conversation: assistantOnlyConversation(\"The answer is 42.\"),\n };\n}\n\nexport function twoShellCommandsScript(request: FixtureRequest): FixtureScript {\n const call1 = generateCallId();\n const call2 = generateCallId();\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n toolCallRunning(request, call1, \"shell\"),\n toolCallCompleted(request, call1, \"shell\"),\n toolCallRunning(request, call2, \"shell\"),\n toolCallCompleted(request, call2, \"shell\"),\n assistantText(request, \"Both commands completed.\"),\n ],\n finalStatus: \"finished\",\n result: \"Both commands completed.\",\n cancellable: false,\n conversation: assistantOnlyConversation(\"Both commands completed.\"),\n };\n}\n\nexport function shellExplainScript(request: FixtureRequest): FixtureScript {\n const callId = generateCallId();\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n toolCallCompleted(request, callId, \"shell\"),\n assistantText(request, \"ls succeeded and src/index.js exports answer().\"),\n ],\n finalStatus: \"finished\",\n result: \"ls succeeded and src/index.js exports answer().\",\n cancellable: false,\n conversation: [\n {\n type: \"agentConversationTurn\",\n turn: {\n userMessage: { text: request.userMessage },\n steps: [\n { type: \"assistantMessage\", message: { text: \"Reviewing src/index.js.\" } },\n { type: \"toolCall\", message: { callId, name: \"shell\" } },\n ],\n },\n },\n {\n type: \"shellConversationTurn\",\n turn: {\n shellCommand: { command: \"ls\" },\n shellOutput: { stdout: \"src\\npackage.json\\n\", stderr: \"\", exitCode: 0 },\n },\n },\n ],\n };\n}\n\nexport function spawnSubagentsScript(request: FixtureRequest): FixtureScript {\n const subagents = Object.entries(request.subagents);\n const lines: string[] = [\"Spawning subagents:\"];\n for (const [name, def] of subagents) {\n lines.push(`- ${name} (${def.description}): ${def.prompt}`);\n }\n return finishedAssistantScript(request, lines.join(\"\\n\"));\n}\n\nexport function listMcpToolsScript(request: FixtureRequest): FixtureScript {\n const tools = defaultLocalTools(request);\n return {\n events: [\n systemEvent(request, tools),\n userEvent(request),\n assistantText(request, `Active tools: ${tools.join(\", \")}`),\n ],\n finalStatus: \"finished\",\n result: `Active tools: ${tools.join(\", \")}`,\n cancellable: false,\n conversation: assistantOnlyConversation(`Active tools: ${tools.join(\", \")}`),\n };\n}\n\nexport function webSearchScript(request: FixtureRequest): FixtureScript {\n const callId = generateCallId();\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n toolCallCompleted(request, callId, \"mcp_search_provider_web_search\"),\n assistantText(request, \"Search complete.\"),\n ],\n finalStatus: \"finished\",\n result: \"Search complete.\",\n cancellable: false,\n conversation: assistantOnlyConversation(\"Search complete.\"),\n };\n}\n\nexport function providerFallbackScript(request: FixtureRequest): FixtureScript {\n const fallback = request.agentOptions.providers?.fallback?.[0] ?? \"openrouter\";\n const fallbackModel = `${fallback}:fallback-default`;\n return {\n events: [\n systemEvent(request, defaultLocalTools(request)),\n userEvent(request),\n assistantText(request, \"Falling back to alternate provider.\"),\n ],\n finalStatus: \"finished\",\n result: \"Falling back to alternate provider.\",\n cancellable: false,\n conversation: assistantOnlyConversation(\"Falling back to alternate provider.\"),\n extraRunFields: {\n model: { id: fallbackModel },\n provider: {\n requested: \"unavailable\",\n selected: fallback,\n fallbackReason: \"unavailable-provider\",\n },\n },\n };\n}\n\nexport function printEnvScript(request: FixtureRequest): FixtureScript {\n return finishedAssistantScript(\n request,\n \"Environment summary printed (secrets redacted with ***).\",\n );\n}\n\nexport function useSkillScript(request: FixtureRequest, skillName: string): FixtureScript {\n return finishedAssistantScript(\n request,\n `Using skill: ${skillName} (metadata only — body redacted).`,\n );\n}\n\nexport function contextAwareScript(request: FixtureRequest): FixtureScript {\n return finishedAssistantScript(\n request,\n \"The project uses deterministic contract tests for the Theo SDK.\",\n );\n}\n\nexport function defaultFinishedScript(request: FixtureRequest): FixtureScript {\n return finishedAssistantScript(request, \"Done.\");\n}\n","import type { SDKMessage } from \"../../types/messages.js\";\nimport type { RunResult } from \"../../types/run.js\";\nimport { redactSecrets } from \"../security/index.js\";\nimport {\n buildCloudScript,\n contextAwareScript,\n defaultFinishedScript,\n errorRunScript,\n isMemoryRecallPrompt,\n isMemoryWritePrompt,\n listMcpToolsScript,\n memoryRecallScript,\n memoryWriteScript,\n printEnvScript,\n providerFallbackScript,\n returnAnswerScript,\n returnOnlyScript,\n shellExplainScript,\n shellWithApprovalScript,\n slowRunScript,\n spawnSubagentsScript,\n twoShellCommandsScript,\n useSkillScript,\n webSearchScript,\n} from \"./fixture-scripts.js\";\nimport type { FixtureRequest, FixtureScript } from \"./fixture-types.js\";\n\n/**\n * Fixture responder entry point. Pattern-matches the user message against a\n * dispatch table, builds the script via the appropriate builder, then\n * redacts any provider-token-shaped substrings before returning.\n *\n * @internal\n */\n\nexport type { FixtureRequest, FixtureScript } from \"./fixture-types.js\";\n\ntype ScriptHandler = (request: FixtureRequest) => FixtureScript;\n\nconst LOCAL_SCRIPT_RULES: ReadonlyArray<{\n match: (m: string, request: FixtureRequest) => boolean;\n build: ScriptHandler;\n}> = [\n { match: (m, r) => isMemoryRecallPrompt(m, r), build: memoryRecallScript },\n { match: (m) => isMemoryWritePrompt(m), build: memoryWriteScript },\n { match: (m) => m.includes(\"Run npm run slow\"), build: slowRunScript },\n {\n match: (m) => m.includes(\"Run npm run fail\") || m.includes(\"failing-tool\"),\n build: errorRunScript,\n },\n { match: (m) => m.includes(\"Return only:\"), build: returnOnlyScript },\n {\n match: (m) =>\n m.includes(\"ask for approval before editing\") ||\n m.includes(\"Use shell to inspect src/index.js, then answer\"),\n build: shellWithApprovalScript,\n },\n { match: (m) => m.includes(\"Run two shell commands\"), build: twoShellCommandsScript },\n { match: (m) => m.includes(\"Run ls and explain\"), build: shellExplainScript },\n {\n match: (m) => m.includes(\"exported answer\") || m.includes(\"report the exported answer\"),\n build: (r) => returnAnswerScript(r, \"The answer is 42.\"),\n },\n { match: (m) => m.includes(\"Spawn reviewer and worker subagents\"), build: spawnSubagentsScript },\n {\n match: (m) =>\n m.includes(\"List available MCP tools\") ||\n m.includes(\"Which MCP servers are active\") ||\n m.includes(\"List MCP tools after resume\"),\n build: listMcpToolsScript,\n },\n {\n match: (m) => m.includes(\"Search docs for SDK contract testing patterns\"),\n build: webSearchScript,\n },\n { match: (m) => m.includes(\"Use provider fallback\"), build: providerFallbackScript },\n { match: (m) => m.includes(\"Print env and then summarize\"), build: printEnvScript },\n {\n match: (m) => m.includes(\"Use the code-review skill\"),\n build: (r) => useSkillScript(r, \"code-review\"),\n },\n { match: (m) => m.includes(\"Answer using loaded project context\"), build: contextAwareScript },\n];\n\n/**\n * Dispatch the user message to a deterministic fixture response.\n *\n * @internal\n */\nexport function buildFixtureScript(request: FixtureRequest): FixtureScript {\n const script =\n request.runtime === \"cloud\" ? buildCloudScript(request) : buildLocalScript(request);\n return redactScriptSecrets(script);\n}\n\nfunction buildLocalScript(request: FixtureRequest): FixtureScript {\n const m = request.userMessage;\n for (const rule of LOCAL_SCRIPT_RULES) {\n if (rule.match(m, request)) return rule.build(request);\n }\n return defaultFinishedScript(request);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Secret redaction — strips obvious provider tokens + fixture sentinel\n// from event payloads. Canonical patterns come from `internal/security`;\n// the `fixture-search-secret` sentinel is local because:\n// - EC-2 fix: registering it via `Security.addPattern` would be cleared\n// by `_resetForTests({ clearExtras: true })` between tests (the module\n// init only runs once per worker).\n// - The sentinel is specific to fixture mode and shouldn't pollute the\n// global redaction surface that other consumers see.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst FIXTURE_SENTINEL = /fixture-search-secret/g;\n\nfunction redactScriptSecrets(script: FixtureScript): FixtureScript {\n const events = script.events.map(redactEventSecrets);\n return { ...script, events };\n}\n\nfunction redactEventSecrets(event: SDKMessage): SDKMessage {\n const serialized = JSON.stringify(event);\n // Step 1: local fixture sentinel — scoped to this module only.\n const localStripped = serialized.replace(FIXTURE_SENTINEL, \"***\");\n // Step 2: canonical redaction (12 builtin patterns + PARAM + user extras).\n const redacted = redactSecrets(localStripped);\n if (redacted === serialized) return event;\n return JSON.parse(redacted) as SDKMessage;\n}\n\n/**\n * Extract a Run-level extras object (e.g. fallback provider info) when the\n * script declared one. Used by the Run impl to merge into RunResult.\n *\n * @internal\n */\nexport function applyExtraRunFields(base: RunResult, script: FixtureScript): RunResult {\n if (script.extraRunFields === undefined) return base;\n return { ...base, ...script.extraRunFields } as RunResult;\n}\n","import type { ModelSelection } from \"../../types/agent.js\";\nimport type { ConversationTurn } from \"../../types/conversation.js\";\nimport type { SDKMessage } from \"../../types/messages.js\";\nimport type { Run, RunOperation, RunResult, RunStatus, SDKUserMessage } from \"../../types/run.js\";\nimport { generateRunId } from \"../ids.js\";\nimport { applyExtraRunFields } from \"./fixture-responder.js\";\nimport type { FixtureScript } from \"./fixture-types.js\";\n\n/**\n * Shared bootstrap state extracted from `createLocalRun` / `createCloudRun`.\n * Keeps the body of each factory readable while avoiding a tiny duplicated\n * preamble.\n *\n * @internal\n */\nexport function prepareRunContext(message: string | SDKUserMessage): {\n userText: string;\n id: string;\n startTime: number;\n} {\n const userText = typeof message === \"string\" ? message : message.text;\n return { userText, id: generateRunId(), startTime: Date.now() };\n}\n\n/**\n * Shared state machine backing both `LocalRun` and `CloudRun`. Subclasses\n * override `bootstrap()` and `extendRunResult()` to inject runtime-specific\n * lifecycle behavior (async beforeComplete, git metadata) without\n * duplicating the surrounding plumbing.\n *\n * @internal\n */\nexport interface FixtureRunBaseOptions {\n id: string;\n agentId: string;\n model: ModelSelection | undefined;\n script: FixtureScript;\n supportedOps: Set<RunOperation>;\n startTime: number;\n}\n\nexport abstract class FixtureRunBase implements Run {\n readonly id: string;\n readonly agentId: string;\n status: RunStatus = \"running\";\n result?: string;\n model?: ModelSelection;\n durationMs?: number;\n createdAt?: number;\n\n protected readonly script: FixtureScript;\n protected readonly startTime: number;\n protected readonly supportedOps: Set<RunOperation>;\n protected readonly listeners = new Set<(status: RunStatus) => void>();\n protected readonly terminationPromise: Promise<RunResult>;\n protected resolveTermination!: (value: RunResult) => void;\n protected terminated = false;\n private eventNotifier: { promise: Promise<void>; resolve: () => void };\n\n constructor(options: FixtureRunBaseOptions) {\n this.id = options.id;\n this.agentId = options.agentId;\n if (options.model !== undefined) this.model = options.model;\n this.script = options.script;\n this.supportedOps = options.supportedOps;\n this.startTime = options.startTime;\n this.createdAt = options.startTime;\n this.terminationPromise = new Promise<RunResult>((resolve) => {\n this.resolveTermination = resolve;\n });\n this.eventNotifier = makeNotifier();\n }\n\n abstract bootstrap(): void;\n\n /**\n * Subclasses driving real (non-fixture) runtimes should call this after\n * pushing a new event into `this.script.events` so that already-awaiting\n * consumers of `stream()` wake up and yield it.\n */\n protected notifyNewEvents(): void {\n const current = this.eventNotifier;\n this.eventNotifier = makeNotifier();\n current.resolve();\n }\n\n async *stream(): AsyncGenerator<SDKMessage, void> {\n let index = 0;\n while (!this.terminated) {\n while (index < this.script.events.length) {\n yield this.script.events[index++] as SDKMessage;\n }\n if (this.terminated) break;\n await Promise.race([this.eventNotifier.promise, this.terminationPromise]);\n }\n while (index < this.script.events.length) {\n yield this.script.events[index++] as SDKMessage;\n }\n }\n\n wait(): Promise<RunResult> {\n return this.terminationPromise;\n }\n\n cancel(): Promise<void> {\n if (this.terminated) return Promise.resolve();\n this.transitionTo(\"cancelled\");\n return Promise.resolve();\n }\n\n conversation(): Promise<ConversationTurn[]> {\n return Promise.resolve(this.script.conversation);\n }\n\n supports(op: RunOperation): boolean {\n return this.supportedOps.has(op);\n }\n\n unsupportedReason(op: RunOperation): string | undefined {\n return this.supportedOps.has(op) ? undefined : `Operation ${op} is not supported`;\n }\n\n onDidChangeStatus(listener: (status: RunStatus) => void): () => void {\n this.listeners.add(listener);\n this.notifyListener(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n protected transitionTo(nextStatus: RunStatus): void {\n if (this.terminated) return;\n this.terminated = true;\n this.status = nextStatus;\n this.durationMs = Date.now() - this.startTime;\n if (nextStatus !== \"cancelled\" && this.script.result !== undefined) {\n this.result = this.script.result;\n }\n this.notifyAllListeners();\n this.eventNotifier.resolve();\n this.resolveTermination(this.buildResult(nextStatus));\n }\n\n protected buildResult(status: RunStatus): RunResult {\n const base: RunResult = {\n id: this.id,\n status: status === \"running\" ? \"finished\" : status,\n ...(this.model !== undefined ? { model: this.model } : {}),\n durationMs: this.durationMs ?? Date.now() - this.startTime,\n };\n if ((status === \"finished\" || status === \"error\") && this.script.result !== undefined) {\n base.result = this.script.result;\n }\n // Surface the script's errorDetail (set by emitErrorEvent) so wait()\n // callers see the cause without having to drain stream().\n if (status === \"error\" && this.script.errorDetail !== undefined) {\n base.error = this.script.errorDetail;\n }\n // D376/D377: usage + cost flow through RunResult regardless of status\n // (partial-failure runs that observed ≥1 LLM step still report tokens).\n if (this.script.usage !== undefined) base.usage = this.script.usage;\n if (this.script.cost !== undefined) base.cost = this.script.cost;\n return this.extendRunResult(applyExtraRunFields(base, this.script));\n }\n\n /** Subclasses override to attach runtime-specific fields (e.g. cloud git info). */\n protected extendRunResult(result: RunResult): RunResult {\n return result;\n }\n\n /** Whether `onDidChangeStatus` should fire immediately with the current status. */\n protected notifyImmediately(): boolean {\n return false;\n }\n\n private notifyListener(listener: (status: RunStatus) => void): void {\n if (!this.notifyImmediately()) return;\n try {\n listener(this.status);\n } catch {\n // listeners are user code; never propagate\n }\n }\n\n private notifyAllListeners(): void {\n for (const listener of this.listeners) {\n try {\n listener(this.status);\n } catch {\n // listeners are user code; never propagate\n }\n }\n }\n}\n\nfunction makeNotifier(): { promise: Promise<void>; resolve: () => void } {\n let resolve: () => void = () => undefined;\n const promise = new Promise<void>((res) => {\n resolve = res;\n });\n return { promise, resolve };\n}\n","import type { AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport type {\n Run,\n RunGitInfo,\n RunOperation,\n RunResult,\n SDKUserMessage,\n SendOptions,\n} from \"../../types/run.js\";\nimport { buildFixtureScript } from \"./fixture-responder.js\";\nimport {\n FixtureRunBase,\n type FixtureRunBaseOptions,\n prepareRunContext,\n} from \"./fixture-run-base.js\";\n\n/**\n * Options accepted by `createCloudRun()`.\n *\n * @internal\n */\nexport interface CreateCloudRunOptions {\n agentId: string;\n model: ModelSelection;\n message: string | SDKUserMessage;\n agentOptions: AgentOptions;\n sendOptions: SendOptions;\n /** Accepted for API parity; fixture cloud path does not use it. */\n systemPrompt?: string;\n}\n\n/**\n * Build a cloud Run handle. In fixture mode, mimics Theo PaaS behavior\n * (CREATING/RUNNING/FINISHED status events + git metadata on result).\n *\n * @internal\n */\nexport function createCloudRun(options: CreateCloudRunOptions): Run {\n const { userText, id, startTime } = prepareRunContext(options.message);\n const supported = new Set<RunOperation>([\n \"stream\",\n \"wait\",\n \"cancel\",\n \"conversation\",\n \"listArtifacts\",\n \"downloadArtifact\",\n ]);\n\n const script = buildFixtureScript({\n agentId: options.agentId,\n runId: id,\n model: options.model,\n userMessage: userText,\n runtime: \"cloud\",\n agentOptions: options.agentOptions,\n sendOptions: options.sendOptions,\n workspaceCwd: undefined,\n subagents: {},\n settingSourcesIncludeProject: false,\n memoryFacts: [],\n sessionMessages: [],\n projectMcpServers: {},\n });\n\n const handle = new CloudRun({\n id,\n agentId: options.agentId,\n model: options.model,\n script,\n supportedOps: supported,\n startTime,\n git: buildGitInfo(),\n });\n handle.bootstrap();\n return handle;\n}\n\ninterface CloudRunCtorOptions extends FixtureRunBaseOptions {\n git: RunGitInfo;\n}\n\nclass CloudRun extends FixtureRunBase {\n git?: RunGitInfo;\n private readonly gitInfo: RunGitInfo;\n\n constructor(options: CloudRunCtorOptions) {\n super(options);\n this.gitInfo = options.git;\n this.git = options.git;\n }\n\n bootstrap(): void {\n if (this.script.cancellable) return;\n setTimeout(() => this.transitionTo(this.script.finalStatus), 0);\n }\n\n protected override extendRunResult(result: RunResult): RunResult {\n return { ...result, git: this.gitInfo };\n }\n}\n\nfunction buildGitInfo(): RunGitInfo {\n return {\n branches: [\n {\n repoUrl: \"https://github.com/usetheo/example\",\n branch: \"feat/contract-fixture\",\n prUrl: \"https://github.com/usetheo/example/pull/1\",\n },\n ],\n };\n}\n","/**\n * Default agentic model id used when callers create an agent without\n * explicitly setting `model`. Picked from OpenRouter's free tier so a fresh\n * SDK install with `OPENROUTER_API_KEY` set works out-of-the-box. Has solid\n * tool-calling for agentic flows (memory tools, MCP, hooks, subagents).\n *\n * Override per-agent via `Agent.create({ model: { id: \"...\" } })` or\n * per-send via `agent.send(msg, { model: { id: \"...\" } })`. Real\n * provider-side model selection is determined by the API key chosen — this\n * id is the label embedded in run metadata + the value forwarded when the\n * runtime hits OpenRouter directly.\n *\n * @internal\n */\nexport const DEFAULT_AGENTIC_MODEL_ID = \"google/gemini-2.0-flash-001\";\n","import { NetworkError } from \"../../errors.js\";\nimport type { AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport type { SDKAssistantMessage, SDKMessage, SDKStatusMessage } from \"../../types/messages.js\";\nimport type { Run, RunOperation, RunStatus, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport { resolveApiKey } from \"../env.js\";\nimport { getConfiguredBaseUrl } from \"../fixture-mode.js\";\nimport { parseSseStream } from \"../llm/sse.js\";\nimport type { CloudAgentPayload } from \"./cloud-payload-types.js\";\nimport { FixtureRunBase, prepareRunContext } from \"./fixture-run-base.js\";\nimport type { FixtureScript } from \"./fixture-types.js\";\n\n/**\n * Real cloud Run. When `THEOKIT_API_BASE_URL` is set + the API key is not\n * a fixture key, the Run hits the PaaS SSE endpoint at\n * `POST /v1/agents/{agentId}/runs` and translates server events into our\n * `SDKMessage` stream.\n *\n * The server contract is intentionally minimal in Phase 1:\n * - `event: status` `data: {\"status\":\"CREATING|RUNNING|FINISHED|ERROR\"}`\n * - `event: assistant` `data: {\"text\":\"...\"}`\n * - `event: result` `data: {\"result\":\"...\", \"status\":\"finished\"}`\n *\n * @internal\n */\n\nexport interface CreateRealCloudRunOptions {\n agentId: string;\n model: ModelSelection;\n message: string | SDKUserMessage;\n agentOptions: AgentOptions;\n sendOptions: SendOptions;\n fetch?: typeof fetch;\n /** Pre-resolved system prompt threaded by `CloudAgent.send`. */\n systemPrompt?: string;\n /** Canonical cloud-agent payload (ADR D15) — embedded in POST body as `agentConfig`. */\n agentConfig?: CloudAgentPayload;\n}\n\nexport function createRealCloudRun(options: CreateRealCloudRunOptions): Run {\n const { userText, id, startTime } = prepareRunContext(options.message);\n const supported = new Set<RunOperation>([\n \"stream\",\n \"wait\",\n \"cancel\",\n \"conversation\",\n \"listArtifacts\",\n \"downloadArtifact\",\n ]);\n\n // FixtureScript shape required by the base Run class but never consumed\n // by the real cloud run path (the cloud transport drives events instead).\n const unusedFixtureScript: FixtureScript = {\n events: [],\n finalStatus: \"running\",\n cancellable: false,\n conversation: [],\n };\n\n const apiKey = resolveApiKey(options.agentOptions.apiKey);\n const baseUrl = getConfiguredBaseUrl();\n const handle = new RealCloudRun(\n {\n id,\n agentId: options.agentId,\n model: options.model,\n script: unusedFixtureScript,\n supportedOps: supported,\n startTime,\n },\n {\n apiKey,\n baseUrl,\n userText,\n fetchImpl: options.fetch ?? fetch,\n sendOptions: options.sendOptions,\n systemPrompt: options.systemPrompt,\n agentConfig: options.agentConfig,\n },\n );\n handle.bootstrap();\n return handle;\n}\n\ninterface RealCloudRunInputs {\n apiKey: string | undefined;\n baseUrl: string | undefined;\n userText: string;\n fetchImpl: typeof fetch;\n sendOptions: SendOptions;\n systemPrompt: string | undefined;\n agentConfig: CloudAgentPayload | undefined;\n}\n\nclass RealCloudRun extends FixtureRunBase {\n private readonly inputs: RealCloudRunInputs;\n private readonly controller = new AbortController();\n\n constructor(\n options: ConstructorParameters<typeof FixtureRunBase>[0],\n inputs: RealCloudRunInputs,\n ) {\n super(options);\n this.inputs = inputs;\n }\n\n bootstrap(): void {\n setTimeout(() => {\n void this.drive();\n }, 0);\n }\n\n protected override notifyImmediately(): boolean {\n return true;\n }\n\n override cancel(): Promise<void> {\n this.controller.abort();\n return super.cancel();\n }\n\n private async drive(): Promise<void> {\n if (this.inputs.apiKey === undefined || this.inputs.baseUrl === undefined) {\n this.fail(\"Real cloud Run requires THEOKIT_API_KEY + THEOKIT_API_BASE_URL\");\n return;\n }\n try {\n const response = await this.postRun(this.inputs.apiKey, this.inputs.baseUrl);\n await this.consumeStream(response);\n } catch (cause) {\n if (this.terminated) return;\n this.fail(cause instanceof Error ? cause.message : String(cause));\n }\n }\n\n private async postRun(apiKey: string, baseUrl: string): Promise<Response> {\n const response = await this.inputs.fetchImpl(`${baseUrl}/v1/agents/${this.agentId}/runs`, {\n method: \"POST\",\n signal: this.controller.signal,\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n message: this.inputs.userText,\n mcpServers: this.inputs.sendOptions.mcpServers,\n ...(this.inputs.systemPrompt !== undefined\n ? { systemPrompt: this.inputs.systemPrompt }\n : {}),\n ...(this.inputs.agentConfig !== undefined ? { agentConfig: this.inputs.agentConfig } : {}),\n }),\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new NetworkError(\n `Cloud Run endpoint returned ${response.status}: ${text.slice(0, 200)}`,\n { code: \"cloud_run_http_error\" },\n );\n }\n return response;\n }\n\n private async consumeStream(response: Response): Promise<void> {\n let finalStatus: RunStatus = \"finished\";\n let finalText = \"\";\n for await (const record of parseSseStream(response.body, this.controller.signal)) {\n const parsed = safeParse(record.data);\n if (parsed === undefined) continue;\n const update = this.applyRecord(record.event, parsed);\n if (update.finalText !== undefined) finalText = update.finalText;\n if (update.finalStatus !== undefined) finalStatus = update.finalStatus;\n }\n if (finalText.length > 0) this.script.result = finalText;\n this.transitionTo(finalStatus);\n }\n\n private applyRecord(\n eventName: string,\n parsed: Record<string, unknown>,\n ): { finalText?: string; finalStatus?: RunStatus } {\n if (eventName === \"status\") {\n this.script.events.push(this.buildStatusEvent(parsed.status as string));\n this.notifyNewEvents();\n return {};\n }\n if (eventName === \"assistant\") {\n const text = typeof parsed.text === \"string\" ? parsed.text : \"\";\n this.script.events.push(this.buildAssistantEvent(text));\n this.notifyNewEvents();\n return { finalText: text };\n }\n if (eventName === \"result\") {\n const update: { finalText?: string; finalStatus?: RunStatus } = {\n finalStatus: (parsed.status as RunStatus | undefined) ?? \"finished\",\n };\n if (typeof parsed.result === \"string\") update.finalText = parsed.result;\n return update;\n }\n return {};\n }\n\n private buildStatusEvent(status: string): SDKStatusMessage {\n return {\n type: \"status\",\n agent_id: this.agentId,\n run_id: this.id,\n status: status as SDKStatusMessage[\"status\"],\n };\n }\n\n private buildAssistantEvent(text: string): SDKAssistantMessage {\n return {\n type: \"assistant\",\n agent_id: this.agentId,\n run_id: this.id,\n message: { role: \"assistant\", content: [{ type: \"text\", text }] },\n };\n }\n\n private fail(message: string, code?: string): void {\n const event: SDKAssistantMessage = this.buildAssistantEvent(message);\n this.script.events.push(event satisfies SDKMessage);\n this.notifyNewEvents();\n this.script.result = message;\n if (this.script.errorDetail === undefined) {\n this.script.errorDetail = { message, ...(code !== undefined ? { code } : {}) };\n }\n this.transitionTo(\"error\" satisfies RunStatus);\n }\n}\n\nfunction safeParse(data: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(data) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n","/**\n * Minimal Server-Sent-Events parser. Consumes a fetch `Response` body\n * stream and yields `{ event, data }` records as they arrive. Used by\n * both the Anthropic and OpenAI streaming clients — neither vendor sends\n * binary SSE so a simple text decoder is enough.\n *\n * @internal\n */\n\nexport interface SseRecord {\n event: string;\n data: string;\n}\n\ninterface ParserState {\n buffer: string;\n event: string;\n data: string;\n}\n\nexport async function* parseSseStream(\n body: ReadableStream<Uint8Array> | null,\n signal: AbortSignal,\n): AsyncGenerator<SseRecord, void, void> {\n if (body === null) return;\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n const state: ParserState = { buffer: \"\", event: \"message\", data: \"\" };\n try {\n while (true) {\n if (signal.aborted) return;\n const { value, done } = await reader.read();\n if (done) break;\n state.buffer += decoder.decode(value, { stream: true });\n for (const record of drainCompleteRecords(state)) yield record;\n }\n if (state.data.length > 0) yield { event: state.event, data: state.data };\n } finally {\n releaseReader(reader);\n }\n}\n\nfunction drainCompleteRecords(state: ParserState): SseRecord[] {\n const out: SseRecord[] = [];\n let newlineIndex = state.buffer.indexOf(\"\\n\");\n while (newlineIndex !== -1) {\n const line = state.buffer.slice(0, newlineIndex).replace(/\\r$/, \"\");\n state.buffer = state.buffer.slice(newlineIndex + 1);\n const finished = applyLine(state, line);\n if (finished !== undefined) out.push(finished);\n newlineIndex = state.buffer.indexOf(\"\\n\");\n }\n return out;\n}\n\nfunction applyLine(state: ParserState, line: string): SseRecord | undefined {\n if (line === \"\") {\n if (state.data.length === 0) {\n state.event = \"message\";\n return undefined;\n }\n const record: SseRecord = { event: state.event, data: state.data };\n state.event = \"message\";\n state.data = \"\";\n return record;\n }\n if (line.startsWith(\":\")) return undefined;\n if (line.startsWith(\"event:\")) {\n state.event = line.slice(6).trim();\n return undefined;\n }\n if (line.startsWith(\"data:\")) {\n const piece = line.slice(5).trim();\n state.data = state.data.length === 0 ? piece : `${state.data}\\n${piece}`;\n }\n return undefined;\n}\n\nfunction releaseReader(reader: ReadableStreamDefaultReader<Uint8Array>): void {\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n}\n","import type { AgentOptions, SystemPromptContext, SystemPromptResolver } from \"../../types/agent.js\";\nimport type { SendOptions } from \"../../types/run.js\";\n\n/**\n * Resolve the effective system prompt for one `agent.send()` call.\n *\n * Priority (per ADR D4):\n * 1. `override` (from `SendOptions.systemPrompt`) — wins even when empty\n * string (the user explicitly cleared the system context).\n * 2. `agent` as plain string — returned directly.\n * 3. `agent` as resolver function — awaited with `ctx`.\n * 4. Neither defined — returns `undefined`.\n *\n * Defensive coercion (per edge-case review EC-2): if the resolver returns\n * anything other than a string at runtime (null, a number, an object),\n * the function returns `undefined` instead of forwarding the bad value to\n * the LLM client.\n *\n * The SDK does NOT impose a timeout on the resolver. Errors thrown by the\n * resolver propagate to the caller of `agent.send()`.\n *\n * @internal\n */\nexport async function resolveSystemPrompt(\n agent: AgentOptions[\"systemPrompt\"],\n override: SendOptions[\"systemPrompt\"],\n ctx: SystemPromptContext,\n): Promise<string | undefined> {\n if (override !== undefined) return override;\n if (agent === undefined) return undefined;\n if (typeof agent === \"string\") return agent;\n const resolver = agent satisfies SystemPromptResolver;\n const resolved = await resolver(ctx);\n return typeof resolved === \"string\" ? resolved : undefined;\n}\n\n/**\n * Cheap predicate used by `LocalAgent` and `CloudAgent` to skip building\n * the {@link SystemPromptContext} when neither agent-level nor per-call\n * prompt is configured. Avoids the lazy skills lookup in the hot path.\n *\n * @internal\n */\nexport function shouldResolveSystemPrompt(\n agent: AgentOptions[\"systemPrompt\"],\n override: SendOptions[\"systemPrompt\"],\n): boolean {\n return agent !== undefined || override !== undefined;\n}\n\n/**\n * High-level helper used by both `LocalAgent.send` and `CloudAgent.send`.\n * Short-circuits when neither side configured a prompt, otherwise calls\n * `buildCtx` (which may be async — e.g. lazy skills lookup) and delegates\n * to {@link resolveSystemPrompt}.\n *\n * @internal\n */\nexport async function resolveSystemPromptForSend(\n agent: AgentOptions[\"systemPrompt\"],\n override: SendOptions[\"systemPrompt\"],\n buildCtx: () => Promise<SystemPromptContext>,\n): Promise<string | undefined> {\n if (!shouldResolveSystemPrompt(agent, override)) return undefined;\n const ctx = await buildCtx();\n return resolveSystemPrompt(agent, override, ctx);\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport type { AgentOptions } from \"../../types/agent.js\";\nimport type { McpServerConfig } from \"../../types/mcp.js\";\n\n/**\n * Cloud tool parity validator (ADR D15 + D16).\n *\n * When `cloud:` is set on `AgentOptions`, this validator rejects\n * configurations that can't survive the trip to TheoCloud. The goal: no\n * silent-drop. Either the feature serializes to JSON for PaaS (passes here)\n * or it's local-only and the caller hears about it immediately at\n * `Agent.create()` time, not at runtime.\n *\n * Coordinates with the existing checks in `validateAgentOptions`:\n * - `programmatic_hooks_rejected` — universal (covers EC-4 hook closures).\n * - `cloud_plugin_path_rejected` — universal cloud + plugin path.\n * - `cloud_stdio_cwd_rejected` — cloud + stdio with cwd.\n * - `runtime_exclusive` — local + cloud both set.\n *\n * This module adds:\n * - `cloud_incompatible_mcp_stdio_local` — stdio command on a local FS path\n * (`/`, `~/`, `./`, `../`). Bare commands like `npx`/`uvx`/`node`\n * accepted (EC-3 fix: blacklist over whitelist).\n * - `cloud_incompatible_function_resolver` — `systemPrompt` as a\n * `SystemPromptResolver` function (must be a serializable string for\n * cloud).\n *\n * @internal\n */\n\nexport function validateCloudToolParity(options: AgentOptions): void {\n if (options.cloud === undefined) return;\n rejectFunctionSystemPrompt(options);\n rejectStdioMcpLocalPaths(options);\n}\n\nfunction rejectFunctionSystemPrompt(options: AgentOptions): void {\n if (typeof options.systemPrompt === \"function\") {\n throw new ConfigurationError(\n \"Cloud agents require systemPrompt as a serializable string. SystemPromptResolver functions can't run on PaaS — resolve to a string before Agent.create() or move the dynamic logic into a hook rule.\",\n { code: \"cloud_incompatible_function_resolver\" },\n );\n }\n}\n\nfunction rejectStdioMcpLocalPaths(options: AgentOptions): void {\n if (options.mcpServers === undefined) return;\n for (const [name, config] of Object.entries(options.mcpServers)) {\n if (!isStdioCommandConfig(config)) continue;\n const command = (config as { command?: string }).command ?? \"\";\n if (isLocalPath(command)) {\n throw new ConfigurationError(\n `MCP server \"${name}\" uses a local-FS command path (${command}). Cloud agents can't reach local binaries — use a bare command (npx, uvx, node, …) that the PaaS VM image provides, or switch to an HTTP MCP server.`,\n { code: \"cloud_incompatible_mcp_stdio_local\" },\n );\n }\n }\n}\n\nfunction isStdioCommandConfig(config: McpServerConfig): boolean {\n const obj = config as { type?: string; command?: unknown };\n if (obj.type !== undefined && obj.type !== \"stdio\") return false;\n return typeof obj.command === \"string\" && obj.command.length > 0;\n}\n\n/**\n * Local-FS path heuristic (EC-3). Conservative: reject only patterns that\n * are unambiguously paths on the caller's disk. Bare commands (no path\n * separator at the start) are assumed to be available in the VM's PATH.\n *\n * @internal\n */\nexport function isLocalPath(command: string): boolean {\n return (\n command.startsWith(\"/\") ||\n command.startsWith(\"~/\") ||\n command.startsWith(\"./\") ||\n command.startsWith(\"../\")\n );\n}\n","/**\n * Live-agent cache for production deploys (Production-Readiness #2, ADRs D307-D310).\n *\n * Caches `SDKAgent` instances by id with LRU eviction (when `size > maxAgents`)\n * and an idle-timeout sweep (configurable interval, default 60s). Solves the\n * \"OOM at some point\" failure mode of long-running Node servers that keep\n * spawning fresh agents per conversation.\n *\n * **Distinct from `agent-registry.ts`** (the metadata registry that persists\n * `RegisteredAgent` to `registry.json` per cwd). That module is the \"address\n * book\"; this module is the \"live cache\". Conflating them violates SRP — see\n * ADR D307.\n *\n * Defaults (ADR D308): `maxAgents: 100`, `idleTimeoutMs: 30 min`, sweep `60s`.\n * Calibrated for indie/small-team Node deploys; high-traffic SaaS should\n * `configure({ maxAgents: 1000 })`.\n *\n * @public (singleton exposed via `Agent.registry`)\n */\n\nimport type { SDKAgent } from \"../../types/agent.js\";\n\nexport type EvictReason = \"lru\" | \"idle\" | \"explicit\";\n\nexport interface AgentRegistryOptions {\n /**\n * Maximum number of agents kept alive simultaneously. LRU eviction when\n * exceeded. Default: 100.\n *\n * Setting `0` disables the cache entirely — every `Agent.getOrCreate`\n * re-initializes (high cost, but predictable memory).\n */\n maxAgents?: number;\n\n /**\n * Idle timeout in milliseconds. Agents not used for this duration are\n * evicted on the next sweep tick. Default: 1_800_000 (30 minutes).\n * Set `0` to disable idle eviction.\n */\n idleTimeoutMs?: number;\n\n /**\n * Sweep interval in milliseconds. Default: 60_000 (60s).\n * Lower = more responsive eviction but more CPU. Higher = staler entries.\n */\n sweepIntervalMs?: number;\n\n /**\n * Called whenever an agent is evicted. Listener errors are swallowed\n * with a one-shot stderr warn (do not crash the eviction loop).\n */\n onEvict?: (id: string, reason: EvictReason) => void;\n}\n\ninterface CacheEntry {\n agent: SDKAgent;\n lastUsedAt: number;\n}\n\nconst DEFAULT_MAX_AGENTS = 100;\nconst DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst DEFAULT_SWEEP_INTERVAL_MS = 60_000;\n\nexport class LiveAgentRegistry {\n readonly #agents = new Map<string, CacheEntry>();\n #maxAgents = DEFAULT_MAX_AGENTS;\n #idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS;\n #sweepIntervalMs = DEFAULT_SWEEP_INTERVAL_MS;\n #onEvict: ((id: string, reason: EvictReason) => void) | undefined;\n #sweepTimer: NodeJS.Timeout | undefined;\n\n /**\n * Reconfigure registry behavior. Process-wide singleton (D310) — last\n * configure call wins for all subsequent operations.\n */\n configure(opts: AgentRegistryOptions): void {\n if (opts.maxAgents !== undefined) this.#maxAgents = Math.max(0, opts.maxAgents);\n if (opts.idleTimeoutMs !== undefined) this.#idleTimeoutMs = Math.max(0, opts.idleTimeoutMs);\n if (opts.sweepIntervalMs !== undefined)\n this.#sweepIntervalMs = Math.max(1_000, opts.sweepIntervalMs);\n this.#onEvict = opts.onEvict;\n // Reset sweep with new config.\n this.#stopSweep();\n if (this.#idleTimeoutMs > 0) this.#startSweep();\n }\n\n /**\n * Lookup a cached agent. `get` is a use — refreshes `lastUsedAt` so the\n * entry survives LRU eviction.\n */\n get(id: string): SDKAgent | undefined {\n const entry = this.#agents.get(id);\n if (entry === undefined) return undefined;\n entry.lastUsedAt = Date.now();\n return entry.agent;\n }\n\n /**\n * Insert or overwrite an agent in the cache. Triggers fire-and-forget LRU\n * eviction when `size > maxAgents`.\n *\n * EC-4: when `id` already maps to a DIFFERENT agent instance, dispose the\n * old one before overwriting (race protection against two `getOrCreate`\n * calls creating two agents but only the second being cached — the first\n * would leak file handles + lifecycle controllers).\n */\n set(id: string, agent: SDKAgent): void {\n if (this.#maxAgents === 0) return; // cache disabled\n const existing = this.#agents.get(id);\n if (existing !== undefined && existing.agent !== agent) {\n // Dispose the old entry off the hot path. Errors swallowed per D309.\n void existing.agent.dispose().catch(() => {\n process.stderr.write(`[theokit-sdk] dispose during overwrite failed (${id})\\n`);\n });\n }\n this.#agents.set(id, { agent, lastUsedAt: Date.now() });\n if (this.#agents.size > this.#maxAgents) void this.#evictLRU();\n }\n\n /**\n * Remove the entry from the cache WITHOUT calling `dispose()` or\n * `onEvict`. Used by `LocalAgent.dispose()` itself so the disposed\n * instance can never be returned by a subsequent `get(id)` (dispose-cache\n * race fix). Idempotent — calling on an unknown id is a no-op.\n *\n * @internal\n */\n forget(id: string): void {\n this.#agents.delete(id);\n }\n\n /**\n * Explicitly evict an agent by id. Returns `true` when the entry was\n * present (false = already gone). Calls `agent.dispose()` + `onEvict`\n * with reason `\"explicit\"`.\n */\n async evict(id: string): Promise<boolean> {\n const entry = this.#agents.get(id);\n if (entry === undefined) return false;\n this.#agents.delete(id);\n await this.#disposeAndNotify(id, entry.agent, \"explicit\");\n return true;\n }\n\n /**\n * Evict every cached agent. Used by graceful shutdown (`process.on('SIGTERM')`)\n * or end-of-test cleanup.\n */\n async evictAll(): Promise<void> {\n const entries = Array.from(this.#agents.entries());\n this.#agents.clear();\n this.#stopSweep();\n for (const [id, entry] of entries) {\n await this.#disposeAndNotify(id, entry.agent, \"explicit\");\n }\n }\n\n /** Number of currently cached agents. */\n size(): number {\n return this.#agents.size;\n }\n\n /** Ids of cached agents, newest first (by lastUsedAt). */\n ids(): readonly string[] {\n return Array.from(this.#agents.entries())\n .sort((a, b) => b[1].lastUsedAt - a[1].lastUsedAt)\n .map(([id]) => id);\n }\n\n /**\n * LRU eviction: drop the entry with the smallest `lastUsedAt`. Runs only\n * when `size > maxAgents`. Asynchronous because `dispose()` is a Promise;\n * the hot-path caller (`set`) does not await.\n *\n * @internal\n */\n async #evictLRU(): Promise<void> {\n if (this.#agents.size <= this.#maxAgents) return; // size may have shrunk\n let oldestId: string | undefined;\n let oldestAt = Infinity;\n for (const [id, entry] of this.#agents) {\n if (entry.lastUsedAt < oldestAt) {\n oldestAt = entry.lastUsedAt;\n oldestId = id;\n }\n }\n if (oldestId === undefined) return;\n const entry = this.#agents.get(oldestId);\n if (entry === undefined) return;\n this.#agents.delete(oldestId);\n await this.#disposeAndNotify(oldestId, entry.agent, \"lru\");\n }\n\n /** Background sweep — drops entries whose `lastUsedAt < now - idleTimeoutMs`. */\n async #sweepIdle(): Promise<void> {\n if (this.#idleTimeoutMs === 0) return;\n const threshold = Date.now() - this.#idleTimeoutMs;\n const toEvict: Array<[string, CacheEntry]> = [];\n for (const [id, entry] of this.#agents) {\n if (entry.lastUsedAt < threshold) toEvict.push([id, entry]);\n }\n for (const [id, entry] of toEvict) {\n // EC-8 race safety: re-check the entry identity. If `set(id, newAgent)`\n // landed during the previous await, the newer entry's `lastUsedAt` is\n // recent and we must NOT delete it.\n const current = this.#agents.get(id);\n if (current === undefined || current.agent !== entry.agent) continue;\n this.#agents.delete(id);\n await this.#disposeAndNotify(id, entry.agent, \"idle\");\n }\n }\n\n #startSweep(): void {\n this.#sweepTimer = setInterval(() => void this.#sweepIdle(), this.#sweepIntervalMs);\n // unref so the sweep does not keep the event loop alive on process exit.\n this.#sweepTimer.unref?.();\n }\n\n #stopSweep(): void {\n if (this.#sweepTimer !== undefined) {\n clearInterval(this.#sweepTimer);\n this.#sweepTimer = undefined;\n }\n }\n\n /** Dispose + notify with errors swallowed (D309). Single chokepoint. */\n async #disposeAndNotify(id: string, agent: SDKAgent, reason: EvictReason): Promise<void> {\n try {\n await agent.dispose();\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] dispose during eviction failed (${id}): ${msg}\\n`);\n }\n if (this.#onEvict !== undefined) {\n try {\n this.#onEvict(id, reason);\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] onEvict listener threw (${id}): ${msg}\\n`);\n }\n }\n }\n}\n\n/** Process-wide singleton (ADR D310). */\nexport const liveAgentRegistry = new LiveAgentRegistry();\n","import { ConfigurationError, UnsupportedRunOperationError } from \"../../errors.js\";\nimport type {\n AgentDefinition,\n AgentOptions,\n ModelSelection,\n SDKAgent,\n SDKArtifact,\n} from \"../../types/agent.js\";\nimport type { Run, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport type { MemoryToolSpec } from \"../agent-loop/loop-types.js\";\nimport { generateLocalAgentId } from \"../ids.js\";\nimport { withCwdMutex } from \"../memory/cwd-mutex.js\";\nimport type { PersonalityRegistry } from \"../personality/registry.js\";\nimport { PersonalityStore } from \"../personality/store.js\";\nimport type { PersonalityPreset } from \"../personality/types.js\";\nimport { PluginManager } from \"../plugins/manager.js\";\nimport { anySignal } from \"./abort-utils.js\";\nimport { flushRegistrySaves, updateRegisteredAgent } from \"./agent-registry.js\";\nimport {\n appendSessionMessage,\n compactSession,\n flushSessionWrites,\n getSessionMessages,\n hydrateSession,\n} from \"./agent-session.js\";\nimport type { FileContextManager } from \"./context-manager.js\";\nimport { HooksExecutor } from \"./hooks-executor.js\";\nimport { liveAgentRegistry } from \"./live-agent-registry.js\";\nimport { bootstrapSubmanagers, registerLocalAgent } from \"./local-agent-bootstrap.js\";\nimport { dispatchLocalRun } from \"./local-agent-dispatch.js\";\nimport { consumePending, invalidateCacheImpl } from \"./local-agent-invalidate.js\";\nimport { LocalAgentMemory } from \"./local-agent-memory.js\";\nimport { buildAgentMemory } from \"./local-agent-memory-direct.js\";\nimport { applyPreUserSendHook, wrapRunWithPostReplyHook } from \"./local-agent-memory-hooks.js\";\nimport {\n applyPersonalityOverlay,\n ensurePersonalityRegistryIfNeeded,\n localAgentUsePersonality,\n resolveActivePersonalityPreset,\n} from \"./local-agent-personality-extensions.js\";\nimport { extractCodePlugins } from \"./local-agent-plugins.js\";\nimport {\n localAgentFork,\n localAgentRunUntil,\n persistMemoryFactIfWritePrompt,\n} from \"./local-agent-runtime-extensions.js\";\nimport { registerRunAsTask } from \"./local-agent-task-wrap.js\";\nimport { type MemoryFact, readMemoryFacts } from \"./memory-store.js\";\nimport type { PluginMetadata, PluginsManager } from \"./plugins-manager.js\";\nimport { runPostRunLifecycle } from \"./post-run-lifecycle.js\";\nimport type { ProvidersManagerImpl } from \"./providers-manager.js\";\nimport type { SkillMetadata, SkillsManager } from \"./skills-manager.js\";\nimport { loadSubagents } from \"./subagents-loader.js\";\nimport {\n assembleSystemPromptForSend as assembleSystemPromptForSendHelper,\n buildSystemPromptContext as buildSystemPromptContextHelper,\n type LocalAssemblyInputs,\n} from \"./system-prompt/local-assembly.js\";\nimport { SystemPromptPipeline } from \"./system-prompt/pipeline.js\";\nimport { safeCall } from \"./system-prompt/safe-call.js\";\nimport { resolveSystemPromptForSend } from \"./system-prompt.js\";\nimport { validateToolCatalog } from \"./validate-agent-options.js\";\n\n/**\n * Local SDKAgent implementation. Owns the workspace cwd plus the file-based\n * loaders (context, hooks, MCP, subagents, plugins, skills). Routes runs\n * through the in-process fixture responder.\n *\n * @internal\n */\nexport class LocalAgent implements SDKAgent {\n readonly agentId: string;\n model: ModelSelection | undefined;\n context?: FileContextManager;\n providers?: ProvidersManagerImpl;\n skills?: { list: () => Promise<SkillMetadata[]> };\n plugins?: { list: () => Promise<PluginMetadata[]> };\n memory?: import(\"../../types/memory-adapter.js\").AgentMemory;\n\n private readonly options: AgentOptions;\n private readonly workspaceCwd: string;\n /**\n * Production-Readiness #1 (ADR D304): conversation storage routing.\n * - `undefined` → fall back to default `FileSystemConversationStorage` at\n * `workspaceCwd` (zero-config behavior; existing apps unaffected).\n * - non-undefined → caller provided a custom adapter. The registry marker\n * `requiresCustomStorage` is set so `Agent.resume` refuses to silently\n * fall back to FS on the next process (EC-3, ADR D325).\n */\n private readonly conversationStorage:\n | import(\"../../types/conversation-storage.js\").ConversationStorageAdapter\n | undefined;\n /**\n * D319: lifecycle AbortController fired on `dispose()`. Composed with the\n * caller's `SendOptions.signal` via `anySignal` so the LLM `fetch()`\n * aborts on either signal (user cancel OR dispose).\n */\n private readonly lifecycleAbortController = new AbortController();\n private readonly settingSourcesIncludeProject: boolean;\n private readonly settingSourcesIncludePlugins: boolean;\n private resolvedSubagents: Record<string, AgentDefinition> = {};\n private disposed = false;\n private invalidationPending: { reason: string; at: number } | undefined;\n private readonly skillsManager: SkillsManager | undefined;\n private readonly pluginsManager: PluginsManager | undefined;\n private readonly hooksExecutor: HooksExecutor;\n private readonly systemPromptPipeline: SystemPromptPipeline = SystemPromptPipeline.default();\n private readonly memoryGlue: LocalAgentMemory;\n /** T4.1 — PluginManager for code plugins (kind: general/model-provider/memory). @internal */\n private readonly pluginManagerCode: PluginManager = new PluginManager();\n /** Personality presets — lazy-loaded on first `usePersonality` call (ADRs D160-D164). @internal */\n private personalityRegistry: PersonalityRegistry | undefined;\n private readonly personalityStore: PersonalityStore;\n\n constructor(options: AgentOptions) {\n this.agentId = options.agentId ?? generateLocalAgentId();\n this.model = options.model;\n this.options = options;\n this.workspaceCwd = resolveCwd(options.local?.cwd);\n this.conversationStorage = options.conversationStorage;\n this.settingSourcesIncludeProject = includesSetting(options, \"project\");\n this.settingSourcesIncludePlugins = includesSetting(options, \"plugins\");\n\n const sub = bootstrapSubmanagers({\n options,\n workspaceCwd: this.workspaceCwd,\n settingSourcesIncludeProject: this.settingSourcesIncludeProject,\n settingSourcesIncludePlugins: this.settingSourcesIncludePlugins,\n });\n if (sub.context !== undefined) this.context = sub.context;\n if (sub.providers !== undefined) this.providers = sub.providers;\n this.skillsManager = sub.skillsManager;\n if (sub.skills !== undefined) this.skills = sub.skills;\n this.pluginsManager = sub.pluginsManager;\n if (sub.plugins !== undefined) this.plugins = sub.plugins;\n\n this.hooksExecutor = new HooksExecutor(this.workspaceCwd);\n this.memoryGlue = new LocalAgentMemory(options, this.workspaceCwd, this.agentId);\n this.personalityStore = new PersonalityStore(this.workspaceCwd);\n // ADR D141 / D142: `agent.memory.*` direct API over plugin-aggregated adapters.\n // Built unconditionally; `requireAdapters` throws ConfigurationError when called\n // without any registered memory plugin.\n this.memory = buildAgentMemory(\n this.pluginManagerCode,\n this.workspaceCwd,\n this.options.memoryContext,\n );\n\n registerLocalAgent({\n agentId: this.agentId,\n model: this.model,\n options,\n workspaceCwd: this.workspaceCwd,\n });\n }\n\n /** Resolve the storage handle for session helpers (custom adapter or cwd). */\n // biome-ignore format: keep on one line for G8 LoC budget.\n private storageHandle(): import(\"../../types/conversation-storage.js\").ConversationStorageAdapter | string {\n return this.conversationStorage ?? this.workspaceCwd;\n }\n\n async initialize(): Promise<void> {\n await this.hooksExecutor.initialize(this.settingSourcesIncludeProject);\n if (this.context !== undefined) await this.context.initialize();\n if (this.skillsManager !== undefined) await this.skillsManager.initialize();\n if (this.pluginsManager !== undefined) await this.pluginsManager.initialize();\n // T4.1 (ADRs D97-D101 + EC-1): wire code plugins. extractCodePlugins\n // discriminates new Plugin[] from legacy `{ enabled }` metadata; the\n // latter returns empty so v1.2 callers continue to work.\n const codePlugins = extractCodePlugins(this.options.plugins);\n await this.pluginManagerCode.initialize(codePlugins);\n this.resolvedSubagents = await loadSubagents(\n this.workspaceCwd,\n this.settingSourcesIncludeProject,\n this.options.agents,\n );\n // ADR D18 + D304: hydrate persisted session history so a resumed agent\n // sees the conversation that occurred in the previous process. Storage\n // routes via the custom adapter when set, else default FS at cwd.\n await hydrateSession(this.agentId, this.storageHandle());\n // ADR D163 — hydrate previously-active personality slug (no-op if none).\n await this.personalityStore.hydrate(this.agentId);\n }\n\n /** T4.2 — expose PluginManager so agent-loop can fire pre_tool_call hooks. @internal */\n pluginManager(): PluginManager {\n return this.pluginManagerCode;\n }\n\n /** Expose the hooks executor so the agent loop can fire PreToolUse/etc. */\n hooks(): HooksExecutor {\n return this.hooksExecutor;\n }\n\n async send(message: string | SDKUserMessage, options: SendOptions = {}): Promise<Run> {\n // Per-call tools: run the same name/schema/dedupe checks as creation.\n // (Cloud agents reject per-call tools in CloudAgent.send.)\n if (options.tools !== undefined && options.tools.length > 0) {\n validateToolCatalog(options.tools);\n }\n // ADR D19 (EC-8): per-agent send mutex keyed by `agent-send:${agentId}`.\n // The lock spans the FULL run lifecycle — dispatch + run.wait() + post-run\n // assistant-turn append + session summary write + disk flush — so\n // concurrent sends to the SAME agentId cannot interleave user/assistant\n // records mid-turn AND `agent.dispose()` can never return before the\n // summary write finishes (ADR D20).\n return new Promise<Run>((resolve, reject) => {\n void withCwdMutex(`agent-send:${this.agentId}`, async () => {\n const userText = typeof message === \"string\" ? message : message.text;\n let run: Run;\n try {\n run = await this.sendLocked(message, options);\n } catch (err) {\n reject(err);\n return;\n }\n // T3.2: opt-in Task wrapping (ADRs D363/D374).\n // biome-ignore format: one-liner to stay under G8 LoC budget.\n if (options.task !== undefined) registerRunAsTask(run, this.agentId, options.task, userText);\n resolve(run);\n await runPostRunLifecycle({\n run,\n userText,\n agentId: this.agentId,\n workspaceCwd: this.workspaceCwd,\n storageHandle: this.storageHandle(),\n hooksExecutor: this.hooksExecutor,\n memoryGlue: this.memoryGlue,\n });\n });\n });\n }\n\n private async sendLocked(message: string | SDKUserMessage, options: SendOptions): Promise<Run> {\n if (this.disposed) throw new Error(\"Agent has been disposed\");\n // biome-ignore format: keep one-liner to stay under G8 LoC.\n await consumePending(this.agentId, this.invalidationPending, () => { this.invalidationPending = undefined; }, () => this.reload());\n this.applyModelOverride(options.model);\n const userText = typeof message === \"string\" ? message : message.text;\n if (this.options.onBeforeSend !== undefined) {\n await this.options.onBeforeSend({\n conversationId: this.agentId,\n previousMessageCount: getSessionMessages(this.agentId).length,\n });\n }\n await this.runPreHook(userText);\n\n // ADR D145 / EC-A: pre_user_send memory adapter hooks. Recalled context\n // is capped at maxRecallContextBytes and injected as a <memory-context>\n // fence BEFORE the user prompt reaches the LLM.\n const adaptedMessage = await applyPreUserSendHook({\n pluginManager: this.pluginManagerCode,\n agentId: this.agentId,\n options: this.options,\n original: message,\n userText,\n sendOptions: options,\n });\n\n // Capture prior history BEFORE appending the current user message so the\n // resumed/continuation agent loop sees the conversation up to (but not\n // including) the new send.\n const priorMessages = [...getSessionMessages(this.agentId)];\n appendSessionMessage(this.agentId, { role: \"user\", text: userText }, this.storageHandle());\n\n // Auto-write-on-send: opt-in via the user typing \"Remember: <fact>\". Persist\n // BEFORE the LLM call so the new fact is durable even if the LLM call fails.\n await this.maybePersistMemoryFactFromUserMessage(userText);\n const memoryFacts = await this.readMemoryForSend();\n const memoryTools = await this.memoryGlue.ensureTools();\n const activeMemorySummary = await this.memoryGlue.runActiveMemoryIfEnabled(\n userText,\n priorMessages,\n );\n const baseSystemPrompt = await this.resolveSystemPromptForSend(userText, options, memoryFacts);\n const assembledSystemPrompt = await this.assembleSystemPromptForSend(\n userText,\n baseSystemPrompt,\n memoryFacts,\n activeMemorySummary,\n );\n // D319 — compose user signal + lifecycle signal so either source aborts\n // the in-flight LLM stream. Pass the composed signal downstream via a\n // shallow-cloned options object (does NOT mutate the caller's SendOptions).\n const composedOptions: SendOptions = {\n ...options,\n signal: anySignal([options.signal, this.lifecycleAbortController.signal]),\n };\n const run = await this.dispatchRun(\n adaptedMessage,\n composedOptions,\n assembledSystemPrompt,\n memoryFacts,\n priorMessages,\n memoryTools,\n );\n // ADR D145: wrap `wait()` so post_assistant_reply fires once after the run\n // completes. Fire-and-forget (errors → stderr) so the caller never blocks.\n return wrapRunWithPostReplyHook({\n pluginManager: this.pluginManagerCode,\n agentId: this.agentId,\n options: this.options,\n run,\n userText,\n });\n }\n\n private readMemoryForSend(): Promise<MemoryFact[]> {\n const memoryConfig = this.options.memory;\n if (memoryConfig?.enabled !== true) return Promise.resolve([]);\n // Wrap in safeCall so a corrupt memory file degrades to \"no facts\" instead\n // of crashing the run (edge-case review EC-4).\n return safeCall(() => readMemoryFacts(this.workspaceCwd, memoryConfig), [], \"memory read\");\n }\n\n // Memory write helper extracted to `local-agent-runtime-extensions.ts` for G8.\n private maybePersistMemoryFactFromUserMessage(userText: string): Promise<void> {\n return persistMemoryFactIfWritePrompt(this.workspaceCwd, this.options.memory, userText);\n }\n\n private localAssemblyInputs(): LocalAssemblyInputs {\n return {\n agentId: this.agentId,\n workspaceCwd: this.workspaceCwd,\n model: this.model,\n options: this.options,\n context: this.context,\n skillsManager: this.skillsManager,\n systemPromptPipeline: this.systemPromptPipeline,\n };\n }\n\n private assembleSystemPromptForSend(\n userText: string,\n baseSystemPrompt: string | undefined,\n memoryFacts: ReadonlyArray<MemoryFact>,\n activeMemorySummary: string | undefined,\n ): Promise<string | undefined> {\n return assembleSystemPromptForSendHelper(\n this.localAssemblyInputs(),\n userText,\n baseSystemPrompt,\n memoryFacts,\n activeMemorySummary,\n );\n }\n\n private async resolveSystemPromptForSend(\n userText: string,\n options: SendOptions,\n memoryFacts: ReadonlyArray<MemoryFact>,\n ): Promise<string | undefined> {\n const base = await resolveSystemPromptForSend(\n this.options.systemPrompt,\n options.systemPrompt,\n () => buildSystemPromptContextHelper(this.localAssemblyInputs(), userText, memoryFacts),\n );\n this.personalityRegistry = await ensurePersonalityRegistryIfNeeded({\n agentId: this.agentId,\n workspaceCwd: this.workspaceCwd,\n personalityStore: this.personalityStore,\n personalityRegistry: this.personalityRegistry,\n });\n return applyPersonalityOverlay(this.activePreset(), base);\n }\n\n /** @internal — read-only personality lookup (composes the helper, honors fork ALS). */\n // biome-ignore format: keep one-liner so the personality lookup stays under G8.\n private activePreset(): PersonalityPreset | undefined { return resolveActivePersonalityPreset({ agentId: this.agentId, personalityStore: this.personalityStore, personalityRegistry: this.personalityRegistry }); }\n\n private applyModelOverride(overrideModel: ModelSelection | undefined): void {\n if (overrideModel === undefined) return;\n this.model = overrideModel;\n updateRegisteredAgent(this.agentId, { model: overrideModel });\n }\n\n private async runPreHook(userText: string): Promise<void> {\n const preRun = await this.hooksExecutor.run({\n event: \"preRun\",\n input: { message: userText },\n agentId: this.agentId,\n });\n if (preRun.blocked) {\n throw new ConfigurationError(\n `preRun hook denied execution: ${preRun.reason ?? \"unspecified\"}`,\n { code: \"hook_denied\" },\n );\n }\n }\n\n private dispatchRun(\n message: string | SDKUserMessage,\n options: SendOptions,\n systemPrompt: string | undefined,\n memoryFacts: ReadonlyArray<MemoryFact>,\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>,\n memoryTools: ReadonlyArray<MemoryToolSpec> | undefined,\n ): Promise<Run> {\n return dispatchLocalRun({\n inputs: {\n agentId: this.agentId,\n model: this.model,\n options: this.options,\n workspaceCwd: this.workspaceCwd,\n hooksExecutor: this.hooksExecutor,\n pluginManager: this.pluginManagerCode,\n resolvedSubagents: this.resolvedSubagents,\n settingSourcesIncludeProject: this.settingSourcesIncludeProject,\n },\n message,\n sendOptions: options,\n systemPrompt,\n memoryFacts,\n priorMessages,\n memoryTools,\n activePreset: this.activePreset(),\n });\n }\n\n close(): void {\n this.disposed = true;\n }\n\n async reload(): Promise<void> {\n if (this.context !== undefined) await this.context.refresh();\n if (this.skillsManager !== undefined) await this.skillsManager.refresh();\n if (this.pluginsManager !== undefined) await this.pluginsManager.refresh();\n this.resolvedSubagents = await loadSubagents(\n this.workspaceCwd,\n this.settingSourcesIncludeProject,\n this.options.agents,\n );\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n // Evict from live cache so the next Agent.getOrCreate(id) builds fresh.\n liveAgentRegistry.forget(this.agentId);\n // D319: fire the lifecycle abort so any in-flight LLM `fetch()` cancels.\n // `abort()` is idempotent — safe to call even when already aborted.\n this.lifecycleAbortController.abort();\n // Wait for any in-flight send + post-run lifecycle to release the\n // per-agent send mutex. Without this, `dispose()` could return before\n // `writeSessionSummary` finishes, leaving the caller to read a\n // partially-written `.theokit/memory/sessions/<runId>.md` file.\n await withCwdMutex(`agent-send:${this.agentId}`, () => Promise.resolve());\n // Now flush any remaining disk writes so the on-disk state matches the\n // in-memory state before the caller proceeds (ADR D17 + D18).\n await flushSessionWrites();\n await compactSession(this.agentId, this.storageHandle());\n await flushRegistrySaves(this.workspaceCwd);\n }\n\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n\n // biome-ignore format: multi-line layout would push file past G8 LoC cap.\n /** T3.2 / ADR D94 — public `invalidateCache` API. @internal */\n invalidateCache = (reason: string, opts: { applyNow?: boolean } = {}): Promise<void> =>\n invalidateCacheImpl(this.agentId, reason, opts, this.disposed, () => this.dispose(), (p) => { this.invalidationPending = p; });\n\n /**\n * Activate a personality preset (Hermes #26, ADRs D160-D164).\n *\n * Reserved names `none`, `default`, `neutral` clear the active preset.\n *\n * - `opts.save: true` → persist across process restarts (delete on clear,\n * never write null — EC-B).\n * - `opts.reset: true` → also clear session history (preserves by default).\n *\n * Always invalidates the prompt cache (D94 deferred default).\n *\n * @public\n */\n usePersonality(\n name: string,\n opts?: { save?: boolean; reset?: boolean },\n ): Promise<PersonalityPreset | null> {\n return localAgentUsePersonality({\n agentId: this.agentId,\n workspaceCwd: this.workspaceCwd,\n storageHandle: this.storageHandle(),\n disposed: this.disposed,\n personalityStore: this.personalityStore,\n personalityRegistry: this.personalityRegistry,\n invalidateCache: (reason) => this.invalidateCache(reason),\n onRegistryLoaded: (reg) => {\n this.personalityRegistry = reg;\n },\n name,\n ...(opts !== undefined ? { opts } : {}),\n });\n }\n\n listArtifacts(): Promise<SDKArtifact[]> {\n return Promise.resolve([]);\n }\n\n downloadArtifact(_path: string): Promise<Buffer> {\n return Promise.reject(\n new UnsupportedRunOperationError(\n \"Artifacts are not supported for local agents\",\n \"downloadArtifact\",\n ),\n );\n }\n\n // biome-ignore format: G8 budget — both methods delegate to `local-agent-runtime-extensions.ts`; signatures kept as 1-line each.\n runUntil(goal: string, options?: import(\"../../types/goal-events.js\").GoalOptions): import(\"../../types/goal-events.js\").RunUntilIterator { return localAgentRunUntil(this, goal, options); }\n // biome-ignore format: G8 budget — see runUntil comment above.\n fork(options: import(\"./fork-agent.js\").ForkOptions): Promise<import(\"./fork-agent.js\").ForkResult> { return localAgentFork({ agentId: this.agentId, options: this.options, personalitySlugSnapshot: this.personalityStore.active(this.agentId) }, options); }\n}\n\nfunction resolveCwd(cwd: string | string[] | undefined): string {\n return (Array.isArray(cwd) ? cwd[0] : cwd) ?? process.cwd();\n}\n\nfunction includesSetting(options: AgentOptions, source: string): boolean {\n const sources = options.local?.settingSources;\n return (\n sources !== undefined && (sources.includes(source as never) || sources.includes(\"all\" as never))\n );\n}\n","/**\n * PersonalityStore — session-default + persistent JSON state of the\n * currently-active personality slug per agentId (T2.1, ADR D163).\n *\n * Storage layout (`$THEOKIT_HOME/personality.json`):\n *\n * ```json\n * { \"version\": 1, \"agents\": { \"agent-xyz\": \"coder\" } }\n * ```\n *\n * **EC-B (MUST FIX):** `setActive(agentId, undefined, { save: true })`\n * **DELETES** the key from the `agents` map. Never writes `null`.\n * \"Key absent === no active personality\" is the single canonical\n * representation. Hydration only reads present keys.\n *\n * **EC-N (DOCUMENT):** Brief memory/disk divergence on persist failure is\n * tolerated — session state always wins; next successful call recovers.\n * Disk write failures log a one-shot warn (via redactSecrets) and do NOT\n * throw to the caller (mirrors credential-pool EC-A pattern).\n *\n * Cross-process safety: writes go through `withFileLock` (D61) and use\n * `atomicWriteJson` (atomic rename). Reads always re-load from disk\n * inside the lock so concurrent writers don't lose updates (EC-6).\n *\n * @internal\n */\n\nimport { mkdir, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport { atomicWriteJson } from \"../persistence/atomic-write.js\";\nimport { withFileLock } from \"../persistence/file-lock.js\";\nimport { getTheokitHome } from \"../persistence/paths.js\";\nimport { warnOnce } from \"../runtime/hooks-source.js\";\nimport { redactSecrets } from \"../security/redact.js\";\n\ninterface PersonalityStateV1 {\n readonly version: 1;\n readonly agents: Record<string, string>;\n}\n\nconst SCHEMA_VERSION = 1;\nconst FILE_NAME = \"personality.json\";\n\nfunction emptyState(): PersonalityStateV1 {\n return { version: SCHEMA_VERSION, agents: {} };\n}\n\nfunction isStateV1(value: unknown): value is PersonalityStateV1 {\n if (value === null || typeof value !== \"object\") return false;\n const v = value as { version?: unknown; agents?: unknown };\n if (v.version !== SCHEMA_VERSION) return false;\n if (v.agents === null || typeof v.agents !== \"object\") return false;\n return true;\n}\n\nasync function readState(filePath: string): Promise<PersonalityStateV1> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf8\");\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return emptyState();\n throw err;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n warnOnce(\n \"personality-store-json-parse\",\n \"[theokit-sdk] personality.json is malformed; treating as empty\",\n );\n return emptyState();\n }\n if (!isStateV1(parsed)) {\n warnOnce(\n \"personality-store-bad-version\",\n `[theokit-sdk] personality.json has unknown version; treating as empty (file kept untouched)`,\n );\n return emptyState();\n }\n return parsed;\n}\n\n/**\n * Tracks per-agent personality slug in session memory; optionally persists\n * via JSON file under `$THEOKIT_HOME/personality.json`.\n *\n * @internal\n */\nexport class PersonalityStore {\n readonly #cwd: string;\n readonly #session = new Map<string, string>();\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n /** Active personality slug for `agentId`. Undefined = no active preset. */\n active(agentId: string): string | undefined {\n return this.#session.get(agentId);\n }\n\n /**\n * Set active personality. Returns previous value (for cache-invalidation\n * decisions in the caller). When `opts.save: true`, also persists to\n * the on-disk JSON file. Persist failures log+continue (never throw).\n */\n async setActive(\n agentId: string,\n slug: string | undefined,\n opts?: { save?: boolean },\n ): Promise<string | undefined> {\n const previous = this.#session.get(agentId);\n if (slug === undefined) this.#session.delete(agentId);\n else this.#session.set(agentId, slug);\n\n if (opts?.save === true) {\n try {\n await this.#persist(agentId, slug);\n } catch (err) {\n warnOnce(\n `personality-store-persist-failure-${agentId}`,\n `[theokit-sdk] personality persist failed for ${redactSecrets(agentId)}: ${redactSecrets(\n (err as Error).message,\n )}`,\n );\n }\n }\n return previous;\n }\n\n /** Hydrate session state for `agentId` from the persistent file. */\n async hydrate(agentId: string): Promise<void> {\n const filePath = this.#filePath();\n let state: PersonalityStateV1;\n try {\n // Hydrate is read-only; no need for cross-process lock (writers\n // already use atomic rename via atomicWriteJson, so reads observe\n // either the old or new state — never torn writes).\n state = await readState(filePath);\n } catch (err) {\n warnOnce(\n `personality-store-hydrate-failure-${agentId}`,\n `[theokit-sdk] personality hydrate failed for ${redactSecrets(agentId)}: ${redactSecrets(\n (err as Error).message,\n )}`,\n );\n return;\n }\n const slug = state.agents[agentId];\n if (slug !== undefined) this.#session.set(agentId, slug);\n else this.#session.delete(agentId);\n }\n\n /** Test-only reset. @internal */\n _reset(): void {\n this.#session.clear();\n }\n\n async #persist(agentId: string, slug: string | undefined): Promise<void> {\n const filePath = this.#filePath();\n // withFileLock needs the parent dir to exist (lock companion is sibling\n // to filePath). atomicWriteJson does its own mkdir but runs INSIDE the\n // lock — so ensure the dir up front.\n await mkdir(dirname(filePath), { recursive: true });\n await withFileLock(filePath, async () => {\n const current = await readState(filePath);\n const nextAgents = { ...current.agents };\n if (slug === undefined) delete nextAgents[agentId];\n else nextAgents[agentId] = slug;\n const next: PersonalityStateV1 = { version: SCHEMA_VERSION, agents: nextAgents };\n await atomicWriteJson(filePath, next);\n });\n }\n\n #filePath(): string {\n return join(getTheokitHome(this.#cwd), FILE_NAME);\n }\n}\n","/**\n * Cross-process file lock helper (ADR D61).\n *\n * Uses `proper-lockfile` (optional peer dep) for cross-process locks. When\n * the peer dep is absent, falls back to `withCwdMutex` (in-process only)\n * with a one-shot stderr warning.\n *\n * EC-1 fix: uses a companion `<path>.lock` file with `realpath: false` so\n * `withFileLock` works even when the target `path` does not exist yet.\n * Without this, fresh installs that lock-then-create would crash with ENOENT.\n *\n * @internal\n */\n\nimport { withCwdMutex } from \"./cwd-mutex.js\";\n\ninterface ProperLockfileModule {\n lock: (file: string, options: ProperLockfileOptions) => Promise<() => Promise<void>>;\n}\n\ninterface ProperLockfileOptions {\n lockfilePath?: string;\n realpath?: boolean;\n stale?: number;\n retries?: {\n retries: number;\n factor?: number;\n minTimeout?: number;\n maxTimeout?: number;\n };\n}\n\nlet cached: ProperLockfileModule | null | undefined;\nlet warnedMissing = false;\n\nasync function getProperLockfile(): Promise<ProperLockfileModule | null> {\n if (cached !== undefined) return cached;\n try {\n cached = (await import(\"proper-lockfile\")) as ProperLockfileModule;\n } catch {\n cached = null;\n }\n return cached;\n}\n\n/**\n * Options for `withFileLock`.\n *\n * @internal\n */\nexport interface FileLockOptions {\n /** Stale lock timeout in ms. Default 30_000 (30s). */\n stale?: number;\n /** Max retries on busy lock. Default 5. */\n retries?: number;\n /** Backoff factor between retries. Default 1.5. */\n retryFactor?: number;\n}\n\n/**\n * Run `fn` while holding an OS-level cross-process lock on `path`.\n *\n * If `proper-lockfile` is installed, uses it with a companion `<path>.lock`\n * file (`realpath: false`, so target file does NOT need to exist yet).\n * Otherwise falls back to in-process `withCwdMutex` and prints a one-shot\n * stderr warning telling the user to install `proper-lockfile` for\n * cross-process safety.\n *\n * The lock is released even when `fn` throws.\n *\n * @internal\n */\nexport async function withFileLock<T>(\n path: string,\n fn: () => Promise<T>,\n options?: FileLockOptions,\n): Promise<T> {\n const lib = await getProperLockfile();\n\n if (lib === null) {\n if (!warnedMissing) {\n warnedMissing = true;\n process.stderr.write(\n \"[theokit-sdk] proper-lockfile not installed; \" +\n \"cross-process file lock unavailable. \" +\n \"Install with: pnpm add proper-lockfile\\n\",\n );\n }\n return withCwdMutex(`file-lock:${path}`, fn);\n }\n\n // proper-lockfile errors immediately on same-process concurrent acquire\n // (\"Lock file is already being held\"). Wrap with cwd-mutex first so\n // in-process callers queue and only ONE thread at a time enters the\n // cross-process acquire path. Combined: full in-process + cross-process\n // serialization.\n return withCwdMutex(`file-lock:${path}`, async () => {\n const release = await lib.lock(path, {\n // EC-1: companion lockfile, target path may not exist yet.\n lockfilePath: `${path}.lock`,\n realpath: false,\n stale: options?.stale ?? 30_000,\n retries: {\n retries: options?.retries ?? 5,\n factor: options?.retryFactor ?? 1.5,\n minTimeout: 100,\n maxTimeout: 5_000,\n },\n });\n\n try {\n return await fn();\n } finally {\n await release();\n }\n });\n}\n\n/**\n * Test helper — resets the cached proper-lockfile module + warning flag.\n * Allows tests to simulate \"module absent\" by clearing cache then\n * monkey-patching the dynamic import resolution.\n *\n * @internal\n */\nexport function _resetFileLockCacheForTesting(): void {\n cached = undefined;\n warnedMissing = false;\n}\n","/**\n * Path resolution for SDK state files (ADR D60).\n *\n * Theokit anchors state at `<cwd>/.theokit/` by default (per-cwd). An\n * optional `THEOKIT_HOME` environment variable overrides this, enabling\n * test isolation, profile switching, and multi-tenant deployments.\n *\n * Rules:\n * - `getTheokitHome(cwd)` is the ONLY canonical resolver. Never hardcode\n * `path.join(cwd, \".theokit\")` in callers — use this function so tests\n * and overrides stay consistent.\n * - `getProfilesRoot()` is intentionally home-anchored (not affected by\n * `THEOKIT_HOME`) so `theokit profile list` discovers all profiles\n * regardless of which is active.\n * - `displayTheokitHome(cwd)` returns a human-readable path for logs.\n *\n * @internal\n */\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst THEOKIT_DIR_NAME = \".theokit\";\n\n/**\n * Resolve the active Theokit state directory.\n *\n * Returns the value of `THEOKIT_HOME` env var if set (and non-empty after\n * trim); otherwise returns `<cwd>/.theokit`.\n *\n * @internal\n */\nexport function getTheokitHome(cwd: string): string {\n const override = process.env.THEOKIT_HOME?.trim();\n if (override !== undefined && override.length > 0) {\n return override;\n }\n return join(cwd, THEOKIT_DIR_NAME);\n}\n\n/**\n * Profiles root is ALWAYS at `~/.theokit/profiles/`, regardless of\n * `THEOKIT_HOME`. This lets `theokit profile list` see all profiles\n * regardless of which one is currently active.\n *\n * @internal\n */\nexport function getProfilesRoot(): string {\n return join(homedir(), THEOKIT_DIR_NAME, \"profiles\");\n}\n\n/**\n * Human-readable Theokit home for log/print output. Collapses `$HOME` to\n * `~` when applicable. NEVER used for `fs.*` calls — use `getTheokitHome`\n * for those.\n *\n * @internal\n */\nexport function displayTheokitHome(cwd: string): string {\n const resolved = getTheokitHome(cwd);\n const home = homedir();\n if (resolved === home) return \"~\";\n if (resolved.startsWith(`${home}/`)) {\n return `~${resolved.slice(home.length)}`;\n }\n return resolved;\n}\n","/**\n * PluginContext implementation + dev-mode seal (T1.2, ADR D99).\n *\n * `createPluginContext()` returns a fresh `{ ctx, registrations }` pair\n * for each plugin. In dev mode (`NODE_ENV !== \"production\"`) the context\n * is wrapped in a Proxy that throws on `set`/`delete` to catch plugin\n * abuse early. In production the raw impl is returned (zero overhead).\n *\n * @internal\n */\n\nimport type { CustomTool } from \"../../types/agent.js\";\nimport type {\n CommandHandler,\n CommandOptions,\n HookHandler,\n HookName,\n PluginContext,\n} from \"./types.js\";\n\ninterface CommandEntry {\n name: string;\n handler: CommandHandler;\n description?: string;\n}\n\ninterface InjectedMessage {\n content: string;\n role: \"user\" | \"system\";\n}\n\nexport interface PluginRegistrations {\n tools: CustomTool[];\n commands: CommandEntry[];\n hooks: Map<HookName, HookHandler[]>;\n injected: InjectedMessage[];\n}\n\nexport function createPluginContext(): {\n ctx: PluginContext;\n registrations: PluginRegistrations;\n} {\n const registrations: PluginRegistrations = {\n tools: [],\n commands: [],\n hooks: new Map(),\n injected: [],\n };\n\n const impl: PluginContext = {\n registerTool(tool) {\n registrations.tools.push(tool);\n },\n registerCommand(name, handler, opts: CommandOptions = {}) {\n const entry: CommandEntry = { name, handler };\n if (opts.description !== undefined) entry.description = opts.description;\n registrations.commands.push(entry);\n },\n on(hook, handler) {\n // EC-2 fix: defense-in-depth. Plugin author can bypass TS via `as any`\n // and pass null/undefined; ignore + warn rather than crash the loop\n // downstream when `runPreToolCallHooks` tries to invoke the handler.\n if (typeof handler !== \"function\") {\n process.stderr.write(`[theokit-sdk] ignoring non-function handler for hook \"${hook}\"\\n`);\n return;\n }\n const existing = registrations.hooks.get(hook) ?? [];\n existing.push(handler);\n registrations.hooks.set(hook, existing);\n },\n injectMessage(content, role = \"user\") {\n registrations.injected.push({ content, role });\n },\n };\n\n const ctx = shouldSeal() ? sealContext(impl) : impl;\n return { ctx, registrations };\n}\n\nfunction shouldSeal(): boolean {\n return process.env.NODE_ENV !== \"production\";\n}\n\nfunction sealContext(impl: PluginContext): PluginContext {\n return new Proxy(impl, {\n set(_target, prop) {\n throw new Error(\n `[theokit-sdk] PluginContext is sealed — cannot set ${String(prop)}. ` +\n `Plugins must use registerTool, registerCommand, on, or injectMessage.`,\n );\n },\n deleteProperty(_target, prop) {\n throw new Error(`[theokit-sdk] PluginContext is sealed — cannot delete ${String(prop)}.`);\n },\n });\n}\n","/**\n * PluginManager — constructs PluginContext per plugin, invokes register()\n * once, aggregates registrations + provider profiles + memory factories\n * (T1.3, ADRs D97-D101).\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"../providers/types.js\";\nimport { createPluginContext, type PluginRegistrations } from \"./context.js\";\nimport type {\n HookHandler,\n MemoryProviderFactory,\n Plugin,\n PostAssistantReplyContext,\n PreToolCallContext,\n PreToolCallDecision,\n PreUserSendContext,\n PreUserSendResult,\n} from \"./types.js\";\n\nexport interface ProviderEntry {\n pluginName: string;\n profile: ProviderProfile;\n}\n\nexport interface MemoryEntry {\n pluginName: string;\n createProvider: MemoryProviderFactory;\n}\n\nexport interface AggregatedPlugins {\n tools: PluginRegistrations[\"tools\"];\n commands: PluginRegistrations[\"commands\"];\n hooks: PluginRegistrations[\"hooks\"];\n injected: PluginRegistrations[\"injected\"];\n providerProfiles: ProviderEntry[];\n memoryProviders: MemoryEntry[];\n}\n\nexport class PluginManager {\n #aggregated: AggregatedPlugins = {\n tools: [],\n commands: [],\n hooks: new Map(),\n injected: [],\n providerProfiles: [],\n memoryProviders: [],\n };\n #initialized = false;\n\n async initialize(plugins: ReadonlyArray<Plugin>): Promise<void> {\n if (this.#initialized) {\n throw new Error(\"PluginManager.initialize called twice — register only once per process\");\n }\n this.#initialized = true;\n // EC-4: surface duplicate plugin names so operators notice. Two plugins\n // with the same name are usually a mistake (npm install with override).\n const seen = new Set<string>();\n for (const plugin of plugins) {\n if (seen.has(plugin.name)) {\n process.stderr.write(\n `[theokit-sdk] duplicate plugin name \"${plugin.name}\" — both will register independently\\n`,\n );\n }\n seen.add(plugin.name);\n await this.#dispatchPlugin(plugin);\n }\n }\n\n get aggregated(): Readonly<AggregatedPlugins> {\n return this.#aggregated;\n }\n\n /**\n * Run all `pre_tool_call` hooks; first decision with `block: true` wins.\n * D101: veto pattern — return `{ block: true, message }` makes the loop\n * surface a tool_result with `isError: false, content: message` so the\n * LLM can self-correct.\n */\n async runPreToolCallHooks(ctx: PreToolCallContext): Promise<PreToolCallDecision | undefined> {\n const handlers = this.#aggregated.hooks.get(\"pre_tool_call\") ?? [];\n for (const h of handlers) {\n const decision = (await (h as (c: PreToolCallContext) => unknown)(ctx)) as\n | PreToolCallDecision\n | undefined;\n if (decision !== undefined && (decision as { block?: boolean }).block === true) {\n return decision as PreToolCallDecision;\n }\n }\n return undefined;\n }\n\n /** Aggregated handlers for a given hook (read-only view). @internal */\n hooksFor(name: Parameters<AggregatedPlugins[\"hooks\"][\"get\"]>[0]): ReadonlyArray<HookHandler> {\n return this.#aggregated.hooks.get(name) ?? [];\n }\n\n /**\n * Run all `pre_user_send` hooks; concatenate non-empty `recalledContext`\n * outputs with `\\n\\n` and cap total length at `maxRecallContextBytes`\n * (EC-A). Per-handler failures are caught + logged to stderr (EC-8) so a\n * single broken adapter never blocks the LLM call (graceful degrade).\n *\n * Returns the assembled context (or undefined if empty after cap).\n *\n * @internal\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: per-handler try/catch + EC-A cap + EC-8 isolation are 3 concerns that share state (parts buffer); splitting fragments the single-pass aggregation.\n async runPreUserSendHooks(\n ctx: PreUserSendContext,\n maxRecallContextBytes: number,\n ): Promise<string | undefined> {\n const handlers = this.#aggregated.hooks.get(\"pre_user_send\") ?? [];\n if (handlers.length === 0) return undefined;\n const parts: string[] = [];\n for (const h of handlers) {\n try {\n const result = (await (h as (c: PreUserSendContext) => unknown)(ctx)) as\n | PreUserSendResult\n | undefined;\n if (result?.recalledContext && result.recalledContext.length > 0) {\n parts.push(result.recalledContext);\n }\n } catch (err) {\n process.stderr.write(\n `[theokit-sdk] pre_user_send hook failed: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n }\n }\n if (parts.length === 0) return undefined;\n let combined = parts.join(\"\\n\\n\");\n // EC-A: cap to prevent context-window blowout.\n if (combined.length > maxRecallContextBytes) {\n combined = `${combined.slice(0, maxRecallContextBytes)}\\n…[truncated]`;\n }\n return combined;\n }\n\n /**\n * Run all `post_assistant_reply` hooks. Fire-and-forget: errors are\n * surfaced to stderr (EC-O) so a slow/broken sync never blocks the\n * caller's `wait()`. Returns a Promise that callers may optionally\n * await for tests; production code typically `void`s it.\n *\n * @internal\n */\n async runPostAssistantReplyHooks(ctx: PostAssistantReplyContext): Promise<void> {\n const handlers = this.#aggregated.hooks.get(\"post_assistant_reply\") ?? [];\n for (const h of handlers) {\n try {\n await (h as (c: PostAssistantReplyContext) => unknown)(ctx);\n } catch (err) {\n process.stderr.write(\n `[theokit-sdk] post_assistant_reply hook failed: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n }\n }\n }\n\n async #dispatchPlugin(plugin: Plugin): Promise<void> {\n if (plugin.kind === \"general\") {\n const { ctx, registrations } = createPluginContext();\n await plugin.register(ctx);\n this.#merge(registrations);\n } else if (plugin.kind === \"model-provider\") {\n this.#aggregated.providerProfiles.push({\n pluginName: plugin.name,\n profile: plugin.profile,\n });\n } else if (plugin.kind === \"memory\") {\n this.#aggregated.memoryProviders.push({\n pluginName: plugin.name,\n createProvider: plugin.createProvider,\n });\n }\n }\n\n #merge(r: PluginRegistrations): void {\n this.#aggregated.tools.push(...r.tools);\n this.#aggregated.commands.push(...r.commands);\n for (const [hook, handlers] of r.hooks.entries()) {\n const existing = this.#aggregated.hooks.get(hook) ?? [];\n existing.push(...handlers);\n this.#aggregated.hooks.set(hook, existing);\n }\n this.#aggregated.injected.push(...r.injected);\n }\n}\n","/**\n * `AbortSignal` composition helpers (Production-Readiness #5 / EC-5, ADR D324).\n *\n * `AbortSignal.any` is available in Node 22+ and Cloudflare Workers, but\n * some runtime environments (Vercel Edge subset, older Bun, embedded shells)\n * still lag. The ponyfill mirrors the spec semantics — abort on first signal,\n * propagate `reason` — without depending on the host symbol.\n *\n * @internal\n */\n\n/**\n * Compose multiple `AbortSignal`s into a single signal that fires as soon as\n * any of the inputs aborts. Uses native `AbortSignal.any` when available;\n * otherwise constructs an `AbortController` with `once: true` listeners.\n */\nexport function anySignal(signals: ReadonlyArray<AbortSignal | undefined>): AbortSignal {\n const filtered = signals.filter((s): s is AbortSignal => s !== undefined);\n if (filtered.length === 0) {\n // Never-aborting signal — caller passed nothing.\n return new AbortController().signal;\n }\n if (filtered.length === 1) {\n return filtered[0] as AbortSignal;\n }\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any(filtered as AbortSignal[]);\n }\n return ponyfillAny(filtered);\n}\n\nfunction ponyfillAny(signals: AbortSignal[]): AbortSignal {\n const ctrl = new AbortController();\n for (const s of signals) {\n if (s.aborted) {\n ctrl.abort(s.reason);\n return ctrl.signal;\n }\n s.addEventListener(\"abort\", () => ctrl.abort(s.reason), { once: true });\n }\n return ctrl.signal;\n}\n\n/**\n * `true` when the given (possibly undefined) signal has aborted. `undefined`\n * signal counts as not aborted (no-signal semantics).\n */\nexport function isAborted(signal: AbortSignal | undefined): boolean {\n return signal?.aborted === true;\n}\n\n/**\n * Extract the abort reason as an `Error` for wrapping into `AgentRunError`.\n * Spec: `signal.reason` is `unknown` — wrap non-Error values into a generic\n * error so callers always have a `.message` to inspect.\n */\nexport function abortReasonAsError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n if (signal.reason !== undefined) return new Error(String(signal.reason));\n return new Error(\"AbortError: signal aborted\");\n}\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { replaceFileAtomic } from \"../memory/atomic-write.js\";\nimport { redactSecrets, safePathJoin, sanitizeIdentifier } from \"../security/index.js\";\nimport type { SessionMessage } from \"./agent-session.js\";\n\n/**\n * Persistent session-message storage (ADR D18).\n *\n * One append-only JSONL file per agent at\n * `<cwd>/.theokit/agents/<agentId>/messages.jsonl`. Each line is a\n * `PersistedSessionMessage` record. JSONL is naturally append-friendly,\n * crash-safe at line granularity (EC-7), and avoids global lock contention\n * by partitioning per-agent.\n *\n * @internal\n */\n\n/**\n * Persisted message shape on disk. Role is the broader 5-role union after\n * Production-Readiness EC-10 (forward-compat with tool-shaped messages flowing\n * through `ConversationStorageAdapter.appendMessage`). Legacy JSONL files\n * containing only user/assistant continue to parse — `readSessionFile`\n * filters unknown roles defensively.\n */\nexport interface PersistedSessionMessage {\n role: \"user\" | \"assistant\" | \"system\" | \"tool_call\" | \"tool_result\";\n text: string;\n at: number;\n}\n\nconst VALID_ROLES = new Set<PersistedSessionMessage[\"role\"]>([\n \"user\",\n \"assistant\",\n \"system\",\n \"tool_call\",\n \"tool_result\",\n]);\n\nexport function sessionFilePath(cwd: string, agentId: string): string {\n // ADRs D79-D81: validate agentId grammar + safe-join. Agent IDs (local\n // `agent-<uuid>` / cloud `bc-<uuid>`) fit the strict grammar; legacy IDs\n // would throw `invalid_identifier` here, surfacing migration needs early\n // rather than silently joining outside `.theokit/agents/`.\n const safe = sanitizeIdentifier(agentId, { maxLen: 128 });\n return safePathJoin(cwd, \".theokit\", \"agents\", safe, \"messages.jsonl\");\n}\n\n/**\n * Append one record. Creates the per-agent directory lazily. The caller is\n * responsible for serialization within an agent — Phase 2's send mutex\n * (`agent-send:${agentId}`) gives that guarantee for real send paths; the\n * in-process `agent-session.ts` chains its own per-key promise queue for\n * fire-and-forget appends outside the send mutex.\n *\n * @internal\n */\nexport async function appendToSessionFile(\n cwd: string,\n agentId: string,\n message: SessionMessage,\n): Promise<void> {\n const path = sessionFilePath(cwd, agentId);\n const record: PersistedSessionMessage = {\n role: message.role,\n text: message.text,\n at: Date.now(),\n };\n await mkdir(dirname(path), { recursive: true });\n // EC-6: JSON.stringify handles newlines, tabs, and quote escapes inside\n // text so a multi-line message stays one JSONL line on disk.\n // T1.3 (ADR D68): pass the serialized record through `redactSecrets` so\n // tool results containing `env | grep API` style output, or assistant\n // text that echoes a user-provided key, never persist verbatim on disk.\n await appendFile(path, `${redactSecrets(JSON.stringify(record))}\\n`, \"utf8\");\n}\n\n/**\n * Read the JSONL file from disk. Returns `[]` when the file does not exist.\n * Malformed lines (EC-7: half-written last line on crash, or any other\n * unparseable record) are skipped with a stderr warning — never thrown.\n *\n * @internal\n */\nasync function readJsonlLines(cwd: string, agentId: string): Promise<string[]> {\n const path = sessionFilePath(cwd, agentId);\n try {\n const raw = await readFile(path, \"utf8\");\n return raw.split(\"\\n\").filter((line) => line.length > 0);\n } catch {\n return [];\n }\n}\n\nfunction warnMalformed(agentId: string, line: string): void {\n process.stderr.write(\n `[theokit-sdk] skipping malformed line in messages.jsonl (${agentId}): ${line.slice(0, 80)}...\\n`,\n );\n}\n\nexport async function readSessionFile(cwd: string, agentId: string): Promise<SessionMessage[]> {\n const lines = await readJsonlLines(cwd, agentId);\n const messages: SessionMessage[] = [];\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as Partial<PersistedSessionMessage>;\n // Backward compat: legacy JSONL only had user/assistant. New: 5 roles\n // (EC-10). `SessionMessage` in-memory cache still narrows to\n // user/assistant — broader roles round-trip through the storage adapter.\n if (\n (parsed.role === \"user\" || parsed.role === \"assistant\") &&\n typeof parsed.text === \"string\"\n ) {\n messages.push({ role: parsed.role, text: parsed.text });\n }\n } catch {\n warnMalformed(agentId, line);\n }\n }\n return messages;\n}\n\n/**\n * Read EVERY persisted record (any role) — used by the\n * {@link ConversationStorageAdapter} surface that exposes the full StoredMessage\n * shape. Same defensive parsing as `readSessionFile` but returns the broader\n * `PersistedSessionMessage[]` without narrowing to user/assistant.\n *\n * @internal\n */\nexport async function readAllPersistedMessages(\n cwd: string,\n agentId: string,\n): Promise<PersistedSessionMessage[]> {\n const lines = await readJsonlLines(cwd, agentId);\n const messages: PersistedSessionMessage[] = [];\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as Partial<PersistedSessionMessage>;\n if (\n parsed.role !== undefined &&\n VALID_ROLES.has(parsed.role) &&\n typeof parsed.text === \"string\"\n ) {\n messages.push({\n role: parsed.role,\n text: parsed.text,\n at: typeof parsed.at === \"number\" ? parsed.at : Date.now(),\n });\n }\n } catch {\n warnMalformed(agentId, line);\n }\n }\n return messages;\n}\n\n/**\n * Append a persisted record carrying an arbitrary role (EC-10 expansion).\n *\n * @internal\n */\nexport async function appendAnyPersistedMessage(\n cwd: string,\n agentId: string,\n record: PersistedSessionMessage,\n): Promise<void> {\n const path = sessionFilePath(cwd, agentId);\n await mkdir(dirname(path), { recursive: true });\n await appendFile(path, `${redactSecrets(JSON.stringify(record))}\\n`, \"utf8\");\n}\n\n/**\n * Trim the JSONL file to the most recent `maxTurns` records when it grows\n * past 2x that threshold. EC-2: serialization with concurrent appends is the\n * caller's responsibility — `agent-session.ts` chains both `appendSessionMessage`\n * and `compactSession` through a single per-(agent, cwd) promise queue, so\n * the read+rename window here is race-free in practice.\n *\n * Reentering `withCwdMutex(\"agent-send:...\")` here would deadlock with the\n * Phase 2 send wrapper (same key, non-reentrant lock), which is why the\n * shared promise queue in `agent-session.ts` is the canonical serializer.\n *\n * @internal\n */\nexport async function compactSessionFile(\n cwd: string,\n agentId: string,\n maxTurns: number,\n): Promise<void> {\n const path = sessionFilePath(cwd, agentId);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n return;\n }\n const lines = raw.split(\"\\n\").filter((line) => line.length > 0);\n if (lines.length <= maxTurns * 2) return;\n const trimmed = `${lines.slice(-maxTurns).join(\"\\n\")}\\n`;\n await replaceFileAtomic(path, trimmed);\n}\n","/**\n * Filesystem-backed implementation of {@link ConversationStorageAdapter}\n * (Production-Readiness #1, ADR D304).\n *\n * Default adapter when `AgentOptions.conversationStorage` is not provided.\n * Writes append-only JSONL to `<root>/.theokit/agents/<safeId>/messages.jsonl`,\n * preserving the pre-D303 byte-identical behavior (redaction D68 + JSONL\n * line granularity).\n *\n * Path safety: every conversationId flows through `sanitizeIdentifier` +\n * `safePathJoin` before touching disk. `deleteConversation` re-applies the\n * guard (EC-1) — without this the new `rm -rf` would escape via traversal.\n *\n * Listing: `listConversationIds` catches ENOENT (EC-2) so first-run deploys\n * without any `.theokit/agents/` directory return `[]` instead of crashing.\n *\n * @public\n */\n\nimport { readdir, rm } from \"node:fs/promises\";\n\nimport type {\n ConversationStorageAdapter,\n StoredMessage,\n} from \"../../types/conversation-storage.js\";\nimport {\n appendAnyPersistedMessage,\n compactSessionFile,\n type PersistedSessionMessage,\n readAllPersistedMessages,\n} from \"../runtime/agent-session-store.js\";\nimport { safePathJoin, sanitizeIdentifier } from \"../security/index.js\";\n\nexport interface FileSystemConversationStorageOptions {\n /** Root directory under which `.theokit/agents/<id>/` lives. Defaults to `process.cwd()`. */\n root?: string;\n}\n\nexport class FileSystemConversationStorage implements ConversationStorageAdapter {\n readonly #root: string;\n\n constructor(opts: FileSystemConversationStorageOptions = {}) {\n this.#root = opts.root ?? process.cwd();\n }\n\n /** Exposed for tests + diagnostics. The path is sanitized at use sites. */\n get root(): string {\n return this.#root;\n }\n\n async getMessages(conversationId: string): Promise<readonly StoredMessage[]> {\n const records = await readAllPersistedMessages(this.#root, conversationId);\n return records.map(toStoredMessage);\n }\n\n async appendMessage(conversationId: string, message: StoredMessage): Promise<void> {\n const record: PersistedSessionMessage = {\n role: message.role,\n text: message.content,\n at: message.at ?? Date.now(),\n };\n await appendAnyPersistedMessage(this.#root, conversationId, record);\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n // EC-1: re-apply path-guard. `sanitizeIdentifier` + `safePathJoin` reject\n // traversal attempts BEFORE we hand a string to `rm({ recursive: true })`.\n // Without this, `deleteConversation(\"../../tmp\")` would escape the\n // sanitized perimeter that `sessionFilePath` enforces for appends.\n const safe = sanitizeIdentifier(conversationId, { maxLen: 128 });\n const dirPath = safePathJoin(this.#root, \".theokit\", \"agents\", safe);\n await rm(dirPath, { recursive: true, force: true });\n }\n\n async listConversationIds(opts: { limit?: number } = {}): Promise<readonly string[]> {\n // EC-2: ENOENT swallowed — projeto novo (no `.theokit/agents/` yet)\n // returns `[]` instead of crashing the caller (SIGTERM handlers, telemetry\n // sweeps, etc.).\n const agentsRoot = safePathJoin(this.#root, \".theokit\", \"agents\");\n let entries: string[];\n try {\n entries = await readdir(agentsRoot);\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw cause;\n }\n if (opts.limit !== undefined) return entries.slice(0, opts.limit);\n return entries;\n }\n\n async compact(conversationId: string, maxTurns: number): Promise<void> {\n await compactSessionFile(this.#root, conversationId, maxTurns);\n }\n\n async dispose(): Promise<void> {\n // FS adapter has no long-lived handles. No-op for symmetry.\n }\n}\n\nfunction toStoredMessage(record: PersistedSessionMessage): StoredMessage {\n return {\n role: record.role,\n content: record.text,\n at: record.at,\n };\n}\n","import type {\n ConversationStorageAdapter,\n StoredMessage,\n} from \"../../types/conversation-storage.js\";\nimport { FileSystemConversationStorage } from \"../persistence/conversation-storage-fs.js\";\nimport { compactSessionFile, readSessionFile } from \"./agent-session-store.js\";\n\n/**\n * Per-agent conversation history kept across runs (and across `Agent.resume()`\n * within the same process). Lets the fixture responder recall prior facts\n * when the user asks a follow-up question.\n *\n * Disk persistence (ADR D18 + D303): every append also lands in the configured\n * {@link ConversationStorageAdapter}. The default (no adapter, only cwd\n * supplied) writes to `<cwd>/.theokit/agents/<agentId>/messages.jsonl` via\n * {@link FileSystemConversationStorage}. Reads stay sync via the in-memory\n * cache; hydration from the adapter happens explicitly via\n * `hydrateSession(agentId, cwdOrStorage)` before the first read of a resumed\n * agent.\n *\n * @internal\n */\n\nexport interface SessionMessage {\n role: \"user\" | \"assistant\";\n text: string;\n}\n\nconst DEFAULT_MAX_TURNS = 200;\nconst COMPACTION_CHECK_INTERVAL = 50;\n\nconst sessions = new Map<string, SessionMessage[]>();\nconst hydratedKeys = new Set<string>();\nconst pendingAppends = new Map<string, Promise<void>>();\nconst appendCounts = new Map<string, number>();\n\n// Module-level cache so per-cwd FileSystemConversationStorage instances are\n// reused across `appendSessionMessage` / `hydrateSession` calls instead of\n// allocated per-message. Cleared by `clearAllSessions` for tests.\nconst fsAdapterByCwd = new Map<string, FileSystemConversationStorage>();\n\n/**\n * Resolve the storage adapter for backward-compat overload.\n *\n * The public `LocalAgent` constructor today passes a `cwd: string` to all\n * session helpers. The Production-Readiness plan introduces\n * `AgentOptions.conversationStorage` which arrives as a `ConversationStorageAdapter`.\n * This helper accepts either and lazily wraps `cwd` into a cached\n * {@link FileSystemConversationStorage}.\n *\n * @internal\n */\nfunction resolveStorage(cwdOrStorage: string | ConversationStorageAdapter): {\n adapter: ConversationStorageAdapter;\n key: string;\n} {\n if (typeof cwdOrStorage !== \"string\") {\n // Custom adapter — keyed by object identity (`String(adapter)` collides\n // for plain objects, so we use a WeakMap-style identity counter).\n return { adapter: cwdOrStorage, key: storageKey(cwdOrStorage) };\n }\n const existing = fsAdapterByCwd.get(cwdOrStorage);\n if (existing !== undefined) {\n return { adapter: existing, key: `cwd:${cwdOrStorage}` };\n }\n const fresh = new FileSystemConversationStorage({ root: cwdOrStorage });\n fsAdapterByCwd.set(cwdOrStorage, fresh);\n return { adapter: fresh, key: `cwd:${cwdOrStorage}` };\n}\n\nconst adapterIdentity = new WeakMap<object, number>();\nlet adapterIdentityCounter = 0;\nfunction storageKey(adapter: ConversationStorageAdapter): string {\n let id = adapterIdentity.get(adapter as object);\n if (id === undefined) {\n id = ++adapterIdentityCounter;\n adapterIdentity.set(adapter as object, id);\n }\n return `adapter:${id}`;\n}\n\nfunction sessionKey(agentId: string, storageId: string): string {\n return `${storageId}::${agentId}`;\n}\n\n/**\n * Append a session message to the in-memory cache. When `cwdOrStorage` is\n * supplied, the same message is queued to the persistent storage adapter\n * (default FS at `<cwd>/.theokit/agents/<id>/messages.jsonl`).\n *\n * Writes are fire-and-forget but chained per-(agent,storage) so on-disk\n * (or on-store) order matches in-memory order. Compaction runs every\n * `COMPACTION_CHECK_INTERVAL` appends when the adapter implements `compact()`.\n *\n * @internal\n */\nexport function appendSessionMessage(\n agentId: string,\n message: SessionMessage,\n cwdOrStorage?: string | ConversationStorageAdapter,\n): void {\n const existing = sessions.get(agentId) ?? [];\n existing.push(message);\n sessions.set(agentId, existing);\n if (cwdOrStorage === undefined) return;\n\n const { adapter, key: storageId } = resolveStorage(cwdOrStorage);\n const key = sessionKey(agentId, storageId);\n const stored: StoredMessage = { role: message.role, content: message.text, at: Date.now() };\n const chained = (pendingAppends.get(key) ?? Promise.resolve()).then(async () => {\n try {\n await adapter.appendMessage(agentId, stored);\n const count = (appendCounts.get(key) ?? 0) + 1;\n appendCounts.set(key, count);\n if (count % COMPACTION_CHECK_INTERVAL === 0 && adapter.compact !== undefined) {\n await adapter.compact(agentId, DEFAULT_MAX_TURNS);\n }\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] session append failed (${agentId}): ${msg}\\n`);\n }\n });\n pendingAppends.set(\n key,\n chained.then(\n () => undefined,\n () => undefined,\n ),\n );\n}\n\nexport function getSessionMessages(agentId: string): SessionMessage[] {\n return sessions.get(agentId) ?? [];\n}\n\n/**\n * Load the persisted record into the in-memory cache. Idempotent per\n * (agentId, storage) pair. Call once per agent lifecycle (e.g., from\n * `LocalAgent.initialize`) before the first read.\n *\n * Hydration uses the adapter's full storage surface but the in-memory\n * `SessionMessage` cache narrows to user/assistant roles (other roles\n * round-trip via the public `ConversationStorageAdapter` directly).\n *\n * Accepts `cwd: string` (default FS) OR a `ConversationStorageAdapter`.\n *\n * @internal\n */\nexport async function hydrateSession(\n agentId: string,\n cwdOrStorage: string | ConversationStorageAdapter,\n): Promise<void> {\n const { adapter, key: storageId } = resolveStorage(cwdOrStorage);\n const key = sessionKey(agentId, storageId);\n if (hydratedKeys.has(key)) return;\n hydratedKeys.add(key);\n\n const persisted = await readPersistedForCache(adapter, agentId);\n if (persisted.length === 0) return;\n if (!sessions.has(agentId) || sessions.get(agentId)?.length === 0) {\n sessions.set(agentId, persisted);\n }\n}\n\n/**\n * Read messages from the storage adapter and narrow to the in-memory\n * `SessionMessage` shape (user/assistant only). Extracted helper to keep\n * `hydrateSession` under the cyclomatic-complexity cap.\n *\n * @internal\n */\nasync function readPersistedForCache(\n adapter: ConversationStorageAdapter,\n agentId: string,\n): Promise<SessionMessage[]> {\n // FS adapter uses the legacy narrowed reader for zero-cost behavior.\n if (adapter instanceof FileSystemConversationStorage) {\n return readSessionFile(adapter.root, agentId);\n }\n const records = await adapter.getMessages(agentId);\n const out: SessionMessage[] = [];\n for (const r of records) {\n if (r.role === \"user\" || r.role === \"assistant\") {\n out.push({ role: r.role, text: r.content });\n }\n }\n return out;\n}\n\n/**\n * Wait for all pending disk appends to settle. Used by tests and by the\n * agent dispose path so on-disk state matches in-memory before the caller\n * proceeds.\n *\n * @internal\n */\nexport async function flushSessionWrites(): Promise<void> {\n while (pendingAppends.size > 0) {\n const all = Array.from(pendingAppends.values());\n pendingAppends.clear();\n await Promise.all(all);\n }\n}\n\n/**\n * Force-trigger compaction for one agent regardless of the append-count\n * threshold. Used by tests and by `LocalAgent.dispose` so a long-lived\n * conversation does not leave 10k stale lines on disk after the process\n * shuts down.\n *\n * Accepts `cwd: string` (default FS) OR a `ConversationStorageAdapter`.\n *\n * @internal\n */\nexport async function compactSession(\n agentId: string,\n cwdOrStorage: string | ConversationStorageAdapter,\n): Promise<void> {\n const { adapter, key: storageId } = resolveStorage(cwdOrStorage);\n const key = sessionKey(agentId, storageId);\n const chained = (pendingAppends.get(key) ?? Promise.resolve()).then(async () => {\n if (adapter instanceof FileSystemConversationStorage) {\n await compactSessionFile(adapter.root, agentId, DEFAULT_MAX_TURNS);\n } else if (adapter.compact !== undefined) {\n await adapter.compact(agentId, DEFAULT_MAX_TURNS);\n }\n });\n pendingAppends.set(\n key,\n chained.then(\n () => undefined,\n () => undefined,\n ),\n );\n await chained;\n}\n\nexport function clearSession(agentId: string): void {\n sessions.delete(agentId);\n}\n\n/** Test-only: drop every cached session and hydration marker. @internal */\nexport function clearAllSessions(): void {\n sessions.clear();\n hydratedKeys.clear();\n appendCounts.clear();\n fsAdapterByCwd.clear();\n}\n","import { loadHookConfig } from \"./hooks-source.js\";\nimport { spawnAndCollect } from \"./spawn-collect.js\";\n\n/**\n * Real file-based hook executor. Reads `.theokit/hooks.json` from the\n * workspace, spawns the configured command for each event with a JSON\n * payload on stdin, and aggregates the decisions.\n *\n * Decisions are conservative by design:\n * - Non-zero exit code on a `preRun` / `preToolUse` hook fails the\n * attached operation with `HookDeniedError`-style data.\n * - JSON-shaped stdout (e.g. `{\"decision\":\"deny\",\"reason\":\"...\"}`) is\n * parsed and respected.\n *\n * @internal\n */\n\nexport type HookEvent = \"preRun\" | \"postRun\" | \"preToolUse\" | \"postToolUse\" | \"stop\";\n\nexport interface HookCommand {\n command: string;\n /** Optional matcher restricting the hook to specific tools (regex). */\n matcher?: string;\n /** Optional timeout in ms; defaults to 30s. */\n timeoutMs?: number;\n}\n\nexport interface HookDecision {\n decision: \"allow\" | \"deny\" | \"feedback\";\n reason?: string;\n feedback?: string;\n}\n\nexport interface HookPayload {\n event: HookEvent;\n tool?: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n agentId?: string;\n runId?: string;\n}\n\nexport interface HookExecutionResult {\n decisions: HookDecision[];\n blocked: boolean;\n reason?: string;\n}\n\ninterface HookConfig {\n hooks?: Partial<Record<HookEvent, HookCommand[]>>;\n}\n\nexport class HooksExecutor {\n private config: HookConfig = {};\n\n constructor(private readonly cwd: string) {}\n\n async initialize(settingSourcesIncludeProject: boolean): Promise<void> {\n if (!settingSourcesIncludeProject) {\n this.config = {};\n return;\n }\n // ADR D77: try .theokit/hooks/*.md first; fallback .theokit/hooks.json\n // with deprecation warn. Shared loader in hooks-source.ts.\n this.config = await loadHookConfig(this.cwd);\n }\n\n /** Fire every hook registered for `event` and aggregate the decisions. */\n async run(payload: HookPayload): Promise<HookExecutionResult> {\n const commands = this.commandsFor(payload.event, payload.tool);\n if (commands.length === 0) return { decisions: [], blocked: false };\n const decisions: HookDecision[] = [];\n for (const command of commands) {\n const decision = await this.executeOne(command, payload);\n decisions.push(decision);\n if (decision.decision === \"deny\") {\n const result: HookExecutionResult = {\n decisions,\n blocked: true,\n };\n if (decision.reason !== undefined) result.reason = decision.reason;\n return result;\n }\n }\n return { decisions, blocked: false };\n }\n\n private commandsFor(event: HookEvent, tool: string | undefined): HookCommand[] {\n const list = this.config.hooks?.[event] ?? [];\n if (tool === undefined) return list;\n return list.filter((entry) => {\n if (entry.matcher === undefined) return true;\n try {\n return new RegExp(entry.matcher).test(tool);\n } catch {\n return entry.matcher === tool;\n }\n });\n }\n\n private async executeOne(command: HookCommand, payload: HookPayload): Promise<HookDecision> {\n const timeoutMs = command.timeoutMs ?? 30_000;\n const result = await spawnAndCollect({\n command: \"sh\",\n args: [\"-c\", command.command],\n cwd: this.cwd,\n timeoutMs,\n stdin: JSON.stringify(payload),\n });\n if (result.timedOut) {\n return { decision: \"deny\", reason: `Hook timed out after ${timeoutMs}ms` };\n }\n if (result.spawnError !== undefined) {\n return { decision: \"deny\", reason: `Hook spawn failed: ${result.spawnError.message}` };\n }\n if (result.exitCode !== 0) {\n return {\n decision: \"deny\",\n reason:\n result.stderr.trim().length > 0\n ? result.stderr.trim()\n : `Hook exited with code ${result.exitCode}`,\n };\n }\n return parseDecisionFromStdout(result.stdout);\n }\n}\n\nfunction parseDecisionFromStdout(stdout: string): HookDecision {\n const trimmed = stdout.trim();\n if (trimmed.length === 0) return { decision: \"allow\" };\n try {\n const parsed = JSON.parse(trimmed) as Partial<HookDecision> & {\n decision?: string;\n };\n if (parsed.decision === \"deny\" || parsed.decision === \"feedback\") {\n const result: HookDecision = { decision: parsed.decision };\n if (parsed.reason !== undefined) result.reason = parsed.reason;\n if (parsed.feedback !== undefined) result.feedback = parsed.feedback;\n return result;\n }\n if (parsed.decision === \"allow\") return { decision: \"allow\" };\n } catch {\n // Treat unparseable stdout as feedback rather than failure.\n return { decision: \"feedback\", feedback: trimmed };\n }\n return { decision: \"allow\" };\n}\n","import { type SpawnOptions, spawn } from \"node:child_process\";\n\n/**\n * Shared `child_process.spawn` wrapper that collects stdout/stderr text and\n * enforces a timeout via SIGKILL. Used by both the hooks executor and the\n * shell tool so each spawn path doesn't reinvent the buffer + timer dance.\n *\n * @internal\n */\n\nexport interface SpawnCollectOptions {\n command: string;\n args?: string[];\n cwd: string;\n env?: Record<string, string>;\n timeoutMs?: number;\n stdin?: string;\n}\n\nexport interface SpawnCollectResult {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n spawnError?: Error;\n}\n\nexport function spawnAndCollect(options: SpawnCollectOptions): Promise<SpawnCollectResult> {\n return new Promise<SpawnCollectResult>((resolve) => {\n const timeoutMs = options.timeoutMs ?? 30_000;\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n env: { ...process.env, ...(options.env ?? {}) },\n };\n const child = spawn(options.command, options.args ?? [], spawnOptions);\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n const settle = (result: SpawnCollectResult): void => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // child may already have exited\n }\n settle({ stdout, stderr, exitCode: null, timedOut: true });\n }, timeoutMs);\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (cause) => {\n clearTimeout(timer);\n settle({ stdout, stderr, exitCode: -1, timedOut, spawnError: cause });\n });\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n settle({ stdout, stderr, exitCode: code, timedOut });\n });\n if (options.stdin !== undefined && child.stdin !== null) {\n child.stdin.end(options.stdin);\n }\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { join, resolve as resolvePath } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type {\n ContextBudget,\n ContextSettings,\n ContextSnapshot,\n ContextSource,\n SDKContextManager,\n} from \"../../types/context.js\";\nimport { loadMarkdownEntities } from \"../persistence/markdown-config-loader.js\";\nimport {\n type AggregatorSource,\n applyAggregateCap,\n DEFAULT_MAX_BYTES_TOTAL,\n} from \"./context-aggregator.js\";\nimport { runDiscovery } from \"./context-discovery-runner.js\";\nimport { ContextSourceFrontmatterSchema } from \"./context-frontmatter.js\";\nimport { DEFAULT_MAX_BYTES_PER_FILE } from \"./context-loaders.js\";\nimport { warnOnce } from \"./hooks-source.js\";\n\n/**\n * File-based context manager. Reads `.theokit/context.json` from the\n * workspace cwd when `local.settingSources` includes `\"project\"`, loads each\n * referenced source, applies excludes, and exposes a redacted public\n * snapshot via `snapshot()`. Re-reads via `refresh()`.\n *\n * Public output is secret-free by design — raw absolute paths, .env content,\n * and excluded-file content never appear.\n *\n * @internal\n */\n\ninterface FileContextConfig {\n sources: Array<{ name: string; path: string }>;\n exclude?: string[];\n maxTokens?: number;\n}\n\ninterface InternalState {\n config: FileContextConfig;\n loadedSources: Array<{\n name: string;\n path: string;\n status: ContextSource[\"status\"];\n tokens: string[];\n }>;\n}\n\nexport class FileContextManager implements SDKContextManager {\n private state: InternalState | undefined;\n\n constructor(\n private readonly cwd: string,\n private readonly settings: ContextSettings,\n private readonly settingSourcesIncludeProject: boolean,\n ) {}\n\n async initialize(): Promise<void> {\n // `context.manager: \"file\"` is itself an opt-in for project-level context\n // loading, even when `local.settingSources` does not include \"project\".\n if (!this.settingSourcesIncludeProject && this.settings.manager !== \"file\") {\n this.state = { config: { sources: [] }, loadedSources: [] };\n return;\n }\n await this.refresh();\n }\n\n async refresh(): Promise<void> {\n const config = await loadContextConfig(this.cwd);\n const legacy = await loadSources(config, this.cwd);\n\n // Phase 5 (ADRs D150-D156): multi-format discovery for AGENTS.md,\n // CLAUDE.md, GEMINI.md, .cursor/rules/*.mdc, .theokit/THEO.md.\n // Existing `.theokit/context/*.md` legacy sources keep working via\n // the path above; we feed them into the aggregator alongside the\n // newly-discovered sources.\n const maxBytesPerFile = this.settings.maxBytesPerFile ?? DEFAULT_MAX_BYTES_PER_FILE;\n const maxBytesTotal = this.settings.maxBytesTotal ?? DEFAULT_MAX_BYTES_TOTAL;\n const discovered = await runDiscovery({\n cwd: this.cwd,\n maxBytesPerFile,\n skipLegacyTheokitContext: true,\n });\n\n const legacyAsAggregator: AggregatorSource[] = legacy.map((src) => ({\n id: src.name,\n source: src.path,\n content: src.tokens.join(\"\"),\n priority: 50, // matches DEFAULT_DISCOVERY_SPECS theokit-context\n truncated: false,\n }));\n\n const { kept } = applyAggregateCap([...discovered, ...legacyAsAggregator], maxBytesTotal);\n\n // Materialize kept sources as InternalState entries. Public type\n // `ContextSourceStatus` uses `\"summarized\"` for \"trimmed to fit budget\".\n const loadedSources: InternalState[\"loadedSources\"] = kept.map((s) => ({\n name: s.id,\n path: s.source,\n status: s.truncated ? \"summarized\" : \"included\",\n tokens: [s.content],\n }));\n\n this.state = { config, loadedSources };\n }\n\n snapshot(): Promise<ContextSnapshot> {\n const state = this.state ?? { config: { sources: [] }, loadedSources: [] };\n const sources: ContextSource[] = state.loadedSources.map((src) => ({\n name: src.name,\n path: src.path,\n status: src.status,\n }));\n const allTokens = state.loadedSources.flatMap((src) => src.tokens);\n const budget: ContextBudget = {};\n const maxTokens = this.settings.maxTokens ?? state.config.maxTokens;\n if (maxTokens !== undefined) budget.maxTokens = maxTokens;\n budget.usedTokens = allTokens;\n return Promise.resolve({ runtime: \"local\", sources, budget });\n }\n\n /**\n * Internal-only — returns per-source token slices so the system-prompt\n * `ContextPromptProvider` can format the `<source>` body. The public\n * `snapshot()` flattens tokens across sources for the budget summary,\n * which is the wrong shape for prompt assembly.\n *\n * @internal\n */\n internalAssemblySnapshot(): {\n sources: Array<{ name: string; status: ContextSource[\"status\"]; tokens: string[] }>;\n maxTokens: number | undefined;\n } {\n const state = this.state ?? { config: { sources: [] }, loadedSources: [] };\n const maxTokens = this.settings.maxTokens ?? state.config.maxTokens;\n return {\n sources: state.loadedSources.map((src) => ({\n name: src.name,\n status: src.status,\n tokens: [...src.tokens],\n })),\n maxTokens,\n };\n }\n}\n\n/**\n * Load context config with MD-first fallback (ADR D77, T2.2).\n *\n * 1. `.theokit/context/<name>.md` (preferred).\n * 2. `.theokit/context.json` (deprecated; emits warn).\n * 3. Neither → empty sources.\n *\n * @internal\n */\nasync function loadContextConfig(cwd: string): Promise<FileContextConfig> {\n const mdDir = join(cwd, \".theokit\", \"context\");\n const jsonPath = join(cwd, \".theokit\", \"context.json\");\n\n const mdEntities = await loadMarkdownEntities({\n dir: mdDir,\n schema: ContextSourceFrontmatterSchema,\n pattern: \"flat\",\n errorCodePrefix: \"context\",\n });\n\n if (mdEntities.length > 0) {\n if (existsSync(jsonPath)) {\n warnOnce(\n \"context-both-present\",\n \"[theokit-sdk] both .theokit/context/ and .theokit/context.json detected — using markdown; remove context.json\",\n );\n }\n return {\n sources: mdEntities\n .filter((e) => e.frontmatter.enabled !== false)\n .map((e) => ({ name: e.frontmatter.name ?? e.slug, path: e.frontmatter.path })),\n };\n }\n\n // Fallback: JSON\n if (!existsSync(jsonPath)) return { sources: [] };\n\n warnOnce(\n \"context-json-deprecated\",\n \"[theokit-sdk] .theokit/context.json is deprecated; migrate to .theokit/context/<name>.md via theokit-migrate-config\",\n );\n\n let raw: string;\n try {\n raw = await readFile(jsonPath, \"utf8\");\n } catch (cause) {\n throw new ConfigurationError(`Failed to read context config: ${jsonPath}`, {\n code: \"context_read_error\",\n cause,\n });\n }\n return parseConfig(raw, jsonPath);\n}\n\nfunction parseConfig(raw: string, configPath: string): FileContextConfig {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (cause) {\n throw new ConfigurationError(`Invalid JSON in context config: ${configPath}`, {\n code: \"context_json_invalid\",\n cause,\n });\n }\n if (!parsed || typeof parsed !== \"object\") {\n throw new ConfigurationError(`Context config must be an object: ${configPath}`, {\n code: \"context_config_shape\",\n });\n }\n const record = parsed as Record<string, unknown>;\n const sources = readSources(record.sources, configPath);\n const exclude = Array.isArray(record.exclude)\n ? record.exclude.filter((entry): entry is string => typeof entry === \"string\")\n : undefined;\n const maxTokens = typeof record.maxTokens === \"number\" ? record.maxTokens : undefined;\n const result: FileContextConfig = { sources };\n if (exclude !== undefined) result.exclude = exclude;\n if (maxTokens !== undefined) result.maxTokens = maxTokens;\n return result;\n}\n\nfunction readSources(\n sourcesRaw: unknown,\n configPath: string,\n): Array<{ name: string; path: string }> {\n if (!Array.isArray(sourcesRaw)) {\n throw new ConfigurationError(`Context config sources must be an array: ${configPath}`, {\n code: \"context_sources_shape\",\n });\n }\n return sourcesRaw\n .filter(\n (entry): entry is Record<string, unknown> => Boolean(entry) && typeof entry === \"object\",\n )\n .map((entry) => {\n const name = typeof entry.name === \"string\" ? entry.name : \"\";\n const path = typeof entry.path === \"string\" ? entry.path : \"\";\n return { name, path };\n })\n .filter((entry) => entry.name.length > 0 && entry.path.length > 0);\n}\n\nasync function loadSources(\n config: FileContextConfig,\n cwd: string,\n): Promise<InternalState[\"loadedSources\"]> {\n const results: InternalState[\"loadedSources\"] = [];\n for (const source of config.sources) {\n if (isExcluded(source.path, config.exclude)) {\n results.push({ ...source, status: \"excluded\", tokens: [] });\n continue;\n }\n const absolute = resolvePath(cwd, source.path);\n if (!absolute.startsWith(resolvePath(cwd))) {\n results.push({ ...source, status: \"excluded\", tokens: [] });\n continue;\n }\n try {\n await stat(absolute);\n const content = await readFile(absolute, \"utf8\");\n const tokens = tokenizeContent(content);\n results.push({ ...source, status: \"included\", tokens });\n } catch {\n results.push({ ...source, status: \"excluded\", tokens: [] });\n }\n }\n return results;\n}\n\nfunction isExcluded(path: string, excludes: string[] | undefined): boolean {\n if (excludes === undefined) return false;\n return excludes.some((pattern) => matchesGlob(pattern, path));\n}\n\nfunction matchesGlob(pattern: string, path: string): boolean {\n // Simple glob: \"**/.env\" → path ends with \".env\"; \"**/secrets/**\" → contains \"/secrets/\"\n if (pattern === path) return true;\n if (pattern.startsWith(\"**/\") && pattern.endsWith(\"/**\")) {\n const middle = pattern.slice(3, -3);\n return path.includes(middle);\n }\n if (pattern.startsWith(\"**/\")) {\n return path.endsWith(pattern.slice(3));\n }\n if (pattern.endsWith(\"/**\")) {\n return path.startsWith(pattern.slice(0, -3));\n }\n return false;\n}\n\nfunction tokenizeContent(content: string): string[] {\n return content.split(/\\s+/).filter((token) => token.length > 0);\n}\n","/**\n * Context file loaders + truncation (T1.2, ADRs D154 / D155 / D159).\n *\n * Reads context source files from disk, applies the per-file size cap\n * with 70%/20% head/tail truncation, and emits the\n * `context_files_truncated` telemetry counter when the cap fires.\n * Pure (no I/O) for `truncateWithMarker` — testable in isolation.\n *\n * @internal\n */\n\nimport { readFile } from \"node:fs/promises\";\n\nconst HEAD_RATIO = 0.7;\nconst TAIL_RATIO = 0.2;\nconst MARKER = \"\\n\\n…[truncated by theokit]\\n\\n\";\n\n/** Default per-file cap (40k chars ≈ 10k tokens). D155. */\nexport const DEFAULT_MAX_BYTES_PER_FILE = 40_000;\n\nexport interface LoadedSource {\n /** Absolute path the content came from. */\n readonly source: string;\n readonly content: string;\n readonly originalBytes: number;\n readonly truncated: boolean;\n}\n\nexport interface TruncateResult {\n readonly truncated: boolean;\n readonly finalContent: string;\n}\n\n/**\n * Cap `content` at `max` characters with 70%/20% head/tail truncation\n * and an explicit marker. Pure — no I/O, no telemetry.\n *\n * EC-C: when `max <= MARKER.length`, skip the marker entirely and\n * return a head-only slice. Without this guard, `budget = max -\n * MARKER.length` would go negative and `content.slice(-tailBytes)`\n * would slice from the END of the string rather than truncating.\n *\n * EC-H: codepoint integrity — `String.slice()` operates on UTF-16\n * code units, which can split surrogate pairs. We accept that\n * trailing/leading replacement chars (U+FFFD) may appear at boundaries.\n * Modern LLMs tolerate them; byte-exact safety would require Buffer\n * slicing + TextDecoder with `fatal: true` retry, which adds complexity\n * without value.\n *\n * @public\n */\nexport function truncateWithMarker(content: string, max: number): TruncateResult {\n if (content.length <= max) {\n return { truncated: false, finalContent: content };\n }\n // EC-C: max too small to fit even the marker — return head-only slice.\n if (max <= MARKER.length) {\n return { truncated: true, finalContent: content.slice(0, max) };\n }\n const budget = max - MARKER.length;\n const headBytes = Math.floor(budget * (HEAD_RATIO / (HEAD_RATIO + TAIL_RATIO)));\n const tailBytes = budget - headBytes;\n return {\n truncated: true,\n finalContent: content.slice(0, headBytes) + MARKER + content.slice(-tailBytes),\n };\n}\n\n/**\n * Read a file from disk and apply the per-file cap. Emits telemetry\n * counter when truncation fires.\n *\n * EC-G: file deleted between discovery and read (FS race) → returns\n * `undefined`, never throws.\n *\n * @internal\n */\nexport async function loadPlainMarkdown(\n absPath: string,\n opts: { maxBytesPerFile?: number } = {},\n): Promise<LoadedSource | undefined> {\n const max = opts.maxBytesPerFile ?? DEFAULT_MAX_BYTES_PER_FILE;\n let content: string;\n try {\n content = await readFile(absPath, \"utf8\");\n } catch {\n // EC-G: ENOENT / EACCES / etc → caller treats as missing.\n return undefined;\n }\n const { truncated, finalContent } = truncateWithMarker(content, max);\n if (truncated) {\n emitTruncationCounter(absPath);\n }\n return {\n source: absPath,\n content: finalContent,\n originalBytes: content.length,\n truncated,\n };\n}\n\n/**\n * EC-L: telemetry no-op when OTel is not imported. We import the tracer\n * lazily and use `safeCall` so the lookup never throws and never pulls\n * OTel into the import graph for users without `@opentelemetry/api`\n * installed.\n *\n * @internal\n */\nfunction emitTruncationCounter(source: string): void {\n // Lazy resolution via globalThis avoids static import of telemetry/tracer.\n // Tests can spy via the same path; production users without OTel see no-op.\n const tracer = (\n globalThis as { __theokit_tracer?: { inc?: (k: string, attrs: unknown) => void } }\n ).__theokit_tracer;\n if (tracer?.inc === undefined) return;\n try {\n tracer.inc(\"context_files_truncated\", { file: source });\n } catch {\n // Telemetry must never break the loader.\n }\n}\n","/**\n * Aggregate context cap (T4.1, ADR D155).\n *\n * After per-file truncation, applies a second-level cap on the TOTAL\n * size across all sources. Lower-priority sources are dropped when the\n * sum would exceed `maxBytesTotal`. The last partially-fitting source\n * is truncated to fit exactly into the remaining budget.\n *\n * EC-J: same-priority sources tie-break by absolute source path\n * lex-ascending for deterministic ordering (prompt-cache stability).\n *\n * @internal\n */\n\nimport { truncateWithMarker } from \"./context-loaders.js\";\n\n/** Default aggregate cap (120k chars across all context files). D155. */\nexport const DEFAULT_MAX_BYTES_TOTAL = 120_000;\n\nexport interface AggregatorSource {\n readonly id: string;\n readonly source: string;\n readonly content: string;\n readonly priority: number;\n readonly truncated: boolean;\n}\n\nexport interface AggregateResult {\n readonly kept: AggregatorSource[];\n readonly dropped: AggregatorSource[];\n}\n\n/**\n * Sort by priority ascending, tie-break by source path lex (EC-J),\n * then drop / partial-truncate to fit `maxBytesTotal`.\n *\n * @internal\n */\nexport function applyAggregateCap(\n sources: ReadonlyArray<AggregatorSource>,\n maxTotal: number,\n): AggregateResult {\n // EC-J: deterministic ordering. Priority asc, then path lex asc.\n const sorted = [...sources].sort((a, b) => {\n if (a.priority !== b.priority) return a.priority - b.priority;\n return a.source.localeCompare(b.source);\n });\n\n let totalBytes = 0;\n const kept: AggregatorSource[] = [];\n const dropped: AggregatorSource[] = [];\n\n for (const s of sorted) {\n if (totalBytes + s.content.length <= maxTotal) {\n kept.push(s);\n totalBytes += s.content.length;\n continue;\n }\n const remaining = maxTotal - totalBytes;\n if (remaining > 0) {\n // Partial keep — truncate this one to fit.\n const { finalContent } = truncateWithMarker(s.content, remaining);\n kept.push({ ...s, content: finalContent, truncated: true });\n totalBytes = maxTotal;\n } else {\n dropped.push(s);\n }\n }\n\n if (dropped.length > 0) {\n emitTotalDropCounter(dropped.map((d) => d.source));\n }\n return { kept, dropped };\n}\n\nfunction emitTotalDropCounter(droppedSources: string[]): void {\n const tracer = (\n globalThis as { __theokit_tracer?: { inc?: (k: string, attrs: unknown) => void } }\n ).__theokit_tracer;\n if (tracer?.inc === undefined) return;\n try {\n tracer.inc(\"context_files_total_truncated\", { dropped: droppedSources });\n } catch {\n // Telemetry must never break.\n }\n}\n","/**\n * Context file discovery (T1.1, ADRs D150 / D151).\n *\n * Discovers context files via three scopes:\n * - `cwd-only` — single dir, single path lookup\n * - `git-root-walk` — walk cwd → git-root, collect every directory's match\n * (nearest-first ordering)\n * - `globbed` — glob pattern relative to cwd (e.g. `.cursor/rules/*.mdc`)\n *\n * Pure `existsSync` checks — **no `.gitignore` parsing** (EC-A, KISS) and\n * **no invented `.theokitignore`** (EC-B). Paths normalized via\n * `realpath` to dedup symlink chains pointing to the same physical file\n * (EC-F). Git worktrees work transparently because `.git` exists as a\n * file in that case (EC-N).\n *\n * @internal\n */\n\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\n\n/** Single filename (\"AGENTS.md\") or relative glob (\".cursor/rules/*.mdc\"). */\nexport type DiscoveryScope = \"cwd-only\" | \"git-root-walk\" | \"globbed\";\n\n/** Parser to apply once file is read. */\nexport type DiscoveryParser = \"plain-markdown\" | \"mdc\" | \"frontmatter-zod\";\n\n/**\n * Specification for one discoverable context source. The default registry\n * `DEFAULT_DISCOVERY_SPECS` covers the 2026 industry-standard set.\n *\n * @internal\n */\nexport interface DiscoverySpec {\n /** Stable identifier — used as `<source name=\"\">` and telemetry key. */\n readonly id: string;\n /** Priority for merge (lower = earlier in prompt). */\n readonly priority: number;\n /** Filename (cwd-only/git-root-walk) or glob (globbed). */\n readonly pattern: string;\n readonly scope: DiscoveryScope;\n readonly parser: DiscoveryParser;\n /** Whether to follow `@path` import directives (CLAUDE.md / GEMINI.md). */\n readonly followImports: boolean;\n}\n\n/**\n * 2026 industry-standard context file registry. Sorted by priority\n * ascending — earlier in prompt = more general, last-writer-wins on\n * conflict (D152 concat-by-priority).\n *\n * @internal\n */\nexport const DEFAULT_DISCOVERY_SPECS: ReadonlyArray<DiscoverySpec> = [\n {\n id: \"AGENTS.md\",\n pattern: \"AGENTS.md\",\n scope: \"git-root-walk\",\n parser: \"plain-markdown\",\n followImports: false,\n priority: 10,\n },\n {\n id: \"GEMINI.md\",\n pattern: \"GEMINI.md\",\n scope: \"git-root-walk\",\n parser: \"plain-markdown\",\n followImports: true,\n priority: 20,\n },\n {\n id: \"CLAUDE.md\",\n pattern: \"CLAUDE.md\",\n scope: \"git-root-walk\",\n parser: \"plain-markdown\",\n followImports: true,\n priority: 30,\n },\n {\n id: \"cursor-rules\",\n pattern: \".cursor/rules/*.mdc\",\n scope: \"globbed\",\n parser: \"mdc\",\n followImports: false,\n priority: 40,\n },\n {\n id: \"theokit-context\",\n pattern: \".theokit/context/*.md\",\n scope: \"globbed\",\n parser: \"frontmatter-zod\",\n followImports: false,\n priority: 50,\n },\n {\n id: \"THEO.md\",\n pattern: \".theokit/THEO.md\",\n scope: \"cwd-only\",\n parser: \"plain-markdown\",\n followImports: false,\n priority: 60,\n },\n];\n\nconst SAFE_FILENAME = /^[a-zA-Z0-9_.\\-/*]+$/;\nconst TRAVERSAL_RE = /(^|\\/)\\.\\.(\\/|$)/;\n\n/**\n * Reject patterns that contain path traversal (`..`) or non-allowed\n * characters (D81 parity, EC-4).\n *\n * @internal\n */\nexport function isSafePattern(pattern: string): boolean {\n if (typeof pattern !== \"string\" || pattern.length === 0) return false;\n if (TRAVERSAL_RE.test(pattern)) return false;\n if (isAbsolute(pattern)) return false;\n return SAFE_FILENAME.test(pattern);\n}\n\n/**\n * Walk upward from `cwd` looking for the closest directory containing\n * a `.git` entry (file OR directory — worktrees use a `.git` FILE,\n * EC-N). Returns the absolute path of that directory, or `undefined`\n * when no git root exists at or above `cwd`.\n *\n * @internal\n */\nexport function findGitRoot(cwd: string): string | undefined {\n if (typeof cwd !== \"string\" || cwd.length === 0) return undefined;\n let current = resolve(cwd);\n // Guard against infinite loops on weird filesystems.\n for (let i = 0; i < 64; i += 1) {\n if (existsSync(join(current, \".git\"))) return current;\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n return undefined;\n}\n\n/**\n * Walk `cwd` upward to `stopDir` (inclusive) collecting every existing\n * occurrence of `filename`. Returns absolute, realpath-deduped paths in\n * nearest-first order (innermost dir first).\n *\n * No `.gitignore` parsing (EC-A). Realpath collapses symlink chains\n * pointing to the same physical file (EC-F). Filesystem races (file\n * deleted mid-walk) are skipped silently (EC-5).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: walk-up loop combines validation + realpath dedup + FS-race handling + stopDir guard in a single bounded loop; splitting fragments the dedup invariant.\nexport function walkUpForFile(\n cwd: string,\n filename: string,\n stopDir: string | undefined,\n): string[] {\n if (!isSafePattern(filename)) {\n return [];\n }\n const start = resolve(cwd);\n const stop = stopDir !== undefined ? resolve(stopDir) : undefined;\n const found: string[] = [];\n const seenReal = new Set<string>();\n let current = start;\n // 64-level depth cap.\n for (let i = 0; i < 64; i += 1) {\n const candidate = join(current, filename);\n if (existsSync(candidate)) {\n let real: string;\n try {\n real = realpathSync(candidate);\n } catch {\n // FS race (deleted mid-walk) — skip.\n real = candidate;\n }\n if (!seenReal.has(real)) {\n seenReal.add(real);\n found.push(real);\n }\n }\n if (stop !== undefined && current === stop) break;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return found;\n}\n\n/**\n * Glob-style discovery scoped to a single directory under cwd (e.g.\n * `.cursor/rules/*.mdc`). Flat — does NOT recurse into subdirectories\n * (EC-R: nested directories deferred to v2). Returns absolute,\n * lex-sorted paths.\n *\n * @internal\n */\nexport async function walkUpForGlob(cwd: string, pattern: string): Promise<string[]> {\n if (!isSafePattern(pattern)) return [];\n const lastSlash = pattern.lastIndexOf(\"/\");\n if (lastSlash < 0) {\n // Single filename — treat as cwd-only single match.\n const candidate = join(cwd, pattern);\n return existsSync(candidate) ? [resolve(candidate)] : [];\n }\n const dirPart = pattern.slice(0, lastSlash);\n const filePart = pattern.slice(lastSlash + 1);\n const dir = join(cwd, dirPart);\n if (!existsSync(dir)) return [];\n // Build a regex from the file part — supports only `*` wildcard.\n const fileRe = filePartToRegex(filePart);\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n const matched = entries.filter((e) => fileRe.test(e)).sort();\n return matched.map((e) => resolve(join(dir, e)));\n}\n\nfunction filePartToRegex(filePart: string): RegExp {\n const escaped = filePart.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n","/**\n * `@path/to/file` import resolver (T2.1, ADR D156).\n *\n * Anthropic/Gemini convention: lines that are EXACTLY `@path` get\n * replaced with the imported file's content, recursively (5-hop cap),\n * with cycle detection. Inline `see @x.md, also @y.md` references are\n * NOT resolved (EC-Q — own-line only, mirrors Anthropic's actual\n * behavior).\n *\n * EC-D fix: every imported file is itself capped at `maxBytesPerFile`\n * via `loadPlainMarkdown` BEFORE concatenation. Prevents a CLAUDE.md\n * with 5 imports of 30k each from ballooning to 150k of imported\n * content before the outer cap fires.\n *\n * @internal\n */\n\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve as resolvePath } from \"node:path\";\n\nimport { loadPlainMarkdown } from \"./context-loaders.js\";\n\n/** EC-Q: line-anchored. `@path` must be alone on its line. */\nconst IMPORT_RE = /^@(\\S+)\\s*$/gm;\nconst MAX_HOPS = 5;\n\nexport interface ResolveImportsOptions {\n /** Absolute paths already resolved (cycle detection). */\n readonly visited: Set<string>;\n /** Current recursion depth — caps at MAX_HOPS. */\n readonly depth: number;\n /** Per-import file cap (EC-D). Forwarded to loadPlainMarkdown. */\n readonly maxBytesPerFile: number;\n}\n\n/**\n * Resolve `@path` directives in `content`. Each match is replaced with\n * the imported file content (already cap-truncated per EC-D), and\n * recursion continues on the resolved content until MAX_HOPS or cycle.\n *\n * Failure modes (placeholders, never throws):\n * - file not found → `[@import not found: <path>]`\n * - cycle detected → `[@import cycle detected: <path>]`\n * - depth exceeded → trailing `\\n\\n…[@import depth limit 5 reached]\\n\\n`\n *\n * @internal\n */\nexport async function resolveImports(\n content: string,\n basePath: string,\n opts: ResolveImportsOptions,\n): Promise<string> {\n if (opts.depth >= MAX_HOPS) {\n return `${content}\\n\\n…[@import depth limit ${MAX_HOPS} reached]\\n\\n`;\n }\n const baseDir = dirname(basePath);\n return replaceAsync(content, IMPORT_RE, async (raw) => {\n const absolute = resolveImportPath(raw, baseDir);\n if (opts.visited.has(absolute)) {\n return `[@import cycle detected: ${raw}]`;\n }\n opts.visited.add(absolute);\n const loaded = await loadPlainMarkdown(absolute, { maxBytesPerFile: opts.maxBytesPerFile });\n if (loaded === undefined) {\n return `[@import not found: ${raw}]`;\n }\n // Recurse with same visited set + incremented depth.\n return resolveImports(loaded.content, absolute, {\n visited: opts.visited,\n depth: opts.depth + 1,\n maxBytesPerFile: opts.maxBytesPerFile,\n });\n });\n}\n\nfunction resolveImportPath(raw: string, baseDir: string): string {\n if (raw.startsWith(\"~/\")) {\n return resolvePath(join(homedir(), raw.slice(2)));\n }\n if (isAbsolute(raw)) {\n return resolvePath(raw);\n }\n return resolvePath(join(baseDir, raw));\n}\n\n/**\n * Async equivalent of `String.prototype.replace` — sequential. Returns\n * `content` with every `re` match replaced by `await replacer(match)`.\n *\n * @internal\n */\nasync function replaceAsync(\n content: string,\n re: RegExp,\n replacer: (raw: string) => Promise<string>,\n): Promise<string> {\n const matches: Array<{ match: string; raw: string; index: number }> = [];\n // Reset lastIndex; clone the regex to avoid stateful traps.\n const localRe = new RegExp(re.source, re.flags);\n let m: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: idiomatic regex loop\n while ((m = localRe.exec(content)) !== null) {\n matches.push({ match: m[0], raw: m[1] ?? \"\", index: m.index });\n if (m.index === localRe.lastIndex) localRe.lastIndex += 1;\n }\n if (matches.length === 0) return content;\n let result = \"\";\n let cursor = 0;\n for (const entry of matches) {\n result += content.slice(cursor, entry.index);\n result += await replacer(entry.raw);\n cursor = entry.index + entry.match.length;\n }\n result += content.slice(cursor);\n return result;\n}\n","/**\n * MDC (Markdown Cursor) parser for `.cursor/rules/*.mdc` (T3.1, ADR D154).\n *\n * Parses YAML frontmatter with `description` / `globs` / `alwaysApply`\n * fields. Honors activation per Cursor's docs:\n * - `alwaysApply: true` → activates unconditionally.\n * - `alwaysApply: false` + matching glob in `touchedFiles` → activates.\n * - `alwaysApply: false` + no glob match → skipped.\n *\n * **EC-I (v1 semantic):** at `agent.send()` time, `touchedFiles` is\n * empty. Only `alwaysApply: true` rules activate. Per-glob activation\n * arrives in v2 when we hook the file-read pipeline. Description-based\n * \"agent requested\" classification is out of scope.\n *\n * Glob matching uses a tiny in-house `*` → `.*` regex (no new dep)\n * sufficient for the patterns Cursor itself recommends.\n *\n * @internal\n */\n\nimport { z } from \"zod\";\n\n/** YAML frontmatter schema for MDC files. @internal */\nexport const McdFrontmatterSchema = z.object({\n description: z.string().optional(),\n globs: z.array(z.string()).optional(),\n alwaysApply: z.boolean().optional(),\n});\n\nexport type McdFrontmatter = z.infer<typeof McdFrontmatterSchema>;\n\nexport interface McdParseResult {\n readonly frontmatter: McdFrontmatter;\n readonly body: string;\n}\n\nconst FRONTMATTER_RE = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\n/**\n * Parse `.mdc` content. Returns frontmatter + body. EC-18: when the\n * file has no `---` frontmatter, returns `frontmatter: {alwaysApply:\n * true}` so the body is treated as an unconditional rule.\n *\n * On YAML parse error, returns `undefined` and the caller emits a\n * telemetry counter (EC-21).\n *\n * @internal\n */\nexport function parseMdc(content: string): McdParseResult | undefined {\n const m = FRONTMATTER_RE.exec(content);\n if (m === null) {\n // EC-18: no frontmatter — treat as alwaysApply\n return { frontmatter: { alwaysApply: true }, body: content };\n }\n const yamlBody = m[1] ?? \"\";\n const body = m[2] ?? \"\";\n try {\n const parsed = parseSimpleYaml(yamlBody);\n const validated = McdFrontmatterSchema.safeParse(parsed);\n if (!validated.success) return undefined;\n return { frontmatter: validated.data, body };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Decide whether an MDC rule activates given the currently-touched\n * files. EC-I: empty `touchedFiles` → only `alwaysApply: true`\n * activates.\n *\n * @internal\n */\nexport function shouldActivate(fm: McdFrontmatter, touchedFiles: ReadonlyArray<string>): boolean {\n if (fm.alwaysApply === true) return true;\n if (fm.globs === undefined || fm.globs.length === 0) return false;\n if (touchedFiles.length === 0) return false;\n const globRes = fm.globs.map(globToRegex);\n return touchedFiles.some((file) => globRes.some((re) => re.test(file)));\n}\n\nfunction globToRegex(glob: string): RegExp {\n // Support **, *, ?. Escape other regex metas.\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/::DOUBLESTAR::/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${escaped}$`);\n}\n\n/**\n * Minimal YAML subset parser — handles `key: value` lines (string\n * scalars, booleans, integers) and `key:` followed by `- item` arrays.\n * Sufficient for MDC frontmatter (3 known fields). Throws on truly\n * malformed input.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: YAML-subset parser handles scalars + multi-line arrays + inline arrays in a single pass; extracting helpers fragments the line-state machine.\nfunction parseSimpleYaml(yaml: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const lines = yaml.split(/\\r?\\n/);\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n i += 1;\n if (line === undefined) continue;\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) throw new Error(`Invalid YAML line: ${trimmed}`);\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (rest === \"\") {\n // Possible array; collect indented `- item` lines.\n const items: string[] = [];\n while (i < lines.length) {\n const next = lines[i];\n if (next === undefined) break;\n const nextTrim = next.trim();\n if (nextTrim.startsWith(\"- \")) {\n items.push(parseScalar(nextTrim.slice(2).trim()) as string);\n i += 1;\n } else if (nextTrim === \"\") {\n i += 1;\n } else {\n break;\n }\n }\n out[key] = items;\n } else if (rest.startsWith(\"[\") && rest.endsWith(\"]\")) {\n // Inline array `globs: [\"**/*.ts\", \"**/*.tsx\"]`\n const inner = rest.slice(1, -1).trim();\n out[key] =\n inner === \"\"\n ? []\n : inner.split(\",\").map((s) => parseScalar(s.trim().replace(/^[\"']|[\"']$/g, \"\")));\n } else {\n out[key] = parseScalar(rest);\n }\n }\n return out;\n}\n\nfunction parseScalar(s: string): string | boolean | number {\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n if (/^-?\\d+$/.test(s)) return parseInt(s, 10);\n // Strip surrounding quotes if present.\n return s.replace(/^[\"']|[\"']$/g, \"\");\n}\n","/**\n * Multi-format context discovery runner (T5.1, ADRs D150-D156).\n *\n * Walks `DEFAULT_DISCOVERY_SPECS` (or caller override), loads each\n * spec via the appropriate parser, applies `@import` resolution where\n * declared, and returns a flat list of `AggregatorSource[]` ready for\n * the aggregate cap.\n *\n * **EC-E privacy fix:** source disambiguation uses\n * `relative(gitRoot ?? cwd, ...)` — NEVER absolute paths in\n * `<source name=\"\">`.\n *\n * @internal\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, relative } from \"node:path\";\n\nimport type { AggregatorSource } from \"./context-aggregator.js\";\nimport {\n DEFAULT_DISCOVERY_SPECS,\n type DiscoverySpec,\n findGitRoot,\n walkUpForFile,\n walkUpForGlob,\n} from \"./context-discovery.js\";\nimport { resolveImports } from \"./context-import-resolver.js\";\nimport { loadPlainMarkdown } from \"./context-loaders.js\";\nimport { parseMdc, shouldActivate } from \"./context-mdc-parser.js\";\n\nexport interface DiscoveryRunnerOptions {\n /** Workspace root passed to all discovery scopes. */\n readonly cwd: string;\n /** Per-file truncation cap (D155). */\n readonly maxBytesPerFile: number;\n /** Optional override of the default registry. */\n readonly specs?: ReadonlyArray<DiscoverySpec>;\n /** Cursor MDC: file paths the LLM has touched this turn (EC-I: empty at send-time). */\n readonly touchedFiles?: ReadonlyArray<string>;\n /** When true, skip `theokit-context` spec — caller already handles the legacy path. */\n readonly skipLegacyTheokitContext?: boolean;\n}\n\n/**\n * Run discovery + loading across all specs. Returns sources ready for\n * the aggregator (priority + content fields populated).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: per-spec dispatch ladder + cross-spec dedup is a flat orchestrator; splitting would obscure the priority-merge invariant.\nexport async function runDiscovery(opts: DiscoveryRunnerOptions): Promise<AggregatorSource[]> {\n const gitRoot = findGitRoot(opts.cwd);\n const specs = opts.specs ?? DEFAULT_DISCOVERY_SPECS;\n const out: AggregatorSource[] = [];\n const seenReal = new Set<string>();\n\n for (const spec of specs) {\n if (opts.skipLegacyTheokitContext && spec.id === \"theokit-context\") continue;\n const paths = await resolvePathsForSpec(spec, opts.cwd, gitRoot);\n for (const path of paths) {\n if (seenReal.has(path)) continue;\n seenReal.add(path);\n const source = await loadOneSource(spec, path, opts, gitRoot);\n if (source !== undefined) out.push(source);\n }\n }\n return out;\n}\n\nasync function resolvePathsForSpec(\n spec: DiscoverySpec,\n cwd: string,\n gitRoot: string | undefined,\n): Promise<string[]> {\n if (spec.scope === \"cwd-only\") {\n return walkUpForFile(cwd, spec.pattern, cwd);\n }\n if (spec.scope === \"git-root-walk\") {\n return walkUpForFile(cwd, spec.pattern, gitRoot ?? cwd);\n }\n // globbed\n return walkUpForGlob(cwd, spec.pattern);\n}\n\nasync function loadOneSource(\n spec: DiscoverySpec,\n path: string,\n opts: DiscoveryRunnerOptions,\n gitRoot: string | undefined,\n): Promise<AggregatorSource | undefined> {\n // EC-E privacy: name uses relative-to-git-root for disambiguation;\n // NEVER absolute paths in the public `<source name=\"\">` attribute.\n // For cwd-only specs (THEO.md), no disambiguation is needed because\n // the scope can only ever match a single file.\n const relPath = relative(gitRoot ?? opts.cwd, dirname(path));\n const needsSuffix = spec.scope !== \"cwd-only\" && relPath !== \"\" && relPath !== \".\";\n const id = needsSuffix ? `${spec.id}@${relPath}` : spec.id;\n\n if (spec.parser === \"mdc\") {\n return loadMdcSource(spec, path, id, opts);\n }\n if (spec.parser === \"frontmatter-zod\") {\n // Legacy `.theokit/context/*.md` — handled by `loadContextConfig` in\n // `context-manager.ts` for backward compat. We skip here unless caller\n // explicitly wants us to load it (currently always skipped).\n return undefined;\n }\n // plain-markdown\n return loadPlainMarkdownSource(spec, path, id, opts);\n}\n\nasync function loadMdcSource(\n spec: DiscoverySpec,\n path: string,\n id: string,\n opts: DiscoveryRunnerOptions,\n): Promise<AggregatorSource | undefined> {\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n return undefined;\n }\n const parsed = parseMdc(raw);\n if (parsed === undefined) return undefined;\n if (!shouldActivate(parsed.frontmatter, opts.touchedFiles ?? [])) return undefined;\n return {\n id,\n source: path,\n content: parsed.body,\n priority: spec.priority,\n truncated: false,\n };\n}\n\nasync function loadPlainMarkdownSource(\n spec: DiscoverySpec,\n path: string,\n id: string,\n opts: DiscoveryRunnerOptions,\n): Promise<AggregatorSource | undefined> {\n const loaded = await loadPlainMarkdown(path, { maxBytesPerFile: opts.maxBytesPerFile });\n if (loaded === undefined) return undefined;\n let content = loaded.content;\n if (spec.followImports) {\n content = await resolveImports(content, path, {\n visited: new Set([path]),\n depth: 0,\n maxBytesPerFile: opts.maxBytesPerFile,\n });\n }\n return {\n id,\n source: path,\n content,\n priority: spec.priority,\n truncated: loaded.truncated,\n };\n}\n","/**\n * Context source frontmatter schema (ADR D76 — mirrors D10 / hooks-frontmatter).\n *\n * Used by the markdown context loader (`context/<name>.md`). Each .md file\n * represents one context source with structured frontmatter + optional\n * prose body explaining why this source is part of the agent's context.\n *\n * @internal\n */\n\nimport { z } from \"zod\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\nexport const ContextSourceFrontmatterSchema = z.object({\n /** Identifier; defaults to filename slug if omitted. */\n name: z.string().min(1).optional(),\n /** File path relative to cwd. */\n path: z.string().min(1),\n /** Disabled sources excluded from the context snapshot. */\n enabled: z.boolean().optional().default(true),\n /** Optional per-source token budget. */\n maxTokens: z.number().int().positive().optional(),\n});\n\nexport type ContextSourceFrontmatter = z.infer<typeof ContextSourceFrontmatterSchema>;\n\n/**\n * @throws ConfigurationError(code: \"context_frontmatter_invalid\")\n * @internal\n */\nexport function parseContextSourceFrontmatter(\n fields: Record<string, unknown>,\n slug: string,\n): ContextSourceFrontmatter {\n const parsed = ContextSourceFrontmatterSchema.safeParse(fields);\n if (!parsed.success) {\n throw new ConfigurationError(\n `Invalid context source frontmatter for \"${slug}\": ${parsed.error.message}`,\n { code: \"context_frontmatter_invalid\" },\n );\n }\n return parsed.data;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { loadMarkdownEntities } from \"../persistence/markdown-config-loader.js\";\nimport { safePathJoin } from \"../security/path-guard.js\";\nimport { warnOnce } from \"./hooks-source.js\";\nimport { type PluginFrontmatter, PluginFrontmatterSchema } from \"./plugin-frontmatter.js\";\nimport { readWorkspaceDir } from \"./workspace-dir.js\";\n\n/**\n * Plugin manifest exposed via `agent.plugins.list()`. Includes provenance\n * (source path) so callers can audit where the plugin came from.\n *\n * @internal\n */\nexport interface PluginMetadata {\n name: string;\n version: string;\n capabilities: string[];\n source: string;\n /** Relative path to JS entry within the plugin folder. Validated against\n * path traversal at assertEntryFileExists time (EC-1 fix). */\n entry?: string;\n}\n\n/**\n * File-based plugin loader. Discovers `.theokit/plugins/*\\/plugin.json`\n * manifests when `local.settingSources` includes `\"plugins\"`.\n *\n * @internal\n */\nexport class PluginsManager {\n private plugins: PluginMetadata[] = [];\n\n constructor(\n private readonly cwd: string,\n private readonly enabled: string[] | undefined,\n private readonly settingSourcesIncludePlugins: boolean,\n private readonly cloud: boolean,\n private readonly localPaths: string[] | undefined,\n ) {}\n\n async initialize(): Promise<void> {\n this.assertCloudRules();\n if (!this.settingSourcesIncludePlugins) {\n this.plugins = [];\n return;\n }\n await this.refresh();\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: MD-first + JSON fallback + both-present detection per plugin folder — branch table is clearer inlined.\n async refresh(): Promise<void> {\n this.plugins = [];\n const pluginsRoot = join(this.cwd, \".theokit\", \"plugins\");\n const entries = await readWorkspaceDir(pluginsRoot, \"plugins_read_error\", \"plugins directory\");\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const folderName = entry.name;\n // ADR D77: prefer PLUGIN.md; fall back to plugin.json with deprecation warn.\n const mdPath = join(pluginsRoot, folderName, \"PLUGIN.md\");\n const jsonPath = join(pluginsRoot, folderName, \"plugin.json\");\n const metadata = existsSync(mdPath)\n ? await loadPluginManifestFromMarkdown(pluginsRoot, folderName)\n : await loadPluginManifestFromJson(jsonPath, folderName);\n if (existsSync(mdPath) && existsSync(jsonPath)) {\n warnOnce(\n `plugin-${folderName}-both`,\n `[theokit-sdk] both ${folderName}/PLUGIN.md and ${folderName}/plugin.json detected — using markdown; remove plugin.json`,\n );\n }\n if (!existsSync(mdPath) && existsSync(jsonPath)) {\n warnOnce(\n \"plugin-json-deprecated\",\n \"[theokit-sdk] plugin.json manifests are deprecated; migrate to PLUGIN.md via theokit-migrate-config\",\n );\n }\n if (this.enabled === undefined || this.enabled.includes(metadata.name)) {\n await this.assertEntryFileExists(metadata, folderName);\n this.plugins.push(metadata);\n }\n }\n }\n\n list(): Promise<PluginMetadata[]> {\n return Promise.resolve(this.plugins);\n }\n\n private async assertEntryFileExists(metadata: PluginMetadata, folderName: string): Promise<void> {\n const entry = metadata.entry;\n if (entry === undefined) return;\n // ADRs D79-D80 (path-guard): safePathJoin resolves THEN prefix-checks,\n // catching both literal \"..\" and normalized escape (e.g. \"subdir/../../etc\").\n // Replaces the inline T3.2 markdown-config-migration guard that only handled\n // the literal cases. PathTraversalError extends ConfigurationError (code:\n // \"path_traversal\") so consumers catching ConfigurationError still see it.\n const pluginRoot = join(this.cwd, \".theokit\", \"plugins\", folderName);\n const entryPath = safePathJoin(pluginRoot, entry);\n try {\n await readFile(entryPath, \"utf8\");\n } catch (cause) {\n throw new ConfigurationError(`Plugin ${metadata.name} entry file is missing: ${entry}`, {\n code: \"plugin_entry_missing\",\n cause,\n });\n }\n }\n\n private assertCloudRules(): void {\n if (!this.cloud) return;\n if (this.localPaths !== undefined && this.localPaths.length > 0) {\n throw new ConfigurationError(\n \"Cloud agents reject local plugin paths — plugins must come from committed repo files\",\n { code: \"cloud_plugin_path_rejected\" },\n );\n }\n }\n}\n\nasync function loadPluginManifestFromJson(\n manifestPath: string,\n folderName: string,\n): Promise<PluginMetadata> {\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf8\");\n } catch (cause) {\n throw new ConfigurationError(`Plugin ${folderName} is missing plugin.json`, {\n code: \"plugin_missing_manifest\",\n cause,\n });\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (cause) {\n throw new ConfigurationError(`Plugin ${folderName} manifest is invalid JSON`, {\n code: \"plugin_manifest_invalid\",\n cause,\n });\n }\n if (!parsed || typeof parsed !== \"object\") {\n throw new ConfigurationError(`Plugin ${folderName} manifest must be an object`, {\n code: \"plugin_manifest_shape\",\n });\n }\n const record = parsed as Record<string, unknown>;\n const name = typeof record.name === \"string\" ? record.name : folderName;\n const version = typeof record.version === \"string\" ? record.version : \"0.0.0\";\n const capabilities = Array.isArray(record.capabilities)\n ? record.capabilities.filter((cap): cap is string => typeof cap === \"string\")\n : [];\n const source = manifestPath.slice(manifestPath.indexOf(\".theokit/\"));\n const metadata: PluginMetadata = { name, version, capabilities, source };\n if (typeof record.entry === \"string\") metadata.entry = record.entry;\n return metadata;\n}\n\n/** Load PLUGIN.md from a plugin folder via shared markdown-config-loader. */\nasync function loadPluginManifestFromMarkdown(\n pluginsRoot: string,\n folderName: string,\n): Promise<PluginMetadata> {\n // Use nested loader at the granularity of ONE folder by passing a tmp dir\n // expectation; simpler: read the single PLUGIN.md directly.\n const mdPath = join(pluginsRoot, folderName, \"PLUGIN.md\");\n let raw: string;\n try {\n raw = await readFile(mdPath, \"utf8\");\n } catch (cause) {\n throw new ConfigurationError(`Plugin ${folderName} is missing PLUGIN.md`, {\n code: \"plugin_missing_manifest\",\n cause,\n });\n }\n // Reuse the loader's split via a single-entity wrapper.\n const fakeDir = join(pluginsRoot, folderName);\n const entities = await loadMarkdownEntities({\n dir: fakeDir,\n schema: PluginFrontmatterSchema,\n pattern: \"flat\", // read all .md in folder; PLUGIN.md is the canonical name\n errorCodePrefix: \"plugin\",\n });\n const entity = entities.find((e) => e.slug === \"PLUGIN\");\n if (entity === undefined) {\n throw new ConfigurationError(`Plugin ${folderName} PLUGIN.md not parseable`, {\n code: \"plugin_missing_manifest\",\n });\n }\n const fm: PluginFrontmatter = entity.frontmatter;\n const source = mdPath.slice(mdPath.indexOf(\".theokit/\"));\n const metadata: PluginMetadata = {\n name: fm.name ?? folderName,\n version: fm.version ?? \"0.0.0\",\n capabilities: fm.capabilities ?? [],\n source,\n };\n if (fm.entry !== undefined) metadata.entry = fm.entry;\n // raw used to surface parse errors for legacy compat with tests that\n // expect the file is actually read; intentionally side-effect-free.\n void raw;\n return metadata;\n}\n","/**\n * Plugin manifest frontmatter schema (ADR D76).\n *\n * Used by the markdown plugin loader (`plugins/<name>/PLUGIN.md`). Matches\n * the legacy `plugin.json` shape consumed by `plugins-manager.ts`:\n * `{ name, version, capabilities, entry }`. Frontmatter is flat — no\n * nested provider object (parseSimpleYaml doesn't support nesting).\n *\n * @internal\n */\n\nimport { z } from \"zod\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\nexport const PluginFrontmatterSchema = z.object({\n /** Plugin identifier; defaults to folder name if omitted. */\n name: z.string().min(1).optional(),\n /** SemVer string; defaults to \"0.0.0\" if omitted. */\n version: z.string().optional(),\n /** What this plugin provides. */\n capabilities: z.array(z.string()).optional(),\n /** Relative path to the JS entry file within the plugin folder. */\n entry: z.string().min(1).optional(),\n});\n\nexport type PluginFrontmatter = z.infer<typeof PluginFrontmatterSchema>;\n\n/**\n * @throws ConfigurationError(code: \"plugin_frontmatter_invalid\")\n * @internal\n */\nexport function parsePluginFrontmatter(\n fields: Record<string, unknown>,\n slug: string,\n): PluginFrontmatter {\n const parsed = PluginFrontmatterSchema.safeParse(fields);\n if (!parsed.success) {\n throw new ConfigurationError(\n `Invalid plugin frontmatter for \"${slug}\": ${parsed.error.message}`,\n { code: \"plugin_frontmatter_invalid\" },\n );\n }\n return parsed.data;\n}\n","import { readdir } from \"node:fs/promises\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\n/**\n * Entry returned by `readWorkspaceDir`. Mirrors the subset of\n * `fs.Dirent` the file-based loaders use.\n */\nexport interface WorkspaceDirEntry {\n name: string;\n isDirectory(): boolean;\n isFile(): boolean;\n}\n\n/**\n * Read a workspace subdirectory and return its entries. When the directory\n * does not exist (`ENOENT`), returns an empty array — the file-based loaders\n * (skills, plugins, agents) treat a missing directory as \"no entries\"\n * rather than an error.\n *\n * Any other I/O failure is wrapped as `ConfigurationError` so callers can\n * surface a stable error code.\n *\n * @internal\n */\nexport async function readWorkspaceDir(\n root: string,\n errorCode: string,\n describe: string,\n): Promise<WorkspaceDirEntry[]> {\n try {\n return (await readdir(root, { withFileTypes: true })) as WorkspaceDirEntry[];\n } catch (cause) {\n const err = cause as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") return [];\n throw new ConfigurationError(`Failed to read ${describe}: ${root}`, {\n code: errorCode,\n cause,\n });\n }\n}\n","import type { ModelSelection } from \"../../types/agent.js\";\nimport type {\n PluginsSettings,\n ProviderRoutingSettings,\n ResolvedProviderRoute,\n SDKProvidersManager,\n} from \"../../types/providers.js\";\n\n/**\n * Provider routing inspector. Computes the resolved capability →\n * provider mapping from `AgentOptions.providers` + `AgentOptions.plugins` +\n * the model selection.\n *\n * @internal\n */\nexport class ProvidersManagerImpl implements SDKProvidersManager {\n constructor(\n private readonly model: ModelSelection | undefined,\n private readonly providers: ProviderRoutingSettings | undefined,\n private readonly plugins: PluginsSettings | undefined,\n ) {}\n\n routes(): Promise<ResolvedProviderRoute[]> {\n const resolved: ResolvedProviderRoute[] = [];\n const modelProvider = providerFromModel(this.model);\n const seen = new Set<string>();\n if (this.providers?.routes !== undefined) {\n for (const route of this.providers.routes) {\n const resolvedRoute = resolveRoute(route, modelProvider, this.plugins);\n if (!seen.has(route.capability)) {\n seen.add(route.capability);\n resolved.push(resolvedRoute);\n }\n }\n }\n return Promise.resolve(resolved);\n }\n}\n\nfunction providerFromModel(model: ModelSelection | undefined): string | undefined {\n if (model === undefined) return undefined;\n const id = model.id;\n if (id.includes(\":\")) return id.split(\":\")[0];\n return undefined;\n}\n\nfunction resolveRoute(\n route: { capability: string; provider: string; model?: string },\n modelProvider: string | undefined,\n plugins: PluginsSettings | undefined,\n): ResolvedProviderRoute {\n if (route.capability === \"chat\" && modelProvider === route.provider) {\n const modelName = extractModelName(modelProvider, route);\n const base: ResolvedProviderRoute = {\n capability: route.capability,\n provider: route.provider,\n reason: \"explicit-model-provider\",\n };\n if (modelName !== undefined) base.model = modelName;\n return base;\n }\n if (plugins?.enabled !== undefined && plugins.enabled.length > 0) {\n return {\n capability: route.capability,\n provider: route.provider,\n reason: \"first-available-plugin-provider\",\n };\n }\n return {\n capability: route.capability,\n provider: route.provider,\n reason: \"explicit-route\",\n };\n}\n\nfunction extractModelName(\n prefix: string,\n route: { model?: string; provider: string },\n): string | undefined {\n if (route.model !== undefined) return route.model;\n // When the model id is \"anthropic:claude-3-7-sonnet\" and the route is chat→anthropic,\n // surface the model name from the prefix split.\n return prefix === route.provider ? defaultModelForProvider(prefix) : undefined;\n}\n\nfunction defaultModelForProvider(provider: string): string | undefined {\n if (provider === \"anthropic\") return \"claude-3-7-sonnet\";\n return undefined;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { assertNoSymlinkEscape, safePathJoin } from \"../security/path-guard.js\";\nimport { parseSkillFrontmatter } from \"./skill-frontmatter.js\";\nimport { readWorkspaceDir } from \"./workspace-dir.js\";\n\n/**\n * Skill metadata exposed via `agent.skills.list()`. Full skill prompt bodies\n * are NEVER returned — only frontmatter fields.\n *\n * @internal\n */\nexport interface SkillMetadata {\n name: string;\n description: string;\n source: string;\n category?: string;\n dependencies?: string[];\n}\n\n/**\n * File-based skills loader. Discovers `.theokit/skills/<name>/SKILL.md`\n * frontmatter when `local.settingSources` includes `\"project\"`.\n *\n * Per ADR D10 + EC-5: malformed YAML or missing required frontmatter fields\n * exclude the skill from `list()` and emit a stderr warning. The agent run\n * continues without the broken skill.\n *\n * @internal\n */\nexport class SkillsManager {\n private skills: SkillMetadata[] = [];\n\n constructor(\n private readonly cwd: string,\n _enabled: string[] | undefined,\n private readonly settingSourcesIncludeProject: boolean,\n ) {\n void _enabled;\n }\n\n async initialize(): Promise<void> {\n if (!this.settingSourcesIncludeProject) {\n this.skills = [];\n return;\n }\n await this.refresh();\n }\n\n async refresh(): Promise<void> {\n this.skills = [];\n const skillsRoot = join(this.cwd, \".theokit\", \"skills\");\n const entries = await readWorkspaceDir(skillsRoot, \"skills_read_error\", \"skills directory\");\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // ADRs D79-D80: defense-in-depth — even though `entry.name` comes from\n // fs.readdir (basename only, no traversal), use safePathJoin to keep\n // the invariant uniform across the codebase. assertNoSymlinkEscape\n // rejects symlinks in the skills dir that point outside (EC-1, Hermes\n // v0.2 #386 #61 symlink boundary fixes).\n let skillDir: string;\n try {\n skillDir = safePathJoin(skillsRoot, entry.name);\n assertNoSymlinkEscape(skillDir, skillsRoot);\n } catch {\n continue;\n }\n const skillPath = join(skillDir, \"SKILL.md\");\n let raw: string;\n try {\n raw = await readFile(skillPath, \"utf8\");\n } catch {\n continue;\n }\n const metadata = tryParseSkill(raw, entry.name, skillPath);\n if (metadata !== undefined) this.skills.push(metadata);\n }\n }\n\n list(): Promise<SkillMetadata[]> {\n // Return every discovered skill — `enabled` is a runtime hint for which\n // skills the parent agent may invoke, not a visibility filter.\n return Promise.resolve(this.skills);\n }\n}\n\nfunction tryParseSkill(\n raw: string,\n fallbackName: string,\n source: string,\n): SkillMetadata | undefined {\n try {\n const frontmatter = parseSkillFrontmatter(raw, fallbackName);\n const metadata: SkillMetadata = {\n name: frontmatter.name,\n description: frontmatter.description,\n source,\n };\n if (frontmatter.category !== undefined) metadata.category = frontmatter.category;\n if (frontmatter.dependencies !== undefined) metadata.dependencies = frontmatter.dependencies;\n return metadata;\n } catch (cause) {\n if (cause instanceof ConfigurationError) {\n const code = cause.code ?? \"unknown\";\n process.stderr.write(\n `[theokit-sdk] skill ${fallbackName} skipped (${code}): ${cause.message}\\n`,\n );\n return undefined;\n }\n throw cause;\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport { type FrontmatterValue, parseSimpleYaml } from \"./yaml-frontmatter.js\";\n\ntype StringFields = Record<string, string | undefined>;\n\n/** Narrow a FrontmatterValue to string; non-strings + undefined → undefined. */\nfunction asString(v: FrontmatterValue | undefined): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\n/** Coerce parser output to legacy string-only shape (skill schema is all-string). */\nfunction toStringFields(raw: Record<string, FrontmatterValue | undefined>): StringFields {\n const out: StringFields = {};\n for (const [k, v] of Object.entries(raw)) out[k] = asString(v);\n return out;\n}\n\n/**\n * Strict skill frontmatter schema (ADR D10).\n *\n * Required: `name`, `description`.\n * Optional: `category`, `dependencies` (comma-separated string in the\n * simple-YAML dialect — parsed to `string[]`).\n *\n * Unknown fields are ignored (forward-compat). Malformed YAML or missing\n * required fields surface as `ConfigurationError` with one of the typed\n * codes below.\n *\n * @internal\n */\nexport interface SkillFrontmatter {\n name: string;\n description: string;\n category?: string;\n dependencies?: string[];\n}\n\nexport type SkillFrontmatterErrorCode = \"missing_frontmatter\" | \"schema_invalid\";\n\n/**\n * Parse a SKILL.md file body into validated frontmatter.\n *\n * @throws ConfigurationError(code: \"missing_frontmatter\") — no `---` block at file head.\n * @throws ConfigurationError(code: \"schema_invalid\") — YAML malformed OR required field missing.\n *\n * @internal\n */\nexport function parseSkillFrontmatter(raw: string, fallbackName: string): SkillFrontmatter {\n const fields = extractAndParseFrontmatter(raw, fallbackName);\n const name = resolveName(fields, fallbackName);\n ensureRequiredFields(fields, name);\n return buildFrontmatter(fields, name);\n}\n\nfunction extractAndParseFrontmatter(raw: string, fallbackName: string): StringFields {\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n/.exec(raw);\n if (match === null) {\n throw new ConfigurationError(`Skill ${fallbackName} is missing frontmatter`, {\n code: \"missing_frontmatter\",\n });\n }\n const frontmatter = match[1] ?? \"\";\n // EC-5: guard against syntactically invalid frontmatter so the loader\n // surfaces schema_invalid rather than crashing.\n try {\n return toStringFields(parseSimpleYaml(frontmatter));\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : String(cause);\n throw new ConfigurationError(\n `Skill ${fallbackName} has malformed YAML frontmatter: ${detail}`,\n { code: \"schema_invalid\", cause },\n );\n }\n}\n\nfunction resolveName(fields: StringFields, fallbackName: string): string {\n if (hasContent(fields.name)) return fields.name;\n if (hasContent(fallbackName)) return fallbackName;\n throw new ConfigurationError(\"Skill at unknown path is missing required field: name\", {\n code: \"schema_invalid\",\n });\n}\n\nfunction ensureRequiredFields(fields: StringFields, name: string): void {\n if (!hasContent(fields.description)) {\n throw new ConfigurationError(`Skill ${name} is missing required field: description`, {\n code: \"schema_invalid\",\n });\n }\n}\n\nfunction buildFrontmatter(fields: StringFields, name: string): SkillFrontmatter {\n const description = fields.description;\n if (description === undefined) {\n // ensureRequiredFields already threw; this is unreachable but satisfies TS\n throw new ConfigurationError(`Skill ${name} missing description`, { code: \"schema_invalid\" });\n }\n const result: SkillFrontmatter = { name, description };\n if (hasContent(fields.category)) result.category = fields.category;\n const deps = parseDependencies(fields.dependencies);\n if (deps !== undefined) result.dependencies = deps;\n return result;\n}\n\nfunction parseDependencies(raw: string | undefined): string[] | undefined {\n if (!hasContent(raw)) return undefined;\n const deps = (raw as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return deps.length > 0 ? deps : undefined;\n}\n\nfunction hasContent(value: string | undefined): value is string {\n return value !== undefined && value.trim().length > 0;\n}\n","/**\n * `LocalAgent` constructor bootstrap helpers (extracted for G8 ≤400 LoC).\n *\n * Each helper builds one optional submanager from `AgentOptions` and\n * the resolved workspace cwd. The constructor itself stays focused on\n * the agentId / model wiring; submanager bootstrap is delegated here.\n *\n * @internal\n */\n\nimport type { AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport { registerAgent } from \"./agent-registry.js\";\nimport { FileContextManager } from \"./context-manager.js\";\nimport { type PluginMetadata, PluginsManager } from \"./plugins-manager.js\";\nimport { ProvidersManagerImpl } from \"./providers-manager.js\";\nimport { type SkillMetadata, SkillsManager } from \"./skills-manager.js\";\n\nexport function registerLocalAgent(args: {\n agentId: string;\n model: ModelSelection | undefined;\n options: AgentOptions;\n workspaceCwd: string;\n}): void {\n registerAgent({\n agentId: args.agentId,\n runtime: \"local\",\n name: args.options.name,\n summary: \"Local contract fixture\",\n model: args.model,\n createdAt: Date.now(),\n lastModified: Date.now(),\n archived: false,\n options: args.options,\n cwd: args.workspaceCwd,\n status: \"finished\",\n ...(args.options.conversationStorage !== undefined ? { requiresCustomStorage: true } : {}),\n });\n}\n\nexport interface BootstrappedSubmanagers {\n context?: FileContextManager;\n providers?: ProvidersManagerImpl;\n skillsManager?: SkillsManager;\n skills?: { list: () => Promise<SkillMetadata[]> };\n pluginsManager?: PluginsManager;\n plugins?: { list: () => Promise<PluginMetadata[]> };\n}\n\nexport function bootstrapSubmanagers(args: {\n options: AgentOptions;\n workspaceCwd: string;\n settingSourcesIncludeProject: boolean;\n settingSourcesIncludePlugins: boolean;\n}): BootstrappedSubmanagers {\n const out: BootstrappedSubmanagers = {};\n if (args.options.context !== undefined) {\n out.context = new FileContextManager(\n args.workspaceCwd,\n args.options.context,\n args.settingSourcesIncludeProject,\n );\n }\n const providerCount =\n (args.options.providers?.routes?.length ?? 0) + (args.options.plugins?.enabled?.length ?? 0);\n if (providerCount > 0 || args.options.providers !== undefined) {\n out.providers = new ProvidersManagerImpl(\n args.options.model,\n args.options.providers,\n args.options.plugins,\n );\n }\n if (args.options.skills !== undefined || args.settingSourcesIncludeProject) {\n out.skillsManager = new SkillsManager(\n args.workspaceCwd,\n args.options.skills?.enabled,\n args.settingSourcesIncludeProject,\n );\n const localSkills = out.skillsManager;\n out.skills = { list: () => localSkills.list() };\n }\n if (args.options.plugins !== undefined || args.settingSourcesIncludePlugins) {\n out.pluginsManager = new PluginsManager(\n args.workspaceCwd,\n args.options.plugins?.enabled,\n args.settingSourcesIncludePlugins,\n false,\n undefined,\n );\n const localPlugins = out.pluginsManager;\n out.plugins = { list: () => localPlugins.list() };\n }\n return out;\n}\n","import type { Run } from \"../../types/run.js\";\n\n/**\n * Process-wide run registry indexed by run id. Lets `Agent.listRuns()` and\n * `Agent.getRun()` return the exact Run instances created by previous sends.\n *\n * @internal\n */\n\nconst runs = new Map<string, Run>();\nconst runsByAgent = new Map<string, string[]>();\n\nexport function registerRun(run: Run): void {\n runs.set(run.id, run);\n const existing = runsByAgent.get(run.agentId) ?? [];\n if (!existing.includes(run.id)) existing.push(run.id);\n runsByAgent.set(run.agentId, existing);\n}\n\nexport function getRun(runId: string): Run | undefined {\n return runs.get(runId);\n}\n\nexport function listRunsByAgent(agentId: string): Run[] {\n const ids = runsByAgent.get(agentId) ?? [];\n return ids.map((id) => runs.get(id)).filter((run): run is Run => run !== undefined);\n}\n\nexport function clearRunRegistry(): void {\n runs.clear();\n runsByAgent.clear();\n}\n","import type { AgentDefinition, AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport type { Run, RunOperation, RunStatus, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport type { SessionMessage } from \"./agent-session.js\";\nimport { DEFAULT_AGENTIC_MODEL_ID } from \"./default-model.js\";\nimport { buildFixtureScript } from \"./fixture-responder.js\";\nimport { FixtureRunBase, prepareRunContext } from \"./fixture-run-base.js\";\nimport type { MemoryFact } from \"./memory-store.js\";\nimport { registerRun } from \"./run-registry.js\";\n\n/**\n * Options accepted by `createLocalRun()`.\n *\n * @internal\n */\nexport interface CreateLocalRunOptions {\n agentId: string;\n model: ModelSelection | undefined;\n message: string | SDKUserMessage;\n agentOptions: AgentOptions;\n sendOptions: SendOptions;\n workspaceCwd: string;\n subagents: Record<string, AgentDefinition>;\n settingSourcesIncludeProject: boolean;\n memoryFacts: MemoryFact[];\n sessionMessages: SessionMessage[];\n projectMcpServers: Record<string, unknown>;\n persistMemoryFact?: (fact: MemoryFact) => Promise<void>;\n /**\n * Accepted for API parity with the real runtime; the fixture responder is\n * deterministic and does not feed the prompt into its scripts.\n */\n systemPrompt?: string;\n}\n\n/**\n * Build a local Run handle backed by the in-process fixture responder.\n *\n * @internal\n */\nexport function createLocalRun(options: CreateLocalRunOptions): Run {\n const { userText, id, startTime } = prepareRunContext(options.message);\n const supported = new Set<RunOperation>([\"stream\", \"wait\", \"cancel\", \"conversation\"]);\n\n const script = buildFixtureScript({\n agentId: options.agentId,\n runId: id,\n model: options.model ?? { id: DEFAULT_AGENTIC_MODEL_ID },\n userMessage: userText,\n runtime: \"local\",\n agentOptions: options.agentOptions,\n sendOptions: options.sendOptions,\n workspaceCwd: options.workspaceCwd,\n subagents: options.subagents,\n settingSourcesIncludeProject: options.settingSourcesIncludeProject,\n memoryFacts: options.memoryFacts,\n sessionMessages: options.sessionMessages,\n projectMcpServers: options.projectMcpServers,\n ...(options.persistMemoryFact !== undefined\n ? { persistMemoryFact: options.persistMemoryFact }\n : {}),\n });\n\n const handle = new LocalRun({\n id,\n agentId: options.agentId,\n model: options.model,\n script,\n supportedOps: supported,\n startTime,\n });\n handle.bootstrap();\n registerRun(handle);\n return handle;\n}\n\nclass LocalRun extends FixtureRunBase {\n bootstrap(): void {\n if (this.script.cancellable) return;\n setTimeout(() => {\n void this.completeNaturally();\n }, 0);\n }\n\n protected override notifyImmediately(): boolean {\n // Local agents emit the \"running\" state synchronously to subscribers;\n // tests rely on observing the transition even when added pre-completion.\n return true;\n }\n\n private async completeNaturally(): Promise<void> {\n if (this.terminated) return;\n const beforeOk = await this.runBeforeComplete();\n if (!beforeOk) return;\n this.transitionTo(this.script.finalStatus);\n }\n\n /** Runs the optional beforeComplete hook. Returns false iff it failed and the run transitioned to error. */\n private async runBeforeComplete(): Promise<boolean> {\n if (this.script.beforeComplete === undefined) return true;\n try {\n await this.script.beforeComplete();\n return true;\n } catch (cause) {\n // Capture the beforeComplete failure on the script so the wait()\n // caller sees `result.error.message` instead of an opaque status.\n if (this.script.errorDetail === undefined) {\n const message = cause instanceof Error ? cause.message : String(cause);\n this.script.errorDetail = { message, code: \"before_complete_failed\", cause };\n }\n this.transitionTo(\"error\" satisfies RunStatus);\n return false;\n }\n }\n}\n","/**\n * UsageAccumulator — aggregate multi-step `LlmFinish` token counts\n * into a canonical `TokenUsage` (ADR D376, mirror openai-agents-python\n * `Usage.add`).\n *\n * Each `add(step)` merges in a per-step finish; `toTokenUsage()`\n * produces the aggregated public shape with `requests[]` populated\n * when there were ≥2 steps.\n *\n * @internal\n */\n\nimport type { TokenUsage } from \"../../types/usage.js\";\n\ninterface StepUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}\n\nexport class UsageAccumulator {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private reasoning = 0;\n private readonly requests: Array<Omit<TokenUsage, \"requests\">> = [];\n\n add(step: StepUsage): void {\n const inputTokens = step.inputTokens ?? 0;\n const outputTokens = step.outputTokens ?? 0;\n const cacheReadTokens = step.cacheReadTokens ?? 0;\n const cacheWriteTokens = step.cacheWriteTokens ?? 0;\n const reasoningTokens = step.reasoningTokens ?? 0;\n this.input += inputTokens;\n this.output += outputTokens;\n this.cacheRead += cacheReadTokens;\n this.cacheWrite += cacheWriteTokens;\n this.reasoning += reasoningTokens;\n this.requests.push({\n inputTokens,\n outputTokens,\n ...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),\n ...(cacheWriteTokens > 0 ? { cacheWriteTokens } : {}),\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\n totalTokens: inputTokens + outputTokens,\n });\n }\n\n /** Did we observe any usage at all? */\n hasAny(): boolean {\n return this.requests.length > 0;\n }\n\n toTokenUsage(): TokenUsage {\n return {\n inputTokens: this.input,\n outputTokens: this.output,\n ...(this.cacheRead > 0 ? { cacheReadTokens: this.cacheRead } : {}),\n ...(this.cacheWrite > 0 ? { cacheWriteTokens: this.cacheWrite } : {}),\n ...(this.reasoning > 0 ? { reasoningTokens: this.reasoning } : {}),\n totalTokens: this.input + this.output,\n ...(this.requests.length > 1 ? { requests: this.requests.slice() } : {}),\n };\n }\n}\n","/**\n * Iteration budget for the agent loop (T2.1, ADRs D90-D91).\n *\n * Tracks remaining iterations + compression attempts + grace-call usage.\n * Caps prevent the 4 compression death spirals Hermes shipped:\n * - v0.4 #1723: `compression_attempts` never reset\n * - v0.7 #4750: compression triggers → fails → triggers again\n * - v0.11 #10065: stale agent timeout, empty response after tools\n * - v0.11 #10472: empty-tools after tools, premature loop exit\n *\n * Default: max 8 iterations, max 3 compressions per session, 1 grace call.\n *\n * NOTE on caller-supplied huge maxIterations (EC-12): `Number.MAX_SAFE_INTEGER`\n * is honored — caller is responsible for picking a reasonable cap. Recommended\n * ≤32 for production workloads.\n *\n * NOTE on per-send reset (EC-14): each `Agent.send` should construct a fresh\n * `IterationBudget`. This is intentional — every send is its own iteration\n * round, not a long-running budget shared across sends.\n *\n * @internal\n */\n\nexport class IterationBudgetExhaustedError extends Error {\n override readonly name: string = \"IterationBudgetExhaustedError\";\n}\n\nexport class CompressionExhaustedError extends Error {\n override readonly name: string = \"CompressionExhaustedError\";\n}\n\nexport class CompressionIneffectiveError extends Error {\n override readonly name: string = \"CompressionIneffectiveError\";\n}\n\nexport interface IterationBudgetOptions {\n /** Total iterations before grace call. Default 8. */\n maxIterations?: number;\n /** Max compression attempts per session (D91). Default 3. */\n maxCompressions?: number;\n /** When true (default), one final iteration is allowed after budget exhausted. */\n allowGraceCall?: boolean;\n}\n\n/**\n * Stateful budget tracker. Encapsulates state per ADR D90 — class is the\n * canonical home so leak across sessions is impossible (vs POJO that Hermes\n * #1723 shipped as a bug).\n *\n * @internal\n */\nexport class IterationBudget {\n #remaining: number;\n readonly #total: number;\n #compressionAttempts = 0;\n #graceCallUsed = false;\n readonly #maxCompressions: number;\n readonly #allowGrace: boolean;\n\n constructor(opts: IterationBudgetOptions = {}) {\n this.#total = opts.maxIterations ?? 8;\n this.#remaining = this.#total;\n this.#maxCompressions = opts.maxCompressions ?? 3;\n this.#allowGrace = opts.allowGraceCall ?? true;\n }\n\n get remaining(): number {\n return this.#remaining;\n }\n\n get total(): number {\n return this.#total;\n }\n\n get compressionAttempts(): number {\n return this.#compressionAttempts;\n }\n\n get graceCallUsed(): boolean {\n return this.#graceCallUsed;\n }\n\n /**\n * Decrement remaining by `amount` (default 1). EC-4 fix: NaN / negative\n * / non-finite values are treated as 0 (no-op) to prevent state corruption.\n */\n consume(amount = 1): void {\n if (!Number.isFinite(amount) || amount <= 0) return;\n this.#remaining = Math.max(0, this.#remaining - amount);\n }\n\n /**\n * Record a compression attempt. Returns `{ allowed: false, reason }` if\n * cap reached — caller MUST honor and abort compression.\n */\n recordCompression(): { allowed: boolean; reason?: string } {\n if (this.#compressionAttempts >= this.#maxCompressions) {\n return {\n allowed: false,\n reason: `compression cap reached (${this.#maxCompressions} per session)`,\n };\n }\n this.#compressionAttempts += 1;\n return { allowed: true };\n }\n\n /**\n * True iff the loop should run another iteration:\n * - remaining > 0, OR\n * - grace not yet used AND grace allowed.\n */\n shouldContinue(): boolean {\n if (this.#remaining > 0) return true;\n if (this.#allowGrace && !this.#graceCallUsed) return true;\n return false;\n }\n\n /**\n * Mark grace call as used. Idempotent — calling more than once is no-op.\n * Caller invokes when `remaining === 0` and takes the last shot.\n */\n useGraceCall(): void {\n this.#graceCallUsed = true;\n }\n}\n","/**\n * Try/catch wrapper that catches BOTH synchronous throws AND async rejections.\n * On error, writes a one-line diagnostic to stderr and returns `fallback`.\n *\n * Used by:\n * - `SystemPromptPipeline` — each provider's `contribute` is wrapped so a\n * broken provider cannot crash the run (ADR D8).\n * - The real agent loop — `SendOptions.onStep` / `onDelta` callbacks are\n * wrapped so a user callback throwing cannot abort the LLM run (ADR D1).\n * - `LocalAgent.send` memory read — corrupt memory file degrades gracefully\n * (edge-case review EC-4).\n *\n * @internal\n */\nexport async function safeCall<T>(\n fn: () => T | Promise<T>,\n fallback: T,\n label = \"safeCall\",\n): Promise<T> {\n try {\n return await fn();\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] ${label} failed: ${message}\\n`);\n return fallback;\n }\n}\n","/**\n * Strip `<think>...</think>` chain-of-thought blocks (T1.2, ADR D96).\n *\n * DeepSeek-R1, Qwen-QwQ, and similar reasoning models emit visible\n * `<think>` blocks in the `content` field. Without stripping, they enter\n * the message history; each turn accumulates 5k+ thinking tokens, and\n * prompt caching invalidates every turn (Hermes v0.2 #174, ~10x cost\n * regression).\n *\n * NOTE on `<think>` in legitimate prose (EC-10): a user/assistant message\n * that deliberately contains the `<think>` token will lose it. This is\n * provider-convention scope — `<think>` is reserved for CoT, never plain\n * content.\n *\n * @internal\n */\n\nconst THINK_PATTERN = /<think>[\\s\\S]*?<\\/think>\\s*/g;\n\nexport interface ThinkStripResult {\n /** Content with `<think>` blocks removed. */\n visible: string;\n /** Combined thinking text (without `<think>` tags), or null if none. */\n thinking: string | null;\n}\n\n/**\n * Extract `<think>...</think>` blocks from content. Returns visible text\n * (for history persistence) and concatenated thinking (for opt-in display).\n *\n * Unclosed `<think>` blocks (no matching `</think>`) are PRESERVED in\n * visible — fail-open semantics so corrupted provider streams don't\n * accidentally strip everything.\n *\n * @internal\n */\nexport function stripThinkBlocks(content: string): ThinkStripResult {\n const matches = [...content.matchAll(THINK_PATTERN)];\n const thinking =\n matches.length > 0\n ? matches\n .map((m) => m[0])\n .join(\"\\n\")\n .replace(/<\\/?think>/g, \"\")\n .trim()\n : null;\n const visible = content.replace(THINK_PATTERN, \"\").trim();\n return { visible, thinking };\n}\n","import type {\n SDKAssistantMessage,\n SDKSystemMessage,\n SDKUserMessageEvent,\n} from \"../../types/messages.js\";\nimport type { LlmContentPart, LlmMessage, LlmToolCallPart } from \"../llm/types.js\";\nimport type { AgentLoopInputs } from \"./loop-types.js\";\n\n/**\n * Message-builder helpers extracted from `loop.ts` (G8 file-size budget).\n * Each function shapes one canonical SDK message variant or the assistant's\n * outgoing LLM turn. Pure functions — no side effects.\n *\n * @internal\n */\n\nexport function buildSystemEvent(inputs: AgentLoopInputs, toolNames: string[]): SDKSystemMessage {\n return {\n type: \"system\",\n subtype: \"init\",\n agent_id: inputs.agentId,\n run_id: inputs.runId,\n model: inputs.model,\n tools: toolNames,\n };\n}\n\nexport function buildUserEvent(inputs: AgentLoopInputs): SDKUserMessageEvent {\n return {\n type: \"user\",\n agent_id: inputs.agentId,\n run_id: inputs.runId,\n message: { role: \"user\", content: [{ type: \"text\", text: inputs.userMessage }] },\n };\n}\n\nexport function buildAssistantEvent(inputs: AgentLoopInputs, text: string): SDKAssistantMessage {\n return {\n type: \"assistant\",\n agent_id: inputs.agentId,\n run_id: inputs.runId,\n message: { role: \"assistant\", content: [{ type: \"text\", text }] },\n };\n}\n\nexport function buildAssistantTurn(text: string, toolCalls: LlmToolCallPart[]): LlmMessage {\n const content: LlmContentPart[] = [];\n if (text.length > 0) content.push({ type: \"text\", text });\n for (const call of toolCalls) content.push(call);\n return { role: \"assistant\", content };\n}\n","import type { SDKMessage, SDKToolUseMessage } from \"../../types/messages.js\";\nimport { generateCallId } from \"../ids.js\";\nimport type { LlmContentPart, LlmToolCallPart } from \"../llm/types.js\";\nimport { checkToolWhitelist } from \"../runtime/async-local-storage.js\";\nimport { runShell, type ShellExecuteOptions } from \"../runtime/shell-tool.js\";\nimport { type RepairableTool, repairToolCall } from \"../tool-dispatch/repair-middleware.js\";\nimport type { AgentLoopInputs } from \"./loop-types.js\";\n\n/**\n * Tool dispatch helpers extracted from the main agent loop. Each call goes\n * through `dispatchSingleCall` which fires `preToolUse` hooks, executes the\n * tool (shell or MCP), and fires `postToolUse` after capturing the result.\n *\n * @internal\n */\n\nexport interface ResolvedTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n origin: \"shell\" | \"mcp\" | \"memory\" | \"custom\";\n mcpServerName?: string;\n mcpToolName?: string;\n /** Direct handler for `origin === \"memory\"` tools — returns JSON-encoded result string. */\n memoryHandler?: (input: Record<string, unknown>) => Promise<string>;\n /** Direct handler for `origin === \"custom\"` tools — user-supplied via `AgentOptions.tools`. */\n customHandler?: (input: Record<string, unknown>) => string | Promise<string>;\n}\n\ninterface ToolResult {\n stdout: string;\n stderr: string;\n exitCode?: number | null;\n}\n\nexport async function dispatchTools(\n inputs: AgentLoopInputs,\n tools: ResolvedTool[],\n toolCalls: LlmToolCallPart[],\n events: SDKMessage[],\n): Promise<LlmContentPart[]> {\n const out: LlmContentPart[] = [];\n for (const call of toolCalls) {\n out.push(await dispatchSingleCall(inputs, tools, call, events));\n }\n return out;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: tool dispatch must check 5 origins (custom/mcp/builtin/handler-tool/missing) and emit running+completed events for each — branching is mirroring the public taxonomy.\nasync function dispatchSingleCall(\n inputs: AgentLoopInputs,\n tools: ResolvedTool[],\n call: LlmToolCallPart,\n events: SDKMessage[],\n): Promise<LlmContentPart> {\n // T4.1 (ADRs D86-D88): apply repair middleware BEFORE the lookup so\n // case-insensitive matches, JSON-stringified args, and type coercion all\n // land before the registry check. Repairs are surfaced via telemetry.\n const registryMap = buildRepairRegistry(tools);\n const repaired = repairToolCall({ name: call.name, args: call.input, id: call.id }, registryMap);\n if (repaired.repairs.length > 0) {\n call = {\n ...call,\n name: repaired.call.name,\n input: (repaired.call.args ?? {}) as Record<string, unknown>,\n };\n }\n // T4.1 (ADR D111): fork tool-whitelist gate fires FIRST — before plugin\n // and file hooks. A fork's allowedTools set is the strictest contract;\n // if the fork didn't authorize the tool, the model never gets to invoke\n // it (no plugin observation, no file-hook trace). Returns a benign\n // tool_result so the model can react in narrative — mirrors D101 veto.\n const callId = generateCallId();\n const whitelistDecision = checkToolWhitelist(call.name);\n if (!whitelistDecision.allowed) {\n events.push(buildToolUseRunning(inputs, callId, call));\n events.push(\n buildToolUseCompleted(inputs, callId, call, {\n stdout: \"\",\n stderr: whitelistDecision.reason ?? \"tool not available in fork\",\n exitCode: 126,\n }),\n );\n return {\n type: \"tool_result\",\n toolUseId: call.id,\n content: `Tool blocked by fork whitelist: ${whitelistDecision.reason}`,\n };\n }\n const resolved = tools.find((tool) => tool.name === call.name);\n const toolSpan = inputs.telemetry?.startSpan(\"tool.call\", {\n \"tool.name\": call.name,\n \"tool.origin\": resolved?.origin ?? \"unknown\",\n callId,\n });\n if (repaired.repairs.length > 0 && toolSpan !== undefined) {\n toolSpan.setAttribute(\"tool.repairs\", repaired.repairs.join(\"; \"));\n }\n if (toolSpan !== undefined && inputs.telemetry?.includeContent === true) {\n toolSpan.addEvent(\"args\", { input: JSON.stringify(call.input) });\n }\n events.push(buildToolUseRunning(inputs, callId, call));\n // T4.2 (ADR D101): plugin `pre_tool_call` hooks fire BEFORE file-based\n // hooks. Plugins are author-supplied (code-level safety); file-based\n // hooks are operator policy. Author intent wins early.\n const pluginVeto = await inputs.pluginManager?.runPreToolCallHooks({\n name: call.name,\n args: call.input,\n agentId: inputs.agentId,\n runId: inputs.runId,\n });\n if (pluginVeto !== undefined) {\n events.push(\n buildToolUseCompleted(inputs, callId, call, {\n stdout: \"\",\n stderr: pluginVeto.message,\n exitCode: 126,\n }),\n );\n return {\n type: \"tool_result\",\n toolUseId: call.id,\n content: `Plugin blocked this tool call: ${pluginVeto.message}`,\n };\n }\n const preDecision = await inputs.hooks.run({\n event: \"preToolUse\",\n tool: call.name,\n input: call.input,\n agentId: inputs.agentId,\n runId: inputs.runId,\n });\n if (preDecision.blocked) {\n events.push(\n buildToolUseCompleted(inputs, callId, call, {\n stdout: \"\",\n stderr: preDecision.reason ?? \"blocked by hook\",\n exitCode: 126,\n }),\n );\n // Surface the denial as a regular tool_result so the model can react\n // (explain to the user, try a different command, etc.). Marking it\n // `isError` would short-circuit the agent loop, which is too harsh —\n // a policy denial is expected behaviour, not a runtime failure.\n return {\n type: \"tool_result\",\n toolUseId: call.id,\n content: `Hook denied this tool call: ${preDecision.reason ?? \"no reason given\"}`,\n };\n }\n // D315-D317 — fire onToolStart BEFORE handler runs. Errors swallowed.\n const startAt = Date.now();\n await safeEmitToolHook(inputs.onToolStart, {\n toolName: call.name,\n args: call.input,\n conversationId: inputs.agentId,\n callId,\n });\n const result = await executeTool(inputs, resolved, call);\n const durationMs = Date.now() - startAt;\n // D315-D317 / EC-6 — fire onToolError when handler stderr/exit signals\n // failure; otherwise onToolEnd. `error` is ALWAYS an Error instance.\n if (result.exitCode !== undefined && result.exitCode !== 0 && result.exitCode !== null) {\n await safeEmitToolHook(inputs.onToolError, {\n toolName: call.name,\n args: call.input,\n error: new Error(result.stderr || `tool exited with code ${result.exitCode}`),\n conversationId: inputs.agentId,\n callId,\n durationMs,\n attempt: 1,\n });\n } else {\n await safeEmitToolHook(inputs.onToolEnd, {\n toolName: call.name,\n args: call.input,\n result: result.stdout,\n conversationId: inputs.agentId,\n callId,\n durationMs,\n });\n }\n toolSpan?.setAttribute(\"exitCode\", result.exitCode ?? 0);\n if (toolSpan !== undefined && inputs.telemetry?.includeContent === true) {\n toolSpan.addEvent(\"result\", { stdout: result.stdout.slice(0, 1000) });\n }\n toolSpan?.end();\n events.push(buildToolUseCompleted(inputs, callId, call, result));\n void inputs.hooks.run({\n event: \"postToolUse\",\n tool: call.name,\n input: call.input,\n output: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n },\n agentId: inputs.agentId,\n runId: inputs.runId,\n });\n return {\n type: \"tool_result\",\n toolUseId: call.id,\n content: renderToolResult(result),\n ...(result.exitCode !== 0 && result.exitCode !== undefined ? { isError: true } : {}),\n };\n}\n\n/**\n * D317 — fire-and-forget tool-lifecycle hook with error swallowed via\n * stderr warn. Single chokepoint so all three callbacks (start/end/error)\n * share the same hardening: a misbehaving listener cannot crash the agent\n * loop.\n *\n * @internal\n */\nasync function safeEmitToolHook<E>(\n callback: ((event: E) => void | Promise<void>) | undefined,\n event: E,\n): Promise<void> {\n if (callback === undefined) return;\n try {\n await callback(event);\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] tool lifecycle hook threw: ${msg}\\n`);\n }\n}\n\nasync function executeTool(\n inputs: AgentLoopInputs,\n resolved: ResolvedTool | undefined,\n call: LlmToolCallPart,\n): Promise<ToolResult> {\n if (resolved === undefined) {\n return { stdout: \"\", stderr: `Unknown tool ${call.name}`, exitCode: 127 };\n }\n if (resolved.origin === \"shell\") return runShellTool(inputs, call);\n if (resolved.origin === \"memory\") return runMemoryTool(resolved, call);\n if (resolved.origin === \"custom\") return runCustomTool(resolved, call);\n return runMcpTool(inputs, resolved, call);\n}\n\nasync function runMemoryTool(resolved: ResolvedTool, call: LlmToolCallPart): Promise<ToolResult> {\n return runHandlerTool(\"memory\", resolved.memoryHandler, call);\n}\n\nasync function runCustomTool(resolved: ResolvedTool, call: LlmToolCallPart): Promise<ToolResult> {\n return runHandlerTool(\"custom\", resolved.customHandler, call);\n}\n\n/**\n * Shared dispatch path for in-process handler tools (memory + custom). Wraps\n * the handler call in try/catch and converts the result into the uniform\n * stdout/stderr/exitCode shape the agent loop consumes.\n */\nasync function runHandlerTool(\n kind: \"memory\" | \"custom\",\n handler: ((input: Record<string, unknown>) => string | Promise<string>) | undefined,\n call: LlmToolCallPart,\n): Promise<ToolResult> {\n if (handler === undefined) {\n return { stdout: \"\", stderr: `${kind} tool ${call.name} has no handler`, exitCode: 127 };\n }\n try {\n const stdout = await handler(call.input);\n return { stdout, stderr: \"\", exitCode: 0 };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n return { stdout: \"\", stderr: message, exitCode: 1 };\n }\n}\n\nasync function runShellTool(inputs: AgentLoopInputs, call: LlmToolCallPart): Promise<ToolResult> {\n const command =\n typeof call.input.command === \"string\" ? call.input.command : JSON.stringify(call.input);\n const shellOptions: ShellExecuteOptions = {\n command,\n cwd: inputs.shellCwd,\n sandbox: inputs.shellSandbox,\n };\n const result = await runShell(shellOptions);\n const final: ToolResult = { stdout: result.stdout, stderr: result.stderr };\n if (result.exitCode !== null && result.exitCode !== undefined) final.exitCode = result.exitCode;\n return final;\n}\n\nasync function runMcpTool(\n inputs: AgentLoopInputs,\n resolved: ResolvedTool,\n call: LlmToolCallPart,\n): Promise<ToolResult> {\n const client = inputs.mcp.get(resolved.mcpServerName ?? \"\");\n if (client === undefined || resolved.mcpToolName === undefined) {\n return {\n stdout: \"\",\n stderr: `MCP server ${resolved.mcpServerName ?? \"?\"} not connected`,\n exitCode: 127,\n };\n }\n try {\n const response = await client.callTool(resolved.mcpToolName, call.input);\n const text = response.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n return { stdout: text, stderr: \"\", exitCode: response.isError === true ? 1 : 0 };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n return { stdout: \"\", stderr: message, exitCode: 1 };\n }\n}\n\nfunction renderToolResult(result: ToolResult): string {\n if (result.stderr.length > 0 && (result.exitCode ?? 0) !== 0) {\n return `${result.stdout}\\n[stderr]\\n${result.stderr}`.trim();\n }\n return result.stdout.trim();\n}\n\nfunction buildToolUseRunning(\n inputs: AgentLoopInputs,\n callId: string,\n call: LlmToolCallPart,\n): SDKToolUseMessage {\n return {\n type: \"tool_call\",\n agent_id: inputs.agentId,\n run_id: inputs.runId,\n call_id: callId,\n name: call.name,\n status: \"running\",\n args: call.input,\n };\n}\n\n/**\n * T4.1 helper: project the agent-loop's ResolvedTool[] into a registry\n * shape consumable by `repairToolCall`. Caller owns the Map lifetime\n * (rebuilt each dispatchSingleCall — O(tools.length) overhead is negligible\n * compared to the LLM round-trip).\n */\nfunction buildRepairRegistry(tools: ResolvedTool[]): ReadonlyMap<string, RepairableTool> {\n const out = new Map<string, RepairableTool>();\n for (const t of tools) {\n out.set(t.name, { name: t.name, inputSchema: t.inputSchema });\n }\n return out;\n}\n\nfunction buildToolUseCompleted(\n inputs: AgentLoopInputs,\n callId: string,\n call: LlmToolCallPart,\n result: ToolResult,\n): SDKToolUseMessage {\n return {\n type: \"tool_call\",\n agent_id: inputs.agentId,\n run_id: inputs.runId,\n call_id: callId,\n name: call.name,\n status: \"completed\",\n args: call.input,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n },\n };\n}\n","import { spawnAndCollect } from \"./spawn-collect.js\";\n\n/**\n * Real shell tool executor. Spawns a single command through `/bin/sh -c`,\n * captures stdout/stderr/exitCode, and honours per-call timeouts.\n *\n * Sandboxing is opt-in via `local.sandboxOptions.enabled`. The current\n * sandbox implementation simply scopes `cwd` to the configured workspace\n * and rejects shell escapes like `cd /` or absolute paths starting with\n * `/etc/`. A future iteration will hook into Node's permission model or a\n * platform-specific sandbox (Bubblewrap / sandbox-exec).\n *\n * @internal\n */\n\nexport interface ShellExecuteOptions {\n command: string;\n cwd: string;\n timeoutMs?: number;\n sandbox?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface ShellExecuteResult {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n}\n\nexport async function runShell(options: ShellExecuteOptions): Promise<ShellExecuteResult> {\n if (options.sandbox === true && isObviouslyUnsafe(options.command)) {\n return {\n stdout: \"\",\n stderr: `Sandbox refused command: ${options.command}`,\n exitCode: 126,\n timedOut: false,\n };\n }\n const result = await spawnAndCollect({\n command: \"sh\",\n args: [\"-c\", options.command],\n cwd: options.cwd,\n ...(options.env !== undefined ? { env: options.env } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n });\n const stderr =\n result.spawnError !== undefined ? result.stderr + result.spawnError.message : result.stderr;\n return {\n stdout: result.stdout,\n stderr,\n exitCode: result.exitCode,\n timedOut: result.timedOut,\n };\n}\n\nfunction isObviouslyUnsafe(command: string): boolean {\n // Cheap allow-list for the sandbox tier — refuse commands that reach\n // outside the workspace or touch sensitive paths. Real isolation will\n // come from process-level sandboxing.\n if (/(^|\\s)(rm|mv|cp)\\s+[^|;]*\\s+\\/(etc|var|root)\\b/.test(command)) return true;\n if (/sudo\\s/.test(command)) return true;\n return false;\n}\n","/**\n * Tool-call repair middleware (T1.1, ADR D87).\n *\n * Applies 3 idempotent repairs sequentially before tool dispatch:\n * 1. Case-insensitive name match (ADR D88 — no fuzzy match)\n * 2. JSON-string args → object parse\n * 3. Type coercion against JSON Schema (string → number/integer/boolean/object)\n *\n * Fixes 10+ provider-specific failure modes catalogued in\n * `.claude/knowledge-base/sdk-references/tool-call-failure-recovery.md`:\n * Hermes v0.2 #444 (DeepSeek JSON), v0.3 #1300 (parallel calls),\n * v0.8 #5265 (type coerce), and similar.\n *\n * NOTE on coerce limits (EC-9): regex `^-?\\d+(\\.\\d+)?$` accepts decimal\n * notation only — scientific (`1e5`), hex (`0xFF`), and `Infinity` are\n * preserved as strings and rejected by downstream schema validation. KISS:\n * 99% of provider-emitted tool args use plain decimal.\n *\n * @internal\n */\n\nexport interface ToolCall {\n name: string;\n args: unknown;\n id: string;\n}\n\nexport interface RepairableTool {\n name: string;\n /** JSON Schema for the tool's input. `properties` map drives coercion. */\n inputSchema: Record<string, unknown>;\n}\n\nexport interface RepairResult {\n call: ToolCall;\n /** Human-readable log of repairs applied (empty when no-op). */\n repairs: string[];\n}\n\nconst DECIMAL_RE = /^-?\\d+(\\.\\d+)?$/;\n\n/**\n * Apply idempotent repairs to a raw tool call from an LLM. Pure function:\n * does NOT mutate `raw` or `registry`. Runs in O(registry.size) for the\n * name lookup; O(properties.length) for coercion.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3 sequential repair stages (name match / args parse / type coerce) live in one function by design — splitting them hides the repair order (ADR D87) that callers reason about via the `repairs` log.\nexport function repairToolCall(\n raw: ToolCall,\n registry: ReadonlyMap<string, RepairableTool>,\n): RepairResult {\n const repairs: string[] = [];\n let call: ToolCall = { ...raw };\n\n // Repair 1: case-insensitive name match. NEVER fuzzy (Hermes posture,\n // ADR D88) — typos get rejected downstream with available-tools list.\n if (!registry.has(call.name)) {\n const lower = call.name.toLowerCase();\n let match: string | undefined;\n for (const key of registry.keys()) {\n if (key.toLowerCase() === lower) {\n match = key;\n break;\n }\n }\n if (match !== undefined) {\n repairs.push(`name: \"${call.name}\" → \"${match}\"`);\n call = { ...call, name: match };\n }\n }\n\n // Repair 2: JSON-string args → object. Some providers stringify args\n // (DeepSeek v0.2 #444, Anthropic intermittently).\n if (typeof call.args === \"string\") {\n try {\n const parsed = JSON.parse(call.args);\n call = { ...call, args: parsed };\n repairs.push(\"args: parsed from string\");\n } catch {\n // Leave as string for downstream validator to reject.\n }\n }\n\n // Repair 3: type coercion against schema (Hermes v0.8 #5265).\n const tool = registry.get(call.name);\n if (\n tool !== undefined &&\n typeof call.args === \"object\" &&\n call.args !== null &&\n !Array.isArray(call.args)\n ) {\n const coerced = coerceArgsToSchema(call.args as Record<string, unknown>, tool.inputSchema);\n if (coerced.changed.length > 0) {\n call = { ...call, args: coerced.value };\n repairs.push(...coerced.changed);\n }\n }\n\n return { call, repairs };\n}\n\nexport interface CoerceResult {\n value: Record<string, unknown>;\n changed: string[];\n}\n\n/**\n * Coerce string-typed args to the schema's declared type. Supports\n * `number`, `integer`, `boolean`, `array`, `object`. Scientific notation,\n * hex, and `Infinity` are out of scope (EC-9 documented limitation).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 5-type coercion ladder (number / integer / boolean / array / object) is exhaustive by design — JSON Schema type taxonomy maps 1:1 to branch arms.\nexport function coerceArgsToSchema(\n args: Record<string, unknown>,\n schema: Record<string, unknown>,\n): CoerceResult {\n const changed: string[] = [];\n const out: Record<string, unknown> = { ...args };\n const properties = schema.properties as Record<string, unknown> | undefined;\n if (properties === undefined) return { value: out, changed };\n\n for (const [key, propDef] of Object.entries(properties)) {\n const val = out[key];\n if (typeof val !== \"string\") continue;\n const propType = (propDef as { type?: unknown }).type;\n if (typeof propType !== \"string\") continue;\n\n if (propType === \"number\" && DECIMAL_RE.test(val.trim())) {\n out[key] = Number(val);\n changed.push(`${key}: string→number`);\n } else if (propType === \"integer\" && /^-?\\d+$/.test(val.trim())) {\n out[key] = Number(val);\n changed.push(`${key}: string→integer`);\n } else if (propType === \"boolean\" && (val === \"true\" || val === \"false\")) {\n out[key] = val === \"true\";\n changed.push(`${key}: string→boolean`);\n } else if (propType === \"array\" || propType === \"object\") {\n try {\n const parsed = JSON.parse(val);\n if (propType === \"array\" && Array.isArray(parsed)) {\n out[key] = parsed;\n changed.push(`${key}: string→array`);\n } else if (\n propType === \"object\" &&\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n out[key] = parsed;\n changed.push(`${key}: string→object`);\n }\n } catch {\n // Not JSON — leave as string for validator.\n }\n }\n }\n\n return { value: out, changed };\n}\n","{\n \"_meta\": {\n \"pricingVersion\": \"litellm-2026-05-snapshot\",\n \"source\": \"https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json\",\n \"fetchedAt\": \"2026-05-27\",\n \"note\": \"Hand-curated snapshot of top models 2026; refresh via scripts/refresh-pricing.mjs. Per-million-tokens USD.\"\n },\n \"models\": {\n \"anthropic/claude-opus-4-7\": {\n \"input\": 5.0,\n \"output\": 25.0,\n \"cacheRead\": 0.5,\n \"cacheWrite\": 6.25\n },\n \"anthropic/claude-opus-4-6\": {\n \"input\": 5.0,\n \"output\": 25.0,\n \"cacheRead\": 0.5,\n \"cacheWrite\": 6.25\n },\n \"anthropic/claude-opus-4-5\": {\n \"input\": 5.0,\n \"output\": 25.0,\n \"cacheRead\": 0.5,\n \"cacheWrite\": 6.25\n },\n \"anthropic/claude-sonnet-4-6\": {\n \"input\": 3.0,\n \"output\": 15.0,\n \"cacheRead\": 0.3,\n \"cacheWrite\": 3.75\n },\n \"anthropic/claude-sonnet-4-5\": {\n \"input\": 3.0,\n \"output\": 15.0,\n \"cacheRead\": 0.3,\n \"cacheWrite\": 3.75\n },\n \"anthropic/claude-haiku-4-5\": {\n \"input\": 1.0,\n \"output\": 5.0,\n \"cacheRead\": 0.1,\n \"cacheWrite\": 1.25\n },\n \"anthropic/claude-3-5-sonnet\": {\n \"input\": 3.0,\n \"output\": 15.0,\n \"cacheRead\": 0.3,\n \"cacheWrite\": 3.75\n },\n \"anthropic/claude-3-5-haiku\": {\n \"input\": 0.8,\n \"output\": 4.0,\n \"cacheRead\": 0.08,\n \"cacheWrite\": 1.0\n },\n \"anthropic/claude-3-opus\": {\n \"input\": 15.0,\n \"output\": 75.0,\n \"cacheRead\": 1.5,\n \"cacheWrite\": 18.75\n },\n \"anthropic/claude-3-haiku\": {\n \"input\": 0.25,\n \"output\": 1.25,\n \"cacheRead\": 0.03,\n \"cacheWrite\": 0.3\n },\n \"openai/gpt-4o\": {\n \"input\": 2.5,\n \"output\": 10.0,\n \"cacheRead\": 1.25\n },\n \"openai/gpt-4o-mini\": {\n \"input\": 0.15,\n \"output\": 0.6,\n \"cacheRead\": 0.075\n },\n \"openai/gpt-4.1\": {\n \"input\": 2.0,\n \"output\": 8.0,\n \"cacheRead\": 0.5\n },\n \"openai/gpt-4.1-mini\": {\n \"input\": 0.4,\n \"output\": 1.6,\n \"cacheRead\": 0.1\n },\n \"openai/gpt-4.1-nano\": {\n \"input\": 0.1,\n \"output\": 0.4,\n \"cacheRead\": 0.025\n },\n \"openai/o3\": {\n \"input\": 10.0,\n \"output\": 40.0,\n \"cacheRead\": 2.5\n },\n \"openai/o3-mini\": {\n \"input\": 1.1,\n \"output\": 4.4,\n \"cacheRead\": 0.55\n },\n \"openai/o4-mini\": {\n \"input\": 1.1,\n \"output\": 4.4,\n \"cacheRead\": 0.275\n },\n \"deepseek/deepseek-chat\": {\n \"input\": 0.14,\n \"output\": 0.28\n },\n \"deepseek/deepseek-reasoner\": {\n \"input\": 0.55,\n \"output\": 2.19\n },\n \"google/gemini-2.5-pro\": {\n \"input\": 1.25,\n \"output\": 10.0\n },\n \"google/gemini-2.5-flash\": {\n \"input\": 0.15,\n \"output\": 0.6\n },\n \"google/gemini-2.0-flash\": {\n \"input\": 0.1,\n \"output\": 0.4\n }\n }\n}\n","/**\n * Pricing registry — bundled snapshot of LiteLLM JSON (ADR D379) with\n * lazy load + alias normalization (EC-2).\n *\n * Snapshot lives in `pricing-data.json` (hand-curated 2026-05; refresh\n * via `scripts/refresh-pricing.mjs`). All rates in USD per 1_000_000\n * tokens (D378).\n *\n * Lookup precedence (EC-2):\n * 1. Direct `provider/model` key\n * 2. Strip date suffix (-YYYYMMDD or -YYYY-MM-DD)\n * 3. Anthropic dot-to-dash normalization (claude-opus-4.7 → claude-opus-4-7)\n * 4. Strip `openrouter/` prefix\n *\n * @internal\n */\n\nimport pricingData from \"./pricing-data.json\" with { type: \"json\" };\n\nexport interface PricingEntry {\n readonly provider: string;\n readonly model: string;\n readonly inputCostPerMillion: number;\n readonly outputCostPerMillion: number;\n readonly cacheReadCostPerMillion?: number;\n readonly cacheWriteCostPerMillion?: number;\n readonly reasoningCostPerMillion?: number;\n readonly pricingVersion: string;\n}\n\ninterface RawModelEntry {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\n reasoning?: number;\n}\n\ninterface RawPricingData {\n _meta: { pricingVersion: string; [k: string]: unknown };\n models: Record<string, RawModelEntry>;\n}\n\nconst data = pricingData as RawPricingData;\n\nfunction buildEntry(key: string, raw: RawModelEntry): PricingEntry {\n const [provider, ...modelParts] = key.split(\"/\");\n return {\n provider: provider ?? \"unknown\",\n model: modelParts.join(\"/\"),\n inputCostPerMillion: raw.input,\n outputCostPerMillion: raw.output,\n ...(raw.cacheRead !== undefined ? { cacheReadCostPerMillion: raw.cacheRead } : {}),\n ...(raw.cacheWrite !== undefined ? { cacheWriteCostPerMillion: raw.cacheWrite } : {}),\n ...(raw.reasoning !== undefined ? { reasoningCostPerMillion: raw.reasoning } : {}),\n pricingVersion: data._meta.pricingVersion,\n };\n}\n\nfunction stripDateSuffix(model: string): string {\n // EC-2: -20250507 or -2025-05-07 at end of name.\n return model.replace(/-\\d{4}-?\\d{2}-?\\d{2}$/, \"\");\n}\n\nfunction normalizeAnthropicDots(model: string): string {\n // EC-2: claude-opus-4.7 → claude-opus-4-7\n return model.replace(/(\\d+)\\.(\\d+)/g, \"$1-$2\");\n}\n\nfunction stripOpenRouterPrefix(modelId: string): string {\n return modelId.startsWith(\"openrouter/\") ? modelId.slice(\"openrouter/\".length) : modelId;\n}\n\nfunction lookupRaw(key: string): RawModelEntry | undefined {\n return data.models[key];\n}\n\n/**\n * Returns the pricing entry for a given `{provider, model}` route.\n * Tries direct lookup, then 3 alias normalizations (EC-2).\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 4-step alias resolution chain (direct → date-strip → dot-norm → openrouter-strip) is intrinsic to the lookup; refactor adds noise without separation.\nexport function getPricingEntry(opts: {\n provider: string;\n model: string;\n baseUrl?: string;\n}): PricingEntry | undefined {\n // OpenRouter normalization: strip prefix if model includes it\n const cleaned = stripOpenRouterPrefix(opts.model);\n const directKey = `${opts.provider}/${cleaned}`;\n\n // 1. Direct\n const direct = lookupRaw(directKey);\n if (direct !== undefined) return buildEntry(directKey, direct);\n\n // 2. Strip date suffix\n const noSuffix = stripDateSuffix(cleaned);\n if (noSuffix !== cleaned) {\n const noSuffixKey = `${opts.provider}/${noSuffix}`;\n const found = lookupRaw(noSuffixKey);\n if (found !== undefined) return buildEntry(noSuffixKey, found);\n }\n\n // 3. Anthropic dot-to-dash\n if (opts.provider === \"anthropic\") {\n const normalized = normalizeAnthropicDots(stripDateSuffix(cleaned));\n const normKey = `${opts.provider}/${normalized}`;\n const found = lookupRaw(normKey);\n if (found !== undefined) return buildEntry(normKey, found);\n }\n\n // 4. Model id contains provider/model (e.g., openrouter passthrough)\n if (cleaned.includes(\"/\")) {\n const found = lookupRaw(cleaned);\n if (found !== undefined) return buildEntry(cleaned, found);\n // Try strip date on the full path too\n const stripped = stripDateSuffix(cleaned);\n if (stripped !== cleaned) {\n const found2 = lookupRaw(stripped);\n if (found2 !== undefined) return buildEntry(stripped, found2);\n }\n }\n\n return undefined;\n}\n\nexport function pricingVersion(): string {\n return data._meta.pricingVersion;\n}\n","/**\n * computeCost — apply pricing entries to a TokenUsage and produce a\n * CostBreakdown (ADRs D377, D378).\n *\n * Edge cases absorbed:\n * - EC-13: negative pricing → status=\"unknown\" + note.\n * - EC-14: reasoning tokens fall back to outputCostPerMillion when\n * dedicated reasoning rate is undefined.\n * - EC-12: money precision via microcent normalization (× 1e6).\n * - \"subscription_included\" routes (Codex CLI, future Claude Pro) →\n * return $0 with status=\"included\".\n * - Provider unknown / pricing missing → status=\"unknown\" with\n * undefined amountUsd (NÃO retorna 0 falso).\n *\n * @internal\n */\n\nimport type { CostBreakdown, TokenUsage } from \"../../types/usage.js\";\nimport { getPricingEntry, type PricingEntry } from \"./pricing-registry.js\";\n\nconst MICROCENT = 1e6;\n\nfunction isSubscriptionIncluded(provider: string): boolean {\n return provider === \"openai-codex\" || provider === \"codex\";\n}\n\nfunction pricingHasValidRates(entry: PricingEntry): boolean {\n // EC-13: negative pricing is corrupt data.\n return (\n entry.inputCostPerMillion >= 0 &&\n entry.outputCostPerMillion >= 0 &&\n (entry.cacheReadCostPerMillion === undefined || entry.cacheReadCostPerMillion >= 0) &&\n (entry.cacheWriteCostPerMillion === undefined || entry.cacheWriteCostPerMillion >= 0) &&\n (entry.reasoningCostPerMillion === undefined || entry.reasoningCostPerMillion >= 0)\n );\n}\n\nfunction costForTokens(tokens: number, perMillion: number): number {\n // EC-12: microcent precision; (tokens × $/Mtok × 1e6) / 1e6 / 1e6\n // Round to microcents to avoid float drift across additions.\n if (tokens === 0 || perMillion === 0) return 0;\n return Math.round((tokens * perMillion * MICROCENT) / 1_000_000) / MICROCENT;\n}\n\ninterface ComputeArgs {\n readonly usage: TokenUsage;\n readonly provider: string;\n readonly model: string;\n readonly baseUrl?: string;\n}\n\n/**\n * Returns CostBreakdown with `status=\"estimated\"`, `\"unknown\"`, or\n * `\"included\"`. Never throws; never returns 0 when pricing is missing.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 5-bucket pricing math + 4 fail-paths is inherently branchy; splitting adds indirection without reducing complexity.\nexport function computeCost(args: ComputeArgs): CostBreakdown {\n // subscription_included route\n if (isSubscriptionIncluded(args.provider)) {\n return {\n amountUsd: 0,\n status: \"included\",\n currency: \"USD\",\n source: \"subscription_included\",\n pricingVersion: undefined,\n };\n }\n\n const entry = getPricingEntry({\n provider: args.provider,\n model: args.model,\n ...(args.baseUrl !== undefined ? { baseUrl: args.baseUrl } : {}),\n });\n if (entry === undefined) {\n return {\n amountUsd: undefined,\n status: \"unknown\",\n currency: \"USD\",\n source: \"unknown\",\n pricingVersion: undefined,\n };\n }\n\n // EC-13: negative pricing entry\n if (!pricingHasValidRates(entry)) {\n return {\n amountUsd: undefined,\n status: \"unknown\",\n currency: \"USD\",\n source: \"unknown\",\n pricingVersion: entry.pricingVersion,\n notes: [\"pricing entry has negative rates; treated as invalid\"],\n };\n }\n\n const notes: string[] = [];\n const detail: {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n reasoning?: number;\n } = {};\n\n const u = args.usage;\n const inputCost = costForTokens(u.inputTokens, entry.inputCostPerMillion);\n const outputCost = costForTokens(u.outputTokens, entry.outputCostPerMillion);\n detail.input = inputCost;\n detail.output = outputCost;\n let total = inputCost + outputCost;\n\n // Cache buckets — only if pricing available, otherwise mark unknown\n if (u.cacheReadTokens !== undefined && u.cacheReadTokens > 0) {\n if (entry.cacheReadCostPerMillion === undefined) {\n return {\n amountUsd: undefined,\n status: \"unknown\",\n currency: \"USD\",\n source: \"litellm_snapshot\",\n pricingVersion: entry.pricingVersion,\n notes: [\"cache-read tokens present but cacheReadCostPerMillion is undefined\"],\n };\n }\n const c = costForTokens(u.cacheReadTokens, entry.cacheReadCostPerMillion);\n detail.cacheRead = c;\n total += c;\n }\n if (u.cacheWriteTokens !== undefined && u.cacheWriteTokens > 0) {\n if (entry.cacheWriteCostPerMillion === undefined) {\n return {\n amountUsd: undefined,\n status: \"unknown\",\n currency: \"USD\",\n source: \"litellm_snapshot\",\n pricingVersion: entry.pricingVersion,\n notes: [\"cache-write tokens present but cacheWriteCostPerMillion is undefined\"],\n };\n }\n const c = costForTokens(u.cacheWriteTokens, entry.cacheWriteCostPerMillion);\n detail.cacheWrite = c;\n total += c;\n }\n\n // EC-14: reasoning tokens fall back to output rate\n if (u.reasoningTokens !== undefined && u.reasoningTokens > 0) {\n const rate = entry.reasoningCostPerMillion ?? entry.outputCostPerMillion;\n const c = costForTokens(u.reasoningTokens, rate);\n detail.reasoning = c;\n total += c;\n if (entry.reasoningCostPerMillion === undefined) {\n notes.push(\"reasoning tokens billed at output rate (no dedicated reasoning rate available)\");\n }\n }\n\n // Round total to microcents\n const amountUsd = Math.round(total * MICROCENT) / MICROCENT;\n\n return {\n amountUsd,\n status: \"estimated\",\n currency: \"USD\",\n source: \"litellm_snapshot\",\n pricingVersion: entry.pricingVersion,\n ...(notes.length > 0 ? { notes } : {}),\n detail,\n };\n}\n","/**\n * Model identifier parsing (T1.2 follow-up, ADR D182 zero-config UX).\n *\n * SDK callers pass model strings like:\n * - `\"ollama/llama3.2:3b\"` → provider=\"ollama\", name=\"llama3.2:3b\"\n * - `\"anthropic/claude-3-5-sonnet\"` → provider=\"anthropic\", name=\"claude-3-5-sonnet\"\n * - `\"openrouter/meta-llama/llama-3\"` → provider=\"openrouter\", name=\"meta-llama/llama-3\"\n * - `\"claude-sonnet-4-6\"` → provider=undefined, name=\"claude-sonnet-4-6\"\n *\n * The first `/` separates the provider from the rest. Models with embedded\n * slashes (e.g. OpenRouter routing) keep the remainder intact. Tag suffixes\n * (`:latest`, `:3b`) are preserved as part of the name — Ollama expects them.\n *\n * **Returns `undefined` provider** when no `/` is present so callers can\n * fall back to env-var detection. Empty/whitespace components are treated\n * as no-prefix.\n *\n * Aligned with OpenClaw `extensions/ollama/src/discovery-shared.ts`\n * (`OLLAMA_PROVIDER_ID = \"ollama\"`) and Hermes `hermes_cli/providers.py`\n * (ALIASES table, `normalize_provider`).\n *\n * @internal\n */\n\nexport interface ParsedModelId {\n /** Provider name extracted from the prefix (lowercase), or undefined. */\n provider: string | undefined;\n /** Model name to send to the provider — prefix stripped. */\n name: string;\n}\n\n/** Provider aliases mirrored from Hermes `hermes_cli/providers.py` ALIASES. */\nconst PROVIDER_ALIASES: Readonly<Record<string, string>> = {\n \"llama-cpp\": \"llamacpp\",\n \"llama.cpp\": \"llamacpp\",\n \"lm-studio\": \"lmstudio\",\n lm_studio: \"lmstudio\",\n};\n\nexport function parseModelId(modelId: string | undefined): ParsedModelId {\n if (modelId === undefined || modelId.length === 0) {\n return { provider: undefined, name: \"\" };\n }\n const slash = modelId.indexOf(\"/\");\n if (slash <= 0 || slash === modelId.length - 1) {\n return { provider: undefined, name: modelId };\n }\n const rawProvider = modelId.slice(0, slash).trim().toLowerCase();\n const name = modelId.slice(slash + 1).trim();\n if (rawProvider.length === 0 || name.length === 0) {\n return { provider: undefined, name: modelId };\n }\n const canonical = PROVIDER_ALIASES[rawProvider] ?? rawProvider;\n return { provider: canonical, name };\n}\n","/**\n * Usage + cost helpers extracted from `loop.ts` (ADRs D376/D377).\n *\n * - `accumulateUsage(usage, llmOutput)` — merge a single LLM turn's 5-bucket\n * token counts into the per-loop {@link UsageAccumulator}. Early-returns\n * when no bucket was populated (avoids spurious zero-step entries on\n * pure-error turns).\n * - `computeUsageCost(inputs, usage)` — resolve provider+model from the\n * `model.id` prefix (with LlmClient.name fallback) and run the pricing\n * registry lookup to produce the matching `CostBreakdown`. Returns\n * `undefined` for the `auto` sentinel model.\n *\n * @internal\n */\n\nimport type { CostBreakdown, TokenUsage } from \"../../types/usage.js\";\nimport { computeCost } from \"../budget/compute-cost.js\";\nimport type { UsageAccumulator } from \"../budget/usage-accumulator.js\";\nimport { parseModelId } from \"../llm/model-identifier.js\";\nimport type { AgentLoopInputs } from \"./loop-types.js\";\n\nexport interface LlmTurnUsage {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}\n\nexport function accumulateUsage(usage: UsageAccumulator, turn: LlmTurnUsage): void {\n // D376: even errored turns may have surfaced partial usage; record them\n // when present so partial-failure runs still expose what was spent.\n const hasAnyToken =\n turn.inputTokens !== undefined ||\n turn.outputTokens !== undefined ||\n turn.cacheReadTokens !== undefined ||\n turn.cacheWriteTokens !== undefined ||\n turn.reasoningTokens !== undefined;\n if (!hasAnyToken) return;\n usage.add({\n inputTokens: turn.inputTokens,\n outputTokens: turn.outputTokens,\n cacheReadTokens: turn.cacheReadTokens,\n cacheWriteTokens: turn.cacheWriteTokens,\n reasoningTokens: turn.reasoningTokens,\n });\n}\n\nexport function computeUsageCost(\n inputs: AgentLoopInputs,\n usage: TokenUsage,\n): CostBreakdown | undefined {\n const modelId = inputs.model.id;\n if (modelId === undefined || modelId === \"auto\") return undefined;\n // Prefer the `provider/model` prefix on the model id (e.g.,\n // `anthropic/claude-opus-4-7`, `openai/gpt-4o-mini`). Fall back to the\n // LlmClient name (e.g., \"openai\" for OpenRouter passthrough). The pricing\n // registry's lookup chain (D376/EC-2) handles the openrouter-prefix and\n // date-suffix variants downstream.\n const parsed = parseModelId(modelId);\n const provider = parsed.provider ?? inputs.llm.name;\n const model = parsed.provider !== undefined ? parsed.name : modelId;\n return computeCost({ provider, model, usage });\n}\n","import type { ConversationTurn } from \"../../types/conversation.js\";\nimport type { SDKMessage } from \"../../types/messages.js\";\nimport type { RunStatus } from \"../../types/run.js\";\nimport { UsageAccumulator } from \"../budget/usage-accumulator.js\";\nimport { generateRequestId } from \"../ids.js\";\nimport type { LlmClient, LlmMessage, LlmTool, LlmToolCallPart } from \"../llm/types.js\";\nimport type { McpClient, McpTool } from \"../mcp/client.js\";\nimport { IterationBudget } from \"../runtime/budget.js\";\nimport { safeCall } from \"../runtime/system-prompt/safe-call.js\";\nimport { stripThinkBlocks } from \"../tool-dispatch/strip-think.js\";\nimport type { AgentLoopErrorDetail, AgentLoopInputs, AgentLoopOutput } from \"./loop-types.js\";\nimport {\n buildAssistantEvent,\n buildAssistantTurn,\n buildSystemEvent,\n buildUserEvent,\n} from \"./message-builders.js\";\nimport { dispatchTools, type ResolvedTool } from \"./tool-dispatch.js\";\nimport { accumulateUsage, computeUsageCost } from \"./usage-and-cost.js\";\n\n/**\n * The real agent loop. Given an LLM client, MCP clients, hooks, and a shell\n * runner, it drives the LLM-tool-LLM cycle until the model stops. All\n * intermediate states surface as `SDKMessage` events so the caller can\n * stream them through `Run.stream()`.\n *\n * @internal\n */\n\nexport type { AgentLoopInputs, AgentLoopOutput } from \"./loop-types.js\";\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: agent loop is the orchestrator — context build, LLM round trip, tool dispatch, stop condition, span lifecycle are deliberately co-located so the streaming contract stays linear.\nexport async function runAgentLoop(inputs: AgentLoopInputs): Promise<AgentLoopOutput> {\n // Root span for the entire send (D34). No-op when telemetry disabled.\n const sendSpan = inputs.telemetry?.startSpan(\"agent.send\", {\n agentId: inputs.agentId,\n runId: inputs.runId,\n \"model.id\": inputs.model.id ?? \"auto\",\n });\n if (sendSpan !== undefined && inputs.telemetry?.includeContent === true) {\n sendSpan.addEvent(\"prompt\", { content: inputs.userMessage });\n }\n try {\n const ctx = await initLoopContext(inputs);\n // T4.2 (ADRs D90-D91): IterationBudget replaces the bare counter so\n // grace-call semantics, compression cap, and EC-4 NaN safety land in\n // one canonical place. Caller-supplied `budget` overrides defaults.\n const budget =\n inputs.budget ?? new IterationBudget({ maxIterations: inputs.maxIterations ?? 8 });\n while (budget.shouldContinue()) {\n const usingGrace = budget.remaining <= 0 && !budget.graceCallUsed;\n if (usingGrace) budget.useGraceCall();\n const decision = await runIteration(inputs, ctx);\n if (decision === \"done\") break;\n if (decision === \"error\") {\n ctx.finalStatus = \"error\";\n break;\n }\n budget.consume();\n }\n if (\n budget.shouldContinue() === false &&\n ctx.finalStatus === \"finished\" &&\n ctx.finalText === \"\"\n ) {\n // Budget + grace exhausted without final answer — surface as error.\n ctx.finalStatus = \"error\";\n }\n sendSpan?.setAttribute(\"status\", ctx.finalStatus);\n if (inputs.telemetry?.includeContent === true && ctx.finalText.length > 0) {\n sendSpan?.addEvent(\"response\", { content: ctx.finalText });\n }\n // D376 / D377: surface aggregated token usage + cost on the loop output\n // so RunResult.usage / RunResult.cost can be populated by the runtime.\n const usage = ctx.usage.hasAny() ? ctx.usage.toTokenUsage() : undefined;\n const cost = usage !== undefined ? computeUsageCost(inputs, usage) : undefined;\n if (usage !== undefined) {\n sendSpan?.setAttributes({\n totalInputTokens: usage.inputTokens,\n totalOutputTokens: usage.outputTokens,\n ...(cost?.amountUsd !== undefined ? { totalCostUsd: cost.amountUsd } : {}),\n });\n }\n return {\n events: ctx.events,\n finalStatus: ctx.finalStatus,\n result: ctx.finalText,\n conversation: ctx.conversation,\n ...(usage !== undefined ? { usage } : {}),\n ...(cost !== undefined ? { cost } : {}),\n // Finding-B fix: surface structured error so runtime can package\n // it as RunResult.error instead of leaking it as assistant content.\n ...(ctx.error !== undefined ? { error: ctx.error } : {}),\n };\n } finally {\n sendSpan?.end();\n }\n}\n\ninterface LoopContext {\n events: SDKMessage[];\n conversation: ConversationTurn[];\n messages: LlmMessage[];\n tools: ResolvedTool[];\n finalText: string;\n finalStatus: RunStatus;\n /** D376: per-loop UsageAccumulator merging every LLM step. */\n usage: UsageAccumulator;\n /**\n * Finding-B fix: structured transport/provider error. Set-once invariant\n * (first-error-wins, ADR D3). When set, the loop returns with\n * `finalStatus: \"error\"` and copies this verbatim onto `AgentLoopOutput.error`.\n */\n error?: AgentLoopErrorDetail;\n}\n\nasync function initLoopContext(inputs: AgentLoopInputs): Promise<LoopContext> {\n const tools = await collectTools(inputs.mcp);\n for (const memTool of inputs.memoryTools ?? []) {\n tools.push({\n name: memTool.name,\n description: memTool.description,\n inputSchema: memTool.inputSchema,\n origin: \"memory\",\n memoryHandler: memTool.execute,\n });\n }\n for (const customTool of inputs.customTools ?? []) {\n tools.push({\n name: customTool.name,\n description: customTool.description,\n inputSchema: customTool.inputSchema,\n origin: \"custom\",\n customHandler: customTool.handler,\n });\n }\n const events: SDKMessage[] = [\n buildSystemEvent(\n inputs,\n tools.map((t) => t.name),\n ),\n buildUserEvent(inputs),\n ];\n const priorMessages: LlmMessage[] = (inputs.priorMessages ?? []).map((msg) => ({\n role: msg.role,\n content: [{ type: \"text\", text: msg.text }],\n }));\n return {\n events,\n conversation: [],\n messages: [\n ...priorMessages,\n { role: \"user\", content: [{ type: \"text\", text: inputs.userMessage }] },\n ],\n tools,\n finalText: \"\",\n finalStatus: \"finished\",\n usage: new UsageAccumulator(),\n };\n}\n\nasync function runIteration(\n inputs: AgentLoopInputs,\n ctx: LoopContext,\n): Promise<\"continue\" | \"done\" | \"error\"> {\n const llmOutput = await streamLlmTurn(inputs, ctx);\n accumulateUsage(ctx.usage, llmOutput);\n return continueOrTerminate(inputs, ctx, llmOutput);\n}\n\nasync function continueOrTerminate(\n inputs: AgentLoopInputs,\n ctx: LoopContext,\n llmOutput: LlmTurnOutput,\n): Promise<\"continue\" | \"done\" | \"error\"> {\n if (llmOutput.errored) return \"error\";\n if (llmOutput.text.length > 0) {\n ctx.events.push(buildAssistantEvent(inputs, llmOutput.text));\n ctx.conversation.push({\n type: \"agentConversationTurn\",\n turn: { steps: [{ type: \"assistantMessage\", message: { text: llmOutput.text } }] },\n });\n ctx.finalText = llmOutput.text;\n if (inputs.onStep !== undefined) {\n const cb = inputs.onStep;\n await safeCall(\n () => cb({ step: { type: \"assistantMessage\", message: { text: llmOutput.text } } }),\n undefined,\n \"SendOptions.onStep\",\n );\n }\n }\n if (llmOutput.stopReason !== \"tool_use\" || llmOutput.toolCalls.length === 0) {\n ctx.finalStatus = \"finished\";\n return \"done\";\n }\n ctx.messages.push(buildAssistantTurn(llmOutput.text, llmOutput.toolCalls));\n const toolResults = await dispatchTools(inputs, ctx.tools, llmOutput.toolCalls, ctx.events);\n ctx.messages.push({ role: \"user\", content: toolResults });\n if (inputs.onStep !== undefined) {\n const cb = inputs.onStep;\n for (const call of llmOutput.toolCalls) {\n await safeCall(\n () =>\n cb({\n step: {\n type: \"toolCall\",\n message: { callId: call.id, name: call.name, args: call.input },\n },\n }),\n undefined,\n \"SendOptions.onStep\",\n );\n }\n }\n if (toolResults.some((part) => part.type === \"tool_result\" && part.isError === true)) {\n return \"error\";\n }\n return \"continue\";\n}\n\ninterface LlmTurnOutput {\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: string;\n errored: boolean;\n /** D376: per-turn token counts (5 buckets). */\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}\n\nasync function streamLlmTurn(inputs: AgentLoopInputs, ctx: LoopContext): Promise<LlmTurnOutput> {\n const llmSpan = inputs.telemetry?.startSpan(\"llm.call\", {\n \"model.id\": inputs.model.id ?? \"auto\",\n provider: inputs.llm.name,\n });\n // D318 — propagate caller's AbortSignal down to the LLM transport. The LLM\n // clients already accept `signal` via `fetch({ signal })`; the bug fixed\n // here is that production paths used a fresh, never-aborting controller.\n const signal = inputs.signal ?? new AbortController().signal;\n const generator = inputs.llm.stream(\n {\n model: inputs.model.id ?? \"auto\",\n ...(inputs.systemPrompt !== undefined ? { system: inputs.systemPrompt } : {}),\n messages: ctx.messages,\n tools: ctx.tools.map(toLlmTool),\n },\n signal,\n );\n const collected = await collectLlmEvents(generator, inputs, ctx);\n if (collected.errored || collected.finishValue === undefined) {\n llmSpan?.setAttribute(\"stopReason\", \"error\");\n llmSpan?.end();\n return {\n text: collected.accumulatedText,\n toolCalls: [],\n stopReason: \"error\",\n errored: true,\n };\n }\n const result = collected.finishValue.value as Awaited<\n ReturnType<LlmClient[\"stream\"]>\n > extends AsyncGenerator<unknown, infer R, unknown>\n ? R\n : never;\n llmSpan?.setAttributes({\n stopReason: result.stopReason,\n inputTokens: result.inputTokens ?? 0,\n outputTokens: result.outputTokens ?? 0,\n });\n llmSpan?.end();\n // T4.1 (ADR D96): strip `<think>` blocks BEFORE returning text. This\n // prevents DeepSeek-R1 / Qwen-QwQ chain-of-thought from polluting the\n // message history (Hermes v0.2 #174). Visible answer + tool calls only.\n const stripped = stripThinkBlocks(collected.accumulatedText);\n return {\n text: stripped.visible,\n toolCalls: result.toolCalls,\n stopReason: result.stopReason,\n errored: false,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n cacheReadTokens: result.cacheReadTokens,\n cacheWriteTokens: result.cacheWriteTokens,\n reasoningTokens: result.reasoningTokens,\n };\n}\n\ninterface CollectedEvents {\n accumulatedText: string;\n errored: boolean;\n finishValue: Awaited<ReturnType<ReturnType<LlmClient[\"stream\"]>[\"next\"]>> | undefined;\n}\n\nasync function collectLlmEvents(\n generator: ReturnType<LlmClient[\"stream\"]>,\n inputs: AgentLoopInputs,\n ctx: LoopContext,\n): Promise<CollectedEvents> {\n let accumulatedText = \"\";\n let errored = false;\n let finishValue: CollectedEvents[\"finishValue\"];\n try {\n const result = await runCollectorLoop(generator, inputs, ctx);\n accumulatedText = result.accumulatedText;\n errored = result.errored;\n finishValue = result.finishValue;\n } catch (cause) {\n // Finding-B fix (sdk-error-packaging-fix-plan v1.1):\n // Split the two paths the previous single-text branch collapsed.\n // 1. Abort → preserve `\"[aborted]\"` SDKAssistantMessage (UX seam).\n // 2. Transport / provider error → populate ctx.error so the error\n // surfaces structured on AgentLoopOutput.error and downstream\n // RunResult.error. NEVER emit an assistant message — that was\n // the leak Finding B exposed.\n // EC-7 DOCUMENT: non-Error throws (e.g., `throw \"boom\"`) stringify\n // via `String(cause)` — accepted (matches Node convention).\n if (inputs.signal?.aborted === true) {\n ctx.finalText = \"[aborted]\";\n ctx.events.push(buildAssistantEvent(inputs, \"[aborted]\"));\n } else {\n registerLoopError(ctx, cause);\n ctx.finalText = \"\";\n }\n errored = true;\n }\n return { accumulatedText, errored, finishValue };\n}\n\n/**\n * Set-once invariant (ADR D3, EC-3-A): first error wins. Once `ctx.error`\n * is populated, subsequent transport / provider errors in the same run are\n * dropped — they DO NOT overwrite the first error. EC-1 MUST FIX:\n * `cause.code` is typeof-guarded so a non-string value never lands on the\n * wire as the literal `\"undefined\"`.\n *\n * Accepts either a thrown `Error` (catch path) or an `LlmEvent` of shape\n * `{ type: \"error\", message, code? }` (in-stream error event) — both\n * carry `.message` so we extract it before falling back to `String(...)`.\n *\n * @internal — finding-b fix\n */\nfunction registerLoopError(ctx: LoopContext, cause: unknown): void {\n if (ctx.error !== undefined) return;\n const rawMessage = (cause as { message?: unknown } | null | undefined)?.message;\n const message =\n typeof rawMessage === \"string\"\n ? rawMessage\n : cause instanceof Error\n ? cause.message\n : String(cause);\n const rawCode = (cause as { code?: unknown } | null | undefined)?.code;\n const code = typeof rawCode === \"string\" ? rawCode : undefined;\n ctx.error = code !== undefined ? { message, code, cause } : { message, cause };\n}\n\nasync function runCollectorLoop(\n generator: ReturnType<LlmClient[\"stream\"]>,\n inputs: AgentLoopInputs,\n ctx: LoopContext,\n): Promise<{\n accumulatedText: string;\n errored: boolean;\n finishValue: CollectedEvents[\"finishValue\"];\n}> {\n let accumulatedText = \"\";\n let errored = false;\n let finishValue: CollectedEvents[\"finishValue\"];\n while (true) {\n const next = await generator.next();\n if (next.done === true) {\n finishValue = next;\n break;\n }\n if (next.value.type === \"text_delta\") {\n accumulatedText += next.value.text;\n await emitTextDeltaCallback(inputs, next.value.text);\n }\n if (next.value.type === \"error\") {\n // Finding-B fix: LLM in-stream error event MUST surface via\n // ctx.error (set-once), NEVER as an assistant message. EC-1\n // typeof guard inside registerLoopError covers `next.value.code`.\n registerLoopError(ctx, next.value);\n ctx.finalText = \"\";\n errored = true;\n break;\n }\n }\n return { accumulatedText, errored, finishValue };\n}\n\nasync function emitTextDeltaCallback(inputs: AgentLoopInputs, text: string): Promise<void> {\n if (inputs.onDelta === undefined) return;\n const cb = inputs.onDelta;\n await safeCall(\n () => cb({ update: { type: \"text-delta\", text } }),\n undefined,\n \"SendOptions.onDelta\",\n );\n}\n\nasync function collectTools(mcp: Map<string, McpClient>): Promise<ResolvedTool[]> {\n const tools: ResolvedTool[] = [\n {\n name: \"shell\",\n description: \"Run a shell command in the workspace and return stdout/stderr.\",\n inputSchema: {\n type: \"object\",\n required: [\"command\"],\n properties: { command: { type: \"string\", description: \"The shell command to run.\" } },\n },\n origin: \"shell\",\n },\n ];\n for (const [serverName, client] of mcp.entries()) {\n const mcpTools = await safeListTools(client);\n for (const tool of mcpTools) {\n tools.push({\n name: `mcp_${sanitize(serverName)}_${sanitize(tool.name)}`,\n description: tool.description,\n inputSchema: tool.inputSchema,\n origin: \"mcp\",\n mcpServerName: serverName,\n mcpToolName: tool.name,\n });\n }\n }\n return tools;\n}\n\nasync function safeListTools(client: McpClient): Promise<McpTool[]> {\n try {\n return await client.listTools();\n } catch {\n return [];\n }\n}\n\nfunction toLlmTool(tool: ResolvedTool): LlmTool {\n return { name: tool.name, description: tool.description, inputSchema: tool.inputSchema };\n}\n\nfunction sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9-]+/g, \"_\").replace(/^[_-]+|[_-]+$/g, \"\");\n}\n\n/** Generate a request id for telemetry. @internal */\nexport function buildRequestId(): string {\n return generateRequestId();\n}\n","import { NetworkError } from \"../../errors.js\";\nimport { relayStream, tryFirstEvent } from \"./stream-relay.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * Chain-aware `LlmClient` wrapper (ADR D2 — provider fallback failover).\n *\n * On every `stream()`, tries each underlying client in order. When the first\n * `.next()` of a client's generator throws `NetworkError`, the wrapper logs\n * a diagnostic and tries the next client. Once the first event has yielded\n * from a client, the failover is OFF for that generator — partial output\n * would corrupt the stream.\n *\n * Per edge-case review EC-3, the wrapper checks `signal.aborted` BEFORE\n * iterating to the next client so a caller-side cancellation does not burn\n * a fallback HTTP round-trip.\n *\n * When every client fails, the LAST `NetworkError` is re-thrown so the\n * caller still receives a typed error.\n *\n * @internal\n */\nexport class FallbackLlmClient implements LlmClient {\n readonly name = \"fallback\";\n\n constructor(private readonly clients: ReadonlyArray<LlmClient>) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n let lastError: NetworkError | undefined;\n for (const client of this.clients) {\n if (signal.aborted) throw abortError(signal);\n const attempt = await tryFirstEvent(client, request, signal, true);\n if (attempt.kind === \"handshake_error\") {\n lastError = attempt.error as NetworkError;\n continue;\n }\n return yield* relayStream(attempt.generator, attempt.firstResult);\n }\n if (lastError !== undefined) throw lastError;\n throw new NetworkError(\"FallbackLlmClient has no providers configured\", {\n code: \"fallback_empty_chain\",\n });\n }\n}\n\nfunction abortError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n return new Error(signal.reason !== undefined ? String(signal.reason) : \"aborted\");\n}\n","/**\n * Shared streaming helpers for `LlmClient` wrappers\n * (`FallbackLlmClient`, `PoolAwareLlmClient`).\n *\n * `tryFirstEvent` probes the first chunk of a stream to decide\n * whether the handshake succeeded. If it raises an\n * `AuthenticationError`/`RateLimitError`/`NetworkError`, the wrapper\n * captures the typed error for routing (rotate vs fallback) WITHOUT\n * starting the actual yield. Once the first event lands, the stream\n * is committed and partial-output cannot be reverted.\n *\n * `relay` yields the prefetched first chunk and then forwards the\n * remaining generator output verbatim.\n *\n * @internal\n */\n\nimport { AuthenticationError, NetworkError, RateLimitError } from \"../../errors.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * Outcome of probing a client's first stream event.\n *\n * @internal\n */\nexport type StreamAttempt =\n | {\n kind: \"ok\";\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>;\n firstResult: IteratorResult<LlmEvent, LlmFinish>;\n }\n | { kind: \"handshake_error\"; error: RateLimitError | AuthenticationError | NetworkError };\n\n/**\n * Try to obtain the FIRST event from `client.stream(...)`. Typed\n * provider failures surface as `kind: \"handshake_error\"`; everything\n * else propagates upward unchanged.\n *\n * Optionally writes a `[theokit-sdk] provider X failed (CODE): falling back`\n * line to stderr when `logFallback` is true — used by `FallbackLlmClient`.\n *\n * @internal\n */\nexport async function tryFirstEvent(\n client: LlmClient,\n request: LlmRequest,\n signal: AbortSignal,\n logFallback = false,\n): Promise<StreamAttempt> {\n const generator = client.stream(request, signal);\n try {\n const firstResult = await generator.next();\n return { kind: \"ok\", generator, firstResult };\n } catch (cause) {\n if (\n cause instanceof NetworkError ||\n cause instanceof RateLimitError ||\n cause instanceof AuthenticationError\n ) {\n if (logFallback) {\n const errCode = cause.metadata?.code ?? cause.code ?? \"unknown\";\n process.stderr.write(\n `[theokit-sdk] provider ${client.name} failed (${errCode}): falling back\\n`,\n );\n }\n return { kind: \"handshake_error\", error: cause };\n }\n throw cause;\n }\n}\n\n/**\n * Yield the prefetched first event, then forward the rest of the\n * generator. Identical to a normal `yield*` but with the lookahead\n * already in hand from `tryFirstEvent`.\n *\n * @internal\n */\nexport async function* relayStream(\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>,\n firstResult: IteratorResult<LlmEvent, LlmFinish>,\n): AsyncGenerator<LlmEvent, LlmFinish, void> {\n if (firstResult.done === true) return firstResult.value;\n yield firstResult.value;\n while (true) {\n const next = await generator.next();\n if (next.done === true) return next.value;\n yield next.value;\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport {\n discoverProviderPlugins,\n getProviderProfile,\n type ProviderProfile,\n registerBuiltins,\n} from \"../providers/index.js\";\nimport { AnthropicClient } from \"./anthropic.js\";\nimport { BedrockAnthropicClient } from \"./bedrock-anthropic.js\";\nimport { CredentialPool, newPooledCredential } from \"./credential-pool.js\";\nimport { currentCredentialPool } from \"./credential-pool-context.js\";\nimport type { CredentialPoolStrategy } from \"./credential-pool-types.js\";\nimport { maybeWrapWithFaultInjection } from \"./fault-injection.js\";\nimport { OllamaNativeClient } from \"./ollama-native.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport { PoolAwareLlmClient } from \"./pool-aware-client.js\";\nimport type { LlmClient } from \"./types.js\";\nimport { VertexRouterClient } from \"./vertex-router.js\";\n\n/**\n * Provider router (T4.3, ADRs D105-D107).\n *\n * Resolves an `LlmClient` from a `ProviderProfile`. The profile is the\n * data; the transport is selected by `apiMode`. Builtins are eagerly\n * registered on first call; user plugins in `~/.theokit/plugins/\n * model-providers/` are lazy-loaded.\n *\n * @internal\n */\n\nexport type ProviderName = \"anthropic\" | \"openai\" | \"openrouter\" | (string & {});\n\nexport interface ProviderRouterOptions {\n primary: ProviderName;\n fallback?: ProviderName[];\n /** Credential pools per provider (ADRs D123-D133). Optional. */\n apiKeys?: Record<string, string[]>;\n /** Pool rotation strategy per provider. Optional; default `\"fill_first\"`. */\n credentialPoolStrategy?: Record<string, CredentialPoolStrategy>;\n}\n\nexport async function resolveProviderChainAsync(\n options: ProviderRouterOptions,\n): Promise<LlmClient[]> {\n registerBuiltins();\n await discoverProviderPlugins();\n return buildChain(options);\n}\n\n/**\n * Sync variant. Kept for backward compat with existing callers that\n * already invoked discovery upfront (e.g., via Agent.create initialization).\n * Builtins are still eagerly registered.\n */\nexport function resolveProviderChain(options: ProviderRouterOptions): LlmClient[] {\n registerBuiltins();\n return buildChain(options);\n}\n\nfunction buildChain(options: ProviderRouterOptions): LlmClient[] {\n // EC-B: warn (once) on apiKeys entries for providers we don't recognize.\n warnUnknownProvidersInApiKeys(options.apiKeys);\n\n const seen = new Set<string>();\n const clients: LlmClient[] = [];\n const addClient = (name: ProviderName): void => {\n const lowered = name.toLowerCase();\n if (seen.has(lowered)) return;\n seen.add(lowered);\n const client = buildClient(lowered, options);\n // D14: wrap every resolved client with the fault-injection decorator.\n // The wrapper is a cheap noop unless `NODE_ENV=test` AND\n // `THEOKIT_TEST_RESPONSE_OVERRIDE` are both set — production is unaffected.\n if (client !== undefined) clients.push(maybeWrapWithFaultInjection(client));\n };\n addClient(options.primary);\n for (const fallback of options.fallback ?? []) addClient(fallback);\n if (clients.length === 0) {\n throw new ConfigurationError(\n `No provider client could be resolved (primary=${options.primary}). ` +\n `Set ANTHROPIC_API_KEY or OPENAI_API_KEY / OPENROUTER_API_KEY.`,\n { code: \"provider_unresolved\" },\n );\n }\n return clients;\n}\n\nfunction buildClient(name: string, routerOptions: ProviderRouterOptions): LlmClient | undefined {\n const profile = getProviderProfile(name);\n if (profile === undefined) return undefined;\n const ambient = currentCredentialPool(name);\n if (ambient !== undefined) {\n return new PoolAwareLlmClient(ambient, (apiKey) => selectTransport(profile, apiKey));\n }\n const poolKeys = filterPoolKeys(routerOptions.apiKeys?.[name]);\n const noAuthOverride = maybeBuildNoAuthTransport(profile, poolKeys);\n if (noAuthOverride !== undefined) return noAuthOverride;\n return buildPoolOrSingle({ name, profile, poolKeys, routerOptions });\n}\n\n/**\n * EC-C MUST FIX (ADR D187): `authType: \"none\"` providers ignore apiKeys.\n * Building a CredentialPool against a runtime without auth is semantically\n * meaningless; emit one-shot warn and route to the sentinel transport.\n */\nfunction maybeBuildNoAuthTransport(\n profile: ProviderProfile,\n poolKeys: string[] | undefined,\n): LlmClient | undefined {\n if (profile.authType !== \"none\" || poolKeys === undefined || poolKeys.length === 0) {\n return undefined;\n }\n warnNoAuthApiKeysIgnoredOnce(profile.name);\n const sentinel = sentinelForNoAuth(profile);\n if (sentinel === undefined) return undefined;\n return selectTransport(profile, sentinel);\n}\n\n/** Pool path for ≥2 keys; single-key fast path otherwise; sentinel fallback. */\nfunction buildPoolOrSingle(args: {\n name: string;\n profile: ProviderProfile;\n poolKeys: string[] | undefined;\n routerOptions: ProviderRouterOptions;\n}): LlmClient | undefined {\n const { name, profile, poolKeys, routerOptions } = args;\n if (poolKeys !== undefined && poolKeys.length >= 2) {\n const strategy = routerOptions.credentialPoolStrategy?.[name] ?? \"fill_first\";\n const entries = poolKeys.map((accessToken, priority) =>\n newPooledCredential({ provider: name, accessToken, priority, source: \"manual\" }),\n );\n const pool = new CredentialPool(name, entries, strategy);\n return new PoolAwareLlmClient(pool, (apiKey) => selectTransport(profile, apiKey));\n }\n // 1-entry pool / single-key fast path: prefer explicit apiKeys[name] over env.\n // D182: `authType: \"none\"` providers fall back to a sentinel placeholder\n // when no key is set — transports that ignore the Authorization header still work.\n // D286/D288: `aws_bearer` / `gcp_oauth` profiles use a lazy sentinel so the\n // client can resolve real credentials at stream time (helpful error if missing).\n const apiKey =\n poolKeys?.[0] ??\n resolveApiKey(profile.envVars) ??\n sentinelForNoAuth(profile) ??\n sentinelForLazyAuth(profile);\n if (apiKey === undefined) return undefined;\n return selectTransport(profile, apiKey);\n}\n\nfunction resolveBaseUrlEnvOverride(providerName: string): string | undefined {\n switch (providerName) {\n case \"openai\":\n return process.env.OPENAI_API_BASE_URL;\n case \"openrouter\":\n return process.env.OPENROUTER_API_BASE_URL;\n case \"ollama\":\n return process.env.OLLAMA_HOST;\n case \"lmstudio\":\n return process.env.LMSTUDIO_HOST;\n case \"llamacpp\":\n return process.env.LLAMACPP_HOST;\n default:\n return undefined;\n }\n}\n\n// EC-C: one-shot warn keyed by provider name.\nconst warnedNoAuthApiKeys = new Set<string>();\nfunction warnNoAuthApiKeysIgnoredOnce(provider: string): void {\n if (warnedNoAuthApiKeys.has(provider)) return;\n warnedNoAuthApiKeys.add(provider);\n process.stderr.write(\n `[theokit-sdk] provider \"${provider}\" has authType: \"none\" — apiKeys ignored (no auth required for local runtime).\\n`,\n );\n}\n\n/** Test-only reset. @internal */\nexport function _resetNoAuthApiKeyWarnings(): void {\n warnedNoAuthApiKeys.clear();\n}\n\n/**\n * D182: providers declaring `authType: \"none\"` use a placeholder credential\n * so the OpenAI-compat transport keeps working. The placeholder value is\n * never sensitive — local runtimes ignore the Authorization header.\n */\nfunction sentinelForNoAuth(profile: ProviderProfile): string | undefined {\n return profile.authType === \"none\" ? profile.name : undefined;\n}\n\n/**\n * D286 / D288: providers with lazy-resolved auth (Bedrock Bearer via\n * `@aws/bedrock-token-generator`, Vertex via `google-auth-library`) may not\n * have credentials available at construction time — the client resolves\n * them per-request and throws helpful `ConfigurationError` if missing\n * (EC-1, EC-6 absorbed). Use a placeholder so the router still builds\n * the client; the user sees the helpful error on the first `agent.send`.\n */\nfunction sentinelForLazyAuth(profile: ProviderProfile): string | undefined {\n if (profile.authType === \"aws_bearer\") return \"__bedrock_lazy_token__\";\n if (profile.authType === \"gcp_oauth\") return \"__vertex_lazy_token__\";\n return undefined;\n}\n\nfunction filterPoolKeys(keys: string[] | undefined): string[] | undefined {\n if (keys === undefined) return undefined;\n const cleaned = keys.filter((k) => typeof k === \"string\" && k.length > 0);\n return cleaned.length === 0 ? undefined : cleaned;\n}\n\nconst warnedProviders = new Set<string>();\nfunction warnUnknownProvidersInApiKeys(apiKeys: Record<string, string[]> | undefined): void {\n if (apiKeys === undefined) return;\n for (const name of Object.keys(apiKeys)) {\n if (warnedProviders.has(name)) continue;\n const profile = getProviderProfile(name);\n if (profile === undefined) {\n warnedProviders.add(name);\n process.stderr.write(\n `[theokit-sdk] credential-pool: unknown provider \"${name}\" in apiKeys (no profile registered)\\n`,\n );\n }\n }\n}\n\n/** Test-only reset. @internal */\nexport function _resetCredentialPoolWarnings(): void {\n warnedProviders.clear();\n}\n\n/**\n * EC-10: resolve API key from ordered envVars list; first non-empty wins.\n */\nfunction resolveApiKey(envVars: ReadonlyArray<string>): string | undefined {\n for (const v of envVars) {\n const value = process.env[v];\n if (value !== undefined && value.length > 0) return value;\n }\n return undefined;\n}\n\n/**\n * EC-3 fix: exhaustive switch with actionable error on unsupported apiMode.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 4-mode transport ladder (chat_completions / anthropic_messages / responses_api / bedrock) + Ollama native dispatch (D191) + per-provider envOverride is one cohesive switch — splitting hurts readability and obscures the dispatch contract.\nfunction selectTransport(profile: ProviderProfile, apiKey: string): LlmClient {\n if (profile.apiMode === \"chat_completions\") {\n // ADR D191 (T8.1 dogfood fix): Ollama tool calling REQUIRES the native\n // `/api/chat` endpoint. OpenAI-compat `/v1/chat/completions` causes\n // models to emit raw tool JSON as plain text — confirmed via OpenClaw\n // upstream warning and our own dogfood of telegram-pro.\n if (profile.name === \"ollama\") {\n const ollamaBase = process.env.OLLAMA_HOST ?? profile.baseUrl;\n return new OllamaNativeClient({ apiKey, baseUrl: ollamaBase });\n }\n const opts: ConstructorParameters<typeof OpenAIClient>[0] = { apiKey };\n opts.baseUrl = profile.baseUrl;\n // T1.1 (ADR D185): forward provider name so OpenAIClient can dispatch\n // Ollama-specific error mapping for ECONNREFUSED / 404-not-pulled / 503-loading.\n opts.providerName = profile.name;\n if (profile.name === \"openai\" && process.env.OPENAI_ORGANIZATION !== undefined) {\n opts.organization = process.env.OPENAI_ORGANIZATION;\n }\n // Honor explicit base URL overrides for cloud providers + the local\n // `authType: \"none\"` family (D182, D188, D189). All four `_HOST` /\n // `_API_BASE_URL` vars are intentionally separate so users can mix\n // remote-box pointing without disturbing the others.\n const envOverride = resolveBaseUrlEnvOverride(profile.name);\n if (envOverride !== undefined) opts.baseUrl = envOverride;\n return new OpenAIClient(opts);\n }\n if (profile.apiMode === \"anthropic_messages\") {\n // Vertex sub-dispatch (D301): when profile.name === \"vertex\", route to\n // VertexRouterClient which picks Gemini vs Anthropic at stream time.\n // apiKey is either a real Bearer token (rare — caller passed it\n // explicitly) or the lazy sentinel `__vertex_lazy_token__` — strip\n // the latter so the client falls through to ADC discovery (D288).\n if (profile.name === \"vertex\") {\n const realKey = apiKey === \"__vertex_lazy_token__\" ? undefined : apiKey;\n return new VertexRouterClient(realKey !== undefined ? { apiKey: realKey } : {});\n }\n const opts: ConstructorParameters<typeof AnthropicClient>[0] = { apiKey };\n opts.baseUrl = process.env.ANTHROPIC_API_BASE_URL ?? profile.baseUrl;\n return new AnthropicClient(opts);\n }\n if (profile.apiMode === \"bedrock_anthropic\") {\n // D301: dedicated Bedrock InvokeModel client. apiKey from env when set;\n // strip the lazy sentinel so client triggers @aws/bedrock-token-generator (D287).\n const realKey = apiKey === \"__bedrock_lazy_token__\" ? undefined : apiKey;\n return new BedrockAnthropicClient(realKey !== undefined ? { apiKey: realKey } : {});\n }\n throw new ConfigurationError(\n `Provider \"${profile.name}\" requires apiMode \"${profile.apiMode}\" but no transport is registered. ` +\n `Install a third-party transport plugin (@theokit-transport-${profile.apiMode}) ` +\n `or use a provider with apiMode \"chat_completions\" or \"anthropic_messages\".`,\n { code: \"transport_unavailable\" },\n );\n}\n","/**\n * Provider registry (T3.2, ADR D107).\n *\n * `registerProvider` is idempotent and surface-warning: re-registering\n * a `name` logs to stderr (D107 last-writer-wins with WARN). Alias\n * collisions also warn (EC-5).\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"./types.js\";\n\nconst REGISTRY = new Map<string, ProviderProfile>();\nconst ALIASES = new Map<string, string>();\n\nexport function registerProvider(profile: ProviderProfile): void {\n if (REGISTRY.has(profile.name)) {\n process.stderr.write(`[theokit-sdk] Provider \"${profile.name}\" overridden by user plugin.\\n`);\n }\n REGISTRY.set(profile.name, profile);\n for (const alias of profile.aliases ?? []) {\n // EC-5: surface alias collision so operators notice mis-routing.\n const previous = ALIASES.get(alias);\n if (previous !== undefined && previous !== profile.name) {\n process.stderr.write(\n `[theokit-sdk] Alias \"${alias}\" collision: was \"${previous}\", now \"${profile.name}\".\\n`,\n );\n }\n ALIASES.set(alias, profile.name);\n }\n}\n\nexport function getProviderProfile(name: string): ProviderProfile | undefined {\n const canonical = ALIASES.get(name) ?? name;\n return REGISTRY.get(canonical);\n}\n\nexport function listProviders(): ProviderProfile[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Test-only reset. @internal */\nexport function _resetProvidersForTests(): void {\n REGISTRY.clear();\n ALIASES.clear();\n}\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const ANTHROPIC: ProviderProfile = {\n name: \"anthropic\",\n apiMode: \"anthropic_messages\",\n envVars: [\"ANTHROPIC_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://api.anthropic.com\",\n modelsUrl: \"https://api.anthropic.com/v1/models\",\n hostname: \"api.anthropic.com\",\n fallbackModels: [\"claude-opus-4-7\", \"claude-sonnet-4-6\", \"claude-haiku-4-5-20251001\"],\n};\n","/**\n * AWS Bedrock profile (Adoption Roadmap #8; ADRs D286-D302).\n *\n * Bearer-only auth via `AWS_BEARER_TOKEN_BEDROCK` env (GA Sep 2025).\n * Optional `@aws/bedrock-token-generator` peer dep auto-refreshes short-term\n * tokens (D287). Transport via native `fetch`; no `@aws-sdk/*` dependency.\n *\n * Model IDs follow the `bedrock/{aws-id}` convention so the router can\n * infer the provider via prefix routing (D186). The client strips the\n * `bedrock/` prefix before building the URL.\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"../types.js\";\n\nexport const BEDROCK: ProviderProfile = {\n name: \"bedrock\",\n apiMode: \"bedrock_anthropic\",\n envVars: [\"AWS_BEARER_TOKEN_BEDROCK\"],\n authType: \"aws_bearer\",\n baseUrl: \"https://bedrock-runtime.us-east-1.amazonaws.com\",\n modelsUrl: undefined,\n hostname: \"bedrock-runtime.amazonaws.com\",\n fallbackModels: [\n \"bedrock/us.anthropic.claude-sonnet-4-5-v1:0\",\n \"bedrock/us.anthropic.claude-opus-4-7-v1:0\",\n \"bedrock/global.anthropic.claude-haiku-4-5-v1:0\",\n ],\n};\n\n/** Strip `\"bedrock/\"` prefix so the raw AWS model id is used in the URL. */\nexport function stripBedrockPrefix(modelId: string): string {\n return modelId.replace(/^bedrock\\//, \"\");\n}\n\n/**\n * Infer AWS region from a Bedrock model id prefix (D290).\n *\n * `global.*` routes via `us-east-1` (AWS default entrypoint for global\n * inference profiles).\n */\nexport function inferRegionFromModelId(modelId: string): string | undefined {\n const id = stripBedrockPrefix(modelId);\n if (id.startsWith(\"global.\")) return \"us-east-1\";\n if (id.startsWith(\"us.\")) return process.env.AWS_REGION ?? \"us-east-1\";\n if (id.startsWith(\"eu.\")) return process.env.AWS_REGION ?? \"eu-west-1\";\n if (id.startsWith(\"apac.\")) return process.env.AWS_REGION ?? \"ap-southeast-1\";\n if (id.startsWith(\"jp.\")) return \"ap-northeast-1\";\n return undefined;\n}\n\n/** Resolve baseUrl from model id; falls back to `AWS_REGION` env or `us-east-1`. */\nexport function resolveBedrockBaseUrl(modelId: string): string {\n const region = inferRegionFromModelId(modelId) ?? process.env.AWS_REGION ?? \"us-east-1\";\n return `https://bedrock-runtime.${region}.amazonaws.com`;\n}\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * Gemini via OpenRouter passthrough. Direct Gemini API uses a different\n * dialect (`generateContent`); SDK currently routes through OpenRouter's\n * OpenAI-compatible endpoint so the chat_completions transport works.\n *\n * A future plugin `@theokit-provider-gemini-direct` can override this with\n * `apiMode: \"gemini_generate_content\"` once that transport ships.\n */\nexport const GEMINI: ProviderProfile = {\n name: \"gemini\",\n apiMode: \"chat_completions\",\n envVars: [\"OPENROUTER_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://openrouter.ai/api\",\n hostname: \"openrouter.ai\",\n fallbackModels: [\"google/gemini-2.0-flash-001\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * llama.cpp server provider profile (T7.2, ADR D189).\n *\n * llama.cpp ships a HTTP server binary (`./server` since b1500+) that\n * implements the OpenAI-compatible `/v1/chat/completions` endpoint on\n * `http://localhost:8080` by default. Inherits `authType: \"none\"` from\n * D182 — no API key required for local use.\n *\n * llama.cpp idiosyncrasies:\n * - Server loads a single GGUF model at startup via `--model` CLI\n * flag. The `model` field in the chat-completions request is\n * cosmetic — any string works; the response comes from the loaded\n * model regardless. This is documented in\n * `.claude/knowledge-base/reviews/edge-case/ollama-integration-edge-cases-2026-05-21.md`\n * as EC-O.\n * - Tool calling support depends entirely on the underlying model.\n *\n * Override the default URL with `LLAMACPP_HOST`.\n *\n * @internal\n */\nexport const LLAMACPP: ProviderProfile = {\n name: \"llamacpp\",\n aliases: [\"llama-cpp\", \"llama.cpp\"],\n apiMode: \"chat_completions\",\n envVars: [\"LLAMACPP_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:8080\",\n modelsUrl: \"http://localhost:8080/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"loaded-model\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * LM Studio provider profile (T7.1, ADR D188).\n *\n * LM Studio exposes an OpenAI-compatible `/v1/chat/completions` endpoint\n * on `http://localhost:1234` by default (configurable via the LM Studio\n * UI under \"Local Server\"). Inherits the `authType: \"none\"` primitive\n * from D182 — no API key required for local use.\n *\n * LM Studio idiosyncrasies:\n * - Loads ONE model at a time via the desktop UI. The `model` field in\n * the chat-completions request is informational only — LM Studio\n * serves whatever model is currently loaded.\n * - `/v1/models` returns a single entry pointing to the loaded model.\n * - Tool calling depends on the underlying model.\n *\n * Override the default URL with `LMSTUDIO_HOST` (mirrors `OLLAMA_HOST`).\n *\n * @internal\n */\nexport const LMSTUDIO: ProviderProfile = {\n name: \"lmstudio\",\n aliases: [\"lm-studio\", \"lm_studio\"],\n apiMode: \"chat_completions\",\n envVars: [\"LMSTUDIO_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:1234\",\n modelsUrl: \"http://localhost:1234/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"loaded-model\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * Ollama — local-first LLM runtime (ADR D182).\n *\n * Ships as a builtin so `Agent.create({ model: \"ollama/llama3.2\" })` works\n * with zero configuration when `ollama serve` is running on the default\n * port. `authType: \"none\"` signals the router to skip env-key resolution\n * and use a placeholder credential (Ollama ignores Authorization headers\n * on local installs).\n *\n * Overrides:\n * - `OLLAMA_HOST` — replaces the default `http://localhost:11434` baseUrl\n * (advanced users running Ollama on a remote machine).\n * - `OLLAMA_API_KEY` — replaces the placeholder when Ollama is behind a\n * reverse-proxy with auth or when using Ollama Cloud (paid tier).\n */\nexport const OLLAMA: ProviderProfile = {\n name: \"ollama\",\n apiMode: \"chat_completions\",\n envVars: [\"OLLAMA_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:11434\",\n modelsUrl: \"http://localhost:11434/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"llama3.2\", \"qwen2.5\", \"mistral\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const OPENAI: ProviderProfile = {\n name: \"openai\",\n apiMode: \"chat_completions\",\n envVars: [\"OPENAI_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://api.openai.com\",\n modelsUrl: \"https://api.openai.com/v1/models\",\n hostname: \"api.openai.com\",\n fallbackModels: [\"gpt-4o\", \"gpt-4o-mini\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const OPENROUTER: ProviderProfile = {\n name: \"openrouter\",\n apiMode: \"chat_completions\",\n aliases: [\"or\"],\n // Ordered fallback (EC-10): OPENROUTER_API_KEY preferred, OPENAI_API_KEY as compat.\n envVars: [\"OPENROUTER_API_KEY\", \"OPENAI_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://openrouter.ai/api\",\n modelsUrl: \"https://openrouter.ai/api/v1/models\",\n hostname: \"openrouter.ai\",\n fallbackModels: [\"openai/gpt-4o-mini\", \"anthropic/claude-3-haiku\"],\n};\n","/**\n * GCP Vertex AI profile (Adoption Roadmap #8; ADRs D286-D302).\n *\n * Required peer dep: `google-auth-library` (D288). Resolves access tokens\n * via ADC (env → gcloud → metadata server → WIF).\n *\n * Model IDs follow the convention `vertex/{dialect}/{model}`:\n * - `vertex/google/gemini-2.0-flash-001` → OpenAI-compat endpoint (D291)\n * - `vertex/anthropic/claude-sonnet-4-5@20250929` → :rawPredict (D292)\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"../types.js\";\n\nexport const VERTEX: ProviderProfile = {\n name: \"vertex\",\n apiMode: \"anthropic_messages\", // sub-dispatched in selectTransport by profile.name\n envVars: [\"GOOGLE_APPLICATION_CREDENTIALS\"],\n authType: \"gcp_oauth\",\n baseUrl: \"https://us-central1-aiplatform.googleapis.com\",\n modelsUrl: undefined,\n hostname: \"aiplatform.googleapis.com\",\n fallbackModels: [\n \"vertex/anthropic/claude-sonnet-4-5@20250929\",\n \"vertex/google/gemini-2.0-flash-001\",\n ],\n};\n\n/**\n * D293 absorbed: when location === \"global\", use `aiplatform.googleapis.com`\n * (no `global-` prefix) — known bug `streamRawPredict` 404 at\n * `global-aiplatform.googleapis.com` (cline#10287).\n */\nexport function resolveVertexBaseUrl(opts: {\n projectId: string;\n location: string;\n modelDialect: \"anthropic\" | \"gemini\";\n}): string {\n const host =\n opts.location === \"global\"\n ? \"aiplatform.googleapis.com\"\n : `${opts.location}-aiplatform.googleapis.com`;\n if (opts.modelDialect === \"gemini\") {\n // OpenAI-compat endpoint (D291) — the client appends `/chat/completions`.\n return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/endpoints/openapi`;\n }\n // Anthropic — base URL up to `/publishers/anthropic` (model id appended by client).\n return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/publishers/anthropic`;\n}\n\n/** Detect dialect from a `vertex/{dialect}/{model}` id. Default: gemini. */\nexport function inferModelDialect(modelId: string): \"anthropic\" | \"gemini\" {\n if (modelId.includes(\"/anthropic/\")) return \"anthropic\";\n if (modelId.includes(\"/google/\")) return \"gemini\";\n return \"gemini\";\n}\n\n/** Strip the `vertex/{dialect}/` prefix so the raw model id is used in the URL. */\nexport function stripVertexPrefix(modelId: string): string {\n return modelId.replace(/^vertex\\/(anthropic|google)\\//, \"\");\n}\n","/**\n * Eager registration of builtin providers (T3.3). Side-effect import:\n * importing this module registers the 4 builtins with the registry.\n *\n * Lazy user-plugin discovery is handled by `discovery.ts` (T3.4).\n *\n * @internal\n */\n\nimport { registerProvider } from \"../registry.js\";\nimport { ANTHROPIC } from \"./anthropic.js\";\nimport { BEDROCK } from \"./bedrock.js\";\nimport { GEMINI } from \"./gemini.js\";\nimport { LLAMACPP } from \"./llamacpp.js\";\nimport { LMSTUDIO } from \"./lmstudio.js\";\nimport { OLLAMA } from \"./ollama.js\";\nimport { OPENAI } from \"./openai.js\";\nimport { OPENROUTER } from \"./openrouter.js\";\nimport { VERTEX } from \"./vertex.js\";\n\nlet registered = false;\n\nexport function registerBuiltins(): void {\n if (registered) return;\n registered = true;\n registerProvider(ANTHROPIC);\n registerProvider(OPENAI);\n registerProvider(OPENROUTER);\n registerProvider(GEMINI);\n registerProvider(OLLAMA);\n registerProvider(LMSTUDIO);\n registerProvider(LLAMACPP);\n registerProvider(BEDROCK);\n registerProvider(VERTEX);\n}\n\n/** Test-only reset. @internal */\nexport function _resetBuiltinsRegistered(): void {\n registered = false;\n}\n\nexport { ANTHROPIC, BEDROCK, GEMINI, LLAMACPP, LMSTUDIO, OLLAMA, OPENAI, OPENROUTER, VERTEX };\n","/**\n * Anthropic HTTP error mapper (ADR D67).\n *\n * Translates an Anthropic API error response into a typed\n * `TheokitAgentError` subclass with full `ErrorMetadata`. Mapping rules:\n *\n * 401/403 → `AuthenticationError` (`code: \"auth_failed\"`)\n * 429 → `RateLimitError` (`code: \"rate_limit\"`)\n * 400 → `ConfigurationError` (`code: \"context_too_long\"` if body\n * mentions context length, else\n * `\"invalid_request\"`; or\n * `\"content_filtered\"` for policy.)\n * 408 → `NetworkError` (`code: \"timeout\"`)\n * 5xx → `NetworkError` (`code: \"server_error\"` — covers 529\n * overloaded_error common em horário\n * de pico)\n * other → `UnknownAgentError` (`code: \"unknown\"`)\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapAnthropicErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapAnthropicError(args: MapAnthropicErrorArgs): TheokitAgentError {\n const { status, body, headers, endpoint } = args;\n const code = mapAnthropicStatusToCode(status, body);\n const message = formatMessage(status, code);\n const metadata = buildErrorMetadata({\n provider: \"anthropic\",\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: \"anthropic_auth_failed\", metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: \"anthropic_rate_limit\", metadata });\n }\n if (status === 400) {\n return new ConfigurationError(message, {\n code: `anthropic_${code}`,\n metadata,\n });\n }\n if (status === 408) {\n return new NetworkError(message, { code: \"anthropic_timeout\", metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: \"anthropic_server_error\", metadata });\n }\n return new UnknownAgentError(message, { code: \"anthropic_unknown\", metadata });\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: explicit branch table is clearer than splitting\nfunction mapAnthropicStatusToCode(status: number, body: unknown): ErrorCode {\n if (status === 401 || status === 403) return \"auth_failed\";\n if (status === 429) return \"rate_limit\";\n if (status === 408) return \"timeout\";\n if (status === 400) {\n const text = JSON.stringify(body ?? \"\").toLowerCase();\n if (\n text.includes(\"context\") &&\n (text.includes(\"too long\") || text.includes(\"too_long\") || text.includes(\"length\"))\n ) {\n return \"context_too_long\";\n }\n if (\n text.includes(\"filtered\") ||\n text.includes(\"content policy\") ||\n text.includes(\"content_policy\")\n ) {\n return \"content_filtered\";\n }\n return \"invalid_request\";\n }\n if (status >= 500 && status < 600) return \"server_error\";\n return \"unknown\";\n}\n\nfunction formatMessage(status: number, code: ErrorCode): string {\n return `Anthropic API error: ${code} (HTTP ${status})`;\n}\n","/**\n * Helpers shared between provider HTTP error mappers (ADR D67).\n *\n * Extracted to dedupe identical logic in `anthropic.ts` and\n * `openai-compatible.ts` — retry-after parsing, raw-body truncation,\n * and metadata assembly are dialect-agnostic.\n *\n * @internal\n */\n\nimport type { ErrorCode, ErrorMetadata } from \"../../../errors.js\";\nimport { redactSecrets } from \"../../security/index.js\";\n\nconst RAW_MAX_BYTES = 2048;\n\n/**\n * Parse `retry-after` header in numeric-seconds form. HTTP-date form\n * (RFC 7231) returns `undefined` to avoid NaN propagation downstream.\n *\n * @internal\n */\nexport function parseRetryAfter(headers: Headers | undefined): number | undefined {\n if (headers === undefined) return undefined;\n const raw = headers.get(\"retry-after\");\n if (raw === null) return undefined;\n const n = Number(raw);\n if (Number.isFinite(n) && n >= 0) return Math.ceil(n);\n return undefined;\n}\n\n/**\n * Truncate raw response body to ~2KB and redact known credential\n * patterns so it can ride inside `ErrorMetadata.raw` without\n * ballooning logs OR leaking tokens. Returns `undefined` for\n * null/undefined input.\n *\n * Post T1.1 (secret-redaction-discipline, ADR D68): every error metadata\n * goes through `redactSecrets` before exposure. Note the shape change —\n * pre-T1.1 the function preserved the original `body` shape when ≤2KB;\n * now it always returns a (possibly redacted) string, because redaction\n * coerces non-strings to JSON. Consumers who used to do `err.metadata.raw.foo`\n * must now `JSON.parse(err.metadata.raw)` first — but a workspace-wide\n * grep at T1.1 land time confirmed zero such callers.\n *\n * @internal\n */\nexport function truncateRaw(body: unknown): unknown {\n if (body === null || body === undefined) return undefined;\n const s = typeof body === \"string\" ? body : JSON.stringify(body);\n const truncated = s.length <= RAW_MAX_BYTES ? s : `${s.slice(0, RAW_MAX_BYTES)}…`;\n return redactSecrets(truncated);\n}\n\n/**\n * Build an `ErrorMetadata` object with all optional fields included\n * conditionally (no `undefined` keys in the output). Caller passes\n * dialect-specific fields (`provider`, `endpoint`, `code`); shared\n * fields (`statusCode`, `retryAfter`, `raw`) are derived here.\n *\n * @internal\n */\nexport function buildErrorMetadata(args: {\n provider: string;\n endpoint: string;\n code: ErrorCode;\n status: number;\n headers: Headers | undefined;\n body: unknown;\n}): ErrorMetadata {\n const retryAfter = parseRetryAfter(args.headers);\n const raw = truncateRaw(args.body);\n return {\n provider: args.provider,\n endpoint: args.endpoint,\n code: args.code,\n statusCode: args.status,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n/**\n * D314: extract the provider's request id (`x-request-id` is OpenAI/most;\n * `request-id` is Anthropic). Returns `undefined` when neither is present.\n *\n * @internal\n */\nexport function parseRequestId(headers: Headers | undefined): string | undefined {\n if (headers === undefined) return undefined;\n return headers.get(\"x-request-id\") ?? headers.get(\"request-id\") ?? undefined;\n}\n","import type { LlmFinish, LlmStopReason, LlmToolCallPart } from \"./types.js\";\n\n/**\n * Decode a buffered JSON-arguments string into an object. Falls back to a\n * `{ raw }` envelope so we never crash on malformed provider output.\n *\n * @internal\n */\nexport function parseToolArguments(buffered: string | undefined): Record<string, unknown> {\n if (buffered === undefined || buffered.length === 0) return {};\n try {\n return JSON.parse(buffered) as Record<string, unknown>;\n } catch {\n return { raw: buffered };\n }\n}\n\n/**\n * Build the provider-agnostic `LlmFinish` shape from accumulator state.\n * Shared between the Anthropic and OpenAI stream parsers so the two\n * implementations don't drift on token-usage fields.\n *\n * @internal\n */\nexport function makeLlmFinish(state: {\n stopReason: LlmStopReason;\n text: string;\n toolCalls: LlmToolCallPart[];\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}): LlmFinish {\n const finish: LlmFinish = {\n stopReason: state.stopReason,\n text: state.text,\n toolCalls: state.toolCalls,\n };\n if (state.inputTokens !== undefined) finish.inputTokens = state.inputTokens;\n if (state.outputTokens !== undefined) finish.outputTokens = state.outputTokens;\n if (state.cacheReadTokens !== undefined) finish.cacheReadTokens = state.cacheReadTokens;\n if (state.cacheWriteTokens !== undefined) finish.cacheWriteTokens = state.cacheWriteTokens;\n if (state.reasoningTokens !== undefined) finish.reasoningTokens = state.reasoningTokens;\n return finish;\n}\n","/**\n * Shared helpers for Anthropic Messages wire format across direct API\n * (anthropic.ts), Vertex (vertex-anthropic.ts), and Bedrock (bedrock-anthropic.ts)\n * clients. Extracted to remove cross-module clones flagged by jscpd.\n *\n * @internal\n */\n\nimport { parseToolArguments } from \"./finish.js\";\nimport type { LlmMessage, LlmRequest, LlmStopReason, LlmToolCallPart } from \"./types.js\";\n\nexport interface AnthropicResponseLike {\n content?: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n >;\n stop_reason?: string | null;\n usage?: { input_tokens?: number; output_tokens?: number };\n}\n\nexport function extractAnthropicText(response: AnthropicResponseLike): string {\n return (response.content ?? [])\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nexport function extractAnthropicToolCalls(response: AnthropicResponseLike): LlmToolCallPart[] {\n return (response.content ?? [])\n .filter(\n (c): c is { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> } =>\n c.type === \"tool_use\",\n )\n .map((c) => ({\n type: \"tool_use\" as const,\n id: c.id,\n name: c.name,\n input: parseToolArguments(JSON.stringify(c.input)),\n }));\n}\n\nexport function mapAnthropicStopReason(reason: string | null): LlmStopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"end_turn\":\n case null:\n return \"end_turn\";\n default:\n return \"end_turn\";\n }\n}\n\n/**\n * Convert an SDK `LlmMessage` to the Anthropic Messages wire shape.\n * Identical across the three Anthropic-compatible clients (D289/D292).\n */\nexport function toAnthropicWireMessage(message: LlmMessage): Record<string, unknown> {\n const role = message.role === \"system\" ? \"user\" : message.role;\n const content = message.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"tool_use\") {\n return { type: \"tool_use\", id: part.id, name: part.name, input: part.input };\n }\n return {\n type: \"tool_result\",\n tool_use_id: part.toolUseId,\n content: part.content,\n ...(part.isError === true ? { is_error: true } : {}),\n };\n });\n return { role, content };\n}\n\n/**\n * Build the common body shape for Anthropic Messages requests. Caller\n * is responsible for adding wire-specific fields (`anthropic_version`,\n * `model`, `stream`, etc.).\n */\n/**\n * Issue a POST to an Anthropic-compatible Messages endpoint with the\n * standard auth + content-type headers. Caller maps non-2xx via its own\n * dialect-specific error mapper.\n */\nexport function postAnthropicRequest(args: {\n fetchImpl: typeof fetch;\n url: string;\n token: string;\n body: Record<string, unknown>;\n signal: AbortSignal;\n}): Promise<Response> {\n return args.fetchImpl(args.url, {\n method: \"POST\",\n signal: args.signal,\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${args.token}`,\n },\n body: JSON.stringify(args.body),\n });\n}\n\n/**\n * Map non-2xx response to a typed error via the dialect mapper; consume\n * 2xx body into the Anthropic-shape result. Shared by Bedrock + Vertex\n * Anthropic clients to remove the ~15-line clone (jscpd).\n */\nexport async function handleAnthropicResponse(args: {\n response: Response;\n endpoint: string;\n errorMapper: (info: {\n status: number;\n body: unknown;\n headers: Headers;\n endpoint: string;\n }) => Error;\n}): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n if (!args.response.ok) {\n throw args.errorMapper({\n status: args.response.status,\n body: await parseHttpErrorBody(args.response),\n headers: args.response.headers,\n endpoint: args.endpoint,\n });\n }\n return consumeAnthropicResponse(args.response);\n}\n\nexport async function consumeAnthropicResponse(response: Response): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n const data = (await response.json()) as AnthropicResponseLike;\n return {\n text: extractAnthropicText(data),\n toolCalls: extractAnthropicToolCalls(data),\n stopReason: mapAnthropicStopReason(data.stop_reason ?? null),\n inputTokens: data.usage?.input_tokens,\n outputTokens: data.usage?.output_tokens,\n };\n}\n\nexport async function parseHttpErrorBody(response: Response): Promise<unknown> {\n const text = await response.text().catch(() => \"\");\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function buildAnthropicCommonBody(request: LlmRequest): {\n max_tokens: number;\n messages: Array<Record<string, unknown>>;\n system?: string;\n temperature?: number;\n tools?: Array<{ name: string; description: string; input_schema: unknown }>;\n} {\n const body: ReturnType<typeof buildAnthropicCommonBody> = {\n max_tokens: request.maxTokens ?? 4096,\n messages: request.messages.map(toAnthropicWireMessage),\n };\n if (request.system !== undefined) body.system = request.system;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n }\n return body;\n}\n","import { mapAnthropicError } from \"../errors/mappers/anthropic.js\";\nimport { buildAnthropicCommonBody, mapAnthropicStopReason } from \"./anthropic-shared.js\";\nimport { makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * Real Anthropic Messages client. Streams `/v1/messages` and translates the\n * vendor SSE events (`content_block_delta`, `content_block_start`,\n * `message_delta`, `message_stop`) into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `@anthropic-ai/sdk` dependency.\n *\n * @internal\n */\n\nexport interface AnthropicClientOptions {\n apiKey: string;\n baseUrl?: string;\n version?: string;\n fetch?: typeof fetch;\n}\n\ninterface AnthropicTextDelta {\n type: \"content_block_delta\";\n delta: { type: \"text_delta\"; text: string };\n}\n\ninterface AnthropicToolStart {\n type: \"content_block_start\";\n index: number;\n content_block: { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n}\n\ninterface AnthropicToolDelta {\n type: \"content_block_delta\";\n index: number;\n delta: { type: \"input_json_delta\"; partial_json: string };\n}\n\ninterface AnthropicMessageDelta {\n type: \"message_delta\";\n delta: { stop_reason: string | null };\n usage?: { input_tokens?: number; output_tokens?: number };\n}\n\ntype AnthropicEvent =\n | AnthropicTextDelta\n | AnthropicToolStart\n | AnthropicToolDelta\n | AnthropicMessageDelta\n | { type: \"message_stop\" }\n | { type: string };\n\nexport class AnthropicClient implements LlmClient {\n readonly name = \"anthropic\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: AnthropicClientOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.anthropic.com\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const body = buildAnthropicBody(request);\n const response = await this.fetchImpl(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n signal,\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.options.apiKey,\n \"anthropic-version\": this.options.version ?? \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n // Parse body as JSON when possible — gives the mapper access to\n // `error.code` / `error.type` fields. Leave as string otherwise.\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string\n }\n throw mapAnthropicError({\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/messages\",\n });\n }\n\n const accumulator = new AnthropicStreamAccumulator();\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.event === \"ping\" || record.event === \"message_start\") continue;\n let parsed: AnthropicEvent;\n try {\n parsed = JSON.parse(record.data) as AnthropicEvent;\n } catch {\n continue;\n }\n const events = accumulator.consume(parsed);\n for (const event of events) yield event;\n }\n return accumulator.finish();\n }\n}\n\nclass AnthropicStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private readonly toolCalls = new Map<number, LlmToolCallPart>();\n private readonly toolBuffers = new Map<number, string>();\n\n consume(event: AnthropicEvent): LlmEvent[] {\n if (event.type === \"content_block_start\") {\n this.handleToolStart(event as AnthropicToolStart);\n return [];\n }\n if (event.type === \"content_block_delta\") {\n return this.handleContentDelta(event as AnthropicTextDelta | AnthropicToolDelta);\n }\n if (event.type === \"message_delta\") {\n this.handleMessageDelta(event as AnthropicMessageDelta);\n }\n return [];\n }\n\n private handleToolStart(start: AnthropicToolStart): void {\n if (start.content_block.type !== \"tool_use\") return;\n this.toolCalls.set(start.index, {\n type: \"tool_use\",\n id: start.content_block.id,\n name: start.content_block.name,\n input: { ...start.content_block.input },\n });\n this.toolBuffers.set(start.index, \"\");\n }\n\n private handleContentDelta(delta: AnthropicTextDelta | AnthropicToolDelta): LlmEvent[] {\n if (delta.delta.type === \"text_delta\") {\n const text = (delta as AnthropicTextDelta).delta.text;\n this.text += text;\n return [{ type: \"text_delta\", text }];\n }\n const idx = (delta as AnthropicToolDelta).index;\n const existing = this.toolBuffers.get(idx) ?? \"\";\n this.toolBuffers.set(idx, existing + (delta as AnthropicToolDelta).delta.partial_json);\n return [];\n }\n\n private handleMessageDelta(md: AnthropicMessageDelta): void {\n this.stopReason = mapAnthropicStopReason(md.delta.stop_reason);\n if (md.usage?.input_tokens !== undefined) this.inputTokens = md.usage.input_tokens;\n if (md.usage?.output_tokens !== undefined) this.outputTokens = md.usage.output_tokens;\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const [index, tool] of this.toolCalls.entries()) {\n const buffered = this.toolBuffers.get(index);\n const parsed = parseToolArguments(buffered);\n if (Object.keys(parsed).length > 0) tool.input = parsed;\n toolCalls.push(tool);\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n });\n }\n}\n\nfunction buildAnthropicBody(request: LlmRequest): Record<string, unknown> {\n return {\n model: request.model,\n stream: true,\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * AWS Bedrock client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D286-D302).\n *\n * v1: non-streaming only (`POST /model/{id}/invoke`). D302 defers\n * `/invoke-with-response-stream` (AWS Event Stream binary format) to v1.x.\n *\n * Body massage (D289):\n * - inject `anthropic_version: \"bedrock-2023-05-31\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body (D302 — non-streaming only in v1)\n *\n * Uses native `fetch` only — no `@aws-sdk/client-bedrock-runtime`.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapBedrockError } from \"../errors/mappers/bedrock.js\";\nimport {\n inferRegionFromModelId,\n resolveBedrockBaseUrl,\n stripBedrockPrefix,\n} from \"../providers/builtin/bedrock.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { resolveBedrockToken } from \"./bedrock-token-cache.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nexport interface BedrockAnthropicClientOptions {\n /**\n * AWS Bearer token. When non-empty, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveBedrockToken(region)` (D287).\n */\n apiKey?: string;\n /** Override the resolved baseUrl (rarely needed; defaults derive from model id). */\n baseUrl?: string;\n /** Injected fetch impl for tests. */\n fetch?: typeof fetch;\n}\n\nexport class BedrockAnthropicClient implements LlmClient {\n readonly name = \"bedrock\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: BedrockAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private async resolveTokenOrThrow(region: string): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromEnv = await resolveBedrockToken(region);\n if (fromEnv !== undefined && fromEnv.length > 0) return fromEnv;\n throw new ConfigurationError(\n \"Bedrock requires AWS_BEARER_TOKEN_BEDROCK env var, or install `@aws/bedrock-token-generator` for auto-refresh, or pass apiKey explicitly.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const region = inferRegionFromModelId(request.model) ?? process.env.AWS_REGION ?? \"us-east-1\";\n const token = await this.resolveTokenOrThrow(region);\n\n const bareModel = stripBedrockPrefix(request.model);\n const baseUrl = this.options.baseUrl ?? resolveBedrockBaseUrl(request.model);\n const endpoint = `/model/${encodeURIComponent(bareModel)}/invoke`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token,\n body: buildBedrockBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapBedrockError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildBedrockBody(request: LlmRequest): Record<string, unknown> {\n // D289: anthropic_version injected; model + stream stripped.\n return {\n anthropic_version: \"bedrock-2023-05-31\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * AWS Bedrock HTTP error mapper (ADRs D67, D300).\n *\n * Bedrock returns either AWS-style `{ message, __type: \"ThrottlingException\" }`\n * or sometimes `{ Message }` (capitalized) depending on the model dialect.\n * We accept both shapes and map to canonical `TheokitAgentError` subclasses.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface BedrockErrorBody {\n __type?: string;\n message?: string;\n Message?: string;\n}\n\nexport interface MapBedrockErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype BedrockCode =\n | \"rate_limit\"\n | \"auth_failed\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nfunction classifyBedrockError(\n args: MapBedrockErrorArgs,\n awsType: string,\n message: string,\n): BedrockCode {\n if (\n args.status === 429 ||\n awsType.includes(\"Throttling\") ||\n awsType.includes(\"TooManyRequests\")\n ) {\n return \"rate_limit\";\n }\n if (\n args.status === 401 ||\n args.status === 403 ||\n awsType.includes(\"AccessDenied\") ||\n awsType.includes(\"UnauthorizedOperation\")\n ) {\n return \"auth_failed\";\n }\n if (\n args.status === 400 ||\n args.status === 404 ||\n awsType.includes(\"ValidationException\") ||\n awsType.includes(\"ResourceNotFound\") ||\n message.includes(\"use case details\")\n ) {\n return \"invalid_request\";\n }\n if (args.status === 408 || awsType.includes(\"Timeout\")) return \"timeout\";\n if (args.status >= 500) return \"server_error\";\n return \"unknown\";\n}\n\nfunction buildBedrockMetadata(args: MapBedrockErrorArgs, code: BedrockCode) {\n return buildErrorMetadata({\n provider: \"bedrock\",\n endpoint: args.endpoint,\n code,\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nexport function mapBedrockError(args: MapBedrockErrorArgs): TheokitAgentError {\n const parsed = parseBody(args.body);\n const awsType = parsed.__type ?? \"\";\n const message = parsed.message ?? parsed.Message ?? \"Bedrock request failed\";\n const code = classifyBedrockError(args, awsType, message);\n const metadata = buildBedrockMetadata(args, code);\n\n switch (code) {\n case \"rate_limit\":\n return new RateLimitError(`Bedrock throttled: ${message}`, { metadata });\n case \"auth_failed\":\n return new AuthenticationError(`Bedrock auth: ${message}`, { metadata });\n case \"invalid_request\": {\n const friendly = message.includes(\"use case details\")\n ? `Bedrock account setup required: ${message} (AWS Console → Bedrock → Model access → Anthropic → Submit use case form, then retry in 15 min.)`\n : `Bedrock validation: ${message}`;\n return new ConfigurationError(friendly, { metadata });\n }\n case \"timeout\":\n return new NetworkError(`Bedrock timeout: ${message}`, { metadata });\n case \"server_error\":\n return new NetworkError(`Bedrock server error: ${message}`, { metadata });\n default:\n return new UnknownAgentError(`Bedrock unknown: ${message}`, { metadata });\n }\n}\n\nfunction parseBody(body: unknown): BedrockErrorBody {\n if (body !== null && typeof body === \"object\") return body as BedrockErrorBody;\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body) as BedrockErrorBody;\n } catch {\n return {};\n }\n }\n return {};\n}\n","/**\n * Bedrock Bearer token resolution + cache (ADRs D287, D295).\n *\n * Two paths:\n * 1. Explicit env (`AWS_BEARER_TOKEN_BEDROCK`) wins; no refresh.\n * 2. Optional peer dep `@aws/bedrock-token-generator` (D287) auto-generates\n * short-term tokens from the standard AWS credential chain\n * (`@aws-sdk/credential-providers`). Cached for 1.5h.\n *\n * `resolveBedrockToken` returns `undefined` only when BOTH paths produce no\n * token. Caller (router) is responsible for throwing a helpful error\n * (D279/EC-6) — this module is auth-resolution only.\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n}\n\nlet cachedToken: CachedToken | null = null;\n\ninterface BedrockTokenGeneratorApi {\n getToken: (opts: { credentials: unknown; region: string }) => Promise<string>;\n}\n\ninterface CredentialProvidersApi {\n fromNodeProviderChain: () => () => Promise<unknown>;\n}\n\nconst CACHE_TTL_MS = 90 * 60 * 1000; // 1.5h\n\nexport async function resolveBedrockToken(region: string): Promise<string | undefined> {\n const env = process.env.AWS_BEARER_TOKEN_BEDROCK;\n if (env !== undefined && env.length > 0) return env;\n\n const now = Date.now();\n if (cachedToken !== null && cachedToken.expiresAt > now) {\n return cachedToken.value;\n }\n\n try {\n const r = createRequire(import.meta.url);\n const gen = r(\"@aws/bedrock-token-generator\") as BedrockTokenGeneratorApi;\n if (typeof gen.getToken !== \"function\") return undefined;\n\n const providers = r(\"@aws-sdk/credential-providers\") as CredentialProvidersApi;\n if (typeof providers.fromNodeProviderChain !== \"function\") return undefined;\n\n const credentialProvider = providers.fromNodeProviderChain();\n const token = await gen.getToken({ credentials: credentialProvider, region });\n cachedToken = { value: token, expiresAt: now + CACHE_TTL_MS };\n return token;\n } catch {\n return undefined;\n }\n}\n\n/** Test seam — clear cache between tests. */\nexport function __resetBedrockTokenCache(): void {\n cachedToken = null;\n}\n","/**\n * OpenAI-compatible HTTP error mapper (ADR D67).\n *\n * Translates OpenAI-shaped API error responses (covers OpenAI, OpenRouter,\n * DeepSeek, Together, Mistral, Voyage, DeepInfra, etc.) into typed\n * `TheokitAgentError` subclasses with full `ErrorMetadata`.\n *\n * Body inspection: looks at `body.error.code` / `body.error.type` to detect\n * `context_too_long`, `content_filtered`, `model_unavailable` semantics.\n * Falls back to status-based mapping when body doesn't expose `.error`\n * (e.g., HTML server error page, DeepInfra's `{message: \"...\"}` shape).\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapOpenAiErrorArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapOpenAICompatibleError(args: MapOpenAiErrorArgs): TheokitAgentError {\n const { providerId, status, body, headers, endpoint } = args;\n const code = mapOpenAiStatusToCode(status, body);\n const message = formatMessage(providerId, status, code);\n const metadata = buildErrorMetadata({\n provider: providerId,\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: `${providerId}_auth_failed`, metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });\n }\n if (status === 400) {\n return new ConfigurationError(message, { code: `${providerId}_${code}`, metadata });\n }\n if (status === 408) {\n return new NetworkError(message, { code: `${providerId}_timeout`, metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: `${providerId}_server_error`, metadata });\n }\n return new UnknownAgentError(message, { code: `${providerId}_unknown`, metadata });\n}\n\nfunction extractOpenAiErrorCode(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const err = (body as { error?: { code?: unknown; type?: unknown } }).error;\n if (err === undefined || err === null) return undefined;\n if (typeof err.code === \"string\") return err.code;\n if (typeof err.type === \"string\") return err.type;\n return undefined;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: explicit branch table is clearer than splitting\nfunction mapOpenAiStatusToCode(status: number, body: unknown): ErrorCode {\n const rawCode = extractOpenAiErrorCode(body)?.toLowerCase() ?? \"\";\n\n if (\n rawCode.includes(\"context_length\") ||\n rawCode.includes(\"context_window\") ||\n rawCode.includes(\"too_many_tokens\") ||\n rawCode.includes(\"max_tokens\")\n ) {\n return \"context_too_long\";\n }\n if (\n rawCode.includes(\"content_filter\") ||\n rawCode.includes(\"content_policy\") ||\n rawCode.includes(\"safety\")\n ) {\n return \"content_filtered\";\n }\n if (\n rawCode.includes(\"model_not_found\") ||\n rawCode.includes(\"model_unavailable\") ||\n rawCode.includes(\"invalid_model\")\n ) {\n return \"model_unavailable\";\n }\n // D314: OpenAI 402 / billing-style codes map to quota_exceeded. OpenAI\n // also returns 429 with `insufficient_quota` body code (rare but documented).\n if (\n status === 402 ||\n rawCode.includes(\"insufficient_quota\") ||\n rawCode.includes(\"quota_exceeded\")\n ) {\n // ErrorCode union doesn't yet have quota_exceeded so we surface as\n // invalid_request — but AgentRunError code is widened (D311) and callers\n // mapping HTTP→AgentRunError see quota_exceeded directly.\n return \"invalid_request\";\n }\n\n if (status === 401 || status === 403) return \"auth_failed\";\n if (status === 429) return \"rate_limit\";\n if (status === 408) return \"timeout\";\n if (status === 400) return \"invalid_request\";\n if (status >= 500 && status < 600) return \"server_error\";\n return \"unknown\";\n}\n\nfunction formatMessage(providerId: string, status: number, code: ErrorCode): string {\n return `${providerId} API error: ${code} (HTTP ${status})`;\n}\n","/**\n * D14 — Fault injection via `THEOKIT_TEST_RESPONSE_OVERRIDE` env var.\n *\n * Decorator pattern (D127 inspired): wraps any `LlmClient` and short-circuits\n * the network call when:\n *\n * 1. `process.env.NODE_ENV === \"test\"` (fail-safe gate — prevents production\n * footgun), AND\n * 2. `process.env.THEOKIT_TEST_RESPONSE_OVERRIDE` is a non-empty JSON string\n * shaped as `{ \"status\": number, \"body\": object | string }`.\n *\n * On any other condition (different NODE_ENV, missing env, malformed JSON),\n * the wrapper delegates to the real client — graceful degradation.\n *\n * Use cases (FAANG-grade chaos testing):\n *\n * - `{\"status\":429,\"body\":{\"error\":{\"code\":\"rate_limit_exceeded\"}}}` →\n * deterministic RateLimitError without burning real quota\n * - `{\"status\":500,\"body\":{\"error\":{\"code\":\"internal_error\"}}}` →\n * deterministic NetworkError for retry/circuit-breaker tests\n * - `{\"status\":200,\"body\":{\"choices\":[{\"message\":{\"content\":\"fake\"}}]}}` →\n * deterministic happy-path text for snapshot tests\n *\n * Compatible with the dogfood-stranger chaos phases (12-15). Replaces the\n * flaky \"50 parallel requests to force 429\" anti-pattern.\n *\n * Wire format mirrors OpenAI Chat Completions (universal — same shape every\n * provider returns). Error mapping reuses `mapOpenAICompatibleError` so the\n * injected errors are byte-equal to what the real provider would raise.\n *\n * @internal\n */\n\nimport { mapOpenAICompatibleError } from \"../errors/mappers/openai-compatible.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nconst ENV_GATE_KEY = \"NODE_ENV\";\nconst ENV_GATE_VALUE = \"test\";\nconst ENV_OVERRIDE_KEY = \"THEOKIT_TEST_RESPONSE_OVERRIDE\";\n\ninterface ParsedOverride {\n status: number;\n body: unknown;\n}\n\n/**\n * Wrap an `LlmClient` with the fault-injection decorator. Returns the\n * original client unchanged when the activation gate is not satisfied\n * (cheap noop — no allocation in the hot path of production runtime).\n */\nexport function maybeWrapWithFaultInjection(client: LlmClient): LlmClient {\n // Cheap gate first — production calls never allocate the wrapper.\n if (!isGateOn()) return client;\n return new FaultInjectingLlmClient(client);\n}\n\nexport class FaultInjectingLlmClient implements LlmClient {\n readonly name: string;\n /**\n * Inner (real) client. Exposed so layered transport assertions (router\n * pool-wiring tests, telemetry inspectors) can walk one level deep —\n * same pattern PoolAwareLlmClient uses for its inner transport.\n */\n readonly inner: LlmClient;\n constructor(inner: LlmClient) {\n this.inner = inner;\n this.name = inner.name;\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // Re-check gate on every call — env vars can change between calls and\n // the cost is negligible relative to a network roundtrip.\n if (!isGateOn()) {\n return yield* this.inner.stream(request, signal);\n }\n const parsed = parseOverrideOrWarnOnce();\n if (parsed === undefined) {\n return yield* this.inner.stream(request, signal);\n }\n // Active: synthesize response without calling the real client.\n if (parsed.status >= 400) {\n throw mapOpenAICompatibleError({\n providerId: this.name,\n status: parsed.status,\n body: parsed.body,\n headers: undefined,\n endpoint: \"/v1/chat/completions\",\n });\n }\n const text = extractText(parsed.body);\n yield { type: \"text_delta\", text };\n yield { type: \"stop\", reason: \"end_turn\" };\n return {\n stopReason: \"end_turn\",\n text,\n toolCalls: [],\n inputTokens: 0,\n outputTokens: 0,\n };\n }\n}\n\nfunction isGateOn(): boolean {\n return process.env[ENV_GATE_KEY] === ENV_GATE_VALUE;\n}\n\nlet warnedInvalidJson = false;\n\nfunction parseOverrideOrWarnOnce(): ParsedOverride | undefined {\n const raw = process.env[ENV_OVERRIDE_KEY];\n if (raw === undefined || raw.length === 0) return undefined;\n let candidate: unknown;\n try {\n candidate = JSON.parse(raw);\n } catch (_err) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n if (candidate === null || typeof candidate !== \"object\") {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n const obj = candidate as { status?: unknown; body?: unknown };\n if (typeof obj.status !== \"number\" || !Number.isFinite(obj.status)) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n return { status: obj.status, body: obj.body };\n}\n\nfunction warnInvalidJsonOnce(_raw: string): void {\n if (warnedInvalidJson) return;\n warnedInvalidJson = true;\n process.stderr.write(\n `[theokit-sdk] ${ENV_OVERRIDE_KEY} is set but value is not valid JSON of shape ` +\n `\\`{\"status\": number, \"body\": object | string}\\`. Falling back to real LLM call. ` +\n `This warning is shown once per process.\\n`,\n );\n}\n\n/**\n * Extract textual content from an arbitrary body. Supports:\n * - plain string: returned as-is\n * - OpenAI shape: `body.choices[0].message.content` (most common)\n * - object with `text` field: `body.text`\n * - everything else: empty string (caller can still inspect parsed.body if needed)\n */\nfunction extractText(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const fromOpenAi = readOpenAiContent(body);\n if (fromOpenAi !== undefined) return fromOpenAi;\n const obj = body as { text?: unknown };\n if (typeof obj.text === \"string\") return obj.text;\n return \"\";\n}\n\nfunction readOpenAiContent(body: unknown): string | undefined {\n const obj = body as { choices?: unknown };\n if (!Array.isArray(obj.choices) || obj.choices.length === 0) return undefined;\n const first = obj.choices[0] as { message?: { content?: unknown } } | undefined;\n const content = first?.message?.content;\n if (typeof content === \"string\") return content;\n return undefined;\n}\n\n/**\n * Test-only reset for the one-shot stderr warning. Mirrors the D187\n * `_resetNoAuthApiKeyWarnings` pattern.\n *\n * @internal\n */\nexport function _resetFaultInjectionWarnings(): void {\n warnedInvalidJson = false;\n}\n","/**\n * Ollama-specific HTTP/transport error mapper (T1.1, ADR D185).\n *\n * Sits ABOVE the generic OpenAI-compatible mapper for `providerId: \"ollama\"`.\n * Returns `undefined` when the error doesn't match an Ollama-specific\n * pattern — caller (OpenAIClient) then falls back to the generic mapper.\n *\n * Surfaces 3 Ollama-specific failure modes with actionable messages\n * targeted at non-technical users (CLAUDE.md primary persona):\n *\n * 1. **Transport-level `ECONNREFUSED` / `ENOTFOUND`** → \"Run `ollama serve`\"\n * 2. **HTTP 404 with `not found, try pulling`** → \"Run `ollama pull <model>`\"\n * 3. **HTTP 503 with `model is loading`** → retryable (model warming up)\n *\n * @internal\n */\n\nimport { ConfigurationError, NetworkError, type TheokitAgentError } from \"../../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapOllamaTransportArgs {\n providerId: string;\n cause: unknown;\n endpoint: string;\n}\n\ninterface MapOllamaHttpArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\n/**\n * Maps fetch-level failures (Node TypeError with `cause.code`). Returns\n * `undefined` for anything that isn't `ECONNREFUSED` / `ENOTFOUND` so\n * the caller can re-throw the original error untouched.\n */\nexport function mapOllamaTransportError(\n args: MapOllamaTransportArgs,\n): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n const causeCode = extractCauseCode(args.cause);\n if (causeCode !== \"ECONNREFUSED\" && causeCode !== \"ENOTFOUND\") return undefined;\n\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"network\",\n status: 0,\n headers: undefined,\n body: { cause: causeCode },\n });\n return new ConfigurationError(\n \"Ollama is not reachable. Run `ollama serve` to start the local runtime, \" +\n \"or set OLLAMA_HOST to point at a remote Ollama server.\",\n { code: \"ollama_unreachable\", metadata },\n );\n}\n\n/**\n * Maps HTTP-level Ollama failures. Returns `undefined` for status codes\n * that aren't Ollama-specific so the caller falls back to the generic\n * OpenAI-compatible mapper.\n */\nexport function mapOllamaHttpError(args: MapOllamaHttpArgs): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n\n const errString = extractErrorString(args.body).toLowerCase();\n\n // 404 + \"not found, try pulling\" → model not pulled.\n if (args.status === 404 && errString.includes(\"not found\") && errString.includes(\"pull\")) {\n const modelHint = extractModelName(errString);\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"model_unavailable\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n const pullCmd = modelHint !== undefined ? `ollama pull ${modelHint}` : \"ollama pull <model>\";\n return new ConfigurationError(\n `Ollama model is not pulled. Run \\`${pullCmd}\\` to download it first.`,\n { code: \"ollama_model_not_pulled\", metadata },\n );\n }\n\n // 503 + \"model is loading\" → retryable transient.\n if (args.status === 503 && errString.includes(\"model is loading\")) {\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"server_error\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n // NetworkError isRetryable: true (default per errors.ts contract).\n return new NetworkError(\n \"Ollama model is loading. Retry in a few seconds — Ollama is warming up the model into memory.\",\n { code: \"ollama_model_loading\", metadata },\n );\n }\n\n return undefined;\n}\n\nfunction extractCauseCode(cause: unknown): string | undefined {\n if (cause === null || typeof cause !== \"object\") return undefined;\n // Native fetch wraps in TypeError(\"fetch failed\") with `cause` chain.\n const directCode = (cause as { code?: unknown }).code;\n if (typeof directCode === \"string\") return directCode;\n const nested = (cause as { cause?: unknown }).cause;\n if (nested !== undefined) return extractCauseCode(nested);\n return undefined;\n}\n\nfunction extractErrorString(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const err = (body as { error?: unknown }).error;\n if (typeof err === \"string\") return err;\n return \"\";\n}\n\n/** Pull the model name out of e.g. `model 'llama3.2' not found, try pulling it first`. */\nfunction extractModelName(errString: string): string | undefined {\n const match = errString.match(/'([^']+)'/);\n return match?.[1];\n}\n","/**\n * Ollama native API client (T8.1 follow-up, ADR D191).\n *\n * Targets Ollama's native `/api/chat` endpoint with NDJSON streaming.\n * Critical for **tool calling** — per OpenClaw upstream warning, the\n * OpenAI-compat `/v1/chat/completions` endpoint BREAKS tool calling in\n * Ollama (models emit raw tool JSON as text instead of structured\n * `tool_calls` blocks). Mirrors OpenClaw `extensions/ollama/src/stream.ts`.\n *\n * @internal\n */\n\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../errors/mappers/ollama.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface OllamaNativeClientOptions {\n /** Optional API key for Ollama Cloud / reverse-proxy. Local Ollama ignores `Authorization`. */\n apiKey?: string;\n /** Base URL. Default `http://localhost:11434`. `/v1` suffix is stripped automatically. */\n baseUrl?: string;\n fetch?: typeof fetch;\n}\n\ninterface OllamaToolCall {\n function: {\n name: string;\n arguments: Record<string, unknown> | string;\n };\n}\n\ninterface OllamaChatChunk {\n message?: {\n role?: \"assistant\";\n content?: string;\n tool_calls?: OllamaToolCall[];\n };\n done?: boolean;\n done_reason?: string;\n prompt_eval_count?: number;\n eval_count?: number;\n}\n\ninterface OllamaChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_calls?: OllamaToolCall[];\n tool_name?: string;\n}\n\ninterface OllamaTool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport class OllamaNativeClient implements LlmClient {\n readonly name = \"ollama\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OllamaNativeClientOptions) {\n // Strip `/v1` if user mistakenly included it (OpenClaw guard).\n const raw = (options.baseUrl ?? \"http://localhost:11434\").replace(/\\/+$/, \"\");\n this.baseUrl = raw.replace(/\\/v1$/i, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+NDJSON handshake + accumulator is intentionally one block (mirrors openai.ts)\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (this.options.apiKey !== undefined && this.options.apiKey.length > 0) {\n headers.authorization = `Bearer ${this.options.apiKey}`;\n }\n const body = buildOllamaChatBody(request);\n const url = `${this.baseUrl}/api/chat`;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(body),\n });\n } catch (fetchErr) {\n const mapped = mapOllamaTransportError({\n providerId: \"ollama\",\n cause: fetchErr,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n throw fetchErr;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let bodyJson: unknown = text;\n try {\n bodyJson = JSON.parse(text);\n } catch {\n /* not JSON */\n }\n const mapped = mapOllamaHttpError({\n providerId: \"ollama\",\n status: response.status,\n body: bodyJson,\n headers: response.headers,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n throw new Error(`Ollama /api/chat HTTP ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const accumulator = new OllamaStreamAccumulator();\n if (response.body === null) {\n return accumulator.finish();\n }\n for await (const chunk of parseNdjsonStream(response.body, signal)) {\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n if (chunk.done === true) break;\n }\n return accumulator.finish();\n }\n}\n\nclass OllamaStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private readonly toolCalls: LlmToolCallPart[] = [];\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON chunk dispatch — text delta + tool_call append + finish-reason mapping is one cohesive accumulator (mirrors openai.ts OpenAIStreamAccumulator.consume).\n consume(chunk: OllamaChatChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n if (chunk.prompt_eval_count !== undefined) this.inputTokens = chunk.prompt_eval_count;\n if (chunk.eval_count !== undefined) this.outputTokens = chunk.eval_count;\n const msg = chunk.message;\n if (msg?.content !== undefined && msg.content.length > 0) {\n this.text += msg.content;\n events.push({ type: \"text_delta\", text: msg.content });\n }\n if (msg?.tool_calls !== undefined) {\n for (const call of msg.tool_calls) {\n const input =\n typeof call.function.arguments === \"string\"\n ? parseOllamaToolArguments(call.function.arguments)\n : call.function.arguments;\n this.toolCalls.push({\n type: \"tool_use\",\n id: `ollama_call_${this.toolCalls.length + 1}`,\n name: call.function.name,\n input,\n });\n }\n }\n if (chunk.done === true && chunk.done_reason !== undefined) {\n this.stopReason = mapOllamaDoneReason(chunk.done_reason, this.toolCalls.length > 0);\n }\n return events;\n }\n\n finish(): LlmFinish {\n if (this.toolCalls.length > 0 && this.stopReason === \"end_turn\") {\n this.stopReason = \"tool_use\";\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls: this.toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n });\n }\n}\n\nfunction parseOllamaToolArguments(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"object\" && parsed !== null ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\nfunction mapOllamaDoneReason(reason: string, hasToolCalls: boolean): LlmStopReason {\n if (hasToolCalls) return \"tool_use\";\n if (reason === \"length\") return \"max_tokens\";\n if (reason === \"stop\") return \"end_turn\";\n return \"end_turn\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON line buffering + JSON.parse-with-skip-malformed + signal abort + trailing-buffer flush is one cohesive parser, mirrors OpenClaw's parseJsonLineStream.\nasync function* parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<OllamaChatChunk, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n if (signal.aborted) return;\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n yield JSON.parse(trimmed) as OllamaChatChunk;\n } catch {\n /* skip malformed NDJSON line */\n }\n }\n }\n const tail = buffer.trim();\n if (tail.length > 0) {\n try {\n yield JSON.parse(tail) as OllamaChatChunk;\n } catch {\n /* ignore */\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction buildOllamaChatBody(request: LlmRequest): Record<string, unknown> {\n const messages: OllamaChatMessage[] = [];\n if (request.system !== undefined) {\n messages.push({ role: \"system\", content: request.system });\n }\n for (const message of request.messages) {\n for (const out of toOllamaMessages(message)) messages.push(out);\n }\n const tools = toOllamaTools(request.tools);\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n messages,\n // ADR D192: 24h keep_alive prevents Ollama from evicting the chat model\n // when other models (embeddings, judges) are loaded between turns.\n // Cuts cold-load latency from 20-30s to single-digit ms per turn.\n keep_alive: process.env.OLLAMA_KEEP_ALIVE ?? \"24h\",\n };\n if (tools.length > 0) body.tools = tools;\n const opts: Record<string, unknown> = {};\n if (request.maxTokens !== undefined) opts.num_predict = request.maxTokens;\n if (request.temperature !== undefined) opts.temperature = request.temperature;\n if (Object.keys(opts).length > 0) body.options = opts;\n return body;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3-role transformation (system/user/assistant) with tool_result→tool role demotion + tool_use→tool_calls promotion is one cohesive mapper; splitting hurts readability.\nfunction toOllamaMessages(message: LlmMessage): OllamaChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: joinTextParts(message) }];\n }\n if (message.role === \"user\") {\n const out: OllamaChatMessage[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n content: part.content,\n tool_name: part.toolUseId,\n });\n }\n }\n const userText = joinTextParts(message);\n if (userText.length > 0) out.push({ role: \"user\", content: userText });\n return out;\n }\n // assistant\n const text = joinTextParts(message);\n const toolCalls: OllamaToolCall[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_use\") {\n toolCalls.push({\n function: { name: part.name, arguments: part.input },\n });\n }\n }\n const msg: OllamaChatMessage = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) msg.tool_calls = toolCalls;\n return [msg];\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n}\n\nfunction toOllamaTools(tools: LlmRequest[\"tools\"]): OllamaTool[] {\n if (tools === undefined || tools.length === 0) return [];\n return tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n","import { mapOllamaHttpError, mapOllamaTransportError } from \"../errors/mappers/ollama.js\";\nimport { mapOpenAICompatibleError } from \"../errors/mappers/openai-compatible.js\";\nimport { makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * Real OpenAI Chat Completions client. Streams `/v1/chat/completions` and\n * translates delta chunks into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `openai` SDK dependency.\n *\n * @internal\n */\n\nexport interface OpenAIClientOptions {\n apiKey: string;\n baseUrl?: string;\n organization?: string;\n fetch?: typeof fetch;\n /**\n * Provider name for error mapping dispatch (T1.1, ADR D185). When set\n * to `\"ollama\"`, transport and HTTP errors go through `mapOllamaTransportError`\n * / `mapOllamaHttpError` for actionable messages before falling back to\n * the generic OpenAI-compatible mapper. Default `\"openai\"`.\n */\n providerName?: string;\n}\n\ninterface OpenAIDeltaChunk {\n choices?: Array<{\n index: number;\n delta?: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n /**\n * OpenAI + OpenRouter extended usage (D376). Anthropic prompt caching\n * surfaces as `prompt_tokens_details.cached_tokens` on OpenRouter passthrough;\n * native OpenAI exposes the same field on `chatcmpl-*` responses.\n */\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n /** Anthropic-on-OpenRouter passes cache_creation_tokens top-level (cline#10266). */\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\nexport class OpenAIClient implements LlmClient {\n readonly name = \"openai\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OpenAIClientOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.openai.com\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.options.apiKey}`,\n };\n if (this.options.organization !== undefined) {\n headers[\"openai-organization\"] = this.options.organization;\n }\n const providerId = this.options.providerName ?? this.name;\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(buildOpenAIBody(request)),\n });\n } catch (fetchErr) {\n // T1.1: Ollama-specific transport error mapping (ECONNREFUSED / ENOTFOUND).\n const mapped = mapOllamaTransportError({\n providerId,\n cause: fetchErr,\n endpoint: \"/v1/chat/completions\",\n });\n if (mapped !== undefined) throw mapped;\n throw fetchErr;\n }\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string for mapper raw field\n }\n // T1.1: try Ollama-specific HTTP mapper first; falls through to generic.\n const ollamaMapped = mapOllamaHttpError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n if (ollamaMapped !== undefined) throw ollamaMapped;\n // Use the openai-compatible mapper. For OpenAI proper the providerId\n // is \"openai\"; OpenRouter is handled in its own client subclass (see\n // OpenRouterClient if/when added). Providers tagged differently via\n // wrapper clients can pass their own providerId by overriding.\n throw mapOpenAICompatibleError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n }\n\n const accumulator = new OpenAIStreamAccumulator();\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.data === \"[DONE]\") break;\n let chunk: OpenAIDeltaChunk;\n try {\n chunk = JSON.parse(record.data) as OpenAIDeltaChunk;\n } catch {\n continue;\n }\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n }\n return accumulator.finish();\n }\n}\n\nclass OpenAIStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n private reasoningTokens?: number;\n private readonly toolCalls = new Map<number, { id: string; name: string; args: string }>();\n\n consume(chunk: OpenAIDeltaChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n this.applyUsage(chunk.usage);\n for (const choice of chunk.choices ?? []) {\n const textEvent = this.applyContentDelta(choice.delta?.content);\n if (textEvent !== undefined) events.push(textEvent);\n this.mergeToolCallDeltas(choice.delta?.tool_calls);\n this.applyFinishReason(choice.finish_reason);\n }\n return events;\n }\n\n private applyUsage(usage: OpenAIDeltaChunk[\"usage\"]): void {\n if (usage?.prompt_tokens !== undefined) this.inputTokens = usage.prompt_tokens;\n if (usage?.completion_tokens !== undefined) this.outputTokens = usage.completion_tokens;\n // D376: cache + reasoning buckets via OpenRouter passthrough + OpenAI native.\n const cachedDetail = usage?.prompt_tokens_details?.cached_tokens;\n if (cachedDetail !== undefined) this.cacheReadTokens = cachedDetail;\n const reasoningDetail = usage?.completion_tokens_details?.reasoning_tokens;\n if (reasoningDetail !== undefined) this.reasoningTokens = reasoningDetail;\n // cline#10266 top-level fallback for Anthropic-on-OpenRouter.\n if (usage?.cache_read_input_tokens !== undefined) {\n this.cacheReadTokens = usage.cache_read_input_tokens;\n }\n if (usage?.cache_creation_input_tokens !== undefined) {\n this.cacheWriteTokens = usage.cache_creation_input_tokens;\n }\n }\n\n private applyContentDelta(content: string | undefined): LlmEvent | undefined {\n if (typeof content !== \"string\" || content.length === 0) return undefined;\n this.text += content;\n return { type: \"text_delta\", text: content };\n }\n\n private mergeToolCallDeltas(\n deltas: NonNullable<NonNullable<OpenAIDeltaChunk[\"choices\"]>[number][\"delta\"]>[\"tool_calls\"],\n ): void {\n for (const call of deltas ?? []) {\n const existing = this.toolCalls.get(call.index) ?? { id: \"\", name: \"\", args: \"\" };\n if (call.id !== undefined) existing.id = call.id;\n if (call.function?.name !== undefined) existing.name = call.function.name;\n if (call.function?.arguments !== undefined) existing.args += call.function.arguments;\n this.toolCalls.set(call.index, existing);\n }\n }\n\n private applyFinishReason(reason: string | null | undefined): void {\n if (reason === undefined || reason === null) return;\n this.stopReason = mapOpenAIFinish(reason);\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const call of this.toolCalls.values()) {\n const input = parseToolArguments(call.args);\n toolCalls.push({ type: \"tool_use\", id: call.id, name: call.name, input });\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n reasoningTokens: this.reasoningTokens,\n });\n }\n}\n\nfunction mapOpenAIFinish(reason: string): LlmStopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"end_turn\";\n default:\n return \"end_turn\";\n }\n}\n\nfunction buildOpenAIBody(request: LlmRequest): Record<string, unknown> {\n const messages: Array<Record<string, unknown>> = [];\n if (request.system !== undefined) messages.push({ role: \"system\", content: request.system });\n for (const message of request.messages) {\n for (const out of toOpenAIMessages(message)) messages.push(out);\n }\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n // D376: opt-in to OpenAI's final-chunk usage record (no-op for providers\n // that don't honor it; OpenRouter / OpenAI both respect it).\n stream_options: { include_usage: true },\n messages,\n };\n if (request.maxTokens !== undefined) body.max_tokens = request.maxTokens;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: { name: tool.name, description: tool.description, parameters: tool.inputSchema },\n }));\n }\n return body;\n}\n\nfunction toOpenAIMessages(message: LlmMessage): Array<Record<string, unknown>> {\n if (message.role === \"system\") return [systemMessage(message)];\n if (message.role === \"user\") return userOrToolMessages(message);\n return [assistantMessage(message)];\n}\n\nfunction systemMessage(message: LlmMessage): Record<string, unknown> {\n return { role: \"system\", content: joinTextParts(message) };\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => (part as { text: string }).text)\n .join(\"\\n\");\n}\n\n/**\n * Translate a logical `user` turn. If the turn contains tool_result parts\n * they must be emitted as `role: \"tool\"` messages with matching\n * `tool_call_id` — OpenAI rejects tool_calls followed by a user message.\n * Plain text parts (and any other parts) collapse into a single user\n * message that follows the tool messages.\n */\nfunction userOrToolMessages(message: LlmMessage): Array<Record<string, unknown>> {\n const out: Array<Record<string, unknown>> = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n tool_call_id: part.toolUseId,\n content: part.content,\n });\n }\n }\n const userText = joinTextParts(message);\n if (userText.length > 0) out.push({ role: \"user\", content: userText });\n return out;\n}\n\nfunction assistantMessage(message: LlmMessage): Record<string, unknown> {\n const text = joinTextParts(message);\n const toolCalls = message.content\n .filter((part) => part.type === \"tool_use\")\n .map((part) => {\n const tc = part as { id: string; name: string; input: Record<string, unknown> };\n return {\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.input) },\n };\n });\n const result: Record<string, unknown> = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) result.tool_calls = toolCalls;\n return result;\n}\n","/**\n * `LlmClient` wrapper that pools multiple API keys for the same\n * provider and rotates on HTTP 429/402/401 (ADRs D123-D133).\n *\n * Composition wrapper (D127) — wraps a builder that produces a real\n * `LlmClient` for a given API key. The wrapper picks a key via the\n * pool, instantiates the real client, attempts the stream, and on a\n * pre-stream error decides retry-vs-rotate per the decision matrix.\n *\n * Once `yield*` starts (first event received), rotation is impossible —\n * partial output would corrupt the stream. Same contract as\n * `FallbackLlmClient` (D2).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n CredentialPoolExhaustedError,\n NetworkError,\n RateLimitError,\n} from \"../../errors.js\";\nimport type { CredentialPool } from \"./credential-pool.js\";\nimport { relayStream, tryFirstEvent } from \"./stream-relay.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/** Decision returned by `classifyAndDecide`. */\ntype Decision = \"retry\" | \"rotate\" | \"propagate\";\n\n/**\n * Pool-aware `LlmClient`. Constructs real clients on demand via\n * `buildClient(apiKey)` — kept lazy so the pool can pick AT request\n * time (not at construction) and rotation produces a fresh client\n * each iteration.\n *\n * @internal\n */\nexport class PoolAwareLlmClient implements LlmClient {\n readonly name: string;\n\n constructor(\n private readonly pool: CredentialPool,\n private readonly buildClient: (apiKey: string) => LlmClient,\n ) {\n this.name = `pool-aware:${pool.provider}`;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: stream() must serialize pool-select → build client → first-event probe → classify → retry/rotate/propagate. Extracting helpers fragments the linear narrative; the comments above each branch keep it readable.\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n let hasRetried429 = false;\n while (true) {\n if (signal.aborted) throw abortError(signal);\n\n const entry = await this.pool.select();\n if (entry === null) {\n throw new CredentialPoolExhaustedError(\n `All ${this.pool.provider} credentials exhausted; next retry available at ${\n this.nextRetryHint() ?? \"unknown\"\n }`,\n { provider: this.pool.provider, nextRetryAt: this.nextRetryHint() },\n );\n }\n\n // EC-D: a failure inside buildClient (e.g., invalid baseUrl) is\n // a transport-config bug, NOT a credential failure. Propagate\n // without marking the entry exhausted.\n const realClient: LlmClient = this.buildClient(entry.accessToken);\n\n const attempt = await tryFirstEvent(realClient, request, signal);\n if (attempt.kind === \"ok\") {\n // Stream started — rotation is no longer possible.\n return yield* relayStream(attempt.generator, attempt.firstResult);\n }\n\n const decision = classifyAndDecide(attempt.error, hasRetried429);\n if (decision === \"retry\") {\n // D126: first 429 retries the same key. Don't mark exhausted yet.\n hasRetried429 = true;\n continue;\n }\n if (decision === \"rotate\") {\n // EC-A: persistence failures during rotate must NOT abort the\n // stream. Pool state in-memory is the source of truth; disk\n // staleness self-corrects on the next successful save.\n try {\n await this.pool.markExhaustedAndRotate({\n entryId: entry.id,\n statusCode: attempt.error.metadata?.statusCode ?? inferStatusCode(attempt.error),\n ...(parseRetryAfterMs(attempt.error) !== undefined\n ? { resetAtMs: parseRetryAfterMs(attempt.error) }\n : {}),\n });\n } catch (persistErr) {\n process.stderr.write(\n `[theokit-sdk] credential-pool: persist failed during rotate; continuing in-memory: ${\n persistErr instanceof Error ? persistErr.message : String(persistErr)\n }\\n`,\n );\n }\n hasRetried429 = false;\n continue;\n }\n // decision === \"propagate\"\n throw attempt.error;\n }\n }\n\n /**\n * Earliest epoch ms among entries' `lastErrorResetAt` — best estimate\n * for the caller's `CredentialPoolExhaustedError.nextRetryAt`.\n */\n private nextRetryHint(): number | undefined {\n const resets = this.pool\n .list()\n .map((e) => e.lastErrorResetAt)\n .filter((v): v is number => v !== undefined);\n return resets.length === 0 ? undefined : Math.min(...resets);\n }\n}\n\n/**\n * Decision matrix per ADR D125 + D126. Pure function — testable in isolation.\n *\n * @internal\n */\nexport function classifyAndDecide(\n error: RateLimitError | AuthenticationError | NetworkError,\n hasRetried429: boolean,\n): Decision {\n // 5xx / network errors: pool doesn't help — propagate so cross-provider\n // fallback (FallbackLlmClient) can try a different provider.\n if (error instanceof NetworkError) return \"propagate\";\n\n // 401/403: rotate. No OAuth refresh in v1 (out of scope).\n if (error instanceof AuthenticationError) return \"rotate\";\n\n // RateLimitError covers 429 AND 402 (billing/quota) — distinguish via statusCode.\n const status = error.metadata?.statusCode ?? 429;\n if (status === 402) return \"rotate\"; // immediate, no retry (billing won't recover in ms)\n\n // 429: retry once, rotate on second.\n return hasRetried429 ? \"rotate\" : \"retry\";\n}\n\n/**\n * Convert provider's `retry-after` hint (seconds) into epoch ms.\n * The error mapper (D67) normalizes the header into `metadata.retryAfter`\n * (numeric seconds form only). Older formats land in `metadata.raw`.\n *\n * @internal\n */\nexport function parseRetryAfterMs(\n error: RateLimitError | AuthenticationError | NetworkError,\n): number | undefined {\n const seconds = error.metadata?.retryAfter;\n if (typeof seconds === \"number\" && seconds > 0) {\n return Date.now() + seconds * 1000;\n }\n return undefined;\n}\n\nfunction inferStatusCode(error: RateLimitError | AuthenticationError | NetworkError): number {\n if (error instanceof AuthenticationError) return 401;\n if (error instanceof RateLimitError) return 429;\n return 0;\n}\n\nfunction abortError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n return new Error(\"AbortError\");\n}\n","/**\n * GCP Vertex AI client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D292, D293).\n *\n * v1 uses `:rawPredict` (non-streaming). Streaming via `:streamRawPredict`\n * with SSE follows the same shape but is gated behind a future iteration —\n * v1 returns the full response as a single delta to keep the streaming\n * interface contract.\n *\n * Body massage (D292):\n * - inject `anthropic_version: \"vertex-2023-10-16\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body\n *\n * Uses native `fetch` only — no `@anthropic-ai/vertex-sdk` (D294).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapVertexError } from \"../errors/mappers/vertex.js\";\nimport { resolveVertexBaseUrl, stripVertexPrefix } from \"../providers/builtin/vertex.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexAnthropicClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /**\n * OAuth access token. When provided, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveVertexAccessToken()` (D288).\n */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexAnthropicClient implements LlmClient {\n readonly name = \"vertex_anthropic\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: VertexAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private resolveProjectOrThrow(): string {\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId !== undefined) return projectId;\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run `gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n\n private async resolveTokenOrThrow(): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromAdc = await resolveVertexAccessToken();\n if (fromAdc !== undefined && fromAdc.length > 0) return fromAdc;\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run `gcloud auth application-default login` or set GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const projectId = this.resolveProjectOrThrow();\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken = await this.resolveTokenOrThrow();\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"anthropic\" });\n const bareModel = stripVertexPrefix(request.model);\n const endpoint = `/models/${encodeURIComponent(bareModel)}:rawPredict`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token: accessToken,\n body: buildVertexAnthropicBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapVertexError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildVertexAnthropicBody(request: LlmRequest): Record<string, unknown> {\n // D292: anthropic_version is REQUIRED in body (not header) and `model` is stripped.\n return {\n anthropic_version: \"vertex-2023-10-16\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * GCP Vertex AI HTTP error mapper (ADRs D67, D300).\n *\n * Vertex returns `{ error: { code, status, message, details } }` (Google\n * AIP-193 standard error shape).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface VertexErrorBody {\n error?: {\n code?: number;\n status?: string;\n message?: string;\n details?: unknown;\n };\n}\n\nexport interface MapVertexErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype VertexCode =\n | \"rate_limit\"\n | \"auth_unauthenticated\"\n | \"auth_permission\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nconst VERTEX_RULES: ReadonlyArray<{ test: (s: number, e: string) => boolean; code: VertexCode }> = [\n { test: (s, e) => s === 429 || e === \"RESOURCE_EXHAUSTED\", code: \"rate_limit\" },\n { test: (s, e) => s === 401 || e === \"UNAUTHENTICATED\", code: \"auth_unauthenticated\" },\n { test: (s, e) => s === 403 || e === \"PERMISSION_DENIED\", code: \"auth_permission\" },\n {\n test: (s, e) =>\n s === 400 || e === \"INVALID_ARGUMENT\" || e === \"FAILED_PRECONDITION\" || e === \"NOT_FOUND\",\n code: \"invalid_request\",\n },\n { test: (s, e) => s === 408 || e === \"DEADLINE_EXCEEDED\", code: \"timeout\" },\n { test: (s) => s >= 500, code: \"server_error\" },\n];\n\nfunction classifyVertexError(args: MapVertexErrorArgs, errStatus: string): VertexCode {\n for (const rule of VERTEX_RULES) {\n if (rule.test(args.status, errStatus)) return rule.code;\n }\n return \"unknown\";\n}\n\nfunction vertexMetadata(args: MapVertexErrorArgs, code: string) {\n return buildErrorMetadata({\n provider: \"vertex\",\n endpoint: args.endpoint,\n code: code as Parameters<typeof buildErrorMetadata>[0][\"code\"],\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nconst VERTEX_ERROR_BUILDERS: Record<\n VertexCode,\n (args: MapVertexErrorArgs, msg: string) => TheokitAgentError\n> = {\n rate_limit: (args, msg) =>\n new RateLimitError(`Vertex quota exhausted: ${msg}`, {\n metadata: vertexMetadata(args, \"rate_limit\"),\n }),\n auth_unauthenticated: (args, msg) =>\n new AuthenticationError(`Vertex unauthenticated: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n auth_permission: (args, msg) =>\n new AuthenticationError(`Vertex permission denied: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n invalid_request: (args, msg) =>\n new ConfigurationError(`Vertex validation: ${msg}`, {\n metadata: vertexMetadata(args, \"invalid_request\"),\n }),\n timeout: (args, msg) =>\n new NetworkError(`Vertex timeout: ${msg}`, { metadata: vertexMetadata(args, \"timeout\") }),\n server_error: (args, msg) =>\n new NetworkError(`Vertex server error: ${msg}`, {\n metadata: vertexMetadata(args, \"server_error\"),\n }),\n unknown: (args, msg) =>\n new UnknownAgentError(`Vertex unknown: ${msg}`, { metadata: vertexMetadata(args, \"unknown\") }),\n};\n\nexport function mapVertexError(args: MapVertexErrorArgs): TheokitAgentError {\n const parsed = parseBody(args.body);\n const errStatus = parsed.error?.status ?? \"\";\n const message = parsed.error?.message ?? \"Vertex request failed\";\n const code = classifyVertexError(args, errStatus);\n return VERTEX_ERROR_BUILDERS[code](args, message);\n}\n\nfunction parseBody(body: unknown): VertexErrorBody {\n if (body !== null && typeof body === \"object\") return body as VertexErrorBody;\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body) as VertexErrorBody;\n } catch {\n return {};\n }\n }\n return {};\n}\n","/**\n * Vertex AI access token + config resolution (ADRs D288, D295).\n *\n * Uses `google-auth-library` (required peer dep) for ADC discovery:\n * 1. `GOOGLE_APPLICATION_CREDENTIALS` env (path to Service Account JSON)\n * 2. `gcloud auth application-default login` cached credentials\n * 3. Metadata server (GCE/GKE/Cloud Run/Cloud Functions)\n * 4. Workload Identity Federation (WIF; configured via Service Account JSON)\n *\n * EC-3 absorbed: differentiate \"peer dep missing\" (throws ConfigurationError\n * with install hint) from \"no credentials in ADC chain\" (returns undefined\n * so caller can throw a clearer downstream error).\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\ninterface GoogleAuthClient {\n getAccessToken: () => Promise<{ token: string | null }>;\n}\n\ninterface GoogleAuthLib {\n GoogleAuth: new (opts: {\n scopes: string[];\n }) => {\n getClient: () => Promise<GoogleAuthClient>;\n };\n}\n\nlet cachedAuthClient: GoogleAuthClient | undefined;\n\nconst SCOPE_CLOUD_PLATFORM = \"https://www.googleapis.com/auth/cloud-platform\";\n\nexport async function resolveVertexAccessToken(): Promise<string | undefined> {\n if (cachedAuthClient === undefined) {\n cachedAuthClient = await getAuthClientOrThrow();\n }\n try {\n const result = await cachedAuthClient.getAccessToken();\n return result.token ?? undefined;\n } catch {\n // ADC chain exhausted — caller (router) emits the helpful error.\n return undefined;\n }\n}\n\nasync function getAuthClientOrThrow(): Promise<GoogleAuthClient> {\n let mod: GoogleAuthLib;\n try {\n const r = createRequire(import.meta.url);\n mod = r(\"google-auth-library\") as GoogleAuthLib;\n } catch (err) {\n // EC-3: differentiate module-not-found from runtime ADC failure.\n const isModuleMissing =\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") ||\n (err as { code?: string }).code === \"MODULE_NOT_FOUND\");\n if (isModuleMissing) {\n throw new ConfigurationError(\n \"Vertex provider requires `google-auth-library`. Install: `pnpm add google-auth-library`.\",\n { code: \"auth_failed\", cause: err },\n );\n }\n throw err;\n }\n try {\n const auth = new mod.GoogleAuth({ scopes: [SCOPE_CLOUD_PLATFORM] });\n return await auth.getClient();\n } catch (err) {\n // ADC chain exhausted at client construction time — return a stub that\n // forces resolveVertexAccessToken to return undefined.\n process.stderr.write(\n `[theokit-sdk] Vertex ADC initialization failed: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return { getAccessToken: async () => ({ token: null }) };\n }\n}\n\n/** Resolve project id via env vars (env-only in v1). */\nexport function resolveVertexProjectId(): string | undefined {\n return (\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GOOGLE_CLOUD_PROJECT_ID ??\n process.env.GCLOUD_PROJECT\n );\n}\n\n/** Resolve Vertex location (region) from env; defaults to `us-central1`. */\nexport function resolveVertexLocation(): string {\n return process.env.GOOGLE_CLOUD_LOCATION ?? process.env.CLOUD_ML_REGION ?? \"us-central1\";\n}\n\n/** Test seam — reset cached auth client. */\nexport function __resetVertexAuth(): void {\n cachedAuthClient = undefined;\n}\n\n/** Test seam — inject a custom client for unit tests. */\nexport function __setVertexAuthClientForTests(client: GoogleAuthClient | undefined): void {\n cachedAuthClient = client;\n}\n","/**\n * GCP Vertex AI Gemini client (Adoption Roadmap #8; ADR D291).\n *\n * Uses the **OpenAI-compat** endpoint:\n * POST https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{P}/locations/{L}/endpoints/openapi/chat/completions\n *\n * Wraps `OpenAIClient` with the Vertex baseUrl + lazy OAuth token from\n * `google-auth-library` (D288). Limitation: Vertex silently drops\n * unsupported OpenAI params (D264-style trade-off, documented in docs.md).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { resolveVertexBaseUrl } from \"../providers/builtin/vertex.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexGeminiClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /** When non-empty, used as-is. Otherwise resolved lazily via ADC. */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexGeminiClient implements LlmClient {\n readonly name = \"vertex_gemini\";\n\n constructor(private readonly options: VertexGeminiClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // EC-1 absorbed: helpful errors when projectId / token missing.\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId === undefined) {\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run \" +\n \"`gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken =\n this.options.apiKey !== undefined && this.options.apiKey.length > 0\n ? this.options.apiKey\n : await resolveVertexAccessToken();\n if (accessToken === undefined || accessToken.length === 0) {\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run \" +\n \"`gcloud auth application-default login` or set \" +\n \"GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n // Vertex OpenAI-compat URL: baseUrl includes `.../endpoints/openapi`.\n // OpenAIClient appends `/v1/chat/completions` which gives the wrong path —\n // so we strip the `/v1/` suffix from our baseUrl construction by using\n // the parent URL and letting OpenAIClient add the suffix back.\n //\n // Resolved baseUrl (target):\n // .../endpoints/openapi/chat/completions\n // OpenAIClient builds:\n // {baseUrl}/v1/chat/completions\n // So we need baseUrl = `.../endpoints/openapi-no-suffix` such that\n // `{baseUrl}/v1/chat/completions` = `.../endpoints/openapi/chat/completions`.\n // That's not achievable via simple concat; the cleanest path is to\n // delegate directly using a custom URL — but to keep the existing\n // OpenAIClient code-path, we set baseUrl so that the suffix is correct\n // by mounting \"openapi\" as the leaf and letting `/v1/chat/completions`\n // append. Vertex's documented path is exactly:\n // .../endpoints/openapi/chat/completions (NO /v1)\n // We achieve this by providing a base ending in `/endpoints` and\n // re-mapping `/v1/chat/completions` → `/openapi/chat/completions`\n // via a custom URL builder client.\n //\n // For v1 we ship a minimal own client that targets the exact endpoint.\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"gemini\" });\n const url = `${baseUrl}/chat/completions`;\n\n // Reuse OpenAIClient by injecting a baseUrl that matches its `/v1/chat/completions` suffix.\n // To avoid that suffix mismatch, we bypass OpenAIClient.stream() entirely and\n // do a direct fetch — but Gemini's response shape IS OpenAI shape, so we\n // borrow OpenAIClient's accumulator via composition: pre-build the body,\n // then hand off to OpenAIClient with a synthetic baseUrl whose `/v1/chat/completions`\n // suffix lands on our actual endpoint.\n //\n // Simplest: create a wrapper fetch that rewrites the URL before delegating.\n const innerFetch = this.options.fetch ?? fetch;\n const rewriteFetch: typeof fetch = (input, init) => {\n // OpenAIClient calls `${baseUrl}/v1/chat/completions`. We rewrite that to\n // the actual Vertex URL.\n const requested =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : (input as Request).url;\n const targetUrl = requested.endsWith(\"/v1/chat/completions\") ? url : requested;\n return innerFetch(targetUrl, init);\n };\n\n // Delegate to OpenAIClient with auth + rewrite.\n const inner = new OpenAIClient({\n apiKey: accessToken,\n baseUrl: \"https://_vertex_placeholder\",\n providerName: \"vertex\",\n fetch: rewriteFetch,\n });\n return yield* inner.stream(request, signal);\n }\n}\n","/**\n * Vertex AI dispatcher (Adoption Roadmap #8; ADRs D291, D292, D301).\n *\n * `selectTransport` doesn't see the model id (the credential resolution\n * happens before request dispatch). This client inspects `request.model`\n * at stream time and delegates to either `VertexGeminiClient` (OpenAI-compat\n * for Gemini) or `VertexAnthropicClient` (`:rawPredict` for Claude).\n *\n * @internal\n */\n\nimport { inferModelDialect } from \"../providers/builtin/vertex.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport { VertexAnthropicClient } from \"./vertex-anthropic.js\";\nimport { VertexGeminiClient } from \"./vertex-gemini.js\";\n\nexport interface VertexRouterClientOptions {\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexRouterClient implements LlmClient {\n readonly name = \"vertex\";\n\n constructor(private readonly options: VertexRouterClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const dialect = inferModelDialect(request.model);\n if (dialect === \"anthropic\") {\n const inner = new VertexAnthropicClient(this.options);\n return yield* inner.stream(request, signal);\n }\n const inner = new VertexGeminiClient(this.options);\n return yield* inner.stream(request, signal);\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { isAbsolute } from \"node:path\";\n\nimport { ConfigurationError, NetworkError } from \"../../errors.js\";\nimport type {\n McpHttpServerConfig,\n McpServerConfig,\n McpStdioServerConfig,\n} from \"../../types/mcp.js\";\nimport { safePathJoin } from \"../security/path-guard.js\";\n\n/**\n * Real MCP client implementing the subset of the 2024-11-05 spec used by the\n * SDK agent loop: `initialize`, `tools/list`, `tools/call`. Both stdio and\n * http transports are wired; sse uses the same wire format as http with a\n * streaming response handled identically by the JSON-RPC reader.\n *\n * @internal\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface McpToolCallResult {\n content: Array<{ type: \"text\"; text: string }>;\n isError?: boolean;\n}\n\nexport interface McpClient {\n readonly name: string;\n initialize(): Promise<void>;\n listTools(): Promise<McpTool[]>;\n callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult>;\n close(): Promise<void>;\n}\n\nexport function createMcpClient(name: string, config: McpServerConfig): McpClient {\n if (isStdio(config)) return new StdioMcpClient(name, config);\n return new HttpMcpClient(name, config as McpHttpServerConfig);\n}\n\ntype RpcRequester = (method: string, params: Record<string, unknown>) => Promise<unknown>;\n\nasync function rpcInitialize(request: RpcRequester): Promise<void> {\n await request(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {} },\n clientInfo: { name: \"theokit-sdk\", version: \"0.0.0\" },\n });\n}\n\nasync function rpcListTools(request: RpcRequester): Promise<McpTool[]> {\n const response = await request(\"tools/list\", {});\n return (response as { result?: { tools?: McpTool[] } }).result?.tools ?? [];\n}\n\nasync function rpcCallTool(\n request: RpcRequester,\n name: string,\n args: Record<string, unknown>,\n): Promise<McpToolCallResult> {\n const response = await request(\"tools/call\", { name, arguments: args });\n const result = (response as { result?: McpToolCallResult }).result;\n if (result === undefined) {\n return { content: [{ type: \"text\", text: \"MCP returned empty result\" }], isError: true };\n }\n return result;\n}\n\n/** Shared base wiring `initialize` / `listTools` / `callTool` onto an\n * abstract RPC `request` implementation. Subclasses define the transport.\n */\nabstract class BaseMcpClient implements McpClient {\n abstract readonly name: string;\n\n abstract close(): Promise<void>;\n\n protected abstract request(method: string, params: Record<string, unknown>): Promise<unknown>;\n\n initialize(): Promise<void> {\n return rpcInitialize((method, params) => this.request(method, params));\n }\n\n listTools(): Promise<McpTool[]> {\n return rpcListTools((method, params) => this.request(method, params));\n }\n\n callTool(name: string, args: Record<string, unknown>): Promise<McpToolCallResult> {\n return rpcCallTool((method, params) => this.request(method, params), name, args);\n }\n}\n\nfunction isStdio(config: McpServerConfig): config is McpStdioServerConfig {\n if ((config as { type?: string }).type === \"stdio\") return true;\n return \"command\" in config && typeof (config as { command?: unknown }).command === \"string\";\n}\n\ninterface RpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nclass StdioMcpClient extends BaseMcpClient {\n readonly name: string;\n private child: ChildProcessWithoutNullStreams | undefined;\n private nextId = 1;\n private readonly pending = new Map<number, (response: unknown) => void>();\n private buffer = \"\";\n\n constructor(\n name: string,\n private readonly config: McpStdioServerConfig,\n ) {\n super();\n this.name = name;\n }\n\n override async initialize(): Promise<void> {\n // ADR D79-D80: relative MCP `cwd` paths must safe-join under process.cwd()\n // so a malicious `.theokit/mcp.json` cannot point a server process at\n // `../../../etc`. Absolute paths are trusted (user explicitly chose).\n const resolvedCwd = resolveMcpCwd(this.config.cwd);\n const child = spawn(this.config.command, this.config.args ?? [], {\n cwd: resolvedCwd,\n env: { ...process.env, ...(this.config.env ?? {}) },\n });\n this.child = child;\n child.stdout.on(\"data\", (chunk: Buffer) => this.consume(chunk));\n child.stderr.on(\"data\", () => undefined);\n child.on(\"error\", () => {\n for (const resolver of this.pending.values()) {\n resolver({ error: { message: \"MCP process crashed\" } });\n }\n this.pending.clear();\n });\n await super.initialize();\n }\n\n async close(): Promise<void> {\n if (this.child === undefined) return;\n this.child.kill(\"SIGTERM\");\n this.child = undefined;\n }\n\n private consume(chunk: Buffer): void {\n this.buffer += chunk.toString(\"utf8\");\n let newlineIndex = this.buffer.indexOf(\"\\n\");\n while (newlineIndex !== -1) {\n const line = this.buffer.slice(0, newlineIndex).trim();\n this.buffer = this.buffer.slice(newlineIndex + 1);\n if (line.length > 0) this.handleLine(line);\n newlineIndex = this.buffer.indexOf(\"\\n\");\n }\n }\n\n private handleLine(line: string): void {\n let message: { id?: number };\n try {\n message = JSON.parse(line) as { id?: number };\n } catch {\n return;\n }\n if (typeof message.id !== \"number\") return;\n const resolver = this.pending.get(message.id);\n if (resolver === undefined) return;\n this.pending.delete(message.id);\n resolver(message);\n }\n\n protected request(method: string, params: Record<string, unknown>): Promise<unknown> {\n if (this.child === undefined) {\n return Promise.reject(\n new ConfigurationError(`MCP ${this.name} is not initialized`, { code: \"mcp_not_init\" }),\n );\n }\n const id = this.nextId++;\n const payload: RpcRequest = { jsonrpc: \"2.0\", id, method, params };\n this.child.stdin.write(`${JSON.stringify(payload)}\\n`);\n return new Promise<unknown>((resolve) => {\n this.pending.set(id, resolve);\n });\n }\n}\n\nclass HttpMcpClient extends BaseMcpClient {\n readonly name: string;\n private nextId = 1;\n private readonly fetchImpl: typeof fetch;\n\n constructor(\n name: string,\n private readonly config: McpHttpServerConfig,\n fetchImpl: typeof fetch = fetch,\n ) {\n super();\n this.name = name;\n this.fetchImpl = fetchImpl;\n }\n\n close(): Promise<void> {\n return Promise.resolve();\n }\n\n protected async request(method: string, params: Record<string, unknown>): Promise<unknown> {\n const id = this.nextId++;\n const payload: RpcRequest = { jsonrpc: \"2.0\", id, method, params };\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n ...(this.config.headers ?? {}),\n };\n const response = await this.fetchImpl(this.config.url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n throw new NetworkError(`MCP ${this.name} returned ${response.status}`, {\n code: \"mcp_http_error\",\n });\n }\n return (await response.json()) as unknown;\n }\n}\n\n/**\n * Resolve an MCP server `cwd` field safely. Absolute paths are returned\n * as-is (user explicitly chose absolute); relative paths are joined under\n * `process.cwd()` and prefix-checked via `safePathJoin`.\n *\n * @internal\n */\nfunction resolveMcpCwd(configCwd: string | undefined): string {\n if (configCwd === undefined) return process.cwd();\n if (isAbsolute(configCwd)) return configCwd;\n return safePathJoin(process.cwd(), configCwd);\n}\n","import { createRequire } from \"node:module\";\n\n/**\n * Adapter helper: safely require a module via `createRequire`, returning\n * `undefined` when not installed. Lives in its own module so adapters\n * (langfuse, sentry, posthog) can import without creating a cycle with\n * `adapter-registry.ts` (which lists them).\n *\n * @internal\n */\nexport function safeRequire<T = unknown>(moduleName: string): T | undefined {\n try {\n const r = createRequire(import.meta.url);\n return r(moduleName) as T;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Shared adapter interface. Each adapter (langfuse, sentry, posthog) imports\n * this from `safe-require.ts` rather than `adapter-registry.ts`.\n *\n * @internal\n */\nexport interface TelemetryAdapter {\n moduleName: string;\n displayName: string;\n detect: () => boolean;\n register: () => void;\n}\n","import { safeRequire, type TelemetryAdapter } from \"../safe-require.js\";\n\n/**\n * Langfuse OTel adapter (ADR D42). Detects `@langfuse/node` and registers\n * `LangfuseSpanProcessor` on the active OTel provider.\n *\n * EC-12: if a Langfuse processor is already attached, skips silently.\n *\n * @internal\n */\n\ninterface LangfuseModule {\n Langfuse: new (opts?: Record<string, unknown>) => unknown;\n LangfuseSpanProcessor?: new (opts: { langfuse: unknown }) => unknown;\n}\n\ninterface OTelTraceApi {\n getTracerProvider(): {\n addSpanProcessor?: (processor: unknown) => void;\n getActiveSpanProcessor?: () => unknown;\n };\n}\n\nlet registeredHere = false;\n\nexport const langfuseAdapter: TelemetryAdapter = {\n moduleName: \"@langfuse/node\",\n displayName: \"Langfuse\",\n detect: () => safeRequire<LangfuseModule>(\"@langfuse/node\") !== undefined,\n register: () => {\n if (registeredHere) return;\n const lf = safeRequire<LangfuseModule>(\"@langfuse/node\");\n const otel = safeRequire<{ trace: OTelTraceApi }>(\"@opentelemetry/api\");\n if (lf === undefined || otel === undefined) return;\n const provider = otel.trace.getTracerProvider();\n if (provider.addSpanProcessor === undefined) {\n // Provider is a no-op proxy — user hasn't configured a real one.\n // Skip; their app likely doesn't use OTel pipelines yet.\n return;\n }\n // EC-12: detect existing Langfuse processor on the provider.\n const existing = provider.getActiveSpanProcessor?.();\n if (typeof existing === \"object\" && existing !== null) {\n const ctor = existing.constructor?.name ?? \"\";\n if (ctor.toLowerCase().includes(\"langfuse\")) {\n // Already wired — skip.\n registeredHere = true;\n return;\n }\n }\n if (lf.LangfuseSpanProcessor === undefined) {\n // Langfuse v2: no OTel span processor. Skip with a one-time hint.\n process.stderr.write(\n \"[theokit-sdk] @langfuse/node detected but LangfuseSpanProcessor not found (v2?). Use Langfuse v3+ for auto-instrumentation.\\n\",\n );\n return;\n }\n const client = new lf.Langfuse();\n const processor = new lf.LangfuseSpanProcessor({ langfuse: client });\n provider.addSpanProcessor(processor);\n registeredHere = true;\n },\n};\n","import { safeRequire, type TelemetryAdapter } from \"../safe-require.js\";\n\n/**\n * PostHog OTel adapter (ADR D42). Detects `posthog-node` and captures\n * key span events as PostHog events. Privacy-respecting per\n * `telemetry.includeContent`.\n *\n * @internal\n */\n\ninterface PostHogModule {\n PostHog: new (\n key: string,\n opts?: Record<string, unknown>,\n ) => {\n capture: (event: {\n distinctId: string;\n event: string;\n properties?: Record<string, unknown>;\n }) => void;\n shutdown?: () => Promise<void>;\n };\n}\n\ninterface OTelTraceApi {\n getTracerProvider(): {\n addSpanProcessor?: (processor: unknown) => void;\n };\n}\n\nlet registeredHere = false;\n\nexport const posthogAdapter: TelemetryAdapter = {\n moduleName: \"posthog-node\",\n displayName: \"PostHog\",\n detect: () => safeRequire<PostHogModule>(\"posthog-node\") !== undefined,\n register: () => {\n if (registeredHere) return;\n const ph = safeRequire<PostHogModule>(\"posthog-node\");\n const otel = safeRequire<{ trace: OTelTraceApi }>(\"@opentelemetry/api\");\n if (ph === undefined || otel === undefined) return;\n const key = process.env.POSTHOG_API_KEY ?? process.env.POSTHOG_PROJECT_API_KEY;\n if (typeof key !== \"string\" || key.length === 0) {\n // No PostHog key — skip silently (don't error).\n return;\n }\n const client = new ph.PostHog(key, {\n host: process.env.POSTHOG_HOST ?? \"https://us.i.posthog.com\",\n });\n\n const provider = otel.trace.getTracerProvider();\n if (provider.addSpanProcessor === undefined) return;\n\n // Minimal SpanProcessor adapter — capture each ended span as a\n // PostHog event when its name matches our agent.send/llm.call/tool.call\n // taxonomy. Privacy: only counts + IDs, no content (unless explicitly\n // enabled at the agent level — we don't have that info here, so default\n // is always counts-only).\n const processor = {\n onStart: () => {},\n onEnd: (span: {\n name: string;\n attributes: Record<string, unknown>;\n duration?: [number, number];\n }) => {\n if (\n !span.name.startsWith(\"agent.\") &&\n !span.name.startsWith(\"llm.\") &&\n !span.name.startsWith(\"tool.\")\n ) {\n return;\n }\n client.capture({\n distinctId: String(span.attributes[\"agent.id\"] ?? \"anonymous\"),\n event: `theokit.${span.name}`,\n properties: {\n // Pass through scalar attributes only.\n ...Object.fromEntries(\n Object.entries(span.attributes).filter(\n ([_, v]) =>\n typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\",\n ),\n ),\n },\n });\n },\n shutdown: async () => {\n if (client.shutdown !== undefined) await client.shutdown();\n },\n forceFlush: async () => {},\n };\n provider.addSpanProcessor(processor);\n registeredHere = true;\n },\n};\n","import { safeRequire, type TelemetryAdapter } from \"../safe-require.js\";\n\n/**\n * Sentry OTel adapter (ADR D42). Detects `@sentry/node` and attaches an\n * event-processor that enriches captured events with OTel trace context.\n *\n * Preferred path is `@sentry/opentelemetry` but that package is volatile\n * across Sentry v8; we use `@sentry/node` directly for stability. Documented\n * as a known limitation.\n *\n * @internal\n */\n\ninterface SentryModule {\n addEventProcessor?: (fn: (event: unknown) => unknown) => void;\n getActiveSpan?: () => unknown;\n isInitialized?: () => boolean;\n}\n\nlet registeredHere = false;\n\nexport const sentryAdapter: TelemetryAdapter = {\n moduleName: \"@sentry/node\",\n displayName: \"Sentry\",\n detect: () => safeRequire<SentryModule>(\"@sentry/node\") !== undefined,\n register: () => {\n if (registeredHere) return;\n const sentry = safeRequire<SentryModule>(\"@sentry/node\");\n if (sentry === undefined) return;\n // Some Sentry versions only expose addEventProcessor after Sentry.init().\n if (typeof sentry.addEventProcessor !== \"function\") {\n return;\n }\n // EC-12: only register once.\n sentry.addEventProcessor((event: unknown) => {\n // Best-effort enrichment: attach traceId/spanId from OTel active span.\n const otel = safeRequire<{\n trace: {\n getActiveSpan(): { spanContext(): { traceId: string; spanId: string } } | undefined;\n };\n }>(\"@opentelemetry/api\");\n if (otel === undefined) return event;\n const span = otel.trace.getActiveSpan();\n if (span === undefined) return event;\n const ctx = span.spanContext();\n if (typeof event === \"object\" && event !== null) {\n const contexts = (event as { contexts?: Record<string, unknown> }).contexts ?? {};\n contexts.trace = { trace_id: ctx.traceId, span_id: ctx.spanId };\n (event as { contexts?: Record<string, unknown> }).contexts = contexts;\n }\n return event;\n });\n registeredHere = true;\n },\n};\n","import type { TelemetrySettings } from \"../../types/agent.js\";\nimport { langfuseAdapter } from \"./adapters/langfuse.js\";\nimport { posthogAdapter } from \"./adapters/posthog.js\";\nimport { sentryAdapter } from \"./adapters/sentry.js\";\nimport type { TelemetryAdapter } from \"./safe-require.js\";\n\n// Re-export the shared adapter contract for callers that consume registry\n// types directly. Implementation lives in `safe-require.ts` to keep the\n// adapter modules acyclic (depcruise enforces no-circular).\nexport type { TelemetryAdapter };\n\n/**\n * Auto-instrumentation adapter registry (ADR D42).\n *\n * Each adapter feature-detects a vendor lib (`@langfuse/node`, `@sentry/node`,\n * `posthog-node`) via `createRequire` and wires it into the active OTel\n * tracer provider. Errors in any adapter are caught — they never propagate\n * to `agent.send`.\n *\n * @internal\n */\n\nconst ALL_ADAPTERS: TelemetryAdapter[] = [langfuseAdapter, sentryAdapter, posthogAdapter];\n\nlet attempted = false;\nconst registered = new Set<string>();\n\n/**\n * Try to register every detected adapter. Idempotent: subsequent calls\n * skip already-registered adapters.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: per-adapter detect/register/skip/error-handle is inherent to the registry; splitting harms the once-per-vendor narrative.\nexport function tryAutoRegisterAdapters(settings: TelemetrySettings | undefined): void {\n if (settings?.enabled !== true) return;\n if (settings.autoDetect === false) return;\n const disabled = new Set(settings.disable ?? []);\n for (const adapter of ALL_ADAPTERS) {\n if (registered.has(adapter.moduleName)) continue;\n if (disabled.has(adapter.displayName.toLowerCase())) continue;\n if (!adapter.detect()) continue;\n try {\n adapter.register();\n registered.add(adapter.moduleName);\n process.stderr.write(`[theokit-sdk] telemetry: ${adapter.displayName} auto-instrumented.\\n`);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] telemetry: ${adapter.displayName} detected but failed to register: ${message}\\n`,\n );\n }\n }\n attempted = true;\n}\n\n/**\n * Test helper: reset registration state.\n *\n * @internal\n */\nexport function _resetAdapterRegistry(): void {\n registered.clear();\n attempted = false;\n}\n\n/**\n * Test helper: check if an adapter was registered.\n *\n * @internal\n */\nexport function _isRegistered(moduleName: string): boolean {\n return registered.has(moduleName);\n}\n\n/**\n * Test helper: check if auto-detect has been attempted at least once.\n *\n * @internal\n */\nexport function _wasAttempted(): boolean {\n return attempted;\n}\n\n/**\n * Test helper: list of adapters (for inspection in tests).\n *\n * @internal\n */\nexport function _getAllAdapters(): readonly TelemetryAdapter[] {\n return ALL_ADAPTERS;\n}\n","import { createRequire } from \"node:module\";\n\n/**\n * Lazy-loaded OpenTelemetry tracer for the SDK. Consumers opt in via\n * `AgentOptions.telemetry`. When `enabled: false` (default) or when\n * `@opentelemetry/api` is not installed, every API on this module is a\n * no-op. See ADR D34. Auto-instrumentation of Langfuse/Sentry/PostHog is\n * wired here (ADR D42).\n *\n * @internal\n */\n\nimport type { TelemetrySettings } from \"../../types/agent.js\";\nimport { redactSecrets } from \"../security/index.js\";\nimport { tryAutoRegisterAdapters } from \"./adapter-registry.js\";\n\n/** Minimal shape of `@opentelemetry/api` consumed by this wrapper. */\ninterface OTelApi {\n trace: {\n getTracer(name: string, version?: string): OTelTracer;\n };\n context: {\n active(): OTelContext;\n with<T>(ctx: OTelContext, fn: () => T): T;\n };\n trace_setSpan?: (ctx: OTelContext, span: OTelSpan) => OTelContext;\n SpanStatusCode: { OK: number; ERROR: number };\n}\n\nexport interface OTelSpan {\n setAttribute(key: string, value: string | number | boolean): void;\n setAttributes(attrs: Record<string, string | number | boolean | undefined>): void;\n addEvent(name: string, attrs?: Record<string, string | number | boolean>): void;\n setStatus(status: { code: number; message?: string }): void;\n recordException(err: unknown): void;\n end(endTime?: number): void;\n spanContext(): { traceId: string; spanId: string };\n isRecording(): boolean;\n}\n\ninterface OTelContext {\n // opaque\n readonly [marker: symbol]: unknown;\n}\n\ninterface OTelTracer {\n startSpan(name: string, options?: { attributes?: Record<string, unknown> }): OTelSpan;\n startActiveSpan<T>(\n name: string,\n options: { attributes?: Record<string, unknown> } | undefined,\n fn: (span: OTelSpan) => T,\n ): T;\n}\n\n/**\n * Telemetry handle returned by {@link createTelemetry}. Callers use this to\n * start spans, add events, etc. When telemetry is disabled OR OTel is not\n * installed, every method is a safe no-op.\n *\n * @internal\n */\nexport interface TelemetryHandle {\n readonly enabled: boolean;\n readonly includeContent: boolean;\n /** Start a span. Returns a no-op span if telemetry is disabled. */\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): OTelSpan;\n /** Start a child span inheriting the current active context. */\n startChildSpan(\n parent: OTelSpan,\n name: string,\n attrs?: Record<string, string | number | boolean>,\n ): OTelSpan;\n /** End all open spans on this handle (best-effort, used by Agent.dispose). */\n endAll(): void;\n}\n\nlet cachedOtel: OTelApi | undefined | null;\n\n/** Lazy-load `@opentelemetry/api` via createRequire. Caches null on failure. */\nfunction loadOtel(): OTelApi | null {\n if (cachedOtel === undefined) {\n try {\n const r = createRequire(import.meta.url);\n const mod = r(\"@opentelemetry/api\") as OTelApi;\n cachedOtel = mod;\n } catch {\n cachedOtel = null;\n }\n }\n return cachedOtel ?? null;\n}\n\nconst NOOP_SPAN: OTelSpan = {\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n recordException: () => {},\n end: () => {},\n spanContext: () => ({ traceId: \"0\".repeat(32), spanId: \"0\".repeat(16) }),\n isRecording: () => false,\n};\n\nconst NOOP_HANDLE: TelemetryHandle = {\n enabled: false,\n includeContent: false,\n startSpan: () => NOOP_SPAN,\n startChildSpan: () => NOOP_SPAN,\n endAll: () => {},\n};\n\n/**\n * Wrap a callable with try/catch so OTel side-effects can never propagate\n * into the agent loop. Logs once to stderr on the first failure (EC-1).\n *\n * @internal\n */\nlet warnedOnce = false;\nfunction safe<T>(op: () => T, fallback: T): T {\n try {\n return op();\n } catch (cause) {\n if (!warnedOnce) {\n warnedOnce = true;\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] telemetry exporter error (suppressed; agent.send continues): ${message}\\n`,\n );\n }\n return fallback;\n }\n}\n\n/**\n * Create a telemetry handle from the per-agent settings. Loads OTel lazily\n * and produces a no-op handle when telemetry is disabled or OTel is not\n * installed.\n *\n * @internal\n */\nexport function createTelemetry(settings: TelemetrySettings | undefined): TelemetryHandle {\n if (settings === undefined || settings.enabled !== true) return NOOP_HANDLE;\n const otel = loadOtel();\n if (otel === null) {\n // Telemetry enabled but OTel not installed — warn once and degrade to no-op.\n if (!warnedOnce) {\n warnedOnce = true;\n process.stderr.write(\n \"[theokit-sdk] telemetry.enabled = true but `@opentelemetry/api` is not installed; telemetry is a no-op.\\n\",\n );\n }\n return NOOP_HANDLE;\n }\n const tracer = safe(\n () => otel.trace.getTracer(settings.serviceName ?? \"theokit-sdk\", \"1.2.0\"),\n undefined,\n );\n if (tracer === undefined) return NOOP_HANDLE;\n\n // ADR D42: try to auto-register Langfuse / Sentry / PostHog when present.\n // Idempotent — multiple agents share the registry; subsequent calls skip.\n safe(() => tryAutoRegisterAdapters(settings), undefined);\n\n const openSpans = new Set<OTelSpan>();\n // OTel context propagation is implicit when startSpan is called inside an\n // active context. For simplicity, we always startSpan; child relationship\n // is established by callers using OTel API directly when needed. The\n // wrapper records spans in `openSpans` so dispose() can endAll().\n const startNewSpan = (name: string, attrs?: Record<string, string | number | boolean>) => {\n // T1.2 (ADR D68): redact string attrs at the boundary — values go to\n // Langfuse / Sentry / PostHog via the OTel SpanProcessor.\n const redactedAttrs = attrs === undefined ? undefined : redactAttrs(attrs);\n const span = safe(\n () => tracer.startSpan(name, redactedAttrs ? { attributes: redactedAttrs } : undefined),\n NOOP_SPAN,\n );\n if (span !== NOOP_SPAN) openSpans.add(span);\n return wrapSpan(span, openSpans);\n };\n const handle: TelemetryHandle = {\n enabled: true,\n includeContent: settings.includeContent === true,\n startSpan: startNewSpan,\n startChildSpan: (_parent, name, attrs) => startNewSpan(name, attrs),\n endAll: () => {\n for (const span of openSpans) safe(() => span.end(), undefined);\n openSpans.clear();\n },\n };\n return handle;\n}\n\n/**\n * Wrap a raw OTel span so every method goes through safe(). This is the\n * EC-1 enforcement: exporter errors thrown via setAttribute/end/etc never\n * propagate to the agent loop.\n */\nfunction wrapSpan(span: OTelSpan, openSpans: Set<OTelSpan>): OTelSpan {\n if (span === NOOP_SPAN) return span;\n return {\n setAttribute: (k, v) => safe(() => span.setAttribute(k, redactAttrValue(v)), undefined),\n setAttributes: (attrs) => safe(() => span.setAttributes(redactAttrs(attrs)), undefined),\n addEvent: (name, attrs) =>\n safe(() => span.addEvent(name, attrs ? redactAttrs(attrs) : undefined), undefined),\n setStatus: (status) => safe(() => span.setStatus(status), undefined),\n recordException: (err) => safe(() => span.recordException(err), undefined),\n end: (endTime) => {\n safe(() => span.end(endTime), undefined);\n openSpans.delete(span);\n },\n spanContext: () =>\n safe(() => span.spanContext(), { traceId: \"0\".repeat(32), spanId: \"0\".repeat(16) }),\n isRecording: () => safe(() => span.isRecording(), false),\n };\n}\n\n/**\n * Redact a single attribute value. Strings go through `redactSecrets`;\n * numbers/booleans/undefined pass through untouched. T1.2.\n *\n * @internal — exported only so unit tests can exercise the wire without\n * a real `@opentelemetry/api` install. Production callers reach it via\n * the `wrapSpan` closure.\n */\nexport function _redactAttrValueForTests<T extends string | number | boolean | undefined>(\n value: T,\n): T {\n return redactAttrValue(value);\n}\n\n/**\n * Redact every string value in an attributes record. T1.2.\n *\n * @internal — exported only so unit tests can exercise the wire.\n */\nexport function _redactAttrsForTests<\n T extends Record<string, string | number | boolean | undefined>,\n>(attrs: T): T {\n return redactAttrs(attrs);\n}\n\nfunction redactAttrValue<T extends string | number | boolean | undefined>(value: T): T {\n if (typeof value !== \"string\") return value;\n return redactSecrets(value) as T;\n}\n\nfunction redactAttrs<T extends Record<string, string | number | boolean | undefined>>(attrs: T): T {\n const out = {} as Record<string, string | number | boolean | undefined>;\n for (const [k, v] of Object.entries(attrs)) {\n out[k] = typeof v === \"string\" ? redactSecrets(v) : v;\n }\n return out as T;\n}\n\n/** Exported for tests — resets the OTel cache and the warning-once latch. */\nexport function _resetTelemetryCacheForTests(): void {\n cachedOtel = undefined;\n warnedOnce = false;\n}\n","/**\n * applyPersonalityFilter — additive narrowing of exposed tools by an\n * active personality preset's `tools` whitelist (T4.1, ADRs D102+D167).\n *\n * Contract:\n *\n * - `whitelist === undefined` → return `exposedTools` unchanged (no\n * active personality OR personality has no tool restriction).\n * - `whitelist === []` → return empty array (explicit \"no tools for\n * this persona\").\n * - Otherwise → return the subset of `exposedTools` whose `name` is\n * present in `whitelist`. Missing entries emit a one-shot stderr\n * warning per `(agentId, personalityName, missingTool)` combo\n * (advisory only — D167 says missing tools must NOT crash).\n *\n * **EC-I:** MCP-style names like `mcp__server__tool` are matched as\n * exact strings (no regex semantics) — the registry already produces\n * the verbatim name.\n *\n * **EC-15:** Duplicate entries in `whitelist` are deduped silently.\n *\n * **EC-17:** Missing names within Levenshtein distance ≤2 of an exposed\n * tool emit a \"did you mean: X\" hint inside the warning.\n *\n * The function is **pure**: it never mutates the input array.\n *\n * @internal\n */\n\nimport { warnOnce } from \"../runtime/hooks-source.js\";\n\nexport interface ToolNamed {\n readonly name: string;\n}\n\nexport interface ApplyPersonalityFilterOptions {\n /** Used in the dedup key + warning prefix so logs are traceable. */\n agentId?: string;\n /** Active personality slug — used in the dedup key + warning. */\n personalityName?: string;\n}\n\n/**\n * Filter `exposedTools` to the personality `whitelist`. Pure.\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: undefined → unchanged, empty → empty, then filter + per-missing warning with Levenshtein hint — each branch is one short line of intent.\nexport function applyPersonalityFilter<T extends ToolNamed>(\n exposedTools: ReadonlyArray<T>,\n whitelist: ReadonlyArray<string> | undefined,\n opts?: ApplyPersonalityFilterOptions,\n): ReadonlyArray<T> {\n if (whitelist === undefined) return exposedTools;\n if (whitelist.length === 0) return [];\n\n const wanted = new Set(whitelist); // EC-15: dedup\n const exposedSet = new Set(exposedTools.map((t) => t.name));\n const kept = exposedTools.filter((t) => wanted.has(t.name));\n\n // EC-17: warn once per missing tool (with did-you-mean hint when close).\n for (const name of wanted) {\n if (exposedSet.has(name)) continue;\n const hint = suggestClosest(name, exposedSet);\n const message =\n hint !== undefined\n ? `[theokit-sdk] personality \"${opts?.personalityName ?? \"?\"}\" references unknown tool \"${name}\"; did you mean \"${hint}\"?`\n : `[theokit-sdk] personality \"${opts?.personalityName ?? \"?\"}\" references unknown tool \"${name}\" (not exposed)`;\n warnOnce(\n `personality-tool-missing|${opts?.agentId ?? \"?\"}|${opts?.personalityName ?? \"?\"}|${name}`,\n message,\n );\n }\n\n return kept;\n}\n\n/**\n * Return the name in `pool` with Levenshtein distance ≤2 to `target`,\n * or undefined if none is close enough.\n *\n * Keeps cognitive complexity low: short-circuits on equal length, runs\n * the standard DP only when both names are non-trivial.\n *\n * @internal\n */\nfunction suggestClosest(target: string, pool: ReadonlySet<string>): string | undefined {\n let best: { name: string; dist: number } | undefined;\n for (const candidate of pool) {\n if (Math.abs(candidate.length - target.length) > 2) continue;\n const d = levenshtein(target, candidate);\n if (d > 2) continue;\n if (best === undefined || d < best.dist) best = { name: candidate, dist: d };\n }\n return best?.name;\n}\n\nfunction levenshtein(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n const prev: number[] = [];\n for (let j = 0; j <= b.length; j++) prev[j] = j;\n for (let i = 1; i <= a.length; i++) {\n let prevDiag = prev[0]!;\n prev[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const tmp = prev[j]!;\n prev[j] = Math.min(\n prev[j]! + 1,\n prev[j - 1]! + 1,\n prevDiag + (a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1),\n );\n prevDiag = tmp;\n }\n }\n return prev[b.length]!;\n}\n","import type { AgentOptions, CustomTool, ModelSelection } from \"../../types/agent.js\";\nimport type { Run, RunOperation, RunStatus, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport { type AgentLoopInputs, runAgentLoop } from \"../agent-loop/loop.js\";\nimport type { CustomToolSpec, MemoryToolSpec } from \"../agent-loop/loop-types.js\";\nimport { FallbackLlmClient } from \"../llm/fallback-client.js\";\nimport { parseModelId } from \"../llm/model-identifier.js\";\nimport { resolveProviderChain } from \"../llm/router.js\";\nimport { createMcpClient, type McpClient } from \"../mcp/client.js\";\nimport { getProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { createTelemetry } from \"../telemetry/tracer.js\";\nimport { applyPersonalityFilter } from \"../tool-registry/personality-filter.js\";\nimport type { SessionMessage } from \"./agent-session.js\";\nimport { FixtureRunBase, prepareRunContext } from \"./fixture-run-base.js\";\nimport type { FixtureScript } from \"./fixture-types.js\";\nimport type { HooksExecutor } from \"./hooks-executor.js\";\nimport { registerRun } from \"./run-registry.js\";\n\n/**\n * Real local Run. When the local agent has a non-fixture API key plus at\n * least one provider env credential, the agent loop drives a real LLM and\n * dispatches real tools. The output is materialized into the same\n * `FixtureScript` shape used by the fixture runtime so the `Run` surface\n * stays uniform.\n *\n * @internal\n */\n\nexport interface CreateRealLocalRunOptions {\n agentId: string;\n model: ModelSelection | undefined;\n message: string | SDKUserMessage;\n agentOptions: AgentOptions;\n sendOptions: SendOptions;\n workspaceCwd: string;\n hooks: HooksExecutor;\n /** T4.1 — PluginManager threaded from LocalAgent for plugin tools + pre_tool_call hooks. */\n pluginManager?: import(\"../plugins/manager.js\").PluginManager;\n /** Pre-resolved system prompt threaded by `LocalAgent.send`. */\n systemPrompt?: string;\n onStep?: SendOptions[\"onStep\"];\n onDelta?: SendOptions[\"onDelta\"];\n /** Prior conversation history (excluding the current user message). */\n priorMessages?: ReadonlyArray<SessionMessage>;\n /** Memory tools to register with the LLM (Phase 6 of memory-system-openclaw-parity). */\n memoryTools?: ReadonlyArray<MemoryToolSpec>;\n /**\n * Active personality tool whitelist (T4.1, ADR D167). When defined,\n * `customTools` are filtered to this subset; missing entries log a\n * one-shot warn. Undefined = no filter.\n */\n personalityToolWhitelist?: ReadonlyArray<string>;\n /** Active personality slug — used in personality-filter warnings. */\n personalityName?: string;\n}\n\nexport function createRealLocalRun(options: CreateRealLocalRunOptions): Run {\n const { userText, id, startTime } = prepareRunContext(options.message);\n const supported = new Set<RunOperation>([\"stream\", \"wait\", \"cancel\", \"conversation\"]);\n // The base Run class accepts a FixtureScript for shape; the real LLM\n // run never consumes it because `buildLoopInputs` drives the real agent\n // loop instead of replaying events. Empty script keeps the type honest.\n const unusedFixtureScript: FixtureScript = {\n events: [],\n finalStatus: \"running\",\n cancellable: false,\n conversation: [],\n };\n\n const handle = new RealLocalRun(\n {\n id,\n agentId: options.agentId,\n model: options.model,\n script: unusedFixtureScript,\n supportedOps: supported,\n startTime,\n },\n () => buildLoopInputs(options, id, userText),\n );\n handle.bootstrap();\n registerRun(handle);\n return handle;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: spread-conditional builders for optional fields (systemPrompt, onStep, onDelta, priorMessages, memoryTools, customTools, pluginManager) are the canonical pattern for shaping AgentLoopInputs; splitting hurts readability.\nfunction buildLoopInputs(\n options: CreateRealLocalRunOptions,\n runId: string,\n userText: string,\n): AgentLoopInputs {\n // ADR D182 / T1.2: infer provider from model.id prefix (`ollama/...`)\n // when caller didn't pass an explicit `providers.routes[0].provider`.\n // Aligned with OpenClaw + Hermes patterns — explicit config wins, prefix\n // inference is the zero-config fallback, env-var heuristics last.\n // Builtins must be registered BEFORE the `getProviderProfile` lookup\n // — `resolveProviderChain` triggers this lazily but the inference path\n // above runs first.\n registerBuiltins();\n const parsedModel = parseModelId(options.model?.id);\n const inferredProvider =\n parsedModel.provider !== undefined && getProviderProfile(parsedModel.provider) !== undefined\n ? parsedModel.provider\n : undefined;\n const primary =\n options.agentOptions.providers?.routes?.[0]?.provider ??\n inferredProvider ??\n detectPrimaryProvider();\n // When provider was inferred from the prefix, the model name passed to\n // the LLM must be the stripped form (Ollama expects `llama3.2:3b`, not\n // `ollama/llama3.2:3b`). When no prefix was found, pass id unchanged.\n const effectiveModelId =\n inferredProvider !== undefined ? parsedModel.name : (options.model?.id ?? \"claude-sonnet-4-6\");\n const fallback = options.agentOptions.providers?.fallback;\n const apiKeys = options.agentOptions.providers?.apiKeys;\n const credentialPoolStrategy = options.agentOptions.providers?.credentialPoolStrategy;\n const chain = resolveProviderChain({\n primary,\n ...(fallback !== undefined ? { fallback } : {}),\n ...(apiKeys !== undefined ? { apiKeys } : {}),\n ...(credentialPoolStrategy !== undefined ? { credentialPoolStrategy } : {}),\n });\n const llm =\n chain.length === 1 ? (chain[0] as (typeof chain)[number]) : new FallbackLlmClient(chain);\n return {\n agentId: options.agentId,\n runId,\n model: { id: effectiveModelId },\n userMessage: userText,\n llm,\n mcp: buildMcpMap(options),\n hooks: options.hooks,\n shellCwd: options.workspaceCwd,\n shellSandbox: options.agentOptions.local?.sandboxOptions?.enabled === true,\n ...(options.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : {}),\n ...(options.onStep !== undefined ? { onStep: options.onStep } : {}),\n ...(options.onDelta !== undefined ? { onDelta: options.onDelta } : {}),\n ...(options.priorMessages !== undefined ? { priorMessages: options.priorMessages } : {}),\n ...(options.memoryTools !== undefined && options.memoryTools.length > 0\n ? { memoryTools: options.memoryTools }\n : {}),\n ...buildCustomToolsInput(\n options.agentOptions,\n options.sendOptions,\n options.pluginManager,\n options.personalityToolWhitelist,\n options.agentId,\n options.personalityName,\n ),\n ...(options.pluginManager !== undefined ? { pluginManager: options.pluginManager } : {}),\n // D318 — forward SendOptions.signal to the agent loop so streamLlmTurn\n // can attach it to the LLM `fetch({ signal })` call.\n ...(options.sendOptions.signal !== undefined ? { signal: options.sendOptions.signal } : {}),\n // D315-D317 — tool lifecycle hooks (cost tracking + audit + retry/alert)\n ...(options.agentOptions.onToolStart !== undefined\n ? { onToolStart: options.agentOptions.onToolStart }\n : {}),\n ...(options.agentOptions.onToolEnd !== undefined\n ? { onToolEnd: options.agentOptions.onToolEnd }\n : {}),\n ...(options.agentOptions.onToolError !== undefined\n ? { onToolError: options.agentOptions.onToolError }\n : {}),\n telemetry: createTelemetry(options.agentOptions.telemetry),\n };\n}\n\n/**\n * Resolve the effective custom-tool catalog for this run.\n *\n * Precedence (matches the mcpServers semantics — \"fully replaces, not merged\"):\n * - `sendOptions.tools === undefined` → fall back to `agentOptions.tools`\n * - `sendOptions.tools = []` → explicitly clear (no custom tools)\n * - `sendOptions.tools = [t1, ...]` → use exactly these for this run\n */\nfunction buildCustomToolsInput(\n agentOptions: AgentOptions,\n sendOptions: { tools?: CustomTool[] } | undefined,\n pluginManager: import(\"../plugins/manager.js\").PluginManager | undefined,\n personalityToolWhitelist: ReadonlyArray<string> | undefined,\n agentId: string,\n personalityName: string | undefined,\n): { customTools: ReadonlyArray<CustomToolSpec> } | Record<string, never> {\n const baseTools = sendOptions?.tools ?? agentOptions.tools ?? [];\n // T4.1: concat plugin-registered tools onto the effective catalog. Plugin\n // tools are merged unconditionally (no override semantics — name collision\n // would be caught by the registry validator if used).\n const pluginTools = pluginManager?.aggregated.tools ?? [];\n if (baseTools.length === 0 && pluginTools.length === 0) return {};\n const merged: CustomToolSpec[] = [...baseTools, ...pluginTools].map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n handler: tool.handler,\n }));\n // Phase 4.1 / ADR D167 — advisory narrowing by active personality.\n const customTools = applyPersonalityFilter(merged, personalityToolWhitelist, {\n agentId,\n personalityName,\n }) as ReadonlyArray<CustomToolSpec>;\n if (customTools.length === 0 && personalityToolWhitelist === undefined) return {};\n return { customTools };\n}\n\nfunction detectPrimaryProvider(): string {\n if (process.env.ANTHROPIC_API_KEY !== undefined && process.env.ANTHROPIC_API_KEY.length > 0) {\n return \"anthropic\";\n }\n if (process.env.OPENAI_API_KEY !== undefined && process.env.OPENAI_API_KEY.length > 0) {\n return \"openai\";\n }\n if (process.env.OPENROUTER_API_KEY !== undefined && process.env.OPENROUTER_API_KEY.length > 0) {\n return \"openrouter\";\n }\n return \"openai\";\n}\n\nfunction buildMcpMap(options: CreateRealLocalRunOptions): Map<string, McpClient> {\n const map = new Map<string, McpClient>();\n const inline = options.sendOptions.mcpServers ?? options.agentOptions.mcpServers;\n if (inline === undefined) return map;\n for (const [name, config] of Object.entries(inline)) {\n map.set(name, createMcpClient(name, config));\n }\n return map;\n}\n\nclass RealLocalRun extends FixtureRunBase {\n private readonly buildInputs: () => AgentLoopInputs;\n\n constructor(\n options: ConstructorParameters<typeof FixtureRunBase>[0],\n buildInputs: () => AgentLoopInputs,\n ) {\n super(options);\n this.buildInputs = buildInputs;\n }\n\n bootstrap(): void {\n setTimeout(() => {\n void this.driveLoop();\n }, 0);\n }\n\n protected override notifyImmediately(): boolean {\n return true;\n }\n\n private async driveLoop(): Promise<void> {\n if (this.terminated) return;\n const inputs = this.tryBuildInputs();\n if (inputs === undefined) return;\n await this.initializeMcp(inputs);\n await this.executeAgentLoop(inputs);\n }\n\n private tryBuildInputs(): AgentLoopInputs | undefined {\n try {\n return this.buildInputs();\n } catch (cause) {\n this.emitErrorEvent(cause, \"Failed to build agent loop inputs\", \"\", \"build_inputs_failed\");\n this.transitionTo(\"error\" satisfies RunStatus);\n return undefined;\n }\n }\n\n private async initializeMcp(inputs: AgentLoopInputs): Promise<void> {\n for (const [name, client] of inputs.mcp.entries()) {\n try {\n await client.initialize();\n } catch (cause) {\n this.emitErrorEvent(\n cause,\n `MCP server ${name} failed to initialize`,\n `MCP server ${name} failed to initialize: `,\n \"mcp_init_failed\",\n );\n }\n }\n }\n\n private async executeAgentLoop(inputs: AgentLoopInputs): Promise<void> {\n try {\n const output = await runAgentLoop(inputs);\n this.applyAgentLoopOutput(output);\n this.transitionTo(output.finalStatus);\n } catch (cause) {\n this.emitErrorEvent(cause, \"Agent loop failed\", \"\", \"agent_loop_failed\");\n this.transitionTo(\"error\" satisfies RunStatus);\n } finally {\n for (const client of inputs.mcp.values()) {\n await client.close().catch(() => undefined);\n }\n }\n }\n\n /**\n * Copy runAgentLoop output into the script (events + conversation +\n * usage/cost + errorDetail). Extracted to keep executeAgentLoop below\n * the complexity-10 cap (D422 / sdk-biome-cleanup-plan).\n *\n * D376/D377: usage/cost surfaced for RunResult.usage / RunResult.cost.\n * Finding-B fix (sdk-error-packaging v1.1): set-once errorDetail copy.\n */\n private applyAgentLoopOutput(output: Awaited<ReturnType<typeof runAgentLoop>>): void {\n for (const event of output.events) {\n this.script.events.push(event);\n this.notifyNewEvents();\n }\n this.script.conversation.push(...output.conversation);\n if (output.result.length > 0) this.script.result = output.result;\n if (output.usage !== undefined) this.script.usage = output.usage;\n if (output.cost !== undefined) this.script.cost = output.cost;\n if (output.error !== undefined && this.script.errorDetail === undefined) {\n this.script.errorDetail = {\n message: output.error.message,\n ...(output.error.code !== undefined ? { code: output.error.code } : {}),\n cause: output.error.cause,\n };\n }\n }\n\n private emitErrorEvent(cause: unknown, fallback: string, prefix = \"\", code?: string): void {\n // Finding-B fix (sdk-error-packaging-fix-plan v1.1): surface infra\n // failures (MCP init, build-inputs, agent_loop_failed outer-catch) via\n // the structured `errorDetail` channel ONLY — never as assistant\n // content. Downstream `buildResult()` copies this onto RunResult.error,\n // and `Run.stream()` will emit a typed `{ type: \"error\" }` event when\n // the runtime observes errorDetail (Phase 2). Set-once.\n if (this.script.errorDetail === undefined) {\n const message = cause instanceof Error ? cause.message : String(cause);\n const display = prefix.length > 0 ? `${prefix}${message}` : message || fallback;\n this.script.errorDetail = {\n message: display,\n ...(code !== undefined ? { code } : {}),\n cause,\n };\n }\n this.notifyNewEvents();\n }\n}\n","/**\n * Dispatch helpers extracted from `LocalAgent` to keep its file under\n * G8 (≤400 LoC). Builds the args for real-LLM and fixture run paths.\n *\n * @internal\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentDefinition, AgentOptions, ModelSelection } from \"../../types/agent.js\";\nimport type { Run, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport type { MemoryToolSpec } from \"../agent-loop/loop-types.js\";\nimport { resolveApiKey } from \"../env.js\";\nimport { shouldUseRealLocalRuntime } from \"../fixture-mode.js\";\nimport type { PersonalityPreset } from \"../personality/types.js\";\nimport type { PluginManager } from \"../plugins/manager.js\";\nimport { getSessionMessages } from \"./agent-session.js\";\nimport type { HooksExecutor } from \"./hooks-executor.js\";\nimport { createLocalRun } from \"./local-run.js\";\nimport type { MemoryFact } from \"./memory-store.js\";\nimport { createRealLocalRun } from \"./real-local-run.js\";\n\nexport interface DispatchInputs {\n agentId: string;\n model: ModelSelection | undefined;\n options: AgentOptions;\n workspaceCwd: string;\n hooksExecutor: HooksExecutor;\n pluginManager: PluginManager;\n resolvedSubagents: Record<string, AgentDefinition>;\n settingSourcesIncludeProject: boolean;\n}\n\nexport function buildRealRunOptions(args: {\n inputs: DispatchInputs;\n message: string | SDKUserMessage;\n options: SendOptions;\n systemPrompt: string | undefined;\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>;\n memoryTools: ReadonlyArray<MemoryToolSpec> | undefined;\n personalityToolWhitelist?: ReadonlyArray<string>;\n personalityName?: string;\n}): Parameters<typeof createRealLocalRun>[0] {\n return {\n agentId: args.inputs.agentId,\n model: args.inputs.model,\n message: args.message,\n agentOptions: args.inputs.options,\n sendOptions: args.options,\n workspaceCwd: args.inputs.workspaceCwd,\n hooks: args.inputs.hooksExecutor,\n pluginManager: args.inputs.pluginManager,\n ...(args.systemPrompt !== undefined ? { systemPrompt: args.systemPrompt } : {}),\n ...(args.options.onStep !== undefined ? { onStep: args.options.onStep } : {}),\n ...(args.options.onDelta !== undefined ? { onDelta: args.options.onDelta } : {}),\n ...(args.priorMessages.length > 0 ? { priorMessages: args.priorMessages } : {}),\n ...(args.memoryTools !== undefined && args.memoryTools.length > 0\n ? { memoryTools: args.memoryTools }\n : {}),\n ...(args.personalityToolWhitelist !== undefined\n ? { personalityToolWhitelist: args.personalityToolWhitelist }\n : {}),\n ...(args.personalityName !== undefined ? { personalityName: args.personalityName } : {}),\n };\n}\n\nexport async function createFixtureRunHelper(args: {\n inputs: DispatchInputs;\n message: string | SDKUserMessage;\n options: SendOptions;\n systemPrompt: string | undefined;\n memoryFacts: ReadonlyArray<MemoryFact>;\n}): Promise<Run> {\n const sessionMessages = getSessionMessages(args.inputs.agentId);\n const projectMcpServers = args.inputs.settingSourcesIncludeProject\n ? await readProjectMcpServers(args.inputs.workspaceCwd)\n : {};\n return createLocalRun({\n agentId: args.inputs.agentId,\n model: args.inputs.model,\n message: args.message,\n agentOptions: args.inputs.options,\n sendOptions: args.options,\n workspaceCwd: args.inputs.workspaceCwd,\n subagents: args.inputs.resolvedSubagents,\n settingSourcesIncludeProject: args.inputs.settingSourcesIncludeProject,\n memoryFacts: [...args.memoryFacts],\n sessionMessages,\n projectMcpServers,\n ...(args.systemPrompt !== undefined ? { systemPrompt: args.systemPrompt } : {}),\n });\n}\n\nexport async function dispatchLocalRun(args: {\n inputs: DispatchInputs;\n message: string | SDKUserMessage;\n sendOptions: SendOptions;\n systemPrompt: string | undefined;\n memoryFacts: ReadonlyArray<MemoryFact>;\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>;\n memoryTools: ReadonlyArray<MemoryToolSpec> | undefined;\n activePreset: PersonalityPreset | undefined;\n}): Promise<Run> {\n const apiKey = resolveApiKey(args.inputs.options.apiKey);\n if (shouldUseRealLocalRuntime(apiKey)) {\n return createRealLocalRun(\n buildRealRunOptions({\n inputs: args.inputs,\n message: args.message,\n options: args.sendOptions,\n systemPrompt: args.systemPrompt,\n priorMessages: args.priorMessages,\n memoryTools: args.memoryTools,\n ...(args.activePreset?.tools !== undefined\n ? { personalityToolWhitelist: args.activePreset.tools }\n : {}),\n ...(args.activePreset !== undefined ? { personalityName: args.activePreset.name } : {}),\n }),\n );\n }\n return createFixtureRunHelper({\n inputs: args.inputs,\n message: args.message,\n options: args.sendOptions,\n systemPrompt: args.systemPrompt,\n memoryFacts: args.memoryFacts,\n });\n}\n\nasync function readProjectMcpServers(cwd: string): Promise<Record<string, unknown>> {\n const path = join(cwd, \".theokit\", \"mcp.json\");\n try {\n const raw = await readFile(path, \"utf8\");\n const parsed = JSON.parse(raw) as { servers?: Record<string, unknown> };\n return parsed.servers ?? {};\n } catch {\n return {};\n }\n}\n","/**\n * `Agent.invalidateCache` helpers extracted from LocalAgent (T3.2 / T4.3,\n * ADR D94). Keeps `local-agent.ts` under the 400-LoC gate while providing\n * the deferred-vs-applyNow semantics + EC-7 failure-path cleanup.\n *\n * @internal\n */\n\nexport interface InvalidationPending {\n reason: string;\n at: number;\n}\n\n/**\n * Run refresh + ALWAYS clear pending (EC-7).\n * @internal\n */\nexport async function applyDeferredInvalidation(\n agentId: string,\n pending: InvalidationPending,\n refresh: () => Promise<void>,\n): Promise<void> {\n process.stderr.write(\n `[theokit-sdk] applying deferred cache invalidation (${agentId}): ${pending.reason}\\n`,\n );\n try {\n await refresh();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[theokit-sdk] invalidateCache reload failed (continuing): ${msg}\\n`);\n }\n}\n\n/**\n * `Agent.invalidateCache` body — handles `applyNow` short-circuit OR\n * records pending state.\n * @internal\n */\nexport async function invalidateCacheImpl(\n agentId: string,\n reason: string,\n options: { applyNow?: boolean },\n disposed: boolean,\n dispose: () => Promise<void>,\n setPending: (p: InvalidationPending) => void,\n): Promise<void> {\n if (disposed) return;\n if (options.applyNow === true) {\n process.stderr.write(\n `[theokit-sdk] invalidateCache applyNow disposing agent (${agentId}): ${reason}\\n`,\n );\n await dispose();\n return;\n }\n setPending({ reason, at: Date.now() });\n}\n\n/**\n * T4.3 — consume pending invalidation. EC-7-safe: pending cleared\n * regardless of refresh outcome.\n * @internal\n */\nexport async function consumePending(\n agentId: string,\n pending: InvalidationPending | undefined,\n clear: () => void,\n refresh: () => Promise<void>,\n): Promise<void> {\n if (pending === undefined) return;\n clear();\n await applyDeferredInvalidation(agentId, pending, refresh);\n}\n","import { join } from \"node:path\";\n\nimport { atomicWriteJson } from \"../persistence/atomic-write.js\";\nimport { memoryDir } from \"./markdown-store.js\";\n\n/**\n * Optional on-disk persistence for Active Memory recall transcripts (ADR D6).\n *\n * Writes one JSON file per run under\n * `.theokit/memory/transcripts/active-memory/<runId>.json` when the agent\n * passes `persistTranscripts: true`. Failures are swallowed with a stderr\n * warning so transcript IO never crashes the agent run.\n *\n * @internal\n */\n\nexport interface ActiveMemoryTranscript {\n runId: string;\n startedAtMs: number;\n userText: string;\n queryMode: string;\n status: string;\n durationMs: number;\n summary: string | undefined;\n hits: ReadonlyArray<{\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n snippet: string;\n }>;\n}\n\nexport async function persistActiveMemoryTranscript(\n cwd: string,\n transcript: ActiveMemoryTranscript,\n): Promise<void> {\n try {\n const dir = join(memoryDir(cwd), \"transcripts\", \"active-memory\");\n const file = join(dir, `${transcript.runId}.json`);\n // atomicWriteJson auto-creates the parent directory + writes atomically\n // (no torn writes during crash).\n await atomicWriteJson(file, transcript);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] active-memory transcript persist failed: ${message}\\n`);\n }\n}\n","import type { ActiveMemoryCache } from \"./active-memory-cache.js\";\nimport type { CircuitBreaker } from \"./circuit-breaker.js\";\nimport type { MemorySearchHit } from \"./index-manager.js\";\nimport type { MemoryIndex } from \"./memory-index.js\";\nimport { persistActiveMemoryTranscript } from \"./transcript-store.js\";\n\n/**\n * Active Memory blocking recall (ADR D6 of memory-system-openclaw-parity).\n *\n * Runs BEFORE `agent.send()` assembles the system prompt. Issues a direct\n * call to `IndexManager.search` with the user message (and optional recent\n * turns per `queryMode`).\n *\n * Returns a `summary` string capped at `maxSummaryChars` (default 220 to\n * match OpenClaw's `DEFAULT_MAX_SUMMARY_CHARS`) which the system-prompt\n * pipeline prepends as a `<active-memory>` block (priority 5).\n *\n * @internal\n */\n\nexport type ActiveMemoryQueryMode = \"message\" | \"recent\" | \"full\";\nexport type ActiveMemoryStatus = \"ok\" | \"timeout\" | \"skipped\" | \"no-recall\" | \"error\";\n\nexport interface ActiveMemoryResult {\n summary: string | undefined;\n durationMs: number;\n status: ActiveMemoryStatus;\n hits: ReadonlyArray<MemorySearchHit>;\n}\n\nexport interface ActiveMemoryOptions {\n /** Whether active recall is enabled. Default `false`. */\n enabled?: boolean;\n /** Query construction strategy. Default `\"recent\"`. */\n queryMode?: ActiveMemoryQueryMode;\n /** Hard timeout in ms. Default `15000`. */\n timeoutMs?: number;\n /** Max chars in the summary. Default `220`. */\n maxSummaryChars?: number;\n /** Number of recent user turns to include in `queryMode === \"recent\"`. Default `2`. */\n recentUserTurns?: number;\n}\n\nexport interface RunActiveMemoryArgs {\n userText: string;\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>;\n index: MemoryIndex | undefined;\n options: ActiveMemoryOptions;\n /** Per-agent circuit breaker (Phase 8). */\n breaker?: CircuitBreaker;\n /** Per-agent result cache (Phase 8). */\n cache?: ActiveMemoryCache;\n /** Workspace root for transcript persistence. */\n cwd?: string;\n /** When true, write transcript JSON under .theokit/memory/transcripts/active-memory/. */\n persistTranscripts?: boolean;\n /** Stable key the breaker + cache key by (default `default`). */\n agentKey?: string;\n /** Run id for transcript file naming. */\n runId?: string;\n}\n\nconst DEFAULTS: Required<Omit<ActiveMemoryOptions, \"enabled\">> = {\n queryMode: \"recent\",\n timeoutMs: 15000,\n maxSummaryChars: 220,\n recentUserTurns: 2,\n};\n\nexport async function runActiveMemory(args: RunActiveMemoryArgs): Promise<ActiveMemoryResult> {\n const started = Date.now();\n if (args.options.enabled !== true || args.index === undefined) {\n return { summary: undefined, durationMs: 0, status: \"skipped\", hits: [] };\n }\n const cfg = { ...DEFAULTS, ...args.options };\n const breakerKey = args.agentKey ?? \"default\";\n if (args.breaker?.shouldSkip(breakerKey) === true) {\n return { summary: undefined, durationMs: 0, status: \"skipped\", hits: [] };\n }\n const cached = args.cache?.get(args.userText, cfg.queryMode);\n if (cached !== undefined) return cached;\n\n const query = buildQuery(args.userText, args.priorMessages, cfg.queryMode, cfg.recentUserTurns);\n if (query.trim().length === 0) {\n return finalize(args, cfg.queryMode, {\n summary: undefined,\n durationMs: Date.now() - started,\n status: \"no-recall\",\n hits: [],\n });\n }\n const result = await searchOnce(args, cfg, query, started);\n notifyBreaker(args.breaker, breakerKey, result.status);\n return finalize(args, cfg.queryMode, result);\n}\n\ninterface ResolvedConfig {\n queryMode: ActiveMemoryQueryMode;\n timeoutMs: number;\n maxSummaryChars: number;\n recentUserTurns: number;\n}\n\nasync function searchOnce(\n args: RunActiveMemoryArgs,\n cfg: ResolvedConfig,\n query: string,\n started: number,\n): Promise<ActiveMemoryResult> {\n if (args.index === undefined) {\n return { summary: undefined, durationMs: 0, status: \"skipped\", hits: [] };\n }\n try {\n const hits = await withTimeout(args.index.search(query, { maxResults: 5 }), cfg.timeoutMs);\n if (hits === \"timeout\") {\n return { summary: undefined, durationMs: Date.now() - started, status: \"timeout\", hits: [] };\n }\n if (hits.length === 0) {\n return {\n summary: undefined,\n durationMs: Date.now() - started,\n status: \"no-recall\",\n hits: [],\n };\n }\n const summary = formatSummary(hits, cfg.maxSummaryChars);\n return { summary, durationMs: Date.now() - started, status: \"ok\", hits };\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] active-memory recall failed: ${message}\\n`);\n return { summary: undefined, durationMs: Date.now() - started, status: \"error\", hits: [] };\n }\n}\n\nfunction notifyBreaker(\n breaker: CircuitBreaker | undefined,\n key: string,\n status: ActiveMemoryStatus,\n): void {\n if (breaker === undefined) return;\n if (status === \"timeout\") breaker.recordTimeout(key);\n else if (status === \"ok\" || status === \"no-recall\") breaker.recordSuccess(key);\n}\n\nasync function finalize(\n args: RunActiveMemoryArgs,\n queryMode: ActiveMemoryQueryMode,\n result: ActiveMemoryResult,\n): Promise<ActiveMemoryResult> {\n args.cache?.set(args.userText, queryMode, result);\n if (args.persistTranscripts === true && args.cwd !== undefined) {\n await persistActiveMemoryTranscript(args.cwd, {\n runId: args.runId ?? `run-${Date.now()}`,\n startedAtMs: Date.now() - result.durationMs,\n userText: args.userText,\n queryMode,\n status: result.status,\n durationMs: result.durationMs,\n summary: result.summary,\n hits: result.hits.map((h) => ({\n path: h.path,\n startLine: h.startLine,\n endLine: h.endLine,\n score: h.score,\n snippet: h.snippet,\n })),\n });\n }\n return result;\n}\n\nfunction buildQuery(\n userText: string,\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>,\n queryMode: ActiveMemoryQueryMode,\n recentUserTurns: number,\n): string {\n if (queryMode === \"message\") return userText;\n if (queryMode === \"full\") {\n const allUserTurns = priorMessages.filter((m) => m.role === \"user\").map((m) => m.text);\n return [...allUserTurns, userText].join(\"\\n\");\n }\n // recent\n const recent = priorMessages\n .filter((m) => m.role === \"user\")\n .slice(-recentUserTurns)\n .map((m) => m.text);\n return [...recent, userText].join(\"\\n\");\n}\n\nfunction formatSummary(hits: ReadonlyArray<MemorySearchHit>, maxChars: number): string {\n const lines = hits.map((h) => `- ${h.citation}: ${h.snippet}`);\n let summary = lines.join(\"\\n\");\n if (summary.length > maxChars) summary = `${summary.slice(0, maxChars - 1)}…`;\n return summary;\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | \"timeout\"> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<\"timeout\">((resolve) => {\n timer = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n });\n try {\n const winner = await Promise.race([promise, timeout]);\n return winner;\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { ActiveMemoryResult } from \"./active-memory.js\";\n\n/**\n * TTL-bounded cache for `runActiveMemory` results. Keyed by\n * `sha256(userText + queryMode)` so two identical sends within `cacheTtlMs`\n * (default 15s, matching OpenClaw's `DEFAULT_CACHE_TTL_MS`) share a single\n * search.\n *\n * Bounded size; oldest entries evicted first when capacity is exceeded.\n *\n * @internal\n */\n\nexport interface ActiveMemoryCacheOptions {\n ttlMs?: number;\n capacity?: number;\n now?: () => number;\n}\n\ninterface CacheEntry {\n expiresAtMs: number;\n result: ActiveMemoryResult;\n}\n\nconst DEFAULT_TTL_MS = 15_000;\nconst DEFAULT_CAPACITY = 1000;\n\nexport class ActiveMemoryCache {\n private readonly map = new Map<string, CacheEntry>();\n\n constructor(private readonly opts: ActiveMemoryCacheOptions = {}) {}\n\n get(userText: string, queryMode: string): ActiveMemoryResult | undefined {\n const key = cacheKey(userText, queryMode);\n const entry = this.map.get(key);\n if (entry === undefined) return undefined;\n if (this.now() >= entry.expiresAtMs) {\n this.map.delete(key);\n return undefined;\n }\n // LRU bump\n this.map.delete(key);\n this.map.set(key, entry);\n return entry.result;\n }\n\n set(userText: string, queryMode: string, result: ActiveMemoryResult): void {\n const key = cacheKey(userText, queryMode);\n if (this.map.size >= (this.opts.capacity ?? DEFAULT_CAPACITY)) {\n const oldest = this.map.keys().next().value;\n if (oldest !== undefined) this.map.delete(oldest);\n }\n this.map.set(key, {\n expiresAtMs: this.now() + (this.opts.ttlMs ?? DEFAULT_TTL_MS),\n result,\n });\n }\n\n size(): number {\n return this.map.size;\n }\n\n private now(): number {\n return this.opts.now?.() ?? Date.now();\n }\n}\n\nfunction cacheKey(userText: string, queryMode: string): string {\n return createHash(\"sha256\").update(`${queryMode}\\x00${userText}`).digest(\"hex\");\n}\n","import { createHash } from \"node:crypto\";\n\nimport { AuthenticationError, ConfigurationError, NetworkError } from \"../../../errors.js\";\nimport { mapOpenAICompatibleError } from \"../../errors/mappers/openai-compatible.js\";\nimport type {\n CreateAdapterOptions,\n EmbeddingRuntime,\n EmbeddingRuntimeStats,\n} from \"../embedding-adapter.js\";\nimport { LruEmbeddingCache } from \"../embedding-cache.js\";\n\n/**\n * Shared factory for OpenAI-compatible embedding providers (OpenAI, Mistral,\n * DeepInfra, and anything else exposing `POST /v1/embeddings` with the\n * `{ model, input }` request shape and `{ data: [{ embedding }] }` response).\n *\n * Mirrors the inner mechanics of OpenClaw's batch embedding runtime.\n *\n * @internal\n */\n\nconst MAX_BATCH = 100;\nconst MAX_RETRIES = 2;\n\nexport interface OpenAiCompatibleConfig {\n id: string;\n defaultBaseUrl: string;\n apiKeyEnv: string;\n baseUrlEnv?: string;\n defaultModel: string;\n /**\n * Dimension hint by model id. The chosen model MUST be in this table —\n * unknown models throw `ConfigurationError(code: \"embedding_unknown_model\")`\n * (EC-4 fix). This prevents vec0 virtual-table dimension mismatches that\n * surface as cryptic errors downstream.\n */\n dimensionByModel: Record<string, number>;\n /**\n * Path component appended to `baseUrl` for the embeddings endpoint.\n * Default `\"/v1/embeddings\"` (OpenAI canonical). REPLACES the default —\n * does NOT concatenate. Used by DeepInfra (`\"/v1/openai/embeddings\"`),\n * etc. (EC-2 fix).\n */\n embeddingsPath?: string;\n}\n\nexport async function createOpenAiCompatibleRuntime(\n cfg: OpenAiCompatibleConfig,\n options: CreateAdapterOptions,\n): Promise<EmbeddingRuntime> {\n const model = options.model ?? cfg.defaultModel;\n const apiKey = options.apiKey ?? process.env[cfg.apiKeyEnv];\n if (apiKey === undefined || apiKey.length === 0) {\n throw new AuthenticationError(`${cfg.apiKeyEnv} missing`, {\n code: \"embedding_missing_api_key\",\n });\n }\n const envBaseUrl = cfg.baseUrlEnv !== undefined ? process.env[cfg.baseUrlEnv] : undefined;\n const baseUrl = options.baseUrl ?? envBaseUrl ?? cfg.defaultBaseUrl;\n const fetchImpl = options.fetch ?? fetch;\n const cache = options.cache ?? new LruEmbeddingCache();\n // EC-4: refuse unknown models to prevent vec0 dimension mismatches downstream.\n const dimension = cfg.dimensionByModel[model];\n if (dimension === undefined) {\n throw new ConfigurationError(\n `${cfg.id} adapter: model \"${model}\" is not in the dimension table. Use one of: ${Object.keys(cfg.dimensionByModel).join(\", \")}. To add it, update dimensionByModel in the adapter source.`,\n { code: \"embedding_unknown_model\" },\n );\n }\n const embeddingsPath = cfg.embeddingsPath ?? \"/v1/embeddings\";\n\n const stats: EmbeddingRuntimeStats = {\n cacheHits: 0,\n cacheMisses: 0,\n httpCalls: 0,\n retries: 0,\n };\n\n return {\n id: cfg.id,\n model,\n dimension,\n stats: () => ({ ...stats }),\n embed: (texts) =>\n embedTexts({\n texts,\n cache,\n stats,\n model,\n dimension,\n apiKey,\n baseUrl,\n embeddingsPath,\n fetchImpl,\n providerId: cfg.id,\n }),\n };\n}\n\ninterface EmbedTextsInput {\n texts: ReadonlyArray<string>;\n cache: NonNullable<CreateAdapterOptions[\"cache\"]>;\n stats: EmbeddingRuntimeStats;\n model: string;\n dimension: number;\n apiKey: string;\n baseUrl: string;\n embeddingsPath: string;\n fetchImpl: typeof fetch;\n providerId: string;\n}\n\nasync function embedTexts(input: EmbedTextsInput): Promise<number[][]> {\n const { texts, cache, stats, model, dimension } = input;\n const results = new Array<number[] | undefined>(texts.length);\n const pending: Array<{ index: number; text: string; key: string }> = [];\n for (let i = 0; i < texts.length; i++) {\n classifyEntry({\n index: i,\n text: texts[i] ?? \"\",\n model,\n dimension,\n cache,\n stats,\n results,\n pending,\n });\n }\n await runBatches(input, pending, results);\n return results.map((v) => v ?? new Array(dimension).fill(0));\n}\n\ninterface ClassifyEntryArgs {\n index: number;\n text: string;\n model: string;\n dimension: number;\n cache: NonNullable<CreateAdapterOptions[\"cache\"]>;\n stats: EmbeddingRuntimeStats;\n results: Array<number[] | undefined>;\n pending: Array<{ index: number; text: string; key: string }>;\n}\n\nfunction classifyEntry(args: ClassifyEntryArgs): void {\n if (args.text.trim().length === 0) {\n args.results[args.index] = new Array(args.dimension).fill(0);\n return;\n }\n const key = hashKey(args.model, args.text);\n const cached = args.cache.get(key);\n if (cached !== undefined) {\n args.stats.cacheHits += 1;\n args.results[args.index] = cached;\n return;\n }\n args.stats.cacheMisses += 1;\n args.pending.push({ index: args.index, text: args.text, key });\n}\n\nasync function runBatches(\n input: EmbedTextsInput,\n pending: ReadonlyArray<{ index: number; text: string; key: string }>,\n results: Array<number[] | undefined>,\n): Promise<void> {\n for (let offset = 0; offset < pending.length; offset += MAX_BATCH) {\n const batch = pending.slice(offset, offset + MAX_BATCH);\n const vectors = await embedBatch({\n apiKey: input.apiKey,\n baseUrl: input.baseUrl,\n embeddingsPath: input.embeddingsPath,\n model: input.model,\n inputs: batch.map((b) => b.text),\n fetchImpl: input.fetchImpl,\n stats: input.stats,\n providerId: input.providerId,\n });\n for (let j = 0; j < batch.length; j++) {\n const slot = batch[j];\n const vector = vectors[j];\n if (slot === undefined || vector === undefined) continue;\n results[slot.index] = vector;\n input.cache.set(slot.key, vector);\n }\n }\n}\n\ninterface BatchOptions {\n apiKey: string;\n baseUrl: string;\n embeddingsPath: string;\n model: string;\n inputs: ReadonlyArray<string>;\n fetchImpl: typeof fetch;\n stats: EmbeddingRuntimeStats;\n providerId: string;\n}\n\nasync function embedBatch(opts: BatchOptions): Promise<number[][]> {\n // EC-2: embeddingsPath REPLACES the suffix; never concatenates.\n const url = `${opts.baseUrl.replace(/\\/$/, \"\")}${opts.embeddingsPath}`;\n let attempt = 0;\n while (true) {\n opts.stats.httpCalls += 1;\n const response = await postEmbedRequest(opts, url);\n if (response.ok)\n return await parseEmbedResponse(response, opts.providerId, opts.embeddingsPath);\n if (isRetryable(response.status) && attempt < MAX_RETRIES) {\n attempt += 1;\n opts.stats.retries += 1;\n await sleep(linearBackoffMs(attempt));\n continue;\n }\n // Read body (best-effort) so the mapper has access to provider error code.\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string\n }\n throw mapOpenAICompatibleError({\n providerId: opts.providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: opts.embeddingsPath,\n });\n }\n}\n\nasync function postEmbedRequest(opts: BatchOptions, url: string): Promise<Response> {\n return opts.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${opts.apiKey}`,\n },\n body: JSON.stringify({ model: opts.model, input: opts.inputs }),\n });\n}\n\nasync function parseEmbedResponse(\n response: Response,\n providerId: string,\n endpoint: string,\n): Promise<number[][]> {\n const json = (await response.json()) as { data?: Array<{ embedding: number[] }> };\n if (!Array.isArray(json.data)) {\n throw new NetworkError(`${providerId} ${endpoint} returned no data`, {\n code: \"embedding_invalid_response\",\n metadata: {\n provider: providerId,\n endpoint,\n code: \"invalid_request\",\n raw: json,\n },\n });\n }\n return json.data.map((d) => d.embedding);\n}\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || (status >= 500 && status < 600);\n}\n\nfunction hashKey(model: string, text: string): string {\n return createHash(\"sha256\").update(`${model} ${text}`).digest(\"hex\");\n}\n\nfunction linearBackoffMs(attempt: number): number {\n return 50 * attempt;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { EmbeddingCache } from \"./embedding-adapter.js\";\n\n/**\n * Bounded in-memory LRU cache for embeddings, keyed by `sha256(text)` (or any\n * stable key the caller chooses).\n *\n * @internal\n */\nexport class LruEmbeddingCache implements EmbeddingCache {\n private readonly map = new Map<string, number[]>();\n\n constructor(private readonly capacity: number = 5000) {}\n\n get(key: string): number[] | undefined {\n const value = this.map.get(key);\n if (value === undefined) return undefined;\n // Move to most-recent by re-inserting.\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n set(key: string, value: number[]): void {\n if (this.map.has(key)) this.map.delete(key);\n else if (this.map.size >= this.capacity) {\n // Evict the oldest entry — Map preserves insertion order.\n const oldest = this.map.keys().next().value;\n if (oldest !== undefined) this.map.delete(oldest);\n }\n this.map.set(key, value);\n }\n\n size(): number {\n return this.map.size;\n }\n}\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\n/**\n * DeepInfra embedding adapter — hosts open-source embedding models\n * (BGE, E5, Jina, etc.) at pay-per-token. OpenAI-compatible REST at\n * `POST /v1/openai/embeddings` (note the `/openai` segment; not the\n * canonical `/v1/embeddings`). The `embeddingsPath` override on\n * `OpenAiCompatibleConfig` REPLACES the default suffix (EC-2).\n *\n * Honors `DEEPINFRA_API_KEY` and `DEEPINFRA_API_BASE_URL`.\n *\n * @internal\n */\n\nexport const DEFAULT_DEEPINFRA_EMBEDDING_MODEL = \"BAAI/bge-large-en-v1.5\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n \"BAAI/bge-large-en-v1.5\": 1024,\n \"BAAI/bge-base-en-v1.5\": 768,\n \"BAAI/bge-small-en-v1.5\": 384,\n \"BAAI/bge-m3\": 1024,\n \"intfloat/e5-large-v2\": 1024,\n \"intfloat/e5-base-v2\": 768,\n \"intfloat/multilingual-e5-large\": 1024,\n \"sentence-transformers/all-MiniLM-L6-v2\": 384,\n \"thenlper/gte-large\": 1024,\n \"thenlper/gte-base\": 768,\n};\n\nexport const deepinfraMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"deepinfra\",\n defaultModel: DEFAULT_DEEPINFRA_EMBEDDING_MODEL,\n transport: \"remote\",\n authProviderId: \"deepinfra\",\n autoSelectPriority: 13,\n create: (options) =>\n createOpenAiCompatibleRuntime(\n {\n id: \"deepinfra\",\n defaultBaseUrl: \"https://api.deepinfra.com\",\n apiKeyEnv: \"DEEPINFRA_API_KEY\",\n baseUrlEnv: \"DEEPINFRA_API_BASE_URL\",\n defaultModel: DEFAULT_DEEPINFRA_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n embeddingsPath: \"/v1/openai/embeddings\",\n },\n options,\n ),\n};\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\n/**\n * Mistral embedding adapter — OpenAI-compatible REST surface\n * (`POST /v1/embeddings` against `https://api.mistral.ai`). Default model\n * `mistral-embed` (1024 dims).\n *\n * Mirrors `referencia/openclaw/extensions/mistral/memory-embedding-adapter.ts`.\n *\n * @internal\n */\n\nexport const DEFAULT_MISTRAL_EMBEDDING_MODEL = \"mistral-embed\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n \"mistral-embed\": 1024,\n};\n\nexport const mistralMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"mistral\",\n defaultModel: DEFAULT_MISTRAL_EMBEDDING_MODEL,\n transport: \"remote\",\n authProviderId: \"mistral\",\n autoSelectPriority: 18,\n create: (options) =>\n createOpenAiCompatibleRuntime(\n {\n id: \"mistral\",\n defaultBaseUrl: \"https://api.mistral.ai\",\n apiKeyEnv: \"MISTRAL_API_KEY\",\n baseUrlEnv: \"MISTRAL_API_BASE_URL\",\n defaultModel: DEFAULT_MISTRAL_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n },\n options,\n ),\n};\n","/**\n * Ollama embedding adapter (T3.1, ADR D183).\n *\n * Targets Ollama's OpenAI-compatible `/v1/embeddings` endpoint and reuses\n * the shared `createOpenAiCompatibleRuntime` factory. The differentiating\n * bits:\n *\n * - `authType: \"none\"` — Ollama local ignores `Authorization`. Sentinel\n * `\"ollama-local\"` is passed as apiKey to satisfy the factory contract\n * (mirrors OpenClaw `OLLAMA_DEFAULT_API_KEY = \"ollama-local\"`).\n * - `OLLAMA_HOST` overrides the default `http://localhost:11434`.\n * - `OLLAMA_API_KEY` (optional) overrides the sentinel for Ollama Cloud\n * or reverse-proxy auth setups.\n * - Default model: `nomic-embed-text` (768 dim, ~274MB). User can opt\n * into `all-minilm` (384 dim, ~45MB) or any other locally-installed\n * embedding model.\n *\n * EC-B MUST FIX (edge-case review 2026-05-21): empty text is rejected\n * upstream in the shared factory (`classifyEntry` short-circuits to a\n * zero vector). That behavior is acceptable here because the zero\n * vector is identical for any empty input — downstream similarity\n * calcs ignore zero-norm vectors via the existing `cosineSimilarity`\n * guard. No additional fail-fast needed.\n *\n * EC-A MUST FIX (edge-case review 2026-05-21): dimension is locked\n * by the `DIMENSION_BY_MODEL` table; an unknown model id throws\n * `ConfigurationError(code: \"embedding_unknown_model\")` per the\n * factory's EC-4 contract. Future model versions with different\n * dimensions are added to the table here without breaking changes.\n *\n * @internal\n */\n\nimport type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\nexport const DEFAULT_OLLAMA_EMBEDDING_MODEL = \"nomic-embed-text\";\n\n/** Sentinel forwarded as Bearer token; Ollama local ignores Authorization. */\nconst OLLAMA_LOCAL_SENTINEL_KEY = \"ollama-local\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n // Nomic — local default, recommended quality/size balance.\n \"nomic-embed-text\": 768,\n \"nomic-embed-text:latest\": 768,\n // Sentence-transformers MiniLM — smaller, faster, lower quality.\n \"all-minilm\": 384,\n \"all-minilm:latest\": 384,\n // BGE family.\n \"bge-large\": 1024,\n \"bge-large:latest\": 1024,\n \"bge-m3\": 1024,\n \"bge-m3:latest\": 1024,\n // mxbai-embed-large.\n \"mxbai-embed-large\": 1024,\n \"mxbai-embed-large:latest\": 1024,\n};\n\nexport const ollamaMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"ollama\",\n defaultModel: DEFAULT_OLLAMA_EMBEDDING_MODEL,\n transport: \"local\",\n authProviderId: \"ollama\",\n // Lower than remote providers — chosen only when explicitly requested\n // OR when no remote provider key is configured (local-first developer).\n autoSelectPriority: 10,\n create: (options) => {\n // Honor OLLAMA_API_KEY (Ollama Cloud / reverse-proxy auth), else use\n // sentinel that local Ollama silently ignores. This mirrors\n // `sentinelForNoAuth` in router.ts and OpenClaw's `resolveSyntheticAuth`.\n const apiKey = options.apiKey ?? process.env.OLLAMA_API_KEY ?? OLLAMA_LOCAL_SENTINEL_KEY;\n return createOpenAiCompatibleRuntime(\n {\n id: \"ollama\",\n defaultBaseUrl: \"http://localhost:11434\",\n apiKeyEnv: \"OLLAMA_API_KEY\",\n baseUrlEnv: \"OLLAMA_HOST\",\n defaultModel: DEFAULT_OLLAMA_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n },\n { ...options, apiKey },\n );\n },\n};\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\n/**\n * OpenAI embedding adapter (ADR D3) — built on the shared OpenAI-compatible\n * factory. Native fetch only.\n *\n * @internal\n */\n\nexport const DEFAULT_OPENAI_EMBEDDING_MODEL = \"text-embedding-3-small\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n \"text-embedding-3-small\": 1536,\n \"text-embedding-3-large\": 3072,\n \"text-embedding-ada-002\": 1536,\n};\n\nexport const openAiMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"openai\",\n defaultModel: DEFAULT_OPENAI_EMBEDDING_MODEL,\n transport: \"remote\",\n authProviderId: \"openai\",\n autoSelectPriority: 20,\n create: (options) =>\n createOpenAiCompatibleRuntime(\n {\n id: \"openai\",\n defaultBaseUrl: \"https://api.openai.com\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n baseUrlEnv: \"OPENAI_API_BASE_URL\",\n defaultModel: DEFAULT_OPENAI_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n },\n options,\n ),\n};\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\n/**\n * OpenRouter embedding adapter — routes through OpenRouter's\n * `POST /api/v1/embeddings` endpoint (OpenAI-compatible request/response\n * shape). The provider id strings follow OpenRouter's catalog\n * (e.g. `\"openai/text-embedding-3-small\"`, `\"mistralai/mistral-embed\"`).\n *\n * Honors `OPENROUTER_API_KEY` and `OPENROUTER_API_BASE_URL`. Default base\n * URL is `https://openrouter.ai/api`.\n *\n * @internal\n */\n\nexport const DEFAULT_OPENROUTER_EMBEDDING_MODEL = \"openai/text-embedding-3-small\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n \"openai/text-embedding-3-small\": 1536,\n \"openai/text-embedding-3-large\": 3072,\n \"openai/text-embedding-ada-002\": 1536,\n \"mistralai/mistral-embed\": 1024,\n};\n\nexport const openRouterMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"openrouter\",\n defaultModel: DEFAULT_OPENROUTER_EMBEDDING_MODEL,\n transport: \"remote\",\n authProviderId: \"openrouter\",\n autoSelectPriority: 15,\n create: (options) =>\n createOpenAiCompatibleRuntime(\n {\n id: \"openrouter\",\n defaultBaseUrl: \"https://openrouter.ai/api\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n baseUrlEnv: \"OPENROUTER_API_BASE_URL\",\n defaultModel: DEFAULT_OPENROUTER_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n },\n options,\n ),\n};\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { createOpenAiCompatibleRuntime } from \"./openai-compatible.js\";\n\n/**\n * Voyage AI embedding adapter — `POST /v1/embeddings` at\n * `https://api.voyageai.com` with the OpenAI-compatible `{ model, input }`\n * request shape. Free tier (200M tokens/month) covers most SDK use.\n *\n * Honors `VOYAGE_API_KEY` and `VOYAGE_API_BASE_URL`.\n *\n * @internal\n */\n\nexport const DEFAULT_VOYAGE_EMBEDDING_MODEL = \"voyage-3-lite\";\n\nconst DIMENSION_BY_MODEL: Record<string, number> = {\n \"voyage-3-lite\": 512,\n \"voyage-3\": 1024,\n \"voyage-3-large\": 1024,\n \"voyage-code-3\": 1024,\n \"voyage-multilingual-2\": 1024,\n};\n\nexport const voyageMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapter = {\n id: \"voyage\",\n defaultModel: DEFAULT_VOYAGE_EMBEDDING_MODEL,\n transport: \"remote\",\n authProviderId: \"voyage\",\n autoSelectPriority: 14,\n create: (options) =>\n createOpenAiCompatibleRuntime(\n {\n id: \"voyage\",\n defaultBaseUrl: \"https://api.voyageai.com\",\n apiKeyEnv: \"VOYAGE_API_KEY\",\n baseUrlEnv: \"VOYAGE_API_BASE_URL\",\n defaultModel: DEFAULT_VOYAGE_EMBEDDING_MODEL,\n dimensionByModel: DIMENSION_BY_MODEL,\n },\n options,\n ),\n};\n","import type { MemoryEmbeddingProviderAdapter } from \"../embedding-adapter.js\";\nimport { deepinfraMemoryEmbeddingProviderAdapter } from \"./deepinfra-embedding.js\";\nimport { mistralMemoryEmbeddingProviderAdapter } from \"./mistral-embedding.js\";\nimport { ollamaMemoryEmbeddingProviderAdapter } from \"./ollama-embedding.js\";\nimport { openAiMemoryEmbeddingProviderAdapter } from \"./openai-embedding.js\";\nimport { openRouterMemoryEmbeddingProviderAdapter } from \"./openrouter-embedding.js\";\nimport { voyageMemoryEmbeddingProviderAdapter } from \"./voyage-embedding.js\";\n\n/**\n * Memory embedding adapter catalog, indexed by provider id.\n *\n * Only adapters with full, tested implementations are exposed. The\n * `openrouter` provider proxies through OpenRouter to whichever embedding\n * model the caller selects via `model` (e.g.\n * `\"openai/text-embedding-3-small\"`, `\"mistralai/mistral-embed\"`).\n *\n * Locked by ADR D11: `openai`, `mistral`, `openrouter`, `voyage`, `deepinfra`\n * ship in v1.0. ADR D183: `ollama` added — first `transport: \"local\"`\n * adapter, enables 100%-local RAG (no remote API key needed).\n * `lmstudio`, `google`, `bedrock` are deferred to v1.1.\n *\n * @internal\n */\nexport const MEMORY_EMBEDDING_ADAPTERS: Readonly<Record<string, MemoryEmbeddingProviderAdapter>> = {\n openai: openAiMemoryEmbeddingProviderAdapter,\n mistral: mistralMemoryEmbeddingProviderAdapter,\n openrouter: openRouterMemoryEmbeddingProviderAdapter,\n voyage: voyageMemoryEmbeddingProviderAdapter,\n deepinfra: deepinfraMemoryEmbeddingProviderAdapter,\n ollama: ollamaMemoryEmbeddingProviderAdapter,\n};\n","/**\n * Consecutive-timeout circuit breaker for Active Memory recall.\n *\n * Mirrors OpenClaw's `circuitBreakerMaxTimeouts` + `circuitBreakerCooldownMs`\n * config: after N consecutive timeouts the breaker trips and `shouldSkip`\n * returns `true` until `cooldownMs` has elapsed. A successful recall resets\n * the counter immediately.\n *\n * Per-key isolation so two agents in the same process don't share a counter.\n *\n * @internal\n */\n\nexport interface CircuitBreakerOptions {\n maxTimeouts?: number;\n cooldownMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n}\n\ninterface KeyState {\n consecutiveTimeouts: number;\n cooldownUntilMs: number;\n}\n\nconst DEFAULT_MAX_TIMEOUTS = 3;\nconst DEFAULT_COOLDOWN_MS = 60_000;\n\nexport class CircuitBreaker {\n private readonly states = new Map<string, KeyState>();\n\n constructor(private readonly opts: CircuitBreakerOptions = {}) {}\n\n /** @returns true when the breaker is open and the call should be skipped. */\n shouldSkip(key: string): boolean {\n const state = this.states.get(key);\n if (state === undefined) return false;\n if (state.cooldownUntilMs === 0) return false;\n if (this.now() < state.cooldownUntilMs) return true;\n // Cooldown elapsed — close the breaker.\n state.cooldownUntilMs = 0;\n state.consecutiveTimeouts = 0;\n return false;\n }\n\n recordSuccess(key: string): void {\n const state = this.states.get(key);\n if (state === undefined) return;\n state.consecutiveTimeouts = 0;\n state.cooldownUntilMs = 0;\n }\n\n recordTimeout(key: string): void {\n const state = this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n state.consecutiveTimeouts += 1;\n if (state.consecutiveTimeouts >= (this.opts.maxTimeouts ?? DEFAULT_MAX_TIMEOUTS)) {\n state.cooldownUntilMs = this.now() + (this.opts.cooldownMs ?? DEFAULT_COOLDOWN_MS);\n }\n this.states.set(key, state);\n }\n\n /** @internal — tests inspect counter state. */\n inspect(key: string): Readonly<KeyState> {\n return this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n }\n\n private now(): number {\n return this.opts.now?.() ?? Date.now();\n }\n}\n","/**\n * FTS5 query sanitization + CJK detection (ADR D64).\n *\n * Port of Hermes' 6-step sanitizer (`hermes_state.py:1797-1847`). Prevents\n * crashes on user inputs with hyphens, dots, underscores, and unmatched\n * specials. Auto-quotes identifier-shaped tokens so `error-code` finds\n * literal `error-code` instead of `error AND code`.\n *\n * CJK detection returns true for inputs containing characters in the main\n * CJK Unicode ranges (Chinese, Japanese, Korean). CJK trigram routing is\n * deferred to v1.4 — callers receiving `containsCjk === true` should\n * short-circuit to an empty result or LIKE fallback for v1.3.\n *\n * @internal\n */\n\n// Control-char sentinels for the phrase-preservation placeholder. U+0001\n// and U+0002 are essentially never present in real user queries, and\n// crucially do NOT form word boundaries / `\\w` characters, so Step 5's\n// auto-quote regex (`\\b\\w+[-._]\\w[\\w\\-._]*\\b`) cannot match them.\n// Choosing `__PHRASE_N__` instead would re-trigger Step 5 on the second\n// sanitize pass and break idempotence.\nconst PHRASE_OPEN = \"\u0001\";\nconst PHRASE_CLOSE = \"\u0002\";\n\n/**\n * Six-step FTS5 query sanitizer. Returns a query string safe for passing\n * to `WHERE <fts5_table> MATCH ?` as a parameter.\n *\n * Returns empty string when the input contains only specials (caller MUST\n * short-circuit to avoid runtime SQL error — EC-3).\n *\n * @internal\n */\nexport function sanitizeFts5Query(query: string): string {\n if (query.length === 0) return query;\n\n // Step 1: preserve \"quoted phrases\" via control-char placeholders.\n const phrases: string[] = [];\n let text = query.replace(/\"[^\"]+\"/g, (match) => {\n phrases.push(match);\n return `${PHRASE_OPEN}${phrases.length - 1}${PHRASE_CLOSE}`;\n });\n\n // Step 2: strip unmatched specials (brackets, braces, parens, double quotes, caret).\n text = text.replace(/[[\\]{}()\"^]/g, \" \");\n\n // Step 3: collapse repeated asterisks (FTS5 prefix operator is single `*`).\n text = text.replace(/\\*+/g, \"*\");\n\n // Step 4: strip dangling boolean operators (AND/OR/NOT) at start/end.\n text = text.replace(/^\\s*(AND|OR|NOT)\\s+/i, \"\");\n text = text.replace(/\\s+(AND|OR|NOT)\\s*$/i, \"\");\n\n // Step 5: auto-quote identifier-shaped tokens that contain `-`, `.`, or `_`.\n // FTS5 tokenizer would otherwise split them as boolean conjunctions.\n text = text.replace(/\\b\\w+[-._]\\w[\\w\\-._]*\\b/g, (match) => `\"${match}\"`);\n\n // Step 6: restore preserved phrases.\n for (let i = 0; i < phrases.length; i += 1) {\n text = text.replace(`${PHRASE_OPEN}${i}${PHRASE_CLOSE}`, phrases[i] ?? \"\");\n }\n\n return text.trim();\n}\n\n// CJK code-point ranges. Coverage matches Hermes' coarse detection for v1.3;\n// fine-grained trigram routing comes in v1.4.\nconst CJK_RANGES: ReadonlyArray<readonly [number, number]> = [\n [0x3000, 0x303f], // CJK Symbols and Punctuation\n [0x3040, 0x309f], // Hiragana\n [0x30a0, 0x30ff], // Katakana\n [0x3400, 0x4dbf], // CJK Unified Ideographs Extension A\n [0x4e00, 0x9fff], // CJK Unified Ideographs\n [0xac00, 0xd7af], // Hangul Syllables\n];\n\n/**\n * Returns true if `text` contains at least one character in the main CJK\n * Unicode ranges.\n *\n * @internal\n */\nexport function containsCjk(text: string): boolean {\n for (const char of text) {\n const cp = char.codePointAt(0);\n if (cp === undefined) continue;\n for (const [lo, hi] of CJK_RANGES) {\n if (cp >= lo && cp <= hi) return true;\n }\n }\n return false;\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { MemoryChunk } from \"./types.js\";\n\n/**\n * Split a markdown document into semantically meaningful chunks (ADR D1 of\n * memory-system-openclaw-parity).\n *\n * Algorithm:\n * 1. Walk lines tracking the current heading (latest `^#+ ` line).\n * 2. Split chunks at the next heading boundary AND on blank-line paragraph\n * boundaries.\n * 3. If a single paragraph exceeds `maxChars`, split it at the nearest\n * whitespace ≤ maxChars (word-aligned per edge-case review EC-6) —\n * never mid-word.\n *\n * Mirrors OpenClaw's `chunkMarkdown` from\n * `packages/memory-host-sdk/src/host/chunk-markdown.ts`.\n *\n * @internal\n */\n\nexport interface ChunkMarkdownOptions {\n /** Maximum chars per chunk. Default 800. */\n maxChars?: number;\n /** Minimum chars per chunk (avoids splintering tiny lines). Default 80. */\n minChars?: number;\n}\n\nconst HEADING_RE = /^(#{1,6})\\s+(.+?)\\s*$/;\n\ninterface ChunkAccumulator {\n chunks: MemoryChunk[];\n lines: string[];\n start: number;\n heading: string | undefined;\n}\n\nexport function chunkMarkdown(text: string, options: ChunkMarkdownOptions = {}): MemoryChunk[] {\n const maxChars = options.maxChars ?? 800;\n if (text.length === 0) return [];\n const lines = text.split(\"\\n\");\n const acc: ChunkAccumulator = { chunks: [], lines: [], start: 1, heading: undefined };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineNumber = i + 1;\n processLine(acc, line, lineNumber, maxChars);\n }\n flushAccumulator(acc, lines.length, maxChars);\n return acc.chunks;\n}\n\nfunction processLine(\n acc: ChunkAccumulator,\n line: string,\n lineNumber: number,\n maxChars: number,\n): void {\n const headingMatch = HEADING_RE.exec(line);\n const isBlank = line.trim().length === 0;\n if (headingMatch !== null && acc.lines.length > 0) {\n flushAccumulator(acc, lineNumber - 1, maxChars);\n }\n if (headingMatch !== null) acc.heading = headingMatch[2];\n acc.lines.push(line);\n if (isBlank && acc.lines.length > 1) {\n const joined = acc.lines.join(\"\\n\");\n if (joined.trim().length > 0) flushAccumulator(acc, lineNumber, maxChars);\n }\n}\n\nfunction flushAccumulator(acc: ChunkAccumulator, endLineExclusive: number, maxChars: number): void {\n if (acc.lines.length === 0) return;\n const chunkText = acc.lines.join(\"\\n\");\n if (chunkText.trim().length === 0) {\n acc.lines = [];\n acc.start = endLineExclusive + 1;\n return;\n }\n if (chunkText.length > maxChars) {\n pushOversizedSlices(acc.chunks, chunkText, acc.start, acc.heading, maxChars);\n } else {\n acc.chunks.push(buildChunk(chunkText, acc.start, endLineExclusive, acc.heading));\n }\n acc.lines = [];\n acc.start = endLineExclusive + 1;\n}\n\nfunction buildChunk(\n text: string,\n startLine: number,\n endLine: number,\n heading: string | undefined,\n): MemoryChunk {\n return {\n startLine,\n endLine,\n text,\n hash: createHash(\"sha256\").update(text).digest(\"hex\"),\n ...(heading !== undefined ? { heading } : {}),\n };\n}\n\nfunction pushOversizedSlices(\n chunks: MemoryChunk[],\n text: string,\n startLine: number,\n heading: string | undefined,\n maxChars: number,\n): void {\n let remaining = text;\n let lineCursor = startLine;\n while (remaining.length > maxChars) {\n const splitAt = findWordBoundarySplit(remaining, maxChars);\n const slice = remaining.slice(0, splitAt);\n const sliceLines = slice.split(\"\\n\").length;\n chunks.push(buildChunk(slice, lineCursor, lineCursor + sliceLines - 1, heading));\n remaining = remaining.slice(splitAt).replace(/^\\s+/, \"\");\n lineCursor += sliceLines - 1;\n }\n if (remaining.length > 0) {\n const sliceLines = remaining.split(\"\\n\").length;\n chunks.push(buildChunk(remaining, lineCursor, lineCursor + sliceLines - 1, heading));\n }\n}\n\n/**\n * Find a split point ≤ maxChars that lands on a whitespace boundary so we\n * don't slice a word in half. Falls back to maxChars if no whitespace is\n * within range (very rare — a single token > maxChars).\n */\nfunction findWordBoundarySplit(text: string, maxChars: number): number {\n if (text.length <= maxChars) return text.length;\n // Walk backward from maxChars looking for whitespace.\n for (let i = maxChars; i > Math.max(0, maxChars - 200); i--) {\n if (/\\s/.test(text[i] ?? \"x\")) return i;\n }\n // No whitespace within 200 chars of the cap — accept a hard split.\n return maxChars;\n}\n","import { mkdir, rename } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { applyWalWithFallback } from \"../persistence/sqlite-wal.js\";\nimport { PRAGMA_STATEMENTS, SCHEMA_STATEMENTS } from \"./index-schema.js\";\n\n/**\n * Thin wrapper around the SQLite driver. Prefers `node:sqlite` when available\n * (Node 22.5+) and falls back to `better-sqlite3`. Both expose nearly the\n * same `prepare/exec/close` surface; we normalize via a minimal adapter.\n *\n * Corrupt-DB recovery (EC-7): when opening fails with a \"file is encrypted\n * or is not a database\" or \"malformed\" error, the file is renamed aside to\n * `<path>.corrupt-<ts>` and the schema is rebuilt from scratch.\n *\n * @internal\n */\n\nexport interface MemoryDb {\n exec(sql: string): void;\n prepare(sql: string): {\n run(...args: unknown[]): { changes: number; lastInsertRowid: number | bigint };\n get(...args: unknown[]): Record<string, unknown> | undefined;\n all(...args: unknown[]): Array<Record<string, unknown>>;\n };\n /** SQLite `pragma()` access (used by `applyWalWithFallback`). */\n pragma(statement: string, options?: { simple?: boolean }): unknown;\n close(): void;\n /** Load a SQLite loadable extension at the given path (used by sqlite-vec). */\n loadExtension(path: string): void;\n}\n\nexport interface OpenDbOptions {\n filePath: string;\n /**\n * When true and opening fails with a corruption error, rename the file aside\n * and create a fresh DB. Default true.\n */\n recoverCorrupt?: boolean;\n}\n\nexport async function openMemoryDb(opts: OpenDbOptions): Promise<MemoryDb> {\n await mkdir(dirname(opts.filePath), { recursive: true });\n try {\n return await openConcrete(opts.filePath);\n } catch (cause) {\n if (opts.recoverCorrupt !== false && isCorruptionError(cause)) {\n await renameAside(opts.filePath);\n return await openConcrete(opts.filePath);\n }\n throw cause;\n }\n}\n\nasync function openConcrete(filePath: string): Promise<MemoryDb> {\n const db = await loadDriver(filePath);\n // Apply WAL with NFS/SMB/FUSE fallback (ADR D63). Must run BEFORE\n // schema statements so the journal mode is set for the entire session.\n applyWalWithFallback(db, \"memory-index\");\n for (const pragma of PRAGMA_STATEMENTS) db.exec(pragma);\n for (const stmt of SCHEMA_STATEMENTS) db.exec(stmt);\n return db;\n}\n\nasync function loadDriver(filePath: string): Promise<MemoryDb> {\n try {\n const mod = await import(\"better-sqlite3\");\n const Ctor = mod.default ?? mod;\n const db = new (Ctor as new (path: string) => unknown)(filePath) as {\n exec: (sql: string) => void;\n prepare: (sql: string) => MemoryDb[\"prepare\"] extends (s: string) => infer R ? R : never;\n close: () => void;\n };\n return db as MemoryDb;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new ConfigurationError(\n `Failed to load SQLite driver. Install \\`better-sqlite3\\` or run on Node 22.5+ for built-in \\`node:sqlite\\`. Cause: ${message}`,\n { code: \"sqlite_driver_unavailable\", cause },\n );\n }\n}\n\nfunction isCorruptionError(cause: unknown): boolean {\n if (!(cause instanceof Error)) return false;\n const msg = cause.message.toLowerCase();\n return (\n msg.includes(\"malformed\") ||\n msg.includes(\"not a database\") ||\n msg.includes(\"encrypted\") ||\n msg.includes(\"disk image is malformed\")\n );\n}\n\nasync function renameAside(filePath: string): Promise<void> {\n const asidePath = `${filePath}.corrupt-${Date.now()}`;\n await rename(filePath, asidePath).catch(() => undefined);\n // Also rename the WAL + SHM siblings if they exist so the new DB starts clean.\n await rename(`${filePath}-wal`, `${asidePath}-wal`).catch(() => undefined);\n await rename(`${filePath}-shm`, `${asidePath}-shm`).catch(() => undefined);\n process.stderr.write(\n `[theokit-sdk] memory index corrupt; renamed aside to ${asidePath} and rebuilt schema\\n`,\n );\n}\n\nexport function defaultIndexPath(cwd: string): string {\n return join(cwd, \".theokit\", \"memory\", \".index\", \"memory.sqlite\");\n}\n","/**\n * SQLite WAL mode helper with NFS/SMB/FUSE fallback to DELETE (ADR D63).\n *\n * WAL is faster (concurrent readers + one writer) but unsupported on some\n * network/FUSE filesystems. Try WAL; if the pragma returns something else\n * or throws, fall back to DELETE journal mode. Warn one time per label.\n *\n * @internal\n */\n\ninterface PragmaCapable {\n pragma: (statement: string, options?: { simple?: boolean }) => unknown;\n}\n\n/**\n * Result of `applyWalWithFallback`.\n *\n * @internal\n */\nexport interface WalApplyResult {\n /** Final journal_mode actually in effect. */\n mode: \"wal\" | \"delete\";\n /** True if we wanted WAL but the filesystem refused. */\n fellBack: boolean;\n}\n\nconst warnedLabels = new Set<string>();\n\n/**\n * Apply WAL mode with DELETE fallback. Idempotent — safe to call multiple\n * times on the same connection.\n *\n * @param db any `pragma()`-capable SQLite handle (e.g., `better-sqlite3`)\n * @param label short identifier used in the warning (e.g., \"memory-index\")\n *\n * @internal\n */\nexport function applyWalWithFallback(db: PragmaCapable, label: string): WalApplyResult {\n try {\n const result = db.pragma(\"journal_mode = WAL\", { simple: true });\n if (typeof result === \"string\" && result.toLowerCase() === \"wal\") {\n return { mode: \"wal\", fellBack: false };\n }\n logFallback(label, `got \"${String(result)}\" instead of \"wal\"`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logFallback(label, msg);\n }\n\n db.pragma(\"journal_mode = DELETE\");\n return { mode: \"delete\", fellBack: true };\n}\n\nfunction logFallback(label: string, reason: string): void {\n if (warnedLabels.has(label)) return;\n warnedLabels.add(label);\n process.stderr.write(\n `[theokit-sdk] ${label}: WAL unavailable (${reason}); using DELETE journal mode. ` +\n \"This is normal on NFS/SMB/FUSE; expect slightly slower concurrent access.\\n\",\n );\n}\n\n/**\n * Test helper — clears the warn-once registry.\n *\n * @internal\n */\nexport function _resetWalWarnings(): void {\n warnedLabels.clear();\n}\n","/**\n * SQLite schema for the memory index.\n *\n * Tables:\n * - files — one row per indexed markdown file (path, mtime, hash).\n * - chunks — one row per chunk produced by `chunkMarkdown`.\n * - chunks_fts — FTS5 virtual table mirroring chunks.text for BM25 search.\n * - meta — key/value store; persists the active embedding identity\n * (provider id, model, dimension) so we detect when the\n * index was built against a different embedding setup.\n * - embeddings — sqlite-vec virtual table holding the chunk vectors\n * (created on demand by `vec-index.ts`).\n *\n * @internal\n */\n\nexport const SCHEMA_STATEMENTS: ReadonlyArray<string> = [\n `CREATE TABLE IF NOT EXISTS files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n path TEXT UNIQUE NOT NULL,\n rel_path TEXT NOT NULL,\n mtime INTEGER NOT NULL,\n hash TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'memory'\n )`,\n `CREATE TABLE IF NOT EXISTS chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n text TEXT NOT NULL,\n hash TEXT NOT NULL,\n session_key TEXT\n )`,\n `CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(\n text,\n content='chunks',\n content_rowid='id'\n )`,\n `CREATE TRIGGER IF NOT EXISTS chunks_fts_insert AFTER INSERT ON chunks BEGIN\n INSERT INTO chunks_fts(rowid, text) VALUES (new.id, new.text);\n END`,\n `CREATE TRIGGER IF NOT EXISTS chunks_fts_delete AFTER DELETE ON chunks BEGIN\n INSERT INTO chunks_fts(chunks_fts, rowid, text) VALUES ('delete', old.id, old.text);\n END`,\n `CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT\n )`,\n `CREATE INDEX IF NOT EXISTS idx_chunks_file_id ON chunks(file_id)`,\n];\n\n/**\n * Non-WAL pragmas. WAL is applied separately via\n * `applyWalWithFallback` (T4.2, ADR D63) so NFS/SMB users get a graceful\n * DELETE fallback instead of crashing.\n */\nexport const PRAGMA_STATEMENTS: ReadonlyArray<string> = [\n \"PRAGMA synchronous=NORMAL\",\n \"PRAGMA foreign_keys=ON\",\n];\n","/**\n * Dispatch helpers for `IndexManager.open`. Extracted to keep\n * `index-manager.ts` under the G8 400-LoC budget (lancedb-backend-ship-v1-1).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { MemoryBackend, OpenIndexOptions } from \"./index-manager.js\";\nimport { LanceIndex } from \"./lance-index.js\";\nimport { LanceMemoryAdapter } from \"./lance-memory-adapter.js\";\nimport type { MemoryIndex } from \"./memory-index.js\";\n\n/** Valid backend identifiers — runtime guard against TS-narrowing escapes (EC-1). */\nexport const VALID_BACKENDS: readonly MemoryBackend[] = [\"sqlite-vec\", \"lance\"];\n\n/**\n * EC-1: runtime guard for `opts.backend`. TS union is compile-time only;\n * consumers passing JS `as any` typos must hit a typed error, not silent\n * SQLite fallback.\n */\nexport function assertValidBackend(backend: string): asserts backend is MemoryBackend {\n if (!VALID_BACKENDS.includes(backend as MemoryBackend)) {\n throw new ConfigurationError(\n `Invalid memory backend \"${backend}\". Valid values: ${VALID_BACKENDS.join(\", \")}.`,\n { code: \"invalid_memory_backend\" },\n );\n }\n}\n\n/**\n * Lance-path open. Throws `lance_requires_embedding` when no embedding\n * runtime is provided (Lance is vector-only — no FTS fallback).\n * Surfaces `lance_backend_unavailable` from LanceIndex.open when peer\n * dep is absent.\n */\nexport async function openLanceIndex(opts: OpenIndexOptions): Promise<MemoryIndex> {\n if (opts.embedding === undefined) {\n throw new ConfigurationError(\n \"Lance backend requires an embedding runtime. Pass `embedding: { provider, model, apiKey }` in Memory.create options (or omit `backend` to use SQLite default).\",\n { code: \"lance_requires_embedding\" },\n );\n }\n const lance = await LanceIndex.open({\n cwd: opts.cwd,\n embedding: opts.embedding,\n ...(opts.filePath !== undefined ? { storagePath: opts.filePath } : {}),\n });\n return new LanceMemoryAdapter(lance);\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { EmbeddingRuntime } from \"./embedding-adapter.js\";\n\n/**\n * LanceDB-backed memory index (ADR D43). Implements the same logical\n * interface as `IndexManager` but stores embeddings in Lance's columnar\n * vector-aware file format — scalable to 100k+ facts.\n *\n * Opt-in via `Memory.create({ index: { backend: \"lance\" } })`. SQLite\n * remains the default; this code path only activates when explicitly\n * requested AND `@lancedb/lancedb` is installed.\n *\n * EC-1 MUST FIX: filters use Lance structured filter API (object form) —\n * NEVER string interpolation. SQL injection via namespace is impossible.\n *\n * EC-8: embedding dimension is validated when opening an existing table.\n *\n * @internal\n */\n\ninterface LanceModule {\n connect: (uri: string) => Promise<LanceConnection>;\n}\n\ninterface LanceConnection {\n openTable: (name: string) => Promise<LanceTable>;\n createTable: (name: string, data: ReadonlyArray<LanceFactRecord>) => Promise<LanceTable>;\n tableNames: () => Promise<string[]>;\n}\n\ninterface LanceTable {\n add: (rows: ReadonlyArray<LanceFactRecord>) => Promise<void>;\n search: (vector: ReadonlyArray<number>) => LanceQuery;\n delete: (predicate: string) => Promise<void>;\n countRows: () => Promise<number>;\n // EC-8: schema introspection for dimension check.\n schema: () => Promise<{\n fields: ReadonlyArray<{\n name: string;\n // Lance 0.30 returns Apache Arrow Field. FixedSizeList type has\n // `listSize`, not `fixedSize`. typeId=16 = FixedSizeList in Arrow.\n type: { listSize?: number; fixedSize?: number };\n }>;\n }>;\n}\n\ninterface LanceQuery {\n where: (filter: string | Record<string, unknown>) => LanceQuery;\n limit: (n: number) => LanceQuery;\n toArray: () => Promise<ReadonlyArray<LanceFactRecord & { _distance?: number }>>;\n}\n\nexport interface LanceFactRecord {\n id: string;\n text: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n embedding: ReadonlyArray<number>;\n namespace: string;\n scope: string;\n user_id: string;\n timestamp: number;\n}\n\nexport interface OpenLanceOptions {\n cwd: string;\n embedding: EmbeddingRuntime;\n /** Override storage location. Default: `<cwd>/.theokit/memory/lance/`. */\n storagePath?: string;\n}\n\nexport interface LanceSearchOptions {\n namespace: string;\n scope?: string;\n limit?: number;\n sources?: ReadonlyArray<\"memory\" | \"sessions\" | \"wiki\">;\n}\n\nexport interface LanceSearchHit {\n id: string;\n text: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n namespace: string;\n scope: string;\n userId: string;\n score: number;\n}\n\n/**\n * Lazily load `@lancedb/lancedb`. Throws typed error when absent.\n *\n * @internal\n */\nfunction requireLance(): LanceModule {\n try {\n const r = createRequire(import.meta.url);\n return r(\"@lancedb/lancedb\") as LanceModule;\n } catch (cause) {\n throw new ConfigurationError(\n \"Lance backend selected but `@lancedb/lancedb` is not installed. \" +\n 'Install with: `pnpm add @lancedb/lancedb`. SQLite remains available as the default (omit `backend: \"lance\"`).',\n { code: \"lance_backend_unavailable\", cause },\n );\n }\n}\n\n/**\n * Lance-backed memory index. Public API mirrors the SQLite one logically:\n * `addFacts`, `search`, `countFacts`, `removeFacts`, `close`.\n *\n * @internal\n */\nexport class LanceIndex {\n private constructor(\n private readonly table: LanceTable,\n private readonly embedding: EmbeddingRuntime,\n private readonly embeddingDim: number,\n ) {}\n\n static async open(opts: OpenLanceOptions): Promise<LanceIndex> {\n const lance = requireLance();\n const storagePath = opts.storagePath ?? join(opts.cwd, \".theokit\", \"memory\", \"lance\");\n mkdirSync(storagePath, { recursive: true });\n const conn = await lance.connect(storagePath);\n const dim = opts.embedding.dimension;\n const tableName = \"facts\";\n const existing = await conn.tableNames();\n let table: LanceTable;\n if (existing.includes(tableName)) {\n table = await conn.openTable(tableName);\n // EC-8: validate embedding dimension matches what's in storage.\n // Lance 0.30 uses Apache Arrow FixedSizeList type — the size lives\n // in `type.listSize` (older API used `fixedSize`; we read both for\n // forward/backward safety).\n const schema = await table.schema();\n const embField = schema.fields.find((f) => f.name === \"embedding\");\n const existingDim = embField?.type?.listSize ?? embField?.type?.fixedSize;\n if (typeof existingDim === \"number\" && existingDim !== dim) {\n throw new ConfigurationError(\n `Embedding dimension mismatch in Lance index: storage has ${existingDim}-dim vectors, current provider yields ${dim}-dim. Run \\`theokit-migrate-memory\\` after switching providers, or use a different storagePath.`,\n { code: \"embedding_dimension_mismatch\" },\n );\n }\n } else {\n // Create with one bootstrap record. Lance requires an initial row to\n // infer schema; we delete the bootstrap immediately.\n const bootstrap: LanceFactRecord = {\n id: \"__bootstrap__\",\n text: \"\",\n source: \"memory\",\n embedding: new Array(dim).fill(0),\n namespace: \"__bootstrap__\",\n scope: \"__bootstrap__\",\n user_id: \"__bootstrap__\",\n timestamp: 0,\n };\n table = await conn.createTable(tableName, [bootstrap]);\n await table.delete(\"namespace = '__bootstrap__'\");\n }\n return new LanceIndex(table, opts.embedding, dim);\n }\n\n async addFacts(facts: ReadonlyArray<Omit<LanceFactRecord, \"embedding\">>): Promise<void> {\n if (facts.length === 0) return;\n const texts = facts.map((f) => f.text);\n const embeddings = await this.embedding.embed(texts);\n const rows: LanceFactRecord[] = facts.map((f, i) => ({\n ...f,\n embedding: embeddings[i] ?? new Array(this.embeddingDim).fill(0),\n }));\n await this.table.add(rows);\n }\n\n /**\n * Search facts by semantic similarity. EC-1: filters use Lance's\n * structured object filter — NEVER string interpolation.\n */\n async search(query: string, opts: LanceSearchOptions): Promise<LanceSearchHit[]> {\n const [embedding] = await this.embedding.embed([query]);\n if (embedding === undefined) return [];\n // EC-1 (lancedb-backend-ship-v1-1 integration test caught this 2026-05-31):\n // Lance 0.30.0's `.where()` accepts SQL STRING only, NOT object filter —\n // contrary to D43's original assumption. We build the SQL string with\n // single-quote escaping (`'` → `''`) to neutralize injection. This is\n // the standard SQL string-literal escape; bind parameters are not\n // supported in Lance's predicate API. Backed by integration test\n // `injection attempt in namespace does not break filter` (test 7).\n const predicates: string[] = [`namespace = '${escapeSqlValue(opts.namespace)}'`];\n if (opts.scope !== undefined) {\n predicates.push(`scope = '${escapeSqlValue(opts.scope)}'`);\n }\n let q = this.table.search(embedding).where(predicates.join(\" AND \"));\n if (opts.limit !== undefined) q = q.limit(opts.limit);\n const results = await q.toArray();\n return results\n .filter((r) => opts.sources === undefined || opts.sources.includes(r.source))\n .map((r) => ({\n id: r.id,\n text: r.text,\n source: r.source,\n namespace: r.namespace,\n scope: r.scope,\n userId: r.user_id,\n // Lower _distance = better match; normalize to 0..1 (1=best).\n score: 1 / (1 + (r._distance ?? 1)),\n }));\n }\n\n async countFacts(namespace: string): Promise<number> {\n // Total count, regardless of namespace, used by migration validation.\n // For per-namespace count, callers can do a where() + countRows() if\n // Lance supports it; v1.2 ships with global count only.\n void namespace;\n return this.table.countRows();\n }\n\n async removeFacts(ids: ReadonlyArray<string>): Promise<void> {\n if (ids.length === 0) return;\n // Build a parameterized-style delete predicate. Lance's delete still\n // takes a string predicate, so we explicitly quote-escape each id —\n // ids in our system are content-hashed (alphanumeric), so the risk\n // is low, but we belt-and-suspenders.\n const escaped = ids.map((id) => `'${id.replace(/'/g, \"''\")}'`).join(\", \");\n await this.table.delete(`id IN (${escaped})`);\n }\n\n async close(): Promise<void> {\n // Lance auto-closes on GC; no explicit shutdown needed.\n }\n}\n\n/**\n * Escape a value for safe SQL string interpolation in Lance predicates.\n * Lance does not support bind parameters — string-quote escape is the\n * only injection-safe option. Standard SQL: replace single quotes with\n * doubled single quotes.\n *\n * @internal\n */\nfunction escapeSqlValue(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/**\n * Test helper for {@link LanceIndex}: indicates whether the Lance module\n * is loadable in the current environment. Allows tests to gracefully skip\n * when the optional dep is absent.\n *\n * @internal\n */\nexport function isLanceAvailable(): boolean {\n try {\n const r = createRequire(import.meta.url);\n r(\"@lancedb/lancedb\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Test helper: re-export the storage path computation.\n *\n * @internal\n */\nexport function lanceStoragePath(cwd: string): string {\n return join(cwd, \".theokit\", \"memory\", \"lance\");\n}\n\nvoid existsSync; // imported but only used conditionally via mkdirSync\n","/**\n * Common `MemoryIndex` interface shared between the SQLite-backed\n * `IndexManager` (default) and the Lance-backed adapter (ADR D43, shipped\n * v1.4.0 via lancedb-backend-ship-v1-1 plan).\n *\n * Consumers (`local-agent-memory.ts`, `active-memory.ts`, `tools.ts`,\n * `runActiveMemory`) only ever call `sync()`, `search()`, `status()`,\n * `close()` — the union of those four methods is the portable surface.\n *\n * Why a separate file (vs declaring inline in `index-manager.ts`)? D43\n * promised \"extrair interface abstrata `MemoryIndex` em\n * `internal/memory/index-interface.ts`\". Keeping the contract physically\n * separated from one of its implementations preserves OCP — future\n * backends (Qdrant, PGVector) can land without touching IndexManager.\n *\n * @internal\n */\n\nimport type { IndexStatus, MemorySearchHit, SearchOptions } from \"./index-manager.js\";\n\n// Re-export consumer-facing shapes for stable internal import paths.\nexport type { IndexStatus, MemorySearchHit, SearchOptions };\n\nexport interface SyncResult {\n filesScanned: number;\n filesUpdated: number;\n chunksWritten: number;\n chunksEmbedded: number;\n}\n\n/**\n * Common search-options parser used by both `IndexManager.search` and\n * `LanceMemoryAdapter.search`. Returns the normalized cap + minimum-score\n * floor — eliminates jscpd duplication while keeping per-backend search\n * logic distinct.\n */\nexport function parseSearchOptions(options: SearchOptions = {}): {\n maxResults: number;\n minScore: number;\n} {\n return {\n maxResults: Math.max(1, options.maxResults ?? 10),\n minScore: options.minScore ?? 0,\n };\n}\n\nexport interface MemoryIndex {\n /**\n * Walk the memory corpus + reindex changed files. Lance backend has no\n * markdown corpus to walk — its adapter returns zero counts (no-op) and\n * relies on explicit `addFact` calls instead.\n */\n sync(): Promise<SyncResult>;\n\n /**\n * Semantic + textual search over the indexed corpus. Both backends\n * return the same `MemorySearchHit[]` shape; Lance leaves `textScore`\n * undefined (vector-only — no FTS5 layer).\n */\n search(query: string, options?: SearchOptions): Promise<MemorySearchHit[]>;\n\n /** Snapshot of the index health (backend type + counts). */\n status(): IndexStatus;\n\n /** Release native handles. Idempotent. */\n close(): Promise<void> | void;\n}\n","/**\n * `LanceMemoryAdapter` — wraps `LanceIndex` to expose the common\n * `MemoryIndex` interface (sync/search/status/close) so consumers of\n * `IndexManager.open({ backend: \"lance\" })` get a drop-in replacement\n * for the SQLite-backed `IndexManager`.\n *\n * Semantic deltas vs SQLite (documented so callers know what to expect):\n *\n * - `sync()` is a NO-OP. Lance is a pure vector store — there is no\n * markdown corpus to crawl. Returns zero counts. Consumers writing\n * facts use `LanceIndex.addFacts` directly (exposed via the index\n * object returned to advanced callers).\n * - `search()` performs vector-only retrieval. `MemorySearchHit.textScore`\n * is undefined (no FTS5 layer); `vectorScore === score`.\n * - `status()` reports `backend: \"hybrid\"` only when an embedding runtime\n * is wired (always the case for Lance — embedding is required at open).\n * `chunksIndexed` reflects total Lance row count; `filesIndexed` is 0\n * because Lance does not track file provenance per-row.\n *\n * Ships with the lancedb-backend-ship-v1-1 plan (close D12, supersede via\n * D43). v1.4.0 of `@theokit/sdk`.\n *\n * @internal\n */\n\nimport type { IndexStatus, MemorySearchHit, SearchOptions } from \"./index-manager.js\";\nimport type { LanceIndex } from \"./lance-index.js\";\nimport { type MemoryIndex, parseSearchOptions, type SyncResult } from \"./memory-index.js\";\n\n/**\n * Default namespace used when consumers call `search()` without specifying\n * one. The SQLite `IndexManager` does not surface namespace in its public\n * `search()` signature either — both backends therefore behave consistently\n * under the \"single-workspace, single-namespace\" assumption that v1.4 ships.\n *\n * v1.5 candidate: surface `namespace` in `SearchOptions` (additive — no\n * breaking change) so multi-tenant Lance consumers can scope queries.\n */\nconst DEFAULT_NAMESPACE = \"default\";\n\n/** Empty sync result — Lance has no corpus to walk. */\nconst EMPTY_SYNC_RESULT: SyncResult = Object.freeze({\n filesScanned: 0,\n filesUpdated: 0,\n chunksWritten: 0,\n chunksEmbedded: 0,\n});\n\nexport class LanceMemoryAdapter implements MemoryIndex {\n constructor(private readonly inner: LanceIndex) {}\n\n /**\n * No-op for Lance — see file header. Returns zero counts so callers'\n * existing logging (`filesScanned: X`) does not break.\n */\n async sync(): Promise<SyncResult> {\n return EMPTY_SYNC_RESULT;\n }\n\n // jscpd:ignore-start — search signature + early-out is idiomatic\n // overlap with IndexManager.search; further factoring would hurt\n // readability (the bodies diverge sharply right after).\n async search(query: string, options: SearchOptions = {}): Promise<MemorySearchHit[]> {\n if (query.trim().length === 0) return [];\n const { maxResults, minScore } = parseSearchOptions(options);\n // jscpd:ignore-end\n const lanceHits = await this.inner.search(query, {\n namespace: DEFAULT_NAMESPACE,\n limit: maxResults * 2,\n ...(options.sources !== undefined ? { sources: options.sources } : {}),\n });\n return lanceHits\n .filter((h) => h.score >= minScore)\n .slice(0, maxResults)\n .map((h) => translateLanceHit(h));\n }\n\n status(): IndexStatus {\n // chunksIndexed via a synchronous best-effort — Lance API is async so\n // we surface zero here and document that consumers needing exact counts\n // should call `inner.countFacts()` directly.\n return {\n backend: \"hybrid\",\n filesIndexed: 0,\n chunksIndexed: 0,\n };\n }\n\n async close(): Promise<void> {\n await this.inner.close();\n }\n\n /**\n * Escape hatch for advanced callers (migration tool, benchmark script)\n * that need direct access to addFacts/countFacts/removeFacts.\n */\n unwrap(): LanceIndex {\n return this.inner;\n }\n}\n\n/**\n * Translate `LanceSearchHit` to `MemorySearchHit`. Field mapping:\n *\n * - `id` → `path` (Lance has no file-system provenance; use opaque id)\n * - `text` → `snippet` (truncated to 200 chars matching IndexManager convention)\n * - `score` → `score` AND `vectorScore` (Lance is vector-only)\n * - `source` → `source`\n * - synthetic `startLine: 0, endLine: 0` (Lance has no line info)\n * - synthetic `citation: id` (no path:line citation available)\n * - `textScore` omitted (Lance does NOT do FTS5)\n */\nfunction translateLanceHit(hit: {\n id: string;\n text: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n score: number;\n}): MemorySearchHit {\n return {\n path: hit.id,\n startLine: 0,\n endLine: 0,\n score: hit.score,\n textScore: 0,\n vectorScore: hit.score,\n snippet: hit.text.slice(0, 200),\n source: hit.source,\n citation: hit.id,\n };\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { replaceFileAtomic } from \"./atomic-write.js\";\nimport { memoryDir } from \"./markdown-store.js\";\nimport { redactSecrets } from \"./types.js\";\n\n/**\n * Per-run session summary writer (ADR D20).\n *\n * After every finished run, write a markdown summary to\n * `.theokit/memory/sessions/<runId>.md`. IndexManager picks these up with\n * `source=\"sessions\"` so `memory_search({ corpus: \"sessions\" })` can recall\n * past conversations.\n *\n * EC-9: only `status === \"finished\"` runs trigger a write. Cancelled/errored\n * runs would otherwise pollute the recall corpus with partial transcripts.\n *\n * @internal\n */\n\nexport interface SessionSummaryInput {\n cwd: string;\n runId: string;\n agentId: string;\n userText: string;\n assistantText: string;\n status: \"finished\" | \"running\" | \"error\" | \"cancelled\";\n at: number;\n}\n\nconst MAX_TURN_CHARS = 2000;\n\nexport function sessionsDir(cwd: string): string {\n return join(memoryDir(cwd), \"sessions\");\n}\n\nexport function sessionSummaryPath(cwd: string, runId: string): string {\n return join(sessionsDir(cwd), `${sanitizeRunId(runId)}.md`);\n}\n\nfunction sanitizeRunId(runId: string): string {\n // Strip path separators and obvious traversal patterns so a malicious\n // run-id cannot escape the sessions directory. Keep `[a-zA-Z0-9_-]`.\n return runId.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 128);\n}\n\nfunction truncate(text: string): string {\n if (text.length <= MAX_TURN_CHARS) return text;\n return `${text.slice(0, MAX_TURN_CHARS)}…`;\n}\n\n/**\n * Write a session summary file. EC-9: a non-finished status returns early\n * without touching disk. Secrets in both user and assistant text are\n * redacted via the shared `redactSecrets` pattern.\n *\n * @internal\n */\nexport async function writeSessionSummary(input: SessionSummaryInput): Promise<void> {\n if (input.status !== \"finished\") return;\n const path = sessionSummaryPath(input.cwd, input.runId);\n await mkdir(sessionsDir(input.cwd), { recursive: true });\n\n const safeUser = redactSecrets(truncate(input.userText));\n const safeAssistant = redactSecrets(truncate(input.assistantText));\n const iso = new Date(input.at).toISOString();\n\n const body = [\n \"---\",\n `runId: ${input.runId}`,\n `agentId: ${input.agentId}`,\n `at: ${iso}`,\n `status: ${input.status}`,\n \"---\",\n \"\",\n \"## User\",\n \"\",\n safeUser,\n \"\",\n \"## Assistant\",\n \"\",\n safeAssistant,\n \"\",\n ].join(\"\\n\");\n\n await replaceFileAtomic(path, body);\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { memoryDir } from \"./markdown-store.js\";\nimport { sessionsDir } from \"./session-summary-writer.js\";\n\n/**\n * Session summary discovery (ADR D20).\n *\n * Mirrors `wiki-loader.ts:discoverWikiFiles`: scans\n * `.theokit/memory/sessions/*.md` and returns `MemoryFileEntry`-shaped\n * records. IndexManager tags each chunk with `source=\"sessions\"` so\n * `memory_search({ corpus: \"sessions\" })` filters them in.\n *\n * @internal\n */\n\nexport interface SessionFile {\n absolutePath: string;\n relPath: string;\n}\n\nexport async function discoverSessionFiles(cwd: string): Promise<SessionFile[]> {\n let entries: string[];\n try {\n entries = await readdir(sessionsDir(cwd));\n } catch {\n return [];\n }\n const root = memoryDir(cwd);\n return entries\n .filter((entry) => entry.endsWith(\".md\"))\n .map((entry) => {\n const absolutePath = join(sessionsDir(cwd), entry);\n return {\n absolutePath,\n relPath: relativeToRoot(root, absolutePath),\n };\n });\n}\n\nfunction relativeToRoot(root: string, absolutePath: string): string {\n if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);\n return absolutePath;\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport type { MemoryDb } from \"./index-db.js\";\n\n/**\n * Load the `sqlite-vec` extension into an opened SQLite connection.\n *\n * Wraps the native `load(db)` call from the `sqlite-vec` npm package with a\n * typed error path (EC-8 of the edge-case review) so callers see a\n * `sqlite_vec_unavailable` ConfigurationError instead of a raw native error.\n *\n * @internal\n */\nexport async function loadSqliteVecExtension(db: MemoryDb): Promise<void> {\n try {\n const mod = await import(\"sqlite-vec\");\n const loadFn = (mod as { load?: (db: unknown) => void }).load;\n if (typeof loadFn !== \"function\") {\n throw new Error(\"sqlite-vec module exposes no `load` export\");\n }\n loadFn(db);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n throw new ConfigurationError(\n `sqlite-vec extension unavailable. Install \\`sqlite-vec\\` and ensure the native binary matches your Node + OS. Cause: ${message}`,\n { code: \"sqlite_vec_unavailable\", cause },\n );\n }\n}\n\n/** Check whether sqlite-vec is loaded by running a tiny version query. */\nexport function isSqliteVecLoaded(db: MemoryDb): boolean {\n try {\n const row = db.prepare(\"SELECT vec_version() as v\").get();\n return row !== undefined && row.v !== undefined;\n } catch {\n return false;\n }\n}\n","import type { EmbeddingRuntime } from \"./embedding-adapter.js\";\nimport type { MemoryDb } from \"./index-db.js\";\n\n/**\n * Vector index helpers (ADR D2 + D4 of memory-system-openclaw-parity).\n *\n * Embeddings live in `embeddings(chunk_id, vec)` — a `vec0` virtual table\n * provided by the sqlite-vec extension. Embedding identity (providerId +\n * model + dimension) lives in the `meta` table; mismatches force a full\n * re-embed sweep (EC-1).\n *\n * @internal\n */\n\nexport const META_KEY_PROVIDER_ID = \"embedding.providerId\";\nexport const META_KEY_MODEL = \"embedding.model\";\nexport const META_KEY_DIMENSION = \"embedding.dimension\";\n\nexport interface EmbeddingIdentity {\n providerId: string;\n model: string;\n dimension: number;\n}\n\nexport function readEmbeddingIdentity(db: MemoryDb): EmbeddingIdentity | undefined {\n const get = (key: string): string | undefined => {\n const row = db.prepare(\"SELECT value FROM meta WHERE key = ?\").get(key);\n return row !== undefined ? String(row.value) : undefined;\n };\n const providerId = get(META_KEY_PROVIDER_ID);\n const model = get(META_KEY_MODEL);\n const dimRaw = get(META_KEY_DIMENSION);\n if (providerId === undefined || model === undefined || dimRaw === undefined) return undefined;\n const dimension = Number(dimRaw);\n if (!Number.isFinite(dimension) || dimension <= 0) return undefined;\n return { providerId, model, dimension };\n}\n\nexport function writeEmbeddingIdentity(db: MemoryDb, identity: EmbeddingIdentity): void {\n const stmt = db.prepare(\n \"INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value\",\n );\n stmt.run(META_KEY_PROVIDER_ID, identity.providerId);\n stmt.run(META_KEY_MODEL, identity.model);\n stmt.run(META_KEY_DIMENSION, String(identity.dimension));\n}\n\nexport function identityMatches(a: EmbeddingIdentity, b: EmbeddingIdentity): boolean {\n return a.providerId === b.providerId && a.model === b.model && a.dimension === b.dimension;\n}\n\nexport function dropVectorIndex(db: MemoryDb): void {\n db.exec(\"DROP TABLE IF EXISTS embeddings\");\n}\n\nexport function createVectorIndex(db: MemoryDb, dimension: number): void {\n db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS embeddings USING vec0(\n chunk_id INTEGER PRIMARY KEY,\n vec FLOAT[${dimension}]\n )`);\n}\n\n/** Pack a Float32Array into a Buffer suitable for sqlite-vec BLOB binding. */\nexport function packVector(vec: ReadonlyArray<number>): Buffer {\n const f32 = new Float32Array(vec.length);\n for (let i = 0; i < vec.length; i++) f32[i] = vec[i] ?? 0;\n return Buffer.from(f32.buffer);\n}\n\nexport function upsertEmbedding(db: MemoryDb, chunkId: number, vec: ReadonlyArray<number>): void {\n // sqlite-vec vec0 virtual tables don't support UPSERT — emulate via\n // DELETE-then-INSERT. vec0 REJECTS JS Number for chunk_id columns; it\n // requires BigInt binding. Verified via repro against vec0 v0.1.9.\n const id = BigInt(chunkId);\n db.prepare(\"DELETE FROM embeddings WHERE chunk_id = ?\").run(id);\n db.prepare(\"INSERT INTO embeddings (chunk_id, vec) VALUES (?, ?)\").run(id, packVector(vec));\n}\n\nexport interface VectorHitRow {\n chunk_id: number;\n distance: number;\n}\n\nexport function vectorSearch(\n db: MemoryDb,\n query: ReadonlyArray<number>,\n k: number,\n): VectorHitRow[] {\n // sqlite-vec returns distance (lower = closer). Use KNN syntax. k needs\n // a BigInt-typed binding too.\n const rows = db\n .prepare(\n `SELECT chunk_id, distance FROM embeddings\n WHERE vec MATCH ? AND k = ?\n ORDER BY distance`,\n )\n .all(packVector(query), BigInt(k));\n return rows.map((row) => ({ chunk_id: Number(row.chunk_id), distance: Number(row.distance) }));\n}\n\nexport interface EmbedAllArgs {\n db: MemoryDb;\n runtime: EmbeddingRuntime;\n}\n\n/** Embed every chunk that doesn't yet have a vector. */\nexport async function embedMissingChunks(args: EmbedAllArgs): Promise<number> {\n const rows = args.db\n .prepare(\n `SELECT chunks.id as id, chunks.text as text\n FROM chunks\n LEFT JOIN embeddings ON embeddings.chunk_id = chunks.id\n WHERE embeddings.chunk_id IS NULL`,\n )\n .all();\n if (rows.length === 0) return 0;\n const normalized = rows.map((row) => ({ id: Number(row.id), text: String(row.text ?? \"\") }));\n const vectors = await args.runtime.embed(normalized.map((r) => r.text));\n for (let i = 0; i < normalized.length; i++) {\n const row = normalized[i];\n const vector = vectors[i];\n if (row === undefined || vector === undefined) continue;\n upsertEmbedding(args.db, row.id, vector);\n }\n return normalized.length;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { memoryDir } from \"./markdown-store.js\";\n\n/**\n * Wiki supplement discovery (ADR Phase 10 of memory-system-openclaw-parity).\n *\n * Wiki files live under `.theokit/memory/wiki/*.md`. They are READ-ONLY —\n * the SDK never writes here. Each indexed chunk carries `source=\"wiki\"` so\n * `memory_search { corpus: \"wiki\" }` and `corpus: \"all\"` can scope hits.\n *\n * @internal\n */\n\nexport interface WikiFile {\n absolutePath: string;\n relPath: string;\n}\n\nexport function wikiDir(cwd: string): string {\n return join(memoryDir(cwd), \"wiki\");\n}\n\nexport async function discoverWikiFiles(cwd: string): Promise<WikiFile[]> {\n let entries: string[];\n try {\n entries = await readdir(wikiDir(cwd));\n } catch {\n return [];\n }\n const root = memoryDir(cwd);\n return entries\n .filter((entry) => entry.endsWith(\".md\"))\n .map((entry) => ({\n absolutePath: join(wikiDir(cwd), entry),\n relPath: join(\"wiki\", entry),\n }))\n .map((file) => ({\n absolutePath: file.absolutePath,\n relPath: relativeToRoot(root, file.absolutePath),\n }));\n}\n\nfunction relativeToRoot(root: string, absolutePath: string): string {\n // memory root is e.g. /tmp/x/.theokit/memory; wiki file is /tmp/x/.theokit/memory/wiki/foo.md\n // Strip the root + \"/\" prefix to get \"wiki/foo.md\".\n if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);\n return absolutePath;\n}\n","import { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\n\nimport { sanitizeFts5Query } from \"../persistence/fts5-sanitize.js\";\nimport { chunkMarkdown } from \"./chunk-markdown.js\";\nimport type { EmbeddingRuntime } from \"./embedding-adapter.js\";\nimport { defaultIndexPath, type MemoryDb, openMemoryDb } from \"./index-db.js\";\nimport { assertValidBackend, openLanceIndex } from \"./index-manager-dispatch.js\";\nimport { memoryDir, memoryMdPath, notesDir } from \"./markdown-store.js\";\nimport { type MemoryIndex, parseSearchOptions } from \"./memory-index.js\";\nimport { discoverSessionFiles } from \"./session-loader.js\";\nimport { loadSqliteVecExtension } from \"./sqlite-vec-loader.js\";\nimport {\n createVectorIndex,\n dropVectorIndex,\n embedMissingChunks,\n identityMatches,\n readEmbeddingIdentity,\n vectorSearch,\n writeEmbeddingIdentity,\n} from \"./vec-index.js\";\nimport { discoverWikiFiles } from \"./wiki-loader.js\";\n\n/**\n * Memory index manager (ADR D2). FTS5-only at Phase 3; vector index lands in\n * Phase 5.\n *\n * Lifecycle:\n * const idx = await IndexManager.open({ cwd });\n * await idx.sync();\n * const hits = await idx.search(\"query\");\n * idx.close();\n *\n * @internal\n */\n\nexport interface MemorySearchHit {\n /** Path relative to the memory root. */\n path: string;\n startLine: number;\n endLine: number;\n /** Combined score (hybrid when vector backend active, else just textScore). */\n score: number;\n /** FTS5 BM25 score normalized to 0..1 (higher = better). */\n textScore: number;\n /** sqlite-vec distance normalized to 0..1 (higher = better). Omitted when vector backend disabled. */\n vectorScore?: number;\n snippet: string;\n source: \"memory\" | \"sessions\" | \"wiki\";\n /** path:startLine-endLine for citations. */\n citation: string;\n}\n\nexport interface IndexStatus {\n backend: \"fts-only\" | \"hybrid\";\n filesIndexed: number;\n chunksIndexed: number;\n lastSyncMs?: number;\n}\n\nexport interface SearchOptions {\n maxResults?: number;\n minScore?: number;\n sources?: ReadonlyArray<\"memory\" | \"sessions\" | \"wiki\">;\n /** 0..1 — vector vs text weight in hybrid scoring (D4). Default 0.6. */\n vectorWeight?: number;\n /** 0..1 — text weight in hybrid scoring. Default 0.4. */\n textWeight?: number;\n}\n\n/** Vector backend selector. SQLite default; Lance opt-in (ADR D43). */\nexport type MemoryBackend = \"sqlite-vec\" | \"lance\";\n\nexport interface OpenIndexOptions {\n cwd: string;\n filePath?: string;\n /** When provided, vector index is enabled in hybrid mode. */\n embedding?: EmbeddingRuntime;\n /** Vector backend. Default and only value today: `\"sqlite-vec\"`. */\n backend?: MemoryBackend;\n}\n\nexport class IndexManager implements MemoryIndex {\n private lastSyncMs: number | undefined;\n private vectorReady = false;\n\n private constructor(\n private readonly cwd: string,\n private readonly db: MemoryDb,\n private readonly embedding: EmbeddingRuntime | undefined,\n ) {}\n\n /**\n * Open a memory index. Dispatches to SQLite (default) or Lance (opt-in\n * via `backend: \"lance\"`). See `openLanceInternal` for Lance-specific\n * preconditions + typed errors.\n */\n static async open(opts: OpenIndexOptions & { backend: \"lance\" }): Promise<MemoryIndex>;\n static async open(\n opts: Omit<OpenIndexOptions, \"backend\"> | (OpenIndexOptions & { backend?: \"sqlite-vec\" }),\n ): Promise<IndexManager>;\n static async open(opts: OpenIndexOptions): Promise<MemoryIndex> {\n const backend = opts.backend ?? \"sqlite-vec\";\n assertValidBackend(backend);\n if (backend === \"lance\") return await openLanceIndex(opts);\n return await IndexManager.openSqliteInternal(opts);\n }\n\n /** Internal SQLite-path open. Renamed from previous public `open`. */\n private static async openSqliteInternal(opts: OpenIndexOptions): Promise<IndexManager> {\n const filePath = opts.filePath ?? defaultIndexPath(opts.cwd);\n const db = await openMemoryDb({ filePath });\n const manager = new IndexManager(opts.cwd, db, opts.embedding);\n if (opts.embedding !== undefined) await manager.initVectorBackend(opts.embedding);\n return manager;\n }\n\n private async initVectorBackend(runtime: EmbeddingRuntime): Promise<void> {\n await loadSqliteVecExtension(this.db);\n const currentIdentity = {\n providerId: runtime.id,\n model: runtime.model,\n dimension: runtime.dimension,\n };\n const persisted = readEmbeddingIdentity(this.db);\n if (persisted !== undefined && !identityMatches(persisted, currentIdentity)) {\n // EC-1: dimension/model/provider changed — drop the vector index and\n // force a full re-embed on next sync.\n dropVectorIndex(this.db);\n }\n createVectorIndex(this.db, runtime.dimension);\n writeEmbeddingIdentity(this.db, currentIdentity);\n this.vectorReady = true;\n }\n\n /** Walk the memory corpus + (re)index changed files. */\n async sync(): Promise<{\n filesScanned: number;\n filesUpdated: number;\n chunksWritten: number;\n chunksEmbedded: number;\n }> {\n const files = await collectMarkdownFiles(this.cwd);\n let filesUpdated = 0;\n let chunksWritten = 0;\n const existingByPath = this.loadFilesIndex();\n for (const entry of files) {\n const raw = await readFile(entry.absolutePath, \"utf8\");\n const hash = sha256(raw);\n const existing = existingByPath.get(entry.absolutePath);\n if (existing !== undefined && existing.hash === hash) continue;\n const stats = await stat(entry.absolutePath);\n const fileId = this.upsertFile(\n entry.absolutePath,\n entry.relPath,\n hash,\n stats.mtimeMs,\n entry.source,\n );\n this.deleteChunksForFile(fileId);\n const chunks = chunkMarkdown(raw);\n for (const chunk of chunks) {\n this.insertChunk(fileId, chunk.startLine, chunk.endLine, chunk.text, chunk.hash);\n }\n filesUpdated += 1;\n chunksWritten += chunks.length;\n }\n let chunksEmbedded = 0;\n if (this.vectorReady && this.embedding !== undefined) {\n chunksEmbedded = await embedMissingChunks({ db: this.db, runtime: this.embedding });\n }\n this.lastSyncMs = Date.now();\n return { filesScanned: files.length, filesUpdated, chunksWritten, chunksEmbedded };\n }\n\n async search(query: string, options: SearchOptions = {}): Promise<MemorySearchHit[]> {\n if (query.trim().length === 0) return [];\n const { maxResults, minScore } = parseSearchOptions(options);\n const textHits = this.ftsSearch(query, maxResults * 2);\n const vectorHitsById = await this.vectorSearchById(query, maxResults * 2);\n const combined = this.combineHybridScores(textHits, vectorHitsById, options);\n return combined\n .filter((h) => h.score >= minScore)\n .filter((h) => options.sources === undefined || options.sources.includes(h.source))\n .slice(0, maxResults);\n }\n\n status(): IndexStatus {\n const files = this.db.prepare(\"SELECT COUNT(*) as n FROM files\").get() ?? { n: 0 };\n const chunks = this.db.prepare(\"SELECT COUNT(*) as n FROM chunks\").get() ?? { n: 0 };\n const status: IndexStatus = {\n backend: this.vectorReady ? \"hybrid\" : \"fts-only\",\n filesIndexed: Number(files.n ?? 0),\n chunksIndexed: Number(chunks.n ?? 0),\n };\n if (this.lastSyncMs !== undefined) status.lastSyncMs = this.lastSyncMs;\n return status;\n }\n\n // ───── search internals ──────────────────────────────────────────────\n\n private ftsSearch(query: string, limit: number): Array<MemorySearchHit & { chunkId: number }> {\n // EC-3: short-circuit when sanitizer reduces input to empty string.\n // Calling `MATCH ''` would error inside FTS5 on some SQLite versions.\n const sanitized = sanitizeFts5Query(query);\n if (sanitized.length === 0) return [];\n const stmt = this.db.prepare(\n `SELECT chunks.id as id, files.rel_path as rel_path, files.source as source,\n chunks.start_line as start_line, chunks.end_line as end_line,\n chunks.text as text, bm25(chunks_fts) as bm25_score\n FROM chunks_fts\n JOIN chunks ON chunks_fts.rowid = chunks.id\n JOIN files ON chunks.file_id = files.id\n WHERE chunks_fts MATCH ?\n ORDER BY bm25_score\n LIMIT ?`,\n );\n let rows: Array<Record<string, unknown>> = [];\n try {\n rows = stmt.all(sanitized, limit);\n } catch {\n return [];\n }\n return rows.map((row) => {\n const bm25 = Number(row.bm25_score ?? 0);\n const textScore = bm25 < 0 ? 1 / (1 + Math.abs(bm25)) : 1 / (1 + bm25);\n const startLine = Number(row.start_line ?? 0);\n const endLine = Number(row.end_line ?? 0);\n const path = String(row.rel_path);\n return {\n path,\n startLine,\n endLine,\n score: textScore,\n textScore,\n snippet: truncateSnippet(String(row.text ?? \"\")),\n source: String(row.source) as \"memory\" | \"sessions\" | \"wiki\",\n citation: `${path}:${startLine}-${endLine}`,\n // sneak the chunk id through for the hybrid join below\n // (cast away later)\n chunkId: Number(row.id),\n } as MemorySearchHit & { chunkId: number };\n });\n }\n\n private async vectorSearchById(\n query: string,\n limit: number,\n ): Promise<Map<number, { vectorScore: number; snippet?: string }>> {\n if (!this.vectorReady || this.embedding === undefined) return new Map();\n const [queryVec] = await this.embedding.embed([query]);\n if (queryVec === undefined) return new Map();\n const rows = vectorSearch(this.db, queryVec, limit);\n // sqlite-vec distance: lower = closer. Normalize to 0..1 with higher = better.\n const out = new Map<number, { vectorScore: number }>();\n for (const row of rows) {\n const score = 1 / (1 + Math.max(0, row.distance));\n out.set(row.chunk_id, { vectorScore: score });\n }\n return out;\n }\n\n private combineHybridScores(\n textHits: Array<MemorySearchHit & { chunkId: number }>,\n vectorHitsById: Map<number, { vectorScore: number }>,\n options: SearchOptions,\n ): MemorySearchHit[] {\n const weights = resolveWeights(options);\n const merged = this.mergeHits(textHits, vectorHitsById);\n const combined = [...merged.values()].map((hit) =>\n blendScores(hit, vectorHitsById.get(hit.chunkId)?.vectorScore ?? 0, weights),\n );\n return combined.sort((a, b) => b.score - a.score);\n }\n\n private mergeHits(\n textHits: Array<MemorySearchHit & { chunkId: number }>,\n vectorHitsById: Map<number, { vectorScore: number }>,\n ): Map<number, MemorySearchHit & { chunkId: number }> {\n const merged = new Map<number, MemorySearchHit & { chunkId: number }>();\n for (const hit of textHits) merged.set(hit.chunkId, hit);\n const missingIds = [...vectorHitsById.keys()].filter((id) => !merged.has(id));\n if (missingIds.length > 0) {\n for (const hit of this.fetchChunksByIds(missingIds)) {\n merged.set(hit.chunkId, { ...hit, score: 0, textScore: 0 });\n }\n }\n return merged;\n }\n\n private fetchChunksByIds(\n ids: ReadonlyArray<number>,\n ): Array<MemorySearchHit & { chunkId: number }> {\n if (ids.length === 0) return [];\n const placeholders = ids.map(() => \"?\").join(\",\");\n const rows = this.db\n .prepare(\n `SELECT chunks.id as id, files.rel_path as rel_path, files.source as source,\n chunks.start_line as start_line, chunks.end_line as end_line,\n chunks.text as text\n FROM chunks JOIN files ON chunks.file_id = files.id\n WHERE chunks.id IN (${placeholders})`,\n )\n .all(...ids);\n return rows.map((row) => {\n const startLine = Number(row.start_line ?? 0);\n const endLine = Number(row.end_line ?? 0);\n const path = String(row.rel_path);\n return {\n chunkId: Number(row.id),\n path,\n startLine,\n endLine,\n score: 0,\n textScore: 0,\n snippet: truncateSnippet(String(row.text ?? \"\")),\n source: String(row.source) as \"memory\" | \"sessions\" | \"wiki\",\n citation: `${path}:${startLine}-${endLine}`,\n };\n });\n }\n\n // ───── persistence helpers ─────────────────────────────────────────\n\n private loadFilesIndex(): Map<string, { id: number; hash: string }> {\n const rows = this.db.prepare(\"SELECT id, path, hash FROM files\").all() as Array<{\n id: number;\n path: string;\n hash: string;\n }>;\n return new Map(rows.map((row) => [row.path, { id: row.id, hash: row.hash }]));\n }\n\n private upsertFile(\n absPath: string,\n relPath: string,\n hash: string,\n mtimeMs: number,\n source: \"memory\" | \"wiki\" | \"sessions\" = \"memory\",\n ): number {\n const stmt = this.db.prepare(\n `INSERT INTO files (path, rel_path, mtime, hash, source) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(path) DO UPDATE SET hash = excluded.hash, mtime = excluded.mtime, source = excluded.source\n RETURNING id`,\n );\n const row = stmt.get(absPath, relPath, Math.floor(mtimeMs), hash, source) as { id: number };\n return row.id;\n }\n\n private deleteChunksForFile(fileId: number): void {\n this.db.prepare(\"DELETE FROM chunks WHERE file_id = ?\").run(fileId);\n }\n\n private insertChunk(\n fileId: number,\n startLine: number,\n endLine: number,\n text: string,\n hash: string,\n ): void {\n this.db\n .prepare(\n \"INSERT INTO chunks (file_id, start_line, end_line, text, hash) VALUES (?, ?, ?, ?, ?)\",\n )\n .run(fileId, startLine, endLine, text, hash);\n }\n\n close(): void {\n this.db.close();\n }\n}\n\n// ───── module-level helpers (hybrid scoring) ─────────────────────────────\n\ninterface HybridWeights {\n vectorWeight: number;\n textWeight: number;\n total: number;\n}\n\nfunction resolveWeights(options: SearchOptions): HybridWeights {\n const vectorWeight = options.vectorWeight ?? 0.6;\n const textWeight = options.textWeight ?? 0.4;\n const total = vectorWeight + textWeight || 1;\n return { vectorWeight, textWeight, total };\n}\n\nfunction blendScores(\n hit: MemorySearchHit & { chunkId: number },\n vectorScore: number,\n weights: HybridWeights,\n): MemorySearchHit {\n const score =\n (vectorScore * weights.vectorWeight + hit.textScore * weights.textWeight) / weights.total;\n return {\n path: hit.path,\n startLine: hit.startLine,\n endLine: hit.endLine,\n score,\n textScore: hit.textScore,\n snippet: hit.snippet,\n source: hit.source,\n citation: hit.citation,\n ...(vectorScore > 0 ? { vectorScore } : {}),\n };\n}\n\ninterface DiscoveredFile {\n absolutePath: string;\n relPath: string;\n source: \"memory\" | \"wiki\" | \"sessions\";\n}\n\nasync function collectMarkdownFiles(cwd: string): Promise<DiscoveredFile[]> {\n const root = memoryDir(cwd);\n const results: DiscoveredFile[] = [];\n // MEMORY.md\n try {\n await stat(memoryMdPath(cwd));\n results.push({\n absolutePath: memoryMdPath(cwd),\n relPath: relative(root, memoryMdPath(cwd)),\n source: \"memory\",\n });\n } catch {\n // skip\n }\n // notes/*.md\n try {\n const entries = await readdir(notesDir(cwd));\n for (const entry of entries) {\n if (!entry.endsWith(\".md\")) continue;\n const abs = join(notesDir(cwd), entry);\n results.push({ absolutePath: abs, relPath: relative(root, abs), source: \"memory\" });\n }\n } catch {\n // notes dir doesn't exist yet — that's fine\n }\n // wiki/*.md (Phase 10 — read-only supplements)\n const wikiFiles = await discoverWikiFiles(cwd);\n for (const wiki of wikiFiles) {\n results.push({\n absolutePath: wiki.absolutePath,\n relPath: wiki.relPath,\n source: \"wiki\",\n });\n }\n // sessions/*.md (ADR D20 — per-run summaries for corpus=\"sessions\" recall)\n const sessionFiles = await discoverSessionFiles(cwd);\n for (const session of sessionFiles) {\n results.push({\n absolutePath: session.absolutePath,\n relPath: session.relPath,\n source: \"sessions\",\n });\n }\n return results;\n}\n\nfunction sha256(text: string): string {\n return createHash(\"sha256\").update(text).digest(\"hex\");\n}\n\nfunction truncateSnippet(text: string): string {\n const max = 500;\n return text.length <= max ? text : `${text.slice(0, max)}…`;\n}\n\n// Replaced by `sanitizeFts5Query` from `internal/persistence/fts5-sanitize.ts`\n// (T5.2, ADR D64). The new sanitizer is the 6-step port of Hermes'\n// `_sanitize_fts5_query` and handles hyphens/dots/underscores correctly\n// without quoting every token.\n","import { resolve as resolvePath } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { MemorySearchHit } from \"./index-manager.js\";\nimport { memoryDir } from \"./markdown-store.js\";\nimport type { MemoryIndex } from \"./memory-index.js\";\nimport { readMemoryFileBounded } from \"./reader.js\";\n\n/**\n * Memory tools (`memory_search` + `memory_get`) — ADR D5 of\n * memory-system-openclaw-parity. Tool schemas mirror OpenClaw\n * (`referencia/openclaw/extensions/memory-core/src/tools.ts:228-475`).\n *\n * Each tool is exposed as a `MemoryTool` (name + description + JSON schema +\n * async execute). The agent-loop integration wires them via the existing\n * `ResolvedTool` interface in `tool-dispatch.ts`.\n *\n * @internal\n */\n\nexport interface MemoryToolJson {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MemoryTool extends MemoryToolJson {\n execute(input: Record<string, unknown>): Promise<string>;\n}\n\nconst SEARCH_DESCRIPTION =\n \"Mandatory recall step: semantically search MEMORY.md + memory/notes/*.md (and optional wiki supplements) before answering questions about prior work, decisions, dates, people, preferences, or todos. `corpus=memory` (default) restricts to indexed memory files; `corpus=wiki` restricts to read-only wiki supplements; `corpus=all` returns both. Returns ranked `{ path, startLine, endLine, score, snippet, citation }` hits.\";\n\nconst GET_DESCRIPTION =\n \"Safe exact excerpt read from MEMORY.md or memory/notes/*.md. Defaults to a bounded excerpt (200 lines). Returns `{ path, from, linesReturned, totalLines, truncated, remainingLines, text }`. Paths are resolved against the memory root — attempts to read outside `.theokit/memory/` are rejected.\";\n\nconst MEMORY_SEARCH_SCHEMA: Record<string, unknown> = {\n type: \"object\",\n required: [\"query\"],\n properties: {\n query: { type: \"string\", description: \"Natural-language query.\" },\n maxResults: { type: \"integer\", minimum: 1, maximum: 50 },\n minScore: { type: \"number\", minimum: 0, maximum: 1 },\n corpus: { type: \"string\", enum: [\"memory\", \"sessions\", \"wiki\", \"all\"] },\n },\n additionalProperties: false,\n};\n\nconst MEMORY_GET_SCHEMA: Record<string, unknown> = {\n type: \"object\",\n required: [\"path\"],\n properties: {\n path: { type: \"string\", description: \"Path relative to .theokit/memory/\" },\n from: { type: \"integer\", minimum: 1 },\n lines: { type: \"integer\", minimum: 1, maximum: 2000 },\n },\n additionalProperties: false,\n};\n\nconst DEFAULT_MAX_TOTAL_CHARS = 16384;\n\nexport interface MemorySearchToolOptions {\n index: MemoryIndex;\n /** Cap on the JSON response size (EC-10 of edge-case review). Default 16384. */\n maxTotalChars?: number;\n}\n\nexport function createMemorySearchTool(opts: MemorySearchToolOptions): MemoryTool {\n const cap = opts.maxTotalChars ?? DEFAULT_MAX_TOTAL_CHARS;\n return {\n name: \"memory_search\",\n description: SEARCH_DESCRIPTION,\n inputSchema: MEMORY_SEARCH_SCHEMA,\n async execute(input: Record<string, unknown>): Promise<string> {\n const query = readString(input.query, \"query is required\");\n const maxResults = readNumber(input.maxResults) ?? 10;\n const minScore = readNumber(input.minScore);\n const corpus = readString(input.corpus, undefined, true);\n const sources = mapCorpusToSources(corpus);\n const searchOptions = {\n maxResults,\n ...(minScore !== undefined ? { minScore } : {}),\n ...(sources !== undefined ? { sources } : {}),\n };\n const hits = await opts.index.search(query, searchOptions);\n return JSON.stringify(capByTotalChars(hits, cap));\n },\n };\n}\n\nexport interface MemoryGetToolOptions {\n cwd: string;\n}\n\nexport function createMemoryGetTool(opts: MemoryGetToolOptions): MemoryTool {\n const memoryRoot = resolvePath(memoryDir(opts.cwd));\n return {\n name: \"memory_get\",\n description: GET_DESCRIPTION,\n inputSchema: MEMORY_GET_SCHEMA,\n async execute(input: Record<string, unknown>): Promise<string> {\n const relPath = readString(input.path, \"path is required\");\n const from = readNumber(input.from);\n const lines = readNumber(input.lines);\n // EC-2: enforce that the resolved path stays inside the memory root.\n const resolved = resolvePath(memoryRoot, relPath);\n if (!isPathInside(memoryRoot, resolved)) {\n throw new ConfigurationError(\n `memory_get rejected path that escapes memory root: ${relPath}`,\n { code: \"memory_path_escapes_root\" },\n );\n }\n const readArgs: { cwd: string; relPath: string; from?: number; lines?: number } = {\n cwd: memoryRoot,\n relPath,\n };\n if (from !== undefined) readArgs.from = from;\n if (lines !== undefined) readArgs.lines = lines;\n const result = await readMemoryFileBounded(readArgs);\n return JSON.stringify(result);\n },\n };\n}\n\n// ───── helpers ──────────────────────────────────────────────────────────\n\nfunction readString(value: unknown, errorIfMissing?: string, allowUndefined = false): string {\n if (typeof value === \"string\") return value;\n if (allowUndefined && (value === undefined || value === null)) return \"\";\n if (errorIfMissing !== undefined) {\n throw new ConfigurationError(errorIfMissing, { code: \"memory_tool_bad_args\" });\n }\n return \"\";\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim().length > 0) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n return undefined;\n}\n\nfunction mapCorpusToSources(\n corpus: string,\n): ReadonlyArray<\"memory\" | \"sessions\" | \"wiki\"> | undefined {\n if (corpus === \"\" || corpus === \"all\") return undefined;\n if (corpus === \"memory\") return [\"memory\"];\n if (corpus === \"wiki\") return [\"wiki\"];\n if (corpus === \"sessions\") return [\"sessions\"];\n return undefined;\n}\n\nfunction capByTotalChars(\n hits: ReadonlyArray<MemorySearchHit>,\n maxTotalChars: number,\n): { hits: MemorySearchHit[]; truncated: boolean } {\n if (hits.length === 0) return { hits: [], truncated: false };\n const kept: MemorySearchHit[] = [];\n let runningChars = 0;\n for (const hit of hits) {\n const snippetLen = hit.snippet.length + (hit.citation?.length ?? 0) + 32; // overhead estimate\n if (kept.length > 0 && runningChars + snippetLen > maxTotalChars) {\n return { hits: kept, truncated: true };\n }\n kept.push(hit);\n runningChars += snippetLen;\n }\n return { hits: kept, truncated: false };\n}\n\nfunction isPathInside(root: string, candidate: string): boolean {\n const normalizedRoot = root.endsWith(\"/\") ? root : `${root}/`;\n return candidate === root || candidate.startsWith(normalizedRoot);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\n\nimport type { MemoryReadResult } from \"./types.js\";\n\n/**\n * Bounded read with truncation info (ADR D5 — `memory_get` foundation).\n *\n * Mirrors OpenClaw's `buildMemoryReadResult` semantics:\n * - `from` is 1-indexed.\n * - `lines` defaults to 200 (`DEFAULT_MEMORY_READ_LINES`).\n * - Returns up to EOF when the requested slice extends past file end.\n * - Sets `truncated: true` when fewer lines were returned than requested AND\n * there's still content past the slice. (At EOF, `truncated: false`.)\n *\n * @internal\n */\n\nexport const DEFAULT_MEMORY_READ_LINES = 200;\n\nexport interface ReadFileOptions {\n cwd: string;\n relPath: string;\n from?: number;\n lines?: number;\n}\n\nexport async function readMemoryFileBounded(opts: ReadFileOptions): Promise<MemoryReadResult> {\n const absolutePath = resolvePath(opts.cwd, opts.relPath);\n const raw = await readFile(absolutePath, \"utf8\");\n const allLines = raw.split(\"\\n\");\n // Strip a trailing empty line caused by a final \\n so totalLines reflects\n // the editor-visible line count, not the byte-level split.\n const trimmedLines =\n allLines.length > 0 && allLines[allLines.length - 1] === \"\" ? allLines.slice(0, -1) : allLines;\n const totalLines = trimmedLines.length;\n\n const requestedFrom = Math.max(1, opts.from ?? 1);\n const requestedLines = Math.max(1, opts.lines ?? DEFAULT_MEMORY_READ_LINES);\n const startIdx = requestedFrom - 1;\n const endIdx = Math.min(totalLines, startIdx + requestedLines);\n const slice = trimmedLines.slice(startIdx, endIdx);\n const linesReturned = slice.length;\n const remainingLines = Math.max(0, totalLines - endIdx);\n // truncated = \"more content exists past the returned slice\"\n const truncated = remainingLines > 0;\n\n return {\n path: opts.relPath,\n from: requestedFrom,\n linesReturned,\n totalLines,\n truncated,\n remainingLines,\n text: slice.join(\"\\n\"),\n };\n}\n","import type { AgentOptions } from \"../../types/agent.js\";\nimport type { MemoryToolSpec } from \"../agent-loop/loop-types.js\";\nimport { runActiveMemory } from \"../memory/active-memory.js\";\nimport { ActiveMemoryCache } from \"../memory/active-memory-cache.js\";\nimport { MEMORY_EMBEDDING_ADAPTERS } from \"../memory/adapters/catalog.js\";\nimport { CircuitBreaker } from \"../memory/circuit-breaker.js\";\nimport type { EmbeddingRuntime } from \"../memory/embedding-adapter.js\";\nimport { IndexManager } from \"../memory/index-manager.js\";\nimport type { MemoryIndex } from \"../memory/memory-index.js\";\nimport { createMemoryGetTool, createMemorySearchTool } from \"../memory/tools.js\";\n\n/**\n * Per-agent memory glue. Owns the lazy `IndexManager`, the memory tools\n * cache, and the Active Memory circuit breaker + summary cache. Pulled out\n * of `LocalAgent` to keep that file under the G8 LoC cap.\n *\n * @internal\n */\nexport class LocalAgentMemory {\n private index: MemoryIndex | undefined;\n private toolsCache: ReadonlyArray<MemoryToolSpec> | undefined;\n private breaker: CircuitBreaker | undefined;\n private cache: ActiveMemoryCache | undefined;\n\n constructor(\n private readonly options: AgentOptions,\n private readonly workspaceCwd: string,\n private readonly agentId: string,\n ) {}\n\n async ensureTools(): Promise<ReadonlyArray<MemoryToolSpec> | undefined> {\n const cfg = this.options.memory?.index;\n if (cfg?.tools === false) return undefined;\n if (this.options.memory?.enabled !== true) return undefined;\n if (this.toolsCache !== undefined) return this.toolsCache;\n try {\n const embedding = await this.maybeCreateEmbeddingRuntime();\n const openOpts: {\n cwd: string;\n embedding?: EmbeddingRuntime;\n backend?: \"sqlite-vec\" | \"lance\";\n } = { cwd: this.workspaceCwd };\n if (embedding !== undefined) openOpts.embedding = embedding;\n if (cfg?.backend !== undefined) openOpts.backend = cfg.backend;\n this.index = await IndexManager.open(openOpts);\n await this.index.sync();\n this.toolsCache = [\n createMemorySearchTool({ index: this.index }),\n createMemoryGetTool({ cwd: this.workspaceCwd }),\n ];\n return this.toolsCache;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] memory tools unavailable: ${message}\\n`);\n return undefined;\n }\n }\n\n async runActiveMemoryIfEnabled(\n userText: string,\n priorMessages: ReadonlyArray<{ role: \"user\" | \"assistant\"; text: string }>,\n ): Promise<string | undefined> {\n const cfg = this.options.memory?.activeRecall;\n if (cfg?.enabled !== true || this.index === undefined) return undefined;\n if (this.breaker === undefined) this.breaker = new CircuitBreaker();\n if (this.cache === undefined) this.cache = new ActiveMemoryCache();\n const result = await runActiveMemory({\n userText,\n priorMessages,\n index: this.index,\n options: {\n enabled: true,\n ...(cfg.queryMode !== undefined ? { queryMode: cfg.queryMode } : {}),\n ...(cfg.timeoutMs !== undefined ? { timeoutMs: cfg.timeoutMs } : {}),\n ...(cfg.maxSummaryChars !== undefined ? { maxSummaryChars: cfg.maxSummaryChars } : {}),\n },\n breaker: this.breaker,\n cache: this.cache,\n agentKey: this.agentId,\n cwd: this.workspaceCwd,\n ...(cfg.persistTranscripts === true ? { persistTranscripts: true } : {}),\n runId: `${this.agentId}-${Date.now()}`,\n });\n return result.summary;\n }\n\n /**\n * Trigger a background `IndexManager.sync()` so a freshly written session\n * summary (ADR D20) is recallable via `memory_search({ corpus: \"sessions\" })`\n * on the next call. Fire-and-forget at the call site; failures degrade to\n * \"summary indexed on next regular sync\" with a stderr warning.\n *\n * @internal\n */\n async syncIfReady(): Promise<void> {\n if (this.index === undefined) return;\n try {\n await this.index.sync();\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(`[theokit-sdk] session index sync failed: ${message}\\n`);\n }\n }\n\n private async maybeCreateEmbeddingRuntime(): Promise<EmbeddingRuntime | undefined> {\n const cfg = this.options.memory?.index?.embedding;\n if (cfg === undefined) return undefined;\n const adapter = MEMORY_EMBEDDING_ADAPTERS[cfg.provider];\n if (adapter === undefined) return undefined;\n try {\n return await adapter.create(cfg.model !== undefined ? { model: cfg.model } : {});\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] memory embedding ${cfg.provider} unavailable: ${message}\\n`,\n );\n return undefined;\n }\n }\n}\n","/**\n * `agent.memory` direct API implementation (T2.2, ADR D141 / D142).\n *\n * Builds an `AgentMemory` impl over whichever third-party adapters\n * the `PluginManager` aggregated. Lazy-resolves the adapter list on\n * first access (EC-I: `initialize()` fires exactly once on first\n * write/recall). Multi-adapter fan-out for writes; merge + dedupe by\n * content for recalls.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type {\n AgentMemory,\n MemoryAdapter,\n MemoryContext,\n MemoryFact,\n MemoryId,\n MemoryTurnMessage,\n} from \"../../types/memory-adapter.js\";\nimport type { PluginManager } from \"../plugins/manager.js\";\n\ninterface ResolvedAdapters {\n adapters: ReadonlyArray<MemoryAdapter>;\n initialized: boolean;\n}\n\n/**\n * Build a lazy `AgentMemory` accessor over the plugin-aggregated\n * memory adapters. Returns `null` when no `kind: \"memory\"` plugin\n * is registered — callers branch on `adapter() === null`.\n *\n * @internal\n */\nexport function buildAgentMemory(\n pluginManager: PluginManager,\n workspaceCwd: string,\n defaultContext: MemoryContext | undefined,\n): AgentMemory {\n let resolved: ResolvedAdapters | undefined;\n\n async function ensure(): Promise<ResolvedAdapters> {\n if (resolved !== undefined) return resolved;\n const entries = pluginManager.aggregated.memoryProviders;\n const created: MemoryAdapter[] = [];\n for (const entry of entries) {\n const instance = await entry.createProvider(workspaceCwd);\n created.push(instance);\n }\n // EC-I: initialize() each adapter exactly once on first access.\n for (const adapter of created) {\n if (adapter.initialize !== undefined) {\n await adapter.initialize();\n }\n }\n resolved = { adapters: created, initialized: true };\n return resolved;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 6 optional fields × per-field caller-wins-over-default merge is a flat ladder; extracting helpers fragments the EC-P invariant.\n function mergeContext(partial: Partial<MemoryContext> | undefined): MemoryContext {\n // EC-P: caller's ctx.userId always wins over agent default.\n const merged: MemoryContext = {\n userId: partial?.userId ?? defaultContext?.userId ?? \"\",\n ...(partial?.agentId !== undefined\n ? { agentId: partial.agentId }\n : defaultContext?.agentId !== undefined\n ? { agentId: defaultContext.agentId }\n : {}),\n ...(partial?.sessionId !== undefined\n ? { sessionId: partial.sessionId }\n : defaultContext?.sessionId !== undefined\n ? { sessionId: defaultContext.sessionId }\n : {}),\n ...(partial?.tenantId !== undefined\n ? { tenantId: partial.tenantId }\n : defaultContext?.tenantId !== undefined\n ? { tenantId: defaultContext.tenantId }\n : {}),\n ...(partial?.tags !== undefined\n ? { tags: partial.tags }\n : defaultContext?.tags !== undefined\n ? { tags: defaultContext.tags }\n : {}),\n ...(partial?.metadata !== undefined\n ? { metadata: partial.metadata }\n : defaultContext?.metadata !== undefined\n ? { metadata: defaultContext.metadata }\n : {}),\n };\n if (merged.userId === \"\") {\n throw new ConfigurationError(\n \"agent.memory requires a userId — either set AgentOptions.memoryContext.userId or pass ctx.userId at call time.\",\n { code: \"memory_context_missing_user_id\" },\n );\n }\n return merged;\n }\n\n async function requireAdapters(): Promise<ReadonlyArray<MemoryAdapter>> {\n const r = await ensure();\n if (r.adapters.length === 0) {\n throw new ConfigurationError(\n \"No memory adapter registered. Pass a memory plugin in AgentOptions.plugins (e.g. supermemoryMemory({...})).\",\n { code: \"no_memory_adapter\" },\n );\n }\n return r.adapters;\n }\n\n return {\n async write(\n content: string | MemoryTurnMessage[],\n ctx?: Partial<MemoryContext>,\n ): Promise<MemoryId> {\n const adapters = await requireAdapters();\n const merged = mergeContext(ctx);\n // Fan-out: write to all. Return the first id; collect errors per adapter.\n const writes = await Promise.allSettled(adapters.map((a) => a.write(content, merged)));\n const firstFulfilled = writes.find((r) => r.status === \"fulfilled\");\n if (firstFulfilled === undefined) {\n // All adapters failed — surface the first error.\n const firstReason = writes[0] as PromiseRejectedResult;\n throw firstReason.reason;\n }\n return (firstFulfilled as PromiseFulfilledResult<MemoryId>).value;\n },\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: settled-promise iteration + content dedupe + graceful degrade are 3 inline concerns; helpers would obscure the merge invariant.\n async recall(query: string, ctx?: Partial<MemoryContext>, k?: number): Promise<MemoryFact[]> {\n const adapters = await requireAdapters();\n const merged = mergeContext(ctx);\n // Merge + dedupe by content. Per-adapter failures degrade gracefully:\n // the caller still gets results from healthy adapters.\n const recalls = await Promise.allSettled(adapters.map((a) => a.recall(query, merged, k)));\n const out: MemoryFact[] = [];\n const seen = new Set<string>();\n for (const r of recalls) {\n if (r.status !== \"fulfilled\") continue;\n for (const fact of r.value) {\n if (seen.has(fact.content)) continue;\n seen.add(fact.content);\n out.push(fact);\n }\n }\n return out;\n },\n\n async delete(id: MemoryId): Promise<void> {\n const adapters = await requireAdapters();\n // Route by id prefix: the adapter whose id matches the MemoryId prefix.\n const prefix = id.split(\":\", 1)[0] ?? \"\";\n const target = adapters.find((a) => a.id === prefix);\n if (target === undefined) {\n throw new ConfigurationError(\n `No adapter found for MemoryId prefix \"${prefix}\" (registered: ${adapters.map((a) => a.id).join(\", \")}).`,\n { code: \"no_memory_adapter\" },\n );\n }\n await target.delete(id);\n },\n\n adapter(): MemoryAdapter | null {\n // Synchronous — only useful AFTER `ensure()` resolved at least once.\n // Callers that want adapter introspection should `await agent.memory.write/recall`\n // first to trigger initialization.\n if (resolved === undefined) return null;\n return resolved.adapters[0] ?? null;\n },\n };\n}\n","/**\n * Memory hook wiring for `LocalAgent.sendLocked` (T2.1, ADRs D141 / D145).\n *\n * Two helpers extracted to keep `local-agent.ts` under G8 (≤400 LoC):\n * - `applyPreUserSendHook` — fires `pre_user_send`, caps recalled context\n * at `maxRecallContextBytes` (EC-A), injects `<memory-context>` fence.\n * - `wrapRunWithPostReplyHook` — Proxy-wraps the Run so\n * `post_assistant_reply` fires once after `wait()` (fire-and-forget,\n * errors → stderr per EC-O).\n *\n * @internal\n */\n\nimport type { AgentOptions } from \"../../types/agent.js\";\nimport type { Run, SDKUserMessage, SendOptions } from \"../../types/run.js\";\nimport type { PluginManager } from \"../plugins/manager.js\";\n\nconst DEFAULT_MAX_RECALL_BYTES = 16_000;\n\n/**\n * EC-A + EC-G + EC-H: fire `pre_user_send` hooks, cap recalled context,\n * and prepend it as a `<memory-context>` fence around the original\n * user text. Returns the (possibly wrapped) message preserving the\n * `string | SDKUserMessage` shape the caller passed in.\n */\nexport async function applyPreUserSendHook(args: {\n pluginManager: PluginManager;\n agentId: string;\n options: AgentOptions;\n original: string | SDKUserMessage;\n userText: string;\n sendOptions: SendOptions;\n}): Promise<string | SDKUserMessage> {\n const handlers = args.pluginManager.hooksFor(\"pre_user_send\");\n if (handlers.length === 0) return args.original;\n const ctx = {\n prompt: args.userText,\n agentId: args.agentId,\n runId: \"\",\n ...(args.options.memoryContext !== undefined\n ? { memoryContext: args.options.memoryContext }\n : {}),\n ...(args.sendOptions.signal !== undefined ? { signal: args.sendOptions.signal } : {}),\n };\n const cap = args.options.maxRecallContextBytes ?? DEFAULT_MAX_RECALL_BYTES;\n const recalled = await args.pluginManager.runPreUserSendHooks(ctx, cap);\n if (recalled === undefined || recalled.length === 0) return args.original;\n const wrapped = `<memory-context>\\n${recalled}\\n</memory-context>\\n\\n${args.userText}`;\n return typeof args.original === \"string\" ? wrapped : { ...args.original, text: wrapped };\n}\n\n/**\n * Wrap a `Run` so `post_assistant_reply` fires once after `wait()`.\n * Fire-and-forget — errors are surfaced to stderr (EC-O) so the caller\n * never blocks on memory sync. Returns a Proxy preserving all other\n * Run methods (stream, cancel, conversation).\n */\nexport function wrapRunWithPostReplyHook(args: {\n pluginManager: PluginManager;\n agentId: string;\n options: AgentOptions;\n run: Run;\n userText: string;\n}): Run {\n const handlers = args.pluginManager.hooksFor(\"post_assistant_reply\");\n if (handlers.length === 0) return args.run;\n const wrappedWait: Run[\"wait\"] = async () => {\n const result = await args.run.wait();\n const replyText = (result as { result?: string }).result ?? \"\";\n const ctx = {\n prompt: args.userText,\n reply: replyText,\n agentId: args.agentId,\n runId: result.id,\n ...(args.options.memoryContext !== undefined\n ? { memoryContext: args.options.memoryContext }\n : {}),\n };\n // Fire-and-forget; never block the caller.\n void args.pluginManager.runPostAssistantReplyHooks(ctx);\n return result;\n };\n return new Proxy(args.run, {\n get(target, prop, receiver) {\n if (prop === \"wait\") return wrappedWait;\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n","/**\n * Personality-preset runtime extensions for {@link LocalAgent}.\n *\n * Extracted from `local-agent.ts` to keep that file under the 400-LoC\n * guard (G8). The functions here implement the personality-related\n * behaviour declared by ADRs D160-D168:\n *\n * - `resolveActivePersonalityPreset` — read the active preset honoring\n * the fork ALS snapshot (D168 / EC-A).\n * - `ensurePersonalityRegistryIfNeeded` — lazy-load registry when ANY\n * slug is active.\n * - `applyPersonalityOverlay` — overlay preset body on the base prompt.\n * - `localAgentUsePersonality` — the full `Agent.usePersonality` flow:\n * fork-scope no-op, registry lazy-load, then delegate to\n * `performPersonalitySwitch` under the per-agent send mutex (EC-E).\n *\n * @internal\n */\n\nimport { withCwdMutex } from \"../memory/cwd-mutex.js\";\nimport {\n currentPersonalityContext,\n warnPersonalitySwitchInsideFork,\n} from \"../personality/context.js\";\nimport { PersonalityRegistry } from \"../personality/registry.js\";\nimport type { PersonalityStore } from \"../personality/store.js\";\nimport { performPersonalitySwitch } from \"../personality/switch.js\";\nimport type { PersonalityPreset } from \"../personality/types.js\";\nimport { appendSessionMessage, clearSession } from \"./agent-session.js\";\n\n/**\n * Read the active personality preset (if any) for this agent — pure read.\n *\n * Inside a fork (ALS scope active), reads the snapshot slug captured at\n * fork-construction time (EC-A). Outside a fork, reads the agent's own\n * `PersonalityStore`.\n *\n * @internal\n */\nexport function resolveActivePersonalityPreset(args: {\n agentId: string;\n personalityStore: PersonalityStore;\n personalityRegistry: PersonalityRegistry | undefined;\n}): PersonalityPreset | undefined {\n const forkCtx = currentPersonalityContext();\n const slug = forkCtx !== undefined ? forkCtx.slug : args.personalityStore.active(args.agentId);\n if (slug === undefined) return undefined;\n return args.personalityRegistry?.get(slug);\n}\n\n/**\n * Lazy-load `PersonalityRegistry` when ANY personality slug is active —\n * either via the agent's own store or via fork inheritance (ALS).\n * Avoids the 10ms cold-start I/O for agents that never use personalities.\n *\n * Returns the registry (loaded or unchanged) so the caller can assign\n * it back to its private field.\n *\n * @internal\n */\nexport async function ensurePersonalityRegistryIfNeeded(args: {\n agentId: string;\n workspaceCwd: string;\n personalityStore: PersonalityStore;\n personalityRegistry: PersonalityRegistry | undefined;\n}): Promise<PersonalityRegistry | undefined> {\n if (args.personalityRegistry !== undefined) return args.personalityRegistry;\n const forkSlug = currentPersonalityContext()?.slug;\n const ownSlug = args.personalityStore.active(args.agentId);\n if (forkSlug === undefined && ownSlug === undefined) return undefined;\n return await PersonalityRegistry.load(args.workspaceCwd);\n}\n\n/**\n * Overlay the active personality preset's `systemPrompt` body on top of\n * the resolved base prompt (ADR D160). Pure read — never mutates store.\n *\n * @internal\n */\nexport function applyPersonalityOverlay(\n preset: PersonalityPreset | undefined,\n base: string | undefined,\n): string | undefined {\n if (preset === undefined) return base;\n if (base === undefined || base.length === 0) return preset.systemPrompt;\n return `${base}\\n\\n${preset.systemPrompt}`;\n}\n\n/**\n * Full `Agent.usePersonality(...)` implementation extracted from\n * `LocalAgent`. Loads the registry lazily, then delegates to\n * `performPersonalitySwitch` under the per-agent send mutex (EC-E).\n *\n * Returns the resolved preset (or null when cleared). Mutates the\n * `registryRef` callback when the registry was lazy-loaded so the agent\n * can cache it.\n *\n * @internal\n */\nexport async function localAgentUsePersonality(args: {\n agentId: string;\n workspaceCwd: string;\n storageHandle: import(\"../../types/conversation-storage.js\").ConversationStorageAdapter | string;\n disposed: boolean;\n personalityStore: PersonalityStore;\n personalityRegistry: PersonalityRegistry | undefined;\n invalidateCache: (reason: string) => Promise<void>;\n onRegistryLoaded: (reg: PersonalityRegistry) => void;\n name: string;\n opts?: { save?: boolean; reset?: boolean };\n}): Promise<PersonalityPreset | null> {\n if (args.disposed) throw new Error(\"Agent has been disposed\");\n // ADR D168 / EC-A — inside a fork, usePersonality is a no-op.\n if (currentPersonalityContext() !== undefined) {\n warnPersonalitySwitchInsideFork(args.agentId);\n return null;\n }\n let registry = args.personalityRegistry;\n if (registry === undefined) {\n registry = await PersonalityRegistry.load(args.workspaceCwd);\n args.onRegistryLoaded(registry);\n }\n // EC-E: serialize against in-flight `send` via the per-agent send mutex.\n return withCwdMutex(`agent-send:${args.agentId}`, () =>\n performPersonalitySwitch({\n agentId: args.agentId,\n prevSlug: args.personalityStore.active(args.agentId),\n requestedName: args.name,\n registry: registry as PersonalityRegistry,\n store: args.personalityStore,\n invalidateCache: (reason) => args.invalidateCache(reason),\n appendSessionMessage: (msg) => appendSessionMessage(args.agentId, msg, args.storageHandle),\n clearSession: () => clearSession(args.agentId),\n opts: args.opts ?? {},\n }),\n );\n}\n","/**\n * PersonalityRegistry — loads `.theokit/personalities/*.md` from project\n * + user dirs (T1.1, ADRs D161 / D162).\n *\n * Project entries win on slug collision (matches `.theokit/` family\n * convention). Reserved slugs (`none`, `default`, `neutral`) cannot be\n * registered — they map to \"clear active preset\".\n *\n * **EC-C:** name regex enforced lowercase-only by the Zod schema in\n * `types.ts`. Filenames are independent of the frontmatter `name`.\n *\n * **EC-M (documented):** body content is NOT sanitized against\n * prompt-injection — users own their preset content.\n *\n * @internal\n */\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { loadMarkdownEntities } from \"../persistence/markdown-config-loader.js\";\nimport { warnOnce } from \"../runtime/hooks-source.js\";\nimport {\n type PersonalityFrontmatter,\n PersonalityFrontmatterSchema,\n type PersonalityPreset,\n RESERVED_CLEAR_SLUGS,\n} from \"./types.js\";\n\nconst PROJECT_SUBDIR = \".theokit/personalities\";\nconst USER_SUBDIR = \".theokit/personalities\";\n\n/**\n * Reads project + user personality directories and exposes a\n * collision-resolved registry.\n *\n * @internal\n */\nexport class PersonalityRegistry {\n readonly #byName: Map<string, PersonalityPreset>;\n\n private constructor(presets: ReadonlyArray<PersonalityPreset>) {\n this.#byName = new Map();\n for (const p of presets) this.#byName.set(p.name, p);\n }\n\n /**\n * Load project + user dirs. Project entries override user entries on\n * slug collision (`source: \"project\"` wins).\n *\n * @internal\n */\n static async load(cwd: string): Promise<PersonalityRegistry> {\n const projectDir = join(cwd, PROJECT_SUBDIR);\n const userDir = join(homedir(), USER_SUBDIR);\n\n const [userEntities, projectEntities] = await Promise.all([\n loadMarkdownEntities({\n dir: userDir,\n schema: PersonalityFrontmatterSchema,\n pattern: \"flat\",\n errorCodePrefix: \"personality\",\n }),\n loadMarkdownEntities({\n dir: projectDir,\n schema: PersonalityFrontmatterSchema,\n pattern: \"flat\",\n errorCodePrefix: \"personality\",\n }),\n ]);\n\n const byName = new Map<string, PersonalityPreset>();\n // Load user first so project can override.\n for (const e of userEntities) addEntity(byName, e, \"user\");\n for (const e of projectEntities) addEntity(byName, e, \"project\", byName);\n\n return new PersonalityRegistry(\n [...byName.values()].sort((a, b) => a.name.localeCompare(b.name)),\n );\n }\n\n /** All loaded presets, lex-asc by name. */\n all(): ReadonlyArray<PersonalityPreset> {\n return [...this.#byName.values()];\n }\n\n /** Get by slug. Returns undefined for unknown OR reserved slugs. */\n get(name: string): PersonalityPreset | undefined {\n if (PersonalityRegistry.isReservedClearSlug(name)) return undefined;\n return this.#byName.get(name);\n }\n\n /** Reserved slugs map to \"clear active preset\". */\n static isReservedClearSlug(name: string): boolean {\n return (RESERVED_CLEAR_SLUGS as readonly string[]).includes(name);\n }\n}\n\nfunction addEntity(\n byName: Map<string, PersonalityPreset>,\n entity: { slug: string; frontmatter: PersonalityFrontmatter; body: string; source: string },\n origin: \"project\" | \"user\",\n collisionMap?: Map<string, PersonalityPreset>,\n): void {\n const fm = entity.frontmatter;\n if (PersonalityRegistry.isReservedClearSlug(fm.name)) {\n throw new ConfigurationError(\n `Personality name \"${fm.name}\" is reserved (used to clear active preset)`,\n { code: \"personality_reserved_name\" },\n );\n }\n // EC-1 of T1.1: empty body → reject.\n if (entity.body.trim().length === 0) {\n throw new ConfigurationError(\n `Personality \"${fm.name}\" has empty body (system prompt required)`,\n { code: \"personality_empty_body\" },\n );\n }\n // Project wins on collision; emit warning once per slug.\n if (origin === \"project\" && collisionMap?.has(fm.name)) {\n warnOnce(\n `personality-collision-${fm.name}`,\n `[theokit-sdk] personality \"${fm.name}\" overridden by project preset`,\n );\n }\n byName.set(fm.name, {\n name: fm.name,\n description: fm.description,\n tools: fm.tools,\n model: fm.model,\n tags: fm.tags,\n systemPrompt: entity.body,\n source: origin,\n sourcePath: entity.source,\n });\n}\n","/**\n * Personality preset types + Zod frontmatter schema (T1.1, ADR D161).\n *\n * **EC-C:** name regex is **lowercase-only** (NO `/i` flag) to prevent\n * `Coder` vs `coder` becoming distinct registry keys (Map verbatim).\n * Forcing lowercase eliminates the ambiguity at validation time.\n *\n * @internal\n */\n\nimport { z } from \"zod\";\n\n/**\n * Frontmatter schema for `.theokit/personalities/*.md` files.\n *\n * @internal\n */\nexport const PersonalityFrontmatterSchema = z.object({\n // EC-C: lowercase-only — prevents Coder vs coder ambiguity in registry Map keys.\n name: z\n .string()\n .min(1)\n .regex(/^[a-z0-9_-]+$/, \"Personality name must be a lowercase slug (a-z, 0-9, _, -)\"),\n description: z.string().optional(),\n tools: z.array(z.string()).optional(),\n model: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\nexport type PersonalityFrontmatter = z.infer<typeof PersonalityFrontmatterSchema>;\n\n/**\n * Resolved personality preset — frontmatter + body + source provenance.\n * Defined publicly in `types/agent.ts` so the DTS bundle never crosses\n * `internal/`. Re-exported here for ergonomic internal callers.\n *\n * @public\n */\nexport type { PersonalityPreset } from \"../../types/agent.js\";\n\n/** Reserved slugs that map to \"clear active preset\". @internal */\nexport const RESERVED_CLEAR_SLUGS = [\"none\", \"default\", \"neutral\"] as const;\n","/**\n * performPersonalitySwitch — orchestrates the full lifecycle of a\n * personality activation: store mutation, optional history reset,\n * transcript marker injection, and cache invalidation (T5.1, ADR D164).\n *\n * The marker is emitted as a **user role** message because (a) the\n * switch is a directive from the operator (not a model utterance), and\n * (b) LLMs treat user-role lines as instructions that survive history\n * compaction (EC-D from arXiv:2412.00804).\n *\n * Same-slug switches are no-ops: no marker, no cache invalidation, no\n * store write (EC-18).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { PersonalityRegistry } from \"./registry.js\";\nimport type { PersonalityStore } from \"./store.js\";\nimport type { PersonalityPreset } from \"./types.js\";\n\nexport interface PerformPersonalitySwitchArgs {\n agentId: string;\n /** Previous active slug (undefined = no active preset). */\n prevSlug: string | undefined;\n /** Next active slug or reserved clear alias (none / default / neutral). */\n requestedName: string;\n registry: PersonalityRegistry;\n store: PersonalityStore;\n invalidateCache: (reason: string) => Promise<void>;\n appendSessionMessage: (msg: { role: \"user\" | \"assistant\"; text: string }) => void;\n clearSession?: () => void;\n opts: { save?: boolean; reset?: boolean };\n}\n\n/**\n * Run the full personality-switch lifecycle. Returns the new preset\n * (or null when cleared). Throws `ConfigurationError` on unknown name.\n *\n * @internal\n */\nexport async function performPersonalitySwitch(\n args: PerformPersonalitySwitchArgs,\n): Promise<PersonalityPreset | null> {\n const reserved = PersonalityRegistry.isReservedClearSlug(args.requestedName);\n let nextSlug: string | undefined;\n let resolved: PersonalityPreset | null;\n\n if (reserved) {\n nextSlug = undefined;\n resolved = null;\n } else {\n const preset = args.registry.get(args.requestedName);\n if (preset === undefined) {\n const available =\n args.registry\n .all()\n .map((p) => p.name)\n .join(\", \") || \"(none)\";\n throw new ConfigurationError(\n `Personality \"${args.requestedName}\" not found. Available: ${available}`,\n { code: \"personality_not_found\" },\n );\n }\n nextSlug = preset.name;\n resolved = preset;\n }\n\n // EC-18: same slug = no-op.\n if (args.prevSlug === nextSlug) return resolved;\n\n await args.store.setActive(args.agentId, nextSlug, { save: args.opts.save === true });\n\n // EC-19: reset BEFORE marker so marker is first in the new session.\n if (args.opts.reset === true && args.clearSession !== undefined) {\n args.clearSession();\n }\n\n const marker = nextSlug === undefined ? \"[persona cleared]\" : `[persona switched to ${nextSlug}]`;\n args.appendSessionMessage({ role: \"user\", text: marker });\n\n await args.invalidateCache(\"personality-switch\");\n return resolved;\n}\n","/**\n * Background-work runtime extensions for {@link LocalAgent} (T4.2 + T4.3).\n *\n * Extracted from `local-agent.ts` to keep that file under the 400-LoC\n * guard (G8). The two helpers below implement\n * `LocalAgent.runUntil(goal, options)` and `LocalAgent.fork(options)`\n * by lazy-importing the implementation modules and resolving\n * `Agent.create` through the DI registry (see\n * `agent-factory-registry.ts` for the cycle-avoidance rationale).\n *\n * @internal\n */\n\nimport type { AgentOptions, MemorySettings, SDKAgent } from \"../../types/agent.js\";\nimport type { GoalEvent, GoalOptions, GoalResult } from \"../../types/goal-events.js\";\nimport type { JudgeContext, JudgeOptions } from \"../judge/judge-call.js\";\nimport type { ForkOptions, ForkResult } from \"./fork-agent.js\";\nimport { appendMemoryFact, extractMemoryFact, isMemoryWritePrompt } from \"./memory-store.js\";\nimport { safeCall } from \"./system-prompt/safe-call.js\";\n\n/**\n * Drive {@link runUntilImpl} with the registered `Agent.create` so\n * `LocalAgent.runUntil` returns the canonical\n * `AsyncGenerator<GoalEvent, GoalResult, void>` shape (ADR D116).\n *\n * @internal\n */\nexport function localAgentRunUntil(\n agent: SDKAgent,\n goal: string,\n options: GoalOptions | undefined,\n): AsyncGenerator<GoalEvent, GoalResult, void> {\n async function* wrap(): AsyncGenerator<GoalEvent, GoalResult, void> {\n const { runUntilImpl } = await import(\"./run-until.js\");\n const { judgeCallImpl } = await import(\"../judge/judge-call.js\");\n const { getAgentCreate } = await import(\"./agent-factory-registry.js\");\n const create = getAgentCreate();\n const deps = {\n judge: async (ctx: JudgeContext, opts?: JudgeOptions) => judgeCallImpl(ctx, opts, { create }),\n };\n return yield* runUntilImpl(agent, goal, options, deps);\n }\n return wrap();\n}\n\n/**\n * Spawn a forked auxiliary agent (ADR D110). Reads `Agent.create` from\n * the DI registry.\n *\n * @internal\n */\nexport async function localAgentFork(\n parent: { agentId: string; options: AgentOptions; personalitySlugSnapshot: string | undefined },\n options: ForkOptions,\n): Promise<ForkResult> {\n const { forkAgentImpl } = await import(\"./fork-agent.js\");\n const { getAgentCreate } = await import(\"./agent-factory-registry.js\");\n const { withPersonalityContext } = await import(\"../personality/context.js\");\n const create = getAgentCreate();\n // ADR D168 + EC-A — capture the slug ONCE at fork-construction time.\n // Subsequent parent `usePersonality` calls do NOT mutate this snapshot.\n return withPersonalityContext({ slug: parent.personalitySlugSnapshot, isFork: true }, () =>\n forkAgentImpl(parent, options, { create }),\n );\n}\n\n/**\n * Extract a memory fact from a \"Remember:\" user prompt and persist it\n * via `appendMemoryFact`. No-op when memory is disabled, the prompt is\n * not a write directive, or the extracted fact is empty (EC-3/EC-4).\n *\n * Moved here from `LocalAgent` to keep the class file under G8.\n *\n * @internal\n */\nexport async function persistMemoryFactIfWritePrompt(\n workspaceCwd: string,\n memoryConfig: MemorySettings | undefined,\n userText: string,\n): Promise<void> {\n if (memoryConfig?.enabled !== true) return;\n if (!isMemoryWritePrompt(userText)) return;\n const fact = extractMemoryFact(userText);\n if (fact.length === 0) return;\n await safeCall(\n () => appendMemoryFact(workspaceCwd, memoryConfig, { text: fact }),\n undefined,\n \"memory write\",\n );\n}\n","/**\n * T3.2 — register a `Run` from `LocalAgent.send({ task: ... })` as a\n * Task in the observable registry. Extracted from `local-agent.ts`\n * to keep that file under the 400-LoC quality gate (G8).\n *\n * @internal\n */\n\nimport type { Run } from \"../../types/run.js\";\nimport { submit as taskRegistrySubmit } from \"../task/registry.js\";\n\nexport function registerRunAsTask(\n run: Run,\n agentId: string,\n taskOpt: true | { id?: string; meta?: Record<string, unknown> },\n userText: string,\n): void {\n const opts = taskOpt === true ? {} : taskOpt;\n const meta: Record<string, unknown> = {\n agentId,\n runId: run.id,\n promptPreview: userText.slice(0, 120),\n ...(opts.meta ?? {}),\n };\n void taskRegistrySubmit({\n kind: \"run\",\n work: async (ctx) => {\n ctx.signal.addEventListener(\n \"abort\",\n () => {\n void run.cancel().catch(() => {\n /* swallow — run may already be terminal */\n });\n },\n { once: true },\n );\n const result = await run.wait();\n ctx.emit({ status: result.status, runId: run.id });\n return { status: result.status, result: result.result };\n },\n ...(opts.id !== undefined ? { id: opts.id } : {}),\n meta,\n });\n}\n","import type { ConversationStorageAdapter } from \"../../types/conversation-storage.js\";\nimport type { Run } from \"../../types/run.js\";\nimport { writeSessionSummary } from \"../memory/session-summary-writer.js\";\nimport { appendSessionMessage, flushSessionWrites } from \"./agent-session.js\";\nimport type { HooksExecutor } from \"./hooks-executor.js\";\nimport type { LocalAgentMemory } from \"./local-agent-memory.js\";\n\n/**\n * Inputs for {@link runPostRunLifecycle}. Bundled into a single record so the\n * caller (LocalAgent.send) doesn't carry a long positional argument list.\n *\n * `storageHandle` is the unified routing key (D304): either a\n * {@link ConversationStorageAdapter} or the raw `workspaceCwd` string when\n * no custom adapter is configured.\n *\n * @internal\n */\nexport interface PostRunLifecycleInputs {\n run: Run;\n userText: string;\n agentId: string;\n workspaceCwd: string;\n storageHandle: ConversationStorageAdapter | string;\n hooksExecutor: HooksExecutor;\n memoryGlue: LocalAgentMemory;\n}\n\n/**\n * Post-run side effects executed inside the per-agent send mutex (ADR D19):\n *\n * 1. Persist the assistant turn to the per-agent JSONL (ADR D18).\n * 2. On status=finished, write a session-summary markdown for the\n * `corpus=\"sessions\"` memory_search index (ADR D20).\n * 3. Fire the `postRun` hook with the resolved status.\n * 4. Flush pending session writes so dispose() never races the writer.\n *\n * Errors are swallowed at the call site so `agent.send()` callers observe\n * failures through their own `run.wait()` / `stream()` surfaces. Mutex release\n * is guaranteed via the final `flushSessionWrites` even on the cancelled path.\n *\n * Extracted from LocalAgent to keep that class under the G8 LoC budget.\n *\n * @internal\n */\nexport async function runPostRunLifecycle(inputs: PostRunLifecycleInputs): Promise<void> {\n const { run, userText, agentId, workspaceCwd, storageHandle, hooksExecutor, memoryGlue } = inputs;\n let result: Awaited<ReturnType<Run[\"wait\"]>>;\n try {\n result = await run.wait();\n } catch {\n // Caller observes failures via their own run.wait()/stream(); the\n // mutex still releases via the flushes below.\n await flushSessionWrites();\n return;\n }\n\n if (result.result !== undefined) {\n appendSessionMessage(agentId, { role: \"assistant\", text: result.result }, storageHandle);\n }\n\n // ADR D20 + EC-9: only finished runs feed the corpus=\"sessions\" index.\n if (result.status === \"finished\" && result.result !== undefined) {\n try {\n await writeSessionSummary({\n cwd: workspaceCwd,\n runId: result.id,\n agentId,\n userText,\n assistantText: result.result,\n status: \"finished\",\n at: Date.now(),\n });\n // EC-3: trigger sync so the next memory_search({corpus:\"sessions\"})\n // sees the just-written summary. Fire-and-forget; the read path\n // tolerates a missed sync because IndexManager re-scans on each call.\n void memoryGlue.syncIfReady();\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] session summary write failed (${result.id}): ${message}\\n`,\n );\n }\n }\n\n await hooksExecutor.run({\n event: \"postRun\",\n output: {\n status: result.status,\n ...(result.result !== undefined ? { result: result.result } : {}),\n },\n agentId,\n runId: result.id,\n });\n await flushSessionWrites();\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { AgentDefinition } from \"../../types/agent.js\";\nimport { readWorkspaceDir } from \"./workspace-dir.js\";\nimport { parseSimpleYaml } from \"./yaml-frontmatter.js\";\n\n/**\n * Load file-based subagents from `.theokit/agents/*.md` and merge with\n * inline definitions. Inline overrides file-based on name conflict.\n *\n * Each markdown file has YAML frontmatter (description + optional model)\n * and a body that becomes the subagent prompt.\n *\n * @internal\n */\nexport async function loadSubagents(\n cwd: string,\n settingSourcesIncludeProject: boolean,\n inline: Record<string, AgentDefinition> | undefined,\n): Promise<Record<string, AgentDefinition>> {\n const result: Record<string, AgentDefinition> = {};\n if (settingSourcesIncludeProject) {\n const projectAgents = await readProjectSubagents(cwd);\n for (const [name, definition] of Object.entries(projectAgents)) {\n result[name] = definition;\n }\n }\n if (inline !== undefined) {\n for (const [name, definition] of Object.entries(inline)) {\n result[name] = definition;\n }\n }\n return result;\n}\n\nasync function readProjectSubagents(cwd: string): Promise<Record<string, AgentDefinition>> {\n const root = join(cwd, \".theokit\", \"agents\");\n const entries = await readWorkspaceDir(root, \"subagents_read_error\", \"subagents directory\");\n const subagents: Record<string, AgentDefinition> = {};\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const path = join(root, entry.name);\n const raw = await readFile(path, \"utf8\");\n const definition = parseSubagentMarkdown(raw, entry.name);\n subagents[definition.name] = definition.definition;\n }\n return subagents;\n}\n\nfunction parseSubagentMarkdown(\n raw: string,\n filename: string,\n): { name: string; definition: AgentDefinition } {\n const { frontmatter, body } = splitFrontmatter(raw, filename);\n const fields = parseFrontmatterFields(frontmatter);\n const baseName = filename.replace(/\\.md$/, \"\");\n const name = fields.name ?? baseName;\n const definition: AgentDefinition = {\n description: fields.description ?? \"\",\n prompt: body,\n };\n if (fields.model !== undefined) {\n definition.model = fields.model === \"inherit\" ? \"inherit\" : { id: fields.model };\n }\n return { name, definition };\n}\n\nfunction splitFrontmatter(raw: string, filename: string): { frontmatter: string; body: string } {\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/.exec(raw);\n if (match === null) {\n throw new ConfigurationError(`Subagent ${filename} is missing frontmatter`, {\n code: \"subagent_missing_frontmatter\",\n });\n }\n return { frontmatter: match[1] ?? \"\", body: (match[2] ?? \"\").trim() };\n}\n\nfunction parseFrontmatterFields(frontmatter: string): Record<string, string | undefined> {\n // Subagent schema is all-string; narrow non-string values to undefined.\n const raw = parseSimpleYaml(frontmatter);\n const out: Record<string, string | undefined> = {};\n for (const [k, v] of Object.entries(raw)) {\n out[k] = typeof v === \"string\" ? v : undefined;\n }\n return out;\n}\n","import type { AgentOptions, ModelSelection, SystemPromptContext } from \"../../../types/agent.js\";\nimport type { FileContextManager } from \"../context-manager.js\";\nimport type { MemoryFact } from \"../memory-store.js\";\nimport type { SkillsManager } from \"../skills-manager.js\";\nimport type { SystemPromptPipeline } from \"./pipeline.js\";\nimport type { SystemPromptAssemblyContext } from \"./types.js\";\n\n/**\n * Bundles the per-agent state that the assembly helpers need without forcing\n * LocalAgent to expose private fields. Extracted from LocalAgent so the parent\n * class stays under the G8 LoC budget.\n *\n * @internal\n */\nexport interface LocalAssemblyInputs {\n agentId: string;\n workspaceCwd: string;\n model: ModelSelection | undefined;\n options: AgentOptions;\n context: FileContextManager | undefined;\n skillsManager: SkillsManager | undefined;\n systemPromptPipeline: SystemPromptPipeline;\n}\n\n/**\n * Build the base {@link SystemPromptContext} surfaced to a resolver function.\n * Resolves skills lazily — never throws when the manager is absent.\n *\n * @internal\n */\nexport async function buildSystemPromptContext(\n inputs: LocalAssemblyInputs,\n userText: string,\n memoryFacts: ReadonlyArray<MemoryFact>,\n): Promise<SystemPromptContext> {\n const skills = inputs.skillsManager !== undefined ? await inputs.skillsManager.list() : [];\n return {\n agentId: inputs.agentId,\n cwd: inputs.workspaceCwd,\n model: inputs.model,\n skills: skills.map((skill) => ({ name: skill.name, description: skill.description })),\n userMessage: userText,\n memory: memoryFacts.map((fact) => ({ text: fact.text })),\n };\n}\n\n/**\n * Build the full {@link SystemPromptAssemblyContext} that the pipeline\n * consumes, including the optional active-memory summary and context snapshot.\n *\n * @internal\n */\nexport async function buildAssemblyContext(\n inputs: LocalAssemblyInputs,\n userText: string,\n baseSystemPrompt: string | undefined,\n memoryFacts: ReadonlyArray<MemoryFact>,\n activeMemorySummary: string | undefined,\n): Promise<SystemPromptAssemblyContext> {\n const baseCtx = await buildSystemPromptContext(inputs, userText, memoryFacts);\n const assemblyCtx: SystemPromptAssemblyContext = {\n ...baseCtx,\n skillsAutoInject: inputs.options.skills?.autoInject ?? true,\n memoryAutoInject: inputs.options.memory?.autoInject ?? true,\n };\n if (baseSystemPrompt !== undefined) assemblyCtx.baseSystemPrompt = baseSystemPrompt;\n if (activeMemorySummary !== undefined && activeMemorySummary.length > 0) {\n assemblyCtx.activeMemorySummary = activeMemorySummary;\n }\n if (inputs.context !== undefined) {\n const internal = inputs.context.internalAssemblySnapshot();\n assemblyCtx.contextSnapshot = { sources: internal.sources };\n if (internal.maxTokens !== undefined) assemblyCtx.contextMaxTokens = internal.maxTokens;\n }\n return assemblyCtx;\n}\n\n/**\n * Convenience wrapper: build the assembly context and run it through the\n * pipeline in one call. Returns the final system-prompt string (or undefined\n * if the pipeline produces no output).\n *\n * @internal\n */\nexport async function assembleSystemPromptForSend(\n inputs: LocalAssemblyInputs,\n userText: string,\n baseSystemPrompt: string | undefined,\n memoryFacts: ReadonlyArray<MemoryFact>,\n activeMemorySummary: string | undefined,\n): Promise<string | undefined> {\n const ctx = await buildAssemblyContext(\n inputs,\n userText,\n baseSystemPrompt,\n memoryFacts,\n activeMemorySummary,\n );\n return inputs.systemPromptPipeline.assemble(ctx);\n}\n","import { ConfigurationError } from \"../../../errors.js\";\nimport { ActiveMemoryPromptProvider } from \"./providers/active-memory-provider.js\";\nimport { BasePromptProvider } from \"./providers/base-provider.js\";\nimport { ContextPromptProvider } from \"./providers/context-provider.js\";\nimport { MemoryPromptProvider } from \"./providers/memory-provider.js\";\nimport { SkillsPromptProvider } from \"./providers/skills-provider.js\";\nimport { safeCall } from \"./safe-call.js\";\nimport type { SystemPromptAssemblyContext, SystemPromptProvider } from \"./types.js\";\n\n/**\n * System-prompt assembly pipeline (ADR D8 — Strategy + Chain of\n * Responsibility additive).\n *\n * Sorts providers by `priority` ascending (lexicographic `id` tiebreak),\n * invokes each `contribute` sequentially through `safeCall`, filters\n * `undefined` / empty contributions, and joins the rest with a double\n * newline.\n *\n * Constructor rejects duplicate `(priority, id)` provider keys with\n * `ConfigurationError` code `pipeline_duplicate_provider` (EC-2).\n *\n * @internal\n */\nexport class SystemPromptPipeline {\n readonly providers: ReadonlyArray<SystemPromptProvider>;\n\n constructor(providers: ReadonlyArray<SystemPromptProvider>) {\n const seen = new Set<string>();\n for (const p of providers) {\n const key = `${p.priority}:${p.id}`;\n if (seen.has(key)) {\n throw new ConfigurationError(`Duplicate system-prompt provider ${key}`, {\n code: \"pipeline_duplicate_provider\",\n });\n }\n seen.add(key);\n }\n this.providers = [...providers].sort((a, b) => {\n if (a.priority !== b.priority) return a.priority - b.priority;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n });\n }\n\n async assemble(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n const parts: string[] = [];\n for (const provider of this.providers) {\n const contribution = await safeCall(\n () => provider.contribute(ctx),\n undefined,\n `system-prompt provider \"${provider.id}\"`,\n );\n if (contribution === undefined || contribution.length === 0) continue;\n parts.push(contribution);\n }\n return parts.length === 0 ? undefined : parts.join(\"\\n\\n\");\n }\n\n /**\n * Default factory — wires the four built-in providers. Phase 3 ships\n * `BasePromptProvider`; Phases 3.2 / 4 / 5 register Context / Skills /\n * Memory by editing THIS factory and adding nothing else.\n */\n static default(): SystemPromptPipeline {\n return new SystemPromptPipeline([\n new ActiveMemoryPromptProvider(),\n new ContextPromptProvider(),\n new SkillsPromptProvider(),\n new MemoryPromptProvider(),\n new BasePromptProvider(),\n ]);\n }\n}\n","/**\n * Block-body XML escape (ADR D9 — prompt-injection defence).\n *\n * Order matters: `&` MUST be escaped first so subsequent `<`/`>` replacements\n * do not double-encode the `&` characters they introduce.\n *\n * @internal\n */\nexport const escapeBlockBody = (s: string): string =>\n s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n","import { escapeBlockBody } from \"../escape.js\";\nimport type { SystemPromptAssemblyContext, SystemPromptProvider } from \"../types.js\";\n\n/**\n * Contributes the `<active-memory>` block (ADR D6 of memory-system-openclaw-parity).\n *\n * Priority 5 — fires BEFORE Context/Skills/Memory providers so the recall\n * summary sits at the top of the system prompt. The summary itself is\n * produced by `runActiveMemory` and threaded via\n * `SystemPromptAssemblyContext.activeMemorySummary`.\n *\n * @internal\n */\nexport class ActiveMemoryPromptProvider implements SystemPromptProvider {\n readonly id = \"active-memory\";\n readonly priority = 5;\n\n contribute(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n if (ctx.activeMemorySummary === undefined || ctx.activeMemorySummary.length === 0) {\n return Promise.resolve(undefined);\n }\n const body = escapeBlockBody(ctx.activeMemorySummary);\n return Promise.resolve(`<active-memory>\\n${body}\\n</active-memory>`);\n }\n}\n","import type { SystemPromptAssemblyContext, SystemPromptProvider } from \"../types.js\";\n\n/**\n * Wraps the user-resolved base system prompt as the final contribution in\n * the pipeline. Priority 100 = last (after Context/Skills/Memory).\n *\n * The base prompt is the agent author's own intent — it is NOT passed through\n * `escapeBlockBody`. Auto-injected blocks (context/skills/memory) escape\n * dynamic content because they may carry user-controlled data.\n *\n * @internal\n */\nexport class BasePromptProvider implements SystemPromptProvider {\n readonly id = \"base\";\n readonly priority = 100;\n\n contribute(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n return Promise.resolve(ctx.baseSystemPrompt);\n }\n}\n","import { escapeBlockBody } from \"../escape.js\";\nimport type {\n ContextSourceForAssembly,\n SystemPromptAssemblyContext,\n SystemPromptProvider,\n} from \"../types.js\";\n\n/**\n * Contributes the `<context>` block (ADR D3 / D9).\n *\n * - Drops `excluded` sources.\n * - Truncates per source proportionally when the total exceeds the budget.\n * - Enforces a per-source floor (`MIN_SOURCE_TOKENS`) so a tiny budget shared\n * across many sources still yields meaningful slices.\n * - Escapes every source body through `escapeBlockBody` before embedding.\n *\n * @internal\n */\nexport class ContextPromptProvider implements SystemPromptProvider {\n readonly id = \"context\";\n readonly priority = 10;\n\n contribute(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n if (ctx.contextSnapshot === undefined) return Promise.resolve(undefined);\n const included = ctx.contextSnapshot.sources.filter((src) => src.status === \"included\");\n if (included.length === 0) return Promise.resolve(undefined);\n const truncated = truncateToBudget(included, ctx.contextMaxTokens);\n if (truncated.length === 0) return Promise.resolve(undefined);\n const body = truncated.map((src) => formatSource(src.name, src.tokens)).join(\"\\n\");\n return Promise.resolve(`<context>\\n${body}\\n</context>`);\n }\n}\n\nconst MIN_SOURCE_TOKENS = 50;\n\nfunction truncateToBudget(\n sources: ReadonlyArray<ContextSourceForAssembly>,\n maxTokens: number | undefined,\n): Array<{ name: string; tokens: ReadonlyArray<string> }> {\n if (maxTokens === undefined || maxTokens <= 0) {\n return sources.map((src) => ({ name: src.name, tokens: src.tokens }));\n }\n const total = sources.reduce((sum, src) => sum + src.tokens.length, 0);\n if (total <= maxTokens) {\n return sources.map((src) => ({ name: src.name, tokens: src.tokens }));\n }\n const floor = Math.min(MIN_SOURCE_TOKENS, Math.floor(maxTokens / sources.length));\n const remaining = Math.max(0, maxTokens - floor * sources.length);\n return sources.map((src) => {\n const proportional = total === 0 ? 0 : Math.floor((src.tokens.length / total) * remaining);\n const allotted = Math.min(src.tokens.length, floor + proportional);\n return { name: src.name, tokens: src.tokens.slice(0, allotted) };\n });\n}\n\nfunction formatSource(name: string, tokens: ReadonlyArray<string>): string {\n if (tokens.length === 0) {\n return ` <source name=\"${escapeAttribute(name)}\" />`;\n }\n const body = escapeBlockBody(tokens.join(\" \"));\n return ` <source name=\"${escapeAttribute(name)}\">\\n ${body}\\n </source>`;\n}\n\nfunction escapeAttribute(name: string): string {\n return name.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\");\n}\n","import { escapeBlockBody } from \"../escape.js\";\nimport type { SystemPromptAssemblyContext, SystemPromptProvider } from \"../types.js\";\n\n/**\n * Contributes the `<memory>` block (ADR D5 / D9).\n *\n * Each fact's `text` is passed through `escapeBlockBody` before embedding so\n * a persisted fact containing literal `</memory>` cannot escape the block.\n *\n * @internal\n */\nexport class MemoryPromptProvider implements SystemPromptProvider {\n readonly id = \"memory\";\n readonly priority = 30;\n\n contribute(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n if (ctx.memoryAutoInject === false) return Promise.resolve(undefined);\n if (ctx.memory.length === 0) return Promise.resolve(undefined);\n const lines = ctx.memory.map((fact) => ` - ${escapeBlockBody(fact.text)}`);\n return Promise.resolve(`<memory>\\n${lines.join(\"\\n\")}\\n</memory>`);\n }\n}\n","import { escapeBlockBody } from \"../escape.js\";\nimport type { SystemPromptAssemblyContext, SystemPromptProvider } from \"../types.js\";\n\n/**\n * Contributes the `<skills>` block (ADR D4 / D9).\n *\n * Input is `ReadonlyArray<{ name, description }>` — the skill body is NOT in\n * the type, so there is no path for it to leak into the system prompt.\n *\n * Both name and description are passed through `escapeBlockBody` to neutralise\n * prompt-injection vectors hidden in user-controlled SKILL.md frontmatter.\n *\n * @internal\n */\nexport class SkillsPromptProvider implements SystemPromptProvider {\n readonly id = \"skills\";\n readonly priority = 20;\n\n contribute(ctx: SystemPromptAssemblyContext): Promise<string | undefined> {\n if (ctx.skillsAutoInject === false) return Promise.resolve(undefined);\n if (ctx.skills.length === 0) return Promise.resolve(undefined);\n const lines = ctx.skills.map((skill) => {\n const name = escapeBlockBody(skill.name);\n const description = escapeBlockBody(skill.description);\n return ` - ${name}: ${description}`;\n });\n return Promise.resolve(`<skills>\\n${lines.join(\"\\n\")}\\n</skills>`);\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport type { AgentDefinition, AgentOptions, CloudOptions, CustomTool } from \"../../types/agent.js\";\nimport type { McpServerConfig } from \"../../types/mcp.js\";\n\n/**\n * Pre-flight validation for `Agent.create()` options. Throws\n * `ConfigurationError` on any rule violation; otherwise returns silently.\n *\n * Rules enforced:\n * - exactly one of local/cloud\n * - local requires `model`\n * - cloud `envVars` keys must not start with `THEOKIT_`\n * - cloud stdio MCP must not pass `cwd`\n * - subagent inline definitions require `description` and `prompt`\n * - programmatic `hooks` are rejected (hooks are file-based only)\n * - memory `storePath`, when relative, must stay inside the workspace\n * - custom `tools`: unique names, reserved-name collisions rejected,\n * schema shape valid, cloud agents reject any non-empty tools array\n *\n * @internal\n */\nexport function validateAgentOptions(options: AgentOptions): void {\n rejectProgrammaticHooks(options);\n ensureRuntimeShape(options);\n if (options.local !== undefined) {\n if (options.model === undefined) {\n throw new ConfigurationError(\"Local agents require a model selection\", {\n code: \"missing_model\",\n });\n }\n }\n if (options.cloud !== undefined) {\n validateCloud(options.cloud);\n }\n validateMcpServers(options);\n validateSubagents(options.agents);\n validateMemory(options);\n validatePlugins(options);\n validateCustomTools(options);\n validateCredentialPoolShape(options);\n}\n\n/**\n * EC-J: `apiKey: \"k\"` AND `apiKeys: { provider: [...] }` together is\n * ambiguous — caller must pick exactly one shape. Throws\n * `ConfigurationError(code: \"credential_pool_ambiguous\")` with an\n * educational message.\n *\n * @internal\n */\nfunction validateCredentialPoolShape(options: AgentOptions): void {\n const apiKey = (options as { apiKey?: string }).apiKey;\n const apiKeys = options.providers?.apiKeys;\n if (apiKey === undefined || apiKey.length === 0) return;\n if (apiKeys === undefined) return;\n const populated = Object.entries(apiKeys).filter(\n ([, arr]) => Array.isArray(arr) && arr.some((k) => typeof k === \"string\" && k.length > 0),\n );\n if (populated.length === 0) return;\n throw new ConfigurationError(\n \"Ambiguous credential configuration: use either `apiKey: '...'` (single-key, simplest) \" +\n \"OR `apiKeys: { provider: [...] }` (multi-key pool), not both.\",\n { code: \"credential_pool_ambiguous\" },\n );\n}\n\nfunction validatePlugins(options: AgentOptions): void {\n const plugins = (options as { plugins?: { paths?: string[] } }).plugins;\n if (plugins?.paths === undefined) return;\n if (options.cloud !== undefined && plugins.paths.length > 0) {\n throw new ConfigurationError(\n \"Cloud agents require committed plugin manifests; local plugin paths are not supported\",\n { code: \"cloud_plugin_path_rejected\" },\n );\n }\n}\n\nfunction ensureRuntimeShape(options: AgentOptions): void {\n if (options.local !== undefined && options.cloud !== undefined) {\n throw new ConfigurationError(\n \"Pass either local or cloud — they are mutually exclusive runtimes\",\n { code: \"runtime_exclusive\" },\n );\n }\n}\n\nfunction rejectProgrammaticHooks(options: AgentOptions): void {\n if ((options as { hooks?: unknown }).hooks !== undefined) {\n throw new ConfigurationError(\n \"Programmatic hooks are not supported — hooks are file-based only (.theokit/hooks.json)\",\n { code: \"programmatic_hooks_rejected\" },\n );\n }\n}\n\nfunction validateCloud(cloud: CloudOptions): void {\n if (cloud.envVars !== undefined) {\n for (const key of Object.keys(cloud.envVars)) {\n if (key.startsWith(\"THEOKIT_\")) {\n throw new ConfigurationError(\n `Cloud envVars cannot use the reserved THEOKIT_ prefix (got \"${key}\")`,\n { code: \"reserved_env_prefix\" },\n );\n }\n }\n }\n}\n\nfunction validateMcpServers(options: AgentOptions): void {\n if (options.mcpServers === undefined) return;\n for (const [name, config] of Object.entries(options.mcpServers)) {\n if (options.cloud !== undefined && isStdioWithCwd(config)) {\n throw new ConfigurationError(\n `MCP server \"${name}\" uses stdio with cwd, which is rejected for cloud agents`,\n { code: \"cloud_stdio_cwd_rejected\" },\n );\n }\n }\n}\n\nfunction isStdioWithCwd(config: McpServerConfig): boolean {\n const stdio = config as { type?: string; cwd?: string };\n if (stdio.type !== \"stdio\" && stdio.type !== undefined) return false;\n if (\"command\" in config && typeof stdio.cwd === \"string\" && stdio.cwd.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction validateSubagents(agents: Record<string, AgentDefinition> | undefined): void {\n if (agents === undefined) return;\n for (const [name, definition] of Object.entries(agents)) {\n if (typeof definition.description !== \"string\" || definition.description.length === 0) {\n throw new ConfigurationError(`Subagent \"${name}\" requires a non-empty description`, {\n code: \"subagent_missing_description\",\n });\n }\n if (typeof definition.prompt !== \"string\" || definition.prompt.length === 0) {\n throw new ConfigurationError(`Subagent \"${name}\" requires a non-empty prompt`, {\n code: \"subagent_missing_prompt\",\n });\n }\n }\n}\n\nconst TOOL_NAME_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;\nconst RESERVED_TOOL_NAMES: ReadonlySet<string> = new Set([\"shell\", \"memory_search\", \"memory_get\"]);\n\n/**\n * Shared per-tool catalog validator used by both creation-time AgentOptions\n * and per-call SendOptions paths. Runs the same name/schema/dedupe rules\n * against any tools array. Does NOT enforce the cloud-runtime rejection —\n * that lives in {@link validateCustomTools} (creation) and the\n * per-runtime send paths (cloud agents reject at dispatch).\n *\n * @internal\n */\nexport function validateToolCatalog(tools: ReadonlyArray<CustomTool>): void {\n const seen = new Set<string>();\n for (const tool of tools) {\n validateSingleTool(tool);\n if (seen.has(tool.name)) {\n throw new ConfigurationError(`Duplicate custom tool name \"${tool.name}\"`, {\n code: \"duplicate_tool_name\",\n });\n }\n seen.add(tool.name);\n }\n}\n\nfunction validateCustomTools(options: AgentOptions): void {\n const tools = options.tools;\n if (tools === undefined || tools.length === 0) return;\n if (options.cloud !== undefined) {\n throw new ConfigurationError(\n \"Custom inline tools are local-only in SDK v1.0 — cloud agents cannot serialize handler functions\",\n { code: \"cloud_custom_tools_rejected\" },\n );\n }\n validateToolCatalog(tools);\n}\n\nfunction validateSingleTool(tool: CustomTool): void {\n validateToolName(tool);\n validateToolDescription(tool);\n validateToolSchema(tool);\n if (typeof tool.handler !== \"function\") {\n throw new ConfigurationError(`Custom tool \"${tool.name}\" requires a handler function`, {\n code: \"tool_missing_handler\",\n });\n }\n}\n\nfunction validateToolName(tool: CustomTool): void {\n if (typeof tool.name !== \"string\" || tool.name.length === 0) {\n throw new ConfigurationError(\"Custom tool requires a non-empty name\", {\n code: \"tool_missing_name\",\n });\n }\n if (!TOOL_NAME_PATTERN.test(tool.name)) {\n throw new ConfigurationError(\n `Custom tool name \"${tool.name}\" must match /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/`,\n { code: \"tool_invalid_name\" },\n );\n }\n if (RESERVED_TOOL_NAMES.has(tool.name) || tool.name.startsWith(\"mcp_\")) {\n throw new ConfigurationError(\n `Custom tool name \"${tool.name}\" collides with a reserved SDK tool name`,\n { code: \"tool_reserved_name\" },\n );\n }\n}\n\nfunction validateToolDescription(tool: CustomTool): void {\n if (typeof tool.description !== \"string\" || tool.description.length === 0) {\n throw new ConfigurationError(`Custom tool \"${tool.name}\" requires a non-empty description`, {\n code: \"tool_missing_description\",\n });\n }\n}\n\nfunction validateToolSchema(tool: CustomTool): void {\n const schema = tool.inputSchema as { type?: unknown } | null | undefined;\n if (schema === null || schema === undefined || typeof schema !== \"object\") {\n throw new ConfigurationError(`Custom tool \"${tool.name}\" requires an inputSchema object`, {\n code: \"tool_missing_schema\",\n });\n }\n if (schema.type !== \"object\") {\n throw new ConfigurationError(\n `Custom tool \"${tool.name}\" inputSchema must declare \\`type: \"object\"\\``,\n { code: \"tool_invalid_schema_type\" },\n );\n }\n}\n\nfunction validateMemory(options: AgentOptions): void {\n const memory = (options as { memory?: { storePath?: string } }).memory;\n if (memory?.storePath === undefined) return;\n const storePath = memory.storePath;\n if (storePath.includes(\"..\") || storePath.startsWith(\"/\") || /^[A-Z]:/i.test(storePath)) {\n throw new ConfigurationError(\n `Memory storePath must stay inside the workspace; got \"${storePath}\"`,\n { code: \"memory_path_traversal\" },\n );\n }\n}\n","import { Agent } from \"../../agent.js\";\nimport { ConfigurationError, UnknownAgentError } from \"../../errors.js\";\nimport type { AgentOptions } from \"../../types/agent.js\";\nimport type { CronJob } from \"../../types/cron.js\";\nimport type { Run, SDKUserMessage } from \"../../types/run.js\";\n\n/**\n * Execute a cron job by creating the configured agent (or reusing the\n * referenced `agentId`) and dispatching `job.message` through `agent.send()`.\n *\n * Used by both:\n * - The public `Cron.run(jobId)` for manual off-schedule fires.\n * - The internal scheduler's default fire handler, so timer ticks also\n * drive a real agent run instead of being silent.\n *\n * @internal\n */\nexport async function runCronJob(job: CronJob): Promise<Run> {\n if (job.agent !== undefined) return runWithEphemeralAgent(job.agent as AgentOptions, job.message);\n if (job.agentId !== undefined) return runWithExistingAgent(job.agentId, job.message);\n throw new ConfigurationError(`Cron job ${job.id} has neither agent nor agentId — cannot run.`, {\n code: \"cron_no_target\",\n });\n}\n\nasync function runWithExistingAgent(\n agentId: string,\n message: string | SDKUserMessage,\n): Promise<Run> {\n const info = await Agent.get(agentId).catch(() => undefined);\n if (info === undefined) {\n throw new UnknownAgentError(\n `Cron job references agentId \"${agentId}\" but no such agent is registered. The agent may have been disposed or the process restarted without persisting the agent registry.`,\n { code: \"agent_not_registered\" },\n );\n }\n const agent = await Agent.resume(agentId);\n return agent.send(message);\n}\n\nasync function runWithEphemeralAgent(\n baseOptions: AgentOptions,\n message: string | SDKUserMessage,\n): Promise<Run> {\n const agent = await Agent.create(baseOptions);\n return agent.send(message);\n}\n","import type { CronJob } from \"../../types/cron.js\";\n\n/**\n * Process-wide cron job store. In Phase 1 we keep all jobs in memory\n * (across local + cloud runtimes). Local-runtime persistence to\n * `.theokit/cron/jobs.json` lands when the local runtime adapter is wired.\n *\n * @internal\n */\nconst jobs = new Map<string, CronJob>();\n\n/** Snapshot of every known cron job. @internal */\nexport function listJobs(): CronJob[] {\n return Array.from(jobs.values());\n}\n\n/** Total job count across runtimes. @internal */\nexport function jobCount(): number {\n return jobs.size;\n}\n\n/** Fetch a single job by id, or `undefined` if it does not exist. @internal */\nexport function getJob(jobId: string): CronJob | undefined {\n return jobs.get(jobId);\n}\n\n/** Insert or replace a job. @internal */\nexport function upsertJob(job: CronJob): void {\n jobs.set(job.id, job);\n}\n\n/** Delete a job. Returns `true` if a job was removed. @internal */\nexport function deleteJob(jobId: string): boolean {\n return jobs.delete(jobId);\n}\n\n/** Test-only: drop every job. @internal */\nexport function clearJobs(): void {\n jobs.clear();\n}\n","import { Cron as Croner } from \"croner\";\n\nimport type { CronJob } from \"../../types/cron.js\";\nimport { listJobs, upsertJob } from \"./store.js\";\n\n/**\n * Real local cron scheduler. When `Cron.start()` is called the scheduler\n * installs a Croner timer per enabled local job; on fire the registered\n * fire handler runs the underlying agent. `Cron.stop()` tears every timer\n * down but keeps the jobs in the store.\n *\n * @internal\n */\n\nexport type CronFireHandler = (job: CronJob) => Promise<void> | void;\n\ninterface SchedulerState {\n running: boolean;\n cwd?: string;\n timers: Map<string, Croner>;\n fireHandler?: CronFireHandler;\n}\n\nconst state: SchedulerState = { running: false, timers: new Map() };\n\n/**\n * Register the callback invoked when a job fires. The runtime adapter\n * supplies a handler that actually executes the agent; fixture-mode tests\n * leave it unset so timers tick without side effects.\n *\n * @internal\n */\nexport function setCronFireHandler(handler: CronFireHandler | undefined): void {\n state.fireHandler = handler;\n}\n\n/** Activate the scheduler and install timers for every enabled local job. @internal */\nexport function startScheduler(cwd?: string): void {\n state.running = true;\n if (cwd !== undefined) state.cwd = cwd;\n for (const job of listJobs()) {\n if (job.runtime === \"local\" && job.enabled !== false) scheduleJob(job);\n }\n}\n\n/** Deactivate the scheduler. Stops every timer; jobs remain in the store. @internal */\nexport function stopScheduler(): void {\n state.running = false;\n for (const timer of state.timers.values()) timer.stop();\n state.timers.clear();\n}\n\n/** Schedule a single job. No-op if the scheduler is not running. @internal */\nexport function scheduleJob(job: CronJob): void {\n if (!state.running) return;\n unscheduleJob(job.id);\n const expression = normalizeExpression(job.cron);\n const timer = new Croner(\n expression,\n { timezone: job.timezone, name: job.id, protect: true },\n () => {\n void fireJob(job.id);\n },\n );\n state.timers.set(job.id, timer);\n refreshNextRunAt(job.id, timer);\n}\n\n/** Tear down the timer for a single job. @internal */\nexport function unscheduleJob(jobId: string): boolean {\n const timer = state.timers.get(jobId);\n if (timer === undefined) return false;\n timer.stop();\n state.timers.delete(jobId);\n return true;\n}\n\n/** Snapshot of the scheduler's running flag and configured workspace. @internal */\nexport function getSchedulerState(): { running: boolean; cwd?: string } {\n const result: { running: boolean; cwd?: string } = { running: state.running };\n if (state.cwd !== undefined) result.cwd = state.cwd;\n return result;\n}\n\nasync function fireJob(jobId: string): Promise<void> {\n const fresh = listJobs().find((entry) => entry.id === jobId);\n if (fresh === undefined || fresh.enabled === false) return;\n const handler = state.fireHandler;\n upsertJob({ ...fresh, lastRunAt: Date.now() });\n if (handler === undefined) return;\n try {\n await handler(fresh);\n } catch {\n // Swallow handler errors — the scheduler must keep ticking. Real\n // surface for run failures lives on the Run.wait() result itself.\n }\n}\n\nfunction refreshNextRunAt(jobId: string, timer: Croner): void {\n const next = timer.nextRun();\n if (next === null) return;\n const existing = listJobs().find((entry) => entry.id === jobId);\n if (existing === undefined) return;\n upsertJob({ ...existing, nextRunAt: next.getTime() });\n}\n\nfunction normalizeExpression(cron: string): string {\n switch (cron) {\n case \"@hourly\":\n return \"0 * * * *\";\n case \"@daily\":\n return \"0 0 * * *\";\n case \"@weekly\":\n return \"0 0 * * 0\";\n case \"@monthly\":\n return \"0 0 1 * *\";\n case \"@yearly\":\n return \"0 0 1 1 *\";\n default:\n return cron;\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\n\n/**\n * POSIX-cron + shorthand validators used by `Cron.create()`. Throws\n * `ConfigurationError` with a stable message and code on invalid input.\n *\n * @internal\n */\n\nconst SHORTHANDS = new Set([\"@hourly\", \"@daily\", \"@weekly\", \"@monthly\", \"@yearly\"]);\n\ninterface FieldRange {\n min: number;\n max: number;\n}\n\nconst FIELD_RANGES: readonly FieldRange[] = [\n { min: 0, max: 59 }, // minute\n { min: 0, max: 23 }, // hour\n { min: 1, max: 31 }, // day-of-month\n { min: 1, max: 12 }, // month\n { min: 0, max: 6 }, // day-of-week\n];\n\n/**\n * Validate a cron expression. Accepts shorthand (`@hourly`, ..., `@yearly`)\n * or 5-field POSIX cron with star, literals, star/N step, N-M range, and\n * N,M,P list.\n *\n * @internal\n */\nexport function validateCronExpression(cron: string): void {\n if (typeof cron !== \"string\" || cron.length === 0) {\n throw new ConfigurationError(\"Invalid cron expression: empty\", {\n code: \"invalid_cron\",\n });\n }\n if (cron.startsWith(\"@\")) {\n if (!SHORTHANDS.has(cron)) {\n throw new ConfigurationError(`Invalid cron expression: unknown shorthand ${cron}`, {\n code: \"invalid_cron\",\n });\n }\n return;\n }\n\n const fields = cron.trim().split(/\\s+/);\n if (fields.length !== 5) {\n throw new ConfigurationError(\n `Invalid cron expression: ${cron} (expected 5 fields, got ${fields.length})`,\n { code: \"invalid_cron\" },\n );\n }\n for (const [index, field] of fields.entries()) {\n validateFieldOrThrow(field, index, cron);\n }\n}\n\nfunction validateFieldOrThrow(field: string, index: number, cron: string): void {\n const range = FIELD_RANGES[index];\n if (range === undefined) {\n throw new ConfigurationError(`Invalid cron expression: ${cron} (field ${index + 1})`, {\n code: \"invalid_cron\",\n });\n }\n if (!isValidCronField(field, range)) {\n throw new ConfigurationError(`Invalid cron expression: ${cron} (field ${index + 1})`, {\n code: \"invalid_cron\",\n });\n }\n}\n\nfunction isValidCronField(field: string, range: FieldRange): boolean {\n if (field === \"*\") return true;\n if (field.startsWith(\"*/\")) return isValidStep(field.slice(2), range);\n if (field.includes(\",\")) {\n return field.split(\",\").every((part) => isValidCronField(part, range));\n }\n if (field.includes(\"-\")) return isValidRange(field, range);\n return isValidLiteral(field, range);\n}\n\nfunction isValidStep(stepStr: string, range: FieldRange): boolean {\n const step = Number.parseInt(stepStr, 10);\n return Number.isInteger(step) && String(step) === stepStr && step > 0 && step <= range.max;\n}\n\nfunction isValidRange(field: string, range: FieldRange): boolean {\n const parts = field.split(\"-\");\n if (parts.length !== 2) return false;\n const [startStr, endStr] = parts;\n if (startStr === undefined || endStr === undefined) return false;\n const start = Number.parseInt(startStr, 10);\n const end = Number.parseInt(endStr, 10);\n if (!Number.isInteger(start) || !Number.isInteger(end)) return false;\n return start >= range.min && end <= range.max && start <= end;\n}\n\nfunction isValidLiteral(field: string, range: FieldRange): boolean {\n const n = Number.parseInt(field, 10);\n return Number.isInteger(n) && String(n) === field && n >= range.min && n <= range.max;\n}\n\n/**\n * Validate an IANA timezone. Uses `Intl.DateTimeFormat`'s strict timezone\n * lookup; invalid values raise `RangeError` which we wrap.\n *\n * @internal\n */\nexport function validateTimezone(timezone: string): void {\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone });\n } catch {\n throw new ConfigurationError(`Invalid IANA timezone: ${timezone}`, {\n code: \"invalid_timezone\",\n });\n }\n}\n\n/**\n * Heuristic next-fire-at estimator for fixture mode. Returns a timestamp\n * one hour in the future for shorthand/POSIX inputs. Real scheduling uses\n * a proper evaluator wired in by the local scheduler.\n *\n * @internal\n */\nexport function estimateNextRunAt(_cron: string, _timezone: string): number {\n return Date.now() + 60 * 60 * 1000;\n}\n"]}
|