@theokit/sdk 1.6.2 → 1.8.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 +193 -0
- package/bin/init-claude.mjs +34 -0
- package/claude-template/AGENTS.md +139 -0
- package/claude-template/CLAUDE.md +51 -0
- package/claude-template/dot-claude/rules/theokit-conventions.md +33 -0
- package/claude-template/dot-claude/settings.json +16 -0
- package/claude-template/dot-claude/skills/theokit-agent-core/SKILL.md +209 -0
- package/claude-template/dot-claude/skills/theokit-budget/SKILL.md +176 -0
- package/claude-template/dot-claude/skills/theokit-config/SKILL.md +139 -0
- package/claude-template/dot-claude/skills/theokit-cron/SKILL.md +148 -0
- package/claude-template/dot-claude/skills/theokit-di/SKILL.md +233 -0
- package/claude-template/dot-claude/skills/theokit-di-agent/SKILL.md +294 -0
- package/claude-template/dot-claude/skills/theokit-errors/SKILL.md +172 -0
- package/claude-template/dot-claude/skills/theokit-eval/SKILL.md +144 -0
- package/claude-template/dot-claude/skills/theokit-gateways/SKILL.md +209 -0
- package/claude-template/dot-claude/skills/theokit-memory/SKILL.md +176 -0
- package/claude-template/dot-claude/skills/theokit-rag/SKILL.md +226 -0
- package/claude-template/dot-claude/skills/theokit-streaming/SKILL.md +156 -0
- package/claude-template/dot-claude/skills/theokit-subscriptions/SKILL.md +148 -0
- package/claude-template/dot-claude/skills/theokit-tools/SKILL.md +170 -0
- package/claude-template/dot-claude/skills/theokit-workflows/SKILL.md +218 -0
- package/dist/a2a/agent-mailbox.d.cts +27 -0
- package/dist/a2a/agent-mailbox.d.ts +27 -0
- package/dist/a2a/index.cjs +16850 -0
- package/dist/a2a/index.cjs.map +1 -0
- package/dist/a2a/index.d.cts +9 -0
- package/dist/a2a/index.d.ts +9 -0
- package/dist/a2a/index.js +16844 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/message-bus.d.cts +27 -0
- package/dist/a2a/message-bus.d.ts +27 -0
- package/dist/a2a/subagent.d.cts +25 -0
- package/dist/a2a/subagent.d.ts +25 -0
- package/dist/a2a/types.d.cts +12 -0
- package/dist/a2a/types.d.ts +12 -0
- package/dist/agent.d.ts +1 -1
- package/dist/client/index.cjs +73 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +7 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +71 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/theokit-client.d.cts +18 -0
- package/dist/client/theokit-client.d.ts +18 -0
- package/dist/client/types.d.cts +19 -0
- package/dist/client/types.d.ts +19 -0
- package/dist/{run-DkCD5DeO.d.cts → cron-BnywDYLq.d.cts} +496 -910
- package/dist/{run-DkCD5DeO.d.ts → cron-CtZvJD9J.d.ts} +496 -910
- package/dist/cron.cjs +4285 -2893
- package/dist/cron.cjs.map +1 -1
- package/dist/cron.d.cts +2 -3
- package/dist/cron.d.ts +2 -71
- package/dist/cron.js +4289 -2897
- package/dist/cron.js.map +1 -1
- package/dist/{errors-CvAeEWgE.d.ts → errors-ChqOmFH1.d.cts} +52 -6
- package/dist/{errors-CK8brCJ1.d.cts → errors-DV9e0rcp.d.ts} +52 -6
- package/dist/errors.cjs +218 -3
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +2 -3
- package/dist/errors.d.ts +50 -4
- package/dist/errors.js +217 -4
- package/dist/errors.js.map +1 -1
- package/dist/eval.cjs +4285 -2893
- package/dist/eval.cjs.map +1 -1
- package/dist/eval.d.cts +35 -0
- package/dist/eval.js +4289 -2897
- package/dist/eval.js.map +1 -1
- package/dist/event-bus.d.ts +23 -0
- package/dist/index.cjs +5132 -4200
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +298 -278
- package/dist/index.d.ts +1898 -24
- package/dist/index.js +6441 -5509
- package/dist/index.js.map +1 -1
- package/dist/internal/agent-loop/loop-context-init.d.ts +2 -0
- package/dist/internal/agent-loop/tool-dispatch.d.ts +22 -1
- package/dist/internal/auth/api-key-validator.d.ts +46 -0
- package/dist/internal/llm/anthropic-shared.d.ts +8 -1
- package/dist/internal/llm/retry.d.ts +22 -0
- package/dist/internal/llm/types.d.ts +47 -1
- package/dist/internal/memory/active-memory-cache.d.ts +3 -3
- package/dist/internal/memory/active-memory-types.d.ts +8 -0
- package/dist/internal/memory/active-memory.d.ts +24 -20
- package/dist/internal/memory/adapters/azure-openai-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/cohere-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/gemini-embedding.d.ts +2 -0
- package/dist/internal/memory/adapters/jina-embedding.d.ts +2 -0
- package/dist/internal/memory/index-manager-contract.d.ts +26 -0
- package/dist/internal/memory/index-manager-dispatch.d.ts +1 -1
- package/dist/internal/memory/index-manager.d.ts +8 -26
- package/dist/internal/memory/{chunk-markdown.d.ts → storage/chunk-markdown.d.ts} +1 -1
- package/dist/internal/memory/{markdown-store.d.ts → storage/markdown-store.d.ts} +1 -1
- package/dist/internal/memory/{reader.d.ts → storage/reader.d.ts} +1 -1
- package/dist/internal/observability/context.d.cts +23 -0
- package/dist/internal/observability/context.d.ts +23 -0
- package/dist/internal/observability/index.cjs +38 -0
- package/dist/internal/observability/index.cjs.map +1 -0
- package/dist/internal/observability/index.d.cts +8 -0
- package/dist/internal/observability/index.d.ts +8 -0
- package/dist/internal/observability/index.js +33 -0
- package/dist/internal/observability/index.js.map +1 -0
- package/dist/internal/observability/tracer-loader.d.cts +20 -0
- package/dist/internal/persistence/conversation-storage-fs.d.cts +37 -0
- package/dist/internal/persistence/conversation-storage-memory.d.cts +24 -0
- package/dist/internal/persistence/credential-pool-store.d.cts +32 -0
- package/dist/internal/persistence/credential-pool-store.d.ts +32 -0
- package/dist/internal/persistence/cwd-mutex.d.cts +1 -0
- package/dist/internal/persistence/exclusive-create.d.cts +22 -0
- package/dist/internal/persistence/exclusive-create.d.ts +22 -0
- package/dist/internal/persistence/file-lock.d.cts +14 -0
- package/dist/internal/persistence/fts5-sanitize.d.cts +16 -0
- package/dist/internal/persistence/index.cjs +359 -0
- package/dist/internal/persistence/index.cjs.map +1 -0
- package/dist/internal/persistence/index.d.cts +20 -0
- package/dist/internal/persistence/index.d.ts +20 -0
- package/dist/internal/persistence/index.js +341 -0
- package/dist/internal/persistence/index.js.map +1 -0
- package/dist/internal/persistence/markdown-config-loader.d.cts +35 -0
- package/dist/internal/persistence/paths.d.cts +19 -0
- package/dist/internal/persistence/persistence-schema.d.cts +21 -0
- package/dist/internal/persistence/persistence-schema.d.ts +4 -0
- package/dist/internal/persistence/schema-version.d.cts +13 -0
- package/dist/internal/persistence/sqlite-cas.d.cts +25 -0
- package/dist/internal/persistence/sqlite-cas.d.ts +25 -0
- package/dist/internal/persistence/sqlite-wal.d.cts +10 -0
- package/dist/internal/plugins/context.d.cts +31 -0
- package/dist/internal/plugins/index.cjs +228 -0
- package/dist/internal/plugins/index.cjs.map +1 -0
- package/dist/internal/plugins/index.d.cts +8 -0
- package/dist/internal/plugins/index.d.ts +8 -0
- package/dist/internal/plugins/index.js +222 -0
- package/dist/internal/plugins/index.js.map +1 -0
- package/dist/internal/plugins/lifecycle.d.cts +14 -0
- package/dist/internal/plugins/lifecycle.d.ts +14 -0
- package/dist/internal/plugins/manager.d.cts +37 -0
- package/dist/internal/plugins/types.d.cts +102 -0
- package/dist/internal/providers/catalog-loader.d.ts +39 -0
- package/dist/internal/runtime/agent-session-store.d.ts +1 -1
- package/dist/internal/runtime/agent-session.d.ts +1 -0
- package/dist/internal/runtime/budget-tracker.d.ts +73 -0
- package/dist/internal/runtime/{context-manager.d.ts → context/context-manager.d.ts} +1 -1
- package/dist/internal/runtime/{fixture-events.d.ts → fixtures/fixture-events.d.ts} +1 -1
- package/dist/internal/runtime/{fixture-run-base.d.ts → fixtures/fixture-run-base.d.ts} +4 -4
- package/dist/internal/runtime/{fixture-scripts.d.ts → fixtures/fixture-scripts.d.ts} +1 -1
- package/dist/internal/runtime/local-agent-bootstrap.d.ts +2 -2
- package/dist/internal/runtime/local-agent-memory-provider.d.ts +57 -0
- package/dist/internal/runtime/memory-path-selector.d.ts +73 -0
- package/dist/internal/runtime/memory-provider.d.ts +165 -0
- package/dist/internal/runtime/{agent-registry.d.ts → registry/agent-registry-contract.d.ts} +15 -9
- package/dist/internal/runtime/registry/agent-registry.d.ts +7 -0
- package/dist/internal/runtime/{live-agent-registry.d.ts → registry/live-agent-registry.d.ts} +1 -1
- package/dist/internal/runtime/{run-registry.d.ts → registry/run-registry.d.ts} +1 -1
- package/dist/internal/runtime/session-types.d.ts +35 -0
- package/dist/internal/runtime/system-prompt/sources/skills-provider.d.ts +1 -0
- package/dist/internal/runtime/validate-response.d.ts +18 -0
- package/dist/internal/security/index.cjs +361 -0
- package/dist/internal/security/index.cjs.map +1 -0
- package/dist/internal/security/index.d.cts +11 -0
- package/dist/internal/security/index.js +350 -0
- package/dist/internal/security/index.js.map +1 -0
- package/dist/internal/security/path-guard.d.cts +59 -0
- package/dist/internal/security/path-guard.d.ts +3 -0
- package/dist/internal/security/redact.d.cts +21 -0
- package/dist/internal/security/secret-redactor.d.cts +1 -0
- package/dist/internal/security/secret-redactor.d.ts +1 -0
- package/dist/internal/security/test-reset.d.cts +10 -0
- package/dist/internal/security/test-reset.d.ts +10 -0
- package/dist/internal/telemetry/adapters/arize.d.ts +2 -0
- package/dist/internal/telemetry/adapters/braintrust.d.ts +2 -0
- package/dist/internal/telemetry/adapters/datadog.d.ts +2 -0
- package/dist/internal/telemetry/adapters/langsmith.d.ts +2 -0
- package/dist/internal/telemetry/span-names.d.ts +6 -0
- package/dist/internal/telemetry/tracer.d.ts +1 -0
- package/dist/internal/workflow/evented-executor.d.ts +42 -0
- package/dist/internal/workflow/scheduler.d.ts +23 -0
- package/dist/internal/zod/to-json-schema.d.ts +5 -15
- package/dist/job-queue.d.ts +28 -0
- package/dist/path-safety.cjs +67 -6
- package/dist/path-safety.cjs.map +1 -1
- package/dist/path-safety.d.cts +15 -0
- package/dist/path-safety.d.ts +1 -1
- package/dist/path-safety.js +67 -7
- package/dist/path-safety.js.map +1 -1
- package/dist/permission-engine.d.ts +21 -0
- package/dist/provider-catalog.json +702 -0
- package/dist/rag/index.cjs +136 -0
- package/dist/rag/index.cjs.map +1 -0
- package/dist/rag/index.d.cts +11 -0
- package/dist/rag/index.d.ts +11 -0
- package/dist/rag/index.js +129 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/reranker.d.cts +26 -0
- package/dist/rag/reranker.d.ts +26 -0
- package/dist/rag/retriever.d.cts +25 -0
- package/dist/rag/retriever.d.ts +25 -0
- package/dist/rag/text-splitter.d.cts +12 -0
- package/dist/rag/text-splitter.d.ts +12 -0
- package/dist/rag/types.d.cts +37 -0
- package/dist/rag/types.d.ts +37 -0
- package/dist/run-DrwUpFxZ.d.cts +823 -0
- package/dist/run-DrwUpFxZ.d.ts +823 -0
- package/dist/sandbox/index.cjs +133 -0
- package/dist/sandbox/index.cjs.map +1 -0
- package/dist/sandbox/index.d.cts +2 -0
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.js +128 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/local-sandbox.d.cts +17 -0
- package/dist/sandbox/local-sandbox.d.ts +17 -0
- package/dist/sandbox/types.d.cts +44 -0
- package/dist/sandbox/types.d.ts +44 -0
- package/dist/server/adapter/express.d.cts +9 -0
- package/dist/server/adapter/express.d.ts +9 -0
- package/dist/server/adapter/fastify.d.cts +9 -0
- package/dist/server/adapter/fastify.d.ts +9 -0
- package/dist/server/adapter/hono.d.cts +9 -0
- package/dist/server/adapter/hono.d.ts +9 -0
- package/dist/server/adapter/index.d.cts +8 -0
- package/dist/server/adapter/index.d.ts +8 -0
- package/dist/server/adapter/shared-handler.d.cts +9 -0
- package/dist/server/adapter/shared-handler.d.ts +9 -0
- package/dist/server/adapter/types.d.cts +33 -0
- package/dist/server/adapter/types.d.ts +33 -0
- package/dist/server/auth/errors.d.cts +53 -0
- package/dist/server/auth/errors.d.ts +53 -0
- package/dist/server/auth/index.cjs +38 -41
- package/dist/server/auth/index.cjs.map +1 -1
- package/dist/server/auth/index.d.cts +11 -172
- package/dist/server/auth/index.d.ts +11 -172
- package/dist/server/auth/index.js +39 -42
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/oauth-transaction-store.d.cts +39 -0
- package/dist/server/auth/oauth-transaction-store.d.ts +39 -0
- package/dist/server/auth/orchestrator.d.cts +8 -0
- package/dist/server/auth/orchestrator.d.ts +8 -0
- package/dist/server/auth/types.d.cts +91 -0
- package/dist/server/auth/types.d.ts +91 -0
- package/dist/server/auth/validate-return-to.d.cts +17 -0
- package/dist/server/auth/validate-return-to.d.ts +17 -0
- package/dist/server/errors-envelope.cjs +409 -0
- package/dist/server/errors-envelope.cjs.map +1 -0
- package/dist/server/errors-envelope.d.cts +61 -0
- package/dist/server/errors-envelope.d.ts +61 -0
- package/dist/server/errors-envelope.js +405 -0
- package/dist/server/errors-envelope.js.map +1 -0
- package/dist/subscription/define-subscription.d.cts +63 -0
- package/dist/subscription/define-subscription.d.ts +63 -0
- package/dist/subscription/index.cjs +402 -0
- package/dist/subscription/index.cjs.map +1 -0
- package/dist/subscription/index.d.cts +18 -0
- package/dist/subscription/index.d.ts +18 -0
- package/dist/subscription/index.js +394 -0
- package/dist/subscription/index.js.map +1 -0
- package/dist/subscription/internal/adapter-types.d.cts +11 -0
- package/dist/subscription/internal/adapter-types.d.ts +11 -0
- package/dist/subscription/internal/backpressure.d.cts +24 -0
- package/dist/subscription/internal/backpressure.d.ts +24 -0
- package/dist/subscription/internal/server-integration.d.cts +17 -0
- package/dist/subscription/internal/server-integration.d.ts +17 -0
- package/dist/subscription/internal/sse-encoder.d.cts +13 -0
- package/dist/subscription/internal/sse-encoder.d.ts +13 -0
- package/dist/subscription/internal/sse-parser.d.cts +15 -0
- package/dist/subscription/internal/sse-parser.d.ts +15 -0
- package/dist/subscription/internal/subscription-runtime.d.cts +9 -0
- package/dist/subscription/internal/subscription-runtime.d.ts +9 -0
- package/dist/subscription/internal/ws-adapter-node.d.cts +10 -0
- package/dist/subscription/internal/ws-adapter-node.d.ts +10 -0
- package/dist/subscription/theokit-subscribe.d.cts +41 -0
- package/dist/subscription/theokit-subscribe.d.ts +41 -0
- package/dist/subscription/types.d.cts +140 -0
- package/dist/subscription/types.d.ts +140 -0
- package/dist/task-store.cjs +30 -2
- package/dist/task-store.cjs.map +1 -1
- package/dist/task-store.d.cts +8 -0
- package/dist/task-store.js +31 -3
- package/dist/task-store.js.map +1 -1
- package/dist/types/agent-prims.d.ts +61 -0
- package/dist/types/agent.d.ts +48 -53
- package/dist/types/conversation.d.ts +20 -8
- package/dist/types/index.d.ts +0 -2
- package/dist/types/messages-base.d.ts +20 -0
- package/dist/types/messages.d.ts +1 -1
- package/dist/types/run.d.ts +1 -1
- package/dist/types/updates.d.ts +1 -1
- package/dist/voice/index.d.ts +7 -0
- package/dist/voice/openai-realtime.d.ts +21 -0
- package/dist/voice/types.d.ts +35 -0
- package/dist/workflow.cjs +179 -88
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +97 -0
- package/dist/workflow.js +180 -89
- package/dist/workflow.js.map +1 -1
- package/package.json +128 -25
- package/dist/budget.d.ts +0 -48
- package/dist/cache.d.ts +0 -74
- package/dist/cron-1yxL3K2S.d.cts +0 -221
- package/dist/cron-BYVdYzob.d.ts +0 -221
- package/dist/handoff.d.ts +0 -55
- package/dist/internal/budget/calendar-window.d.ts +0 -19
- package/dist/internal/budget/enforcement.d.ts +0 -32
- package/dist/internal/budget/ledger.d.ts +0 -25
- package/dist/internal/budget/normalize-usage.d.ts +0 -27
- package/dist/internal/budget/registry.d.ts +0 -16
- package/dist/internal/cache/cosine.d.ts +0 -14
- package/dist/internal/cache/embed-helper.d.ts +0 -15
- package/dist/internal/cache/key.d.ts +0 -15
- package/dist/internal/cache/lookup.d.ts +0 -28
- package/dist/internal/cache/store-handler.d.ts +0 -24
- package/dist/internal/cache/store-json.d.ts +0 -48
- package/dist/internal/cache/store.d.ts +0 -54
- package/dist/internal/cache/telemetry.d.ts +0 -20
- package/dist/internal/cache/ttl.d.ts +0 -11
- package/dist/internal/catalog/fixtures.d.ts +0 -16
- package/dist/internal/catalog/local-models.d.ts +0 -24
- package/dist/internal/handoff/dispatcher.d.ts +0 -29
- package/dist/internal/handoff/registry.d.ts +0 -23
- package/dist/internal/handoff/telemetry.d.ts +0 -18
- package/dist/internal/handoff/tool-injector.d.ts +0 -34
- package/dist/internal/memory/atomic-write.d.ts +0 -7
- package/dist/internal/memory/dreaming/diary.d.ts +0 -4
- package/dist/internal/memory/dreaming/phases.d.ts +0 -15
- package/dist/internal/memory/dreaming/run.d.ts +0 -10
- package/dist/internal/memory/migrate-sqlite-to-lance.d.ts +0 -15
- package/dist/memory-adapter-helpers.d.ts +0 -28
- package/dist/memory.d.ts +0 -123
- package/dist/migrate.d.ts +0 -33
- package/dist/security.d.ts +0 -67
- package/dist/task.d.ts +0 -87
- package/dist/theokit.d.ts +0 -84
- package/dist/tools/_path-scope.d.ts +0 -8
- package/dist/tools/_subprocess.d.ts +0 -28
- package/dist/tools/git-diff.d.ts +0 -22
- package/dist/tools/index.d.ts +0 -29
- package/dist/tools/list-dir.d.ts +0 -26
- package/dist/tools/read-file.d.ts +0 -31
- package/dist/tools/run-vitest.d.ts +0 -46
- package/dist/tools/search-text.d.ts +0 -32
- package/dist/tools.cjs +0 -690
- package/dist/tools.cjs.map +0 -1
- package/dist/tools.js +0 -683
- package/dist/tools.js.map +0 -1
- package/dist/trajectory-helpers.d.ts +0 -31
- package/dist/types/cache.d.ts +0 -76
- package/dist/types/handoff.d.ts +0 -135
- /package/dist/{internal/cron/run-job.d.ts → agent-helpers.d.ts} +0 -0
- /package/dist/internal/{cron/scheduler.d.ts → agent-loop/loop-llm-stream.d.ts} +0 -0
- /package/dist/internal/{cron/store.d.ts → agent-loop/tool-executors.d.ts} +0 -0
- /package/dist/internal/{cron/validate.d.ts → memory/index-manager-helpers.d.ts} +0 -0
- /package/dist/internal/memory/{session-loader.d.ts → storage/session-loader.d.ts} +0 -0
- /package/dist/internal/memory/{session-summary-writer.d.ts → storage/session-summary-writer.d.ts} +0 -0
- /package/dist/internal/memory/{transcript-store.d.ts → storage/transcript-store.d.ts} +0 -0
- /package/dist/internal/memory/{wiki-loader.d.ts → storage/wiki-loader.d.ts} +0 -0
- /package/dist/internal/{memory/cwd-mutex.d.ts → persistence/atomic-write.d.cts} +0 -0
- /package/dist/internal/runtime/{context-aggregator.d.ts → context/context-aggregator.d.ts} +0 -0
- /package/dist/internal/runtime/{context-discovery-runner.d.ts → context/context-discovery-runner.d.ts} +0 -0
- /package/dist/internal/runtime/{context-discovery.d.ts → context/context-discovery.d.ts} +0 -0
- /package/dist/internal/runtime/{context-frontmatter.d.ts → context/context-frontmatter.d.ts} +0 -0
- /package/dist/internal/runtime/{context-import-resolver.d.ts → context/context-import-resolver.d.ts} +0 -0
- /package/dist/internal/runtime/{context-loaders.d.ts → context/context-loaders.d.ts} +0 -0
- /package/dist/internal/runtime/{context-mdc-parser.d.ts → context/context-mdc-parser.d.ts} +0 -0
- /package/dist/internal/runtime/{fixture-responder.d.ts → fixtures/fixture-responder.d.ts} +0 -0
- /package/dist/internal/runtime/{fixture-types.d.ts → fixtures/fixture-types.d.ts} +0 -0
- /package/dist/internal/runtime/{plugins-manager.d.ts → local-agent-send.d.ts} +0 -0
- /package/dist/internal/runtime/{plugin-frontmatter.d.ts → plugins/plugin-frontmatter.d.ts} +0 -0
- /package/dist/internal/runtime/{system-prompt/providers/active-memory-provider.d.ts → plugins/plugins-manager.d.ts} +0 -0
- /package/dist/internal/runtime/{agent-factory-registry.d.ts → registry/agent-factory-registry.d.ts} +0 -0
- /package/dist/internal/runtime/{agent-registry-store.d.ts → registry/agent-registry-store.d.ts} +0 -0
- /package/dist/internal/runtime/system-prompt/{providers/base-provider.d.ts → sources/active-memory-provider.d.ts} +0 -0
- /package/dist/internal/runtime/system-prompt/{providers/context-provider.d.ts → sources/base-provider.d.ts} +0 -0
- /package/dist/internal/runtime/system-prompt/{providers/memory-provider.d.ts → sources/context-provider.d.ts} +0 -0
- /package/dist/internal/runtime/system-prompt/{providers/skills-provider.d.ts → sources/memory-provider.d.ts} +0 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
---
|
|
2
|
+
user-invocable: false
|
|
3
|
+
description: RAG primitives -- VectorRetriever, CohereReranker, text splitters from @theokit/sdk/rag.
|
|
4
|
+
paths:
|
|
5
|
+
- "**/*retriev*"
|
|
6
|
+
- "**/*rerank*"
|
|
7
|
+
- "**/*splitter*"
|
|
8
|
+
- "**/*rag*"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TheoKit SDK -- RAG
|
|
12
|
+
|
|
13
|
+
Quick reference for the RAG (Retrieval-Augmented Generation) sub-path at `@theokit/sdk/rag`.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
The RAG module ships with `@theokit/sdk` -- no additional install needed.
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import {
|
|
21
|
+
VectorRetriever,
|
|
22
|
+
CohereReranker,
|
|
23
|
+
NoopReranker,
|
|
24
|
+
splitByCharacter,
|
|
25
|
+
splitBySentence,
|
|
26
|
+
splitRecursive,
|
|
27
|
+
} from "@theokit/sdk/rag";
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Types
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
interface Document {
|
|
34
|
+
id: string;
|
|
35
|
+
text: string;
|
|
36
|
+
metadata?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface Chunk {
|
|
40
|
+
text: string;
|
|
41
|
+
index: number;
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface RetrievalResult {
|
|
46
|
+
text: string;
|
|
47
|
+
score: number;
|
|
48
|
+
metadata?: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface RankedChunk {
|
|
52
|
+
text: string;
|
|
53
|
+
score: number;
|
|
54
|
+
originalIndex: number;
|
|
55
|
+
metadata?: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface SplitOptions {
|
|
59
|
+
chunkSize: number;
|
|
60
|
+
overlap?: number;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Interfaces
|
|
65
|
+
|
|
66
|
+
### Retriever
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
interface Retriever {
|
|
70
|
+
retrieve(query: string, options?: { topK?: number }): Promise<RetrievalResult[]>;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Reranker
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
interface Reranker {
|
|
78
|
+
rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## VectorRetriever
|
|
83
|
+
|
|
84
|
+
Wraps any index that implements `search(query, topK)`.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
interface VectorIndex {
|
|
88
|
+
search(query: string, topK: number): Promise<RetrievalResult[]>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface VectorRetrieverOptions {
|
|
92
|
+
index: VectorIndex;
|
|
93
|
+
topK?: number; // default 5
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Usage:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import { VectorRetriever } from "@theokit/sdk/rag";
|
|
101
|
+
|
|
102
|
+
const retriever = new VectorRetriever({
|
|
103
|
+
index: myVectorIndex,
|
|
104
|
+
topK: 10,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const results = await retriever.retrieve("How does auth work?");
|
|
108
|
+
// results: RetrievalResult[] sorted by relevance
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The `VectorIndex` interface is the DI boundary. Consumers depend on the interface; implementations (e.g., backed by Memory's SQLite-vec or LanceDB index) depend on the index adapter.
|
|
112
|
+
|
|
113
|
+
## CohereReranker
|
|
114
|
+
|
|
115
|
+
Calls the Cohere Rerank v2 API to re-score retrieval results by relevance.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
interface CohereRerankerOptions {
|
|
119
|
+
apiKey: string;
|
|
120
|
+
model?: string; // default "rerank-v3.5"
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Usage:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
import { CohereReranker } from "@theokit/sdk/rag";
|
|
128
|
+
|
|
129
|
+
const reranker = new CohereReranker({
|
|
130
|
+
apiKey: process.env.COHERE_API_KEY!,
|
|
131
|
+
model: "rerank-v3.5",
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const ranked = await reranker.rerank("auth middleware", retrievalResults);
|
|
135
|
+
// ranked: RankedChunk[] re-scored by Cohere
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## NoopReranker
|
|
139
|
+
|
|
140
|
+
Passes through results unchanged. Useful as a baseline or when reranking is not needed.
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import { NoopReranker } from "@theokit/sdk/rag";
|
|
144
|
+
|
|
145
|
+
const reranker = new NoopReranker();
|
|
146
|
+
const ranked = await reranker.rerank(query, results);
|
|
147
|
+
// ranked === results (with originalIndex added)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Text splitters
|
|
151
|
+
|
|
152
|
+
Three strategies for splitting documents into chunks. All return `Chunk[]` with `text` and `index`. Empty input returns an empty array.
|
|
153
|
+
|
|
154
|
+
### splitByCharacter
|
|
155
|
+
|
|
156
|
+
Fixed-size character windows with optional overlap.
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import { splitByCharacter } from "@theokit/sdk/rag";
|
|
160
|
+
|
|
161
|
+
const chunks = splitByCharacter(longText, { chunkSize: 500, overlap: 50 });
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### splitBySentence
|
|
165
|
+
|
|
166
|
+
Groups sentences into chunks up to `chunkSize` characters.
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { splitBySentence } from "@theokit/sdk/rag";
|
|
170
|
+
|
|
171
|
+
const chunks = splitBySentence(longText, { chunkSize: 500 });
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Splits on sentence boundaries (`.`, `!`, `?` followed by whitespace). Sentences are never broken mid-sentence.
|
|
175
|
+
|
|
176
|
+
### splitRecursive
|
|
177
|
+
|
|
178
|
+
Three-level cascading split: paragraph, then sentence, then character.
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { splitRecursive } from "@theokit/sdk/rag";
|
|
182
|
+
|
|
183
|
+
const chunks = splitRecursive(longText, { chunkSize: 500, overlap: 50 });
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Algorithm:
|
|
187
|
+
1. Split by double newlines (paragraphs).
|
|
188
|
+
2. Paragraphs that exceed `chunkSize` are split by sentence.
|
|
189
|
+
3. Sentences that still exceed `chunkSize` are split by character.
|
|
190
|
+
|
|
191
|
+
This is the recommended default for most RAG use cases.
|
|
192
|
+
|
|
193
|
+
## Full RAG pipeline example
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import { VectorRetriever, CohereReranker, splitRecursive } from "@theokit/sdk/rag";
|
|
197
|
+
|
|
198
|
+
// 1. Split documents
|
|
199
|
+
const chunks = splitRecursive(documentText, { chunkSize: 500, overlap: 50 });
|
|
200
|
+
|
|
201
|
+
// 2. Index chunks (your vector store)
|
|
202
|
+
await vectorStore.upsert(chunks.map((c, i) => ({
|
|
203
|
+
id: `doc-${i}`,
|
|
204
|
+
text: c.text,
|
|
205
|
+
embedding: await embed(c.text),
|
|
206
|
+
})));
|
|
207
|
+
|
|
208
|
+
// 3. Retrieve
|
|
209
|
+
const retriever = new VectorRetriever({ index: vectorStore, topK: 20 });
|
|
210
|
+
const results = await retriever.retrieve(userQuery);
|
|
211
|
+
|
|
212
|
+
// 4. Rerank
|
|
213
|
+
const reranker = new CohereReranker({ apiKey: process.env.COHERE_API_KEY! });
|
|
214
|
+
const ranked = await reranker.rerank(userQuery, results);
|
|
215
|
+
|
|
216
|
+
// 5. Use top results as agent context
|
|
217
|
+
const context = ranked.slice(0, 5).map((r) => r.text).join("\n\n");
|
|
218
|
+
const agent = await Agent.create({
|
|
219
|
+
systemPrompt: `Use this context:\n${context}`,
|
|
220
|
+
// ...
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## DI integration
|
|
225
|
+
|
|
226
|
+
Use `@Retriever` and `@Reranker` decorators from `@theokit/di-agent` to register RAG components in the DI container. See the theokit-di-agent skill for details.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
user-invocable: false
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*stream*"
|
|
5
|
+
- "**/*Stream*"
|
|
6
|
+
- "**/*SDKMessage*"
|
|
7
|
+
description: TheoKit SDK streaming reference — Run.stream(), SDKMessage union, streamObject, generateObject
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# TheoKit Streaming
|
|
11
|
+
|
|
12
|
+
## `Run.stream()` — SDKMessage events
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
const run = await agent.send("Find the bug in src/auth.ts");
|
|
16
|
+
for await (const event of run.stream()) {
|
|
17
|
+
switch (event.type) {
|
|
18
|
+
case "assistant":
|
|
19
|
+
for (const block of event.message.content) {
|
|
20
|
+
if (block.type === "text") process.stdout.write(block.text);
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
case "thinking":
|
|
24
|
+
process.stdout.write(event.text);
|
|
25
|
+
break;
|
|
26
|
+
case "tool_call":
|
|
27
|
+
console.log(`[tool] ${event.name}: ${event.status}`);
|
|
28
|
+
break;
|
|
29
|
+
case "status":
|
|
30
|
+
console.log(`[status] ${event.status}`);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## SDKMessage discriminated union
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
type SDKMessage =
|
|
40
|
+
| SDKSystemMessage // "system" — init metadata, emitted once
|
|
41
|
+
| SDKUserMessageEvent // "user" — echo of user prompt
|
|
42
|
+
| SDKAssistantMessage // "assistant" — model text output
|
|
43
|
+
| SDKThinkingMessage // "thinking" — reasoning content
|
|
44
|
+
| SDKToolUseMessage // "tool_call" — tool invocation lifecycle
|
|
45
|
+
| SDKStatusMessage // "status" — cloud run transitions
|
|
46
|
+
| SDKTaskMessage // "task" — task milestones/summaries
|
|
47
|
+
| SDKRequestMessage; // "request" — awaiting user input
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
All events include `agent_id` and `run_id`.
|
|
51
|
+
|
|
52
|
+
### Key message types
|
|
53
|
+
|
|
54
|
+
| Type | Key fields |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `"system"` | `subtype?: "init"`, `model?`, `tools?` |
|
|
57
|
+
| `"assistant"` | `message.content: (TextBlock \| ToolUseBlock)[]` |
|
|
58
|
+
| `"thinking"` | `text`, `thinking_duration_ms?` |
|
|
59
|
+
| `"tool_call"` | `call_id`, `name`, `status`, `args?`, `result?`, `truncated?` |
|
|
60
|
+
| `"status"` | `status: "CREATING" \| "RUNNING" \| "FINISHED" \| ...` |
|
|
61
|
+
|
|
62
|
+
`tool_call` is emitted twice: once with `status: "running"` + `args`, then
|
|
63
|
+
again on completion with `status: "completed"` or `"error"` + `result`.
|
|
64
|
+
|
|
65
|
+
## Raw deltas — `onDelta` callback
|
|
66
|
+
|
|
67
|
+
For per-token streaming, pass `onDelta` to `agent.send()`:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const run = await agent.send("Refactor the utils module", {
|
|
71
|
+
onDelta: ({ update }) => {
|
|
72
|
+
if (update.type === "text-delta") process.stdout.write(update.text);
|
|
73
|
+
if (update.type === "thinking-delta") process.stdout.write(update.text);
|
|
74
|
+
},
|
|
75
|
+
onStep: ({ step }) => {
|
|
76
|
+
console.log(`[step] ${step.type}`);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### InteractionUpdate types
|
|
82
|
+
|
|
83
|
+
`text-delta`, `thinking-delta`, `thinking-completed`, `tool-call-started`,
|
|
84
|
+
`tool-call-completed`, `partial-tool-call`, `token-delta`, `step-started`,
|
|
85
|
+
`step-completed`, `turn-ended`, `summary`, `shell-output-delta`.
|
|
86
|
+
|
|
87
|
+
`turn-ended` includes token usage:
|
|
88
|
+
```typescript
|
|
89
|
+
{ inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens }
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## `Agent.generateObject()` — structured output
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { z } from "zod";
|
|
96
|
+
import { Agent } from "@theokit/sdk";
|
|
97
|
+
|
|
98
|
+
const { object, raw, usage, finishReason } = await Agent.generateObject({
|
|
99
|
+
schema: z.object({
|
|
100
|
+
title: z.string().min(1),
|
|
101
|
+
summary: z.string(),
|
|
102
|
+
year: z.number().nullable(),
|
|
103
|
+
}),
|
|
104
|
+
prompt: "Produce a fact card about: Brazilian samba.",
|
|
105
|
+
model: { id: "google/gemini-2.0-flash-001" },
|
|
106
|
+
local: { cwd: process.cwd(), sandboxOptions: { enabled: false } },
|
|
107
|
+
apiKey: process.env.THEOKIT_API_KEY,
|
|
108
|
+
maxRetries: 1,
|
|
109
|
+
});
|
|
110
|
+
// object is fully typed: z.infer<typeof schema>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Throws `GenerateObjectError` with `code: "no_tool_call" | "parse_failed"`.
|
|
114
|
+
|
|
115
|
+
## `Agent.streamObject()` — streaming structured output (v1.2+)
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
for await (const evt of Agent.streamObject({
|
|
119
|
+
schema: FactCard,
|
|
120
|
+
prompt: "Produce a fact card about: jazz music.",
|
|
121
|
+
model: { id: "google/gemini-2.0-flash-001" },
|
|
122
|
+
apiKey: process.env.THEOKIT_API_KEY,
|
|
123
|
+
local: { cwd: process.cwd() },
|
|
124
|
+
})) {
|
|
125
|
+
if (evt.type === "partial") render(evt.partial);
|
|
126
|
+
if (evt.type === "complete") finalize(evt.object);
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### StreamObjectEvent
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
type StreamObjectEvent<T> =
|
|
134
|
+
| { type: "partial"; partial: DeepPartial<T>; attempt: number }
|
|
135
|
+
| { type: "complete"; object: T; raw: unknown; usage; finishReason };
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The `complete` event always fires (or the iterator throws `StreamObjectError`).
|
|
139
|
+
Partials are best-effort.
|
|
140
|
+
|
|
141
|
+
## Waiting without streaming
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const result = await run.wait();
|
|
145
|
+
console.log(result.status); // "finished" | "error" | "cancelled"
|
|
146
|
+
console.log(result.result); // final assistant text
|
|
147
|
+
console.log(result.durationMs);
|
|
148
|
+
console.log(result.git); // cloud: { branches: [{ repoUrl, branch?, prUrl? }] }
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Cancelling
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
await run.cancel();
|
|
155
|
+
// status moves to "cancelled", partial output preserved
|
|
156
|
+
```
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
user-invocable: false
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*subscri*"
|
|
5
|
+
- "**/*sse*"
|
|
6
|
+
- "**/*websocket*"
|
|
7
|
+
- "**/*ws.*"
|
|
8
|
+
description: TheoKit SDK Subscriptions API — defineSubscription, SSE/WebSocket transport, subscribe, tracked, resume tokens
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TheoKit Subscriptions
|
|
12
|
+
|
|
13
|
+
Typed WebSocket + W3C SSE subscriptions with opaque resume tokens. Available
|
|
14
|
+
via the `@theokit/sdk/subscription` sub-path import (not on the main barrel).
|
|
15
|
+
|
|
16
|
+
## Server side — `defineSubscription`
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { defineSubscription } from "@theokit/sdk/subscription";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
export default defineSubscription({
|
|
23
|
+
input: z.object({
|
|
24
|
+
room: z.string(),
|
|
25
|
+
lastEventId: z.string().optional(),
|
|
26
|
+
}),
|
|
27
|
+
output: z.object({
|
|
28
|
+
id: z.string(),
|
|
29
|
+
text: z.string(),
|
|
30
|
+
sender: z.string(),
|
|
31
|
+
ts: z.number(),
|
|
32
|
+
}),
|
|
33
|
+
async *handler(input, ctx) {
|
|
34
|
+
let cursor = input.lastEventId ?? "0";
|
|
35
|
+
while (!ctx.signal.aborted) {
|
|
36
|
+
const msgs = await fetchNewMessages(input.room, cursor);
|
|
37
|
+
for (const m of msgs) {
|
|
38
|
+
cursor = m.id;
|
|
39
|
+
yield ctx.tracked(m.id, {
|
|
40
|
+
id: m.id,
|
|
41
|
+
text: m.text,
|
|
42
|
+
sender: m.sender,
|
|
43
|
+
ts: m.ts,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
await sleep(1000);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### `ctx.tracked(id, payload)`
|
|
53
|
+
|
|
54
|
+
Advertises a resume token alongside the payload. The client receives the token
|
|
55
|
+
and echoes it back on reconnect via `lastEventId`. The token is **opaque to
|
|
56
|
+
the SDK** — the server handler decides its semantics:
|
|
57
|
+
|
|
58
|
+
- Monotonic int: `"42"` — resume after event 42
|
|
59
|
+
- ULID: `"01H9X..."` — resume after that ULID
|
|
60
|
+
- Encrypted cursor: consumer decrypts + decodes
|
|
61
|
+
- Timestamp: `"2026-06-04T15:00:00Z"` — resume after that moment
|
|
62
|
+
|
|
63
|
+
## Client side — `subscribe`
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
import { subscribe } from "@theokit/sdk/subscription";
|
|
67
|
+
|
|
68
|
+
for await (const msg of subscribe<
|
|
69
|
+
{ room: string },
|
|
70
|
+
{ id: string; text: string; sender: string; ts: number }
|
|
71
|
+
>(
|
|
72
|
+
"chat",
|
|
73
|
+
{ room: "lobby" },
|
|
74
|
+
{
|
|
75
|
+
baseUrl: "http://localhost:3000",
|
|
76
|
+
transport: "auto", // 'ws' | 'sse' | 'auto' (default)
|
|
77
|
+
maxReconnectAttempts: 10, // 0 disables reconnect
|
|
78
|
+
},
|
|
79
|
+
)) {
|
|
80
|
+
console.log(`[${msg.sender}] ${msg.text}`);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Transport selection
|
|
85
|
+
|
|
86
|
+
| Mode | When to use |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `'auto'` (default) | Prefer WS, fall back to SSE — works everywhere |
|
|
89
|
+
| `'ws'` | Strict bidirectional — error if WS unavailable |
|
|
90
|
+
| `'sse'` | Browser-native EventSource, no upgrade required |
|
|
91
|
+
|
|
92
|
+
## Composing with LLM streaming
|
|
93
|
+
|
|
94
|
+
`Agent.streamObject` and `defineSubscription` are independent surfaces. Call
|
|
95
|
+
`Agent.streamObject` inside a subscription handler:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
export default defineSubscription({
|
|
99
|
+
input: z.object({ topic: z.string() }),
|
|
100
|
+
output: z.object({ kind: z.enum(["partial", "complete"]), text: z.string() }),
|
|
101
|
+
async *handler(input, ctx) {
|
|
102
|
+
let counter = 0;
|
|
103
|
+
const iter = Agent.streamObject({
|
|
104
|
+
schema: z.object({ text: z.string() }),
|
|
105
|
+
prompt: `Write a haiku about ${input.topic}`,
|
|
106
|
+
model: { id: "openrouter/openai/gpt-4o-mini" },
|
|
107
|
+
apiKey: process.env.OPENROUTER_API_KEY,
|
|
108
|
+
local: { settingSources: [] },
|
|
109
|
+
});
|
|
110
|
+
for await (const evt of iter) {
|
|
111
|
+
if (evt.type === "partial") {
|
|
112
|
+
yield ctx.tracked(String(++counter), {
|
|
113
|
+
kind: "partial",
|
|
114
|
+
text: JSON.stringify(evt.partial),
|
|
115
|
+
});
|
|
116
|
+
} else if (evt.type === "complete") {
|
|
117
|
+
yield ctx.tracked(String(++counter), {
|
|
118
|
+
kind: "complete",
|
|
119
|
+
text: evt.object.text,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Multi-runtime support
|
|
128
|
+
|
|
129
|
+
| Runtime | v1.7.0 | v1.8.x (planned) |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| Node 22+ | Yes (`ws` optional peer) | Yes |
|
|
132
|
+
| Cloudflare Workers | Consumer-supplied `WsAdapter` only | `@theokit/sdk-ws-cloudflare` |
|
|
133
|
+
| Bun | Consumer-supplied `WsAdapter` only | `@theokit/sdk-ws-bun` |
|
|
134
|
+
| Deno | Consumer-supplied `WsAdapter` only | `@theokit/sdk-ws-deno` |
|
|
135
|
+
|
|
136
|
+
## Security checklist
|
|
137
|
+
|
|
138
|
+
1. Authenticate WS upgrade via the request object — auth runs BEFORE upgrade
|
|
139
|
+
2. Validate input via Zod schema (done by SDK automatically)
|
|
140
|
+
3. Bind resume tokens to session when token leakage allows replay
|
|
141
|
+
4. Force-close on session revocation via `ctx.disconnect(code, reason)`
|
|
142
|
+
5. Never log payloads — telemetry captures `{subscriptionName, lastEventId}` only
|
|
143
|
+
|
|
144
|
+
## Why sub-path import?
|
|
145
|
+
|
|
146
|
+
`@theokit/sdk/subscription` is a dedicated entry point to isolate the
|
|
147
|
+
subscription module from the main `index.ts` DTS bundle. Once the internal
|
|
148
|
+
rollup-dts cycle is resolved, `Theokit.subscribe` can be promoted additively.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
user-invocable: false
|
|
3
|
+
description: Custom tools, defineTool with Zod schemas, and built-in coding tools for @theokit/sdk.
|
|
4
|
+
paths:
|
|
5
|
+
- "**/*tool*"
|
|
6
|
+
- "**/*Tool*"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# TheoKit SDK -- Tools
|
|
10
|
+
|
|
11
|
+
Quick reference for custom inline tools and built-in coding tools.
|
|
12
|
+
|
|
13
|
+
## defineTool (type-safe builder)
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
import { defineTool } from "@theokit/sdk";
|
|
18
|
+
|
|
19
|
+
const rollTool = defineTool({
|
|
20
|
+
name: "roll",
|
|
21
|
+
description: "Roll N dice with S sides each.",
|
|
22
|
+
inputSchema: z.object({
|
|
23
|
+
count: z.number().int().min(1).max(100),
|
|
24
|
+
sides: z.number().int().min(2).max(1000),
|
|
25
|
+
}),
|
|
26
|
+
handler: ({ count, sides }) => {
|
|
27
|
+
const rolls = Array.from({ length: count }, () => 1 + Math.floor(Math.random() * sides));
|
|
28
|
+
return JSON.stringify({ rolls, total: rolls.reduce((a, b) => a + b, 0) });
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Requires `zod` as a peer dependency. Converts Zod schema to JSON Schema for the LLM. Runtime `schema.parse` validates input before the handler runs. Invalid input becomes `tool_result(isError)` with a Zod message.
|
|
34
|
+
|
|
35
|
+
### DefineToolSpec
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
interface DefineToolSpec<T extends ZodType> {
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
inputSchema: T;
|
|
42
|
+
handler: (input: z.infer<T>) => string | Promise<string>;
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## CustomTool (raw interface)
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
interface CustomTool {
|
|
50
|
+
name: string; // /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/
|
|
51
|
+
description: string;
|
|
52
|
+
inputSchema: Record<string, unknown>; // JSON Schema, type: "object"
|
|
53
|
+
handler: (input: Record<string, unknown>) => string | Promise<string>;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Reserved names (rejected at create time)
|
|
58
|
+
|
|
59
|
+
`shell`, `memory_search`, `memory_get`, anything prefixed with `mcp_`.
|
|
60
|
+
|
|
61
|
+
### Constraints
|
|
62
|
+
|
|
63
|
+
- **Local runtime only.** Cloud agents throw `ConfigurationError(code: "cloud_custom_tools_rejected")` when `tools.length > 0`.
|
|
64
|
+
- **Not persisted.** Handlers are in-memory closures. Re-pass tools on `Agent.resume`.
|
|
65
|
+
|
|
66
|
+
## Registering tools with agents
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
const agent = await Agent.create({
|
|
70
|
+
apiKey: process.env.THEOKIT_API_KEY!,
|
|
71
|
+
model: { id: "google/gemini-2.0-flash-001" },
|
|
72
|
+
local: { cwd: process.cwd() },
|
|
73
|
+
tools: [rollTool, lookupTool],
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Per-send tool override
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
await agent.send("Use only the calculator.", {
|
|
81
|
+
tools: [calculatorTool], // fully replaces agent-level tools for this run
|
|
82
|
+
});
|
|
83
|
+
// tools: undefined -> fall back to agent tools
|
|
84
|
+
// tools: [] -> no custom tools for this run
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Built-in coding tools (`@theokit/sdk/tools`)
|
|
88
|
+
|
|
89
|
+
Drop-in toolkit for coding agents. All tools are project-scoped and refuse sensitive files.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { createAgentFactory } from "@theokit/sdk";
|
|
93
|
+
import {
|
|
94
|
+
createReadFileTool,
|
|
95
|
+
createListDirTool,
|
|
96
|
+
createSearchTextTool,
|
|
97
|
+
createGitDiffTool,
|
|
98
|
+
createRunVitestTool,
|
|
99
|
+
} from "@theokit/sdk/tools";
|
|
100
|
+
|
|
101
|
+
const projectRoot = process.cwd();
|
|
102
|
+
const factory = createAgentFactory({
|
|
103
|
+
apiKey: process.env.ANTHROPIC_API_KEY!,
|
|
104
|
+
model: { id: "claude-sonnet-4-6" },
|
|
105
|
+
tools: [
|
|
106
|
+
createReadFileTool({ projectRoot }),
|
|
107
|
+
createListDirTool({ projectRoot }),
|
|
108
|
+
createSearchTextTool({ projectRoot, maxMatches: 100 }),
|
|
109
|
+
createGitDiffTool({ projectRoot, timeoutMs: 30_000 }),
|
|
110
|
+
createRunVitestTool({ projectRoot, timeoutMs: 120_000 }),
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Tool reference
|
|
116
|
+
|
|
117
|
+
| Tool | Returns on success | Error codes |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| `read_file` | `{ ok, content, size }` | `path_traversal`, `forbidden_path`, `binary_file`, `not_found`, `too_large` |
|
|
120
|
+
| `list_dir` | `{ ok, entries: [{ name, type }], truncated, totalCount }` | `path_traversal`, `forbidden_path` |
|
|
121
|
+
| `search_text` | `{ ok, matches: [{ file, line, preview }], truncated }` | `path_traversal`, `forbidden_path` |
|
|
122
|
+
| `git_diff` | `{ ok, diff, truncated }` | `not_a_repo`, `timeout`, `git_failed`, `path_traversal` |
|
|
123
|
+
| `run_vitest` | `{ ok, summary: { numTotalTests, numPassedTests, numFailedTests, success } }` | `no_vitest`, `timeout`, `unparseable_output`, `path_traversal` |
|
|
124
|
+
|
|
125
|
+
### Safety rules (shared across all 5 tools)
|
|
126
|
+
|
|
127
|
+
1. Every I/O call passes through `safePathJoin` + `assertNoSymlinkEscape`.
|
|
128
|
+
2. Sensitive files refused: `.env*` (except `.env.example`), `.git/`, `node_modules/`, `.theo/`, lock files.
|
|
129
|
+
3. Handlers return JSON strings; never throw on user mistakes.
|
|
130
|
+
|
|
131
|
+
### Hardening
|
|
132
|
+
|
|
133
|
+
- `read_file`: rejects binary files via null-byte detection in first 8 KB. Caps at 5 MB.
|
|
134
|
+
- `list_dir`: caps at 500 entries by default (override via `max`).
|
|
135
|
+
- `search_text`: skips binary files and files > 1 MB.
|
|
136
|
+
- `git_diff` / `run_vitest`: spawn detached process groups; on timeout kill the whole group.
|
|
137
|
+
|
|
138
|
+
## Tool lifecycle hooks
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
const agent = await Agent.create({
|
|
142
|
+
apiKey, model,
|
|
143
|
+
onToolStart: ({ toolName, callId, args, conversationId }) => { /* ... */ },
|
|
144
|
+
onToolEnd: ({ toolName, callId, durationMs, result }) => { /* ... */ },
|
|
145
|
+
onToolError: ({ toolName, callId, error, durationMs, attempt }) => { /* ... */ },
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
- `callId` correlates start/end pairs.
|
|
150
|
+
- Hook errors are swallowed -- listener bugs do NOT crash the agent run.
|
|
151
|
+
|
|
152
|
+
## Tool stream events
|
|
153
|
+
|
|
154
|
+
Tool calls emit `SDKToolUseMessage` (type `"tool_call"`) twice: once with `status: "running"` and `args`, then with `status: "completed"` (or `"error"`) and `result`. The `args` and `result` payloads are unstable -- parse defensively.
|
|
155
|
+
|
|
156
|
+
## Path safety utilities (`@theokit/sdk/path-safety`)
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import {
|
|
160
|
+
safePathJoin,
|
|
161
|
+
assertNoSymlinkEscape,
|
|
162
|
+
isForbiddenPath,
|
|
163
|
+
PathTraversalError,
|
|
164
|
+
ForbiddenPathError,
|
|
165
|
+
} from "@theokit/sdk/path-safety";
|
|
166
|
+
|
|
167
|
+
const safe = safePathJoin(projectRoot, userPath);
|
|
168
|
+
assertNoSymlinkEscape(safe, projectRoot);
|
|
169
|
+
if (isForbiddenPath(userPath)) throw new ForbiddenPathError(userPath);
|
|
170
|
+
```
|