@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
existsSync,
|
|
3
3
|
readFileSync,
|
|
4
|
+
readdirSync,
|
|
4
5
|
accessSync,
|
|
5
6
|
writeFileSync,
|
|
6
7
|
unlinkSync,
|
|
@@ -38,6 +39,7 @@ import {
|
|
|
38
39
|
decodeKeyValueText,
|
|
39
40
|
decodeRemoveFlag,
|
|
40
41
|
decodeRecallResult,
|
|
42
|
+
decodeAddSectionResult,
|
|
41
43
|
} from '../../wasm-codec/index.ts';
|
|
42
44
|
|
|
43
45
|
import type { AddSectionInput } from '../../wasm-codec/index.ts';
|
|
@@ -89,6 +91,8 @@ const WASM_METHOD_MAP: Readonly<Partial<Record<string, string>>> = {
|
|
|
89
91
|
listDocumentsByType: 'worker_list_docs_by_type',
|
|
90
92
|
list_docs_by_type: 'worker_list_docs_by_type',
|
|
91
93
|
recall: 'worker_recall',
|
|
94
|
+
export: 'worker_export',
|
|
95
|
+
exportDb: 'worker_export',
|
|
92
96
|
};
|
|
93
97
|
|
|
94
98
|
/** Config method name prefix. */
|
|
@@ -155,6 +159,18 @@ export class WorkerDaemon {
|
|
|
155
159
|
private _server: Server | null = null;
|
|
156
160
|
private readonly _wasmDir: string;
|
|
157
161
|
|
|
162
|
+
/** Queue of waiters for the single-writer lock. */
|
|
163
|
+
private _writeQueue: { resolve: () => void }[] = [];
|
|
164
|
+
|
|
165
|
+
/** Whether the write lock is currently held. */
|
|
166
|
+
private _writeLocked = false;
|
|
167
|
+
|
|
168
|
+
/** Whether the startup integrity check passed. */
|
|
169
|
+
private _integrityOk = true;
|
|
170
|
+
|
|
171
|
+
/** Integrity errors found at startup, if any. */
|
|
172
|
+
private _integrityErrors: string[] = [];
|
|
173
|
+
|
|
158
174
|
/**
|
|
159
175
|
* @param ctx - context ID (16-hex characters), the first 16 of
|
|
160
176
|
* the SHA-256 hash of `targetDir`
|
|
@@ -229,6 +245,7 @@ export class WorkerDaemon {
|
|
|
229
245
|
this._wasmModules = wasmModules;
|
|
230
246
|
|
|
231
247
|
this.initWorkerContext();
|
|
248
|
+
this.runStartupIntegrityCheck();
|
|
232
249
|
|
|
233
250
|
const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);
|
|
234
251
|
writeFileSync(pidPath, process.pid.toString());
|
|
@@ -470,7 +487,11 @@ export class WorkerDaemon {
|
|
|
470
487
|
params: Record<string, unknown>,
|
|
471
488
|
): unknown {
|
|
472
489
|
if (method === 'status') {
|
|
473
|
-
return
|
|
490
|
+
return {
|
|
491
|
+
status: this._connectionCount > 0 ? 'busy' : 'idle',
|
|
492
|
+
integrityOk: this._integrityOk,
|
|
493
|
+
integrityErrors: this._integrityErrors,
|
|
494
|
+
};
|
|
474
495
|
}
|
|
475
496
|
|
|
476
497
|
if (method === 'idle_at') {
|
|
@@ -493,71 +514,36 @@ export class WorkerDaemon {
|
|
|
493
514
|
throw new IpcError(-32601, `Method not found: ${method}`);
|
|
494
515
|
}
|
|
495
516
|
|
|
496
|
-
private dispatchWasm(
|
|
517
|
+
private async dispatchWasm(
|
|
497
518
|
method: string,
|
|
498
519
|
wasmExport: string,
|
|
499
520
|
params: Record<string, unknown>,
|
|
500
|
-
): unknown {
|
|
521
|
+
): Promise<unknown> {
|
|
522
|
+
// Read-only operations — no write lock required.
|
|
501
523
|
if (method === 'search' || method === 'query') {
|
|
502
524
|
return this.handleSearch(params);
|
|
503
525
|
}
|
|
504
|
-
if (method === 'addSection' || method === 'add_section') {
|
|
505
|
-
return this.handleAddSection(params);
|
|
506
|
-
}
|
|
507
|
-
if (method === 'updateSection' || method === 'update_section') {
|
|
508
|
-
return this.handleUpdateSection(params);
|
|
509
|
-
}
|
|
510
|
-
if (method === 'removeSection' || method === 'remove_section') {
|
|
511
|
-
return this.handleRemoveSection(params);
|
|
512
|
-
}
|
|
513
526
|
if (method === 'readSections' || method === 'read_sections') {
|
|
514
527
|
return this.handleReadSections(params);
|
|
515
528
|
}
|
|
516
529
|
if (method === 'retrieveDocument' || method === 'retrieve_doc') {
|
|
517
530
|
return this.handleRetrieveDoc(params);
|
|
518
531
|
}
|
|
519
|
-
if (method === 'groupSections' || method === 'group_sections') {
|
|
520
|
-
return this.handleGroupSections(params);
|
|
521
|
-
}
|
|
522
|
-
if (method === 'removeGrouping' || method === 'remove_grouping') {
|
|
523
|
-
return this.handleRemoveGrouping(params);
|
|
524
|
-
}
|
|
525
532
|
if (method === 'content' || method === 'compose') {
|
|
526
533
|
return this.handleCompose(params);
|
|
527
534
|
}
|
|
528
535
|
if (method === 'integrityCheck' || method === 'integrity_check') {
|
|
529
536
|
return this.handleIntegrityCheck();
|
|
530
537
|
}
|
|
531
|
-
if (method === 'gc') {
|
|
532
|
-
return this.handleGc();
|
|
533
|
-
}
|
|
534
|
-
if (method === 'rebuildIndexes' || method === 'rebuild_indexes') {
|
|
535
|
-
return this.handleRebuild();
|
|
536
|
-
}
|
|
537
538
|
if (method === 'dbStatus' || method === 'db_status') {
|
|
538
539
|
return this.handleDbStatus();
|
|
539
540
|
}
|
|
540
|
-
if (method === 'initDirectory' || method === 'init_directory') {
|
|
541
|
-
return this.handleInitDirectory(params);
|
|
542
|
-
}
|
|
543
|
-
if (method === 'invalidate') {
|
|
544
|
-
return this.handleInvalidate(params);
|
|
545
|
-
}
|
|
546
|
-
if (method === 'invalidateAll' || method === 'invalidate_all') {
|
|
547
|
-
return this.handleInvalidateAll();
|
|
548
|
-
}
|
|
549
541
|
if (method === 'get_result_status') {
|
|
550
542
|
return this.handleResultStatus(params);
|
|
551
543
|
}
|
|
552
544
|
if (method === 'get_result') {
|
|
553
545
|
return this.handleGetResult(params);
|
|
554
546
|
}
|
|
555
|
-
if (method === 'migrateDatabase') {
|
|
556
|
-
throw new IpcError(
|
|
557
|
-
-32601,
|
|
558
|
-
'migrateDatabase is not yet supported',
|
|
559
|
-
);
|
|
560
|
-
}
|
|
561
547
|
if (method === 'listByType' || method === 'list_by_type') {
|
|
562
548
|
return this.handleListByType(params);
|
|
563
549
|
}
|
|
@@ -570,7 +556,74 @@ export class WorkerDaemon {
|
|
|
570
556
|
if (method === 'recall') {
|
|
571
557
|
return this.handleRecall(params);
|
|
572
558
|
}
|
|
573
|
-
|
|
559
|
+
if (method === 'export' || method === 'exportDb') {
|
|
560
|
+
return this.handleExport(params);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Write operations — serialised through the single-writer lock.
|
|
564
|
+
await this.acquireWriteLock();
|
|
565
|
+
try {
|
|
566
|
+
if (method === 'invalidate') {
|
|
567
|
+
return this.handleInvalidate(params);
|
|
568
|
+
}
|
|
569
|
+
if (
|
|
570
|
+
method === 'invalidateAll' ||
|
|
571
|
+
method === 'invalidate_all'
|
|
572
|
+
) {
|
|
573
|
+
return this.handleInvalidateAll();
|
|
574
|
+
}
|
|
575
|
+
if (method === 'addSection' || method === 'add_section') {
|
|
576
|
+
return this.handleAddSection(params);
|
|
577
|
+
}
|
|
578
|
+
if (
|
|
579
|
+
method === 'updateSection' ||
|
|
580
|
+
method === 'update_section'
|
|
581
|
+
) {
|
|
582
|
+
return this.handleUpdateSection(params);
|
|
583
|
+
}
|
|
584
|
+
if (
|
|
585
|
+
method === 'removeSection' ||
|
|
586
|
+
method === 'remove_section'
|
|
587
|
+
) {
|
|
588
|
+
return this.handleRemoveSection(params);
|
|
589
|
+
}
|
|
590
|
+
if (
|
|
591
|
+
method === 'groupSections' ||
|
|
592
|
+
method === 'group_sections'
|
|
593
|
+
) {
|
|
594
|
+
return this.handleGroupSections(params);
|
|
595
|
+
}
|
|
596
|
+
if (
|
|
597
|
+
method === 'removeGrouping' ||
|
|
598
|
+
method === 'remove_grouping'
|
|
599
|
+
) {
|
|
600
|
+
return this.handleRemoveGrouping(params);
|
|
601
|
+
}
|
|
602
|
+
if (method === 'gc') {
|
|
603
|
+
return this.handleGc();
|
|
604
|
+
}
|
|
605
|
+
if (
|
|
606
|
+
method === 'rebuildIndexes' ||
|
|
607
|
+
method === 'rebuild_indexes'
|
|
608
|
+
) {
|
|
609
|
+
return this.handleRebuild();
|
|
610
|
+
}
|
|
611
|
+
if (
|
|
612
|
+
method === 'initDirectory' ||
|
|
613
|
+
method === 'init_directory'
|
|
614
|
+
) {
|
|
615
|
+
return this.handleInitDirectory(params);
|
|
616
|
+
}
|
|
617
|
+
if (method === 'migrateDatabase') {
|
|
618
|
+
throw new IpcError(
|
|
619
|
+
-32601,
|
|
620
|
+
'migrateDatabase is not yet supported',
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
return this.invokeWasmRaw(wasmExport, new Uint8Array(0));
|
|
624
|
+
} finally {
|
|
625
|
+
this.releaseWriteLock();
|
|
626
|
+
}
|
|
574
627
|
}
|
|
575
628
|
|
|
576
629
|
// -- Search/query (token-based async) --
|
|
@@ -643,6 +696,9 @@ export class WorkerDaemon {
|
|
|
643
696
|
: 'text';
|
|
644
697
|
const typeName =
|
|
645
698
|
sectionType !== semanticType ? sectionType : null;
|
|
699
|
+
const tags = Array.isArray(params['tags'])
|
|
700
|
+
? (params['tags'] as string[])
|
|
701
|
+
: [];
|
|
646
702
|
const input: AddSectionInput = {
|
|
647
703
|
sectionType: semanticType,
|
|
648
704
|
mimeType: params['mimeType'] as string | undefined,
|
|
@@ -651,11 +707,32 @@ export class WorkerDaemon {
|
|
|
651
707
|
description: (params['description'] as string | null) ?? null,
|
|
652
708
|
docid: (params['docid'] as string | null) ?? null,
|
|
653
709
|
typeName,
|
|
710
|
+
sourcePath:
|
|
711
|
+
typeof params['sourcePath'] === 'string'
|
|
712
|
+
? params['sourcePath']
|
|
713
|
+
: undefined,
|
|
714
|
+
sourceMtime:
|
|
715
|
+
typeof params['sourceMtime'] === 'string'
|
|
716
|
+
? params['sourceMtime']
|
|
717
|
+
: undefined,
|
|
718
|
+
tags,
|
|
719
|
+
replace: params['replace'] === true,
|
|
654
720
|
};
|
|
655
721
|
const encoded = encodeAddSectionParams(input);
|
|
656
722
|
const bytes = this.callWasmSync('worker_add_section', encoded);
|
|
657
|
-
const
|
|
658
|
-
|
|
723
|
+
const decoded = decodeAddSectionResult(bytes);
|
|
724
|
+
const nearDups =
|
|
725
|
+
decoded.nearDuplicates.length > 0
|
|
726
|
+
? decoded.nearDuplicates
|
|
727
|
+
: this.scanNearDuplicates(input.content, decoded.kbid);
|
|
728
|
+
return {
|
|
729
|
+
kbid: decoded.kbid,
|
|
730
|
+
indexed_terms_count: decoded.indexedTermsCount,
|
|
731
|
+
elapsed_ms: decoded.elapsedMs,
|
|
732
|
+
superseded: decoded.superseded,
|
|
733
|
+
warnings: decoded.warnings,
|
|
734
|
+
near_duplicates: nearDups,
|
|
735
|
+
};
|
|
659
736
|
}
|
|
660
737
|
|
|
661
738
|
private handleUpdateSection(
|
|
@@ -759,7 +836,18 @@ export class WorkerDaemon {
|
|
|
759
836
|
private handleInvalidate(params: Record<string, unknown>): unknown {
|
|
760
837
|
const kbid = (params['kbid'] as string | undefined) ?? '';
|
|
761
838
|
const encoded = new TextEncoder().encode(kbid);
|
|
762
|
-
this.
|
|
839
|
+
const fn = this.getExport('worker_invalidate');
|
|
840
|
+
const ptr = this.wasmAlloc(encoded.length);
|
|
841
|
+
this.wasmWrite(ptr, encoded);
|
|
842
|
+
const rc = fn(ptr, encoded.length) as number;
|
|
843
|
+
this.wasmFree(ptr, encoded.length);
|
|
844
|
+
if (rc === -1) {
|
|
845
|
+
const errBytes = this.readReturnSlot();
|
|
846
|
+
throw new IpcError(
|
|
847
|
+
-32000,
|
|
848
|
+
new TextDecoder().decode(errBytes) || 'invalidate failed',
|
|
849
|
+
);
|
|
850
|
+
}
|
|
763
851
|
return { ok: true };
|
|
764
852
|
}
|
|
765
853
|
|
|
@@ -819,15 +907,161 @@ export class WorkerDaemon {
|
|
|
819
907
|
}
|
|
820
908
|
|
|
821
909
|
private handleGc(): unknown {
|
|
910
|
+
const start = Date.now();
|
|
822
911
|
this.callWasmZeroArg('worker_garbage_collect');
|
|
823
912
|
const bytes = this.readReturnSlot();
|
|
824
913
|
const text = new TextDecoder().decode(bytes);
|
|
825
|
-
|
|
914
|
+
const kv = decodeKeyValueText(text);
|
|
915
|
+
const removedCount = Number(kv['removed'] ?? 0);
|
|
916
|
+
const staleSources = Number(kv['stale_sources'] ?? 0);
|
|
917
|
+
return {
|
|
918
|
+
removed_sections: removedCount,
|
|
919
|
+
removed_bytes: 0,
|
|
920
|
+
elapsed_ms: Date.now() - start,
|
|
921
|
+
stale_sources: staleSources,
|
|
922
|
+
};
|
|
826
923
|
}
|
|
827
924
|
|
|
828
925
|
private handleRebuild(): unknown {
|
|
829
|
-
this.
|
|
830
|
-
|
|
926
|
+
const fn = this.getExport('worker_rebuild_indexes');
|
|
927
|
+
const rc = fn() as number;
|
|
928
|
+
if (rc === -1) {
|
|
929
|
+
const errBytes = this.readReturnSlot();
|
|
930
|
+
const errMsg = new TextDecoder().decode(errBytes);
|
|
931
|
+
throw new IpcError(-32000, errMsg || 'rebuild failed');
|
|
932
|
+
}
|
|
933
|
+
const resultBytes = this.readReturnSlot();
|
|
934
|
+
const reindexed =
|
|
935
|
+
resultBytes.length >= 4
|
|
936
|
+
? new DataView(
|
|
937
|
+
resultBytes.buffer,
|
|
938
|
+
resultBytes.byteOffset,
|
|
939
|
+
resultBytes.byteLength,
|
|
940
|
+
).getUint32(0, true)
|
|
941
|
+
: 0;
|
|
942
|
+
return { ok: true, sections_reindexed: reindexed };
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// -- Export (read operation, no lock required) --
|
|
946
|
+
|
|
947
|
+
private handleExport(params: Record<string, unknown>): unknown {
|
|
948
|
+
const targetPath =
|
|
949
|
+
(params['targetPath'] as string | undefined) ??
|
|
950
|
+
(params['path'] as string | undefined) ??
|
|
951
|
+
'./kbdb-export/';
|
|
952
|
+
const encoded = new TextEncoder().encode(targetPath);
|
|
953
|
+
const start = Date.now();
|
|
954
|
+
const bytes = this.callWasmSync('worker_export', encoded);
|
|
955
|
+
const elapsed = Date.now() - start;
|
|
956
|
+
const text = new TextDecoder().decode(bytes);
|
|
957
|
+
const kv = decodeKeyValueText(text);
|
|
958
|
+
return {
|
|
959
|
+
path: kv['path'] ?? targetPath,
|
|
960
|
+
sections_exported: Number(kv['sections_exported'] ?? 0),
|
|
961
|
+
documents_exported: Number(kv['documents_exported'] ?? 0),
|
|
962
|
+
elapsed_ms: elapsed,
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// -- Near-duplicate detection --
|
|
967
|
+
|
|
968
|
+
private scanNearDuplicates(
|
|
969
|
+
content: string,
|
|
970
|
+
newKbid: string,
|
|
971
|
+
): { kbid: string; similarity: number }[] {
|
|
972
|
+
const newTerms = this.extractTermSet(content);
|
|
973
|
+
if (newTerms.size === 0) return [];
|
|
974
|
+
|
|
975
|
+
const sectionsDir = join(this.targetDir, 'sections');
|
|
976
|
+
let shards: string[];
|
|
977
|
+
try {
|
|
978
|
+
shards = readdirSync(sectionsDir);
|
|
979
|
+
} catch {
|
|
980
|
+
return [];
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
const results: { kbid: string; similarity: number }[] = [];
|
|
984
|
+
for (const shard of shards) {
|
|
985
|
+
let files: string[];
|
|
986
|
+
try {
|
|
987
|
+
files = readdirSync(join(sectionsDir, shard));
|
|
988
|
+
} catch {
|
|
989
|
+
continue;
|
|
990
|
+
}
|
|
991
|
+
for (const file of files) {
|
|
992
|
+
if (!file.endsWith('.section')) continue;
|
|
993
|
+
const kbid = file.slice(0, -8);
|
|
994
|
+
if (kbid === newKbid) continue;
|
|
995
|
+
try {
|
|
996
|
+
const data = readFileSync(
|
|
997
|
+
join(sectionsDir, shard, file),
|
|
998
|
+
'utf-8',
|
|
999
|
+
);
|
|
1000
|
+
const sep = data.indexOf('\n---\n');
|
|
1001
|
+
const body = sep >= 0 ? data.slice(sep + 5) : data;
|
|
1002
|
+
const existing = this.extractTermSet(body);
|
|
1003
|
+
let intersection = 0;
|
|
1004
|
+
for (const t of newTerms) {
|
|
1005
|
+
if (existing.has(t)) intersection++;
|
|
1006
|
+
}
|
|
1007
|
+
const union =
|
|
1008
|
+
newTerms.size + existing.size - intersection;
|
|
1009
|
+
const sim = union > 0 ? intersection / union : 0;
|
|
1010
|
+
if (sim >= 0.85) {
|
|
1011
|
+
results.push({
|
|
1012
|
+
kbid,
|
|
1013
|
+
similarity: Math.round(sim * 100) / 100,
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
} catch {
|
|
1017
|
+
continue;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
return results;
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
private extractTermSet(text: string): Set<string> {
|
|
1025
|
+
return new Set(
|
|
1026
|
+
text
|
|
1027
|
+
.toLowerCase()
|
|
1028
|
+
.split(/\W+/)
|
|
1029
|
+
.filter((w) => w.length > 2),
|
|
1030
|
+
);
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// -- Single-writer lock --
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* Acquires the write lock.
|
|
1037
|
+
*
|
|
1038
|
+
* If the lock is free it is granted immediately. If it is held the
|
|
1039
|
+
* caller is queued and its promise resolves once the lock is
|
|
1040
|
+
* released by the current holder.
|
|
1041
|
+
*/
|
|
1042
|
+
private acquireWriteLock(): Promise<void> {
|
|
1043
|
+
if (!this._writeLocked) {
|
|
1044
|
+
this._writeLocked = true;
|
|
1045
|
+
return Promise.resolve();
|
|
1046
|
+
}
|
|
1047
|
+
return new Promise<void>((resolve) => {
|
|
1048
|
+
this._writeQueue.push({ resolve });
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
/**
|
|
1053
|
+
* Releases the write lock.
|
|
1054
|
+
*
|
|
1055
|
+
* If waiters are queued the next one is granted the lock
|
|
1056
|
+
* immediately. Otherwise the lock is marked free.
|
|
1057
|
+
*/
|
|
1058
|
+
private releaseWriteLock(): void {
|
|
1059
|
+
const next = this._writeQueue.shift();
|
|
1060
|
+
if (next !== undefined) {
|
|
1061
|
+
next.resolve();
|
|
1062
|
+
} else {
|
|
1063
|
+
this._writeLocked = false;
|
|
1064
|
+
}
|
|
831
1065
|
}
|
|
832
1066
|
|
|
833
1067
|
// -- WASM lifecycle --
|
|
@@ -837,6 +1071,41 @@ export class WorkerDaemon {
|
|
|
837
1071
|
this.callWasmSync('worker_init', pathBytes);
|
|
838
1072
|
}
|
|
839
1073
|
|
|
1074
|
+
/**
|
|
1075
|
+
* Runs a database integrity check immediately after context
|
|
1076
|
+
* initialisation.
|
|
1077
|
+
*
|
|
1078
|
+
* Stores the result in `_integrityOk` and `_integrityErrors`.
|
|
1079
|
+
* Logs a warning to stderr when issues are found so operators
|
|
1080
|
+
* are alerted without aborting the daemon.
|
|
1081
|
+
*/
|
|
1082
|
+
private runStartupIntegrityCheck(): void {
|
|
1083
|
+
try {
|
|
1084
|
+
this.callWasmZeroArg('worker_check_integrity');
|
|
1085
|
+
const bytes = this.readReturnSlot();
|
|
1086
|
+
const text = new TextDecoder().decode(bytes);
|
|
1087
|
+
const kv = decodeKeyValueText(text);
|
|
1088
|
+
this._integrityOk = kv['ok'] === 'true';
|
|
1089
|
+
if (!this._integrityOk) {
|
|
1090
|
+
this._integrityErrors = Object.entries(kv)
|
|
1091
|
+
.filter(([k]) => k !== 'ok')
|
|
1092
|
+
.map(([k, v]) => `${k}=${v}`);
|
|
1093
|
+
// eslint-disable-next-line no-console
|
|
1094
|
+
console.error(
|
|
1095
|
+
'[kbdb-worker] startup integrity check failed:',
|
|
1096
|
+
this._integrityErrors.join(', '),
|
|
1097
|
+
);
|
|
1098
|
+
}
|
|
1099
|
+
} catch {
|
|
1100
|
+
this._integrityOk = false;
|
|
1101
|
+
this._integrityErrors = ['integrity_check_failed'];
|
|
1102
|
+
// eslint-disable-next-line no-console
|
|
1103
|
+
console.error(
|
|
1104
|
+
'[kbdb-worker] startup integrity check threw an error',
|
|
1105
|
+
);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
|
|
840
1109
|
// -- WASM bridge primitives --
|
|
841
1110
|
|
|
842
1111
|
private getExport(name: string): WasmFn {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { DaemonConfig } from '../typings/daemon-config.interface.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Maps incoming IPC method names to `kb-worker.wasm` export names.
|
|
5
|
+
*
|
|
6
|
+
* Both camelCase and snake_case variants of each method are
|
|
7
|
+
* included so that clients may use either convention.
|
|
8
|
+
*/
|
|
9
|
+
export const WASM_METHOD_MAP: Readonly<
|
|
10
|
+
Partial<Record<string, string>>
|
|
11
|
+
> = {
|
|
12
|
+
search: 'worker_search',
|
|
13
|
+
addSection: 'worker_add_section',
|
|
14
|
+
add_section: 'worker_add_section',
|
|
15
|
+
updateSection: 'worker_update_section',
|
|
16
|
+
update_section: 'worker_update_section',
|
|
17
|
+
removeSection: 'worker_remove_section',
|
|
18
|
+
remove_section: 'worker_remove_section',
|
|
19
|
+
readSections: 'worker_read_sections',
|
|
20
|
+
read_sections: 'worker_read_sections',
|
|
21
|
+
groupSections: 'worker_group_sections',
|
|
22
|
+
group_sections: 'worker_group_sections',
|
|
23
|
+
removeGrouping: 'worker_remove_grouping',
|
|
24
|
+
remove_grouping: 'worker_remove_grouping',
|
|
25
|
+
retrieveDocument: 'worker_retrieve_doc',
|
|
26
|
+
retrieve_doc: 'worker_retrieve_doc',
|
|
27
|
+
content: 'worker_compose',
|
|
28
|
+
compose: 'worker_compose',
|
|
29
|
+
integrity_check: 'worker_check_integrity',
|
|
30
|
+
integrityCheck: 'worker_check_integrity',
|
|
31
|
+
gc: 'worker_garbage_collect',
|
|
32
|
+
rebuild_indexes: 'worker_rebuild_indexes',
|
|
33
|
+
rebuildIndexes: 'worker_rebuild_indexes',
|
|
34
|
+
init_directory: 'worker_init_directory',
|
|
35
|
+
initDirectory: 'worker_init_directory',
|
|
36
|
+
migrateDatabase: 'worker_migrate',
|
|
37
|
+
query: 'worker_query',
|
|
38
|
+
get_result_status: 'worker_result_status',
|
|
39
|
+
get_result: 'worker_get_result',
|
|
40
|
+
invalidate: 'worker_invalidate',
|
|
41
|
+
invalidate_all: 'worker_invalidate_all',
|
|
42
|
+
invalidateAll: 'worker_invalidate_all',
|
|
43
|
+
db_status: 'worker_status',
|
|
44
|
+
dbStatus: 'worker_status',
|
|
45
|
+
listByType: 'worker_list_by_type',
|
|
46
|
+
list_by_type: 'worker_list_by_type',
|
|
47
|
+
listDocumentsByType: 'worker_list_docs_by_type',
|
|
48
|
+
list_docs_by_type: 'worker_list_docs_by_type',
|
|
49
|
+
recall: 'worker_recall',
|
|
50
|
+
export: 'worker_export',
|
|
51
|
+
exportDb: 'worker_export',
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Prefix shared by all IPC config-accessor method names. */
|
|
55
|
+
export const CONFIG_PREFIX = 'config_';
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Maps config IPC key suffixes to `DaemonConfig` property names.
|
|
59
|
+
*
|
|
60
|
+
* A client sends `config_timeout_ms` to read `config.timeoutMs`.
|
|
61
|
+
*/
|
|
62
|
+
export const CONFIG_KEY_MAP: Readonly<
|
|
63
|
+
Partial<Record<string, keyof DaemonConfig>>
|
|
64
|
+
> = {
|
|
65
|
+
timeout_ms: 'timeoutMs',
|
|
66
|
+
item_ttl_ms: 'itemTtlMs',
|
|
67
|
+
item_limit: 'itemLimit',
|
|
68
|
+
index_limit: 'indexLimit',
|
|
69
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IpcResponse } from '../typings/ipc-handler.interface.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Builds a JSON-RPC 2.0 error response object.
|
|
5
|
+
*
|
|
6
|
+
* @param id - request identifier to echo back in the response
|
|
7
|
+
* @param code - JSON-RPC error code
|
|
8
|
+
* @param message - human-readable error description
|
|
9
|
+
*/
|
|
10
|
+
export function buildIpcErrorResponse(
|
|
11
|
+
id: number | string,
|
|
12
|
+
code: number,
|
|
13
|
+
message: string,
|
|
14
|
+
): IpcResponse {
|
|
15
|
+
return { jsonrpc: '2.0', id, error: { code, message } };
|
|
16
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { DB_FORMAT_VERSION } from '../constants/daemon-defaults.constant.ts';
|
|
4
|
+
import { parseCatalogVersion } from './parse-catalog-version.function.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reads `catalog.toml` in `targetDir` and validates its version
|
|
8
|
+
* against `DB_FORMAT_VERSION`.
|
|
9
|
+
*
|
|
10
|
+
* @param targetDir - absolute path to the `.kbdb` directory
|
|
11
|
+
* @throws {Error} when the catalog cannot be read, is missing a
|
|
12
|
+
* version, or the version is incompatible with the current engine
|
|
13
|
+
*/
|
|
14
|
+
export function checkCatalogVersion(targetDir: string): void {
|
|
15
|
+
const catalogPath = join(targetDir, 'catalog.toml');
|
|
16
|
+
let text: string;
|
|
17
|
+
try {
|
|
18
|
+
text = readFileSync(catalogPath, 'utf-8');
|
|
19
|
+
} catch {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`cannot read database directory: ${targetDir}` +
|
|
22
|
+
' -- permission denied',
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const version = parseCatalogVersion(text);
|
|
27
|
+
if (version === null) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
'database version 0 requires migration to version ' +
|
|
30
|
+
String(DB_FORMAT_VERSION) +
|
|
31
|
+
' -- run `kbdb --migrate` before starting the daemon',
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (version > DB_FORMAT_VERSION) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
'database version ' +
|
|
38
|
+
String(version) +
|
|
39
|
+
' is newer than kbdb version ' +
|
|
40
|
+
String(DB_FORMAT_VERSION) +
|
|
41
|
+
' -- upgrade kbdb to open this database',
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (version < DB_FORMAT_VERSION) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
'database version ' +
|
|
48
|
+
String(version) +
|
|
49
|
+
' requires migration to version ' +
|
|
50
|
+
String(DB_FORMAT_VERSION) +
|
|
51
|
+
' -- run `kbdb --migrate` before starting the daemon',
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync, accessSync, constants } from 'node:fs';
|
|
2
|
+
import { checkCatalogVersion } from './check-catalog-version.function.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Validates startup preconditions for the worker daemon.
|
|
6
|
+
*
|
|
7
|
+
* Checks that `targetDir` exists, is readable and writable, and
|
|
8
|
+
* that `catalog.toml` reports a compatible format version.
|
|
9
|
+
*
|
|
10
|
+
* @param targetDir - absolute path to the `.kbdb` directory
|
|
11
|
+
* @throws {Error} when any precondition fails
|
|
12
|
+
*/
|
|
13
|
+
export function checkPreconditions(targetDir: string): void {
|
|
14
|
+
if (!existsSync(targetDir)) {
|
|
15
|
+
throw new Error(`database directory not found: ${targetDir}`);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
accessSync(targetDir, constants.R_OK | constants.W_OK);
|
|
20
|
+
} catch {
|
|
21
|
+
throw new Error(
|
|
22
|
+
`cannot access database directory: ${targetDir}` +
|
|
23
|
+
' -- permission denied',
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
checkCatalogVersion(targetDir);
|
|
28
|
+
}
|