@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.
- package/README.md +89 -120
- package/dist/bench/constants/corpus-defaults.constant.d.ts +3 -0
- package/dist/bench/functions/format-report.function.d.ts +11 -0
- package/dist/bench/functions/generate-corpus.function.d.ts +12 -0
- package/dist/bench/functions/measure-operation.function.d.ts +14 -0
- package/dist/bench/functions/seeded-rng.function.d.ts +11 -0
- package/dist/bench/functions/zipf-word.function.d.ts +13 -0
- package/dist/bench/index.d.ts +10 -0
- package/dist/bench/typings/bench-result.interface.d.ts +11 -0
- package/dist/bench/typings/bench-suite-result.interface.d.ts +10 -0
- package/dist/bench/typings/corpus-config.interface.d.ts +11 -0
- package/dist/bench/typings/corpus-section.interface.d.ts +9 -0
- package/dist/cli.cjs +63 -9
- package/dist/cli.cjs.map +2 -2
- package/dist/cli.mjs +63 -9
- package/dist/cli.mjs.map +2 -2
- package/dist/src/shared/auto-capture/classes/auto-capture-controller.class.d.ts +33 -0
- package/dist/src/shared/auto-capture/constants/auto-capture-defaults.constant.d.ts +8 -0
- package/dist/src/shared/auto-capture/functions/build-capture-prompt.function.d.ts +11 -0
- package/dist/src/shared/auto-capture/functions/evaluate-trigger.function.d.ts +12 -0
- package/dist/src/shared/auto-capture/index.d.ts +7 -0
- package/dist/src/shared/auto-capture/typings/auto-capture-config.interface.d.ts +13 -0
- package/dist/src/shared/auto-capture/typings/auto-capture-state.interface.d.ts +13 -0
- package/dist/src/shared/auto-capture/typings/auto-capture-trigger.interface.d.ts +7 -0
- package/dist/src/shared/cli/constants/global-help.constant.d.ts +8 -0
- package/dist/src/shared/cli/constants/leaf-help.constant.d.ts +7 -0
- package/dist/src/shared/cli/constants/memory-protocol-body.constant.d.ts +7 -0
- package/dist/src/shared/cli/constants/query-guidance-body.constant.d.ts +7 -0
- package/dist/src/shared/cli/constants/subcommand-help.constant.d.ts +8 -0
- package/dist/src/shared/cli/functions/collect-files.function.d.ts +13 -0
- package/dist/src/shared/cli/functions/compute-section-kbid.function.d.ts +15 -0
- package/dist/src/shared/cli/functions/format-mcp-output.function.d.ts +9 -0
- package/dist/src/shared/cli/functions/format-text-output.function.d.ts +9 -0
- package/dist/src/shared/cli/functions/generate-group-help.function.d.ts +11 -0
- package/dist/src/shared/cli/functions/handle-data-command.function.d.ts +16 -0
- package/dist/src/shared/cli/functions/handle-mcp.function.d.ts +15 -0
- package/dist/src/shared/cli/functions/handle-migrate.function.d.ts +15 -0
- package/dist/src/shared/cli/functions/hydrate-search-previews.function.d.ts +14 -0
- package/dist/src/shared/cli/functions/resolve-skill-names.function.d.ts +16 -0
- package/dist/src/shared/cli/functions/run-search.function.d.ts +1 -0
- package/dist/src/shared/cli/functions/version-gate.function.d.ts +15 -0
- package/dist/src/shared/cli/functions/wrap-command.function.d.ts +15 -0
- package/dist/src/shared/cli/typings/agent-create-client.interface.d.ts +42 -0
- package/dist/src/shared/cli/typings/agent-get-client.interface.d.ts +36 -0
- package/dist/src/shared/cli/typings/check-client.interface.d.ts +58 -0
- package/dist/src/shared/cli/typings/cli-deps.interface.d.ts +48 -0
- package/dist/src/shared/cli/typings/cli-options.interface.d.ts +2 -0
- package/dist/src/shared/cli/typings/disconnectable-client.interface.d.ts +26 -0
- package/dist/src/shared/cli/typings/dispatch-client.type.d.ts +27 -0
- package/dist/src/shared/cli/typings/learn-client.interface.d.ts +52 -0
- package/dist/src/shared/cli/typings/learn-io.interface.d.ts +5 -0
- package/dist/src/shared/cli/typings/search-client.interface.d.ts +71 -0
- package/dist/src/shared/embedding/classes/null-embedding-provider.class.d.ts +20 -0
- package/dist/src/shared/embedding/constants/near-duplicate-thresholds.constant.d.ts +15 -0
- package/dist/src/shared/embedding/functions/build-vector-index.function.d.ts +14 -0
- package/dist/src/shared/embedding/functions/cosine-similarity.function.d.ts +10 -0
- package/dist/src/shared/embedding/functions/detect-near-duplicates.function.d.ts +18 -0
- package/dist/src/shared/embedding/functions/jaccard-coefficient.function.d.ts +9 -0
- package/dist/src/shared/embedding/functions/read-vector-index-meta.function.d.ts +10 -0
- package/dist/src/shared/embedding/functions/rrf-fuse.function.d.ts +14 -0
- package/dist/src/shared/embedding/functions/search-vectors.function.d.ts +14 -0
- package/dist/src/shared/embedding/index.d.ts +16 -0
- package/dist/src/shared/embedding/typings/embedding-config.interface.d.ts +20 -0
- package/dist/src/shared/embedding/typings/embedding-provider.interface.d.ts +23 -0
- package/dist/src/shared/embedding/typings/near-duplicate-candidate.model.d.ts +23 -0
- package/dist/src/shared/embedding/typings/near-duplicate-result.model.d.ts +24 -0
- package/dist/src/shared/embedding/typings/vector-index-entry.model.d.ts +12 -0
- package/dist/src/shared/embedding/typings/vector-index-meta.model.d.ts +11 -0
- package/dist/src/shared/embedding/typings/vector-search-result.model.d.ts +7 -0
- package/dist/src/shared/mcp/constants/tool-agent-create.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-agent-delete.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-agent-get.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-agent-list.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-auto-capture-review.constant.d.ts +8 -0
- package/dist/src/shared/mcp/constants/tool-check.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-content.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-export.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-gc.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-learn.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-rebuild.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-recall.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-retrieve.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-search.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-skill-delete.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-skill-get.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-skill-learn.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-skill-list.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-status.constant.d.ts +3 -0
- package/dist/src/shared/mcp/constants/tool-unlearn.constant.d.ts +3 -0
- package/dist/src/shared/mcp/functions/as-boolean-or-undefined.function.d.ts +7 -0
- package/dist/src/shared/mcp/functions/as-string-array-or-undefined.function.d.ts +7 -0
- package/dist/src/shared/mcp/functions/as-string-array.function.d.ts +7 -0
- package/dist/src/shared/mcp/functions/as-string.function.d.ts +8 -0
- package/dist/src/shared/mcp/functions/build-skills-text.function.d.ts +18 -0
- package/dist/src/shared/mcp/functions/handle-agent-prompt.function.d.ts +14 -0
- package/dist/src/shared/mcp/functions/handle-mcp-request.function.d.ts +14 -0
- package/dist/src/shared/mcp/functions/handle-prompt-get.function.d.ts +4 -3
- package/dist/src/shared/mcp/functions/handle-skill-prompt.function.d.ts +16 -0
- package/dist/src/shared/mcp/functions/handle-tool-auto-capture-review.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-check.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/handle-tool-content.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-export.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-gc.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/handle-tool-learn.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-rebuild.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/handle-tool-retrieve.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-search.function.d.ts +13 -0
- package/dist/src/shared/mcp/functions/handle-tool-skill-delete.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/handle-tool-skill-get.function.d.ts +13 -0
- package/dist/src/shared/mcp/functions/handle-tool-skill-learn.function.d.ts +13 -0
- package/dist/src/shared/mcp/functions/handle-tool-skill-list.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/handle-tool-status.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/handle-tool-unlearn.function.d.ts +12 -0
- package/dist/src/shared/mcp/functions/parse-agent-meta.function.d.ts +14 -0
- package/dist/src/shared/mcp/functions/parse-skill-arguments.function.d.ts +11 -0
- package/dist/src/shared/mcp/functions/read-agent-meta.function.d.ts +17 -0
- package/dist/src/shared/mcp/functions/resolve-skill-refs.function.d.ts +23 -0
- package/dist/src/shared/mcp/functions/run-startup-health-check.function.d.ts +14 -0
- package/dist/src/shared/mcp/typings/mcp-capabilities.interface.d.ts +16 -0
- package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +2 -0
- package/dist/src/shared/mcp/typings/mcp-completion.interface.d.ts +43 -0
- package/dist/src/shared/mcp/typings/mcp-content-result.model.d.ts +9 -0
- package/dist/src/shared/mcp/typings/mcp-export-result.model.d.ts +11 -0
- package/dist/src/shared/mcp/typings/mcp-gc-result.model.d.ts +15 -0
- package/dist/src/shared/mcp/typings/mcp-integrity-check-result.model.d.ts +16 -0
- package/dist/src/shared/mcp/typings/mcp-integrity-error.model.d.ts +9 -0
- package/dist/src/shared/mcp/typings/mcp-notification.interface.d.ts +9 -0
- package/dist/src/shared/mcp/typings/mcp-rebuild-result.model.d.ts +9 -0
- package/dist/src/shared/mcp/typings/mcp-request.interface.d.ts +11 -0
- package/dist/src/shared/mcp/typings/mcp-resource-result.interface.d.ts +12 -0
- package/dist/src/shared/mcp/typings/mcp-resource-template.interface.d.ts +11 -0
- package/dist/src/shared/mcp/typings/mcp-response.interface.d.ts +18 -0
- package/dist/src/shared/mcp/typings/mcp-server-info.interface.d.ts +7 -0
- package/dist/src/shared/mcp/typings/mcp-server-state.interface.d.ts +16 -0
- package/dist/src/shared/mcp/typings/mcp-tool-annotations.interface.d.ts +32 -0
- package/dist/src/shared/mcp/typings/mcp-tool-definition.interface.d.ts +15 -0
- package/dist/src/shared/mcp/typings/mcp-tool-result.interface.d.ts +19 -0
- package/dist/src/shared/mcp/typings/mcp-worker-client.interface.d.ts +220 -0
- package/dist/src/shared/mcp/typings/tool-call-result.model.d.ts +17 -0
- package/dist/src/shared/sync/functions/build-import-report.function.d.ts +18 -0
- package/dist/src/shared/sync/functions/parse-export-entry.function.d.ts +11 -0
- package/dist/src/shared/sync/functions/resolve-conflict.function.d.ts +13 -0
- package/dist/src/shared/sync/functions/serialize-export-entry.function.d.ts +8 -0
- package/dist/src/shared/sync/index.d.ts +9 -0
- package/dist/src/shared/sync/typings/conflict-resolution.type.d.ts +8 -0
- package/dist/src/shared/sync/typings/export-entry.interface.d.ts +13 -0
- package/dist/src/shared/sync/typings/export-options.interface.d.ts +9 -0
- package/dist/src/shared/sync/typings/import-options.interface.d.ts +7 -0
- package/dist/src/shared/sync/typings/import-report.interface.d.ts +15 -0
- package/dist/src/shared/wasm-codec/functions/decode-one-recall-result.function.d.ts +14 -0
- package/dist/src/shared/wasm-codec/functions/decode-option-string.function.d.ts +12 -0
- package/dist/src/shared/wasm-codec/functions/decode-recall-document.function.d.ts +14 -0
- package/dist/src/shared/wasm-codec/functions/decode-recall-reference.function.d.ts +14 -0
- package/dist/src/shared/wasm-codec/functions/decode-recall-sibling.function.d.ts +13 -0
- package/dist/src/shared/wasm-codec/functions/decode-section-match.function.d.ts +15 -0
- package/dist/src/shared/wasm-codec/functions/decode-section-record-trailing.function.d.ts +14 -0
- package/dist/src/shared/wasm-codec/functions/decode-section-record.function.d.ts +14 -0
- package/dist/src/shared/wasm-codec/functions/decode-section-type.function.d.ts +13 -0
- package/dist/src/shared/wasm-codec/functions/decode-wasm-list.function.d.ts +17 -0
- package/dist/src/shared/wasm-codec/typings/add-section-input.model.d.ts +45 -0
- package/dist/src/shared/wasm-codec/typings/add-section-result.model.d.ts +27 -0
- package/dist/src/shared/wasm-codec/typings/document-manifest.model.d.ts +19 -0
- package/dist/src/shared/wasm-codec/typings/document-section.model.d.ts +12 -0
- package/dist/src/shared/wasm-codec/typings/item-decoder.type.d.ts +6 -0
- package/dist/src/shared/wasm-codec/typings/near-duplicate.model.d.ts +16 -0
- package/dist/src/shared/wasm-codec/typings/paged-search-result.model.d.ts +21 -0
- package/dist/src/shared/wasm-codec/typings/section-match.model.d.ts +31 -0
- package/dist/src/shared/wasm-codec/typings/section-record-trailing.model.d.ts +38 -0
- package/dist/src/shared/wasm-codec/typings/section-record.model.d.ts +66 -0
- package/dist/src/shared/wasm-codec/typings/section-type-result.model.d.ts +12 -0
- package/dist/src/shared/worker-client/functions/handle-ipc-data.function.d.ts +16 -0
- package/dist/src/shared/worker-client/functions/send-ipc-request.function.d.ts +19 -0
- package/dist/src/shared/worker-client/typings/add-section-result.model.d.ts +2 -0
- package/dist/src/shared/worker-client/typings/json-rpc-response.interface.d.ts +16 -0
- package/dist/src/shared/worker-client/typings/pending-call.interface.d.ts +7 -0
- package/dist/src/shared/worker-client/typings/recall-document.model.d.ts +16 -0
- package/dist/src/shared/worker-client/typings/recall-params.model.d.ts +15 -0
- package/dist/src/shared/worker-client/typings/recall-reference.model.d.ts +32 -0
- package/dist/src/shared/worker-client/typings/recall-sibling.model.d.ts +11 -0
- package/dist/src/shared/worker-client/typings/recall-single-result.model.d.ts +40 -0
- package/dist/src/shared/worker-daemon/classes/ipc-error.class.d.ts +17 -0
- package/dist/src/shared/worker-daemon/constants/wasm-method-map.constant.d.ts +16 -0
- package/dist/src/shared/worker-daemon/functions/build-ipc-error-response.function.d.ts +9 -0
- package/dist/src/shared/worker-daemon/functions/check-catalog-version.function.d.ts +9 -0
- package/dist/src/shared/worker-daemon/functions/check-preconditions.function.d.ts +10 -0
- package/dist/src/shared/worker-daemon/functions/detect-stale-pid.function.d.ts +15 -0
- package/dist/src/shared/worker-daemon/functions/dispatch-request.function.d.ts +35 -0
- package/dist/src/shared/worker-daemon/functions/handle-check-version.function.d.ts +23 -0
- package/dist/src/shared/worker-daemon/functions/handle-config-method.function.d.ts +11 -0
- package/dist/src/shared/worker-daemon/functions/handle-read-ops.function.d.ts +52 -0
- package/dist/src/shared/worker-daemon/functions/handle-write-ops.function.d.ts +44 -0
- package/dist/src/shared/worker-daemon/functions/parse-auto-capture-section.function.d.ts +14 -0
- package/dist/src/shared/worker-daemon/functions/parse-catalog-version.function.d.ts +10 -0
- package/dist/src/shared/worker-daemon/functions/parse-embedding-section.function.d.ts +13 -0
- package/dist/src/shared/worker-daemon/functions/parse-worker-toml.function.d.ts +11 -0
- package/dist/src/shared/worker-daemon/functions/run-startup-integrity-check.function.d.ts +18 -0
- package/dist/src/shared/worker-daemon/functions/scan-near-duplicates.function.d.ts +21 -0
- package/dist/src/shared/worker-daemon/functions/wasm-bridge.function.d.ts +51 -0
- package/dist/src/shared/worker-daemon/functions/wasm-memory-helpers.function.d.ts +22 -0
- package/dist/src/shared/worker-daemon/functions/write-lock.function.d.ts +32 -0
- package/dist/src/shared/worker-daemon/typings/allocator-ref.interface.d.ts +16 -0
- package/dist/src/shared/worker-daemon/typings/daemon-config.interface.d.ts +6 -0
- package/dist/src/shared/worker-daemon/typings/fs-adapter.interface.d.ts +22 -0
- package/dist/src/shared/worker-daemon/typings/handler-context.interface.d.ts +18 -0
- package/dist/src/shared/worker-daemon/typings/memory-ref.interface.d.ts +13 -0
- package/dist/src/shared/worker-daemon/typings/wasm-fn.type.d.ts +2 -0
- package/dist/src/shared/worker-daemon/typings/write-lock.interface.d.ts +15 -0
- package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/docs/details/cli.md +9 -0
- package/docs/details/mcp-server.md +5 -3
- package/docs/details/search-and-ranking.md +55 -0
- package/docs/goals/auto-capture.md +378 -0
- package/docs/goals/benchmarking.md +296 -0
- package/docs/goals/concurrency.md +259 -0
- package/docs/goals/hybrid-search.md +436 -0
- package/docs/goals/semantic-dedup.md +229 -0
- package/docs/goals/sync.md +217 -0
- package/docs/modules/rust/fs-database/indexes/vectors.md +110 -0
- package/docs/modules/typescript/shared/auto-capture/module.md +73 -0
- package/docs/modules/typescript/shared/embedding/functions.md +94 -0
- package/docs/modules/typescript/shared/embedding/module.md +71 -0
- package/docs/modules/typescript/shared/embedding/typings.md +122 -0
- package/docs/overview.md +171 -167
- package/docs/release-notes/0.2.0.md +3 -3
- package/docs/release-notes/0.3.0.md +89 -0
- package/docs/release-notes/0.3.1.md +121 -0
- package/docs/release-notes/0.3.2.md +64 -0
- package/docs/release-notes/README.md +3 -0
- package/package.json +1 -1
- package/src/shared/auto-capture/classes/auto-capture-controller.class.ts +62 -0
- package/src/shared/auto-capture/constants/auto-capture-defaults.constant.ts +15 -0
- package/src/shared/auto-capture/functions/build-capture-prompt.function.ts +27 -0
- package/src/shared/auto-capture/functions/evaluate-trigger.function.ts +50 -0
- package/src/shared/auto-capture/index.ts +7 -0
- package/src/shared/auto-capture/typings/auto-capture-config.interface.ts +13 -0
- package/src/shared/auto-capture/typings/auto-capture-state.interface.ts +13 -0
- package/src/shared/auto-capture/typings/auto-capture-trigger.interface.ts +7 -0
- package/src/shared/cli/constants/global-help.constant.ts +73 -0
- package/src/shared/cli/constants/leaf-help.constant.ts +219 -0
- package/src/shared/cli/constants/memory-protocol-body.constant.ts +39 -0
- package/src/shared/cli/constants/query-guidance-body.constant.ts +37 -0
- package/src/shared/cli/constants/subcommand-help.constant.ts +195 -0
- package/src/shared/cli/functions/collect-files.function.ts +55 -0
- package/src/shared/cli/functions/compute-section-kbid.function.ts +49 -0
- package/src/shared/cli/functions/format-mcp-output.function.ts +41 -0
- package/src/shared/cli/functions/format-text-output.function.ts +42 -0
- package/src/shared/cli/functions/generate-group-help.function.ts +41 -0
- package/src/shared/cli/functions/handle-data-command.function.ts +67 -0
- package/src/shared/cli/functions/handle-mcp.function.ts +56 -0
- package/src/shared/cli/functions/handle-migrate.function.ts +64 -0
- package/src/shared/cli/functions/hydrate-search-previews.function.ts +29 -0
- package/src/shared/cli/functions/parse-args.function.ts +3 -0
- package/src/shared/cli/functions/resolve-skill-names.function.ts +43 -0
- package/src/shared/cli/functions/run-search.function.ts +2 -0
- package/src/shared/cli/functions/version-gate.function.ts +44 -0
- package/src/shared/cli/functions/wrap-command.function.ts +34 -0
- package/src/shared/cli/typings/agent-create-client.interface.ts +47 -0
- package/src/shared/cli/typings/agent-get-client.interface.ts +39 -0
- package/src/shared/cli/typings/check-client.interface.ts +66 -0
- package/src/shared/cli/typings/cli-deps.interface.ts +54 -0
- package/src/shared/cli/typings/cli-options.interface.ts +2 -0
- package/src/shared/cli/typings/disconnectable-client.interface.ts +29 -0
- package/src/shared/cli/typings/dispatch-client.type.ts +46 -0
- package/src/shared/cli/typings/learn-client.interface.ts +53 -0
- package/src/shared/cli/typings/learn-io.interface.ts +5 -0
- package/src/shared/cli/typings/search-client.interface.ts +73 -0
- package/src/shared/embedding/classes/null-embedding-provider.class.ts +29 -0
- package/src/shared/embedding/constants/near-duplicate-thresholds.constant.ts +17 -0
- package/src/shared/embedding/functions/build-vector-index.function.ts +79 -0
- package/src/shared/embedding/functions/cosine-similarity.function.ts +31 -0
- package/src/shared/embedding/functions/detect-near-duplicates.function.ts +69 -0
- package/src/shared/embedding/functions/jaccard-coefficient.function.ts +26 -0
- package/src/shared/embedding/functions/read-vector-index-meta.function.ts +44 -0
- package/src/shared/embedding/functions/rrf-fuse.function.ts +33 -0
- package/src/shared/embedding/functions/search-vectors.function.ts +59 -0
- package/src/shared/embedding/index.ts +20 -0
- package/src/shared/embedding/typings/embedding-config.interface.ts +23 -0
- package/src/shared/embedding/typings/embedding-provider.interface.ts +25 -0
- package/src/shared/embedding/typings/near-duplicate-candidate.model.ts +25 -0
- package/src/shared/embedding/typings/near-duplicate-result.model.ts +26 -0
- package/src/shared/embedding/typings/vector-index-entry.model.ts +13 -0
- package/src/shared/embedding/typings/vector-index-meta.model.ts +14 -0
- package/src/shared/embedding/typings/vector-search-result.model.ts +8 -0
- package/src/shared/mcp/classes/mcp-server.class.ts +6 -3
- package/src/shared/mcp/constants/tool-agent-create.constant.ts +39 -0
- package/src/shared/mcp/constants/tool-agent-delete.constant.ts +26 -0
- package/src/shared/mcp/constants/tool-agent-get.constant.ts +24 -0
- package/src/shared/mcp/constants/tool-agent-list.constant.ts +18 -0
- package/src/shared/mcp/constants/tool-auto-capture-review.constant.ts +32 -0
- package/src/shared/mcp/constants/tool-check.constant.ts +21 -0
- package/src/shared/mcp/constants/tool-content.constant.ts +29 -0
- package/src/shared/mcp/constants/tool-export.constant.ts +27 -0
- package/src/shared/mcp/constants/tool-gc.constant.ts +21 -0
- package/src/shared/mcp/constants/tool-learn.constant.ts +58 -0
- package/src/shared/mcp/constants/tool-rebuild.constant.ts +21 -0
- package/src/shared/mcp/constants/tool-recall.constant.ts +36 -0
- package/src/shared/mcp/constants/tool-retrieve.constant.ts +31 -0
- package/src/shared/mcp/constants/tool-search.constant.ts +51 -0
- package/src/shared/mcp/constants/tool-skill-delete.constant.ts +24 -0
- package/src/shared/mcp/constants/tool-skill-get.constant.ts +27 -0
- package/src/shared/mcp/constants/tool-skill-learn.constant.ts +37 -0
- package/src/shared/mcp/constants/tool-skill-list.constant.ts +18 -0
- package/src/shared/mcp/constants/tool-status.constant.ts +20 -0
- package/src/shared/mcp/constants/tool-unlearn.constant.ts +25 -0
- package/src/shared/mcp/functions/as-boolean-or-undefined.function.ts +11 -0
- package/src/shared/mcp/functions/as-string-array-or-undefined.function.ts +17 -0
- package/src/shared/mcp/functions/as-string-array.function.ts +15 -0
- package/src/shared/mcp/functions/as-string.function.ts +10 -0
- package/src/shared/mcp/functions/build-skills-text.function.ts +43 -0
- package/src/shared/mcp/functions/create-tool-definitions.function.ts +28 -0
- package/src/shared/mcp/functions/handle-agent-create.function.ts +1 -1
- package/src/shared/mcp/functions/handle-agent-prompt.function.ts +68 -0
- package/src/shared/mcp/functions/handle-mcp-request.function.ts +202 -0
- package/src/shared/mcp/functions/handle-prompt-get.function.ts +18 -12
- package/src/shared/mcp/functions/handle-skill-prompt.function.ts +44 -0
- package/src/shared/mcp/functions/handle-tool-auto-capture-review.function.ts +24 -0
- package/src/shared/mcp/functions/handle-tool-call.function.ts +18 -0
- package/src/shared/mcp/functions/handle-tool-check.function.ts +21 -0
- package/src/shared/mcp/functions/handle-tool-content.function.ts +23 -0
- package/src/shared/mcp/functions/handle-tool-export.function.ts +25 -0
- package/src/shared/mcp/functions/handle-tool-gc.function.ts +21 -0
- package/src/shared/mcp/functions/handle-tool-learn.function.ts +69 -0
- package/src/shared/mcp/functions/handle-tool-rebuild.function.ts +21 -0
- package/src/shared/mcp/functions/handle-tool-retrieve.function.ts +40 -0
- package/src/shared/mcp/functions/handle-tool-search.function.ts +47 -0
- package/src/shared/mcp/functions/handle-tool-skill-delete.function.ts +34 -0
- package/src/shared/mcp/functions/handle-tool-skill-get.function.ts +59 -0
- package/src/shared/mcp/functions/handle-tool-skill-learn.function.ts +61 -0
- package/src/shared/mcp/functions/handle-tool-skill-list.function.ts +39 -0
- package/src/shared/mcp/functions/handle-tool-status.function.ts +21 -0
- package/src/shared/mcp/functions/handle-tool-unlearn.function.ts +24 -0
- package/src/shared/mcp/functions/parse-agent-meta.function.ts +27 -0
- package/src/shared/mcp/functions/parse-skill-arguments.function.ts +36 -0
- package/src/shared/mcp/functions/read-agent-meta.function.ts +41 -0
- package/src/shared/mcp/functions/resolve-skill-refs.function.ts +50 -0
- package/src/shared/mcp/functions/run-startup-health-check.function.ts +34 -0
- package/src/shared/mcp/typings/mcp-capabilities.interface.ts +16 -0
- package/src/shared/mcp/typings/mcp-client.interface.ts +2 -0
- package/src/shared/mcp/typings/mcp-completion.interface.ts +45 -0
- package/src/shared/mcp/typings/mcp-content-result.model.ts +9 -0
- package/src/shared/mcp/typings/mcp-export-result.model.ts +11 -0
- package/src/shared/mcp/typings/mcp-gc-result.model.ts +15 -0
- package/src/shared/mcp/typings/mcp-integrity-check-result.model.ts +17 -0
- package/src/shared/mcp/typings/mcp-integrity-error.model.ts +15 -0
- package/src/shared/mcp/typings/mcp-notification.interface.ts +9 -0
- package/src/shared/mcp/typings/mcp-rebuild-result.model.ts +9 -0
- package/src/shared/mcp/typings/mcp-request.interface.ts +11 -0
- package/src/shared/mcp/typings/mcp-resource-result.interface.ts +12 -0
- package/src/shared/mcp/typings/mcp-resource-template.interface.ts +11 -0
- package/src/shared/mcp/typings/mcp-response.interface.ts +18 -0
- package/src/shared/mcp/typings/mcp-server-info.interface.ts +7 -0
- package/src/shared/mcp/typings/mcp-server-state.interface.ts +17 -0
- package/src/shared/mcp/typings/mcp-tool-annotations.interface.ts +32 -0
- package/src/shared/mcp/typings/mcp-tool-definition.interface.ts +16 -0
- package/src/shared/mcp/typings/mcp-tool-result.interface.ts +19 -0
- package/src/shared/mcp/typings/mcp-worker-client.interface.ts +243 -0
- package/src/shared/mcp/typings/tool-call-result.model.ts +18 -0
- package/src/shared/sync/functions/build-import-report.function.ts +40 -0
- package/src/shared/sync/functions/parse-export-entry.function.ts +45 -0
- package/src/shared/sync/functions/resolve-conflict.function.ts +31 -0
- package/src/shared/sync/functions/serialize-export-entry.function.ts +18 -0
- package/src/shared/sync/index.ts +9 -0
- package/src/shared/sync/typings/conflict-resolution.type.ts +8 -0
- package/src/shared/sync/typings/export-entry.interface.ts +13 -0
- package/src/shared/sync/typings/export-options.interface.ts +9 -0
- package/src/shared/sync/typings/import-options.interface.ts +7 -0
- package/src/shared/sync/typings/import-report.interface.ts +15 -0
- package/src/shared/wasm-codec/functions/decode-one-recall-result.function.ts +86 -0
- package/src/shared/wasm-codec/functions/decode-option-string.function.ts +24 -0
- package/src/shared/wasm-codec/functions/decode-recall-document.function.ts +59 -0
- package/src/shared/wasm-codec/functions/decode-recall-reference.function.ts +52 -0
- package/src/shared/wasm-codec/functions/decode-recall-sibling.function.ts +43 -0
- package/src/shared/wasm-codec/functions/decode-section-match.function.ts +80 -0
- package/src/shared/wasm-codec/functions/decode-section-record-trailing.function.ts +75 -0
- package/src/shared/wasm-codec/functions/decode-section-record.function.ts +85 -0
- package/src/shared/wasm-codec/functions/decode-section-type.function.ts +30 -0
- package/src/shared/wasm-codec/functions/decode-wasm-list.function.ts +31 -0
- package/src/shared/wasm-codec/typings/add-section-input.model.ts +45 -0
- package/src/shared/wasm-codec/typings/add-section-result.model.ts +28 -0
- package/src/shared/wasm-codec/typings/document-manifest.model.ts +20 -0
- package/src/shared/wasm-codec/typings/document-section.model.ts +12 -0
- package/src/shared/wasm-codec/typings/item-decoder.type.ts +10 -0
- package/src/shared/wasm-codec/typings/near-duplicate.model.ts +16 -0
- package/src/shared/wasm-codec/typings/paged-search-result.model.ts +22 -0
- package/src/shared/wasm-codec/typings/section-match.model.ts +31 -0
- package/src/shared/wasm-codec/typings/section-record-trailing.model.ts +38 -0
- package/src/shared/wasm-codec/typings/section-record.model.ts +66 -0
- package/src/shared/wasm-codec/typings/section-type-result.model.ts +12 -0
- package/src/shared/worker-client/functions/handle-ipc-data.function.ts +49 -0
- package/src/shared/worker-client/functions/send-ipc-request.function.ts +39 -0
- package/src/shared/worker-client/typings/add-section-result.model.ts +2 -0
- package/src/shared/worker-client/typings/json-rpc-response.interface.ts +17 -0
- package/src/shared/worker-client/typings/pending-call.interface.ts +7 -0
- package/src/shared/worker-client/typings/recall-document.model.ts +16 -0
- package/src/shared/worker-client/typings/recall-params.model.ts +15 -0
- package/src/shared/worker-client/typings/recall-reference.model.ts +32 -0
- package/src/shared/worker-client/typings/recall-sibling.model.ts +11 -0
- package/src/shared/worker-client/typings/recall-single-result.model.ts +41 -0
- package/src/shared/worker-daemon/classes/ipc-error.class.ts +22 -0
- package/src/shared/worker-daemon/constants/wasm-method-map.constant.ts +69 -0
- package/src/shared/worker-daemon/functions/build-ipc-error-response.function.ts +16 -0
- package/src/shared/worker-daemon/functions/check-catalog-version.function.ts +54 -0
- package/src/shared/worker-daemon/functions/check-preconditions.function.ts +28 -0
- package/src/shared/worker-daemon/functions/detect-stale-pid.function.ts +33 -0
- package/src/shared/worker-daemon/functions/dispatch-request.function.ts +190 -0
- package/src/shared/worker-daemon/functions/handle-check-version.function.ts +74 -0
- package/src/shared/worker-daemon/functions/handle-config-method.function.ts +27 -0
- package/src/shared/worker-daemon/functions/handle-read-ops.function.ts +236 -0
- package/src/shared/worker-daemon/functions/handle-write-ops.function.ts +257 -0
- package/src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts +51 -0
- package/src/shared/worker-daemon/functions/parse-catalog-version.function.ts +20 -0
- package/src/shared/worker-daemon/functions/parse-embedding-section.function.ts +38 -0
- package/src/shared/worker-daemon/functions/parse-worker-toml.function.ts +104 -0
- package/src/shared/worker-daemon/functions/run-startup-integrity-check.function.ts +55 -0
- package/src/shared/worker-daemon/functions/scan-near-duplicates.function.ts +92 -0
- package/src/shared/worker-daemon/functions/wasm-bridge.function.ts +144 -0
- package/src/shared/worker-daemon/functions/wasm-memory-helpers.function.ts +41 -0
- package/src/shared/worker-daemon/functions/write-lock.function.ts +49 -0
- package/src/shared/worker-daemon/typings/allocator-ref.interface.ts +16 -0
- package/src/shared/worker-daemon/typings/daemon-config.interface.ts +7 -0
- package/src/shared/worker-daemon/typings/fs-adapter.interface.ts +22 -0
- package/src/shared/worker-daemon/typings/handler-context.interface.ts +19 -0
- package/src/shared/worker-daemon/typings/memory-ref.interface.ts +13 -0
- package/src/shared/worker-daemon/typings/wasm-fn.type.ts +2 -0
- package/src/shared/worker-daemon/typings/write-lock.interface.ts +13 -0
- package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- 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.
|