@dikolab/kbdb 0.3.2 → 0.4.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 +92 -90
- package/dist/chunk-BJXEVALU.mjs +337 -0
- package/dist/chunk-BJXEVALU.mjs.map +7 -0
- package/dist/cli.cjs +1398 -378
- package/dist/cli.cjs.map +4 -4
- package/dist/cli.d.ts +9 -0
- package/dist/cli.mjs +1138 -342
- package/dist/cli.mjs.map +4 -4
- package/dist/kbdb-worker.cjs +1115 -135
- package/dist/kbdb-worker.cjs.map +4 -4
- package/dist/mod.cjs +351 -69
- package/dist/mod.cjs.map +4 -4
- package/dist/mod.d.ts +23 -2
- package/dist/mod.mjs +349 -68
- package/dist/mod.mjs.map +4 -4
- package/dist/src/shared/cli/functions/dispatch-command.function.d.ts +2 -1
- package/dist/src/shared/cli/functions/find-db.function.d.ts +7 -8
- package/dist/src/shared/cli/functions/handle-mcp.function.d.ts +1 -1
- package/dist/src/shared/cli/functions/parse-args.function.d.ts +4 -3
- package/dist/src/shared/cli/functions/resolve-kbid-prefix.function.d.ts +27 -0
- package/dist/src/shared/cli/functions/resolve-raw-db-path.function.d.ts +10 -0
- package/dist/src/shared/cli/functions/run-cli.function.d.ts +3 -1
- package/dist/src/shared/cli/functions/run-content.function.d.ts +8 -3
- package/dist/src/shared/cli/functions/run-import.function.d.ts +27 -0
- package/dist/src/shared/cli/functions/run-recall.function.d.ts +10 -4
- package/dist/src/shared/cli/functions/run-search.function.d.ts +7 -0
- package/dist/src/shared/cli/functions/run-unlearn.function.d.ts +9 -4
- package/dist/src/shared/cli/functions/run-worker-restart.function.d.ts +11 -0
- package/dist/src/shared/cli/functions/run-worker-stop.function.d.ts +11 -0
- package/dist/src/shared/cli/index.d.ts +2 -0
- package/dist/src/shared/cli/typings/cli-deps.interface.d.ts +4 -1
- package/dist/src/shared/cli/typings/cli-options.interface.d.ts +22 -0
- package/dist/src/shared/cli/typings/dispatch-client.type.d.ts +2 -1
- package/dist/src/shared/cli/typings/search-display.model.d.ts +6 -0
- package/dist/src/shared/embedding/classes/api-embedding-provider.class.d.ts +33 -0
- package/dist/src/shared/embedding/classes/onnx-embedding-provider.class.d.ts +33 -0
- package/dist/src/shared/embedding/classes/tfidf-embedding-provider.class.d.ts +28 -0
- package/dist/src/shared/embedding/constants/tfidf-defaults.constant.d.ts +4 -0
- package/dist/src/shared/embedding/functions/append-vector-entry.function.d.ts +14 -0
- package/dist/src/shared/embedding/functions/create-embedding-provider.function.d.ts +15 -0
- package/dist/src/shared/embedding/functions/detect-stale-vectors.function.d.ts +16 -0
- package/dist/src/shared/embedding/functions/parse-api-embedding-response.function.d.ts +11 -0
- package/dist/src/shared/embedding/functions/rebuild-vectors.function.d.ts +15 -0
- package/dist/src/shared/embedding/functions/scan-semantic-contradictions.function.d.ts +13 -0
- package/dist/src/shared/embedding/index.d.ts +9 -0
- package/dist/src/shared/embedding/typings/semantic-contradiction.model.d.ts +21 -0
- package/dist/src/shared/embedding/typings/stale-vectors-report.model.d.ts +16 -0
- package/dist/src/shared/log/constants/log-colors.constant.d.ts +5 -0
- package/dist/src/shared/log/constants/log-defaults.constant.d.ts +3 -0
- package/dist/src/shared/log/constants/log-icons.constant.d.ts +3 -0
- package/dist/src/shared/log/functions/configure-log.function.d.ts +12 -0
- package/dist/src/shared/log/functions/log.function.d.ts +28 -0
- package/dist/src/shared/log/functions/parse-log-level.function.d.ts +10 -0
- package/dist/src/shared/log/functions/resolve-log-level.function.d.ts +12 -0
- package/dist/src/shared/log/functions/write-stderr.function.d.ts +10 -0
- package/dist/src/shared/log/index.d.ts +10 -0
- package/dist/src/shared/log/typings/log-config.interface.d.ts +7 -0
- package/dist/src/shared/log/typings/log-level.type.d.ts +7 -0
- package/dist/src/shared/log/typings/log-output.interface.d.ts +4 -0
- package/dist/src/shared/mcp/classes/mcp-server.class.d.ts +22 -2
- package/dist/src/shared/mcp/functions/create-mcp-server.function.d.ts +6 -1
- package/dist/src/shared/mcp/functions/has-sampling-capability.function.d.ts +8 -0
- package/dist/src/shared/mcp/functions/run-auto-capture.function.d.ts +26 -0
- package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +2 -0
- package/dist/src/shared/mcp/typings/mcp-integrity-check-result.model.d.ts +24 -0
- package/dist/src/shared/mcp/typings/mcp-worker-client.interface.d.ts +3 -1
- package/dist/src/shared/version/constants/version.constant.d.ts +1 -1
- package/dist/src/shared/wasm-codec/typings/paged-search-result.model.d.ts +2 -0
- package/dist/src/shared/worker-client/classes/worker-client.class.d.ts +38 -1
- package/dist/src/shared/worker-client/constants/request-timeout.constant.d.ts +2 -0
- package/dist/src/shared/worker-client/constants/retry-defaults.constant.d.ts +2 -0
- package/dist/src/shared/worker-client/functions/get-or-create-client.function.d.ts +20 -0
- package/dist/src/shared/worker-client/functions/retry-on-timeout.function.d.ts +18 -0
- package/dist/src/shared/worker-client/index.d.ts +4 -1
- package/dist/src/shared/worker-client/typings/import-result.model.d.ts +16 -0
- package/dist/src/shared/worker-client/typings/integrity-check-result.model.d.ts +24 -0
- package/dist/src/shared/worker-client/typings/search-params.model.d.ts +4 -0
- package/dist/src/shared/worker-client/typings/search-result.model.d.ts +6 -0
- package/dist/src/shared/worker-client/typings/worker-client-options.interface.d.ts +7 -0
- package/dist/src/shared/worker-daemon/classes/worker-daemon.class.d.ts +6 -0
- package/dist/src/shared/worker-daemon/functions/create-ipc-server.function.d.ts +11 -11
- package/dist/src/shared/worker-daemon/functions/embed-after-learn.function.d.ts +13 -0
- package/dist/src/shared/worker-daemon/functions/handle-hybrid-search.function.d.ts +44 -0
- package/dist/src/shared/worker-daemon/functions/handle-import.function.d.ts +14 -0
- package/dist/src/shared/worker-daemon/functions/handle-read-ops.function.d.ts +7 -1
- package/dist/src/shared/worker-daemon/functions/handle-write-ops.function.d.ts +9 -4
- package/dist/src/shared/worker-daemon/functions/run-worker.function.d.ts +6 -1
- package/dist/src/shared/worker-daemon/typings/handler-context.interface.d.ts +3 -0
- package/dist/src/shared/worker-daemon/typings/wasm-modules.interface.d.ts +5 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding.d.ts +55 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding.js +156 -0
- package/{src/wasm/query-parser/kbdb_query_parser_bg.wasm → dist/wasm/default-embedding/kbdb_default_embedding_bg.wasm} +0 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding_bg.wasm.d.ts +12 -0
- package/dist/wasm/default-embedding/package.json +13 -0
- package/dist/wasm/fs-database/kbdb_fs_database.d.ts +16 -85
- package/dist/wasm/fs-database/kbdb_fs_database.js +16 -85
- package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration.d.ts +38 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration.js +130 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration_bg.wasm +0 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration_bg.wasm.d.ts +9 -0
- package/dist/wasm/fs-migration/package.json +13 -0
- package/dist/wasm/kb-worker/kbdb_worker.d.ts +20 -115
- package/dist/wasm/kb-worker/kbdb_worker.js +20 -115
- package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/dist/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
- package/dist/worker.d.ts +8 -0
- package/dist/worker.mjs +899 -143
- package/dist/worker.mjs.map +4 -4
- package/docs/details/README.md +4 -0
- package/docs/details/agent-tooling.md +132 -0
- package/docs/details/cli.md +91 -18
- package/docs/details/knowledge-base.md +180 -0
- package/docs/details/library-api.md +42 -2
- package/docs/details/mcp-server.md +53 -7
- package/docs/details/search-and-ranking.md +16 -11
- package/docs/goals/cli.md +142 -37
- package/docs/goals/content-parser.md +1 -1
- package/docs/goals/hybrid-search.md +71 -42
- package/docs/goals/mcp.md +24 -19
- package/docs/goals/overview.md +1 -1
- package/docs/goals/query-parser.md +8 -0
- package/docs/goals/semantic-dedup.md +7 -3
- package/docs/goals/worker-client.md +62 -1
- package/docs/goals/worker-daemon.md +83 -30
- package/docs/modules/overview.md +43 -22
- package/docs/modules/rust/embedding/module.md +91 -0
- package/docs/modules/rust/overview.md +56 -21
- package/docs/modules/rust/query-parser/functions/module.md +7 -5
- package/docs/modules/rust/query-parser/functions/pipeline.md +6 -138
- package/docs/modules/rust/query-parser/module.md +16 -22
- package/docs/modules/rust/query-parser/types/module.md +5 -4
- package/docs/modules/rust/query-parser/types/token.md +5 -1
- package/docs/modules/rust/shared/content-parser/functions.md +1 -1
- package/docs/modules/rust/shared/memory/module.md +1 -1
- package/docs/modules/rust/shared/module.md +33 -5
- package/docs/modules/rust/shared/pipeline/functions.md +141 -0
- package/docs/modules/rust/shared/pipeline/module.md +62 -0
- package/docs/modules/rust/shared/pipeline/types.md +43 -0
- package/docs/modules/rust/shared/section/module.md +1 -1
- package/docs/modules/rust/shared/section/types.md +1 -1
- package/docs/modules/typescript/cli.md +5 -3
- package/docs/modules/typescript/kbdb-worker.md +20 -5
- package/docs/modules/typescript/overview.md +28 -6
- package/docs/modules/typescript/shared/cli/functions.md +131 -17
- package/docs/modules/typescript/shared/cli/module.md +33 -20
- package/docs/modules/typescript/shared/cli/typings.md +25 -0
- package/docs/modules/typescript/shared/embedding/functions.md +125 -19
- package/docs/modules/typescript/shared/embedding/module.md +10 -4
- package/docs/modules/typescript/shared/embedding/typings.md +7 -5
- package/docs/modules/typescript/shared/log/constants.md +82 -0
- package/docs/modules/typescript/shared/log/functions.md +131 -0
- package/docs/modules/typescript/shared/log/module.md +153 -0
- package/docs/modules/typescript/shared/log/typings.md +82 -0
- package/docs/modules/typescript/shared/mcp/module.md +1 -1
- package/docs/modules/typescript/shared/mcp/typings.md +8 -1
- package/docs/modules/typescript/shared/module.md +22 -6
- package/docs/modules/typescript/shared/worker-client/module.md +9 -1
- package/docs/modules/typescript/shared/worker-client/typings.md +3 -0
- package/docs/modules/typescript/shared/worker-daemon/functions.md +19 -6
- package/docs/modules/typescript/shared/worker-daemon/module.md +11 -5
- package/docs/modules/typescript/shared/worker-daemon/typings.md +13 -7
- package/docs/overview.md +1 -2
- package/docs/release-notes/0.4.0.md +80 -0
- package/docs/release-notes/0.4.1.md +149 -0
- package/docs/release-notes/README.md +1 -0
- package/mod.ts +33 -15
- package/package.json +12 -11
- package/dist/chunk-JG2UCKLI.mjs +0 -95
- package/dist/chunk-JG2UCKLI.mjs.map +0 -7
- package/src/cli.ts +0 -71
- package/src/shared/auto-capture/classes/auto-capture-controller.class.ts +0 -62
- package/src/shared/auto-capture/constants/auto-capture-defaults.constant.ts +0 -15
- package/src/shared/auto-capture/functions/build-capture-prompt.function.ts +0 -27
- package/src/shared/auto-capture/functions/evaluate-trigger.function.ts +0 -50
- package/src/shared/auto-capture/index.ts +0 -7
- package/src/shared/auto-capture/typings/auto-capture-config.interface.ts +0 -13
- package/src/shared/auto-capture/typings/auto-capture-state.interface.ts +0 -13
- package/src/shared/auto-capture/typings/auto-capture-trigger.interface.ts +0 -7
- package/src/shared/cli/constants/defaults.constant.ts +0 -19
- package/src/shared/cli/constants/global-help.constant.ts +0 -73
- package/src/shared/cli/constants/help-text.constant.ts +0 -4
- package/src/shared/cli/constants/leaf-help.constant.ts +0 -219
- package/src/shared/cli/constants/memory-protocol-body.constant.ts +0 -39
- package/src/shared/cli/constants/query-guidance-body.constant.ts +0 -37
- package/src/shared/cli/constants/subcommand-help.constant.ts +0 -195
- package/src/shared/cli/functions/collect-files.function.ts +0 -55
- package/src/shared/cli/functions/compute-section-kbid.function.ts +0 -49
- package/src/shared/cli/functions/dispatch-command.function.ts +0 -390
- package/src/shared/cli/functions/ensure-db.function.ts +0 -21
- package/src/shared/cli/functions/error-to-message.function.ts +0 -9
- package/src/shared/cli/functions/find-db.function.ts +0 -20
- package/src/shared/cli/functions/format-mcp-output.function.ts +0 -41
- package/src/shared/cli/functions/format-output.function.ts +0 -95
- package/src/shared/cli/functions/format-text-output.function.ts +0 -42
- package/src/shared/cli/functions/generate-group-help.function.ts +0 -41
- package/src/shared/cli/functions/generate-help.function.ts +0 -654
- package/src/shared/cli/functions/handle-data-command.function.ts +0 -67
- package/src/shared/cli/functions/handle-mcp.function.ts +0 -56
- package/src/shared/cli/functions/handle-migrate.function.ts +0 -64
- package/src/shared/cli/functions/hydrate-search-previews.function.ts +0 -29
- package/src/shared/cli/functions/install-default-skills.function.ts +0 -296
- package/src/shared/cli/functions/is-stdin-tty.function.ts +0 -12
- package/src/shared/cli/functions/parse-args.function.ts +0 -156
- package/src/shared/cli/functions/prompt-user.function.ts +0 -36
- package/src/shared/cli/functions/resolve-skill-names.function.ts +0 -43
- package/src/shared/cli/functions/run-agent-create.function.ts +0 -114
- package/src/shared/cli/functions/run-agent-delete.function.ts +0 -47
- package/src/shared/cli/functions/run-agent-get.function.ts +0 -166
- package/src/shared/cli/functions/run-agent-list.function.ts +0 -58
- package/src/shared/cli/functions/run-check.function.ts +0 -159
- package/src/shared/cli/functions/run-cli.function.ts +0 -299
- package/src/shared/cli/functions/run-content.function.ts +0 -47
- package/src/shared/cli/functions/run-db-init.function.ts +0 -44
- package/src/shared/cli/functions/run-db-migrate.function.ts +0 -40
- package/src/shared/cli/functions/run-export.function.ts +0 -40
- package/src/shared/cli/functions/run-gc.function.ts +0 -51
- package/src/shared/cli/functions/run-init.function.ts +0 -93
- package/src/shared/cli/functions/run-learn.function.ts +0 -223
- package/src/shared/cli/functions/run-migrate.function.ts +0 -85
- package/src/shared/cli/functions/run-rebuild.function.ts +0 -47
- package/src/shared/cli/functions/run-recall.function.ts +0 -66
- package/src/shared/cli/functions/run-search.function.ts +0 -133
- package/src/shared/cli/functions/run-skill-delete.function.ts +0 -47
- package/src/shared/cli/functions/run-skill-get.function.ts +0 -90
- package/src/shared/cli/functions/run-skill-learn.function.ts +0 -70
- package/src/shared/cli/functions/run-skill-list.function.ts +0 -74
- package/src/shared/cli/functions/run-status.function.ts +0 -29
- package/src/shared/cli/functions/run-unlearn.function.ts +0 -58
- package/src/shared/cli/functions/version-gate.function.ts +0 -44
- package/src/shared/cli/functions/wrap-command.function.ts +0 -34
- package/src/shared/cli/index.ts +0 -55
- package/src/shared/cli/typings/agent-create-client.interface.ts +0 -47
- package/src/shared/cli/typings/agent-get-client.interface.ts +0 -39
- package/src/shared/cli/typings/check-client.interface.ts +0 -66
- package/src/shared/cli/typings/cli-deps.interface.ts +0 -54
- package/src/shared/cli/typings/cli-options.interface.ts +0 -72
- package/src/shared/cli/typings/command-result.model.ts +0 -15
- package/src/shared/cli/typings/disconnectable-client.interface.ts +0 -29
- package/src/shared/cli/typings/dispatch-client.type.ts +0 -46
- package/src/shared/cli/typings/learn-client.interface.ts +0 -53
- package/src/shared/cli/typings/learn-io.interface.ts +0 -5
- package/src/shared/cli/typings/learn-result.model.ts +0 -27
- package/src/shared/cli/typings/search-client.interface.ts +0 -73
- package/src/shared/cli/typings/search-display.model.ts +0 -54
- package/src/shared/dir-resolver/functions/join-path.function.ts +0 -13
- package/src/shared/dir-resolver/functions/resolve-base-dir.function.ts +0 -25
- package/src/shared/dir-resolver/functions/resolve-wasm-dir.function.ts +0 -5
- package/src/shared/dir-resolver/functions/resolve-worker-script.function.ts +0 -13
- package/src/shared/dir-resolver/index.ts +0 -11
- package/src/shared/dir-resolver/typings/base-dir.interface.ts +0 -4
- package/src/shared/embedding/classes/null-embedding-provider.class.ts +0 -29
- package/src/shared/embedding/constants/near-duplicate-thresholds.constant.ts +0 -17
- package/src/shared/embedding/functions/build-vector-index.function.ts +0 -79
- package/src/shared/embedding/functions/cosine-similarity.function.ts +0 -31
- package/src/shared/embedding/functions/detect-near-duplicates.function.ts +0 -69
- package/src/shared/embedding/functions/jaccard-coefficient.function.ts +0 -26
- package/src/shared/embedding/functions/read-vector-index-meta.function.ts +0 -44
- package/src/shared/embedding/functions/rrf-fuse.function.ts +0 -33
- package/src/shared/embedding/functions/search-vectors.function.ts +0 -59
- package/src/shared/embedding/index.ts +0 -20
- package/src/shared/embedding/typings/embedding-config.interface.ts +0 -23
- package/src/shared/embedding/typings/embedding-provider.interface.ts +0 -25
- package/src/shared/embedding/typings/near-duplicate-candidate.model.ts +0 -25
- package/src/shared/embedding/typings/near-duplicate-result.model.ts +0 -26
- package/src/shared/embedding/typings/vector-index-entry.model.ts +0 -13
- package/src/shared/embedding/typings/vector-index-meta.model.ts +0 -14
- package/src/shared/embedding/typings/vector-search-result.model.ts +0 -8
- package/src/shared/hash/functions/compute-sha256.ts +0 -17
- package/src/shared/hash/index.ts +0 -1
- package/src/shared/mcp/classes/mcp-server.class.ts +0 -480
- package/src/shared/mcp/constants/mcp-error-codes.constant.ts +0 -30
- package/src/shared/mcp/constants/tool-agent-create.constant.ts +0 -39
- package/src/shared/mcp/constants/tool-agent-delete.constant.ts +0 -26
- package/src/shared/mcp/constants/tool-agent-get.constant.ts +0 -24
- package/src/shared/mcp/constants/tool-agent-list.constant.ts +0 -18
- package/src/shared/mcp/constants/tool-auto-capture-review.constant.ts +0 -32
- package/src/shared/mcp/constants/tool-check.constant.ts +0 -21
- package/src/shared/mcp/constants/tool-content.constant.ts +0 -29
- package/src/shared/mcp/constants/tool-export.constant.ts +0 -27
- package/src/shared/mcp/constants/tool-gc.constant.ts +0 -21
- package/src/shared/mcp/constants/tool-learn.constant.ts +0 -58
- package/src/shared/mcp/constants/tool-rebuild.constant.ts +0 -21
- package/src/shared/mcp/constants/tool-recall.constant.ts +0 -36
- package/src/shared/mcp/constants/tool-retrieve.constant.ts +0 -31
- package/src/shared/mcp/constants/tool-search.constant.ts +0 -51
- package/src/shared/mcp/constants/tool-skill-delete.constant.ts +0 -24
- package/src/shared/mcp/constants/tool-skill-get.constant.ts +0 -27
- package/src/shared/mcp/constants/tool-skill-learn.constant.ts +0 -37
- package/src/shared/mcp/constants/tool-skill-list.constant.ts +0 -18
- package/src/shared/mcp/constants/tool-status.constant.ts +0 -20
- package/src/shared/mcp/constants/tool-unlearn.constant.ts +0 -25
- package/src/shared/mcp/functions/as-boolean-or-undefined.function.ts +0 -11
- package/src/shared/mcp/functions/as-string-array-or-undefined.function.ts +0 -17
- package/src/shared/mcp/functions/as-string-array.function.ts +0 -15
- package/src/shared/mcp/functions/as-string.function.ts +0 -10
- package/src/shared/mcp/functions/build-skills-text.function.ts +0 -43
- package/src/shared/mcp/functions/create-mcp-server.function.ts +0 -14
- package/src/shared/mcp/functions/create-prompt-definitions.function.ts +0 -102
- package/src/shared/mcp/functions/create-resource-templates.function.ts +0 -23
- package/src/shared/mcp/functions/create-tool-definitions.function.ts +0 -530
- package/src/shared/mcp/functions/extract-skill-arguments.function.ts +0 -27
- package/src/shared/mcp/functions/handle-agent-create.function.ts +0 -116
- package/src/shared/mcp/functions/handle-agent-delete.function.ts +0 -50
- package/src/shared/mcp/functions/handle-agent-get.function.ts +0 -160
- package/src/shared/mcp/functions/handle-agent-list.function.ts +0 -50
- package/src/shared/mcp/functions/handle-agent-prompt.function.ts +0 -68
- package/src/shared/mcp/functions/handle-completion.function.ts +0 -114
- package/src/shared/mcp/functions/handle-mcp-request.function.ts +0 -202
- package/src/shared/mcp/functions/handle-prompt-get.function.ts +0 -220
- package/src/shared/mcp/functions/handle-recall.function.ts +0 -66
- package/src/shared/mcp/functions/handle-resource-read.function.ts +0 -56
- package/src/shared/mcp/functions/handle-roots-list.function.ts +0 -29
- package/src/shared/mcp/functions/handle-skill-prompt.function.ts +0 -44
- package/src/shared/mcp/functions/handle-tool-auto-capture-review.function.ts +0 -24
- package/src/shared/mcp/functions/handle-tool-call.function.ts +0 -560
- package/src/shared/mcp/functions/handle-tool-check.function.ts +0 -21
- package/src/shared/mcp/functions/handle-tool-content.function.ts +0 -23
- package/src/shared/mcp/functions/handle-tool-export.function.ts +0 -25
- package/src/shared/mcp/functions/handle-tool-gc.function.ts +0 -21
- package/src/shared/mcp/functions/handle-tool-learn.function.ts +0 -69
- package/src/shared/mcp/functions/handle-tool-rebuild.function.ts +0 -21
- package/src/shared/mcp/functions/handle-tool-retrieve.function.ts +0 -40
- package/src/shared/mcp/functions/handle-tool-search.function.ts +0 -47
- package/src/shared/mcp/functions/handle-tool-skill-delete.function.ts +0 -34
- package/src/shared/mcp/functions/handle-tool-skill-get.function.ts +0 -59
- package/src/shared/mcp/functions/handle-tool-skill-learn.function.ts +0 -61
- package/src/shared/mcp/functions/handle-tool-skill-list.function.ts +0 -39
- package/src/shared/mcp/functions/handle-tool-status.function.ts +0 -21
- package/src/shared/mcp/functions/handle-tool-unlearn.function.ts +0 -24
- package/src/shared/mcp/functions/parse-agent-meta.function.ts +0 -27
- package/src/shared/mcp/functions/parse-skill-arguments.function.ts +0 -36
- package/src/shared/mcp/functions/parse-skill-content.function.ts +0 -38
- package/src/shared/mcp/functions/read-agent-meta.function.ts +0 -41
- package/src/shared/mcp/functions/resolve-skill-refs.function.ts +0 -50
- package/src/shared/mcp/functions/run-startup-health-check.function.ts +0 -34
- package/src/shared/mcp/functions/serialize-skill-content.function.ts +0 -12
- package/src/shared/mcp/functions/should-emit-log.function.ts +0 -38
- package/src/shared/mcp/index.ts +0 -28
- package/src/shared/mcp/typings/agent-types.interface.ts +0 -39
- package/src/shared/mcp/typings/log-types.interface.ts +0 -26
- package/src/shared/mcp/typings/mcp-capabilities.interface.ts +0 -16
- package/src/shared/mcp/typings/mcp-client.interface.ts +0 -317
- package/src/shared/mcp/typings/mcp-completion.interface.ts +0 -45
- package/src/shared/mcp/typings/mcp-content-result.model.ts +0 -9
- package/src/shared/mcp/typings/mcp-export-result.model.ts +0 -11
- package/src/shared/mcp/typings/mcp-gc-result.model.ts +0 -15
- package/src/shared/mcp/typings/mcp-integrity-check-result.model.ts +0 -17
- package/src/shared/mcp/typings/mcp-integrity-error.model.ts +0 -15
- package/src/shared/mcp/typings/mcp-notification.interface.ts +0 -9
- package/src/shared/mcp/typings/mcp-rebuild-result.model.ts +0 -9
- package/src/shared/mcp/typings/mcp-request.interface.ts +0 -11
- package/src/shared/mcp/typings/mcp-resource-result.interface.ts +0 -12
- package/src/shared/mcp/typings/mcp-resource-template.interface.ts +0 -11
- package/src/shared/mcp/typings/mcp-response.interface.ts +0 -18
- package/src/shared/mcp/typings/mcp-server-info.interface.ts +0 -7
- package/src/shared/mcp/typings/mcp-server-state.interface.ts +0 -17
- package/src/shared/mcp/typings/mcp-tool-annotations.interface.ts +0 -32
- package/src/shared/mcp/typings/mcp-tool-definition.interface.ts +0 -16
- package/src/shared/mcp/typings/mcp-tool-result.interface.ts +0 -19
- package/src/shared/mcp/typings/mcp-types.interface.ts +0 -158
- package/src/shared/mcp/typings/mcp-worker-client.interface.ts +0 -243
- package/src/shared/mcp/typings/prompt-types.interface.ts +0 -39
- package/src/shared/mcp/typings/remove-section-result.model.ts +0 -10
- package/src/shared/mcp/typings/sampling-types.interface.ts +0 -48
- package/src/shared/mcp/typings/skill-types.interface.ts +0 -29
- package/src/shared/mcp/typings/tool-call-result.model.ts +0 -18
- package/src/shared/mod.ts +0 -1
- package/src/shared/platform/functions/get-ipc-path.function.ts +0 -19
- package/src/shared/platform/functions/get-tmpdir.function.ts +0 -8
- package/src/shared/platform/functions/is-process-alive.function.ts +0 -17
- package/src/shared/platform/index.ts +0 -3
- package/src/shared/runtime/functions/detect-runtime.ts +0 -14
- package/src/shared/runtime/functions/get-args.ts +0 -16
- package/src/shared/runtime/index.ts +0 -3
- package/src/shared/runtime/typings/runtime.ts +0 -2
- package/src/shared/sync/functions/build-import-report.function.ts +0 -40
- package/src/shared/sync/functions/parse-export-entry.function.ts +0 -45
- package/src/shared/sync/functions/resolve-conflict.function.ts +0 -31
- package/src/shared/sync/functions/serialize-export-entry.function.ts +0 -18
- package/src/shared/sync/index.ts +0 -9
- package/src/shared/sync/typings/conflict-resolution.type.ts +0 -8
- package/src/shared/sync/typings/export-entry.interface.ts +0 -13
- package/src/shared/sync/typings/export-options.interface.ts +0 -9
- package/src/shared/sync/typings/import-options.interface.ts +0 -7
- package/src/shared/sync/typings/import-report.interface.ts +0 -15
- package/src/shared/version/constants/version.constant.ts +0 -2
- package/src/shared/version/index.ts +0 -1
- package/src/shared/wasm-codec/functions/decode-add-section-result.function.ts +0 -112
- package/src/shared/wasm-codec/functions/decode-compose-output.function.ts +0 -16
- package/src/shared/wasm-codec/functions/decode-document-manifest-list.function.ts +0 -70
- package/src/shared/wasm-codec/functions/decode-document-manifest.function.ts +0 -87
- package/src/shared/wasm-codec/functions/decode-f32.function.ts +0 -16
- package/src/shared/wasm-codec/functions/decode-key-value-text.function.ts +0 -15
- package/src/shared/wasm-codec/functions/decode-one-recall-result.function.ts +0 -86
- package/src/shared/wasm-codec/functions/decode-option-string.function.ts +0 -24
- package/src/shared/wasm-codec/functions/decode-recall-document.function.ts +0 -59
- package/src/shared/wasm-codec/functions/decode-recall-reference.function.ts +0 -52
- package/src/shared/wasm-codec/functions/decode-recall-result.function.ts +0 -267
- package/src/shared/wasm-codec/functions/decode-recall-sibling.function.ts +0 -43
- package/src/shared/wasm-codec/functions/decode-remove-flag.function.ts +0 -3
- package/src/shared/wasm-codec/functions/decode-scored-results.function.ts +0 -194
- package/src/shared/wasm-codec/functions/decode-section-match.function.ts +0 -80
- package/src/shared/wasm-codec/functions/decode-section-record-list.function.ts +0 -20
- package/src/shared/wasm-codec/functions/decode-section-record-trailing.function.ts +0 -75
- package/src/shared/wasm-codec/functions/decode-section-record.function.ts +0 -85
- package/src/shared/wasm-codec/functions/decode-section-records.function.ts +0 -249
- package/src/shared/wasm-codec/functions/decode-section-type.function.ts +0 -30
- package/src/shared/wasm-codec/functions/decode-string.function.ts +0 -22
- package/src/shared/wasm-codec/functions/decode-u32.function.ts +0 -16
- package/src/shared/wasm-codec/functions/decode-u64.function.ts +0 -16
- package/src/shared/wasm-codec/functions/decode-wasm-list.function.ts +0 -31
- package/src/shared/wasm-codec/functions/encode-add-section-params.function.ts +0 -102
- package/src/shared/wasm-codec/functions/encode-group-params.function.ts +0 -28
- package/src/shared/wasm-codec/functions/encode-identifier-list.function.ts +0 -17
- package/src/shared/wasm-codec/functions/encode-kbid-list.function.ts +0 -17
- package/src/shared/wasm-codec/functions/encode-option-string.function.ts +0 -14
- package/src/shared/wasm-codec/functions/encode-recall-params.function.ts +0 -68
- package/src/shared/wasm-codec/functions/encode-search-params.function.ts +0 -12
- package/src/shared/wasm-codec/functions/encode-section-type.function.ts +0 -18
- package/src/shared/wasm-codec/functions/encode-string.function.ts +0 -9
- package/src/shared/wasm-codec/functions/encode-type-filter-param.function.ts +0 -13
- package/src/shared/wasm-codec/functions/encode-u32.function.ts +0 -5
- package/src/shared/wasm-codec/functions/encode-update-section-params.function.ts +0 -16
- package/src/shared/wasm-codec/index.ts +0 -49
- package/src/shared/wasm-codec/typings/add-section-input.model.ts +0 -45
- package/src/shared/wasm-codec/typings/add-section-result.model.ts +0 -28
- package/src/shared/wasm-codec/typings/document-manifest.model.ts +0 -20
- package/src/shared/wasm-codec/typings/document-section.model.ts +0 -12
- package/src/shared/wasm-codec/typings/item-decoder.type.ts +0 -10
- package/src/shared/wasm-codec/typings/near-duplicate.model.ts +0 -16
- package/src/shared/wasm-codec/typings/paged-search-result.model.ts +0 -22
- package/src/shared/wasm-codec/typings/section-match.model.ts +0 -31
- package/src/shared/wasm-codec/typings/section-record-trailing.model.ts +0 -38
- package/src/shared/wasm-codec/typings/section-record.model.ts +0 -66
- package/src/shared/wasm-codec/typings/section-type-result.model.ts +0 -12
- package/src/shared/worker-client/classes/worker-client.class.ts +0 -466
- package/src/shared/worker-client/functions/compute-context-id.function.ts +0 -18
- package/src/shared/worker-client/functions/create-worker-client.function.ts +0 -70
- package/src/shared/worker-client/functions/discover-daemon.function.ts +0 -47
- package/src/shared/worker-client/functions/handle-ipc-data.function.ts +0 -49
- package/src/shared/worker-client/functions/resolve-db-path.function.ts +0 -21
- package/src/shared/worker-client/functions/send-ipc-request.function.ts +0 -39
- package/src/shared/worker-client/functions/spawn-daemon.function.ts +0 -35
- package/src/shared/worker-client/functions/wait-for-daemon.function.ts +0 -34
- package/src/shared/worker-client/index.ts +0 -44
- package/src/shared/worker-client/typings/add-section-result.model.ts +0 -39
- package/src/shared/worker-client/typings/content-result.model.ts +0 -12
- package/src/shared/worker-client/typings/daemon-info.model.ts +0 -7
- package/src/shared/worker-client/typings/export-result.model.ts +0 -14
- package/src/shared/worker-client/typings/gc-result.model.ts +0 -18
- package/src/shared/worker-client/typings/integrity-check-result.model.ts +0 -43
- package/src/shared/worker-client/typings/json-rpc-response.interface.ts +0 -17
- package/src/shared/worker-client/typings/migrate-result.model.ts +0 -11
- package/src/shared/worker-client/typings/pending-call.interface.ts +0 -7
- package/src/shared/worker-client/typings/rebuild-result.model.ts +0 -12
- package/src/shared/worker-client/typings/recall-document.model.ts +0 -16
- package/src/shared/worker-client/typings/recall-params.model.ts +0 -15
- package/src/shared/worker-client/typings/recall-reference.model.ts +0 -32
- package/src/shared/worker-client/typings/recall-result.model.ts +0 -98
- package/src/shared/worker-client/typings/recall-sibling.model.ts +0 -11
- package/src/shared/worker-client/typings/recall-single-result.model.ts +0 -41
- package/src/shared/worker-client/typings/remove-section-result.model.ts +0 -7
- package/src/shared/worker-client/typings/search-params.model.ts +0 -14
- package/src/shared/worker-client/typings/search-result.model.ts +0 -43
- package/src/shared/worker-client/typings/section.model.ts +0 -43
- package/src/shared/worker-client/typings/status-result.model.ts +0 -14
- package/src/shared/worker-client/typings/version-status.model.ts +0 -28
- package/src/shared/worker-client/typings/worker-client-error.interface.ts +0 -8
- package/src/shared/worker-client/typings/worker-client-options.interface.ts +0 -30
- package/src/shared/worker-daemon/classes/ipc-error.class.ts +0 -22
- package/src/shared/worker-daemon/classes/worker-daemon.class.ts +0 -1291
- package/src/shared/worker-daemon/constants/daemon-defaults.constant.ts +0 -29
- package/src/shared/worker-daemon/constants/wasm-method-map.constant.ts +0 -69
- package/src/shared/worker-daemon/functions/build-ipc-error-response.function.ts +0 -16
- package/src/shared/worker-daemon/functions/check-catalog-version.function.ts +0 -54
- package/src/shared/worker-daemon/functions/check-preconditions.function.ts +0 -28
- package/src/shared/worker-daemon/functions/create-host-imports.function.ts +0 -328
- package/src/shared/worker-daemon/functions/create-ipc-server.function.ts +0 -87
- package/src/shared/worker-daemon/functions/detect-stale-pid.function.ts +0 -33
- package/src/shared/worker-daemon/functions/dispatch-request.function.ts +0 -190
- package/src/shared/worker-daemon/functions/handle-check-version.function.ts +0 -74
- package/src/shared/worker-daemon/functions/handle-config-method.function.ts +0 -27
- package/src/shared/worker-daemon/functions/handle-read-ops.function.ts +0 -236
- package/src/shared/worker-daemon/functions/handle-write-ops.function.ts +0 -257
- package/src/shared/worker-daemon/functions/load-wasm-modules.function.ts +0 -95
- package/src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts +0 -51
- package/src/shared/worker-daemon/functions/parse-catalog-version.function.ts +0 -20
- package/src/shared/worker-daemon/functions/parse-embedding-section.function.ts +0 -38
- package/src/shared/worker-daemon/functions/parse-worker-toml.function.ts +0 -104
- package/src/shared/worker-daemon/functions/read-config.function.ts +0 -83
- package/src/shared/worker-daemon/functions/run-startup-integrity-check.function.ts +0 -55
- package/src/shared/worker-daemon/functions/run-worker.function.ts +0 -57
- package/src/shared/worker-daemon/functions/scan-near-duplicates.function.ts +0 -92
- package/src/shared/worker-daemon/functions/start-daemon.function.ts +0 -74
- package/src/shared/worker-daemon/functions/wasm-bridge.function.ts +0 -144
- package/src/shared/worker-daemon/functions/wasm-memory-helpers.function.ts +0 -41
- package/src/shared/worker-daemon/functions/write-lock.function.ts +0 -49
- package/src/shared/worker-daemon/index.ts +0 -16
- package/src/shared/worker-daemon/typings/allocator-ref.interface.ts +0 -16
- package/src/shared/worker-daemon/typings/daemon-config.interface.ts +0 -20
- package/src/shared/worker-daemon/typings/fs-adapter.interface.ts +0 -22
- package/src/shared/worker-daemon/typings/handler-context.interface.ts +0 -19
- package/src/shared/worker-daemon/typings/ipc-handler.interface.ts +0 -39
- package/src/shared/worker-daemon/typings/memory-ref.interface.ts +0 -13
- package/src/shared/worker-daemon/typings/wasm-fn.type.ts +0 -2
- package/src/shared/worker-daemon/typings/wasm-modules.interface.ts +0 -7
- package/src/shared/worker-daemon/typings/write-lock.interface.ts +0 -13
- package/src/wasm/fs-database/kbdb_fs_database.d.ts +0 -259
- package/src/wasm/fs-database/kbdb_fs_database.js +0 -515
- package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/src/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +0 -35
- package/src/wasm/fs-database/package.json +0 -13
- package/src/wasm/kb-worker/kbdb_worker.d.ts +0 -650
- package/src/wasm/kb-worker/kbdb_worker.js +0 -1181
- package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/src/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +0 -77
- package/src/wasm/kb-worker/package.json +0 -13
- package/src/wasm/query-parser/kbdb_query_parser.d.ts +0 -195
- package/src/wasm/query-parser/kbdb_query_parser.js +0 -403
- package/src/wasm/query-parser/kbdb_query_parser_bg.wasm.d.ts +0 -25
- package/src/wasm/query-parser/package.json +0 -13
- package/src/worker.ts +0 -42
package/dist/worker.mjs
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
import {
|
|
2
|
+
DB_FORMAT_VERSION,
|
|
3
|
+
DEFAULT_INDEX_LIMIT,
|
|
4
|
+
DEFAULT_ITEM_LIMIT,
|
|
5
|
+
DEFAULT_ITEM_TTL_MS,
|
|
6
|
+
DEFAULT_TIMEOUT_MS,
|
|
7
|
+
WORKER_TOML_FILENAME,
|
|
2
8
|
computeSha256,
|
|
9
|
+
configureLog,
|
|
3
10
|
getArgs,
|
|
4
11
|
getIpcPath,
|
|
5
12
|
isRemoteUrl,
|
|
6
13
|
joinPath,
|
|
14
|
+
log,
|
|
15
|
+
parseLogLevel,
|
|
16
|
+
parseWorkerToml,
|
|
7
17
|
resolveBaseDir,
|
|
18
|
+
resolveLogLevel,
|
|
8
19
|
resolveWasmDir
|
|
9
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-BJXEVALU.mjs";
|
|
10
21
|
|
|
11
22
|
// src/worker.ts
|
|
12
|
-
import { existsSync as
|
|
23
|
+
import { existsSync as existsSync5 } from "node:fs";
|
|
13
24
|
|
|
14
25
|
// src/shared/worker-daemon/functions/read-config.function.ts
|
|
15
26
|
import { readFileSync } from "node:fs";
|
|
16
27
|
import { join } from "node:path";
|
|
17
|
-
|
|
18
|
-
// src/shared/worker-daemon/constants/daemon-defaults.constant.ts
|
|
19
|
-
var DEFAULT_ITEM_LIMIT = 1e3;
|
|
20
|
-
var DEFAULT_INDEX_LIMIT = 100;
|
|
21
|
-
var DEFAULT_TIMEOUT_MS = 3e5;
|
|
22
|
-
var DEFAULT_ITEM_TTL_MS = 6e4;
|
|
23
|
-
var WORKER_TOML_FILENAME = "worker.toml";
|
|
24
|
-
var DB_FORMAT_VERSION = 1;
|
|
25
|
-
|
|
26
|
-
// src/shared/worker-daemon/functions/read-config.function.ts
|
|
27
28
|
function readConfig(contextPath) {
|
|
28
29
|
const configPath = join(contextPath, WORKER_TOML_FILENAME);
|
|
29
30
|
try {
|
|
@@ -39,59 +40,23 @@ function readConfig(contextPath) {
|
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
function parseWorkerToml(text, contextPath) {
|
|
43
|
-
const config = {
|
|
44
|
-
contextPath,
|
|
45
|
-
itemLimit: DEFAULT_ITEM_LIMIT,
|
|
46
|
-
indexLimit: DEFAULT_INDEX_LIMIT,
|
|
47
|
-
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
48
|
-
itemTtlMs: DEFAULT_ITEM_TTL_MS
|
|
49
|
-
};
|
|
50
|
-
const result = { ...config };
|
|
51
|
-
for (const line of text.split("\n")) {
|
|
52
|
-
const trimmed = line.trim();
|
|
53
|
-
if (trimmed.startsWith("#") || !trimmed.includes("=")) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
const eqIdx = trimmed.indexOf("=");
|
|
57
|
-
const key = trimmed.slice(0, eqIdx).trim();
|
|
58
|
-
const value = trimmed.slice(eqIdx + 1).trim();
|
|
59
|
-
switch (key) {
|
|
60
|
-
case "item_limit":
|
|
61
|
-
result.itemLimit = parseInt(value, 10) || DEFAULT_ITEM_LIMIT;
|
|
62
|
-
break;
|
|
63
|
-
case "index_limit":
|
|
64
|
-
result.indexLimit = parseInt(value, 10) || DEFAULT_INDEX_LIMIT;
|
|
65
|
-
break;
|
|
66
|
-
case "timeout_ms":
|
|
67
|
-
result.timeoutMs = parseInt(value, 10) || DEFAULT_TIMEOUT_MS;
|
|
68
|
-
break;
|
|
69
|
-
case "item_ttl_ms":
|
|
70
|
-
result.itemTtlMs = parseInt(value, 10) || DEFAULT_ITEM_TTL_MS;
|
|
71
|
-
break;
|
|
72
|
-
default:
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
43
|
|
|
79
44
|
// src/shared/worker-daemon/functions/start-daemon.function.ts
|
|
80
|
-
import { writeFileSync as
|
|
81
|
-
import { join as
|
|
45
|
+
import { writeFileSync as writeFileSync4 } from "node:fs";
|
|
46
|
+
import { join as join7 } from "node:path";
|
|
82
47
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
83
48
|
|
|
84
49
|
// src/shared/worker-daemon/classes/worker-daemon.class.ts
|
|
85
50
|
import {
|
|
86
|
-
existsSync as
|
|
87
|
-
readFileSync as
|
|
88
|
-
readdirSync as
|
|
51
|
+
existsSync as existsSync4,
|
|
52
|
+
readFileSync as readFileSync6,
|
|
53
|
+
readdirSync as readdirSync3,
|
|
89
54
|
accessSync,
|
|
90
|
-
writeFileSync as
|
|
55
|
+
writeFileSync as writeFileSync3,
|
|
91
56
|
unlinkSync as unlinkSync2,
|
|
92
57
|
constants
|
|
93
58
|
} from "node:fs";
|
|
94
|
-
import { join as
|
|
59
|
+
import { join as join6 } from "node:path";
|
|
95
60
|
import { tmpdir } from "node:os";
|
|
96
61
|
|
|
97
62
|
// src/shared/worker-daemon/functions/load-wasm-modules.function.ts
|
|
@@ -130,6 +95,7 @@ var nullAllocator = { alloc: null };
|
|
|
130
95
|
function createHostImports(contextPath, memoryRef = nullMemory, fs = nodeFsAdapter, allocator = nullAllocator) {
|
|
131
96
|
function getBuffer() {
|
|
132
97
|
if (!memoryRef.memory) {
|
|
98
|
+
log("WASM memory not initialized", 3 /* ERROR */);
|
|
133
99
|
throw new Error("WASM memory not initialized");
|
|
134
100
|
}
|
|
135
101
|
return memoryRef.memory.buffer;
|
|
@@ -298,6 +264,7 @@ async function loadWasmModules(config, wasmDir2) {
|
|
|
298
264
|
void 0,
|
|
299
265
|
allocator
|
|
300
266
|
);
|
|
267
|
+
log("loading WASM module: kb-worker", 0 /* DEBUG */);
|
|
301
268
|
const wkPath = joinPath(wasmDir2, "kb-worker", "kbdb_worker_bg.wasm");
|
|
302
269
|
const wkBytes = await readWasmFile(wkPath, "kb-worker");
|
|
303
270
|
let wkModule;
|
|
@@ -321,7 +288,20 @@ async function loadWasmModules(config, wasmDir2) {
|
|
|
321
288
|
if (typeof fn_ !== "function") return 0;
|
|
322
289
|
return fn_(size);
|
|
323
290
|
};
|
|
324
|
-
|
|
291
|
+
const embPath = joinPath(
|
|
292
|
+
wasmDir2,
|
|
293
|
+
"default-embedding",
|
|
294
|
+
"kbdb_default_embedding_bg.wasm"
|
|
295
|
+
);
|
|
296
|
+
let embedding;
|
|
297
|
+
try {
|
|
298
|
+
const embBytes = await readWasmFile(embPath, "default-embedding");
|
|
299
|
+
const embModule = await WebAssembly.compile(embBytes);
|
|
300
|
+
embedding = await WebAssembly.instantiate(embModule, {});
|
|
301
|
+
} catch {
|
|
302
|
+
}
|
|
303
|
+
log("all WASM modules loaded", 1 /* INFO */);
|
|
304
|
+
return { memory, kbWorker, embedding };
|
|
325
305
|
}
|
|
326
306
|
async function readWasmFile(path, label) {
|
|
327
307
|
try {
|
|
@@ -347,17 +327,25 @@ function rethrow(stage, label, err, path) {
|
|
|
347
327
|
const detail = err instanceof Error ? err.message : String(err);
|
|
348
328
|
const suffix = path ? ` (path: ${path})` : "";
|
|
349
329
|
const message = `failed to ${stage} ${label} WASM: ${detail}${suffix}`;
|
|
350
|
-
|
|
330
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
351
331
|
throw new Error(message, { cause: err });
|
|
352
332
|
}
|
|
353
333
|
|
|
354
334
|
// src/shared/worker-daemon/functions/create-ipc-server.function.ts
|
|
355
335
|
import { createServer } from "node:net";
|
|
336
|
+
var LISTEN_BACKLOG = 256;
|
|
337
|
+
var KEEPALIVE_MS = 3e4;
|
|
356
338
|
function createIpcServer(socketPath, handler) {
|
|
357
339
|
const server = createServer((socket) => {
|
|
340
|
+
socket.setKeepAlive(true, KEEPALIVE_MS);
|
|
341
|
+
log("ipc: connection accepted", 0 /* DEBUG */);
|
|
358
342
|
let buffer = "";
|
|
359
343
|
let processingQueue = Promise.resolve();
|
|
360
344
|
socket.on("data", (chunk) => {
|
|
345
|
+
log(
|
|
346
|
+
"ipc: data received bytes=" + String(chunk.length),
|
|
347
|
+
0 /* DEBUG */
|
|
348
|
+
);
|
|
361
349
|
buffer += chunk.toString();
|
|
362
350
|
const lines = buffer.split("\n");
|
|
363
351
|
buffer = lines.pop() ?? "";
|
|
@@ -369,16 +357,28 @@ function createIpcServer(socketPath, handler) {
|
|
|
369
357
|
}
|
|
370
358
|
});
|
|
371
359
|
socket.on("error", (err) => {
|
|
372
|
-
|
|
373
|
-
`kbdb-worker: ipc connection error: ${err.message}
|
|
360
|
+
log(
|
|
361
|
+
`kbdb-worker: ipc connection error: ${err.message}`,
|
|
362
|
+
2 /* WARNING */
|
|
374
363
|
);
|
|
375
364
|
});
|
|
376
365
|
});
|
|
377
|
-
|
|
378
|
-
|
|
366
|
+
return new Promise((resolve2, reject) => {
|
|
367
|
+
server.once("error", reject);
|
|
368
|
+
server.listen(
|
|
369
|
+
{ path: socketPath, backlog: LISTEN_BACKLOG },
|
|
370
|
+
() => {
|
|
371
|
+
server.removeListener("error", reject);
|
|
372
|
+
server.on("error", (err) => {
|
|
373
|
+
log(
|
|
374
|
+
`kbdb-worker: ipc server error: ${err.message}`,
|
|
375
|
+
3 /* ERROR */
|
|
376
|
+
);
|
|
377
|
+
});
|
|
378
|
+
resolve2(server);
|
|
379
|
+
}
|
|
380
|
+
);
|
|
379
381
|
});
|
|
380
|
-
server.listen(socketPath);
|
|
381
|
-
return server;
|
|
382
382
|
}
|
|
383
383
|
function bigintReplacer(_key, value) {
|
|
384
384
|
return typeof value === "bigint" ? Number(value) : value;
|
|
@@ -387,8 +387,13 @@ async function handleLine(line, handler, socket) {
|
|
|
387
387
|
let response;
|
|
388
388
|
try {
|
|
389
389
|
const request = JSON.parse(line);
|
|
390
|
+
log(
|
|
391
|
+
"ipc: request parsed method=" + request.method + " id=" + String(request.id),
|
|
392
|
+
0 /* DEBUG */
|
|
393
|
+
);
|
|
390
394
|
response = await handler(request);
|
|
391
395
|
} catch {
|
|
396
|
+
log("ipc: parse error on malformed request", 0 /* DEBUG */);
|
|
392
397
|
response = {
|
|
393
398
|
jsonrpc: "2.0",
|
|
394
399
|
id: 0,
|
|
@@ -398,7 +403,541 @@ async function handleLine(line, handler, socket) {
|
|
|
398
403
|
}
|
|
399
404
|
};
|
|
400
405
|
}
|
|
401
|
-
|
|
406
|
+
const encoded = JSON.stringify(response, bigintReplacer) + "\n";
|
|
407
|
+
log(
|
|
408
|
+
"ipc: response sent bytes=" + String(encoded.length),
|
|
409
|
+
0 /* DEBUG */
|
|
410
|
+
);
|
|
411
|
+
socket.write(encoded);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// src/shared/embedding/classes/null-embedding-provider.class.ts
|
|
415
|
+
var NullEmbeddingProvider = class {
|
|
416
|
+
/**
|
|
417
|
+
* Returns an empty `Float32Array` for each input text.
|
|
418
|
+
*
|
|
419
|
+
* @param texts - input strings (contents are ignored)
|
|
420
|
+
*/
|
|
421
|
+
embed(texts) {
|
|
422
|
+
return Promise.resolve(texts.map(() => new Float32Array(0)));
|
|
423
|
+
}
|
|
424
|
+
/** Always returns 0 -- no dimensions when disabled. */
|
|
425
|
+
dimensions() {
|
|
426
|
+
return 0;
|
|
427
|
+
}
|
|
428
|
+
/** Always returns `'none'`. */
|
|
429
|
+
modelName() {
|
|
430
|
+
return "none";
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
// src/shared/embedding/classes/onnx-embedding-provider.class.ts
|
|
435
|
+
var OnnxEmbeddingProvider = class {
|
|
436
|
+
/** Path to the ONNX model file. */
|
|
437
|
+
model;
|
|
438
|
+
/** Number of embedding dimensions the model produces. */
|
|
439
|
+
dims;
|
|
440
|
+
/**
|
|
441
|
+
* @param model - filesystem path to the ONNX model file
|
|
442
|
+
* @param dimensions - number of dimensions the model produces
|
|
443
|
+
*/
|
|
444
|
+
constructor(model, dimensions) {
|
|
445
|
+
this.model = model;
|
|
446
|
+
this.dims = dimensions;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Not yet implemented.
|
|
450
|
+
*
|
|
451
|
+
* @throws {Error} always -- ONNX Runtime is an optional peer
|
|
452
|
+
* dependency not yet wired
|
|
453
|
+
*/
|
|
454
|
+
embed(_texts) {
|
|
455
|
+
log("embed called on OnnxEmbeddingProvider", 0 /* DEBUG */);
|
|
456
|
+
return Promise.reject(
|
|
457
|
+
new Error(
|
|
458
|
+
"ONNX Runtime not available; install onnxruntime-node"
|
|
459
|
+
)
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
/** Returns the configured number of embedding dimensions. */
|
|
463
|
+
dimensions() {
|
|
464
|
+
return this.dims;
|
|
465
|
+
}
|
|
466
|
+
/** Returns the configured model file path. */
|
|
467
|
+
modelName() {
|
|
468
|
+
return this.model;
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// src/shared/embedding/functions/parse-api-embedding-response.function.ts
|
|
473
|
+
function parseApiEmbeddingResponse(raw) {
|
|
474
|
+
if (!isEmbeddingApiResponse(raw)) {
|
|
475
|
+
log("Unexpected embedding API response shape", 3 /* ERROR */);
|
|
476
|
+
throw new Error("Unexpected embedding API response shape");
|
|
477
|
+
}
|
|
478
|
+
return raw.data.map((entry) => new Float32Array(entry.embedding));
|
|
479
|
+
}
|
|
480
|
+
function isEmbeddingApiResponse(value) {
|
|
481
|
+
if (typeof value !== "object" || value === null) {
|
|
482
|
+
return false;
|
|
483
|
+
}
|
|
484
|
+
const candidate = value;
|
|
485
|
+
if (!Array.isArray(candidate["data"])) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
return candidate["data"].every(isEmbeddingEntry);
|
|
489
|
+
}
|
|
490
|
+
function isEmbeddingEntry(value) {
|
|
491
|
+
if (typeof value !== "object" || value === null) {
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
const candidate = value;
|
|
495
|
+
return Array.isArray(candidate["embedding"]);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// src/shared/embedding/classes/api-embedding-provider.class.ts
|
|
499
|
+
var ApiEmbeddingProvider = class {
|
|
500
|
+
/** Remote endpoint URL for embedding requests. */
|
|
501
|
+
endpoint;
|
|
502
|
+
/** Number of dimensions in the returned vectors. */
|
|
503
|
+
dims;
|
|
504
|
+
/** Model name sent in the request body. */
|
|
505
|
+
model;
|
|
506
|
+
/**
|
|
507
|
+
* @param endpoint - URL to POST embedding requests to
|
|
508
|
+
* @param dimensions - number of vector dimensions expected
|
|
509
|
+
* @param model - optional model name; defaults to `'api'`
|
|
510
|
+
*/
|
|
511
|
+
constructor(endpoint, dimensions, model) {
|
|
512
|
+
this.endpoint = endpoint;
|
|
513
|
+
this.dims = dimensions;
|
|
514
|
+
this.model = model ?? "api";
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Posts texts to the endpoint and returns one `Float32Array`
|
|
518
|
+
* per input.
|
|
519
|
+
*
|
|
520
|
+
* @throws {Error} when the HTTP response status is not 2xx
|
|
521
|
+
*/
|
|
522
|
+
async embed(texts) {
|
|
523
|
+
const response = await fetch(this.endpoint, {
|
|
524
|
+
method: "POST",
|
|
525
|
+
headers: { "Content-Type": "application/json" },
|
|
526
|
+
body: JSON.stringify({ input: texts, model: this.model })
|
|
527
|
+
});
|
|
528
|
+
if (!response.ok) {
|
|
529
|
+
const msg = `Embedding API error: ${String(response.status)}`;
|
|
530
|
+
log(msg, 3 /* ERROR */);
|
|
531
|
+
throw new Error(msg);
|
|
532
|
+
}
|
|
533
|
+
const json = await response.json();
|
|
534
|
+
return parseApiEmbeddingResponse(json);
|
|
535
|
+
}
|
|
536
|
+
/** Returns the configured number of embedding dimensions. */
|
|
537
|
+
dimensions() {
|
|
538
|
+
return this.dims;
|
|
539
|
+
}
|
|
540
|
+
/** Returns the configured model name, defaulting to `'api'`. */
|
|
541
|
+
modelName() {
|
|
542
|
+
return this.model;
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
// src/shared/embedding/constants/tfidf-defaults.constant.ts
|
|
547
|
+
var TFIDF_DIMENSIONS = 256;
|
|
548
|
+
var TFIDF_MODEL_NAME = "tfidf-v1";
|
|
549
|
+
|
|
550
|
+
// src/shared/embedding/classes/tfidf-embedding-provider.class.ts
|
|
551
|
+
var TfidfEmbeddingProvider = class {
|
|
552
|
+
_alloc;
|
|
553
|
+
_batch;
|
|
554
|
+
_retPtr;
|
|
555
|
+
_memory;
|
|
556
|
+
/** @param wasm - instantiated `kbdb-default-embedding` WASM module */
|
|
557
|
+
constructor(wasm) {
|
|
558
|
+
const ex = wasm.exports;
|
|
559
|
+
this._memory = ex["memory"];
|
|
560
|
+
this._alloc = ex["kbdb_alloc"];
|
|
561
|
+
this._batch = ex["embedding_tfidf_batch"];
|
|
562
|
+
this._retPtr = ex["get_return_ptr"];
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Embeds a batch of texts using TF-IDF computation in WASM.
|
|
566
|
+
*
|
|
567
|
+
* @param texts - input strings to embed
|
|
568
|
+
* @returns one 256-dimension `Float32Array` per input text
|
|
569
|
+
*/
|
|
570
|
+
embed(texts) {
|
|
571
|
+
log(
|
|
572
|
+
"embed called on TfidfEmbeddingProvider: " + texts.length.toString() + " texts",
|
|
573
|
+
0 /* DEBUG */
|
|
574
|
+
);
|
|
575
|
+
const input = texts.join("\n");
|
|
576
|
+
const encoded = new TextEncoder().encode(input);
|
|
577
|
+
const ptr = this._alloc(encoded.byteLength);
|
|
578
|
+
const view = new Uint8Array(this._memory.buffer);
|
|
579
|
+
view.set(encoded, ptr);
|
|
580
|
+
this._batch(ptr, encoded.byteLength);
|
|
581
|
+
const outPtr = this._retPtr();
|
|
582
|
+
const dv = new DataView(this._memory.buffer);
|
|
583
|
+
const count = dv.getUint32(outPtr, true);
|
|
584
|
+
const results = [];
|
|
585
|
+
let offset = outPtr + 4;
|
|
586
|
+
for (let i = 0; i < count; i++) {
|
|
587
|
+
const vec = new Float32Array(TFIDF_DIMENSIONS);
|
|
588
|
+
for (let d = 0; d < TFIDF_DIMENSIONS; d++) {
|
|
589
|
+
vec[d] = dv.getFloat32(offset, true);
|
|
590
|
+
offset += 4;
|
|
591
|
+
}
|
|
592
|
+
results.push(vec);
|
|
593
|
+
}
|
|
594
|
+
return Promise.resolve(results);
|
|
595
|
+
}
|
|
596
|
+
/** Returns 256 -- the fixed dimension count for TF-IDF vectors. */
|
|
597
|
+
dimensions() {
|
|
598
|
+
return TFIDF_DIMENSIONS;
|
|
599
|
+
}
|
|
600
|
+
/** Returns `'tfidf-v1'`. */
|
|
601
|
+
modelName() {
|
|
602
|
+
return TFIDF_MODEL_NAME;
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
// src/shared/embedding/functions/create-embedding-provider.function.ts
|
|
607
|
+
function createEmbeddingProvider(config, wasmInstance) {
|
|
608
|
+
log("creating embedding provider", 0 /* DEBUG */);
|
|
609
|
+
if (!config) {
|
|
610
|
+
if (wasmInstance) {
|
|
611
|
+
log("using TfidfEmbeddingProvider", 0 /* DEBUG */);
|
|
612
|
+
return new TfidfEmbeddingProvider(wasmInstance);
|
|
613
|
+
}
|
|
614
|
+
log("using NullEmbeddingProvider", 0 /* DEBUG */);
|
|
615
|
+
return new NullEmbeddingProvider();
|
|
616
|
+
}
|
|
617
|
+
if (config.provider === "none") {
|
|
618
|
+
log("using NullEmbeddingProvider", 0 /* DEBUG */);
|
|
619
|
+
return new NullEmbeddingProvider();
|
|
620
|
+
}
|
|
621
|
+
if (config.provider === "onnx") {
|
|
622
|
+
log("using OnnxEmbeddingProvider", 0 /* DEBUG */);
|
|
623
|
+
return new OnnxEmbeddingProvider(
|
|
624
|
+
config.model ?? "",
|
|
625
|
+
config.dimensions ?? 0
|
|
626
|
+
);
|
|
627
|
+
}
|
|
628
|
+
log("using ApiEmbeddingProvider", 0 /* DEBUG */);
|
|
629
|
+
return new ApiEmbeddingProvider(
|
|
630
|
+
config.endpoint ?? "",
|
|
631
|
+
config.dimensions ?? 0,
|
|
632
|
+
config.model
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// src/shared/worker-daemon/functions/handle-hybrid-search.function.ts
|
|
637
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
638
|
+
import { join as join3 } from "node:path";
|
|
639
|
+
|
|
640
|
+
// src/shared/embedding/functions/search-vectors.function.ts
|
|
641
|
+
import { readFileSync as readFileSync4 } from "node:fs";
|
|
642
|
+
|
|
643
|
+
// src/shared/embedding/functions/cosine-similarity.function.ts
|
|
644
|
+
function cosineSimilarity(a, b) {
|
|
645
|
+
let dot = 0;
|
|
646
|
+
let magA = 0;
|
|
647
|
+
let magB = 0;
|
|
648
|
+
for (let i = 0; i < a.length; i++) {
|
|
649
|
+
const ai = a[i] ?? 0;
|
|
650
|
+
const bi = b[i] ?? 0;
|
|
651
|
+
dot += ai * bi;
|
|
652
|
+
magA += ai * ai;
|
|
653
|
+
magB += bi * bi;
|
|
654
|
+
}
|
|
655
|
+
if (magA === 0 || magB === 0) {
|
|
656
|
+
return 0;
|
|
657
|
+
}
|
|
658
|
+
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// src/shared/embedding/functions/search-vectors.function.ts
|
|
662
|
+
var HEADER_SIZE = 32;
|
|
663
|
+
var KBID_WIDTH = 64;
|
|
664
|
+
function searchVectors(filePath, queryVector, topN) {
|
|
665
|
+
log("searching vectors", 0 /* DEBUG */);
|
|
666
|
+
const buf = readFileSync4(filePath);
|
|
667
|
+
if (buf.length < HEADER_SIZE) {
|
|
668
|
+
return [];
|
|
669
|
+
}
|
|
670
|
+
const dimensions = buf.readUInt32LE(8);
|
|
671
|
+
const count = buf.readUInt32LE(12);
|
|
672
|
+
const modelLen = buf.readUInt32LE(16);
|
|
673
|
+
const dataStart = HEADER_SIZE + modelLen;
|
|
674
|
+
const recordSize = KBID_WIDTH + dimensions * 4;
|
|
675
|
+
const results = [];
|
|
676
|
+
for (let i = 0; i < count; i++) {
|
|
677
|
+
const recOffset = dataStart + i * recordSize;
|
|
678
|
+
const kbid = buf.toString("utf-8", recOffset, recOffset + KBID_WIDTH).replace(/\0/g, "");
|
|
679
|
+
const vector = new Float32Array(dimensions);
|
|
680
|
+
for (let d = 0; d < dimensions; d++) {
|
|
681
|
+
vector[d] = buf.readFloatLE(recOffset + KBID_WIDTH + d * 4);
|
|
682
|
+
}
|
|
683
|
+
const score = cosineSimilarity(queryVector, vector);
|
|
684
|
+
results.push({ kbid, score });
|
|
685
|
+
}
|
|
686
|
+
results.sort((a, b) => b.score - a.score);
|
|
687
|
+
return results.slice(0, topN);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// src/shared/embedding/functions/rrf-fuse.function.ts
|
|
691
|
+
var DEFAULT_K = 60;
|
|
692
|
+
function rrfFuse(lexicalRanks, vectorRanks, k = DEFAULT_K) {
|
|
693
|
+
const scores = /* @__PURE__ */ new Map();
|
|
694
|
+
for (const [kbid, rank] of lexicalRanks) {
|
|
695
|
+
scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));
|
|
696
|
+
}
|
|
697
|
+
for (const [kbid, rank] of vectorRanks) {
|
|
698
|
+
scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));
|
|
699
|
+
}
|
|
700
|
+
return scores;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// src/shared/worker-daemon/classes/ipc-error.class.ts
|
|
704
|
+
var IpcError = class extends Error {
|
|
705
|
+
/** JSON-RPC error code. */
|
|
706
|
+
code;
|
|
707
|
+
/**
|
|
708
|
+
* @param code - JSON-RPC error code (e.g. `-32601` for
|
|
709
|
+
* method-not-found, `-32000` for application errors)
|
|
710
|
+
* @param message - human-readable error description
|
|
711
|
+
*/
|
|
712
|
+
constructor(code, message) {
|
|
713
|
+
super(message);
|
|
714
|
+
this.code = code;
|
|
715
|
+
this.name = "IpcError";
|
|
716
|
+
}
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
// src/shared/worker-daemon/functions/handle-hybrid-search.function.ts
|
|
720
|
+
async function fuseSearchResults(lexical, algo, query, provider, targetDir) {
|
|
721
|
+
log("handling hybrid search", 0 /* DEBUG */);
|
|
722
|
+
if (algo === "lexical") {
|
|
723
|
+
return {
|
|
724
|
+
...lexical,
|
|
725
|
+
search_mode: "lexical",
|
|
726
|
+
retrieval_method: "lexical"
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
assertProvider(provider);
|
|
730
|
+
const embeddings = await provider.embed([query]);
|
|
731
|
+
if (embeddings.length === 0 || embeddings[0].length === 0) {
|
|
732
|
+
return {
|
|
733
|
+
...lexical,
|
|
734
|
+
search_mode: algo,
|
|
735
|
+
retrieval_method: "lexical"
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
const queryVec = embeddings[0];
|
|
739
|
+
const vectorPath = join3(targetDir, "vectors.idx");
|
|
740
|
+
const vectorResults = existsSync2(vectorPath) ? searchVectors(vectorPath, queryVec, lexical.limit) : [];
|
|
741
|
+
if (algo === "vector") {
|
|
742
|
+
return buildVectorOnly(vectorResults, lexical);
|
|
743
|
+
}
|
|
744
|
+
return buildHybrid(lexical, vectorResults);
|
|
745
|
+
}
|
|
746
|
+
function assertProvider(provider) {
|
|
747
|
+
if (!provider || provider.dimensions() === 0) {
|
|
748
|
+
const embeddingErrMsg = "embedding provider not configured; set [embedding] in worker.toml";
|
|
749
|
+
log(embeddingErrMsg, 3 /* ERROR */);
|
|
750
|
+
throw new IpcError(-32e3, embeddingErrMsg);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
function buildVectorOnly(vectorResults, lexical) {
|
|
754
|
+
const lookup = new Map(
|
|
755
|
+
lexical.items.map((item) => [item.kbid, item])
|
|
756
|
+
);
|
|
757
|
+
const items = vectorResults.map((vr) => {
|
|
758
|
+
const existing = lookup.get(vr.kbid);
|
|
759
|
+
if (existing) {
|
|
760
|
+
return { ...existing, score: vr.score };
|
|
761
|
+
}
|
|
762
|
+
return emptyItem(vr.kbid, vr.score);
|
|
763
|
+
});
|
|
764
|
+
return {
|
|
765
|
+
items,
|
|
766
|
+
total: items.length,
|
|
767
|
+
offset: lexical.offset,
|
|
768
|
+
limit: lexical.limit,
|
|
769
|
+
has_more: false,
|
|
770
|
+
relaxed: lexical.relaxed,
|
|
771
|
+
search_mode: "vector",
|
|
772
|
+
retrieval_method: "vector"
|
|
773
|
+
};
|
|
774
|
+
}
|
|
775
|
+
function buildHybrid(lexical, vectorResults) {
|
|
776
|
+
const lexRanks = /* @__PURE__ */ new Map();
|
|
777
|
+
lexical.items.forEach((item, i) => {
|
|
778
|
+
lexRanks.set(item.kbid, i + 1);
|
|
779
|
+
});
|
|
780
|
+
const vecRanks = /* @__PURE__ */ new Map();
|
|
781
|
+
vectorResults.forEach((vr, i) => {
|
|
782
|
+
vecRanks.set(vr.kbid, i + 1);
|
|
783
|
+
});
|
|
784
|
+
const fused = rrfFuse(lexRanks, vecRanks);
|
|
785
|
+
const sorted = [...fused.entries()].sort((a, b) => b[1] - a[1]);
|
|
786
|
+
const lookup = new Map(
|
|
787
|
+
lexical.items.map((item) => [item.kbid, item])
|
|
788
|
+
);
|
|
789
|
+
const items = sorted.slice(0, lexical.limit).map(([kbid, score]) => {
|
|
790
|
+
const existing = lookup.get(kbid);
|
|
791
|
+
if (existing) {
|
|
792
|
+
return { ...existing, score };
|
|
793
|
+
}
|
|
794
|
+
return emptyItem(kbid, score);
|
|
795
|
+
});
|
|
796
|
+
return {
|
|
797
|
+
items,
|
|
798
|
+
total: sorted.length,
|
|
799
|
+
offset: lexical.offset,
|
|
800
|
+
limit: lexical.limit,
|
|
801
|
+
has_more: sorted.length > lexical.limit,
|
|
802
|
+
relaxed: lexical.relaxed,
|
|
803
|
+
search_mode: "hybrid",
|
|
804
|
+
retrieval_method: "rrf"
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
function emptyItem(kbid, score) {
|
|
808
|
+
return {
|
|
809
|
+
kbid,
|
|
810
|
+
heading: null,
|
|
811
|
+
type: "",
|
|
812
|
+
docids: [],
|
|
813
|
+
score,
|
|
814
|
+
confidence: 0,
|
|
815
|
+
snippet: "",
|
|
816
|
+
matched_terms: [],
|
|
817
|
+
matched_fields: [],
|
|
818
|
+
created_at: ""
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// src/shared/embedding/functions/rebuild-vectors.function.ts
|
|
823
|
+
import { readdirSync as readdirSync2, readFileSync as readFileSync5, existsSync as existsSync3 } from "node:fs";
|
|
824
|
+
import { join as join5 } from "node:path";
|
|
825
|
+
|
|
826
|
+
// src/shared/embedding/functions/build-vector-index.function.ts
|
|
827
|
+
import { writeFileSync as writeFileSync2 } from "node:fs";
|
|
828
|
+
import { join as join4 } from "node:path";
|
|
829
|
+
var MAGIC = "KBVX";
|
|
830
|
+
var VERSION = 1;
|
|
831
|
+
var KBID_WIDTH2 = 64;
|
|
832
|
+
var HEADER_SIZE2 = 32;
|
|
833
|
+
function writeHeader(buf, dimensions, count, modelLen) {
|
|
834
|
+
buf.write(MAGIC, 0, "ascii");
|
|
835
|
+
buf.writeUInt32LE(VERSION, 4);
|
|
836
|
+
buf.writeUInt32LE(dimensions, 8);
|
|
837
|
+
buf.writeUInt32LE(count, 12);
|
|
838
|
+
buf.writeUInt32LE(modelLen, 16);
|
|
839
|
+
}
|
|
840
|
+
function writeRecord(buf, offset, entry, dimensions, encoder3) {
|
|
841
|
+
const kbidBytes = encoder3.encode(entry.kbid);
|
|
842
|
+
kbidBytes.forEach((b, i) => {
|
|
843
|
+
if (i < KBID_WIDTH2) buf.writeUInt8(b, offset + i);
|
|
844
|
+
});
|
|
845
|
+
for (let d = 0; d < dimensions; d++) {
|
|
846
|
+
buf.writeFloatLE(
|
|
847
|
+
entry.vector[d] ?? 0,
|
|
848
|
+
offset + KBID_WIDTH2 + d * 4
|
|
849
|
+
);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
function buildVectorIndex(dirPath, modelName, dimensions, entries) {
|
|
853
|
+
log("building vector index", 0 /* DEBUG */);
|
|
854
|
+
const encoder3 = new TextEncoder();
|
|
855
|
+
const modelBytes = encoder3.encode(modelName);
|
|
856
|
+
const modelLen = modelBytes.length;
|
|
857
|
+
const recordSize = KBID_WIDTH2 + dimensions * 4;
|
|
858
|
+
const totalSize = HEADER_SIZE2 + modelLen + entries.length * recordSize;
|
|
859
|
+
const buf = Buffer.alloc(totalSize, 0);
|
|
860
|
+
writeHeader(buf, dimensions, entries.length, modelLen);
|
|
861
|
+
modelBytes.forEach((b, i) => buf.writeUInt8(b, HEADER_SIZE2 + i));
|
|
862
|
+
let recOffset = HEADER_SIZE2 + modelLen;
|
|
863
|
+
for (const entry of entries) {
|
|
864
|
+
writeRecord(buf, recOffset, entry, dimensions, encoder3);
|
|
865
|
+
recOffset += recordSize;
|
|
866
|
+
}
|
|
867
|
+
writeFileSync2(join4(dirPath, "vectors.idx"), buf);
|
|
868
|
+
return Promise.resolve();
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// src/shared/embedding/functions/rebuild-vectors.function.ts
|
|
872
|
+
var SECTION_SEPARATOR = "\n---\n";
|
|
873
|
+
function extractBody(raw) {
|
|
874
|
+
const sep = raw.indexOf(SECTION_SEPARATOR);
|
|
875
|
+
return sep >= 0 ? raw.slice(sep + SECTION_SEPARATOR.length) : raw;
|
|
876
|
+
}
|
|
877
|
+
function collectSections(sectionsDir) {
|
|
878
|
+
let shards;
|
|
879
|
+
try {
|
|
880
|
+
shards = readdirSync2(sectionsDir);
|
|
881
|
+
} catch {
|
|
882
|
+
return [];
|
|
883
|
+
}
|
|
884
|
+
const result = [];
|
|
885
|
+
for (const shard of shards) {
|
|
886
|
+
let files;
|
|
887
|
+
try {
|
|
888
|
+
files = readdirSync2(join5(sectionsDir, shard));
|
|
889
|
+
} catch {
|
|
890
|
+
continue;
|
|
891
|
+
}
|
|
892
|
+
for (const file of files) {
|
|
893
|
+
if (!file.endsWith(".section")) continue;
|
|
894
|
+
const kbid = file.slice(0, -8);
|
|
895
|
+
try {
|
|
896
|
+
const raw = readFileSync5(
|
|
897
|
+
join5(sectionsDir, shard, file),
|
|
898
|
+
"utf-8"
|
|
899
|
+
);
|
|
900
|
+
const body = extractBody(raw);
|
|
901
|
+
if (body.length > 0) {
|
|
902
|
+
result.push({ kbid, body });
|
|
903
|
+
}
|
|
904
|
+
} catch {
|
|
905
|
+
continue;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
return result;
|
|
910
|
+
}
|
|
911
|
+
async function rebuildVectors(targetDir, provider) {
|
|
912
|
+
log("rebuilding vectors", 0 /* DEBUG */);
|
|
913
|
+
if (provider.dimensions() === 0) {
|
|
914
|
+
return 0;
|
|
915
|
+
}
|
|
916
|
+
const sectionsDir = join5(targetDir, "sections");
|
|
917
|
+
if (!existsSync3(sectionsDir)) {
|
|
918
|
+
return 0;
|
|
919
|
+
}
|
|
920
|
+
const sections = collectSections(sectionsDir);
|
|
921
|
+
if (sections.length === 0) {
|
|
922
|
+
return 0;
|
|
923
|
+
}
|
|
924
|
+
const texts = sections.map((s) => s.body);
|
|
925
|
+
const vectors = await provider.embed(texts);
|
|
926
|
+
const entries = sections.map((s, i) => ({
|
|
927
|
+
kbid: s.kbid,
|
|
928
|
+
vector: vectors[i] ?? new Float32Array(provider.dimensions())
|
|
929
|
+
}));
|
|
930
|
+
await buildVectorIndex(
|
|
931
|
+
targetDir,
|
|
932
|
+
provider.modelName(),
|
|
933
|
+
provider.dimensions(),
|
|
934
|
+
entries
|
|
935
|
+
);
|
|
936
|
+
log(
|
|
937
|
+
"rebuilt " + sections.length.toString() + " vectors",
|
|
938
|
+
1 /* INFO */
|
|
939
|
+
);
|
|
940
|
+
return sections.length;
|
|
402
941
|
}
|
|
403
942
|
|
|
404
943
|
// src/shared/wasm-codec/functions/encode-string.function.ts
|
|
@@ -1218,7 +1757,9 @@ var WASM_METHOD_MAP = {
|
|
|
1218
1757
|
list_docs_by_type: "worker_list_docs_by_type",
|
|
1219
1758
|
recall: "worker_recall",
|
|
1220
1759
|
export: "worker_export",
|
|
1221
|
-
exportDb: "worker_export"
|
|
1760
|
+
exportDb: "worker_export",
|
|
1761
|
+
importDb: "worker_import",
|
|
1762
|
+
import_db: "worker_import"
|
|
1222
1763
|
};
|
|
1223
1764
|
var CONFIG_PREFIX = "config_";
|
|
1224
1765
|
var CONFIG_KEY_MAP = {
|
|
@@ -1227,7 +1768,7 @@ var CONFIG_KEY_MAP = {
|
|
|
1227
1768
|
item_limit: "itemLimit",
|
|
1228
1769
|
index_limit: "indexLimit"
|
|
1229
1770
|
};
|
|
1230
|
-
var
|
|
1771
|
+
var IpcError2 = class extends Error {
|
|
1231
1772
|
/** JSON-RPC error code. */
|
|
1232
1773
|
code;
|
|
1233
1774
|
constructor(code, message) {
|
|
@@ -1249,9 +1790,11 @@ var WorkerDaemon = class {
|
|
|
1249
1790
|
}
|
|
1250
1791
|
_connectionCount = 0;
|
|
1251
1792
|
_wasmModules = null;
|
|
1793
|
+
_embeddingProvider = null;
|
|
1252
1794
|
_idleAt = 0;
|
|
1253
1795
|
_idleTimer = null;
|
|
1254
1796
|
_server = null;
|
|
1797
|
+
_sockets = /* @__PURE__ */ new Set();
|
|
1255
1798
|
_wasmDir;
|
|
1256
1799
|
/** Queue of waiters for the single-writer lock. */
|
|
1257
1800
|
_writeQueue = [];
|
|
@@ -1287,7 +1830,11 @@ var WorkerDaemon = class {
|
|
|
1287
1830
|
* catches this, prints to stderr, and exits with code 1
|
|
1288
1831
|
*/
|
|
1289
1832
|
checkPreconditions() {
|
|
1290
|
-
if (!
|
|
1833
|
+
if (!existsSync4(this.targetDir)) {
|
|
1834
|
+
log(
|
|
1835
|
+
`database directory not found: ${this.targetDir}`,
|
|
1836
|
+
3 /* ERROR */
|
|
1837
|
+
);
|
|
1291
1838
|
throw new Error(
|
|
1292
1839
|
`database directory not found: ${this.targetDir}`
|
|
1293
1840
|
);
|
|
@@ -1298,9 +1845,9 @@ var WorkerDaemon = class {
|
|
|
1298
1845
|
constants.R_OK | constants.W_OK
|
|
1299
1846
|
);
|
|
1300
1847
|
} catch {
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
);
|
|
1848
|
+
const msg = `cannot access database directory: ${this.targetDir} -- permission denied`;
|
|
1849
|
+
log(msg, 3 /* ERROR */);
|
|
1850
|
+
throw new Error(msg);
|
|
1304
1851
|
}
|
|
1305
1852
|
this.checkCatalogVersion();
|
|
1306
1853
|
}
|
|
@@ -1316,34 +1863,69 @@ var WorkerDaemon = class {
|
|
|
1316
1863
|
* be created
|
|
1317
1864
|
*/
|
|
1318
1865
|
async start() {
|
|
1866
|
+
log(
|
|
1867
|
+
"start: loading wasm modules ctx=" + this.ctx,
|
|
1868
|
+
0 /* DEBUG */
|
|
1869
|
+
);
|
|
1319
1870
|
const wasmModules = await loadWasmModules(
|
|
1320
1871
|
this.config,
|
|
1321
1872
|
this._wasmDir
|
|
1322
1873
|
);
|
|
1323
1874
|
this._wasmModules = wasmModules;
|
|
1875
|
+
log("start: wasm modules loaded", 0 /* DEBUG */);
|
|
1876
|
+
this._embeddingProvider = createEmbeddingProvider(
|
|
1877
|
+
this.config.embedding,
|
|
1878
|
+
wasmModules.embedding
|
|
1879
|
+
);
|
|
1880
|
+
log(
|
|
1881
|
+
"start: embedding provider created embedding=" + (this.config.embedding?.provider ?? "none"),
|
|
1882
|
+
0 /* DEBUG */
|
|
1883
|
+
);
|
|
1324
1884
|
this.initWorkerContext();
|
|
1885
|
+
log("start: worker context initialized", 0 /* DEBUG */);
|
|
1325
1886
|
this.runStartupIntegrityCheck();
|
|
1326
|
-
|
|
1327
|
-
|
|
1887
|
+
log(
|
|
1888
|
+
"start: integrity check done ok=" + String(this._integrityOk),
|
|
1889
|
+
0 /* DEBUG */
|
|
1890
|
+
);
|
|
1328
1891
|
const ipcPath = getIpcPath(this.ctx);
|
|
1329
|
-
if (
|
|
1892
|
+
if (existsSync4(ipcPath)) {
|
|
1893
|
+
log("start: removing stale socket " + ipcPath, 0 /* DEBUG */);
|
|
1330
1894
|
try {
|
|
1331
1895
|
unlinkSync2(ipcPath);
|
|
1332
1896
|
} catch {
|
|
1333
1897
|
}
|
|
1334
1898
|
}
|
|
1335
1899
|
const handler = (req) => this.handleRequest(req);
|
|
1336
|
-
this._server = createIpcServer(ipcPath, handler);
|
|
1337
|
-
|
|
1900
|
+
this._server = await createIpcServer(ipcPath, handler);
|
|
1901
|
+
log("IPC server listening on " + ipcPath, 1 /* INFO */);
|
|
1902
|
+
this._server.on("connection", (socket) => {
|
|
1903
|
+
this._sockets.add(socket);
|
|
1338
1904
|
this.incrementConnections();
|
|
1339
1905
|
this.resetIdleTimer();
|
|
1906
|
+
log(
|
|
1907
|
+
"client connected (count: " + String(this._connectionCount) + ")",
|
|
1908
|
+
0 /* DEBUG */
|
|
1909
|
+
);
|
|
1910
|
+
socket.on("close", () => {
|
|
1911
|
+
this._sockets.delete(socket);
|
|
1912
|
+
this.decrementConnections();
|
|
1913
|
+
log(
|
|
1914
|
+
"client disconnected (count: " + String(this._connectionCount) + ")",
|
|
1915
|
+
0 /* DEBUG */
|
|
1916
|
+
);
|
|
1917
|
+
if (this._connectionCount === 0) {
|
|
1918
|
+
this.resetIdleTimer();
|
|
1919
|
+
}
|
|
1920
|
+
});
|
|
1340
1921
|
});
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1922
|
+
const pidPath = join6(tmpdir(), `kbdb-${this.ctx}.pid`);
|
|
1923
|
+
writeFileSync3(pidPath, process.pid.toString());
|
|
1924
|
+
log(
|
|
1925
|
+
"start: pid file written pid=" + String(process.pid),
|
|
1926
|
+
0 /* DEBUG */
|
|
1927
|
+
);
|
|
1928
|
+
log("start: daemon ready ctx=" + this.ctx, 0 /* DEBUG */);
|
|
1347
1929
|
this.resetIdleTimer();
|
|
1348
1930
|
}
|
|
1349
1931
|
/**
|
|
@@ -1354,30 +1936,44 @@ var WorkerDaemon = class {
|
|
|
1354
1936
|
* the process.
|
|
1355
1937
|
*/
|
|
1356
1938
|
stop() {
|
|
1939
|
+
log(
|
|
1940
|
+
"stop: entry sockets=" + String(this._sockets.size),
|
|
1941
|
+
0 /* DEBUG */
|
|
1942
|
+
);
|
|
1943
|
+
log("shutting down", 1 /* INFO */);
|
|
1357
1944
|
if (this._idleTimer !== null) {
|
|
1358
1945
|
clearTimeout(this._idleTimer);
|
|
1359
1946
|
this._idleTimer = null;
|
|
1360
1947
|
}
|
|
1948
|
+
for (const socket of this._sockets) {
|
|
1949
|
+
socket.destroy();
|
|
1950
|
+
}
|
|
1951
|
+
this._sockets.clear();
|
|
1361
1952
|
if (this._server !== null) {
|
|
1362
1953
|
this._server.close();
|
|
1363
1954
|
this._server = null;
|
|
1955
|
+
log("stop: server closed", 0 /* DEBUG */);
|
|
1364
1956
|
}
|
|
1365
1957
|
this._wasmModules = null;
|
|
1366
|
-
|
|
1958
|
+
log("stop: wasm resources released", 0 /* DEBUG */);
|
|
1959
|
+
const pidPath = join6(tmpdir(), `kbdb-${this.ctx}.pid`);
|
|
1367
1960
|
try {
|
|
1368
1961
|
unlinkSync2(pidPath);
|
|
1962
|
+
log("stop: pid file removed", 0 /* DEBUG */);
|
|
1369
1963
|
} catch {
|
|
1370
1964
|
}
|
|
1371
1965
|
const ipcPath = getIpcPath(this.ctx);
|
|
1372
1966
|
try {
|
|
1373
1967
|
unlinkSync2(ipcPath);
|
|
1968
|
+
log("stop: socket file removed", 0 /* DEBUG */);
|
|
1374
1969
|
} catch {
|
|
1375
1970
|
}
|
|
1376
|
-
const crashPath =
|
|
1971
|
+
const crashPath = join6(tmpdir(), `kbdb-${this.ctx}.crash`);
|
|
1377
1972
|
try {
|
|
1378
1973
|
unlinkSync2(crashPath);
|
|
1379
1974
|
} catch {
|
|
1380
1975
|
}
|
|
1976
|
+
log("stop: daemon exiting", 0 /* DEBUG */);
|
|
1381
1977
|
process.exit(0);
|
|
1382
1978
|
}
|
|
1383
1979
|
/**
|
|
@@ -1391,8 +1987,16 @@ var WorkerDaemon = class {
|
|
|
1391
1987
|
* @returns the JSON-RPC response
|
|
1392
1988
|
*/
|
|
1393
1989
|
async handleRequest(request) {
|
|
1990
|
+
log(
|
|
1991
|
+
"handle-request: method=" + request.method + " id=" + String(request.id),
|
|
1992
|
+
0 /* DEBUG */
|
|
1993
|
+
);
|
|
1394
1994
|
const params = request.params;
|
|
1395
1995
|
if (params === void 0 || params.ctx !== this.ctx) {
|
|
1996
|
+
log(
|
|
1997
|
+
"handle-request: context mismatch id=" + String(request.id),
|
|
1998
|
+
0 /* DEBUG */
|
|
1999
|
+
);
|
|
1396
2000
|
return this.errorResponse(
|
|
1397
2001
|
request.id,
|
|
1398
2002
|
-32001,
|
|
@@ -1403,6 +2007,10 @@ var WorkerDaemon = class {
|
|
|
1403
2007
|
try {
|
|
1404
2008
|
const result = await this.dispatch(request.method, params);
|
|
1405
2009
|
this._idleAt = Math.floor(Date.now() / 1e3);
|
|
2010
|
+
log(
|
|
2011
|
+
"handle-request: success method=" + request.method + " id=" + String(request.id),
|
|
2012
|
+
0 /* DEBUG */
|
|
2013
|
+
);
|
|
1406
2014
|
return {
|
|
1407
2015
|
jsonrpc: "2.0",
|
|
1408
2016
|
id: request.id,
|
|
@@ -1410,7 +2018,11 @@ var WorkerDaemon = class {
|
|
|
1410
2018
|
};
|
|
1411
2019
|
} catch (err) {
|
|
1412
2020
|
this._idleAt = Math.floor(Date.now() / 1e3);
|
|
1413
|
-
if (err instanceof
|
|
2021
|
+
if (err instanceof IpcError2) {
|
|
2022
|
+
log(
|
|
2023
|
+
"handle-request: ipc error method=" + request.method + " id=" + String(request.id) + " code=" + String(err.code),
|
|
2024
|
+
0 /* DEBUG */
|
|
2025
|
+
);
|
|
1414
2026
|
return this.errorResponse(
|
|
1415
2027
|
request.id,
|
|
1416
2028
|
err.code,
|
|
@@ -1418,6 +2030,10 @@ var WorkerDaemon = class {
|
|
|
1418
2030
|
);
|
|
1419
2031
|
}
|
|
1420
2032
|
const message = err instanceof Error ? err.message : String(err);
|
|
2033
|
+
log(
|
|
2034
|
+
"handle-request: error method=" + request.method + " id=" + String(request.id),
|
|
2035
|
+
0 /* DEBUG */
|
|
2036
|
+
);
|
|
1421
2037
|
return this.errorResponse(request.id, -32e3, message);
|
|
1422
2038
|
}
|
|
1423
2039
|
}
|
|
@@ -1461,37 +2077,45 @@ var WorkerDaemon = class {
|
|
|
1461
2077
|
clearTimeout(this._idleTimer);
|
|
1462
2078
|
}
|
|
1463
2079
|
if (this._connectionCount === 0) {
|
|
2080
|
+
log(
|
|
2081
|
+
"idle timer started (" + String(this.config.timeoutMs) + "ms)",
|
|
2082
|
+
0 /* DEBUG */
|
|
2083
|
+
);
|
|
1464
2084
|
this._idleTimer = setTimeout(() => {
|
|
2085
|
+
log(
|
|
2086
|
+
"idle timer fired: shutting down ctx=" + this.ctx,
|
|
2087
|
+
0 /* DEBUG */
|
|
2088
|
+
);
|
|
1465
2089
|
this.stop();
|
|
1466
2090
|
}, this.config.timeoutMs);
|
|
1467
2091
|
}
|
|
1468
2092
|
}
|
|
1469
2093
|
/** Reads catalog.toml and validates the version field. */
|
|
1470
2094
|
checkCatalogVersion() {
|
|
1471
|
-
const catalogPath =
|
|
2095
|
+
const catalogPath = join6(this.targetDir, "catalog.toml");
|
|
1472
2096
|
let text;
|
|
1473
2097
|
try {
|
|
1474
|
-
text =
|
|
2098
|
+
text = readFileSync6(catalogPath, "utf-8");
|
|
1475
2099
|
} catch {
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
);
|
|
2100
|
+
const msg = `cannot read database directory: ${this.targetDir} -- permission denied`;
|
|
2101
|
+
log(msg, 3 /* ERROR */);
|
|
2102
|
+
throw new Error(msg);
|
|
1479
2103
|
}
|
|
1480
2104
|
const version = parseCatalogVersion(text);
|
|
1481
2105
|
if (version === null) {
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
);
|
|
2106
|
+
const msg = "database version 0 requires migration to version " + String(DB_FORMAT_VERSION) + " -- run `kbdb --migrate` before starting the daemon";
|
|
2107
|
+
log(msg, 3 /* ERROR */);
|
|
2108
|
+
throw new Error(msg);
|
|
1485
2109
|
}
|
|
1486
2110
|
if (version > DB_FORMAT_VERSION) {
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
);
|
|
2111
|
+
const msg = "database version " + String(version) + " is newer than kbdb version " + String(DB_FORMAT_VERSION) + " -- upgrade kbdb to open this database";
|
|
2112
|
+
log(msg, 3 /* ERROR */);
|
|
2113
|
+
throw new Error(msg);
|
|
1490
2114
|
}
|
|
1491
2115
|
if (version < DB_FORMAT_VERSION) {
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
);
|
|
2116
|
+
const msg = "database version " + String(version) + " requires migration to version " + String(DB_FORMAT_VERSION) + " -- run `kbdb --migrate` before starting the daemon";
|
|
2117
|
+
log(msg, 3 /* ERROR */);
|
|
2118
|
+
throw new Error(msg);
|
|
1495
2119
|
}
|
|
1496
2120
|
}
|
|
1497
2121
|
/** Builds a JSON-RPC error response. */
|
|
@@ -1530,7 +2154,7 @@ var WorkerDaemon = class {
|
|
|
1530
2154
|
if (wasmMethod !== void 0) {
|
|
1531
2155
|
return this.dispatchWasm(method, wasmMethod, params);
|
|
1532
2156
|
}
|
|
1533
|
-
throw new
|
|
2157
|
+
throw new IpcError2(-32601, `Method not found: ${method}`);
|
|
1534
2158
|
}
|
|
1535
2159
|
async dispatchWasm(method, wasmExport, params) {
|
|
1536
2160
|
if (method === "search" || method === "query") {
|
|
@@ -1596,13 +2220,16 @@ var WorkerDaemon = class {
|
|
|
1596
2220
|
return this.handleGc();
|
|
1597
2221
|
}
|
|
1598
2222
|
if (method === "rebuildIndexes" || method === "rebuild_indexes") {
|
|
1599
|
-
return this.handleRebuild();
|
|
2223
|
+
return await this.handleRebuild();
|
|
1600
2224
|
}
|
|
1601
2225
|
if (method === "initDirectory" || method === "init_directory") {
|
|
1602
2226
|
return this.handleInitDirectory(params);
|
|
1603
2227
|
}
|
|
2228
|
+
if (method === "importDb" || method === "import_db") {
|
|
2229
|
+
return await this.handleImport(params);
|
|
2230
|
+
}
|
|
1604
2231
|
if (method === "migrateDatabase") {
|
|
1605
|
-
throw new
|
|
2232
|
+
throw new IpcError2(
|
|
1606
2233
|
-32601,
|
|
1607
2234
|
"migrateDatabase is not yet supported"
|
|
1608
2235
|
);
|
|
@@ -1613,12 +2240,25 @@ var WorkerDaemon = class {
|
|
|
1613
2240
|
}
|
|
1614
2241
|
}
|
|
1615
2242
|
// -- Search/query (token-based async) --
|
|
1616
|
-
handleSearch(params) {
|
|
2243
|
+
async handleSearch(params) {
|
|
1617
2244
|
const query = params["query"] ?? "";
|
|
1618
2245
|
const mode = params["mode"] ?? "and";
|
|
1619
2246
|
const limit = Number(params["limit"] ?? 20);
|
|
1620
2247
|
const offset = Number(params["offset"] ?? 0);
|
|
2248
|
+
const algo = params["algo"] ?? "lexical";
|
|
1621
2249
|
const encoded = encodeSearchParams(query, mode, limit, offset);
|
|
2250
|
+
const start = Date.now();
|
|
2251
|
+
const lexical = this.runLexicalSearch(encoded);
|
|
2252
|
+
const fused = await fuseSearchResults(
|
|
2253
|
+
lexical,
|
|
2254
|
+
algo,
|
|
2255
|
+
query,
|
|
2256
|
+
this._embeddingProvider ?? void 0,
|
|
2257
|
+
this.targetDir
|
|
2258
|
+
);
|
|
2259
|
+
return { ...fused, elapsed_ms: Date.now() - start };
|
|
2260
|
+
}
|
|
2261
|
+
runLexicalSearch(encoded) {
|
|
1622
2262
|
const searchFn = this.getExport("worker_search");
|
|
1623
2263
|
const ptr = this.wasmAlloc(encoded.length);
|
|
1624
2264
|
this.wasmWrite(ptr, encoded);
|
|
@@ -1627,20 +2267,17 @@ var WorkerDaemon = class {
|
|
|
1627
2267
|
const statusFn = this.getExport("worker_result_status");
|
|
1628
2268
|
const status = statusFn(token);
|
|
1629
2269
|
if (status === 3) {
|
|
1630
|
-
|
|
1631
|
-
getResultFn2(token);
|
|
2270
|
+
this.getExport("worker_get_result")(token);
|
|
1632
2271
|
const errBytes = this.readReturnSlot();
|
|
1633
|
-
|
|
1634
|
-
throw new IpcError(-32e3, errMsg);
|
|
2272
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1635
2273
|
}
|
|
1636
2274
|
const getResultFn = this.getExport("worker_get_result");
|
|
1637
2275
|
const rc = getResultFn(token);
|
|
1638
2276
|
if (rc === -1) {
|
|
1639
2277
|
const errBytes = this.readReturnSlot();
|
|
1640
|
-
throw new
|
|
2278
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1641
2279
|
}
|
|
1642
|
-
|
|
1643
|
-
return decodePagedSearchResult(resultBytes);
|
|
2280
|
+
return decodePagedSearchResult(this.readReturnSlot());
|
|
1644
2281
|
}
|
|
1645
2282
|
// -- Token status/result (u32 direct params) --
|
|
1646
2283
|
handleResultStatus(params) {
|
|
@@ -1655,7 +2292,7 @@ var WorkerDaemon = class {
|
|
|
1655
2292
|
const rc = fn(token);
|
|
1656
2293
|
if (rc === -1) {
|
|
1657
2294
|
const errBytes = this.readReturnSlot();
|
|
1658
|
-
throw new
|
|
2295
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1659
2296
|
}
|
|
1660
2297
|
const bytes = this.readReturnSlot();
|
|
1661
2298
|
return decodePagedSearchResult(bytes);
|
|
@@ -1682,7 +2319,11 @@ var WorkerDaemon = class {
|
|
|
1682
2319
|
const encoded = encodeAddSectionParams(input);
|
|
1683
2320
|
const bytes = this.callWasmSync("worker_add_section", encoded);
|
|
1684
2321
|
const decoded = decodeAddSectionResult(bytes);
|
|
1685
|
-
const
|
|
2322
|
+
const wasmDups = decoded.nearDuplicates;
|
|
2323
|
+
const tsDups = wasmDups.length > 0 ? [] : this.scanNearDuplicates(input.content, decoded.kbid);
|
|
2324
|
+
const nearDups = (wasmDups.length > 0 ? wasmDups : tsDups).map(
|
|
2325
|
+
(d) => ({ ...d, method: "jaccard" })
|
|
2326
|
+
);
|
|
1686
2327
|
return {
|
|
1687
2328
|
kbid: decoded.kbid,
|
|
1688
2329
|
indexed_terms_count: decoded.indexedTermsCount,
|
|
@@ -1771,7 +2412,7 @@ var WorkerDaemon = class {
|
|
|
1771
2412
|
this.wasmFree(ptr, encoded.length);
|
|
1772
2413
|
if (rc === -1) {
|
|
1773
2414
|
const errBytes = this.readReturnSlot();
|
|
1774
|
-
throw new
|
|
2415
|
+
throw new IpcError2(
|
|
1775
2416
|
-32e3,
|
|
1776
2417
|
new TextDecoder().decode(errBytes) || "invalidate failed"
|
|
1777
2418
|
);
|
|
@@ -1810,7 +2451,12 @@ var WorkerDaemon = class {
|
|
|
1810
2451
|
this.callWasmZeroArg("worker_status");
|
|
1811
2452
|
const bytes = this.readReturnSlot();
|
|
1812
2453
|
const text = new TextDecoder().decode(bytes);
|
|
1813
|
-
|
|
2454
|
+
const kv = decodeKeyValueText(text);
|
|
2455
|
+
const mem = this._wasmModules?.memory;
|
|
2456
|
+
if (mem) {
|
|
2457
|
+
kv["wasm_memory_bytes"] = String(mem.buffer.byteLength);
|
|
2458
|
+
}
|
|
2459
|
+
return kv;
|
|
1814
2460
|
}
|
|
1815
2461
|
handleIntegrityCheck() {
|
|
1816
2462
|
this.callWasmZeroArg("worker_check_integrity");
|
|
@@ -1833,13 +2479,13 @@ var WorkerDaemon = class {
|
|
|
1833
2479
|
stale_sources: staleSources
|
|
1834
2480
|
};
|
|
1835
2481
|
}
|
|
1836
|
-
handleRebuild() {
|
|
2482
|
+
async handleRebuild() {
|
|
1837
2483
|
const fn = this.getExport("worker_rebuild_indexes");
|
|
1838
2484
|
const rc = fn();
|
|
1839
2485
|
if (rc === -1) {
|
|
1840
2486
|
const errBytes = this.readReturnSlot();
|
|
1841
2487
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
1842
|
-
throw new
|
|
2488
|
+
throw new IpcError2(-32e3, errMsg || "rebuild failed");
|
|
1843
2489
|
}
|
|
1844
2490
|
const resultBytes = this.readReturnSlot();
|
|
1845
2491
|
const reindexed = resultBytes.length >= 4 ? new DataView(
|
|
@@ -1847,7 +2493,18 @@ var WorkerDaemon = class {
|
|
|
1847
2493
|
resultBytes.byteOffset,
|
|
1848
2494
|
resultBytes.byteLength
|
|
1849
2495
|
).getUint32(0, true) : 0;
|
|
1850
|
-
|
|
2496
|
+
let vectorsRebuilt = 0;
|
|
2497
|
+
if (this._embeddingProvider !== null) {
|
|
2498
|
+
vectorsRebuilt = await rebuildVectors(
|
|
2499
|
+
this.targetDir,
|
|
2500
|
+
this._embeddingProvider
|
|
2501
|
+
);
|
|
2502
|
+
}
|
|
2503
|
+
return {
|
|
2504
|
+
ok: true,
|
|
2505
|
+
sections_reindexed: reindexed,
|
|
2506
|
+
vectors_rebuilt: vectorsRebuilt
|
|
2507
|
+
};
|
|
1851
2508
|
}
|
|
1852
2509
|
// -- Export (read operation, no lock required) --
|
|
1853
2510
|
handleExport(params) {
|
|
@@ -1865,14 +2522,57 @@ var WorkerDaemon = class {
|
|
|
1865
2522
|
elapsed_ms: elapsed
|
|
1866
2523
|
};
|
|
1867
2524
|
}
|
|
2525
|
+
async handleImport(params) {
|
|
2526
|
+
const sourcePath = params["sourcePath"] ?? "";
|
|
2527
|
+
const dryRun = params["dryRun"] === true;
|
|
2528
|
+
const start = Date.now();
|
|
2529
|
+
const sectionCount = this.countFiles(
|
|
2530
|
+
join6(sourcePath, "sections"),
|
|
2531
|
+
".section"
|
|
2532
|
+
);
|
|
2533
|
+
const documentCount = this.countFiles(
|
|
2534
|
+
join6(sourcePath, "documents"),
|
|
2535
|
+
".toml"
|
|
2536
|
+
);
|
|
2537
|
+
let rebuilt = false;
|
|
2538
|
+
if (!dryRun && sectionCount > 0) {
|
|
2539
|
+
await this.handleRebuild();
|
|
2540
|
+
rebuilt = true;
|
|
2541
|
+
}
|
|
2542
|
+
return {
|
|
2543
|
+
sections_imported: sectionCount,
|
|
2544
|
+
documents_imported: documentCount,
|
|
2545
|
+
rebuilt,
|
|
2546
|
+
dry_run: dryRun,
|
|
2547
|
+
elapsed_ms: Date.now() - start
|
|
2548
|
+
};
|
|
2549
|
+
}
|
|
2550
|
+
countFiles(dir, ext) {
|
|
2551
|
+
if (!existsSync4(dir)) return 0;
|
|
2552
|
+
return this.collectFiles(dir, ext).length;
|
|
2553
|
+
}
|
|
2554
|
+
collectFiles(dir, ext) {
|
|
2555
|
+
const result = [];
|
|
2556
|
+
for (const entry of readdirSync3(dir, {
|
|
2557
|
+
withFileTypes: true
|
|
2558
|
+
})) {
|
|
2559
|
+
const full = join6(dir, entry.name);
|
|
2560
|
+
if (entry.isDirectory()) {
|
|
2561
|
+
result.push(...this.collectFiles(full, ext));
|
|
2562
|
+
} else if (entry.name.endsWith(ext)) {
|
|
2563
|
+
result.push(full);
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
return result;
|
|
2567
|
+
}
|
|
1868
2568
|
// -- Near-duplicate detection --
|
|
1869
2569
|
scanNearDuplicates(content, newKbid) {
|
|
1870
2570
|
const newTerms = this.extractTermSet(content);
|
|
1871
2571
|
if (newTerms.size === 0) return [];
|
|
1872
|
-
const sectionsDir =
|
|
2572
|
+
const sectionsDir = join6(this.targetDir, "sections");
|
|
1873
2573
|
let shards;
|
|
1874
2574
|
try {
|
|
1875
|
-
shards =
|
|
2575
|
+
shards = readdirSync3(sectionsDir);
|
|
1876
2576
|
} catch {
|
|
1877
2577
|
return [];
|
|
1878
2578
|
}
|
|
@@ -1880,7 +2580,7 @@ var WorkerDaemon = class {
|
|
|
1880
2580
|
for (const shard of shards) {
|
|
1881
2581
|
let files;
|
|
1882
2582
|
try {
|
|
1883
|
-
files =
|
|
2583
|
+
files = readdirSync3(join6(sectionsDir, shard));
|
|
1884
2584
|
} catch {
|
|
1885
2585
|
continue;
|
|
1886
2586
|
}
|
|
@@ -1889,8 +2589,8 @@ var WorkerDaemon = class {
|
|
|
1889
2589
|
const kbid = file.slice(0, -8);
|
|
1890
2590
|
if (kbid === newKbid) continue;
|
|
1891
2591
|
try {
|
|
1892
|
-
const data =
|
|
1893
|
-
|
|
2592
|
+
const data = readFileSync6(
|
|
2593
|
+
join6(sectionsDir, shard, file),
|
|
1894
2594
|
"utf-8"
|
|
1895
2595
|
);
|
|
1896
2596
|
const sep = data.indexOf("\n---\n");
|
|
@@ -1931,8 +2631,13 @@ var WorkerDaemon = class {
|
|
|
1931
2631
|
acquireWriteLock() {
|
|
1932
2632
|
if (!this._writeLocked) {
|
|
1933
2633
|
this._writeLocked = true;
|
|
2634
|
+
log("write-lock: acquired", 0 /* DEBUG */);
|
|
1934
2635
|
return Promise.resolve();
|
|
1935
2636
|
}
|
|
2637
|
+
log(
|
|
2638
|
+
"write-lock: queued depth=" + String(this._writeQueue.length + 1),
|
|
2639
|
+
0 /* DEBUG */
|
|
2640
|
+
);
|
|
1936
2641
|
return new Promise((resolve2) => {
|
|
1937
2642
|
this._writeQueue.push({ resolve: resolve2 });
|
|
1938
2643
|
});
|
|
@@ -1946,9 +2651,14 @@ var WorkerDaemon = class {
|
|
|
1946
2651
|
releaseWriteLock() {
|
|
1947
2652
|
const next = this._writeQueue.shift();
|
|
1948
2653
|
if (next !== void 0) {
|
|
2654
|
+
log(
|
|
2655
|
+
"write-lock: released to next waiter depth=" + String(this._writeQueue.length),
|
|
2656
|
+
0 /* DEBUG */
|
|
2657
|
+
);
|
|
1949
2658
|
next.resolve();
|
|
1950
2659
|
} else {
|
|
1951
2660
|
this._writeLocked = false;
|
|
2661
|
+
log("write-lock: released", 0 /* DEBUG */);
|
|
1952
2662
|
}
|
|
1953
2663
|
}
|
|
1954
2664
|
// -- WASM lifecycle --
|
|
@@ -1973,26 +2683,29 @@ var WorkerDaemon = class {
|
|
|
1973
2683
|
this._integrityOk = kv["ok"] === "true";
|
|
1974
2684
|
if (!this._integrityOk) {
|
|
1975
2685
|
this._integrityErrors = Object.entries(kv).filter(([k]) => k !== "ok").map(([k, v]) => `${k}=${v}`);
|
|
1976
|
-
|
|
1977
|
-
"[kbdb-worker] startup integrity check failed:",
|
|
1978
|
-
|
|
2686
|
+
log(
|
|
2687
|
+
"[kbdb-worker] startup integrity check failed: " + this._integrityErrors.join(", "),
|
|
2688
|
+
2 /* WARNING */
|
|
1979
2689
|
);
|
|
1980
2690
|
}
|
|
1981
2691
|
} catch {
|
|
1982
2692
|
this._integrityOk = false;
|
|
1983
2693
|
this._integrityErrors = ["integrity_check_failed"];
|
|
1984
|
-
|
|
1985
|
-
"[kbdb-worker] startup integrity check threw an error"
|
|
2694
|
+
log(
|
|
2695
|
+
"[kbdb-worker] startup integrity check threw an error",
|
|
2696
|
+
2 /* WARNING */
|
|
1986
2697
|
);
|
|
1987
2698
|
}
|
|
1988
2699
|
}
|
|
1989
2700
|
// -- WASM bridge primitives --
|
|
1990
2701
|
getExport(name) {
|
|
1991
2702
|
if (this._wasmModules === null) {
|
|
2703
|
+
log("WASM modules not loaded", 3 /* ERROR */);
|
|
1992
2704
|
throw new Error("WASM modules not loaded");
|
|
1993
2705
|
}
|
|
1994
2706
|
const fn = this._wasmModules.kbWorker.exports[name];
|
|
1995
2707
|
if (typeof fn !== "function") {
|
|
2708
|
+
log(`WASM export not found: ${name}`, 3 /* ERROR */);
|
|
1996
2709
|
throw new Error(`WASM export not found: ${name}`);
|
|
1997
2710
|
}
|
|
1998
2711
|
return fn;
|
|
@@ -2016,6 +2729,7 @@ var WorkerDaemon = class {
|
|
|
2016
2729
|
if (!memory) return;
|
|
2017
2730
|
const memView = new Uint8Array(memory.buffer);
|
|
2018
2731
|
if (ptr + data.length > memView.length) {
|
|
2732
|
+
log("WASM memory overflow", 3 /* ERROR */);
|
|
2019
2733
|
throw new Error("WASM memory overflow");
|
|
2020
2734
|
}
|
|
2021
2735
|
memView.set(data, ptr);
|
|
@@ -2046,7 +2760,7 @@ var WorkerDaemon = class {
|
|
|
2046
2760
|
if (rc === -1) {
|
|
2047
2761
|
const errBytes = this.readReturnSlot();
|
|
2048
2762
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
2049
|
-
throw new
|
|
2763
|
+
throw new IpcError2(-32e3, errMsg || exportName + " failed");
|
|
2050
2764
|
}
|
|
2051
2765
|
return this.readReturnSlot();
|
|
2052
2766
|
}
|
|
@@ -2056,7 +2770,7 @@ var WorkerDaemon = class {
|
|
|
2056
2770
|
if (rc === -1) {
|
|
2057
2771
|
const errBytes = this.readReturnSlot();
|
|
2058
2772
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
2059
|
-
throw new
|
|
2773
|
+
throw new IpcError2(-32e3, errMsg || exportName + " failed");
|
|
2060
2774
|
}
|
|
2061
2775
|
}
|
|
2062
2776
|
invokeWasmRaw(exportName, input) {
|
|
@@ -2064,10 +2778,10 @@ var WorkerDaemon = class {
|
|
|
2064
2778
|
}
|
|
2065
2779
|
handleCheckVersion(params) {
|
|
2066
2780
|
const targetPath = typeof params.targetPath === "string" ? params.targetPath : this.targetDir;
|
|
2067
|
-
const catalogPath =
|
|
2781
|
+
const catalogPath = join6(targetPath, "catalog.toml");
|
|
2068
2782
|
let text;
|
|
2069
2783
|
try {
|
|
2070
|
-
text =
|
|
2784
|
+
text = readFileSync6(catalogPath, "utf-8");
|
|
2071
2785
|
} catch {
|
|
2072
2786
|
return {
|
|
2073
2787
|
status: "needs_migration",
|
|
@@ -2108,7 +2822,7 @@ var WorkerDaemon = class {
|
|
|
2108
2822
|
const key = method.slice(CONFIG_PREFIX.length);
|
|
2109
2823
|
const prop = CONFIG_KEY_MAP[key];
|
|
2110
2824
|
if (prop === void 0) {
|
|
2111
|
-
throw new
|
|
2825
|
+
throw new IpcError2(-32601, `Method not found: ${method}`);
|
|
2112
2826
|
}
|
|
2113
2827
|
return this.config[prop];
|
|
2114
2828
|
}
|
|
@@ -2127,9 +2841,18 @@ function parseCatalogVersion(text) {
|
|
|
2127
2841
|
|
|
2128
2842
|
// src/shared/worker-daemon/functions/start-daemon.function.ts
|
|
2129
2843
|
async function startDaemon(contextPath, wasmDir2) {
|
|
2844
|
+
log(
|
|
2845
|
+
"start-daemon: entry contextPath=" + contextPath,
|
|
2846
|
+
0 /* DEBUG */
|
|
2847
|
+
);
|
|
2130
2848
|
const config = readConfig(contextPath);
|
|
2849
|
+
log(
|
|
2850
|
+
"start-daemon: config loaded timeoutMs=" + String(config.timeoutMs) + " embedding=" + (config.embedding?.provider ?? "none"),
|
|
2851
|
+
0 /* DEBUG */
|
|
2852
|
+
);
|
|
2131
2853
|
const hash = await computeSha256(contextPath);
|
|
2132
2854
|
const contextId = hash.slice(0, 16);
|
|
2855
|
+
log("start-daemon: contextId=" + contextId, 0 /* DEBUG */);
|
|
2133
2856
|
const daemon = new WorkerDaemon(
|
|
2134
2857
|
contextId,
|
|
2135
2858
|
contextPath,
|
|
@@ -2140,44 +2863,52 @@ async function startDaemon(contextPath, wasmDir2) {
|
|
|
2140
2863
|
daemon.checkPreconditions();
|
|
2141
2864
|
} catch (err) {
|
|
2142
2865
|
const message = err instanceof Error ? err.message : String(err);
|
|
2143
|
-
|
|
2866
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
2144
2867
|
writeCrashLog(contextId, message);
|
|
2145
2868
|
process.exit(1);
|
|
2146
2869
|
}
|
|
2870
|
+
log("preconditions passed", 0 /* DEBUG */);
|
|
2147
2871
|
try {
|
|
2148
2872
|
await daemon.start();
|
|
2149
2873
|
} catch (err) {
|
|
2150
2874
|
const message = err instanceof Error ? err.message : String(err);
|
|
2151
|
-
|
|
2875
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
2152
2876
|
writeCrashLog(contextId, message);
|
|
2153
2877
|
process.exit(1);
|
|
2154
2878
|
}
|
|
2879
|
+
log("daemon started", 1 /* INFO */);
|
|
2880
|
+
log(
|
|
2881
|
+
"start-daemon: registering SIGTERM/SIGINT handlers",
|
|
2882
|
+
0 /* DEBUG */
|
|
2883
|
+
);
|
|
2155
2884
|
process.on("SIGTERM", () => {
|
|
2885
|
+
log("start-daemon: SIGTERM received", 0 /* DEBUG */);
|
|
2156
2886
|
daemon.stop();
|
|
2157
2887
|
});
|
|
2158
2888
|
process.on("SIGINT", () => {
|
|
2889
|
+
log("start-daemon: SIGINT received", 0 /* DEBUG */);
|
|
2159
2890
|
daemon.stop();
|
|
2160
2891
|
});
|
|
2161
2892
|
}
|
|
2162
2893
|
function writeCrashLog(contextId, message) {
|
|
2163
2894
|
try {
|
|
2164
|
-
const crashPath =
|
|
2895
|
+
const crashPath = join7(tmpdir2(), `kbdb-${contextId}.crash`);
|
|
2165
2896
|
const payload = JSON.stringify({
|
|
2166
2897
|
error: message,
|
|
2167
2898
|
timestamp: Date.now()
|
|
2168
2899
|
});
|
|
2169
|
-
|
|
2900
|
+
writeFileSync4(crashPath, payload);
|
|
2170
2901
|
} catch {
|
|
2171
2902
|
}
|
|
2172
2903
|
}
|
|
2173
2904
|
|
|
2174
2905
|
// src/shared/worker-daemon/functions/run-worker.function.ts
|
|
2175
2906
|
import { resolve } from "node:path";
|
|
2176
|
-
async function runWorker(
|
|
2177
|
-
const contextPath =
|
|
2907
|
+
async function runWorker(argv2, deps) {
|
|
2908
|
+
const { contextPath, logLevel } = parseWorkerArgs(argv2);
|
|
2178
2909
|
if (!contextPath) {
|
|
2179
2910
|
return {
|
|
2180
|
-
error: "usage: kbdb-worker <context-path>",
|
|
2911
|
+
error: "usage: kbdb-worker <context-path> [--log-level <level>]",
|
|
2181
2912
|
exitCode: 1
|
|
2182
2913
|
};
|
|
2183
2914
|
}
|
|
@@ -2189,27 +2920,52 @@ async function runWorker(argv, deps) {
|
|
|
2189
2920
|
};
|
|
2190
2921
|
}
|
|
2191
2922
|
await deps.startDaemon(resolved, deps.wasmDir);
|
|
2192
|
-
return { exitCode: 0 };
|
|
2923
|
+
return { exitCode: 0, logLevel };
|
|
2924
|
+
}
|
|
2925
|
+
function parseWorkerArgs(argv2) {
|
|
2926
|
+
let contextPath;
|
|
2927
|
+
let logLevel;
|
|
2928
|
+
for (let i = 0; i < argv2.length; i++) {
|
|
2929
|
+
if (argv2[i] === "--log-level" && argv2[i + 1]) {
|
|
2930
|
+
logLevel = parseLogLevel(argv2[++i]);
|
|
2931
|
+
} else if (!contextPath) {
|
|
2932
|
+
contextPath = argv2[i];
|
|
2933
|
+
}
|
|
2934
|
+
}
|
|
2935
|
+
return { contextPath, logLevel };
|
|
2193
2936
|
}
|
|
2194
2937
|
|
|
2195
2938
|
// src/worker.ts
|
|
2196
2939
|
var baseDir = resolveBaseDir(import.meta.url, import.meta.dirname);
|
|
2197
2940
|
var wasmDir = resolveWasmDir(baseDir.scriptDir);
|
|
2941
|
+
var argv = getArgs();
|
|
2942
|
+
var cliLogLevel = extractLogLevel(argv);
|
|
2943
|
+
configureLog({ level: resolveLogLevel(cliLogLevel) });
|
|
2944
|
+
log("daemon process starting", 0 /* DEBUG */);
|
|
2198
2945
|
async function main() {
|
|
2199
|
-
const result = await runWorker(
|
|
2200
|
-
existsSync:
|
|
2946
|
+
const result = await runWorker(argv, {
|
|
2947
|
+
existsSync: existsSync5,
|
|
2201
2948
|
startDaemon,
|
|
2202
2949
|
wasmDir
|
|
2203
2950
|
});
|
|
2204
2951
|
if (result.error) {
|
|
2205
|
-
|
|
2952
|
+
log(result.error, 3 /* ERROR */);
|
|
2206
2953
|
}
|
|
2207
2954
|
if (result.exitCode !== 0) {
|
|
2208
2955
|
process.exitCode = result.exitCode;
|
|
2209
2956
|
}
|
|
2210
2957
|
}
|
|
2211
2958
|
main().catch((err) => {
|
|
2212
|
-
|
|
2959
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
2960
|
+
log(msg, 3 /* ERROR */);
|
|
2213
2961
|
process.exitCode = 1;
|
|
2214
2962
|
});
|
|
2963
|
+
function extractLogLevel(args) {
|
|
2964
|
+
for (let i = 0; i < args.length; i++) {
|
|
2965
|
+
if (args[i] === "--log-level" && args[i + 1]) {
|
|
2966
|
+
return parseLogLevel(args[i + 1]);
|
|
2967
|
+
}
|
|
2968
|
+
}
|
|
2969
|
+
return void 0;
|
|
2970
|
+
}
|
|
2215
2971
|
//# sourceMappingURL=worker.mjs.map
|