@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.
Files changed (371) hide show
  1. package/CHANGELOG.md +193 -0
  2. package/bin/init-claude.mjs +34 -0
  3. package/claude-template/AGENTS.md +139 -0
  4. package/claude-template/CLAUDE.md +51 -0
  5. package/claude-template/dot-claude/rules/theokit-conventions.md +33 -0
  6. package/claude-template/dot-claude/settings.json +16 -0
  7. package/claude-template/dot-claude/skills/theokit-agent-core/SKILL.md +209 -0
  8. package/claude-template/dot-claude/skills/theokit-budget/SKILL.md +176 -0
  9. package/claude-template/dot-claude/skills/theokit-config/SKILL.md +139 -0
  10. package/claude-template/dot-claude/skills/theokit-cron/SKILL.md +148 -0
  11. package/claude-template/dot-claude/skills/theokit-di/SKILL.md +233 -0
  12. package/claude-template/dot-claude/skills/theokit-di-agent/SKILL.md +294 -0
  13. package/claude-template/dot-claude/skills/theokit-errors/SKILL.md +172 -0
  14. package/claude-template/dot-claude/skills/theokit-eval/SKILL.md +144 -0
  15. package/claude-template/dot-claude/skills/theokit-gateways/SKILL.md +209 -0
  16. package/claude-template/dot-claude/skills/theokit-memory/SKILL.md +176 -0
  17. package/claude-template/dot-claude/skills/theokit-rag/SKILL.md +226 -0
  18. package/claude-template/dot-claude/skills/theokit-streaming/SKILL.md +156 -0
  19. package/claude-template/dot-claude/skills/theokit-subscriptions/SKILL.md +148 -0
  20. package/claude-template/dot-claude/skills/theokit-tools/SKILL.md +170 -0
  21. package/claude-template/dot-claude/skills/theokit-workflows/SKILL.md +218 -0
  22. package/dist/a2a/agent-mailbox.d.cts +27 -0
  23. package/dist/a2a/agent-mailbox.d.ts +27 -0
  24. package/dist/a2a/index.cjs +16850 -0
  25. package/dist/a2a/index.cjs.map +1 -0
  26. package/dist/a2a/index.d.cts +9 -0
  27. package/dist/a2a/index.d.ts +9 -0
  28. package/dist/a2a/index.js +16844 -0
  29. package/dist/a2a/index.js.map +1 -0
  30. package/dist/a2a/message-bus.d.cts +27 -0
  31. package/dist/a2a/message-bus.d.ts +27 -0
  32. package/dist/a2a/subagent.d.cts +25 -0
  33. package/dist/a2a/subagent.d.ts +25 -0
  34. package/dist/a2a/types.d.cts +12 -0
  35. package/dist/a2a/types.d.ts +12 -0
  36. package/dist/agent.d.ts +1 -1
  37. package/dist/client/index.cjs +73 -0
  38. package/dist/client/index.cjs.map +1 -0
  39. package/dist/client/index.d.cts +7 -0
  40. package/dist/client/index.d.ts +7 -0
  41. package/dist/client/index.js +71 -0
  42. package/dist/client/index.js.map +1 -0
  43. package/dist/client/theokit-client.d.cts +18 -0
  44. package/dist/client/theokit-client.d.ts +18 -0
  45. package/dist/client/types.d.cts +19 -0
  46. package/dist/client/types.d.ts +19 -0
  47. package/dist/{run-DkCD5DeO.d.cts → cron-BnywDYLq.d.cts} +496 -910
  48. package/dist/{run-DkCD5DeO.d.ts → cron-CtZvJD9J.d.ts} +496 -910
  49. package/dist/cron.cjs +4285 -2893
  50. package/dist/cron.cjs.map +1 -1
  51. package/dist/cron.d.cts +2 -3
  52. package/dist/cron.d.ts +2 -71
  53. package/dist/cron.js +4289 -2897
  54. package/dist/cron.js.map +1 -1
  55. package/dist/{errors-CvAeEWgE.d.ts → errors-ChqOmFH1.d.cts} +52 -6
  56. package/dist/{errors-CK8brCJ1.d.cts → errors-DV9e0rcp.d.ts} +52 -6
  57. package/dist/errors.cjs +218 -3
  58. package/dist/errors.cjs.map +1 -1
  59. package/dist/errors.d.cts +2 -3
  60. package/dist/errors.d.ts +50 -4
  61. package/dist/errors.js +217 -4
  62. package/dist/errors.js.map +1 -1
  63. package/dist/eval.cjs +4285 -2893
  64. package/dist/eval.cjs.map +1 -1
  65. package/dist/eval.d.cts +35 -0
  66. package/dist/eval.js +4289 -2897
  67. package/dist/eval.js.map +1 -1
  68. package/dist/event-bus.d.ts +23 -0
  69. package/dist/index.cjs +5132 -4200
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +298 -278
  72. package/dist/index.d.ts +1898 -24
  73. package/dist/index.js +6441 -5509
  74. package/dist/index.js.map +1 -1
  75. package/dist/internal/agent-loop/loop-context-init.d.ts +2 -0
  76. package/dist/internal/agent-loop/tool-dispatch.d.ts +22 -1
  77. package/dist/internal/auth/api-key-validator.d.ts +46 -0
  78. package/dist/internal/llm/anthropic-shared.d.ts +8 -1
  79. package/dist/internal/llm/retry.d.ts +22 -0
  80. package/dist/internal/llm/types.d.ts +47 -1
  81. package/dist/internal/memory/active-memory-cache.d.ts +3 -3
  82. package/dist/internal/memory/active-memory-types.d.ts +8 -0
  83. package/dist/internal/memory/active-memory.d.ts +24 -20
  84. package/dist/internal/memory/adapters/azure-openai-embedding.d.ts +2 -0
  85. package/dist/internal/memory/adapters/cohere-embedding.d.ts +2 -0
  86. package/dist/internal/memory/adapters/gemini-embedding.d.ts +2 -0
  87. package/dist/internal/memory/adapters/jina-embedding.d.ts +2 -0
  88. package/dist/internal/memory/index-manager-contract.d.ts +26 -0
  89. package/dist/internal/memory/index-manager-dispatch.d.ts +1 -1
  90. package/dist/internal/memory/index-manager.d.ts +8 -26
  91. package/dist/internal/memory/{chunk-markdown.d.ts → storage/chunk-markdown.d.ts} +1 -1
  92. package/dist/internal/memory/{markdown-store.d.ts → storage/markdown-store.d.ts} +1 -1
  93. package/dist/internal/memory/{reader.d.ts → storage/reader.d.ts} +1 -1
  94. package/dist/internal/observability/context.d.cts +23 -0
  95. package/dist/internal/observability/context.d.ts +23 -0
  96. package/dist/internal/observability/index.cjs +38 -0
  97. package/dist/internal/observability/index.cjs.map +1 -0
  98. package/dist/internal/observability/index.d.cts +8 -0
  99. package/dist/internal/observability/index.d.ts +8 -0
  100. package/dist/internal/observability/index.js +33 -0
  101. package/dist/internal/observability/index.js.map +1 -0
  102. package/dist/internal/observability/tracer-loader.d.cts +20 -0
  103. package/dist/internal/persistence/conversation-storage-fs.d.cts +37 -0
  104. package/dist/internal/persistence/conversation-storage-memory.d.cts +24 -0
  105. package/dist/internal/persistence/credential-pool-store.d.cts +32 -0
  106. package/dist/internal/persistence/credential-pool-store.d.ts +32 -0
  107. package/dist/internal/persistence/cwd-mutex.d.cts +1 -0
  108. package/dist/internal/persistence/exclusive-create.d.cts +22 -0
  109. package/dist/internal/persistence/exclusive-create.d.ts +22 -0
  110. package/dist/internal/persistence/file-lock.d.cts +14 -0
  111. package/dist/internal/persistence/fts5-sanitize.d.cts +16 -0
  112. package/dist/internal/persistence/index.cjs +359 -0
  113. package/dist/internal/persistence/index.cjs.map +1 -0
  114. package/dist/internal/persistence/index.d.cts +20 -0
  115. package/dist/internal/persistence/index.d.ts +20 -0
  116. package/dist/internal/persistence/index.js +341 -0
  117. package/dist/internal/persistence/index.js.map +1 -0
  118. package/dist/internal/persistence/markdown-config-loader.d.cts +35 -0
  119. package/dist/internal/persistence/paths.d.cts +19 -0
  120. package/dist/internal/persistence/persistence-schema.d.cts +21 -0
  121. package/dist/internal/persistence/persistence-schema.d.ts +4 -0
  122. package/dist/internal/persistence/schema-version.d.cts +13 -0
  123. package/dist/internal/persistence/sqlite-cas.d.cts +25 -0
  124. package/dist/internal/persistence/sqlite-cas.d.ts +25 -0
  125. package/dist/internal/persistence/sqlite-wal.d.cts +10 -0
  126. package/dist/internal/plugins/context.d.cts +31 -0
  127. package/dist/internal/plugins/index.cjs +228 -0
  128. package/dist/internal/plugins/index.cjs.map +1 -0
  129. package/dist/internal/plugins/index.d.cts +8 -0
  130. package/dist/internal/plugins/index.d.ts +8 -0
  131. package/dist/internal/plugins/index.js +222 -0
  132. package/dist/internal/plugins/index.js.map +1 -0
  133. package/dist/internal/plugins/lifecycle.d.cts +14 -0
  134. package/dist/internal/plugins/lifecycle.d.ts +14 -0
  135. package/dist/internal/plugins/manager.d.cts +37 -0
  136. package/dist/internal/plugins/types.d.cts +102 -0
  137. package/dist/internal/providers/catalog-loader.d.ts +39 -0
  138. package/dist/internal/runtime/agent-session-store.d.ts +1 -1
  139. package/dist/internal/runtime/agent-session.d.ts +1 -0
  140. package/dist/internal/runtime/budget-tracker.d.ts +73 -0
  141. package/dist/internal/runtime/{context-manager.d.ts → context/context-manager.d.ts} +1 -1
  142. package/dist/internal/runtime/{fixture-events.d.ts → fixtures/fixture-events.d.ts} +1 -1
  143. package/dist/internal/runtime/{fixture-run-base.d.ts → fixtures/fixture-run-base.d.ts} +4 -4
  144. package/dist/internal/runtime/{fixture-scripts.d.ts → fixtures/fixture-scripts.d.ts} +1 -1
  145. package/dist/internal/runtime/local-agent-bootstrap.d.ts +2 -2
  146. package/dist/internal/runtime/local-agent-memory-provider.d.ts +57 -0
  147. package/dist/internal/runtime/memory-path-selector.d.ts +73 -0
  148. package/dist/internal/runtime/memory-provider.d.ts +165 -0
  149. package/dist/internal/runtime/{agent-registry.d.ts → registry/agent-registry-contract.d.ts} +15 -9
  150. package/dist/internal/runtime/registry/agent-registry.d.ts +7 -0
  151. package/dist/internal/runtime/{live-agent-registry.d.ts → registry/live-agent-registry.d.ts} +1 -1
  152. package/dist/internal/runtime/{run-registry.d.ts → registry/run-registry.d.ts} +1 -1
  153. package/dist/internal/runtime/session-types.d.ts +35 -0
  154. package/dist/internal/runtime/system-prompt/sources/skills-provider.d.ts +1 -0
  155. package/dist/internal/runtime/validate-response.d.ts +18 -0
  156. package/dist/internal/security/index.cjs +361 -0
  157. package/dist/internal/security/index.cjs.map +1 -0
  158. package/dist/internal/security/index.d.cts +11 -0
  159. package/dist/internal/security/index.js +350 -0
  160. package/dist/internal/security/index.js.map +1 -0
  161. package/dist/internal/security/path-guard.d.cts +59 -0
  162. package/dist/internal/security/path-guard.d.ts +3 -0
  163. package/dist/internal/security/redact.d.cts +21 -0
  164. package/dist/internal/security/secret-redactor.d.cts +1 -0
  165. package/dist/internal/security/secret-redactor.d.ts +1 -0
  166. package/dist/internal/security/test-reset.d.cts +10 -0
  167. package/dist/internal/security/test-reset.d.ts +10 -0
  168. package/dist/internal/telemetry/adapters/arize.d.ts +2 -0
  169. package/dist/internal/telemetry/adapters/braintrust.d.ts +2 -0
  170. package/dist/internal/telemetry/adapters/datadog.d.ts +2 -0
  171. package/dist/internal/telemetry/adapters/langsmith.d.ts +2 -0
  172. package/dist/internal/telemetry/span-names.d.ts +6 -0
  173. package/dist/internal/telemetry/tracer.d.ts +1 -0
  174. package/dist/internal/workflow/evented-executor.d.ts +42 -0
  175. package/dist/internal/workflow/scheduler.d.ts +23 -0
  176. package/dist/internal/zod/to-json-schema.d.ts +5 -15
  177. package/dist/job-queue.d.ts +28 -0
  178. package/dist/path-safety.cjs +67 -6
  179. package/dist/path-safety.cjs.map +1 -1
  180. package/dist/path-safety.d.cts +15 -0
  181. package/dist/path-safety.d.ts +1 -1
  182. package/dist/path-safety.js +67 -7
  183. package/dist/path-safety.js.map +1 -1
  184. package/dist/permission-engine.d.ts +21 -0
  185. package/dist/provider-catalog.json +702 -0
  186. package/dist/rag/index.cjs +136 -0
  187. package/dist/rag/index.cjs.map +1 -0
  188. package/dist/rag/index.d.cts +11 -0
  189. package/dist/rag/index.d.ts +11 -0
  190. package/dist/rag/index.js +129 -0
  191. package/dist/rag/index.js.map +1 -0
  192. package/dist/rag/reranker.d.cts +26 -0
  193. package/dist/rag/reranker.d.ts +26 -0
  194. package/dist/rag/retriever.d.cts +25 -0
  195. package/dist/rag/retriever.d.ts +25 -0
  196. package/dist/rag/text-splitter.d.cts +12 -0
  197. package/dist/rag/text-splitter.d.ts +12 -0
  198. package/dist/rag/types.d.cts +37 -0
  199. package/dist/rag/types.d.ts +37 -0
  200. package/dist/run-DrwUpFxZ.d.cts +823 -0
  201. package/dist/run-DrwUpFxZ.d.ts +823 -0
  202. package/dist/sandbox/index.cjs +133 -0
  203. package/dist/sandbox/index.cjs.map +1 -0
  204. package/dist/sandbox/index.d.cts +2 -0
  205. package/dist/sandbox/index.d.ts +2 -0
  206. package/dist/sandbox/index.js +128 -0
  207. package/dist/sandbox/index.js.map +1 -0
  208. package/dist/sandbox/local-sandbox.d.cts +17 -0
  209. package/dist/sandbox/local-sandbox.d.ts +17 -0
  210. package/dist/sandbox/types.d.cts +44 -0
  211. package/dist/sandbox/types.d.ts +44 -0
  212. package/dist/server/adapter/express.d.cts +9 -0
  213. package/dist/server/adapter/express.d.ts +9 -0
  214. package/dist/server/adapter/fastify.d.cts +9 -0
  215. package/dist/server/adapter/fastify.d.ts +9 -0
  216. package/dist/server/adapter/hono.d.cts +9 -0
  217. package/dist/server/adapter/hono.d.ts +9 -0
  218. package/dist/server/adapter/index.d.cts +8 -0
  219. package/dist/server/adapter/index.d.ts +8 -0
  220. package/dist/server/adapter/shared-handler.d.cts +9 -0
  221. package/dist/server/adapter/shared-handler.d.ts +9 -0
  222. package/dist/server/adapter/types.d.cts +33 -0
  223. package/dist/server/adapter/types.d.ts +33 -0
  224. package/dist/server/auth/errors.d.cts +53 -0
  225. package/dist/server/auth/errors.d.ts +53 -0
  226. package/dist/server/auth/index.cjs +38 -41
  227. package/dist/server/auth/index.cjs.map +1 -1
  228. package/dist/server/auth/index.d.cts +11 -172
  229. package/dist/server/auth/index.d.ts +11 -172
  230. package/dist/server/auth/index.js +39 -42
  231. package/dist/server/auth/index.js.map +1 -1
  232. package/dist/server/auth/oauth-transaction-store.d.cts +39 -0
  233. package/dist/server/auth/oauth-transaction-store.d.ts +39 -0
  234. package/dist/server/auth/orchestrator.d.cts +8 -0
  235. package/dist/server/auth/orchestrator.d.ts +8 -0
  236. package/dist/server/auth/types.d.cts +91 -0
  237. package/dist/server/auth/types.d.ts +91 -0
  238. package/dist/server/auth/validate-return-to.d.cts +17 -0
  239. package/dist/server/auth/validate-return-to.d.ts +17 -0
  240. package/dist/server/errors-envelope.cjs +409 -0
  241. package/dist/server/errors-envelope.cjs.map +1 -0
  242. package/dist/server/errors-envelope.d.cts +61 -0
  243. package/dist/server/errors-envelope.d.ts +61 -0
  244. package/dist/server/errors-envelope.js +405 -0
  245. package/dist/server/errors-envelope.js.map +1 -0
  246. package/dist/subscription/define-subscription.d.cts +63 -0
  247. package/dist/subscription/define-subscription.d.ts +63 -0
  248. package/dist/subscription/index.cjs +402 -0
  249. package/dist/subscription/index.cjs.map +1 -0
  250. package/dist/subscription/index.d.cts +18 -0
  251. package/dist/subscription/index.d.ts +18 -0
  252. package/dist/subscription/index.js +394 -0
  253. package/dist/subscription/index.js.map +1 -0
  254. package/dist/subscription/internal/adapter-types.d.cts +11 -0
  255. package/dist/subscription/internal/adapter-types.d.ts +11 -0
  256. package/dist/subscription/internal/backpressure.d.cts +24 -0
  257. package/dist/subscription/internal/backpressure.d.ts +24 -0
  258. package/dist/subscription/internal/server-integration.d.cts +17 -0
  259. package/dist/subscription/internal/server-integration.d.ts +17 -0
  260. package/dist/subscription/internal/sse-encoder.d.cts +13 -0
  261. package/dist/subscription/internal/sse-encoder.d.ts +13 -0
  262. package/dist/subscription/internal/sse-parser.d.cts +15 -0
  263. package/dist/subscription/internal/sse-parser.d.ts +15 -0
  264. package/dist/subscription/internal/subscription-runtime.d.cts +9 -0
  265. package/dist/subscription/internal/subscription-runtime.d.ts +9 -0
  266. package/dist/subscription/internal/ws-adapter-node.d.cts +10 -0
  267. package/dist/subscription/internal/ws-adapter-node.d.ts +10 -0
  268. package/dist/subscription/theokit-subscribe.d.cts +41 -0
  269. package/dist/subscription/theokit-subscribe.d.ts +41 -0
  270. package/dist/subscription/types.d.cts +140 -0
  271. package/dist/subscription/types.d.ts +140 -0
  272. package/dist/task-store.cjs +30 -2
  273. package/dist/task-store.cjs.map +1 -1
  274. package/dist/task-store.d.cts +8 -0
  275. package/dist/task-store.js +31 -3
  276. package/dist/task-store.js.map +1 -1
  277. package/dist/types/agent-prims.d.ts +61 -0
  278. package/dist/types/agent.d.ts +48 -53
  279. package/dist/types/conversation.d.ts +20 -8
  280. package/dist/types/index.d.ts +0 -2
  281. package/dist/types/messages-base.d.ts +20 -0
  282. package/dist/types/messages.d.ts +1 -1
  283. package/dist/types/run.d.ts +1 -1
  284. package/dist/types/updates.d.ts +1 -1
  285. package/dist/voice/index.d.ts +7 -0
  286. package/dist/voice/openai-realtime.d.ts +21 -0
  287. package/dist/voice/types.d.ts +35 -0
  288. package/dist/workflow.cjs +179 -88
  289. package/dist/workflow.cjs.map +1 -1
  290. package/dist/workflow.d.cts +97 -0
  291. package/dist/workflow.js +180 -89
  292. package/dist/workflow.js.map +1 -1
  293. package/package.json +128 -25
  294. package/dist/budget.d.ts +0 -48
  295. package/dist/cache.d.ts +0 -74
  296. package/dist/cron-1yxL3K2S.d.cts +0 -221
  297. package/dist/cron-BYVdYzob.d.ts +0 -221
  298. package/dist/handoff.d.ts +0 -55
  299. package/dist/internal/budget/calendar-window.d.ts +0 -19
  300. package/dist/internal/budget/enforcement.d.ts +0 -32
  301. package/dist/internal/budget/ledger.d.ts +0 -25
  302. package/dist/internal/budget/normalize-usage.d.ts +0 -27
  303. package/dist/internal/budget/registry.d.ts +0 -16
  304. package/dist/internal/cache/cosine.d.ts +0 -14
  305. package/dist/internal/cache/embed-helper.d.ts +0 -15
  306. package/dist/internal/cache/key.d.ts +0 -15
  307. package/dist/internal/cache/lookup.d.ts +0 -28
  308. package/dist/internal/cache/store-handler.d.ts +0 -24
  309. package/dist/internal/cache/store-json.d.ts +0 -48
  310. package/dist/internal/cache/store.d.ts +0 -54
  311. package/dist/internal/cache/telemetry.d.ts +0 -20
  312. package/dist/internal/cache/ttl.d.ts +0 -11
  313. package/dist/internal/catalog/fixtures.d.ts +0 -16
  314. package/dist/internal/catalog/local-models.d.ts +0 -24
  315. package/dist/internal/handoff/dispatcher.d.ts +0 -29
  316. package/dist/internal/handoff/registry.d.ts +0 -23
  317. package/dist/internal/handoff/telemetry.d.ts +0 -18
  318. package/dist/internal/handoff/tool-injector.d.ts +0 -34
  319. package/dist/internal/memory/atomic-write.d.ts +0 -7
  320. package/dist/internal/memory/dreaming/diary.d.ts +0 -4
  321. package/dist/internal/memory/dreaming/phases.d.ts +0 -15
  322. package/dist/internal/memory/dreaming/run.d.ts +0 -10
  323. package/dist/internal/memory/migrate-sqlite-to-lance.d.ts +0 -15
  324. package/dist/memory-adapter-helpers.d.ts +0 -28
  325. package/dist/memory.d.ts +0 -123
  326. package/dist/migrate.d.ts +0 -33
  327. package/dist/security.d.ts +0 -67
  328. package/dist/task.d.ts +0 -87
  329. package/dist/theokit.d.ts +0 -84
  330. package/dist/tools/_path-scope.d.ts +0 -8
  331. package/dist/tools/_subprocess.d.ts +0 -28
  332. package/dist/tools/git-diff.d.ts +0 -22
  333. package/dist/tools/index.d.ts +0 -29
  334. package/dist/tools/list-dir.d.ts +0 -26
  335. package/dist/tools/read-file.d.ts +0 -31
  336. package/dist/tools/run-vitest.d.ts +0 -46
  337. package/dist/tools/search-text.d.ts +0 -32
  338. package/dist/tools.cjs +0 -690
  339. package/dist/tools.cjs.map +0 -1
  340. package/dist/tools.js +0 -683
  341. package/dist/tools.js.map +0 -1
  342. package/dist/trajectory-helpers.d.ts +0 -31
  343. package/dist/types/cache.d.ts +0 -76
  344. package/dist/types/handoff.d.ts +0 -135
  345. /package/dist/{internal/cron/run-job.d.ts → agent-helpers.d.ts} +0 -0
  346. /package/dist/internal/{cron/scheduler.d.ts → agent-loop/loop-llm-stream.d.ts} +0 -0
  347. /package/dist/internal/{cron/store.d.ts → agent-loop/tool-executors.d.ts} +0 -0
  348. /package/dist/internal/{cron/validate.d.ts → memory/index-manager-helpers.d.ts} +0 -0
  349. /package/dist/internal/memory/{session-loader.d.ts → storage/session-loader.d.ts} +0 -0
  350. /package/dist/internal/memory/{session-summary-writer.d.ts → storage/session-summary-writer.d.ts} +0 -0
  351. /package/dist/internal/memory/{transcript-store.d.ts → storage/transcript-store.d.ts} +0 -0
  352. /package/dist/internal/memory/{wiki-loader.d.ts → storage/wiki-loader.d.ts} +0 -0
  353. /package/dist/internal/{memory/cwd-mutex.d.ts → persistence/atomic-write.d.cts} +0 -0
  354. /package/dist/internal/runtime/{context-aggregator.d.ts → context/context-aggregator.d.ts} +0 -0
  355. /package/dist/internal/runtime/{context-discovery-runner.d.ts → context/context-discovery-runner.d.ts} +0 -0
  356. /package/dist/internal/runtime/{context-discovery.d.ts → context/context-discovery.d.ts} +0 -0
  357. /package/dist/internal/runtime/{context-frontmatter.d.ts → context/context-frontmatter.d.ts} +0 -0
  358. /package/dist/internal/runtime/{context-import-resolver.d.ts → context/context-import-resolver.d.ts} +0 -0
  359. /package/dist/internal/runtime/{context-loaders.d.ts → context/context-loaders.d.ts} +0 -0
  360. /package/dist/internal/runtime/{context-mdc-parser.d.ts → context/context-mdc-parser.d.ts} +0 -0
  361. /package/dist/internal/runtime/{fixture-responder.d.ts → fixtures/fixture-responder.d.ts} +0 -0
  362. /package/dist/internal/runtime/{fixture-types.d.ts → fixtures/fixture-types.d.ts} +0 -0
  363. /package/dist/internal/runtime/{plugins-manager.d.ts → local-agent-send.d.ts} +0 -0
  364. /package/dist/internal/runtime/{plugin-frontmatter.d.ts → plugins/plugin-frontmatter.d.ts} +0 -0
  365. /package/dist/internal/runtime/{system-prompt/providers/active-memory-provider.d.ts → plugins/plugins-manager.d.ts} +0 -0
  366. /package/dist/internal/runtime/{agent-factory-registry.d.ts → registry/agent-factory-registry.d.ts} +0 -0
  367. /package/dist/internal/runtime/{agent-registry-store.d.ts → registry/agent-registry-store.d.ts} +0 -0
  368. /package/dist/internal/runtime/system-prompt/{providers/base-provider.d.ts → sources/active-memory-provider.d.ts} +0 -0
  369. /package/dist/internal/runtime/system-prompt/{providers/context-provider.d.ts → sources/base-provider.d.ts} +0 -0
  370. /package/dist/internal/runtime/system-prompt/{providers/memory-provider.d.ts → sources/context-provider.d.ts} +0 -0
  371. /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
+ ```