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