@dikolab/kbdb 0.3.0 → 0.3.1

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 (425) hide show
  1. package/README.md +24 -43
  2. package/dist/bench/constants/corpus-defaults.constant.d.ts +3 -0
  3. package/dist/bench/functions/format-report.function.d.ts +11 -0
  4. package/dist/bench/functions/generate-corpus.function.d.ts +12 -0
  5. package/dist/bench/functions/measure-operation.function.d.ts +14 -0
  6. package/dist/bench/functions/seeded-rng.function.d.ts +11 -0
  7. package/dist/bench/functions/zipf-word.function.d.ts +13 -0
  8. package/dist/bench/index.d.ts +10 -0
  9. package/dist/bench/typings/bench-result.interface.d.ts +11 -0
  10. package/dist/bench/typings/bench-suite-result.interface.d.ts +10 -0
  11. package/dist/bench/typings/corpus-config.interface.d.ts +11 -0
  12. package/dist/bench/typings/corpus-section.interface.d.ts +9 -0
  13. package/dist/cli.cjs +63 -9
  14. package/dist/cli.cjs.map +2 -2
  15. package/dist/cli.mjs +63 -9
  16. package/dist/cli.mjs.map +2 -2
  17. package/dist/src/shared/auto-capture/classes/auto-capture-controller.class.d.ts +33 -0
  18. package/dist/src/shared/auto-capture/constants/auto-capture-defaults.constant.d.ts +8 -0
  19. package/dist/src/shared/auto-capture/functions/build-capture-prompt.function.d.ts +11 -0
  20. package/dist/src/shared/auto-capture/functions/evaluate-trigger.function.d.ts +12 -0
  21. package/dist/src/shared/auto-capture/index.d.ts +7 -0
  22. package/dist/src/shared/auto-capture/typings/auto-capture-config.interface.d.ts +13 -0
  23. package/dist/src/shared/auto-capture/typings/auto-capture-state.interface.d.ts +13 -0
  24. package/dist/src/shared/auto-capture/typings/auto-capture-trigger.interface.d.ts +7 -0
  25. package/dist/src/shared/cli/constants/global-help.constant.d.ts +8 -0
  26. package/dist/src/shared/cli/constants/leaf-help.constant.d.ts +7 -0
  27. package/dist/src/shared/cli/constants/memory-protocol-body.constant.d.ts +7 -0
  28. package/dist/src/shared/cli/constants/query-guidance-body.constant.d.ts +7 -0
  29. package/dist/src/shared/cli/constants/subcommand-help.constant.d.ts +8 -0
  30. package/dist/src/shared/cli/functions/collect-files.function.d.ts +13 -0
  31. package/dist/src/shared/cli/functions/compute-section-kbid.function.d.ts +15 -0
  32. package/dist/src/shared/cli/functions/format-mcp-output.function.d.ts +9 -0
  33. package/dist/src/shared/cli/functions/format-text-output.function.d.ts +9 -0
  34. package/dist/src/shared/cli/functions/generate-group-help.function.d.ts +11 -0
  35. package/dist/src/shared/cli/functions/handle-data-command.function.d.ts +16 -0
  36. package/dist/src/shared/cli/functions/handle-mcp.function.d.ts +15 -0
  37. package/dist/src/shared/cli/functions/handle-migrate.function.d.ts +15 -0
  38. package/dist/src/shared/cli/functions/hydrate-search-previews.function.d.ts +14 -0
  39. package/dist/src/shared/cli/functions/resolve-skill-names.function.d.ts +16 -0
  40. package/dist/src/shared/cli/functions/run-search.function.d.ts +1 -0
  41. package/dist/src/shared/cli/functions/version-gate.function.d.ts +15 -0
  42. package/dist/src/shared/cli/functions/wrap-command.function.d.ts +15 -0
  43. package/dist/src/shared/cli/typings/agent-create-client.interface.d.ts +42 -0
  44. package/dist/src/shared/cli/typings/agent-get-client.interface.d.ts +36 -0
  45. package/dist/src/shared/cli/typings/check-client.interface.d.ts +58 -0
  46. package/dist/src/shared/cli/typings/cli-deps.interface.d.ts +48 -0
  47. package/dist/src/shared/cli/typings/cli-options.interface.d.ts +2 -0
  48. package/dist/src/shared/cli/typings/disconnectable-client.interface.d.ts +26 -0
  49. package/dist/src/shared/cli/typings/dispatch-client.type.d.ts +27 -0
  50. package/dist/src/shared/cli/typings/learn-client.interface.d.ts +52 -0
  51. package/dist/src/shared/cli/typings/learn-io.interface.d.ts +5 -0
  52. package/dist/src/shared/cli/typings/search-client.interface.d.ts +71 -0
  53. package/dist/src/shared/embedding/classes/null-embedding-provider.class.d.ts +20 -0
  54. package/dist/src/shared/embedding/constants/near-duplicate-thresholds.constant.d.ts +15 -0
  55. package/dist/src/shared/embedding/functions/build-vector-index.function.d.ts +14 -0
  56. package/dist/src/shared/embedding/functions/cosine-similarity.function.d.ts +10 -0
  57. package/dist/src/shared/embedding/functions/detect-near-duplicates.function.d.ts +18 -0
  58. package/dist/src/shared/embedding/functions/jaccard-coefficient.function.d.ts +9 -0
  59. package/dist/src/shared/embedding/functions/read-vector-index-meta.function.d.ts +10 -0
  60. package/dist/src/shared/embedding/functions/rrf-fuse.function.d.ts +14 -0
  61. package/dist/src/shared/embedding/functions/search-vectors.function.d.ts +14 -0
  62. package/dist/src/shared/embedding/index.d.ts +16 -0
  63. package/dist/src/shared/embedding/typings/embedding-config.interface.d.ts +20 -0
  64. package/dist/src/shared/embedding/typings/embedding-provider.interface.d.ts +23 -0
  65. package/dist/src/shared/embedding/typings/near-duplicate-candidate.model.d.ts +23 -0
  66. package/dist/src/shared/embedding/typings/near-duplicate-result.model.d.ts +24 -0
  67. package/dist/src/shared/embedding/typings/vector-index-entry.model.d.ts +12 -0
  68. package/dist/src/shared/embedding/typings/vector-index-meta.model.d.ts +11 -0
  69. package/dist/src/shared/embedding/typings/vector-search-result.model.d.ts +7 -0
  70. package/dist/src/shared/mcp/constants/tool-agent-create.constant.d.ts +3 -0
  71. package/dist/src/shared/mcp/constants/tool-agent-delete.constant.d.ts +3 -0
  72. package/dist/src/shared/mcp/constants/tool-agent-get.constant.d.ts +3 -0
  73. package/dist/src/shared/mcp/constants/tool-agent-list.constant.d.ts +3 -0
  74. package/dist/src/shared/mcp/constants/tool-auto-capture-review.constant.d.ts +8 -0
  75. package/dist/src/shared/mcp/constants/tool-check.constant.d.ts +3 -0
  76. package/dist/src/shared/mcp/constants/tool-content.constant.d.ts +3 -0
  77. package/dist/src/shared/mcp/constants/tool-export.constant.d.ts +3 -0
  78. package/dist/src/shared/mcp/constants/tool-gc.constant.d.ts +3 -0
  79. package/dist/src/shared/mcp/constants/tool-learn.constant.d.ts +3 -0
  80. package/dist/src/shared/mcp/constants/tool-rebuild.constant.d.ts +3 -0
  81. package/dist/src/shared/mcp/constants/tool-recall.constant.d.ts +3 -0
  82. package/dist/src/shared/mcp/constants/tool-retrieve.constant.d.ts +3 -0
  83. package/dist/src/shared/mcp/constants/tool-search.constant.d.ts +3 -0
  84. package/dist/src/shared/mcp/constants/tool-skill-delete.constant.d.ts +3 -0
  85. package/dist/src/shared/mcp/constants/tool-skill-get.constant.d.ts +3 -0
  86. package/dist/src/shared/mcp/constants/tool-skill-learn.constant.d.ts +3 -0
  87. package/dist/src/shared/mcp/constants/tool-skill-list.constant.d.ts +3 -0
  88. package/dist/src/shared/mcp/constants/tool-status.constant.d.ts +3 -0
  89. package/dist/src/shared/mcp/constants/tool-unlearn.constant.d.ts +3 -0
  90. package/dist/src/shared/mcp/functions/as-boolean-or-undefined.function.d.ts +7 -0
  91. package/dist/src/shared/mcp/functions/as-string-array-or-undefined.function.d.ts +7 -0
  92. package/dist/src/shared/mcp/functions/as-string-array.function.d.ts +7 -0
  93. package/dist/src/shared/mcp/functions/as-string.function.d.ts +8 -0
  94. package/dist/src/shared/mcp/functions/build-skills-text.function.d.ts +18 -0
  95. package/dist/src/shared/mcp/functions/handle-agent-prompt.function.d.ts +14 -0
  96. package/dist/src/shared/mcp/functions/handle-mcp-request.function.d.ts +14 -0
  97. package/dist/src/shared/mcp/functions/handle-prompt-get.function.d.ts +4 -3
  98. package/dist/src/shared/mcp/functions/handle-skill-prompt.function.d.ts +16 -0
  99. package/dist/src/shared/mcp/functions/handle-tool-auto-capture-review.function.d.ts +12 -0
  100. package/dist/src/shared/mcp/functions/handle-tool-check.function.d.ts +11 -0
  101. package/dist/src/shared/mcp/functions/handle-tool-content.function.d.ts +12 -0
  102. package/dist/src/shared/mcp/functions/handle-tool-export.function.d.ts +12 -0
  103. package/dist/src/shared/mcp/functions/handle-tool-gc.function.d.ts +11 -0
  104. package/dist/src/shared/mcp/functions/handle-tool-learn.function.d.ts +12 -0
  105. package/dist/src/shared/mcp/functions/handle-tool-rebuild.function.d.ts +11 -0
  106. package/dist/src/shared/mcp/functions/handle-tool-retrieve.function.d.ts +12 -0
  107. package/dist/src/shared/mcp/functions/handle-tool-search.function.d.ts +13 -0
  108. package/dist/src/shared/mcp/functions/handle-tool-skill-delete.function.d.ts +12 -0
  109. package/dist/src/shared/mcp/functions/handle-tool-skill-get.function.d.ts +13 -0
  110. package/dist/src/shared/mcp/functions/handle-tool-skill-learn.function.d.ts +13 -0
  111. package/dist/src/shared/mcp/functions/handle-tool-skill-list.function.d.ts +11 -0
  112. package/dist/src/shared/mcp/functions/handle-tool-status.function.d.ts +11 -0
  113. package/dist/src/shared/mcp/functions/handle-tool-unlearn.function.d.ts +12 -0
  114. package/dist/src/shared/mcp/functions/parse-agent-meta.function.d.ts +14 -0
  115. package/dist/src/shared/mcp/functions/parse-skill-arguments.function.d.ts +11 -0
  116. package/dist/src/shared/mcp/functions/read-agent-meta.function.d.ts +17 -0
  117. package/dist/src/shared/mcp/functions/resolve-skill-refs.function.d.ts +23 -0
  118. package/dist/src/shared/mcp/functions/run-startup-health-check.function.d.ts +14 -0
  119. package/dist/src/shared/mcp/typings/mcp-capabilities.interface.d.ts +16 -0
  120. package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +2 -0
  121. package/dist/src/shared/mcp/typings/mcp-completion.interface.d.ts +43 -0
  122. package/dist/src/shared/mcp/typings/mcp-content-result.model.d.ts +9 -0
  123. package/dist/src/shared/mcp/typings/mcp-export-result.model.d.ts +11 -0
  124. package/dist/src/shared/mcp/typings/mcp-gc-result.model.d.ts +15 -0
  125. package/dist/src/shared/mcp/typings/mcp-integrity-check-result.model.d.ts +16 -0
  126. package/dist/src/shared/mcp/typings/mcp-integrity-error.model.d.ts +9 -0
  127. package/dist/src/shared/mcp/typings/mcp-notification.interface.d.ts +9 -0
  128. package/dist/src/shared/mcp/typings/mcp-rebuild-result.model.d.ts +9 -0
  129. package/dist/src/shared/mcp/typings/mcp-request.interface.d.ts +11 -0
  130. package/dist/src/shared/mcp/typings/mcp-resource-result.interface.d.ts +12 -0
  131. package/dist/src/shared/mcp/typings/mcp-resource-template.interface.d.ts +11 -0
  132. package/dist/src/shared/mcp/typings/mcp-response.interface.d.ts +18 -0
  133. package/dist/src/shared/mcp/typings/mcp-server-info.interface.d.ts +7 -0
  134. package/dist/src/shared/mcp/typings/mcp-server-state.interface.d.ts +16 -0
  135. package/dist/src/shared/mcp/typings/mcp-tool-annotations.interface.d.ts +32 -0
  136. package/dist/src/shared/mcp/typings/mcp-tool-definition.interface.d.ts +15 -0
  137. package/dist/src/shared/mcp/typings/mcp-tool-result.interface.d.ts +19 -0
  138. package/dist/src/shared/mcp/typings/mcp-worker-client.interface.d.ts +220 -0
  139. package/dist/src/shared/mcp/typings/tool-call-result.model.d.ts +17 -0
  140. package/dist/src/shared/sync/functions/build-import-report.function.d.ts +18 -0
  141. package/dist/src/shared/sync/functions/parse-export-entry.function.d.ts +11 -0
  142. package/dist/src/shared/sync/functions/resolve-conflict.function.d.ts +13 -0
  143. package/dist/src/shared/sync/functions/serialize-export-entry.function.d.ts +8 -0
  144. package/dist/src/shared/sync/index.d.ts +9 -0
  145. package/dist/src/shared/sync/typings/conflict-resolution.type.d.ts +8 -0
  146. package/dist/src/shared/sync/typings/export-entry.interface.d.ts +13 -0
  147. package/dist/src/shared/sync/typings/export-options.interface.d.ts +9 -0
  148. package/dist/src/shared/sync/typings/import-options.interface.d.ts +7 -0
  149. package/dist/src/shared/sync/typings/import-report.interface.d.ts +15 -0
  150. package/dist/src/shared/wasm-codec/functions/decode-one-recall-result.function.d.ts +14 -0
  151. package/dist/src/shared/wasm-codec/functions/decode-option-string.function.d.ts +12 -0
  152. package/dist/src/shared/wasm-codec/functions/decode-recall-document.function.d.ts +14 -0
  153. package/dist/src/shared/wasm-codec/functions/decode-recall-reference.function.d.ts +14 -0
  154. package/dist/src/shared/wasm-codec/functions/decode-recall-sibling.function.d.ts +13 -0
  155. package/dist/src/shared/wasm-codec/functions/decode-section-match.function.d.ts +15 -0
  156. package/dist/src/shared/wasm-codec/functions/decode-section-record-trailing.function.d.ts +14 -0
  157. package/dist/src/shared/wasm-codec/functions/decode-section-record.function.d.ts +14 -0
  158. package/dist/src/shared/wasm-codec/functions/decode-section-type.function.d.ts +13 -0
  159. package/dist/src/shared/wasm-codec/functions/decode-wasm-list.function.d.ts +17 -0
  160. package/dist/src/shared/wasm-codec/typings/add-section-input.model.d.ts +45 -0
  161. package/dist/src/shared/wasm-codec/typings/add-section-result.model.d.ts +27 -0
  162. package/dist/src/shared/wasm-codec/typings/document-manifest.model.d.ts +19 -0
  163. package/dist/src/shared/wasm-codec/typings/document-section.model.d.ts +12 -0
  164. package/dist/src/shared/wasm-codec/typings/item-decoder.type.d.ts +6 -0
  165. package/dist/src/shared/wasm-codec/typings/near-duplicate.model.d.ts +16 -0
  166. package/dist/src/shared/wasm-codec/typings/paged-search-result.model.d.ts +21 -0
  167. package/dist/src/shared/wasm-codec/typings/section-match.model.d.ts +31 -0
  168. package/dist/src/shared/wasm-codec/typings/section-record-trailing.model.d.ts +38 -0
  169. package/dist/src/shared/wasm-codec/typings/section-record.model.d.ts +66 -0
  170. package/dist/src/shared/wasm-codec/typings/section-type-result.model.d.ts +12 -0
  171. package/dist/src/shared/worker-client/functions/handle-ipc-data.function.d.ts +16 -0
  172. package/dist/src/shared/worker-client/functions/send-ipc-request.function.d.ts +19 -0
  173. package/dist/src/shared/worker-client/typings/add-section-result.model.d.ts +2 -0
  174. package/dist/src/shared/worker-client/typings/json-rpc-response.interface.d.ts +16 -0
  175. package/dist/src/shared/worker-client/typings/pending-call.interface.d.ts +7 -0
  176. package/dist/src/shared/worker-client/typings/recall-document.model.d.ts +16 -0
  177. package/dist/src/shared/worker-client/typings/recall-params.model.d.ts +15 -0
  178. package/dist/src/shared/worker-client/typings/recall-reference.model.d.ts +32 -0
  179. package/dist/src/shared/worker-client/typings/recall-sibling.model.d.ts +11 -0
  180. package/dist/src/shared/worker-client/typings/recall-single-result.model.d.ts +40 -0
  181. package/dist/src/shared/worker-daemon/classes/ipc-error.class.d.ts +17 -0
  182. package/dist/src/shared/worker-daemon/constants/wasm-method-map.constant.d.ts +16 -0
  183. package/dist/src/shared/worker-daemon/functions/build-ipc-error-response.function.d.ts +9 -0
  184. package/dist/src/shared/worker-daemon/functions/check-catalog-version.function.d.ts +9 -0
  185. package/dist/src/shared/worker-daemon/functions/check-preconditions.function.d.ts +10 -0
  186. package/dist/src/shared/worker-daemon/functions/detect-stale-pid.function.d.ts +15 -0
  187. package/dist/src/shared/worker-daemon/functions/dispatch-request.function.d.ts +35 -0
  188. package/dist/src/shared/worker-daemon/functions/handle-check-version.function.d.ts +23 -0
  189. package/dist/src/shared/worker-daemon/functions/handle-config-method.function.d.ts +11 -0
  190. package/dist/src/shared/worker-daemon/functions/handle-read-ops.function.d.ts +52 -0
  191. package/dist/src/shared/worker-daemon/functions/handle-write-ops.function.d.ts +44 -0
  192. package/dist/src/shared/worker-daemon/functions/parse-auto-capture-section.function.d.ts +14 -0
  193. package/dist/src/shared/worker-daemon/functions/parse-catalog-version.function.d.ts +10 -0
  194. package/dist/src/shared/worker-daemon/functions/parse-embedding-section.function.d.ts +13 -0
  195. package/dist/src/shared/worker-daemon/functions/parse-worker-toml.function.d.ts +11 -0
  196. package/dist/src/shared/worker-daemon/functions/run-startup-integrity-check.function.d.ts +18 -0
  197. package/dist/src/shared/worker-daemon/functions/scan-near-duplicates.function.d.ts +21 -0
  198. package/dist/src/shared/worker-daemon/functions/wasm-bridge.function.d.ts +51 -0
  199. package/dist/src/shared/worker-daemon/functions/wasm-memory-helpers.function.d.ts +22 -0
  200. package/dist/src/shared/worker-daemon/functions/write-lock.function.d.ts +32 -0
  201. package/dist/src/shared/worker-daemon/typings/allocator-ref.interface.d.ts +16 -0
  202. package/dist/src/shared/worker-daemon/typings/daemon-config.interface.d.ts +6 -0
  203. package/dist/src/shared/worker-daemon/typings/fs-adapter.interface.d.ts +22 -0
  204. package/dist/src/shared/worker-daemon/typings/handler-context.interface.d.ts +18 -0
  205. package/dist/src/shared/worker-daemon/typings/memory-ref.interface.d.ts +13 -0
  206. package/dist/src/shared/worker-daemon/typings/wasm-fn.type.d.ts +2 -0
  207. package/dist/src/shared/worker-daemon/typings/write-lock.interface.d.ts +15 -0
  208. package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  209. package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  210. package/docs/details/mcp-server.md +4 -2
  211. package/docs/goals/auto-capture.md +378 -0
  212. package/docs/goals/benchmarking.md +296 -0
  213. package/docs/goals/concurrency.md +259 -0
  214. package/docs/goals/hybrid-search.md +436 -0
  215. package/docs/goals/semantic-dedup.md +229 -0
  216. package/docs/goals/sync.md +217 -0
  217. package/docs/modules/rust/fs-database/indexes/vectors.md +110 -0
  218. package/docs/modules/typescript/shared/auto-capture/module.md +73 -0
  219. package/docs/modules/typescript/shared/embedding/functions.md +94 -0
  220. package/docs/modules/typescript/shared/embedding/module.md +71 -0
  221. package/docs/modules/typescript/shared/embedding/typings.md +122 -0
  222. package/docs/overview.md +148 -166
  223. package/docs/release-notes/0.2.0.md +3 -3
  224. package/docs/release-notes/0.3.0.md +89 -0
  225. package/docs/release-notes/0.3.1.md +111 -0
  226. package/docs/release-notes/README.md +2 -0
  227. package/package.json +1 -1
  228. package/src/shared/auto-capture/classes/auto-capture-controller.class.ts +62 -0
  229. package/src/shared/auto-capture/constants/auto-capture-defaults.constant.ts +15 -0
  230. package/src/shared/auto-capture/functions/build-capture-prompt.function.ts +27 -0
  231. package/src/shared/auto-capture/functions/evaluate-trigger.function.ts +50 -0
  232. package/src/shared/auto-capture/index.ts +7 -0
  233. package/src/shared/auto-capture/typings/auto-capture-config.interface.ts +13 -0
  234. package/src/shared/auto-capture/typings/auto-capture-state.interface.ts +13 -0
  235. package/src/shared/auto-capture/typings/auto-capture-trigger.interface.ts +7 -0
  236. package/src/shared/cli/constants/global-help.constant.ts +73 -0
  237. package/src/shared/cli/constants/leaf-help.constant.ts +219 -0
  238. package/src/shared/cli/constants/memory-protocol-body.constant.ts +39 -0
  239. package/src/shared/cli/constants/query-guidance-body.constant.ts +37 -0
  240. package/src/shared/cli/constants/subcommand-help.constant.ts +195 -0
  241. package/src/shared/cli/functions/collect-files.function.ts +55 -0
  242. package/src/shared/cli/functions/compute-section-kbid.function.ts +49 -0
  243. package/src/shared/cli/functions/format-mcp-output.function.ts +41 -0
  244. package/src/shared/cli/functions/format-text-output.function.ts +42 -0
  245. package/src/shared/cli/functions/generate-group-help.function.ts +41 -0
  246. package/src/shared/cli/functions/handle-data-command.function.ts +67 -0
  247. package/src/shared/cli/functions/handle-mcp.function.ts +56 -0
  248. package/src/shared/cli/functions/handle-migrate.function.ts +64 -0
  249. package/src/shared/cli/functions/hydrate-search-previews.function.ts +29 -0
  250. package/src/shared/cli/functions/parse-args.function.ts +3 -0
  251. package/src/shared/cli/functions/resolve-skill-names.function.ts +43 -0
  252. package/src/shared/cli/functions/run-search.function.ts +2 -0
  253. package/src/shared/cli/functions/version-gate.function.ts +44 -0
  254. package/src/shared/cli/functions/wrap-command.function.ts +34 -0
  255. package/src/shared/cli/typings/agent-create-client.interface.ts +47 -0
  256. package/src/shared/cli/typings/agent-get-client.interface.ts +39 -0
  257. package/src/shared/cli/typings/check-client.interface.ts +66 -0
  258. package/src/shared/cli/typings/cli-deps.interface.ts +54 -0
  259. package/src/shared/cli/typings/cli-options.interface.ts +2 -0
  260. package/src/shared/cli/typings/disconnectable-client.interface.ts +29 -0
  261. package/src/shared/cli/typings/dispatch-client.type.ts +46 -0
  262. package/src/shared/cli/typings/learn-client.interface.ts +53 -0
  263. package/src/shared/cli/typings/learn-io.interface.ts +5 -0
  264. package/src/shared/cli/typings/search-client.interface.ts +73 -0
  265. package/src/shared/embedding/classes/null-embedding-provider.class.ts +29 -0
  266. package/src/shared/embedding/constants/near-duplicate-thresholds.constant.ts +17 -0
  267. package/src/shared/embedding/functions/build-vector-index.function.ts +79 -0
  268. package/src/shared/embedding/functions/cosine-similarity.function.ts +31 -0
  269. package/src/shared/embedding/functions/detect-near-duplicates.function.ts +69 -0
  270. package/src/shared/embedding/functions/jaccard-coefficient.function.ts +26 -0
  271. package/src/shared/embedding/functions/read-vector-index-meta.function.ts +44 -0
  272. package/src/shared/embedding/functions/rrf-fuse.function.ts +33 -0
  273. package/src/shared/embedding/functions/search-vectors.function.ts +59 -0
  274. package/src/shared/embedding/index.ts +20 -0
  275. package/src/shared/embedding/typings/embedding-config.interface.ts +23 -0
  276. package/src/shared/embedding/typings/embedding-provider.interface.ts +25 -0
  277. package/src/shared/embedding/typings/near-duplicate-candidate.model.ts +25 -0
  278. package/src/shared/embedding/typings/near-duplicate-result.model.ts +26 -0
  279. package/src/shared/embedding/typings/vector-index-entry.model.ts +13 -0
  280. package/src/shared/embedding/typings/vector-index-meta.model.ts +14 -0
  281. package/src/shared/embedding/typings/vector-search-result.model.ts +8 -0
  282. package/src/shared/mcp/classes/mcp-server.class.ts +6 -3
  283. package/src/shared/mcp/constants/tool-agent-create.constant.ts +39 -0
  284. package/src/shared/mcp/constants/tool-agent-delete.constant.ts +26 -0
  285. package/src/shared/mcp/constants/tool-agent-get.constant.ts +24 -0
  286. package/src/shared/mcp/constants/tool-agent-list.constant.ts +18 -0
  287. package/src/shared/mcp/constants/tool-auto-capture-review.constant.ts +32 -0
  288. package/src/shared/mcp/constants/tool-check.constant.ts +21 -0
  289. package/src/shared/mcp/constants/tool-content.constant.ts +29 -0
  290. package/src/shared/mcp/constants/tool-export.constant.ts +27 -0
  291. package/src/shared/mcp/constants/tool-gc.constant.ts +21 -0
  292. package/src/shared/mcp/constants/tool-learn.constant.ts +58 -0
  293. package/src/shared/mcp/constants/tool-rebuild.constant.ts +21 -0
  294. package/src/shared/mcp/constants/tool-recall.constant.ts +36 -0
  295. package/src/shared/mcp/constants/tool-retrieve.constant.ts +31 -0
  296. package/src/shared/mcp/constants/tool-search.constant.ts +51 -0
  297. package/src/shared/mcp/constants/tool-skill-delete.constant.ts +24 -0
  298. package/src/shared/mcp/constants/tool-skill-get.constant.ts +27 -0
  299. package/src/shared/mcp/constants/tool-skill-learn.constant.ts +37 -0
  300. package/src/shared/mcp/constants/tool-skill-list.constant.ts +18 -0
  301. package/src/shared/mcp/constants/tool-status.constant.ts +20 -0
  302. package/src/shared/mcp/constants/tool-unlearn.constant.ts +25 -0
  303. package/src/shared/mcp/functions/as-boolean-or-undefined.function.ts +11 -0
  304. package/src/shared/mcp/functions/as-string-array-or-undefined.function.ts +17 -0
  305. package/src/shared/mcp/functions/as-string-array.function.ts +15 -0
  306. package/src/shared/mcp/functions/as-string.function.ts +10 -0
  307. package/src/shared/mcp/functions/build-skills-text.function.ts +43 -0
  308. package/src/shared/mcp/functions/create-tool-definitions.function.ts +28 -0
  309. package/src/shared/mcp/functions/handle-agent-create.function.ts +1 -1
  310. package/src/shared/mcp/functions/handle-agent-prompt.function.ts +68 -0
  311. package/src/shared/mcp/functions/handle-mcp-request.function.ts +202 -0
  312. package/src/shared/mcp/functions/handle-prompt-get.function.ts +18 -12
  313. package/src/shared/mcp/functions/handle-skill-prompt.function.ts +44 -0
  314. package/src/shared/mcp/functions/handle-tool-auto-capture-review.function.ts +24 -0
  315. package/src/shared/mcp/functions/handle-tool-call.function.ts +18 -0
  316. package/src/shared/mcp/functions/handle-tool-check.function.ts +21 -0
  317. package/src/shared/mcp/functions/handle-tool-content.function.ts +23 -0
  318. package/src/shared/mcp/functions/handle-tool-export.function.ts +25 -0
  319. package/src/shared/mcp/functions/handle-tool-gc.function.ts +21 -0
  320. package/src/shared/mcp/functions/handle-tool-learn.function.ts +69 -0
  321. package/src/shared/mcp/functions/handle-tool-rebuild.function.ts +21 -0
  322. package/src/shared/mcp/functions/handle-tool-retrieve.function.ts +40 -0
  323. package/src/shared/mcp/functions/handle-tool-search.function.ts +47 -0
  324. package/src/shared/mcp/functions/handle-tool-skill-delete.function.ts +34 -0
  325. package/src/shared/mcp/functions/handle-tool-skill-get.function.ts +59 -0
  326. package/src/shared/mcp/functions/handle-tool-skill-learn.function.ts +61 -0
  327. package/src/shared/mcp/functions/handle-tool-skill-list.function.ts +39 -0
  328. package/src/shared/mcp/functions/handle-tool-status.function.ts +21 -0
  329. package/src/shared/mcp/functions/handle-tool-unlearn.function.ts +24 -0
  330. package/src/shared/mcp/functions/parse-agent-meta.function.ts +27 -0
  331. package/src/shared/mcp/functions/parse-skill-arguments.function.ts +36 -0
  332. package/src/shared/mcp/functions/read-agent-meta.function.ts +41 -0
  333. package/src/shared/mcp/functions/resolve-skill-refs.function.ts +50 -0
  334. package/src/shared/mcp/functions/run-startup-health-check.function.ts +34 -0
  335. package/src/shared/mcp/typings/mcp-capabilities.interface.ts +16 -0
  336. package/src/shared/mcp/typings/mcp-client.interface.ts +2 -0
  337. package/src/shared/mcp/typings/mcp-completion.interface.ts +45 -0
  338. package/src/shared/mcp/typings/mcp-content-result.model.ts +9 -0
  339. package/src/shared/mcp/typings/mcp-export-result.model.ts +11 -0
  340. package/src/shared/mcp/typings/mcp-gc-result.model.ts +15 -0
  341. package/src/shared/mcp/typings/mcp-integrity-check-result.model.ts +17 -0
  342. package/src/shared/mcp/typings/mcp-integrity-error.model.ts +15 -0
  343. package/src/shared/mcp/typings/mcp-notification.interface.ts +9 -0
  344. package/src/shared/mcp/typings/mcp-rebuild-result.model.ts +9 -0
  345. package/src/shared/mcp/typings/mcp-request.interface.ts +11 -0
  346. package/src/shared/mcp/typings/mcp-resource-result.interface.ts +12 -0
  347. package/src/shared/mcp/typings/mcp-resource-template.interface.ts +11 -0
  348. package/src/shared/mcp/typings/mcp-response.interface.ts +18 -0
  349. package/src/shared/mcp/typings/mcp-server-info.interface.ts +7 -0
  350. package/src/shared/mcp/typings/mcp-server-state.interface.ts +17 -0
  351. package/src/shared/mcp/typings/mcp-tool-annotations.interface.ts +32 -0
  352. package/src/shared/mcp/typings/mcp-tool-definition.interface.ts +16 -0
  353. package/src/shared/mcp/typings/mcp-tool-result.interface.ts +19 -0
  354. package/src/shared/mcp/typings/mcp-worker-client.interface.ts +243 -0
  355. package/src/shared/mcp/typings/tool-call-result.model.ts +18 -0
  356. package/src/shared/sync/functions/build-import-report.function.ts +40 -0
  357. package/src/shared/sync/functions/parse-export-entry.function.ts +45 -0
  358. package/src/shared/sync/functions/resolve-conflict.function.ts +31 -0
  359. package/src/shared/sync/functions/serialize-export-entry.function.ts +18 -0
  360. package/src/shared/sync/index.ts +9 -0
  361. package/src/shared/sync/typings/conflict-resolution.type.ts +8 -0
  362. package/src/shared/sync/typings/export-entry.interface.ts +13 -0
  363. package/src/shared/sync/typings/export-options.interface.ts +9 -0
  364. package/src/shared/sync/typings/import-options.interface.ts +7 -0
  365. package/src/shared/sync/typings/import-report.interface.ts +15 -0
  366. package/src/shared/wasm-codec/functions/decode-one-recall-result.function.ts +86 -0
  367. package/src/shared/wasm-codec/functions/decode-option-string.function.ts +24 -0
  368. package/src/shared/wasm-codec/functions/decode-recall-document.function.ts +59 -0
  369. package/src/shared/wasm-codec/functions/decode-recall-reference.function.ts +52 -0
  370. package/src/shared/wasm-codec/functions/decode-recall-sibling.function.ts +43 -0
  371. package/src/shared/wasm-codec/functions/decode-section-match.function.ts +80 -0
  372. package/src/shared/wasm-codec/functions/decode-section-record-trailing.function.ts +75 -0
  373. package/src/shared/wasm-codec/functions/decode-section-record.function.ts +85 -0
  374. package/src/shared/wasm-codec/functions/decode-section-type.function.ts +30 -0
  375. package/src/shared/wasm-codec/functions/decode-wasm-list.function.ts +31 -0
  376. package/src/shared/wasm-codec/typings/add-section-input.model.ts +45 -0
  377. package/src/shared/wasm-codec/typings/add-section-result.model.ts +28 -0
  378. package/src/shared/wasm-codec/typings/document-manifest.model.ts +20 -0
  379. package/src/shared/wasm-codec/typings/document-section.model.ts +12 -0
  380. package/src/shared/wasm-codec/typings/item-decoder.type.ts +10 -0
  381. package/src/shared/wasm-codec/typings/near-duplicate.model.ts +16 -0
  382. package/src/shared/wasm-codec/typings/paged-search-result.model.ts +22 -0
  383. package/src/shared/wasm-codec/typings/section-match.model.ts +31 -0
  384. package/src/shared/wasm-codec/typings/section-record-trailing.model.ts +38 -0
  385. package/src/shared/wasm-codec/typings/section-record.model.ts +66 -0
  386. package/src/shared/wasm-codec/typings/section-type-result.model.ts +12 -0
  387. package/src/shared/worker-client/functions/handle-ipc-data.function.ts +49 -0
  388. package/src/shared/worker-client/functions/send-ipc-request.function.ts +39 -0
  389. package/src/shared/worker-client/typings/add-section-result.model.ts +2 -0
  390. package/src/shared/worker-client/typings/json-rpc-response.interface.ts +17 -0
  391. package/src/shared/worker-client/typings/pending-call.interface.ts +7 -0
  392. package/src/shared/worker-client/typings/recall-document.model.ts +16 -0
  393. package/src/shared/worker-client/typings/recall-params.model.ts +15 -0
  394. package/src/shared/worker-client/typings/recall-reference.model.ts +32 -0
  395. package/src/shared/worker-client/typings/recall-sibling.model.ts +11 -0
  396. package/src/shared/worker-client/typings/recall-single-result.model.ts +41 -0
  397. package/src/shared/worker-daemon/classes/ipc-error.class.ts +22 -0
  398. package/src/shared/worker-daemon/constants/wasm-method-map.constant.ts +69 -0
  399. package/src/shared/worker-daemon/functions/build-ipc-error-response.function.ts +16 -0
  400. package/src/shared/worker-daemon/functions/check-catalog-version.function.ts +54 -0
  401. package/src/shared/worker-daemon/functions/check-preconditions.function.ts +28 -0
  402. package/src/shared/worker-daemon/functions/detect-stale-pid.function.ts +33 -0
  403. package/src/shared/worker-daemon/functions/dispatch-request.function.ts +190 -0
  404. package/src/shared/worker-daemon/functions/handle-check-version.function.ts +74 -0
  405. package/src/shared/worker-daemon/functions/handle-config-method.function.ts +27 -0
  406. package/src/shared/worker-daemon/functions/handle-read-ops.function.ts +236 -0
  407. package/src/shared/worker-daemon/functions/handle-write-ops.function.ts +257 -0
  408. package/src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts +51 -0
  409. package/src/shared/worker-daemon/functions/parse-catalog-version.function.ts +20 -0
  410. package/src/shared/worker-daemon/functions/parse-embedding-section.function.ts +38 -0
  411. package/src/shared/worker-daemon/functions/parse-worker-toml.function.ts +104 -0
  412. package/src/shared/worker-daemon/functions/run-startup-integrity-check.function.ts +55 -0
  413. package/src/shared/worker-daemon/functions/scan-near-duplicates.function.ts +92 -0
  414. package/src/shared/worker-daemon/functions/wasm-bridge.function.ts +144 -0
  415. package/src/shared/worker-daemon/functions/wasm-memory-helpers.function.ts +41 -0
  416. package/src/shared/worker-daemon/functions/write-lock.function.ts +49 -0
  417. package/src/shared/worker-daemon/typings/allocator-ref.interface.ts +16 -0
  418. package/src/shared/worker-daemon/typings/daemon-config.interface.ts +7 -0
  419. package/src/shared/worker-daemon/typings/fs-adapter.interface.ts +22 -0
  420. package/src/shared/worker-daemon/typings/handler-context.interface.ts +19 -0
  421. package/src/shared/worker-daemon/typings/memory-ref.interface.ts +13 -0
  422. package/src/shared/worker-daemon/typings/wasm-fn.type.ts +2 -0
  423. package/src/shared/worker-daemon/typings/write-lock.interface.ts +13 -0
  424. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  425. package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
@@ -0,0 +1,378 @@
1
+ # Auto-Capture -- Proactive Knowledge Capture Hooks
2
+
3
+ *Server-side enforcement of knowledge capture that
4
+ closes the gap between agent intent and reliable
5
+ storage -- without requiring the agent to remember
6
+ to act.*
7
+
8
+ ## Goal
9
+
10
+ The `memory-protocol` skill (see [Skills](skills.md))
11
+ teaches an agent what to store, but enforcement
12
+ depends entirely on the agent choosing to act.
13
+ Agents are unreliable at remembering to call `learn`
14
+ after every significant exchange. Auto-capture closes
15
+ this gap by having the MCP server proactively issue
16
+ a sampling request to the host LLM, asking it to
17
+ review recent context and identify storable knowledge.
18
+
19
+ This is gap #2 from the
20
+ [Opus 4.8 second brain review](../issues/2026-06-23-opus-48-second-brain-review.md):
21
+
22
+ > A memory-protocol *skill* is intent, not
23
+ > enforcement -- agents are unreliable at remembering
24
+ > to write. Real second brains lean on auto-capture
25
+ > hooks.
26
+
27
+ Auto-capture is opt-in and default-disabled. It never
28
+ writes to the database without the host LLM's
29
+ explicit response identifying items to store.
30
+
31
+ ## MCP Sampling Approach
32
+
33
+ Auto-capture uses the MCP `sampling/createMessage`
34
+ capability. When a trigger fires, the kbdb MCP server
35
+ sends a `sampling/createMessage` request to the host
36
+ asking it to identify storable knowledge from the
37
+ current conversation context.
38
+
39
+ If the host's `initialize` response does not include
40
+ a `sampling` capability entry, auto-capture is
41
+ silently disabled for that session regardless of
42
+ configuration.
43
+
44
+ ### Sampling Prompt Template
45
+
46
+ ```
47
+ Review the recent conversation context. Identify any
48
+ durable facts, decisions, corrections, architecture
49
+ choices, or configuration details that should be
50
+ stored in the knowledge base for future sessions.
51
+
52
+ For each item, provide:
53
+ - title: short heading
54
+ - content: the fact or decision
55
+ - tags: relevant topic tags
56
+
57
+ Respond with JSON: {"items": [...]} or {"items": []}
58
+ if nothing is worth storing. Apply the same criteria
59
+ as the memory-protocol skill: store durable facts,
60
+ not transient context.
61
+ ```
62
+
63
+ The server sets `maxTokens` to a fixed ceiling (e.g.
64
+ 2048) to bound cost. The sampling request carries no
65
+ `systemPrompt` -- context comes from the host's own
66
+ conversation window.
67
+
68
+ ### Sampling Response Schema
69
+
70
+ The host LLM must respond with a JSON object at the
71
+ top level. The server parses the text content of the
72
+ sampling response and extracts:
73
+
74
+ ```json
75
+ {
76
+ "items": [
77
+ {
78
+ "title": "Postgres chosen for JSONB support",
79
+ "content": "We chose Postgres because JSONB
80
+ support simplifies document storage.",
81
+ "tags": ["architecture", "database"]
82
+ }
83
+ ]
84
+ }
85
+ ```
86
+
87
+ When `items` is empty or the response cannot be parsed
88
+ as valid JSON, the server takes no action and logs a
89
+ `debug`-level notification.
90
+
91
+ Each item in `items` is stored via `addSection` with
92
+ `sectionType: 'text/markdown'` and the
93
+ `auto-capture` tag appended to `tags`.
94
+
95
+ ## Trigger Points
96
+
97
+ Three independent trigger mechanisms fire a capture
98
+ review. All three can be active simultaneously.
99
+
100
+ ### 1. Tool-Call Count Trigger
101
+
102
+ The MCP server maintains a per-session counter of
103
+ tool invocations. When the count reaches a multiple
104
+ of `trigger_interval`, a capture review fires.
105
+
106
+ - The counter increments on every `tools/call`
107
+ dispatch, including read-only tools.
108
+ - The counter does not increment during the capture
109
+ review itself (no recursion).
110
+ - The review fires after the triggering tool call
111
+ returns its result to the agent, not before.
112
+
113
+ Default: every 10 tool calls.
114
+
115
+ ### 2. Explicit Tool Trigger
116
+
117
+ The `auto-capture-review` tool is always registered,
118
+ regardless of whether auto-capture is enabled in
119
+ `worker.toml`. Agents or users can call it at any
120
+ time to request an immediate capture review.
121
+
122
+ When `dry_run: true` is passed, the review runs but
123
+ no sections are written. See [MCP Surface](#mcp-surface).
124
+
125
+ ### 3. Session-End Trigger
126
+
127
+ When the MCP connection closes gracefully (stdin EOF
128
+ or explicit disconnect), one final capture review
129
+ runs before the server exits.
130
+
131
+ The session-end trigger fires only when
132
+ `auto_capture.enabled` is `true`. It does not fire
133
+ when the connection is lost abruptly (SIGKILL, socket
134
+ drop).
135
+
136
+ ## Configuration
137
+
138
+ Auto-capture is configured in `worker.toml` under the
139
+ `[auto_capture]` table:
140
+
141
+ ```toml
142
+ [auto_capture]
143
+ enabled = false # opt-in, default off
144
+ trigger_interval = 10 # tool calls between reviews
145
+ max_captures_per_session = 20 # rate limit
146
+ dry_run = false # log without writing
147
+ ```
148
+
149
+ | Field | Type | Default | Description |
150
+ |-------|------|---------|-------------|
151
+ | `enabled` | bool | `false` | Enable auto-capture for all MCP sessions |
152
+ | `trigger_interval` | integer | `10` | Tool calls between automatic reviews |
153
+ | `max_captures_per_session` | integer | `20` | Maximum sections stored per session |
154
+ | `dry_run` | bool | `false` | Log what would be stored; write nothing |
155
+
156
+ When `enabled` is `false`, only the `auto-capture-review`
157
+ tool remains active. The tool-call count and
158
+ session-end triggers are suppressed.
159
+
160
+ ## Guard Rails
161
+
162
+ ### Rate Limiting
163
+
164
+ The server tracks the number of sections stored
165
+ during the current MCP session. When
166
+ `max_captures_per_session` is reached, further
167
+ automatic reviews are skipped. The
168
+ `auto-capture-review` tool still runs but returns a
169
+ rate-limit message instead of executing the review.
170
+
171
+ The counter resets when the MCP session ends. It is
172
+ not persisted across sessions.
173
+
174
+ ### Dry-Run Mode
175
+
176
+ When `dry_run` is `true` (either from `worker.toml`
177
+ or the `auto-capture-review` tool parameter), the
178
+ server executes the full review -- sends the sampling
179
+ request, parses the response, and evaluates items --
180
+ but does not call `addSection`. Instead, it emits a
181
+ `notifications/message` at `info` level describing
182
+ what would have been stored.
183
+
184
+ Dry-run mode is useful for tuning `trigger_interval`
185
+ and verifying that the sampling prompt produces
186
+ reasonable output before enabling writes.
187
+
188
+ ### Deduplication
189
+
190
+ Before storing each item from the sampling response,
191
+ the server searches the database for existing sections
192
+ with similar content. If any existing section has a
193
+ Jaccard similarity >= 0.85 to the candidate item, the
194
+ item is skipped and logged at `debug` level.
195
+
196
+ This uses the same near-duplicate detection that the
197
+ `learn` tool uses, reflected in the `near_duplicates`
198
+ field of `AddSectionResult`.
199
+
200
+ ### No Recursion
201
+
202
+ The tool-call counter does not increment during an
203
+ active capture review. The `addSection` calls made
204
+ by auto-capture do not trigger a nested review.
205
+
206
+ ### Agent Override
207
+
208
+ Auto-capture never overrides an agent's explicit
209
+ decision not to store something. If an agent
210
+ calls `unlearn` to remove a section, auto-capture
211
+ will not re-add it in the same session (the content's
212
+ kbid is added to a per-session exclusion set after
213
+ removal).
214
+
215
+ ## Interaction with the memory-protocol Skill
216
+
217
+ | Aspect | memory-protocol | Auto-capture |
218
+ |--------|-----------------|--------------|
219
+ | Audience | Agent (reads skill text) | MCP server (server-side) |
220
+ | Mechanism | Teaches filtering criteria | Sends sampling request |
221
+ | Enforcement | Agent must choose to act | Server acts automatically |
222
+ | Criteria | Defined in skill body | Sampling prompt mirrors skill |
223
+ | Override | Agent decides | Agent's `unlearn` is respected |
224
+
225
+ Both mechanisms apply the same filtering criteria --
226
+ store durable facts, skip transient context. They are
227
+ complementary: `memory-protocol` is agent-facing
228
+ intent; auto-capture is server-side enforcement.
229
+
230
+ ## CLI Surface
231
+
232
+ The `--auto-capture` flag on `kbdb mcp` enables
233
+ auto-capture for the current session, overriding the
234
+ `enabled` value in `worker.toml`:
235
+
236
+ ```
237
+ kbdb mcp --db <path> [--auto-capture]
238
+ ```
239
+
240
+ The flag does not accept a value -- its presence sets
241
+ `enabled: true`. It does not override other fields
242
+ (`trigger_interval`, `max_captures_per_session`,
243
+ `dry_run`), which continue to come from `worker.toml`
244
+ or their defaults.
245
+
246
+ ## MCP Surface
247
+
248
+ ### auto-capture-review Tool
249
+
250
+ Triggers an immediate capture review regardless of
251
+ whether auto-capture is enabled in configuration.
252
+
253
+ **Parameters:**
254
+
255
+ | Name | Type | Required | Description |
256
+ |------|------|----------|-------------|
257
+ | `dry_run` | boolean | no | When `true`, evaluate but do not write (default: `false`) |
258
+
259
+ **Returns:**
260
+
261
+ ```json
262
+ {
263
+ "captured": 2,
264
+ "items": [
265
+ {
266
+ "title": "Postgres chosen for JSONB support",
267
+ "kbid": "a1b2c3d4e5f6g7h8j9k0l1m2n3"
268
+ }
269
+ ],
270
+ "skipped": 1,
271
+ "dry_run": false
272
+ }
273
+ ```
274
+
275
+ | Field | Description |
276
+ |-------|-------------|
277
+ | `captured` | Number of sections written (0 when `dry_run: true`) |
278
+ | `items` | Array of `{ title, kbid }` for each section stored |
279
+ | `skipped` | Items returned by LLM but not stored (duplicates, parse errors, rate limit) |
280
+ | `dry_run` | Reflects the effective dry-run mode used |
281
+
282
+ When sampling is not supported by the host, the tool
283
+ returns `isError: true` with message:
284
+ `"Host does not support sampling; auto-capture-review
285
+ unavailable"`.
286
+
287
+ **Tool annotation:**
288
+
289
+ | Attribute | Value |
290
+ |-----------|-------|
291
+ | `readOnlyHint` | `false` |
292
+ | `destructiveHint` | `false` |
293
+ | `idempotentHint` | `false` |
294
+ | `openWorldHint` | `false` |
295
+
296
+ ### Capability Advertisement
297
+
298
+ When `sampling` is present in the host's `initialize`
299
+ capabilities, the server advertises the `sampling`
300
+ capability in its own `initialize` response. When
301
+ `sampling` is absent, the capability is omitted from
302
+ the response and auto-capture is silently disabled.
303
+
304
+ ## Response Flow
305
+
306
+ ```
307
+ Agent uses kbdb tools
308
+ |
309
+ v
310
+ Tool call count reaches N
311
+ |
312
+ v
313
+ Server sends sampling/createMessage
314
+ |
315
+ v
316
+ Host LLM reviews conversation context
317
+ |
318
+ v
319
+ Returns {"items": [...]} or {"items": []}
320
+ |
321
+ v
322
+ Server deduplicates against existing sections
323
+ |
324
+ v
325
+ Server stores each new item via addSection
326
+ (with "auto-capture" tag appended)
327
+ |
328
+ v
329
+ notifications/message logged (info level)
330
+ ```
331
+
332
+ When the host does not support sampling, or when
333
+ `enabled` is `false` and the trigger is automatic
334
+ (not the explicit tool), the flow terminates after
335
+ the trigger fires with a `debug`-level log and no
336
+ sampling request is sent.
337
+
338
+ ## Tagging
339
+
340
+ Every section stored by auto-capture receives the
341
+ `auto-capture` tag appended to any tags the sampling
342
+ response supplied. This makes auto-captured sections
343
+ filterable and identifiable in search results and
344
+ integrity checks.
345
+
346
+ Example stored section tags when the sampling
347
+ response supplies `["architecture", "database"]`:
348
+
349
+ ```
350
+ ["architecture", "database", "auto-capture"]
351
+ ```
352
+
353
+ ## Design Constraints
354
+
355
+ - **Opt-in by default.** `enabled` is `false` in
356
+ `worker.toml` until explicitly set. No sections are
357
+ written without explicit configuration or the
358
+ `--auto-capture` flag.
359
+ - **Sampling required.** Auto-capture cannot function
360
+ without MCP sampling support. It is silently
361
+ disabled when the host omits the `sampling`
362
+ capability, with no error and no user-visible
363
+ change to other tools.
364
+ - **No recursion.** Auto-capture calls do not
365
+ increment the tool-call counter and do not trigger
366
+ nested reviews.
367
+ - **Agent override respected.** Sections removed by
368
+ an explicit `unlearn` call are not re-added by
369
+ auto-capture within the same session.
370
+ - **Rate-limited.** `max_captures_per_session`
371
+ prevents runaway storage from a misconfigured
372
+ trigger interval or a verbose LLM response.
373
+ - **Traceability.** Auto-captured sections always
374
+ carry the `auto-capture` tag so they can be
375
+ distinguished from manually learned content.
376
+ - **Dry-run available.** `dry_run` mode allows
377
+ operators to verify sampling output and tune
378
+ configuration before enabling writes.
@@ -0,0 +1,296 @@
1
+ # Scale Benchmarking -- Methodology and Performance Targets
2
+
3
+ *Quantify search latency, rebuild time, and memory
4
+ usage across realistic corpus sizes before trusting
5
+ kbdb as a long-lived knowledge base.*
6
+
7
+ ## Goal
8
+
9
+ kbdb is intended as a long-lived knowledge base for AI
10
+ agents. Before trusting it at scale, search latency,
11
+ rebuild time, and memory usage must be quantified across
12
+ realistic corpus sizes.
13
+
14
+ This document specifies the benchmark methodology, corpus
15
+ generation, metrics, and regression targets. It addresses
16
+ gap #4 from the
17
+ [Opus 4.8 Second Brain Review](../issues/2026-06-23-opus-48-second-brain-review.md):
18
+
19
+ > Scale of the lexical index at 50k-100k+ sections --
20
+ > search latency and rebuild time are worth benchmarking
21
+ > before trusting it as a long-lived brain.
22
+
23
+ ## Corpus Generation
24
+
25
+ A synthetic corpus generator lives in `bench/` and
26
+ creates realistic sections for repeatable benchmarks.
27
+
28
+ ### Generator Properties
29
+
30
+ - **Term distribution** -- Word frequencies follow a
31
+ Zipfian distribution. A small vocabulary of high-
32
+ frequency terms dominates each section, with a long
33
+ tail of rare terms. This matches real-world prose.
34
+ - **Title length** -- 3 to 8 words drawn from the
35
+ vocabulary.
36
+ - **Body length** -- 100 to 500 words, configurable via
37
+ `avg body length` parameter.
38
+ - **Vocabulary** -- Terms drawn from a 50,000-word
39
+ English dictionary subset. The same dictionary is used
40
+ for all corpus sizes so cross-size comparisons are
41
+ valid.
42
+ - **Cross-references** -- Sections reference each other
43
+ via `$(link:)` markers at a configurable density
44
+ (default: 5% of sections link to one other section).
45
+ - **Tags** -- Each section is assigned one to three tags
46
+ from a pool of 20 topic tags.
47
+ - **Determinism** -- The generator accepts a seed
48
+ parameter. Fixed seed produces identical corpus across
49
+ runs. Results are reproducible across machines.
50
+
51
+ ### Generator Parameters
52
+
53
+ | Parameter | Default | Description |
54
+ |-----------|---------|-------------|
55
+ | `--count` | 1000 | Number of sections to generate |
56
+ | `--avg-body-length` | 250 | Average body word count |
57
+ | `--ref-density` | 0.05 | Fraction of sections with a cross-reference |
58
+ | `--seed` | 42 | RNG seed for reproducibility |
59
+ | `--out` | `./bench/corpus/` | Output directory |
60
+
61
+ ## Corpus Sizes
62
+
63
+ | Label | Sections | Estimated disk size |
64
+ |-------|----------|---------------------|
65
+ | Small | 1,000 | ~5 MB |
66
+ | Medium | 10,000 | ~50 MB |
67
+ | Large | 50,000 | ~250 MB |
68
+ | XLarge | 100,000 | ~500 MB |
69
+
70
+ All corpus sizes use the same generator with the same
71
+ seed and vocabulary. The only difference is the
72
+ `--count` parameter.
73
+
74
+ ## Operations to Benchmark
75
+
76
+ | Operation | Description | Variants |
77
+ |-----------|-------------|----------|
78
+ | `search` | Single-query search | cold cache, warm cache |
79
+ | `learn` | Add a single section | with/without embedding |
80
+ | `batch-learn` | Add 100 sections | sequential |
81
+ | `rebuild` | Full index rebuild | lexical only, hybrid |
82
+ | `gc` | Garbage collection | after superseding 10% of sections |
83
+ | `check` | Integrity check | full scan |
84
+
85
+ ### Variant Definitions
86
+
87
+ **Cold cache** -- the worker daemon is started fresh
88
+ immediately before the timed operation. The WASM
89
+ linear memory page table and any in-process caches
90
+ are empty.
91
+
92
+ **Warm cache** -- the timed operation is preceded by
93
+ 10 identical operations that are not counted. The
94
+ daemon's in-process caches are populated.
95
+
96
+ **With embedding** -- an embedding provider is
97
+ configured. The `learn` operation includes embedding
98
+ computation time.
99
+
100
+ **After superseding 10%** -- before timing `gc`, 10%
101
+ of all sections are superseded (replaced) using the
102
+ `replace` flag, leaving their originals as unreferenced
103
+ candidates for collection.
104
+
105
+ ## Metrics
106
+
107
+ For each operation at each corpus size, the harness
108
+ collects:
109
+
110
+ - **p50, p95, p99 latency** (ms) -- percentiles across
111
+ N runs (default N = 10).
112
+ - **Throughput** (ops/sec) -- for batch operations
113
+ (`batch-learn`), calculated as
114
+ `(sections_per_batch * N) / total_elapsed_s`.
115
+ - **WASM linear memory high watermark** -- the
116
+ `WebAssembly.Memory` buffer byte size sampled
117
+ immediately after the operation completes.
118
+ - **Index file sizes** -- sizes in bytes of
119
+ `terms.idx`, `positions.idx`, `corpus.dat`, and
120
+ `vectors.idx` (if present) at each corpus size.
121
+ - **Resident memory of the worker daemon** -- OS-
122
+ reported RSS of the `kbdb-worker` process, sampled
123
+ after warm-up.
124
+
125
+ ## Performance Targets
126
+
127
+ The targets below define the maximum acceptable latency
128
+ for each operation at each corpus size. Results
129
+ exceeding a target mark that combination as a
130
+ regression.
131
+
132
+ | Operation | Corpus | Target |
133
+ |-----------|--------|--------|
134
+ | `search` (warm) | 1k | < 5 ms |
135
+ | `search` (warm) | 10k | < 15 ms |
136
+ | `search` (warm) | 50k | < 30 ms |
137
+ | `search` (warm) | 100k | < 50 ms |
138
+ | `search` (cold) | 100k | < 200 ms |
139
+ | `learn` (single) | any | < 100 ms |
140
+ | `rebuild` | 1k | < 2 s |
141
+ | `rebuild` | 10k | < 10 s |
142
+ | `rebuild` | 100k | < 30 s |
143
+ | `gc` | 100k | < 10 s |
144
+ | `check` | 100k | < 15 s |
145
+
146
+ Targets are per-operation p99 latency unless noted.
147
+ `learn (single)` and `rebuild` targets apply to p99
148
+ of the N-run sample.
149
+
150
+ ## Benchmark Harness
151
+
152
+ All benchmark tooling lives in `bench/`:
153
+
154
+ ```
155
+ bench/
156
+ generate-corpus.ts corpus generator script
157
+ run-benchmark.ts harness: run operations,
158
+ collect timing, emit JSON
159
+ report.ts format JSON results as
160
+ Markdown table
161
+ corpus/ generated corpus files
162
+ (gitignored)
163
+ results/ timestamped JSON result files
164
+ baselines/ per-platform baseline files
165
+ for regression comparison
166
+ ```
167
+
168
+ ### Harness Procedure
169
+
170
+ 1. Generate the corpus at target size using
171
+ `bench/generate-corpus.ts` with the configured
172
+ seed.
173
+ 2. Run `db init` to create a fresh `.kbdb` directory.
174
+ 3. Run `batch-learn` to populate the database with the
175
+ full generated corpus.
176
+ 4. For each operation variant, run the operation N
177
+ times (default N = 10), collecting wall-clock
178
+ elapsed time per run.
179
+ 5. Compute p50, p95, p99 from the N samples.
180
+ 6. Collect WASM memory and daemon RSS after each
181
+ operation.
182
+ 7. Write a JSON result file to `bench/results/` with
183
+ a timestamp suffix.
184
+ 8. Optionally compare against the baseline file in
185
+ `bench/baselines/` and emit a pass/fail summary.
186
+
187
+ The harness uses the public CLI and library API
188
+ exclusively. It does not import internal modules or
189
+ call WASM exports directly.
190
+
191
+ ### Result File Format
192
+
193
+ Each run produces one JSON file:
194
+
195
+ ```json
196
+ {
197
+ "timestamp": "2026-06-23T10:00:00Z",
198
+ "platform": "linux-x86_64",
199
+ "runtime": "node-22",
200
+ "corpus_size": "medium",
201
+ "results": [
202
+ {
203
+ "operation": "search",
204
+ "variant": "warm",
205
+ "n": 10,
206
+ "p50_ms": 8,
207
+ "p95_ms": 11,
208
+ "p99_ms": 14,
209
+ "wasm_memory_bytes": 4194304,
210
+ "daemon_rss_bytes": 52428800
211
+ }
212
+ ],
213
+ "index_sizes": {
214
+ "terms_idx_bytes": 1048576,
215
+ "positions_idx_bytes": 524288,
216
+ "corpus_dat_bytes": 65536,
217
+ "vectors_idx_bytes": null
218
+ }
219
+ }
220
+ ```
221
+
222
+ `vectors_idx_bytes` is `null` when no embedding
223
+ provider is configured.
224
+
225
+ ## Hybrid Search Benchmarks
226
+
227
+ When an embedding provider is configured, the harness
228
+ adds measurements for the vector path. These are
229
+ collected as a separate benchmark suite and not mixed
230
+ with the lexical-only results.
231
+
232
+ | Additional measurement | Description |
233
+ |------------------------|-------------|
234
+ | Embedding time per section | Elapsed ms for embedding computation during `learn` |
235
+ | Vector search latency | p50/p95/p99 of vector-only retrieval |
236
+ | Lexical search latency | p50/p95/p99 of lexical-only retrieval for the same queries |
237
+ | RRF fusion overhead | p50/p95/p99 of the fusion step alone (subtract lexical + vector from total) |
238
+ | Vector index rebuild time | p50/p95/p99 of `rebuild` with embedding enabled |
239
+ | `vectors.idx` size | File size in bytes at each corpus size |
240
+
241
+ Hybrid benchmarks require a running embedding provider.
242
+ The harness accepts `--embedding-provider` as a CLI
243
+ flag. When the flag is absent, hybrid measurements are
244
+ skipped and the harness prints a notice.
245
+
246
+ ## Regression Testing
247
+
248
+ Benchmark results from the current release are stored
249
+ in `bench/baselines/`. Baseline files are named by
250
+ platform and runtime:
251
+
252
+ ```
253
+ bench/baselines/
254
+ linux-x86_64-node-22.json
255
+ linux-x86_64-deno-2.json
256
+ ```
257
+
258
+ The harness compares fresh results against the
259
+ baseline and flags any p99 value that exceeds the
260
+ baseline by more than 20%. A flagged regression prints
261
+ to stderr and exits with a non-zero code.
262
+
263
+ Baselines are updated manually when a performance
264
+ improvement is intentional. The update command:
265
+
266
+ ```sh
267
+ node bench/run-benchmark.ts --update-baseline
268
+ ```
269
+
270
+ CI runs the full benchmark suite on every release
271
+ branch push. Regression failures block the release.
272
+
273
+ ## Design Constraints
274
+
275
+ - Benchmarks run on a single machine. No distributed
276
+ or multi-node testing is in scope.
277
+ - Corpus generation is deterministic. A fixed seed
278
+ always produces the same sections in the same order.
279
+ Results are reproducible across machines with the
280
+ same platform and runtime.
281
+ - The harness uses the public CLI and library API, not
282
+ internal modules. This ensures benchmarks measure the
283
+ end-to-end path that production callers experience.
284
+ - WASM memory measurement uses the
285
+ `WebAssembly.Memory` buffer byte size sampled via
286
+ the daemon's status response, which exposes the
287
+ current WASM linear memory page count. This is an
288
+ approximation of the high watermark, not a
289
+ continuous trace.
290
+ - Index file sizes are measured after the harness
291
+ operation completes by reading file sizes from the
292
+ `.kbdb/indexes/` directory. They are informational
293
+ and not subject to regression thresholds.
294
+ - Baseline files are per-platform and per-runtime.
295
+ A Linux x86_64 Node.js baseline is not compared
296
+ against a Deno run or a different architecture.