@dikolab/kbdb 0.2.2 → 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 +47 -31
- 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 +523 -80
- package/dist/cli.cjs.map +4 -4
- package/dist/cli.mjs +515 -72
- package/dist/cli.mjs.map +4 -4
- package/dist/kbdb-worker.cjs +395 -60
- package/dist/kbdb-worker.cjs.map +4 -4
- package/dist/mod.cjs +17 -0
- package/dist/mod.cjs.map +2 -2
- package/dist/mod.mjs +17 -0
- package/dist/mod.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/dispatch-command.function.d.ts +3 -1
- 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/install-default-skills.function.d.ts +12 -0
- package/dist/src/shared/cli/functions/resolve-skill-names.function.d.ts +16 -0
- package/dist/src/shared/cli/functions/run-check.function.d.ts +47 -5
- package/dist/src/shared/cli/functions/run-export.function.d.ts +34 -0
- package/dist/src/shared/cli/functions/run-gc.function.d.ts +6 -0
- package/dist/src/shared/cli/functions/run-learn.function.d.ts +35 -6
- package/dist/src/shared/cli/functions/run-recall.function.d.ts +45 -0
- package/dist/src/shared/cli/functions/run-search.function.d.ts +53 -15
- 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/index.d.ts +4 -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 +15 -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/learn-result.model.d.ts +19 -0
- package/dist/src/shared/cli/typings/search-client.interface.d.ts +71 -0
- package/dist/src/shared/cli/typings/search-display.model.d.ts +18 -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/classes/mcp-server.class.d.ts +8 -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 +45 -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-add-section-result.function.d.ts +48 -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-scored-results.function.d.ts +58 -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-records.function.d.ts +33 -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/functions/encode-add-section-params.function.d.ts +52 -0
- package/dist/src/shared/wasm-codec/index.d.ts +2 -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/classes/worker-client.class.d.ts +16 -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/index.d.ts +1 -1
- package/dist/src/shared/worker-client/typings/add-section-result.model.d.ts +31 -15
- package/dist/src/shared/worker-client/typings/export-result.model.d.ts +14 -0
- package/dist/src/shared/worker-client/typings/gc-result.model.d.ts +6 -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-client/typings/search-result.model.d.ts +12 -0
- package/dist/src/shared/worker-client/typings/section.model.d.ts +16 -0
- package/dist/src/shared/worker-daemon/classes/ipc-error.class.d.ts +17 -0
- package/dist/src/shared/worker-daemon/classes/worker-daemon.class.d.ts +35 -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.d.ts +22 -1
- package/dist/wasm/fs-database/kbdb_fs_database.js +28 -1
- package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +1 -0
- package/dist/wasm/kb-worker/kbdb_worker.d.ts +48 -1
- package/dist/wasm/kb-worker/kbdb_worker.js +60 -1
- package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/dist/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +2 -0
- package/dist/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
- package/dist/worker.mjs +396 -60
- package/dist/worker.mjs.map +4 -4
- package/docs/details/cli.md +102 -15
- package/docs/details/library-api.md +55 -6
- package/docs/details/mcp-server.md +10 -4
- package/docs/details/search-and-ranking.md +63 -5
- package/docs/details/storage.md +2 -0
- package/docs/goals/auto-capture.md +378 -0
- package/docs/goals/benchmarking.md +296 -0
- package/docs/goals/cli.md +255 -14
- package/docs/goals/concurrency.md +259 -0
- package/docs/goals/database.md +244 -17
- package/docs/goals/document.md +1 -1
- package/docs/goals/hybrid-search.md +436 -0
- package/docs/goals/mcp.md +83 -14
- package/docs/goals/query-parser.md +98 -4
- package/docs/goals/query-result.md +177 -10
- package/docs/goals/semantic-dedup.md +229 -0
- package/docs/goals/skills.md +72 -0
- package/docs/goals/sync.md +217 -0
- package/docs/goals/worker-daemon.md +54 -7
- package/docs/modules/rust/fs-database/functions/integrity.md +11 -0
- package/docs/modules/rust/fs-database/functions/section.md +23 -6
- package/docs/modules/rust/fs-database/indexes/vectors.md +110 -0
- package/docs/modules/rust/fs-database/module.md +1 -0
- package/docs/modules/rust/fs-database/types/section.md +27 -1
- package/docs/modules/rust/overview.md +2 -1
- package/docs/modules/rust/query-parser/functions/module.md +2 -2
- package/docs/modules/rust/query-parser/functions/pipeline.md +44 -6
- package/docs/modules/rust/query-parser/module.md +5 -4
- package/docs/modules/rust/query-parser/types/keyphrase.md +11 -0
- package/docs/modules/rust/query-parser/types/module.md +3 -3
- package/docs/modules/typescript/shared/auto-capture/module.md +73 -0
- package/docs/modules/typescript/shared/cli/functions.md +68 -3
- 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/dispatch-command.function.ts +53 -1
- package/src/shared/cli/functions/format-mcp-output.function.ts +41 -0
- package/src/shared/cli/functions/format-output.function.ts +36 -12
- 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/generate-help.function.ts +56 -1
- 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/install-default-skills.function.ts +296 -0
- package/src/shared/cli/functions/parse-args.function.ts +16 -0
- package/src/shared/cli/functions/resolve-skill-names.function.ts +43 -0
- package/src/shared/cli/functions/run-check.function.ts +87 -6
- package/src/shared/cli/functions/run-export.function.ts +40 -0
- package/src/shared/cli/functions/run-gc.function.ts +6 -0
- package/src/shared/cli/functions/run-init.function.ts +2 -0
- package/src/shared/cli/functions/run-learn.function.ts +68 -16
- package/src/shared/cli/functions/run-recall.function.ts +66 -0
- package/src/shared/cli/functions/run-search.function.ts +60 -15
- 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/index.ts +4 -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 +15 -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/learn-result.model.ts +16 -0
- package/src/shared/cli/typings/search-client.interface.ts +73 -0
- package/src/shared/cli/typings/search-display.model.ts +18 -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 +36 -4
- 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 +74 -5
- 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 +88 -2
- 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 +47 -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-add-section-result.function.ts +112 -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-scored-results.function.ts +86 -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-records.function.ts +87 -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/functions/encode-add-section-params.function.ts +68 -0
- package/src/shared/wasm-codec/index.ts +5 -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/classes/worker-client.class.ts +19 -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/index.ts +4 -1
- package/src/shared/worker-client/typings/add-section-result.model.ts +32 -15
- package/src/shared/worker-client/typings/export-result.model.ts +14 -0
- package/src/shared/worker-client/typings/gc-result.model.ts +6 -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-client/typings/search-result.model.ts +12 -0
- package/src/shared/worker-client/typings/section.model.ts +16 -0
- package/src/shared/worker-daemon/classes/ipc-error.class.ts +22 -0
- package/src/shared/worker-daemon/classes/worker-daemon.class.ts +315 -46
- 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/create-host-imports.function.ts +19 -4
- package/src/shared/worker-daemon/functions/create-ipc-server.function.ts +5 -1
- 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.d.ts +22 -1
- package/src/wasm/fs-database/kbdb_fs_database.js +28 -1
- package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/src/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +1 -0
- package/src/wasm/kb-worker/kbdb_worker.d.ts +48 -1
- package/src/wasm/kb-worker/kbdb_worker.js +60 -1
- package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/src/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +2 -0
- package/src/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
package/docs/goals/cli.md
CHANGED
|
@@ -53,12 +53,14 @@ kbdb --version | -v
|
|
|
53
53
|
kbdb learn [options] <path | ->...
|
|
54
54
|
kbdb unlearn [options] <kbid>...
|
|
55
55
|
kbdb search [options] <query>...
|
|
56
|
+
kbdb recall [options] <kbid>...
|
|
56
57
|
kbdb content [options] <id>...
|
|
57
58
|
kbdb mcp [options]
|
|
58
59
|
kbdb check [options]
|
|
59
60
|
kbdb gc [options]
|
|
60
61
|
kbdb rebuild [options]
|
|
61
62
|
kbdb status [options]
|
|
63
|
+
kbdb export [options] [<path>]
|
|
62
64
|
kbdb db init [options]
|
|
63
65
|
kbdb db migrate [options]
|
|
64
66
|
kbdb skill learn [options] --name <n> --body <file|->
|
|
@@ -196,6 +198,17 @@ Import and index documents into the knowledge base.
|
|
|
196
198
|
to this document ID. If the document does not
|
|
197
199
|
exist, it is created. Applies to all sections
|
|
198
200
|
ingested in this invocation.
|
|
201
|
+
- `--tags <t,...>` -- Comma-separated tags for scoping
|
|
202
|
+
and filtering. Applies to all sections ingested in
|
|
203
|
+
this invocation. Example: `--tags auth,api,v2`.
|
|
204
|
+
- `--replace` -- Enable supersession. When set, the
|
|
205
|
+
system matches each incoming section by source key
|
|
206
|
+
(source path + heading). If an existing section has
|
|
207
|
+
the same source key, it is superseded: the old
|
|
208
|
+
section's document references are transferred to the
|
|
209
|
+
new one and the old section becomes eligible for GC.
|
|
210
|
+
Without this flag, re-learning edited content creates
|
|
211
|
+
a sibling rather than replacing the original.
|
|
199
212
|
|
|
200
213
|
**Supported file extensions:**
|
|
201
214
|
|
|
@@ -239,7 +252,10 @@ sections in the same invocation.
|
|
|
239
252
|
"kbid": "abcdef1234567890abcdef1234",
|
|
240
253
|
"path": "/absolute/path/to/file.md",
|
|
241
254
|
"size": 1234,
|
|
242
|
-
"skipped": false
|
|
255
|
+
"skipped": false,
|
|
256
|
+
"superseded": null,
|
|
257
|
+
"warnings": [],
|
|
258
|
+
"near_duplicates": []
|
|
243
259
|
}
|
|
244
260
|
]
|
|
245
261
|
```
|
|
@@ -247,7 +263,12 @@ sections in the same invocation.
|
|
|
247
263
|
is the UTF-8 character count of the content. The
|
|
248
264
|
`skipped` field is always `false` for results that
|
|
249
265
|
appear in the array -- files that are skipped produce
|
|
250
|
-
no entry.
|
|
266
|
+
no entry. `superseded` is the kbid of the section
|
|
267
|
+
that was replaced via `--replace` (null when no
|
|
268
|
+
supersession occurred). `warnings` is an array of
|
|
269
|
+
warning strings (e.g. `"heading_missing"` when no
|
|
270
|
+
title is provided). `near_duplicates` lists sections
|
|
271
|
+
with similarity >= 0.85 as `{kbid, similarity}`.
|
|
251
272
|
- **stderr**: errors only.
|
|
252
273
|
|
|
253
274
|
**Exit code:** `0` on success, `1` on error.
|
|
@@ -425,15 +446,19 @@ array (see [SearchDisplay type](#searchdisplay-type)).
|
|
|
425
446
|
"type": "text/markdown",
|
|
426
447
|
"docids": ["doc-intro-ml"],
|
|
427
448
|
"score": 8.7432,
|
|
449
|
+
"confidence": 1.0,
|
|
428
450
|
"snippet": "Machine learning is a subfield...",
|
|
429
451
|
"matched_terms": ["machine", "learning"],
|
|
452
|
+
"matched_fields": ["heading", "body"],
|
|
453
|
+
"created_at": "2026-06-15T10:00:00Z",
|
|
430
454
|
"preview": ""
|
|
431
455
|
}
|
|
432
456
|
],
|
|
433
457
|
"total": 42,
|
|
434
458
|
"offset": 0,
|
|
435
459
|
"limit": 20,
|
|
436
|
-
"has_more": true
|
|
460
|
+
"has_more": true,
|
|
461
|
+
"relaxed": false
|
|
437
462
|
}
|
|
438
463
|
```
|
|
439
464
|
|
|
@@ -448,15 +473,19 @@ section text:
|
|
|
448
473
|
"type": "text/markdown",
|
|
449
474
|
"docids": ["doc-intro-ml"],
|
|
450
475
|
"score": 8.7432,
|
|
476
|
+
"confidence": 1.0,
|
|
451
477
|
"snippet": "Machine learning is a subfield...",
|
|
452
478
|
"matched_terms": ["machine", "learning"],
|
|
479
|
+
"matched_fields": ["heading", "body"],
|
|
480
|
+
"created_at": "2026-06-15T10:00:00Z",
|
|
453
481
|
"preview": "Machine learning is a subfield..."
|
|
454
482
|
}
|
|
455
483
|
],
|
|
456
484
|
"total": 42,
|
|
457
485
|
"offset": 0,
|
|
458
486
|
"limit": 20,
|
|
459
|
-
"has_more": true
|
|
487
|
+
"has_more": true,
|
|
488
|
+
"relaxed": false
|
|
460
489
|
}
|
|
461
490
|
```
|
|
462
491
|
|
|
@@ -557,6 +586,131 @@ src/cli.ts parseArgs()
|
|
|
557
586
|
See [Content Composer](content-composer.md) for the
|
|
558
587
|
full composition specification.
|
|
559
588
|
|
|
589
|
+
### `recall` -- progressive context retrieval
|
|
590
|
+
|
|
591
|
+
```
|
|
592
|
+
kbdb recall [options] <kbid>...
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
Retrieve full content and progressive context for one
|
|
596
|
+
or more sections by kbid. Use after `search` to drill
|
|
597
|
+
into relevant results. Returns section text, metadata,
|
|
598
|
+
references, and back-references at configurable
|
|
599
|
+
expansion depths.
|
|
600
|
+
|
|
601
|
+
**Arguments:**
|
|
602
|
+
- `<kbid>...` -- one or more 26-character kb-id
|
|
603
|
+
strings.
|
|
604
|
+
|
|
605
|
+
**Options:**
|
|
606
|
+
|
|
607
|
+
| Flag | Alias | Description |
|
|
608
|
+
|-----------------|-------|--------------------------------|
|
|
609
|
+
| `--depth <n>` | `-d` | Expansion depth (0--3, |
|
|
610
|
+
| | | default: 0, clamped to 3) |
|
|
611
|
+
| `--db <path>` | | Database directory path |
|
|
612
|
+
|
|
613
|
+
**Expansion levels:**
|
|
614
|
+
|
|
615
|
+
| Depth | Returns |
|
|
616
|
+
|-------|---------------------------------------|
|
|
617
|
+
| 0 | Full section content with heading, |
|
|
618
|
+
| | type, and docids. |
|
|
619
|
+
| 1 | Depth-0 content, plus parent document |
|
|
620
|
+
| | manifests (title, all section kbids |
|
|
621
|
+
| | with headings and types) for each |
|
|
622
|
+
| | docid, plus back-references (sections |
|
|
623
|
+
| | that reference this section, from the |
|
|
624
|
+
| | reference graph index, each with |
|
|
625
|
+
| | marker_type and context_snippet). |
|
|
626
|
+
| 2 | Depth-1 content, plus full text of |
|
|
627
|
+
| | sibling sections (other sections in |
|
|
628
|
+
| | the same documents), plus forward |
|
|
629
|
+
| | references from the section's own |
|
|
630
|
+
| | content markers. |
|
|
631
|
+
| 3 | Depth-2 content, plus full text of |
|
|
632
|
+
| | referenced sections (one level deep), |
|
|
633
|
+
| | plus their back-references. |
|
|
634
|
+
|
|
635
|
+
Depth values above 3 are clamped to 3.
|
|
636
|
+
|
|
637
|
+
**Output:**
|
|
638
|
+
- **stdout**: JSON `RecallResult` object (single kbid)
|
|
639
|
+
or `RecallResult[]` array (multiple kbids).
|
|
640
|
+
|
|
641
|
+
Single result shape (depth 0):
|
|
642
|
+
|
|
643
|
+
```json
|
|
644
|
+
{
|
|
645
|
+
"kbid": "a1b2c3d4e5f6g7h8j9k0l1m2n3",
|
|
646
|
+
"heading": "Architecture Overview",
|
|
647
|
+
"type": "text/markdown",
|
|
648
|
+
"content": "Full section text...",
|
|
649
|
+
"docids": ["doc-5678"]
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
Single result shape (depth 1+):
|
|
654
|
+
|
|
655
|
+
```json
|
|
656
|
+
{
|
|
657
|
+
"kbid": "a1b2c3d4e5f6g7h8j9k0l1m2n3",
|
|
658
|
+
"heading": "Architecture Overview",
|
|
659
|
+
"type": "text/markdown",
|
|
660
|
+
"content": "Full section text...",
|
|
661
|
+
"docids": ["doc-5678"],
|
|
662
|
+
"documents": [
|
|
663
|
+
{
|
|
664
|
+
"docid": "doc-5678",
|
|
665
|
+
"title": "System Architecture",
|
|
666
|
+
"sections": [
|
|
667
|
+
{
|
|
668
|
+
"kbid": "...",
|
|
669
|
+
"heading": "...",
|
|
670
|
+
"type": "..."
|
|
671
|
+
}
|
|
672
|
+
]
|
|
673
|
+
}
|
|
674
|
+
],
|
|
675
|
+
"back_references": [
|
|
676
|
+
{
|
|
677
|
+
"kbid": "ref-section-kbid",
|
|
678
|
+
"heading": "Related Section",
|
|
679
|
+
"type": "text/markdown",
|
|
680
|
+
"marker_type": "link",
|
|
681
|
+
"context_snippet": "For details, see ...",
|
|
682
|
+
"direction": "back"
|
|
683
|
+
}
|
|
684
|
+
],
|
|
685
|
+
"siblings": [ ... ],
|
|
686
|
+
"references": [ ... ]
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
Fields beyond `content` and `docids` are present only
|
|
691
|
+
at the corresponding depth level. At depth 0,
|
|
692
|
+
`documents`, `back_references`, `siblings`, and
|
|
693
|
+
`references` are absent. At depth 1, `siblings` and
|
|
694
|
+
`references` are absent. And so on.
|
|
695
|
+
|
|
696
|
+
- **stderr**: errors only.
|
|
697
|
+
|
|
698
|
+
**Exit code:** `0` on success, `1` on error.
|
|
699
|
+
|
|
700
|
+
**Delegation chain:**
|
|
701
|
+
```
|
|
702
|
+
src/cli.ts parseArgs()
|
|
703
|
+
-> findDb() / promptUser() / runDbInit()
|
|
704
|
+
-> createWorkerClient({ contextPath })
|
|
705
|
+
-> versionGate(client, dbDir)
|
|
706
|
+
-> dispatchCommand(client, options)
|
|
707
|
+
-> runRecall(client, options)
|
|
708
|
+
-> client.recall({ kbids, depth })
|
|
709
|
+
-> IPC -> worker daemon
|
|
710
|
+
-> kb-worker.wasm
|
|
711
|
+
-> fs-database.wasm (fetch)
|
|
712
|
+
```
|
|
713
|
+
|
|
560
714
|
### `mcp` -- start MCP server
|
|
561
715
|
|
|
562
716
|
```
|
|
@@ -604,7 +758,8 @@ The MCP server exposes `retrieve` (section/document
|
|
|
604
758
|
lookup by ID) and `status` (database metadata) tools
|
|
605
759
|
that have no CLI equivalents. These are programmatic
|
|
606
760
|
operations suited to MCP clients (AI agents). CLI
|
|
607
|
-
users use `kbdb search` to find content
|
|
761
|
+
users use `kbdb search` to find content,
|
|
762
|
+
`kbdb recall` to expand context progressively, and
|
|
608
763
|
`kbdb content` to compose documents by ID.
|
|
609
764
|
|
|
610
765
|
### `check` -- integrity check
|
|
@@ -614,8 +769,9 @@ kbdb check [options]
|
|
|
614
769
|
```
|
|
615
770
|
|
|
616
771
|
Verify the integrity of the database. Checks section
|
|
617
|
-
file checksums, document manifest references,
|
|
618
|
-
|
|
772
|
+
file checksums, document manifest references, type
|
|
773
|
+
consistency, and divergent content (sections sharing
|
|
774
|
+
the same source key with different content).
|
|
619
775
|
|
|
620
776
|
**Output:**
|
|
621
777
|
- **stdout**: JSON integrity report:
|
|
@@ -672,11 +828,15 @@ manifest references it (empty `docids` array).
|
|
|
672
828
|
```json
|
|
673
829
|
{
|
|
674
830
|
"removed_sections": 3,
|
|
675
|
-
"removed_bytes": 15360
|
|
831
|
+
"removed_bytes": 15360,
|
|
832
|
+
"stale_sources": 1
|
|
676
833
|
}
|
|
677
834
|
```
|
|
678
835
|
When no sections are eligible, `removed_sections`
|
|
679
836
|
is `0` and `removed_bytes` is `0`.
|
|
837
|
+
`stale_sources` reports sections whose
|
|
838
|
+
`source_path` file no longer contains their heading
|
|
839
|
+
text (advisory, not automatically removed).
|
|
680
840
|
- **stderr**: errors only.
|
|
681
841
|
|
|
682
842
|
**Exit code:** `0` on success, `1` on error.
|
|
@@ -734,6 +894,55 @@ src/cli.ts parseArgs()
|
|
|
734
894
|
-> stdout
|
|
735
895
|
```
|
|
736
896
|
|
|
897
|
+
### `export` -- snapshot database
|
|
898
|
+
|
|
899
|
+
```
|
|
900
|
+
kbdb export [options] [<path>]
|
|
901
|
+
```
|
|
902
|
+
|
|
903
|
+
Export the database as a self-contained directory
|
|
904
|
+
snapshot for backup, transfer, or version control.
|
|
905
|
+
The export includes sections, documents, and the
|
|
906
|
+
catalog. Indexes are excluded -- they are derived
|
|
907
|
+
data and can be rebuilt with `kbdb rebuild` after
|
|
908
|
+
importing.
|
|
909
|
+
|
|
910
|
+
**Arguments:**
|
|
911
|
+
- `<path>` -- Output directory path. Defaults to
|
|
912
|
+
`./kbdb-export/` in the current working directory.
|
|
913
|
+
If the directory exists, it is overwritten.
|
|
914
|
+
|
|
915
|
+
**Options:**
|
|
916
|
+
- `--db <path>` -- Source database directory.
|
|
917
|
+
|
|
918
|
+
**Output:**
|
|
919
|
+
- **stdout**: JSON report:
|
|
920
|
+
```json
|
|
921
|
+
{
|
|
922
|
+
"path": "/absolute/path/kbdb-export",
|
|
923
|
+
"sections_exported": 42,
|
|
924
|
+
"documents_exported": 5
|
|
925
|
+
}
|
|
926
|
+
```
|
|
927
|
+
- **stderr**: errors only.
|
|
928
|
+
|
|
929
|
+
**Exit code:** `0` on success, `1` on error.
|
|
930
|
+
|
|
931
|
+
**Delegation chain:**
|
|
932
|
+
```
|
|
933
|
+
src/cli.ts parseArgs()
|
|
934
|
+
-> findDb() / promptUser() / runDbInit()
|
|
935
|
+
-> createWorkerClient({ contextPath })
|
|
936
|
+
-> versionGate(client, dbDir)
|
|
937
|
+
-> dispatchCommand(client, options)
|
|
938
|
+
-> runExport(client, options)
|
|
939
|
+
-> client.export({ path })
|
|
940
|
+
-> IPC -> worker daemon
|
|
941
|
+
-> kb-worker.wasm
|
|
942
|
+
-> fs-database.wasm
|
|
943
|
+
-> stdout
|
|
944
|
+
```
|
|
945
|
+
|
|
737
946
|
### `kbdb db` -- database management
|
|
738
947
|
|
|
739
948
|
The `db` command group manages the `.kbdb` database
|
|
@@ -1520,10 +1729,13 @@ processes the raw argument vector
|
|
|
1520
1729
|
5. All other flags (`--db`, `--format`, `--mode`,
|
|
1521
1730
|
`--limit`, `--offset`, `--title`, `--description`,
|
|
1522
1731
|
`--docid`, `--name`, `--persona`, `--body`,
|
|
1523
|
-
`--skills`
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1732
|
+
`--skills`, `--depth` / `-d`, `--tags`) consume
|
|
1733
|
+
the next token as their value. `--depth` is parsed
|
|
1734
|
+
as a number and clamped to the range 0--3. `--tags`
|
|
1735
|
+
splits its value on commas into a `string[]`.
|
|
1736
|
+
6. `--content` / `-c` and `--replace` are boolean
|
|
1737
|
+
flags; they set their respective option to `true`
|
|
1738
|
+
without consuming the next token.
|
|
1527
1739
|
7. The first non-flag, non-group token becomes the
|
|
1528
1740
|
**command**.
|
|
1529
1741
|
8. Subsequent non-flag tokens become **positional
|
|
@@ -1584,6 +1796,12 @@ interface CliOptions {
|
|
|
1584
1796
|
/** Comma-separated skill kbids
|
|
1585
1797
|
* (agent create). Parsed to string[]. */
|
|
1586
1798
|
skills?: string[];
|
|
1799
|
+
/** Recall expansion depth (0-3). Defaults to 0. */
|
|
1800
|
+
depth?: number;
|
|
1801
|
+
/** Comma-separated tags for scoping (learn). */
|
|
1802
|
+
tags?: string[];
|
|
1803
|
+
/** Enable supersession by source key (learn). */
|
|
1804
|
+
replace?: boolean;
|
|
1587
1805
|
/** Positional arguments following the sub-command. */
|
|
1588
1806
|
args: string[];
|
|
1589
1807
|
}
|
|
@@ -1638,6 +1856,7 @@ Knowledge Base:
|
|
|
1638
1856
|
learn Import content from files/stdin
|
|
1639
1857
|
unlearn Remove sections by kbid
|
|
1640
1858
|
search Query the knowledge base
|
|
1859
|
+
recall Retrieve section context by kbid
|
|
1641
1860
|
content Compose rendered content from ids
|
|
1642
1861
|
|
|
1643
1862
|
Database:
|
|
@@ -1650,6 +1869,7 @@ Maintenance:
|
|
|
1650
1869
|
sections
|
|
1651
1870
|
rebuild Reconstruct all index files
|
|
1652
1871
|
status Show database status
|
|
1872
|
+
export Snapshot database for backup
|
|
1653
1873
|
|
|
1654
1874
|
Skills:
|
|
1655
1875
|
skill learn Create a new skill definition
|
|
@@ -1734,12 +1954,20 @@ interface SearchDisplay {
|
|
|
1734
1954
|
docids: string[];
|
|
1735
1955
|
/** Relevance score from the ranking engine. */
|
|
1736
1956
|
score: number;
|
|
1957
|
+
/** Normalized score (0.0-1.0) relative to the top
|
|
1958
|
+
* result in this result set. */
|
|
1959
|
+
confidence: number;
|
|
1737
1960
|
/** KWIC excerpt (~150 chars) centered on the
|
|
1738
1961
|
* highest-scoring matched term. Empty string
|
|
1739
1962
|
* for image sections. */
|
|
1740
1963
|
snippet: string;
|
|
1741
1964
|
/** Query terms that matched, as a flat string[]. */
|
|
1742
1965
|
matched_terms: string[];
|
|
1966
|
+
/** Fields that contained matches: subset of
|
|
1967
|
+
* ["heading", "body", "code"]. */
|
|
1968
|
+
matched_fields: string[];
|
|
1969
|
+
/** ISO 8601 creation timestamp. */
|
|
1970
|
+
created_at: string;
|
|
1743
1971
|
/** Full section text. Empty string when --content
|
|
1744
1972
|
* is not used. */
|
|
1745
1973
|
preview: string;
|
|
@@ -1764,12 +1992,23 @@ Produced by `runLearn()` for each file ingested.
|
|
|
1764
1992
|
interface LearnResult {
|
|
1765
1993
|
/** Knowledge-base identifier assigned to the section. */
|
|
1766
1994
|
kbid: string;
|
|
1767
|
-
/** Absolute path to the source file (or "-" for
|
|
1995
|
+
/** Absolute path to the source file (or "-" for
|
|
1996
|
+
* stdin). */
|
|
1768
1997
|
path: string;
|
|
1769
1998
|
/** UTF-8 character count of the ingested content. */
|
|
1770
1999
|
size: number;
|
|
1771
|
-
/** true when the file was skipped
|
|
2000
|
+
/** true when the file was skipped. */
|
|
1772
2001
|
skipped: boolean;
|
|
2002
|
+
/** Kbid of the section this one superseded via
|
|
2003
|
+
* --replace, or null. */
|
|
2004
|
+
superseded: string | null;
|
|
2005
|
+
/** Warning strings (e.g. "heading_missing"). */
|
|
2006
|
+
warnings: string[];
|
|
2007
|
+
/** Sections with similarity >= 0.85. */
|
|
2008
|
+
near_duplicates: Array<{
|
|
2009
|
+
kbid: string;
|
|
2010
|
+
similarity: number;
|
|
2011
|
+
}>;
|
|
1773
2012
|
}
|
|
1774
2013
|
```
|
|
1775
2014
|
|
|
@@ -1860,10 +2099,12 @@ Routing table:
|
|
|
1860
2099
|
| `learn` | `runLearn` | yes |
|
|
1861
2100
|
| `unlearn` | `runUnlearn` | yes |
|
|
1862
2101
|
| `search` | `runSearch` | yes |
|
|
2102
|
+
| `recall` | `runRecall` | yes |
|
|
1863
2103
|
| `content` | `runContent` | yes |
|
|
1864
2104
|
| `check` | `runCheck` | yes |
|
|
1865
2105
|
| `gc` | `runGc` | yes |
|
|
1866
2106
|
| `rebuild` | `runRebuild` | yes |
|
|
2107
|
+
| `export` | `runExport` | yes |
|
|
1867
2108
|
| `db-init` | `runDbInit` | no |
|
|
1868
2109
|
| `db-migrate` | `runDbMigrate` | yes |
|
|
1869
2110
|
| `skill-learn` | `runSkillLearn` | yes |
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Concurrent Write Safety
|
|
2
|
+
|
|
3
|
+
*One writer at a time, unlimited concurrent readers --
|
|
4
|
+
formalizing the locking model, multi-daemon prevention,
|
|
5
|
+
crash recovery, and stress-test methodology.*
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
The worker daemon serializes all write operations
|
|
10
|
+
through a single-writer lock. Multiple concurrent
|
|
11
|
+
readers proceed without any lock. This document
|
|
12
|
+
formalizes the locking model, multi-daemon prevention,
|
|
13
|
+
atomic write guarantees, crash recovery, and
|
|
14
|
+
stress-test methodology.
|
|
15
|
+
|
|
16
|
+
This goal addresses gap #3 from the issue
|
|
17
|
+
[2026-06-23 Opus 4.8 Second Brain Review](../issues/2026-06-23-opus-48-second-brain-review.md):
|
|
18
|
+
the single-writer lock in the worker daemon must be
|
|
19
|
+
validated under concurrent load before concurrent
|
|
20
|
+
multi-agent use can be trusted.
|
|
21
|
+
|
|
22
|
+
## Single-Writer Lock
|
|
23
|
+
|
|
24
|
+
The daemon acquires an exclusive file lock on
|
|
25
|
+
`kbdb-{ctx}.lock` in the OS temporary directory during
|
|
26
|
+
write operations. The lock file uses the same context
|
|
27
|
+
ID as the PID file and IPC socket (see
|
|
28
|
+
[Worker Daemon](worker-daemon.md) for context ID
|
|
29
|
+
derivation).
|
|
30
|
+
|
|
31
|
+
- **Read operations** -- search, recall, retrieve,
|
|
32
|
+
content, dbStatus, and listByType -- proceed without
|
|
33
|
+
acquiring the lock. Concurrent read requests from
|
|
34
|
+
multiple worker client connections are fully parallel.
|
|
35
|
+
- **Write operations** -- addSection, updateSection,
|
|
36
|
+
removeSection, groupSections, removeGrouping,
|
|
37
|
+
initDirectory, gc, rebuildIndexes, and export --
|
|
38
|
+
acquire the exclusive lock before calling the
|
|
39
|
+
corresponding WASM export. If another write is
|
|
40
|
+
already in progress, the new write queues behind the
|
|
41
|
+
lock and waits.
|
|
42
|
+
- The lock is held only for the duration of a single
|
|
43
|
+
write operation. It is released immediately after
|
|
44
|
+
the operation completes. It is never held across
|
|
45
|
+
multiple operations or across client connections.
|
|
46
|
+
- The locking model is implemented in TypeScript inside
|
|
47
|
+
the worker daemon (`src/shared/worker-daemon/`), not
|
|
48
|
+
inside any WASM module.
|
|
49
|
+
|
|
50
|
+
This model is equivalent to SQLite's default locking:
|
|
51
|
+
readers never block, and writers take turns one at a
|
|
52
|
+
time.
|
|
53
|
+
|
|
54
|
+
### Write Operations Subject to the Lock
|
|
55
|
+
|
|
56
|
+
| IPC Method | WASM Export |
|
|
57
|
+
|--------------------------|----------------------------|
|
|
58
|
+
| `addSection` | `worker_add_section` |
|
|
59
|
+
| `updateSection` | `worker_update_section` |
|
|
60
|
+
| `removeSection` | `worker_remove_section` |
|
|
61
|
+
| `groupSections` | `worker_group_sections` |
|
|
62
|
+
| `removeGrouping` | `worker_remove_grouping` |
|
|
63
|
+
| `initDirectory` | `worker_init_directory` |
|
|
64
|
+
| `gc` | `worker_garbage_collect` |
|
|
65
|
+
| `rebuildIndexes` | `worker_rebuild_indexes` |
|
|
66
|
+
| `export` | `db_export` |
|
|
67
|
+
|
|
68
|
+
## Multi-Daemon Prevention
|
|
69
|
+
|
|
70
|
+
Each database context gets exactly one daemon process
|
|
71
|
+
at a time, enforced by a PID file keyed to the context
|
|
72
|
+
ID.
|
|
73
|
+
|
|
74
|
+
- The PID file is named `kbdb-{ctx}.pid` and lives in
|
|
75
|
+
the OS temporary directory. Its presence means a
|
|
76
|
+
daemon for that context is either running or died
|
|
77
|
+
without cleaning up.
|
|
78
|
+
- Before spawning a new daemon, the worker client reads
|
|
79
|
+
the PID file (if present) and checks whether the
|
|
80
|
+
recorded process is alive.
|
|
81
|
+
- **PID file absent** -- no running daemon; spawn a
|
|
82
|
+
new one.
|
|
83
|
+
- **PID file present, process alive** -- connect to
|
|
84
|
+
the existing daemon; do not spawn.
|
|
85
|
+
- **PID file present, process dead** -- stale PID
|
|
86
|
+
file from a prior crash; remove the file and spawn
|
|
87
|
+
a new daemon.
|
|
88
|
+
- The daemon writes its PID file only after all startup
|
|
89
|
+
preconditions pass and the WASM module is loaded
|
|
90
|
+
successfully. See [Worker Daemon](worker-daemon.md)
|
|
91
|
+
for the full startup sequence.
|
|
92
|
+
- On graceful shutdown, the daemon removes its PID
|
|
93
|
+
file before exiting.
|
|
94
|
+
|
|
95
|
+
This protocol ensures that the same database directory
|
|
96
|
+
is never served by two concurrent daemon processes.
|
|
97
|
+
|
|
98
|
+
## Atomic Write Guarantees
|
|
99
|
+
|
|
100
|
+
All file writes in the database use the atomic
|
|
101
|
+
write pattern: content is written to a temporary file
|
|
102
|
+
first, then the temporary file is renamed to the final
|
|
103
|
+
path. Rename is an atomic operation on all supported
|
|
104
|
+
filesystems (POSIX and Windows NTFS).
|
|
105
|
+
|
|
106
|
+
- **Section files** (`sections/{prefix}/{kbid}.sec`)
|
|
107
|
+
are written to `sections/{prefix}/{kbid}.sec.tmp`
|
|
108
|
+
then renamed.
|
|
109
|
+
- **Document manifests** (`documents/{docid}.toml`)
|
|
110
|
+
are written to `documents/{docid}.toml.tmp` then
|
|
111
|
+
renamed.
|
|
112
|
+
- **Index files** (`indexes/terms.idx`, etc.) are
|
|
113
|
+
rebuilt to temporary paths then renamed into place.
|
|
114
|
+
- **Catalog** (`catalog.toml`) is written last,
|
|
115
|
+
after all data files are in place. A crash
|
|
116
|
+
before the catalog rename leaves the catalog
|
|
117
|
+
consistent with the previous complete state.
|
|
118
|
+
|
|
119
|
+
If the daemon crashes mid-write, the temporary file
|
|
120
|
+
is orphaned but the original file is intact. On next
|
|
121
|
+
daemon startup, orphaned temporary files (matching
|
|
122
|
+
`*.tmp`) in the database directory are cleaned up.
|
|
123
|
+
|
|
124
|
+
The atomic write pattern is specified in
|
|
125
|
+
[Database](database.md) under Storage Design.
|
|
126
|
+
|
|
127
|
+
## Crash Recovery
|
|
128
|
+
|
|
129
|
+
The table below describes every identified failure
|
|
130
|
+
scenario, the resulting disk state, and the recovery
|
|
131
|
+
action.
|
|
132
|
+
|
|
133
|
+
| Scenario | State After Crash | Recovery |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| Crash during section write | `*.sec.tmp` orphaned, original `.sec` intact | Startup cleans `*.tmp` files |
|
|
136
|
+
| Crash during index rebuild | Partial `*.idx.tmp`, originals intact | Startup cleans `*.tmp`; next `rebuildIndexes` overwrites |
|
|
137
|
+
| Crash during GC | Some unreferenced sections deleted, others not | Re-run `gc`; idempotent |
|
|
138
|
+
| Crash during catalog write | `catalog.toml.tmp` orphaned, original intact | Startup cleans `*.tmp` |
|
|
139
|
+
| PID file not removed | Stale `kbdb-{ctx}.pid` on disk | Worker client detects dead process, removes PID, spawns new daemon |
|
|
140
|
+
| Lock file not released | `kbdb-{ctx}.lock` orphaned | Daemon startup acquires the exclusive lock fresh; OS releases orphaned file locks when the process that held them exits |
|
|
141
|
+
| WASM crash inside write | Partial in-memory state, temp file may exist | Daemon exits; startup cleans `*.tmp`; next operation starts clean |
|
|
142
|
+
|
|
143
|
+
All recovery actions are automatic. No manual
|
|
144
|
+
intervention is required for any scenario in this
|
|
145
|
+
table.
|
|
146
|
+
|
|
147
|
+
## Stress Test Specification
|
|
148
|
+
|
|
149
|
+
The following test harness validates concurrent write
|
|
150
|
+
safety. It must pass on both Deno and Node.js runtimes
|
|
151
|
+
before a release can claim concurrent safety.
|
|
152
|
+
|
|
153
|
+
### Setup
|
|
154
|
+
|
|
155
|
+
1. Create a fresh, empty database directory.
|
|
156
|
+
2. Prepare N unique documents (N in the range 10--50).
|
|
157
|
+
Each document must have distinct content to avoid
|
|
158
|
+
content-address collisions that would make section
|
|
159
|
+
count verification meaningless.
|
|
160
|
+
|
|
161
|
+
### Execution
|
|
162
|
+
|
|
163
|
+
3. Launch N concurrent `kbdb learn` invocations, all
|
|
164
|
+
targeting the same database directory. Each
|
|
165
|
+
invocation learns one of the N unique documents.
|
|
166
|
+
4. Use a process pool or parallel shell to launch all
|
|
167
|
+
N invocations simultaneously -- not sequentially.
|
|
168
|
+
5. Wait for all N invocations to complete. Record any
|
|
169
|
+
non-zero exit codes as failures.
|
|
170
|
+
|
|
171
|
+
### Verification
|
|
172
|
+
|
|
173
|
+
6. Run `kbdb check` against the database.
|
|
174
|
+
The response must have `ok: true`. Any errors in the
|
|
175
|
+
response are test failures.
|
|
176
|
+
7. Query the section count. The count must equal the
|
|
177
|
+
expected number of sections derived from the N
|
|
178
|
+
documents (no duplicates from race conditions, no
|
|
179
|
+
losses from interleaved writes).
|
|
180
|
+
8. Verify that no section has a checksum mismatch.
|
|
181
|
+
A mismatch indicates a torn write -- the atomic
|
|
182
|
+
rename pattern failed or was bypassed.
|
|
183
|
+
|
|
184
|
+
### Pass Criteria
|
|
185
|
+
|
|
186
|
+
| Check | Expected Result |
|
|
187
|
+
|---|---|
|
|
188
|
+
| All `kbdb learn` exit codes | `0` |
|
|
189
|
+
| `kbdb check` response | `ok: true`, zero errors |
|
|
190
|
+
| Section count | Exactly the expected count |
|
|
191
|
+
| Checksum mismatches | Zero |
|
|
192
|
+
|
|
193
|
+
### Runtime Matrix
|
|
194
|
+
|
|
195
|
+
Run the full harness on both runtimes:
|
|
196
|
+
|
|
197
|
+
| Runtime | Command prefix |
|
|
198
|
+
|---|---|
|
|
199
|
+
| Node.js >= 20 | `node dist/kbdb.mjs` |
|
|
200
|
+
| Deno | `deno run --allow-all src/cli.ts` |
|
|
201
|
+
|
|
202
|
+
Both must pass. A failure on one runtime but not the
|
|
203
|
+
other indicates a runtime-specific locking bug.
|
|
204
|
+
|
|
205
|
+
## Edge Cases
|
|
206
|
+
|
|
207
|
+
### Two CLI Invocations Through the Same Daemon
|
|
208
|
+
|
|
209
|
+
When two `kbdb` CLI processes connect to the same
|
|
210
|
+
daemon (same database directory), their write requests
|
|
211
|
+
share the single-writer lock automatically. No user
|
|
212
|
+
action is required. The second write waits for the
|
|
213
|
+
first to complete.
|
|
214
|
+
|
|
215
|
+
### MCP Server Connections
|
|
216
|
+
|
|
217
|
+
An MCP server connection routes all requests through
|
|
218
|
+
a worker client to the daemon, the same as a CLI
|
|
219
|
+
invocation. Multiple MCP client connections routed to
|
|
220
|
+
the same daemon share the write lock:
|
|
221
|
+
|
|
222
|
+
- Concurrent read requests from multiple MCP clients
|
|
223
|
+
are served in parallel.
|
|
224
|
+
- Concurrent write requests from multiple MCP clients
|
|
225
|
+
are serialized through the lock one at a time.
|
|
226
|
+
|
|
227
|
+
There is no per-connection or per-client lock; the
|
|
228
|
+
lock is global to the daemon process.
|
|
229
|
+
|
|
230
|
+
### Direct File Access
|
|
231
|
+
|
|
232
|
+
Accessing or modifying `.kbdb` files directly -- via
|
|
233
|
+
text editor, shell commands, or any process other than
|
|
234
|
+
the daemon -- is not supported. Direct writes bypass
|
|
235
|
+
the single-writer lock and the atomic write pattern,
|
|
236
|
+
and may corrupt the database. All mutations must go
|
|
237
|
+
through the daemon's IPC API.
|
|
238
|
+
|
|
239
|
+
## Design Constraints
|
|
240
|
+
|
|
241
|
+
- **Per-daemon locking, not per-file** -- The lock
|
|
242
|
+
covers all writes to a database context, not writes
|
|
243
|
+
to individual files. This means writes to unrelated
|
|
244
|
+
sections still serialize behind the same lock. The
|
|
245
|
+
simplicity of a single lock outweighs the throughput
|
|
246
|
+
cost at current scale. If per-section parallelism
|
|
247
|
+
becomes necessary, this constraint is the place to
|
|
248
|
+
revisit.
|
|
249
|
+
- **Single-machine only** -- The locking model
|
|
250
|
+
relies on OS-level file locks and process identity
|
|
251
|
+
on a single machine. It provides no guarantees across
|
|
252
|
+
network filesystems or multiple machines. Cross-machine
|
|
253
|
+
scenarios require an external sync mechanism (see
|
|
254
|
+
[Sync](sync.md) when available).
|
|
255
|
+
- **Lock implemented in TypeScript** -- The write lock
|
|
256
|
+
is managed by the TypeScript worker daemon layer, not
|
|
257
|
+
by any WASM module. WASM modules have no knowledge of
|
|
258
|
+
concurrent callers; they process one call at a time
|
|
259
|
+
through the host.
|