@dikolab/kbdb 0.3.0 → 0.3.2

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 (428) hide show
  1. package/README.md +89 -120
  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/cli.md +9 -0
  211. package/docs/details/mcp-server.md +5 -3
  212. package/docs/details/search-and-ranking.md +55 -0
  213. package/docs/goals/auto-capture.md +378 -0
  214. package/docs/goals/benchmarking.md +296 -0
  215. package/docs/goals/concurrency.md +259 -0
  216. package/docs/goals/hybrid-search.md +436 -0
  217. package/docs/goals/semantic-dedup.md +229 -0
  218. package/docs/goals/sync.md +217 -0
  219. package/docs/modules/rust/fs-database/indexes/vectors.md +110 -0
  220. package/docs/modules/typescript/shared/auto-capture/module.md +73 -0
  221. package/docs/modules/typescript/shared/embedding/functions.md +94 -0
  222. package/docs/modules/typescript/shared/embedding/module.md +71 -0
  223. package/docs/modules/typescript/shared/embedding/typings.md +122 -0
  224. package/docs/overview.md +171 -167
  225. package/docs/release-notes/0.2.0.md +3 -3
  226. package/docs/release-notes/0.3.0.md +89 -0
  227. package/docs/release-notes/0.3.1.md +121 -0
  228. package/docs/release-notes/0.3.2.md +64 -0
  229. package/docs/release-notes/README.md +3 -0
  230. package/package.json +1 -1
  231. package/src/shared/auto-capture/classes/auto-capture-controller.class.ts +62 -0
  232. package/src/shared/auto-capture/constants/auto-capture-defaults.constant.ts +15 -0
  233. package/src/shared/auto-capture/functions/build-capture-prompt.function.ts +27 -0
  234. package/src/shared/auto-capture/functions/evaluate-trigger.function.ts +50 -0
  235. package/src/shared/auto-capture/index.ts +7 -0
  236. package/src/shared/auto-capture/typings/auto-capture-config.interface.ts +13 -0
  237. package/src/shared/auto-capture/typings/auto-capture-state.interface.ts +13 -0
  238. package/src/shared/auto-capture/typings/auto-capture-trigger.interface.ts +7 -0
  239. package/src/shared/cli/constants/global-help.constant.ts +73 -0
  240. package/src/shared/cli/constants/leaf-help.constant.ts +219 -0
  241. package/src/shared/cli/constants/memory-protocol-body.constant.ts +39 -0
  242. package/src/shared/cli/constants/query-guidance-body.constant.ts +37 -0
  243. package/src/shared/cli/constants/subcommand-help.constant.ts +195 -0
  244. package/src/shared/cli/functions/collect-files.function.ts +55 -0
  245. package/src/shared/cli/functions/compute-section-kbid.function.ts +49 -0
  246. package/src/shared/cli/functions/format-mcp-output.function.ts +41 -0
  247. package/src/shared/cli/functions/format-text-output.function.ts +42 -0
  248. package/src/shared/cli/functions/generate-group-help.function.ts +41 -0
  249. package/src/shared/cli/functions/handle-data-command.function.ts +67 -0
  250. package/src/shared/cli/functions/handle-mcp.function.ts +56 -0
  251. package/src/shared/cli/functions/handle-migrate.function.ts +64 -0
  252. package/src/shared/cli/functions/hydrate-search-previews.function.ts +29 -0
  253. package/src/shared/cli/functions/parse-args.function.ts +3 -0
  254. package/src/shared/cli/functions/resolve-skill-names.function.ts +43 -0
  255. package/src/shared/cli/functions/run-search.function.ts +2 -0
  256. package/src/shared/cli/functions/version-gate.function.ts +44 -0
  257. package/src/shared/cli/functions/wrap-command.function.ts +34 -0
  258. package/src/shared/cli/typings/agent-create-client.interface.ts +47 -0
  259. package/src/shared/cli/typings/agent-get-client.interface.ts +39 -0
  260. package/src/shared/cli/typings/check-client.interface.ts +66 -0
  261. package/src/shared/cli/typings/cli-deps.interface.ts +54 -0
  262. package/src/shared/cli/typings/cli-options.interface.ts +2 -0
  263. package/src/shared/cli/typings/disconnectable-client.interface.ts +29 -0
  264. package/src/shared/cli/typings/dispatch-client.type.ts +46 -0
  265. package/src/shared/cli/typings/learn-client.interface.ts +53 -0
  266. package/src/shared/cli/typings/learn-io.interface.ts +5 -0
  267. package/src/shared/cli/typings/search-client.interface.ts +73 -0
  268. package/src/shared/embedding/classes/null-embedding-provider.class.ts +29 -0
  269. package/src/shared/embedding/constants/near-duplicate-thresholds.constant.ts +17 -0
  270. package/src/shared/embedding/functions/build-vector-index.function.ts +79 -0
  271. package/src/shared/embedding/functions/cosine-similarity.function.ts +31 -0
  272. package/src/shared/embedding/functions/detect-near-duplicates.function.ts +69 -0
  273. package/src/shared/embedding/functions/jaccard-coefficient.function.ts +26 -0
  274. package/src/shared/embedding/functions/read-vector-index-meta.function.ts +44 -0
  275. package/src/shared/embedding/functions/rrf-fuse.function.ts +33 -0
  276. package/src/shared/embedding/functions/search-vectors.function.ts +59 -0
  277. package/src/shared/embedding/index.ts +20 -0
  278. package/src/shared/embedding/typings/embedding-config.interface.ts +23 -0
  279. package/src/shared/embedding/typings/embedding-provider.interface.ts +25 -0
  280. package/src/shared/embedding/typings/near-duplicate-candidate.model.ts +25 -0
  281. package/src/shared/embedding/typings/near-duplicate-result.model.ts +26 -0
  282. package/src/shared/embedding/typings/vector-index-entry.model.ts +13 -0
  283. package/src/shared/embedding/typings/vector-index-meta.model.ts +14 -0
  284. package/src/shared/embedding/typings/vector-search-result.model.ts +8 -0
  285. package/src/shared/mcp/classes/mcp-server.class.ts +6 -3
  286. package/src/shared/mcp/constants/tool-agent-create.constant.ts +39 -0
  287. package/src/shared/mcp/constants/tool-agent-delete.constant.ts +26 -0
  288. package/src/shared/mcp/constants/tool-agent-get.constant.ts +24 -0
  289. package/src/shared/mcp/constants/tool-agent-list.constant.ts +18 -0
  290. package/src/shared/mcp/constants/tool-auto-capture-review.constant.ts +32 -0
  291. package/src/shared/mcp/constants/tool-check.constant.ts +21 -0
  292. package/src/shared/mcp/constants/tool-content.constant.ts +29 -0
  293. package/src/shared/mcp/constants/tool-export.constant.ts +27 -0
  294. package/src/shared/mcp/constants/tool-gc.constant.ts +21 -0
  295. package/src/shared/mcp/constants/tool-learn.constant.ts +58 -0
  296. package/src/shared/mcp/constants/tool-rebuild.constant.ts +21 -0
  297. package/src/shared/mcp/constants/tool-recall.constant.ts +36 -0
  298. package/src/shared/mcp/constants/tool-retrieve.constant.ts +31 -0
  299. package/src/shared/mcp/constants/tool-search.constant.ts +51 -0
  300. package/src/shared/mcp/constants/tool-skill-delete.constant.ts +24 -0
  301. package/src/shared/mcp/constants/tool-skill-get.constant.ts +27 -0
  302. package/src/shared/mcp/constants/tool-skill-learn.constant.ts +37 -0
  303. package/src/shared/mcp/constants/tool-skill-list.constant.ts +18 -0
  304. package/src/shared/mcp/constants/tool-status.constant.ts +20 -0
  305. package/src/shared/mcp/constants/tool-unlearn.constant.ts +25 -0
  306. package/src/shared/mcp/functions/as-boolean-or-undefined.function.ts +11 -0
  307. package/src/shared/mcp/functions/as-string-array-or-undefined.function.ts +17 -0
  308. package/src/shared/mcp/functions/as-string-array.function.ts +15 -0
  309. package/src/shared/mcp/functions/as-string.function.ts +10 -0
  310. package/src/shared/mcp/functions/build-skills-text.function.ts +43 -0
  311. package/src/shared/mcp/functions/create-tool-definitions.function.ts +28 -0
  312. package/src/shared/mcp/functions/handle-agent-create.function.ts +1 -1
  313. package/src/shared/mcp/functions/handle-agent-prompt.function.ts +68 -0
  314. package/src/shared/mcp/functions/handle-mcp-request.function.ts +202 -0
  315. package/src/shared/mcp/functions/handle-prompt-get.function.ts +18 -12
  316. package/src/shared/mcp/functions/handle-skill-prompt.function.ts +44 -0
  317. package/src/shared/mcp/functions/handle-tool-auto-capture-review.function.ts +24 -0
  318. package/src/shared/mcp/functions/handle-tool-call.function.ts +18 -0
  319. package/src/shared/mcp/functions/handle-tool-check.function.ts +21 -0
  320. package/src/shared/mcp/functions/handle-tool-content.function.ts +23 -0
  321. package/src/shared/mcp/functions/handle-tool-export.function.ts +25 -0
  322. package/src/shared/mcp/functions/handle-tool-gc.function.ts +21 -0
  323. package/src/shared/mcp/functions/handle-tool-learn.function.ts +69 -0
  324. package/src/shared/mcp/functions/handle-tool-rebuild.function.ts +21 -0
  325. package/src/shared/mcp/functions/handle-tool-retrieve.function.ts +40 -0
  326. package/src/shared/mcp/functions/handle-tool-search.function.ts +47 -0
  327. package/src/shared/mcp/functions/handle-tool-skill-delete.function.ts +34 -0
  328. package/src/shared/mcp/functions/handle-tool-skill-get.function.ts +59 -0
  329. package/src/shared/mcp/functions/handle-tool-skill-learn.function.ts +61 -0
  330. package/src/shared/mcp/functions/handle-tool-skill-list.function.ts +39 -0
  331. package/src/shared/mcp/functions/handle-tool-status.function.ts +21 -0
  332. package/src/shared/mcp/functions/handle-tool-unlearn.function.ts +24 -0
  333. package/src/shared/mcp/functions/parse-agent-meta.function.ts +27 -0
  334. package/src/shared/mcp/functions/parse-skill-arguments.function.ts +36 -0
  335. package/src/shared/mcp/functions/read-agent-meta.function.ts +41 -0
  336. package/src/shared/mcp/functions/resolve-skill-refs.function.ts +50 -0
  337. package/src/shared/mcp/functions/run-startup-health-check.function.ts +34 -0
  338. package/src/shared/mcp/typings/mcp-capabilities.interface.ts +16 -0
  339. package/src/shared/mcp/typings/mcp-client.interface.ts +2 -0
  340. package/src/shared/mcp/typings/mcp-completion.interface.ts +45 -0
  341. package/src/shared/mcp/typings/mcp-content-result.model.ts +9 -0
  342. package/src/shared/mcp/typings/mcp-export-result.model.ts +11 -0
  343. package/src/shared/mcp/typings/mcp-gc-result.model.ts +15 -0
  344. package/src/shared/mcp/typings/mcp-integrity-check-result.model.ts +17 -0
  345. package/src/shared/mcp/typings/mcp-integrity-error.model.ts +15 -0
  346. package/src/shared/mcp/typings/mcp-notification.interface.ts +9 -0
  347. package/src/shared/mcp/typings/mcp-rebuild-result.model.ts +9 -0
  348. package/src/shared/mcp/typings/mcp-request.interface.ts +11 -0
  349. package/src/shared/mcp/typings/mcp-resource-result.interface.ts +12 -0
  350. package/src/shared/mcp/typings/mcp-resource-template.interface.ts +11 -0
  351. package/src/shared/mcp/typings/mcp-response.interface.ts +18 -0
  352. package/src/shared/mcp/typings/mcp-server-info.interface.ts +7 -0
  353. package/src/shared/mcp/typings/mcp-server-state.interface.ts +17 -0
  354. package/src/shared/mcp/typings/mcp-tool-annotations.interface.ts +32 -0
  355. package/src/shared/mcp/typings/mcp-tool-definition.interface.ts +16 -0
  356. package/src/shared/mcp/typings/mcp-tool-result.interface.ts +19 -0
  357. package/src/shared/mcp/typings/mcp-worker-client.interface.ts +243 -0
  358. package/src/shared/mcp/typings/tool-call-result.model.ts +18 -0
  359. package/src/shared/sync/functions/build-import-report.function.ts +40 -0
  360. package/src/shared/sync/functions/parse-export-entry.function.ts +45 -0
  361. package/src/shared/sync/functions/resolve-conflict.function.ts +31 -0
  362. package/src/shared/sync/functions/serialize-export-entry.function.ts +18 -0
  363. package/src/shared/sync/index.ts +9 -0
  364. package/src/shared/sync/typings/conflict-resolution.type.ts +8 -0
  365. package/src/shared/sync/typings/export-entry.interface.ts +13 -0
  366. package/src/shared/sync/typings/export-options.interface.ts +9 -0
  367. package/src/shared/sync/typings/import-options.interface.ts +7 -0
  368. package/src/shared/sync/typings/import-report.interface.ts +15 -0
  369. package/src/shared/wasm-codec/functions/decode-one-recall-result.function.ts +86 -0
  370. package/src/shared/wasm-codec/functions/decode-option-string.function.ts +24 -0
  371. package/src/shared/wasm-codec/functions/decode-recall-document.function.ts +59 -0
  372. package/src/shared/wasm-codec/functions/decode-recall-reference.function.ts +52 -0
  373. package/src/shared/wasm-codec/functions/decode-recall-sibling.function.ts +43 -0
  374. package/src/shared/wasm-codec/functions/decode-section-match.function.ts +80 -0
  375. package/src/shared/wasm-codec/functions/decode-section-record-trailing.function.ts +75 -0
  376. package/src/shared/wasm-codec/functions/decode-section-record.function.ts +85 -0
  377. package/src/shared/wasm-codec/functions/decode-section-type.function.ts +30 -0
  378. package/src/shared/wasm-codec/functions/decode-wasm-list.function.ts +31 -0
  379. package/src/shared/wasm-codec/typings/add-section-input.model.ts +45 -0
  380. package/src/shared/wasm-codec/typings/add-section-result.model.ts +28 -0
  381. package/src/shared/wasm-codec/typings/document-manifest.model.ts +20 -0
  382. package/src/shared/wasm-codec/typings/document-section.model.ts +12 -0
  383. package/src/shared/wasm-codec/typings/item-decoder.type.ts +10 -0
  384. package/src/shared/wasm-codec/typings/near-duplicate.model.ts +16 -0
  385. package/src/shared/wasm-codec/typings/paged-search-result.model.ts +22 -0
  386. package/src/shared/wasm-codec/typings/section-match.model.ts +31 -0
  387. package/src/shared/wasm-codec/typings/section-record-trailing.model.ts +38 -0
  388. package/src/shared/wasm-codec/typings/section-record.model.ts +66 -0
  389. package/src/shared/wasm-codec/typings/section-type-result.model.ts +12 -0
  390. package/src/shared/worker-client/functions/handle-ipc-data.function.ts +49 -0
  391. package/src/shared/worker-client/functions/send-ipc-request.function.ts +39 -0
  392. package/src/shared/worker-client/typings/add-section-result.model.ts +2 -0
  393. package/src/shared/worker-client/typings/json-rpc-response.interface.ts +17 -0
  394. package/src/shared/worker-client/typings/pending-call.interface.ts +7 -0
  395. package/src/shared/worker-client/typings/recall-document.model.ts +16 -0
  396. package/src/shared/worker-client/typings/recall-params.model.ts +15 -0
  397. package/src/shared/worker-client/typings/recall-reference.model.ts +32 -0
  398. package/src/shared/worker-client/typings/recall-sibling.model.ts +11 -0
  399. package/src/shared/worker-client/typings/recall-single-result.model.ts +41 -0
  400. package/src/shared/worker-daemon/classes/ipc-error.class.ts +22 -0
  401. package/src/shared/worker-daemon/constants/wasm-method-map.constant.ts +69 -0
  402. package/src/shared/worker-daemon/functions/build-ipc-error-response.function.ts +16 -0
  403. package/src/shared/worker-daemon/functions/check-catalog-version.function.ts +54 -0
  404. package/src/shared/worker-daemon/functions/check-preconditions.function.ts +28 -0
  405. package/src/shared/worker-daemon/functions/detect-stale-pid.function.ts +33 -0
  406. package/src/shared/worker-daemon/functions/dispatch-request.function.ts +190 -0
  407. package/src/shared/worker-daemon/functions/handle-check-version.function.ts +74 -0
  408. package/src/shared/worker-daemon/functions/handle-config-method.function.ts +27 -0
  409. package/src/shared/worker-daemon/functions/handle-read-ops.function.ts +236 -0
  410. package/src/shared/worker-daemon/functions/handle-write-ops.function.ts +257 -0
  411. package/src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts +51 -0
  412. package/src/shared/worker-daemon/functions/parse-catalog-version.function.ts +20 -0
  413. package/src/shared/worker-daemon/functions/parse-embedding-section.function.ts +38 -0
  414. package/src/shared/worker-daemon/functions/parse-worker-toml.function.ts +104 -0
  415. package/src/shared/worker-daemon/functions/run-startup-integrity-check.function.ts +55 -0
  416. package/src/shared/worker-daemon/functions/scan-near-duplicates.function.ts +92 -0
  417. package/src/shared/worker-daemon/functions/wasm-bridge.function.ts +144 -0
  418. package/src/shared/worker-daemon/functions/wasm-memory-helpers.function.ts +41 -0
  419. package/src/shared/worker-daemon/functions/write-lock.function.ts +49 -0
  420. package/src/shared/worker-daemon/typings/allocator-ref.interface.ts +16 -0
  421. package/src/shared/worker-daemon/typings/daemon-config.interface.ts +7 -0
  422. package/src/shared/worker-daemon/typings/fs-adapter.interface.ts +22 -0
  423. package/src/shared/worker-daemon/typings/handler-context.interface.ts +19 -0
  424. package/src/shared/worker-daemon/typings/memory-ref.interface.ts +13 -0
  425. package/src/shared/worker-daemon/typings/wasm-fn.type.ts +2 -0
  426. package/src/shared/worker-daemon/typings/write-lock.interface.ts +13 -0
  427. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  428. package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
@@ -0,0 +1,229 @@
1
+ # Semantic Near-Duplicate Detection
2
+
3
+ *Cosine similarity on embeddings as a complementary
4
+ detection layer alongside Jaccard -- closes the
5
+ vocabulary-gap ceiling identified in gap #6.*
6
+
7
+ ## Goal
8
+
9
+ The existing near-duplicate detection computes a Jaccard
10
+ coefficient on stemmed term sets of the incoming section
11
+ versus all indexed sections. Sections that exceed a
12
+ similarity threshold of 0.85 are reported as
13
+ near-duplicates in `AddSectionResult.near_duplicates`.
14
+
15
+ This mechanism catches lexically similar content
16
+ reliably. It does not catch semantically equivalent
17
+ sections that use different vocabulary. Example: a
18
+ section stored as "We selected PostgreSQL for its JSONB
19
+ support" and a later section written as "Chose Postgres
20
+ due to native JSON column type" express the same
21
+ decision. Their stemmed term sets share few tokens --
22
+ Jaccard produces a low score, no duplicate is flagged,
23
+ and the knowledge base silently accumulates redundant
24
+ content.
25
+
26
+ This gap is identified as the semantic dedup ceiling in
27
+ [Opus 4.8 Second Brain Review](../issues/2026-06-23-opus-48-second-brain-review.md)
28
+ (gap #6). Semantic dedup closes it by adding a cosine
29
+ similarity pass on embedding vectors as a complementary
30
+ detection method when an embedding provider is
31
+ configured. The feature is conditional on
32
+ [Hybrid Search](hybrid-search.md) -- if no
33
+ `EmbeddingProvider` is configured, only the Jaccard pass
34
+ runs and behaviour is identical to today.
35
+
36
+ ## Two-Pass Detection Algorithm
37
+
38
+ Detection proceeds in two sequential passes on every
39
+ `add_section` call.
40
+
41
+ ### Pass 1: Jaccard (always runs)
42
+
43
+ Compute the Jaccard coefficient between the incoming
44
+ section's stemmed term set and each existing section's
45
+ term set. The term sets are derived from the inverted
46
+ index -- no section files are read.
47
+
48
+ Sections whose Jaccard score meets or exceeds 0.85 are
49
+ flagged as lexical near-duplicates and appended to
50
+ `near_duplicates` with `method: "jaccard"`.
51
+
52
+ Sections whose Jaccard score falls in the range
53
+ [0.40, 0.85) -- the gray zone -- are retained as
54
+ candidates for Pass 2.
55
+
56
+ Sections with a Jaccard score below 0.40 are discarded
57
+ with no further processing.
58
+
59
+ ### Pass 2: Cosine (when embeddings available)
60
+
61
+ Pass 2 runs only when an `EmbeddingProvider` other than
62
+ `NullEmbeddingProvider` is active and
63
+ `vectors.idx` is present and not stale.
64
+
65
+ For each gray-zone candidate from Pass 1, retrieve the
66
+ candidate's embedding from `vectors.idx`. If the
67
+ candidate's embedding is missing (e.g. the embedding
68
+ provider failed when that section was learned), skip
69
+ that candidate silently. Compute cosine similarity
70
+ between the incoming section's embedding and the
71
+ candidate's embedding.
72
+
73
+ The incoming section's embedding is computed by the
74
+ daemon as part of the same learn operation that triggers
75
+ the add (see the embedding lifecycle in
76
+ [Hybrid Search](hybrid-search.md)). If the embedding
77
+ computation for the incoming section itself failed, Pass
78
+ 2 is skipped entirely for that call.
79
+
80
+ Candidates whose cosine similarity meets or exceeds 0.92
81
+ are flagged as semantic near-duplicates and appended to
82
+ `near_duplicates` with `method: "cosine"`.
83
+
84
+ ### Efficiency Rationale
85
+
86
+ Jaccard operates on integer set intersections over the
87
+ inverted index -- it is cheap. Cosine operates on
88
+ floating-point vector dot products and requires reading
89
+ from `vectors.idx` -- it is more expensive. Restricting
90
+ cosine to the gray zone (Jaccard >= 0.40) means cosine
91
+ is invoked only for sections that already share moderate
92
+ lexical overlap with the candidate. Sections with very
93
+ low Jaccard scores are unlikely to be semantic
94
+ duplicates, so skipping them avoids unnecessary work
95
+ without meaningful loss in detection coverage.
96
+
97
+ ## Detection Thresholds
98
+
99
+ | Method | Threshold | Meaning |
100
+ |------------------|-----------|------------------------------|
101
+ | Jaccard | >= 0.85 | Lexical near-duplicate |
102
+ | Jaccard pre-filter | >= 0.40 | Candidate for cosine pass |
103
+ | Cosine | >= 0.92 | Semantic near-duplicate |
104
+
105
+ Thresholds are not configurable in v1. They are
106
+ hardcoded constants. If operational experience shows
107
+ that the defaults produce excessive false positives or
108
+ false negatives, they can be exposed as `worker.toml`
109
+ configuration keys in a later version.
110
+
111
+ ## Response Format
112
+
113
+ The `near_duplicates` array in `AddSectionResult` gains
114
+ a `method` field on every entry. The field identifies
115
+ which detection pass produced the entry.
116
+
117
+ ```json
118
+ {
119
+ "kbid": "<26-char hash>",
120
+ "near_duplicates": [
121
+ {
122
+ "kbid": "abc123...",
123
+ "similarity": 0.89,
124
+ "method": "jaccard"
125
+ },
126
+ {
127
+ "kbid": "def456...",
128
+ "similarity": 0.95,
129
+ "method": "cosine"
130
+ }
131
+ ]
132
+ }
133
+ ```
134
+
135
+ The `method` field is always present on every
136
+ near-duplicate entry, including in responses from
137
+ deployments where only Jaccard runs. Callers can rely
138
+ on the field being present unconditionally.
139
+
140
+ Entries produced by Pass 1 always carry `method:
141
+ "jaccard"`. Entries produced by Pass 2 always carry
142
+ `method: "cosine"`. No entry can carry both methods --
143
+ a section that crosses the Jaccard threshold of 0.85
144
+ is already flagged in Pass 1 and is not re-evaluated
145
+ in Pass 2.
146
+
147
+ ## Dependency on Hybrid Search
148
+
149
+ Semantic dedup reuses the infrastructure introduced by
150
+ [Hybrid Search](hybrid-search.md) without adding any
151
+ new infrastructure of its own.
152
+
153
+ - The `EmbeddingProvider` interface defined in Hybrid
154
+ Search provides the embedding computation at learn
155
+ time.
156
+ - `vectors.idx` provides the embedding lookup at
157
+ duplicate-detection time. No second embedding call is
158
+ made -- the stored vectors are read directly.
159
+ - When `NullEmbeddingProvider` is active (no `[embedding]`
160
+ section in `worker.toml`), Pass 2 never runs. The
161
+ `near_duplicates` array may still contain Jaccard
162
+ entries; it will never contain cosine entries.
163
+ - Stale vector index conditions (model name mismatch
164
+ between `vectors-meta.toml` and the configured
165
+ provider) are treated the same as a missing
166
+ `vectors.idx`: Pass 2 is skipped for that call.
167
+
168
+ ## Contradiction Detection Enhancement
169
+
170
+ The existing `divergent_content` integrity check
171
+ identifies sections that share the same `source_key`
172
+ but have different content -- contradictory knowledge
173
+ from the same origin that supersession should have
174
+ resolved.
175
+
176
+ With embeddings available, integrity check can extend
177
+ this check to surface potential semantic contradictions
178
+ that lack a shared source key: sections with high cosine
179
+ similarity (>= 0.92) and conflicting content signals.
180
+ This is a secondary, advisory output in the integrity
181
+ check response -- it does not block any operation.
182
+
183
+ The enhancement runs only when the integrity check is
184
+ invoked and `vectors.idx` is present and not stale. It
185
+ adds a new `semantic_contradictions` array to the
186
+ integrity check response, alongside the existing
187
+ `divergent_content` error entries:
188
+
189
+ ```json
190
+ {
191
+ "semantic_contradictions": [
192
+ {
193
+ "kbid_a": "abc123...",
194
+ "kbid_b": "def456...",
195
+ "cosine_similarity": 0.94
196
+ }
197
+ ]
198
+ }
199
+ ```
200
+
201
+ When no embedding provider is configured or
202
+ `vectors.idx` is absent, `semantic_contradictions` is
203
+ an empty array.
204
+
205
+ ## Design Constraints
206
+
207
+ - Semantic dedup is additive. It never replaces the
208
+ Jaccard pass. Both passes coexist, and the Jaccard
209
+ pass always runs regardless of embedding configuration.
210
+ - The `method` field is always present on
211
+ `near_duplicates` entries, even in responses from
212
+ deployments where only Jaccard runs.
213
+ - Cosine similarity computation reuses existing
214
+ embedding vectors stored in `vectors.idx`. No
215
+ additional embedding API call is made during
216
+ duplicate detection.
217
+ - If Pass 2 is skipped (no provider, stale index, or
218
+ embedding failure for the incoming section), the
219
+ response omits cosine entries silently. No warning
220
+ field is added for a skipped cosine pass -- the
221
+ absence of cosine entries is not an error condition
222
+ and is expected in lexical-only deployments.
223
+ - Thresholds are hardcoded in v1. Exposure as
224
+ configuration keys is deferred to a later version
225
+ after operational validation.
226
+ - The `semantic_contradictions` enhancement to integrity
227
+ check is advisory. It does not change `ok` to `false`
228
+ on its own -- it provides supplementary information
229
+ for human review.
@@ -0,0 +1,217 @@
1
+ # Sync -- Cross-Machine Synchronization
2
+
3
+ *Export the database as a git-friendly directory, move
4
+ it with any transport, import on the other side.*
5
+
6
+ ## Goal
7
+
8
+ kbdb is currently single-machine -- "persists across
9
+ sessions" means across sessions on the same box. For
10
+ teams, multi-device use, or backup, the database needs
11
+ a sync story.
12
+
13
+ The design uses export/import as the primitive, with
14
+ git as the recommended transport. Sync is manual and
15
+ explicit. There is no background replication.
16
+
17
+ This goal addresses gap #5 from
18
+ [Opus 4.8 Second Brain Review](../issues/2026-06-23-opus-48-second-brain-review.md):
19
+ "No sync/remote story unless you build one on top,
20
+ which limits 'persists across sessions' to 'across
21
+ sessions on this box.'"
22
+
23
+ ## Sync Primitives
24
+
25
+ Two operations form the sync foundation.
26
+
27
+ ### Export
28
+
29
+ Serialize the database into a portable, git-friendly
30
+ directory:
31
+
32
+ ```
33
+ kbdb export --format git --db .kbdb --out ./kbdb-sync/
34
+ ```
35
+
36
+ The exported directory mirrors `.kbdb/` minus indexes:
37
+
38
+ - `catalog.toml` -- database table of contents
39
+ - `sections/**/*.section` -- all section files
40
+ - `documents/**/*.toml` -- all document manifests
41
+
42
+ Excluded:
43
+
44
+ - `indexes/` -- derived data, rebuildable
45
+ - Vector indexes (`vectors.idx`, `vectors-meta.toml`)
46
+ - PID files and lock files
47
+
48
+ The exported directory is a valid git subtree. It
49
+ contains no binary blobs except section content
50
+ (image sections, which are stored as base64 text).
51
+ Every file is human-readable and git-diffable.
52
+
53
+ ### Import
54
+
55
+ Restore a database from an exported directory:
56
+
57
+ ```
58
+ kbdb import --from ./kbdb-sync/ --db .kbdb
59
+ ```
60
+
61
+ Import reads the exported directory and writes sections
62
+ and documents into the target database. After import,
63
+ run `rebuild` to regenerate all indexes (lexical and
64
+ vector, if configured).
65
+
66
+ Import is **additive** -- existing sections with
67
+ different kbids are preserved. Only the conflict
68
+ resolution rules below can cause existing sections to
69
+ be superseded.
70
+
71
+ ## Conflict Resolution
72
+
73
+ When importing sections that conflict with existing
74
+ ones, the following rules apply in priority order:
75
+
76
+ | Condition | Action |
77
+ |-----------|--------|
78
+ | Same kbid | Skip -- identical content already exists |
79
+ | Same `source_key`, imported `created_at` is newer | Supersede -- imported section replaces local one |
80
+ | Same `source_key`, local `created_at` is newer or equal | Keep -- local version is retained |
81
+ | No `source_key` match | Add as new section |
82
+
83
+ This leverages the existing supersession mechanism
84
+ documented in [Database](database.md). The content
85
+ hash (kbid) remains the primary identity. The source
86
+ key is the logical identity used for supersession
87
+ matching across machines.
88
+
89
+ ## Git-Based Workflow
90
+
91
+ Recommended workflow for teams:
92
+
93
+ ```
94
+ Machine A Git repo Machine B
95
+ ───────── ──────── ─────────
96
+ kbdb export --format git ──→ git push ──→ git pull ──→ kbdb import
97
+ kbdb rebuild
98
+ ```
99
+
100
+ Steps:
101
+
102
+ 1. Machine A exports to a directory within a git repo.
103
+ 2. Machine A commits and pushes.
104
+ 3. Machine B pulls and imports.
105
+ 4. Machine B rebuilds indexes.
106
+
107
+ This is a manual, explicit sync -- not automatic
108
+ real-time replication. Any transport that moves the
109
+ exported directory works: git, rsync, scp, a shared
110
+ drive, an archive file. Git is recommended because the
111
+ export format is designed to be git-diffable.
112
+
113
+ ## Vector Index Handling
114
+
115
+ Vector indexes (`vectors.idx`, `vectors-meta.toml`)
116
+ are excluded from export -- they are derived data, the
117
+ same as lexical indexes.
118
+
119
+ After import:
120
+
121
+ - If an embedding provider is configured, `rebuild`
122
+ regenerates vectors using the local model.
123
+ - If the importing machine uses a different embedding
124
+ model than the exporting machine, vectors are
125
+ computed fresh with the local model. No action is
126
+ required to handle this case -- vectors are always
127
+ rebuilt from content, never transferred.
128
+
129
+ ## Export Formats
130
+
131
+ | Format | Description | Use Case |
132
+ |--------|-------------|----------|
133
+ | `git` | Flat directory, text-friendly | Git-based sync |
134
+ | `archive` | Single tarball (`.tar.gz`) | Backup, transfer |
135
+
136
+ The default format is `git` (the directory format).
137
+
138
+ ## CLI Surface
139
+
140
+ ```
141
+ kbdb export [--format git|archive] [--out <path>]
142
+ kbdb import --from <path> [--dry-run]
143
+ ```
144
+
145
+ - `kbdb export` -- exports the database to the
146
+ specified output path. Defaults to `--format git`.
147
+ The `--out` path is created if it does not exist.
148
+ - `kbdb import` -- imports from an exported directory
149
+ or archive. Runs conflict resolution for each
150
+ incoming section and document.
151
+ - `--dry-run` on import -- shows what would change
152
+ (sections added, superseded, skipped) without
153
+ writing anything.
154
+
155
+ ## Import Report
156
+
157
+ Import returns a structured report:
158
+
159
+ ```json
160
+ {
161
+ "sections_added": 42,
162
+ "sections_skipped": 3,
163
+ "sections_superseded": 5,
164
+ "documents_added": 2,
165
+ "documents_skipped": 1,
166
+ "rebuild_required": true
167
+ }
168
+ ```
169
+
170
+ `rebuild_required` is always `true` after a successful
171
+ import that adds or supersedes any sections, because
172
+ the lexical index is out of date. The caller is
173
+ responsible for running `rebuild` after import.
174
+
175
+ ## Why Not CRDTs
176
+
177
+ CRDTs (Conflict-free Replicated Data Types) would
178
+ enable automatic, real-time sync without conflicts.
179
+ The design chooses export/import instead for three
180
+ reasons:
181
+
182
+ 1. **Identity conflict** -- The kbid is a content
183
+ hash. Content changes create new identities rather
184
+ than updating existing ones. This conflicts with
185
+ CRDT merge semantics, which assume stable object
186
+ identity across mutations.
187
+
188
+ 2. **Complexity** -- CRDT support at the current user
189
+ scale is speculative complexity (YAGNI). The
190
+ export/import model covers the primary use cases
191
+ (backup, team sharing, multi-device) with familiar
192
+ tooling and no new dependencies.
193
+
194
+ 3. **Existing supersession** -- The source key
195
+ mechanism already provides a logical identity layer
196
+ above content addressing. Conflict resolution at
197
+ import time uses the same supersession logic that
198
+ `kbdb learn --replace` uses. No new primitives are
199
+ required.
200
+
201
+ CRDT support may be revisited in a future version if
202
+ demand warrants it.
203
+
204
+ ## Design Constraints
205
+
206
+ - Sync is manual and explicit -- no background
207
+ replication.
208
+ - Export excludes all derived data (indexes, vectors).
209
+ - Import respects the existing supersession model
210
+ from [Database](database.md).
211
+ - No new dependencies -- uses existing file I/O.
212
+ - Git is recommended but not required -- any transport
213
+ that moves the exported directory works.
214
+ - The single-machine write lock documented in
215
+ [Concurrent Write Safety](concurrency.md) is not
216
+ relevant to sync. Import is a local write operation
217
+ and acquires the lock normally.
@@ -0,0 +1,110 @@
1
+ # indexes::vectors -- Vector Embedding Index
2
+
3
+ *Maps kb-ids to embedding vectors for similarity search. Stored in
4
+ `indexes/vectors.idx` with metadata in `indexes/vectors-meta.toml`.*
5
+
6
+ ## Source
7
+
8
+ `engine/crates/fs-database/src/index/vectors.rs`
9
+
10
+ ## Implementation Boundary
11
+
12
+ Unlike other index files which are written by the Rust/WASM engine,
13
+ the vector index is written and read by TypeScript. The Rust module
14
+ defines the binary format specification and provides read/write
15
+ utilities for potential future use, but the primary producer is the
16
+ TypeScript embedding module. This separation exists because embedding
17
+ computation requires network I/O to call external API providers, and
18
+ the WASM target (`wasm32-unknown-unknown`) has no network access.
19
+ ONNX models are also too large to fit in WASM linear memory.
20
+
21
+ ## Binary Format: vectors.idx
22
+
23
+ Fixed-width binary file. A 32-byte header is followed by N records,
24
+ one per section. Record size is fixed for a given file because all
25
+ embeddings share the same `dimensions` value from the header.
26
+
27
+ **Header (32 bytes):**
28
+
29
+ | Offset | Size | Type | Field |
30
+ |--------|------|-----------|--------------------------------|
31
+ | 0 | 4 | u32 LE | magic (`0x56454358` = "VECX") |
32
+ | 4 | 4 | u32 LE | version (1) |
33
+ | 8 | 4 | u32 LE | dimensions |
34
+ | 12 | 4 | u32 LE | record_count |
35
+ | 16 | 16 | [u8; 16] | reserved (zero-filled) |
36
+
37
+ **Record (variable, but fixed per file):**
38
+
39
+ | Offset | Size | Type | Field |
40
+ |--------|---------------|----------------|---------------------------|
41
+ | 0 | 64 | [u8; 64] | kbid (UTF-8, null-padded) |
42
+ | 64 | dims × 4 | [f32 LE; dims] | embedding vector |
43
+
44
+ Record size = 64 + (dimensions × 4). For 384-dimensional embeddings,
45
+ each record is 1,600 bytes.
46
+
47
+ ## Metadata: vectors-meta.toml
48
+
49
+ ```toml
50
+ model = "all-MiniLM-L6-v2"
51
+ dimensions = 384
52
+ record_count = 1042
53
+ version = 1
54
+ ```
55
+
56
+ The metadata file is read before opening `vectors.idx`. If the
57
+ `model` field differs from the current embedding provider's model
58
+ name, the vector index is considered stale and must be rebuilt before
59
+ it can be used for search.
60
+
61
+ ## Type Definitions
62
+
63
+ ```rust
64
+ pub struct VectorIndex {
65
+ dimensions: u32,
66
+ entries: Vec<VectorEntry>,
67
+ }
68
+
69
+ pub struct VectorEntry {
70
+ pub kbid: KbId,
71
+ pub vector: Vec<f32>,
72
+ }
73
+ ```
74
+
75
+ `VectorIndex` owns all loaded entries in memory. `dimensions` is
76
+ stored separately from the per-entry vector length so that the header
77
+ value can be validated against each record during a read. Both structs
78
+ are not exposed at the WASM boundary -- the index is consumed
79
+ internally by `search` and `lookup`.
80
+
81
+ ## Methods
82
+
83
+ ```rust
84
+ impl VectorIndex {
85
+ pub fn read_from(path: &str) -> Result<Self, FsError>;
86
+ pub fn write_to(&self, path: &str) -> Result<(), FsError>;
87
+ pub fn lookup(&self, kbid: &KbId) -> Option<&[f32]>;
88
+ pub fn search(
89
+ &self,
90
+ query_vector: &[f32],
91
+ limit: usize,
92
+ ) -> Vec<(KbId, f32)>;
93
+ }
94
+ ```
95
+
96
+ `read_from` parses the binary file header, validates the magic bytes
97
+ and version, then reads all records into memory. `write_to` serializes
98
+ the header followed by each entry in record order. `lookup` returns
99
+ the stored embedding slice for a single kb-id, or `None` if the kb-id
100
+ is not present. `search` computes cosine similarity between
101
+ `query_vector` and every stored entry, then returns the top `limit`
102
+ results as `(KbId, score)` pairs sorted by descending similarity.
103
+
104
+ ## Rebuild Semantics
105
+
106
+ `vectors.idx` is derived data and can be regenerated from section
107
+ content at any time. During rebuild, the TypeScript layer iterates all
108
+ sections, computes embeddings via the configured `EmbeddingProvider`,
109
+ and writes the binary file. If no embedding provider is configured,
110
+ `vectors.idx` is not generated and similarity search is unavailable.
@@ -0,0 +1,73 @@
1
+ # auto-capture -- MCP Sampling-Based Automatic Knowledge Capture
2
+
3
+ **Source:** `src/shared/auto-capture/`
4
+
5
+ ## Responsibility
6
+
7
+ Automatic knowledge capture from AI agent conversations. Uses MCP
8
+ `sampling/createMessage` to ask the host LLM to identify knowledge
9
+ worth storing, then feeds extracted knowledge into kbdb via `learn`.
10
+ Operates as an MCP server-side feature -- the server proactively
11
+ requests captures based on configurable triggers.
12
+
13
+ ## Directory Layout
14
+
15
+ ```
16
+ src/shared/auto-capture/
17
+ index.ts
18
+ auto-capture.controller.ts
19
+ trigger.ts
20
+ sampling-prompt.ts
21
+ rate-limiter.ts
22
+ ```
23
+
24
+ ## Components
25
+
26
+ - **AutoCaptureController** (`auto-capture.controller.ts`) --
27
+ Orchestrates the capture flow. Tracks tool call count, checks
28
+ trigger conditions, invokes sampling, and feeds results to
29
+ `learn`. Stateful per MCP session.
30
+ - **Trigger logic** (`trigger.ts`) -- Evaluates whether a capture
31
+ check should fire. Conditions: (a) after N tool calls (default:
32
+ 10), (b) configurable time interval, (c) explicit
33
+ `auto-capture-review` tool invocation. Multiple triggers can be
34
+ active simultaneously.
35
+ - **Sampling prompts** (`sampling-prompt.ts`) -- Prompt templates
36
+ sent via `sampling/createMessage`. The prompt asks the host LLM
37
+ to extract knowledge from the conversation that matches the
38
+ `memory-protocol` skill's storage criteria: facts, decisions,
39
+ rationale, procedures.
40
+ - **Rate limiter** (`rate-limiter.ts`) -- Prevents excessive
41
+ capture attempts. Enforces minimum interval between captures
42
+ (default: 60 s) and maximum captures per session (default: 20).
43
+
44
+ ## Configuration
45
+
46
+ Configured via the `[auto_capture]` section of `worker.toml`:
47
+
48
+ ```toml
49
+ [auto_capture]
50
+ enabled = false
51
+ trigger_after_tool_calls = 10
52
+ min_interval_seconds = 60
53
+ max_captures_per_session = 20
54
+ dry_run = false
55
+ ```
56
+
57
+ When `dry_run = true`, the controller logs what would be captured
58
+ without actually writing to the database. Useful for tuning
59
+ triggers.
60
+
61
+ ## Dependency Direction
62
+
63
+ ```
64
+ shared/auto-capture/
65
+ └── (no shared module deps -- uses MCP sampling API)
66
+
67
+ shared/mcp/
68
+ └── shared/auto-capture/ (controller lifecycle)
69
+ ```
70
+
71
+ The auto-capture module is instantiated by the MCP server module.
72
+ It uses the MCP protocol's sampling capability -- not direct imports
73
+ of other shared modules.