@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/kbdb-worker.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
|
|
4
4
|
// src/worker.ts
|
|
5
|
-
var
|
|
5
|
+
var import_node_fs10 = require("node:fs");
|
|
6
6
|
|
|
7
7
|
// src/shared/runtime/functions/detect-runtime.ts
|
|
8
8
|
function detectRuntime() {
|
|
@@ -66,62 +66,139 @@ var DEFAULT_ITEM_TTL_MS = 6e4;
|
|
|
66
66
|
var WORKER_TOML_FILENAME = "worker.toml";
|
|
67
67
|
var DB_FORMAT_VERSION = 1;
|
|
68
68
|
|
|
69
|
-
// src/shared/worker-daemon/functions/
|
|
70
|
-
function
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
69
|
+
// src/shared/worker-daemon/functions/parse-embedding-section.function.ts
|
|
70
|
+
function parseEmbeddingSection(entries) {
|
|
71
|
+
const provider = entries.get("provider");
|
|
72
|
+
if (!provider) {
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
const model = entries.get("model");
|
|
76
|
+
const endpoint = entries.get("endpoint");
|
|
77
|
+
const dimensionsRaw = entries.get("dimensions");
|
|
78
|
+
const dimensions = dimensionsRaw ? parseInt(dimensionsRaw, 10) || void 0 : void 0;
|
|
79
|
+
return {
|
|
80
|
+
provider,
|
|
81
|
+
...model !== void 0 ? { model } : {},
|
|
82
|
+
...endpoint !== void 0 ? { endpoint } : {},
|
|
83
|
+
...dimensions !== void 0 ? { dimensions } : {}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/shared/auto-capture/constants/auto-capture-defaults.constant.ts
|
|
88
|
+
var AUTO_CAPTURE_DEFAULTS = {
|
|
89
|
+
enabled: false,
|
|
90
|
+
triggerAfterToolCalls: 5,
|
|
91
|
+
minIntervalMs: 6e4,
|
|
92
|
+
maxCapturesPerSession: 10,
|
|
93
|
+
dryRun: false
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts
|
|
97
|
+
function parseAutoCaptureSection(entries) {
|
|
98
|
+
const enabled = entries.has("enabled") ? entries.get("enabled") === "true" : AUTO_CAPTURE_DEFAULTS.enabled;
|
|
99
|
+
const dryRun = entries.has("dry_run") ? entries.get("dry_run") === "true" : AUTO_CAPTURE_DEFAULTS.dryRun;
|
|
100
|
+
const triggerRaw = entries.get("trigger_after_tool_calls");
|
|
101
|
+
const triggerAfterToolCalls = triggerRaw ? parseInt(triggerRaw, 10) || AUTO_CAPTURE_DEFAULTS.triggerAfterToolCalls : AUTO_CAPTURE_DEFAULTS.triggerAfterToolCalls;
|
|
102
|
+
const intervalRaw = entries.get("min_interval_ms");
|
|
103
|
+
const minIntervalMs = intervalRaw ? parseInt(intervalRaw, 10) || AUTO_CAPTURE_DEFAULTS.minIntervalMs : AUTO_CAPTURE_DEFAULTS.minIntervalMs;
|
|
104
|
+
const capRaw = entries.get("max_captures_per_session");
|
|
105
|
+
const maxCapturesPerSession = capRaw ? parseInt(capRaw, 10) || AUTO_CAPTURE_DEFAULTS.maxCapturesPerSession : AUTO_CAPTURE_DEFAULTS.maxCapturesPerSession;
|
|
106
|
+
return {
|
|
107
|
+
enabled,
|
|
108
|
+
triggerAfterToolCalls,
|
|
109
|
+
minIntervalMs,
|
|
110
|
+
maxCapturesPerSession,
|
|
111
|
+
dryRun
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/shared/worker-daemon/functions/parse-worker-toml.function.ts
|
|
116
|
+
function applyRootKey(acc, key, value) {
|
|
117
|
+
switch (key) {
|
|
118
|
+
case "item_limit":
|
|
119
|
+
acc.itemLimit = parseInt(value, 10) || DEFAULT_ITEM_LIMIT;
|
|
120
|
+
break;
|
|
121
|
+
case "index_limit":
|
|
122
|
+
acc.indexLimit = parseInt(value, 10) || DEFAULT_INDEX_LIMIT;
|
|
123
|
+
break;
|
|
124
|
+
case "timeout_ms":
|
|
125
|
+
acc.timeoutMs = parseInt(value, 10) || DEFAULT_TIMEOUT_MS;
|
|
126
|
+
break;
|
|
127
|
+
case "item_ttl_ms":
|
|
128
|
+
acc.itemTtlMs = parseInt(value, 10) || DEFAULT_ITEM_TTL_MS;
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
break;
|
|
83
132
|
}
|
|
84
133
|
}
|
|
85
134
|
function parseWorkerToml(text, contextPath) {
|
|
86
|
-
|
|
87
|
-
|
|
135
|
+
let section = "";
|
|
136
|
+
const embeddingEntries = /* @__PURE__ */ new Map();
|
|
137
|
+
const autoCaptureEntries = /* @__PURE__ */ new Map();
|
|
138
|
+
const acc = {
|
|
88
139
|
itemLimit: DEFAULT_ITEM_LIMIT,
|
|
89
140
|
indexLimit: DEFAULT_INDEX_LIMIT,
|
|
90
141
|
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
91
142
|
itemTtlMs: DEFAULT_ITEM_TTL_MS
|
|
92
143
|
};
|
|
93
|
-
const result = { ...config };
|
|
94
144
|
for (const line of text.split("\n")) {
|
|
95
145
|
const trimmed = line.trim();
|
|
96
|
-
if (trimmed
|
|
146
|
+
if (trimmed === "[embedding]") {
|
|
147
|
+
section = "embedding";
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (trimmed === "[auto_capture]") {
|
|
151
|
+
section = "auto_capture";
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (trimmed.startsWith("[")) {
|
|
155
|
+
section = "";
|
|
97
156
|
continue;
|
|
98
157
|
}
|
|
158
|
+
if (trimmed.startsWith("#") || !trimmed.includes("=")) continue;
|
|
99
159
|
const eqIdx = trimmed.indexOf("=");
|
|
100
160
|
const key = trimmed.slice(0, eqIdx).trim();
|
|
101
161
|
const value = trimmed.slice(eqIdx + 1).trim();
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
case "timeout_ms":
|
|
110
|
-
result.timeoutMs = parseInt(value, 10) || DEFAULT_TIMEOUT_MS;
|
|
111
|
-
break;
|
|
112
|
-
case "item_ttl_ms":
|
|
113
|
-
result.itemTtlMs = parseInt(value, 10) || DEFAULT_ITEM_TTL_MS;
|
|
114
|
-
break;
|
|
115
|
-
default:
|
|
116
|
-
break;
|
|
162
|
+
if (section === "embedding") {
|
|
163
|
+
embeddingEntries.set(key, value);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (section === "auto_capture") {
|
|
167
|
+
autoCaptureEntries.set(key, value);
|
|
168
|
+
continue;
|
|
117
169
|
}
|
|
170
|
+
applyRootKey(acc, key, value);
|
|
171
|
+
}
|
|
172
|
+
const embedding = parseEmbeddingSection(embeddingEntries);
|
|
173
|
+
const autoCapture = autoCaptureEntries.size > 0 ? parseAutoCaptureSection(autoCaptureEntries) : void 0;
|
|
174
|
+
return {
|
|
175
|
+
contextPath,
|
|
176
|
+
...acc,
|
|
177
|
+
...embedding !== void 0 ? { embedding } : {},
|
|
178
|
+
...autoCapture !== void 0 ? { autoCapture } : {}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/shared/worker-daemon/functions/read-config.function.ts
|
|
183
|
+
function readConfig(contextPath) {
|
|
184
|
+
const configPath = (0, import_node_path3.join)(contextPath, WORKER_TOML_FILENAME);
|
|
185
|
+
try {
|
|
186
|
+
const text = (0, import_node_fs.readFileSync)(configPath, "utf-8");
|
|
187
|
+
return parseWorkerToml(text, contextPath);
|
|
188
|
+
} catch {
|
|
189
|
+
return {
|
|
190
|
+
contextPath,
|
|
191
|
+
itemLimit: DEFAULT_ITEM_LIMIT,
|
|
192
|
+
indexLimit: DEFAULT_INDEX_LIMIT,
|
|
193
|
+
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
194
|
+
itemTtlMs: DEFAULT_ITEM_TTL_MS
|
|
195
|
+
};
|
|
118
196
|
}
|
|
119
|
-
return result;
|
|
120
197
|
}
|
|
121
198
|
|
|
122
199
|
// src/shared/worker-daemon/functions/start-daemon.function.ts
|
|
123
|
-
var
|
|
124
|
-
var
|
|
200
|
+
var import_node_fs9 = require("node:fs");
|
|
201
|
+
var import_node_path10 = require("node:path");
|
|
125
202
|
var import_node_os3 = require("node:os");
|
|
126
203
|
|
|
127
204
|
// src/shared/hash/functions/compute-sha256.ts
|
|
@@ -133,10 +210,77 @@ async function computeSha256(input) {
|
|
|
133
210
|
}
|
|
134
211
|
|
|
135
212
|
// src/shared/worker-daemon/classes/worker-daemon.class.ts
|
|
136
|
-
var
|
|
137
|
-
var
|
|
213
|
+
var import_node_fs8 = require("node:fs");
|
|
214
|
+
var import_node_path9 = require("node:path");
|
|
138
215
|
var import_node_os2 = require("node:os");
|
|
139
216
|
|
|
217
|
+
// src/shared/log/typings/log-level.type.ts
|
|
218
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
219
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
220
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
221
|
+
LogLevel2[LogLevel2["WARNING"] = 2] = "WARNING";
|
|
222
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
223
|
+
return LogLevel2;
|
|
224
|
+
})(LogLevel || {});
|
|
225
|
+
|
|
226
|
+
// src/shared/log/constants/log-colors.constant.ts
|
|
227
|
+
var ANSI_RESET = "\x1B[0m";
|
|
228
|
+
var LOG_COLORS = {
|
|
229
|
+
[0 /* DEBUG */]: "\x1B[37m",
|
|
230
|
+
[1 /* INFO */]: "\x1B[36m",
|
|
231
|
+
[2 /* WARNING */]: "\x1B[33m",
|
|
232
|
+
[3 /* ERROR */]: "\x1B[91m"
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// src/shared/log/constants/log-icons.constant.ts
|
|
236
|
+
var LOG_ICONS = {
|
|
237
|
+
[0 /* DEBUG */]: "\u25B8",
|
|
238
|
+
[1 /* INFO */]: "\u2139",
|
|
239
|
+
[2 /* WARNING */]: "\u26A0",
|
|
240
|
+
[3 /* ERROR */]: "\u2716"
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// src/shared/log/constants/log-defaults.constant.ts
|
|
244
|
+
var DEFAULT_LOG_LEVEL = 3 /* ERROR */;
|
|
245
|
+
|
|
246
|
+
// src/shared/log/functions/write-stderr.function.ts
|
|
247
|
+
function writeStderr(message) {
|
|
248
|
+
const g = globalThis;
|
|
249
|
+
const proc = g["process"];
|
|
250
|
+
if (proc?.stderr) {
|
|
251
|
+
proc.stderr.write(message);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const deno = g["Deno"];
|
|
255
|
+
deno?.stderr.writeSync(new TextEncoder().encode(message));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// src/shared/log/functions/log.function.ts
|
|
259
|
+
var currentLevel = DEFAULT_LOG_LEVEL;
|
|
260
|
+
var outputs = {
|
|
261
|
+
[0 /* DEBUG */]: writeStderr,
|
|
262
|
+
[1 /* INFO */]: writeStderr,
|
|
263
|
+
[2 /* WARNING */]: writeStderr,
|
|
264
|
+
[3 /* ERROR */]: writeStderr
|
|
265
|
+
};
|
|
266
|
+
function setLogLevel(level) {
|
|
267
|
+
currentLevel = level;
|
|
268
|
+
}
|
|
269
|
+
function setLogOutput(level, output) {
|
|
270
|
+
outputs[level] = output;
|
|
271
|
+
}
|
|
272
|
+
function log(message, level = 3 /* ERROR */) {
|
|
273
|
+
if (level < currentLevel) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const color = LOG_COLORS[level];
|
|
277
|
+
const icon = LOG_ICONS[level];
|
|
278
|
+
const name = LogLevel[level];
|
|
279
|
+
const line = `${color}${icon} [${name}] ${message}${ANSI_RESET}
|
|
280
|
+
`;
|
|
281
|
+
outputs[level](line);
|
|
282
|
+
}
|
|
283
|
+
|
|
140
284
|
// src/shared/worker-daemon/functions/load-wasm-modules.function.ts
|
|
141
285
|
var import_node_fs3 = require("node:fs");
|
|
142
286
|
|
|
@@ -165,6 +309,7 @@ var nullAllocator = { alloc: null };
|
|
|
165
309
|
function createHostImports(contextPath, memoryRef = nullMemory, fs = nodeFsAdapter, allocator = nullAllocator) {
|
|
166
310
|
function getBuffer() {
|
|
167
311
|
if (!memoryRef.memory) {
|
|
312
|
+
log("WASM memory not initialized", 3 /* ERROR */);
|
|
168
313
|
throw new Error("WASM memory not initialized");
|
|
169
314
|
}
|
|
170
315
|
return memoryRef.memory.buffer;
|
|
@@ -333,6 +478,7 @@ async function loadWasmModules(config, wasmDir2) {
|
|
|
333
478
|
void 0,
|
|
334
479
|
allocator
|
|
335
480
|
);
|
|
481
|
+
log("loading WASM module: kb-worker", 0 /* DEBUG */);
|
|
336
482
|
const wkPath = joinPath(wasmDir2, "kb-worker", "kbdb_worker_bg.wasm");
|
|
337
483
|
const wkBytes = await readWasmFile(wkPath, "kb-worker");
|
|
338
484
|
let wkModule;
|
|
@@ -356,7 +502,20 @@ async function loadWasmModules(config, wasmDir2) {
|
|
|
356
502
|
if (typeof fn_ !== "function") return 0;
|
|
357
503
|
return fn_(size);
|
|
358
504
|
};
|
|
359
|
-
|
|
505
|
+
const embPath = joinPath(
|
|
506
|
+
wasmDir2,
|
|
507
|
+
"default-embedding",
|
|
508
|
+
"kbdb_default_embedding_bg.wasm"
|
|
509
|
+
);
|
|
510
|
+
let embedding;
|
|
511
|
+
try {
|
|
512
|
+
const embBytes = await readWasmFile(embPath, "default-embedding");
|
|
513
|
+
const embModule = await WebAssembly.compile(embBytes);
|
|
514
|
+
embedding = await WebAssembly.instantiate(embModule, {});
|
|
515
|
+
} catch {
|
|
516
|
+
}
|
|
517
|
+
log("all WASM modules loaded", 1 /* INFO */);
|
|
518
|
+
return { memory, kbWorker, embedding };
|
|
360
519
|
}
|
|
361
520
|
async function readWasmFile(path, label) {
|
|
362
521
|
try {
|
|
@@ -382,17 +541,25 @@ function rethrow(stage, label, err, path) {
|
|
|
382
541
|
const detail = err instanceof Error ? err.message : String(err);
|
|
383
542
|
const suffix = path ? ` (path: ${path})` : "";
|
|
384
543
|
const message = `failed to ${stage} ${label} WASM: ${detail}${suffix}`;
|
|
385
|
-
|
|
544
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
386
545
|
throw new Error(message, { cause: err });
|
|
387
546
|
}
|
|
388
547
|
|
|
389
548
|
// src/shared/worker-daemon/functions/create-ipc-server.function.ts
|
|
390
549
|
var import_node_net = require("node:net");
|
|
550
|
+
var LISTEN_BACKLOG = 256;
|
|
551
|
+
var KEEPALIVE_MS = 3e4;
|
|
391
552
|
function createIpcServer(socketPath, handler) {
|
|
392
553
|
const server = (0, import_node_net.createServer)((socket) => {
|
|
554
|
+
socket.setKeepAlive(true, KEEPALIVE_MS);
|
|
555
|
+
log("ipc: connection accepted", 0 /* DEBUG */);
|
|
393
556
|
let buffer = "";
|
|
394
557
|
let processingQueue = Promise.resolve();
|
|
395
558
|
socket.on("data", (chunk) => {
|
|
559
|
+
log(
|
|
560
|
+
"ipc: data received bytes=" + String(chunk.length),
|
|
561
|
+
0 /* DEBUG */
|
|
562
|
+
);
|
|
396
563
|
buffer += chunk.toString();
|
|
397
564
|
const lines = buffer.split("\n");
|
|
398
565
|
buffer = lines.pop() ?? "";
|
|
@@ -404,16 +571,28 @@ function createIpcServer(socketPath, handler) {
|
|
|
404
571
|
}
|
|
405
572
|
});
|
|
406
573
|
socket.on("error", (err) => {
|
|
407
|
-
|
|
408
|
-
`kbdb-worker: ipc connection error: ${err.message}
|
|
574
|
+
log(
|
|
575
|
+
`kbdb-worker: ipc connection error: ${err.message}`,
|
|
576
|
+
2 /* WARNING */
|
|
409
577
|
);
|
|
410
578
|
});
|
|
411
579
|
});
|
|
412
|
-
|
|
413
|
-
|
|
580
|
+
return new Promise((resolve2, reject) => {
|
|
581
|
+
server.once("error", reject);
|
|
582
|
+
server.listen(
|
|
583
|
+
{ path: socketPath, backlog: LISTEN_BACKLOG },
|
|
584
|
+
() => {
|
|
585
|
+
server.removeListener("error", reject);
|
|
586
|
+
server.on("error", (err) => {
|
|
587
|
+
log(
|
|
588
|
+
`kbdb-worker: ipc server error: ${err.message}`,
|
|
589
|
+
3 /* ERROR */
|
|
590
|
+
);
|
|
591
|
+
});
|
|
592
|
+
resolve2(server);
|
|
593
|
+
}
|
|
594
|
+
);
|
|
414
595
|
});
|
|
415
|
-
server.listen(socketPath);
|
|
416
|
-
return server;
|
|
417
596
|
}
|
|
418
597
|
function bigintReplacer(_key, value) {
|
|
419
598
|
return typeof value === "bigint" ? Number(value) : value;
|
|
@@ -422,8 +601,13 @@ async function handleLine(line, handler, socket) {
|
|
|
422
601
|
let response;
|
|
423
602
|
try {
|
|
424
603
|
const request = JSON.parse(line);
|
|
604
|
+
log(
|
|
605
|
+
"ipc: request parsed method=" + request.method + " id=" + String(request.id),
|
|
606
|
+
0 /* DEBUG */
|
|
607
|
+
);
|
|
425
608
|
response = await handler(request);
|
|
426
609
|
} catch {
|
|
610
|
+
log("ipc: parse error on malformed request", 0 /* DEBUG */);
|
|
427
611
|
response = {
|
|
428
612
|
jsonrpc: "2.0",
|
|
429
613
|
id: 0,
|
|
@@ -433,7 +617,12 @@ async function handleLine(line, handler, socket) {
|
|
|
433
617
|
}
|
|
434
618
|
};
|
|
435
619
|
}
|
|
436
|
-
|
|
620
|
+
const encoded = JSON.stringify(response, bigintReplacer) + "\n";
|
|
621
|
+
log(
|
|
622
|
+
"ipc: response sent bytes=" + String(encoded.length),
|
|
623
|
+
0 /* DEBUG */
|
|
624
|
+
);
|
|
625
|
+
socket.write(encoded);
|
|
437
626
|
}
|
|
438
627
|
|
|
439
628
|
// src/shared/platform/functions/get-ipc-path.function.ts
|
|
@@ -453,6 +642,535 @@ function getIpcPath(ctx) {
|
|
|
453
642
|
return (0, import_node_path5.join)(getTmpdir(), `kbdb-${ctx}.sock`);
|
|
454
643
|
}
|
|
455
644
|
|
|
645
|
+
// src/shared/embedding/classes/null-embedding-provider.class.ts
|
|
646
|
+
var NullEmbeddingProvider = class {
|
|
647
|
+
/**
|
|
648
|
+
* Returns an empty `Float32Array` for each input text.
|
|
649
|
+
*
|
|
650
|
+
* @param texts - input strings (contents are ignored)
|
|
651
|
+
*/
|
|
652
|
+
embed(texts) {
|
|
653
|
+
return Promise.resolve(texts.map(() => new Float32Array(0)));
|
|
654
|
+
}
|
|
655
|
+
/** Always returns 0 -- no dimensions when disabled. */
|
|
656
|
+
dimensions() {
|
|
657
|
+
return 0;
|
|
658
|
+
}
|
|
659
|
+
/** Always returns `'none'`. */
|
|
660
|
+
modelName() {
|
|
661
|
+
return "none";
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// src/shared/embedding/classes/onnx-embedding-provider.class.ts
|
|
666
|
+
var OnnxEmbeddingProvider = class {
|
|
667
|
+
/** Path to the ONNX model file. */
|
|
668
|
+
model;
|
|
669
|
+
/** Number of embedding dimensions the model produces. */
|
|
670
|
+
dims;
|
|
671
|
+
/**
|
|
672
|
+
* @param model - filesystem path to the ONNX model file
|
|
673
|
+
* @param dimensions - number of dimensions the model produces
|
|
674
|
+
*/
|
|
675
|
+
constructor(model, dimensions) {
|
|
676
|
+
this.model = model;
|
|
677
|
+
this.dims = dimensions;
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Not yet implemented.
|
|
681
|
+
*
|
|
682
|
+
* @throws {Error} always -- ONNX Runtime is an optional peer
|
|
683
|
+
* dependency not yet wired
|
|
684
|
+
*/
|
|
685
|
+
embed(_texts) {
|
|
686
|
+
log("embed called on OnnxEmbeddingProvider", 0 /* DEBUG */);
|
|
687
|
+
return Promise.reject(
|
|
688
|
+
new Error(
|
|
689
|
+
"ONNX Runtime not available; install onnxruntime-node"
|
|
690
|
+
)
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
/** Returns the configured number of embedding dimensions. */
|
|
694
|
+
dimensions() {
|
|
695
|
+
return this.dims;
|
|
696
|
+
}
|
|
697
|
+
/** Returns the configured model file path. */
|
|
698
|
+
modelName() {
|
|
699
|
+
return this.model;
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
|
|
703
|
+
// src/shared/embedding/functions/parse-api-embedding-response.function.ts
|
|
704
|
+
function parseApiEmbeddingResponse(raw) {
|
|
705
|
+
if (!isEmbeddingApiResponse(raw)) {
|
|
706
|
+
log("Unexpected embedding API response shape", 3 /* ERROR */);
|
|
707
|
+
throw new Error("Unexpected embedding API response shape");
|
|
708
|
+
}
|
|
709
|
+
return raw.data.map((entry) => new Float32Array(entry.embedding));
|
|
710
|
+
}
|
|
711
|
+
function isEmbeddingApiResponse(value) {
|
|
712
|
+
if (typeof value !== "object" || value === null) {
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
const candidate = value;
|
|
716
|
+
if (!Array.isArray(candidate["data"])) {
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
return candidate["data"].every(isEmbeddingEntry);
|
|
720
|
+
}
|
|
721
|
+
function isEmbeddingEntry(value) {
|
|
722
|
+
if (typeof value !== "object" || value === null) {
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
725
|
+
const candidate = value;
|
|
726
|
+
return Array.isArray(candidate["embedding"]);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// src/shared/embedding/classes/api-embedding-provider.class.ts
|
|
730
|
+
var ApiEmbeddingProvider = class {
|
|
731
|
+
/** Remote endpoint URL for embedding requests. */
|
|
732
|
+
endpoint;
|
|
733
|
+
/** Number of dimensions in the returned vectors. */
|
|
734
|
+
dims;
|
|
735
|
+
/** Model name sent in the request body. */
|
|
736
|
+
model;
|
|
737
|
+
/**
|
|
738
|
+
* @param endpoint - URL to POST embedding requests to
|
|
739
|
+
* @param dimensions - number of vector dimensions expected
|
|
740
|
+
* @param model - optional model name; defaults to `'api'`
|
|
741
|
+
*/
|
|
742
|
+
constructor(endpoint, dimensions, model) {
|
|
743
|
+
this.endpoint = endpoint;
|
|
744
|
+
this.dims = dimensions;
|
|
745
|
+
this.model = model ?? "api";
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* Posts texts to the endpoint and returns one `Float32Array`
|
|
749
|
+
* per input.
|
|
750
|
+
*
|
|
751
|
+
* @throws {Error} when the HTTP response status is not 2xx
|
|
752
|
+
*/
|
|
753
|
+
async embed(texts) {
|
|
754
|
+
const response = await fetch(this.endpoint, {
|
|
755
|
+
method: "POST",
|
|
756
|
+
headers: { "Content-Type": "application/json" },
|
|
757
|
+
body: JSON.stringify({ input: texts, model: this.model })
|
|
758
|
+
});
|
|
759
|
+
if (!response.ok) {
|
|
760
|
+
const msg = `Embedding API error: ${String(response.status)}`;
|
|
761
|
+
log(msg, 3 /* ERROR */);
|
|
762
|
+
throw new Error(msg);
|
|
763
|
+
}
|
|
764
|
+
const json = await response.json();
|
|
765
|
+
return parseApiEmbeddingResponse(json);
|
|
766
|
+
}
|
|
767
|
+
/** Returns the configured number of embedding dimensions. */
|
|
768
|
+
dimensions() {
|
|
769
|
+
return this.dims;
|
|
770
|
+
}
|
|
771
|
+
/** Returns the configured model name, defaulting to `'api'`. */
|
|
772
|
+
modelName() {
|
|
773
|
+
return this.model;
|
|
774
|
+
}
|
|
775
|
+
};
|
|
776
|
+
|
|
777
|
+
// src/shared/embedding/constants/tfidf-defaults.constant.ts
|
|
778
|
+
var TFIDF_DIMENSIONS = 256;
|
|
779
|
+
var TFIDF_MODEL_NAME = "tfidf-v1";
|
|
780
|
+
|
|
781
|
+
// src/shared/embedding/classes/tfidf-embedding-provider.class.ts
|
|
782
|
+
var TfidfEmbeddingProvider = class {
|
|
783
|
+
_alloc;
|
|
784
|
+
_batch;
|
|
785
|
+
_retPtr;
|
|
786
|
+
_memory;
|
|
787
|
+
/** @param wasm - instantiated `kbdb-default-embedding` WASM module */
|
|
788
|
+
constructor(wasm) {
|
|
789
|
+
const ex = wasm.exports;
|
|
790
|
+
this._memory = ex["memory"];
|
|
791
|
+
this._alloc = ex["kbdb_alloc"];
|
|
792
|
+
this._batch = ex["embedding_tfidf_batch"];
|
|
793
|
+
this._retPtr = ex["get_return_ptr"];
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Embeds a batch of texts using TF-IDF computation in WASM.
|
|
797
|
+
*
|
|
798
|
+
* @param texts - input strings to embed
|
|
799
|
+
* @returns one 256-dimension `Float32Array` per input text
|
|
800
|
+
*/
|
|
801
|
+
embed(texts) {
|
|
802
|
+
log(
|
|
803
|
+
"embed called on TfidfEmbeddingProvider: " + texts.length.toString() + " texts",
|
|
804
|
+
0 /* DEBUG */
|
|
805
|
+
);
|
|
806
|
+
const input = texts.join("\n");
|
|
807
|
+
const encoded = new TextEncoder().encode(input);
|
|
808
|
+
const ptr = this._alloc(encoded.byteLength);
|
|
809
|
+
const view = new Uint8Array(this._memory.buffer);
|
|
810
|
+
view.set(encoded, ptr);
|
|
811
|
+
this._batch(ptr, encoded.byteLength);
|
|
812
|
+
const outPtr = this._retPtr();
|
|
813
|
+
const dv = new DataView(this._memory.buffer);
|
|
814
|
+
const count = dv.getUint32(outPtr, true);
|
|
815
|
+
const results = [];
|
|
816
|
+
let offset = outPtr + 4;
|
|
817
|
+
for (let i = 0; i < count; i++) {
|
|
818
|
+
const vec = new Float32Array(TFIDF_DIMENSIONS);
|
|
819
|
+
for (let d = 0; d < TFIDF_DIMENSIONS; d++) {
|
|
820
|
+
vec[d] = dv.getFloat32(offset, true);
|
|
821
|
+
offset += 4;
|
|
822
|
+
}
|
|
823
|
+
results.push(vec);
|
|
824
|
+
}
|
|
825
|
+
return Promise.resolve(results);
|
|
826
|
+
}
|
|
827
|
+
/** Returns 256 -- the fixed dimension count for TF-IDF vectors. */
|
|
828
|
+
dimensions() {
|
|
829
|
+
return TFIDF_DIMENSIONS;
|
|
830
|
+
}
|
|
831
|
+
/** Returns `'tfidf-v1'`. */
|
|
832
|
+
modelName() {
|
|
833
|
+
return TFIDF_MODEL_NAME;
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
|
|
837
|
+
// src/shared/embedding/functions/create-embedding-provider.function.ts
|
|
838
|
+
function createEmbeddingProvider(config, wasmInstance) {
|
|
839
|
+
log("creating embedding provider", 0 /* DEBUG */);
|
|
840
|
+
if (!config) {
|
|
841
|
+
if (wasmInstance) {
|
|
842
|
+
log("using TfidfEmbeddingProvider", 0 /* DEBUG */);
|
|
843
|
+
return new TfidfEmbeddingProvider(wasmInstance);
|
|
844
|
+
}
|
|
845
|
+
log("using NullEmbeddingProvider", 0 /* DEBUG */);
|
|
846
|
+
return new NullEmbeddingProvider();
|
|
847
|
+
}
|
|
848
|
+
if (config.provider === "none") {
|
|
849
|
+
log("using NullEmbeddingProvider", 0 /* DEBUG */);
|
|
850
|
+
return new NullEmbeddingProvider();
|
|
851
|
+
}
|
|
852
|
+
if (config.provider === "onnx") {
|
|
853
|
+
log("using OnnxEmbeddingProvider", 0 /* DEBUG */);
|
|
854
|
+
return new OnnxEmbeddingProvider(
|
|
855
|
+
config.model ?? "",
|
|
856
|
+
config.dimensions ?? 0
|
|
857
|
+
);
|
|
858
|
+
}
|
|
859
|
+
log("using ApiEmbeddingProvider", 0 /* DEBUG */);
|
|
860
|
+
return new ApiEmbeddingProvider(
|
|
861
|
+
config.endpoint ?? "",
|
|
862
|
+
config.dimensions ?? 0,
|
|
863
|
+
config.model
|
|
864
|
+
);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// src/shared/worker-daemon/functions/handle-hybrid-search.function.ts
|
|
868
|
+
var import_node_fs5 = require("node:fs");
|
|
869
|
+
var import_node_path6 = require("node:path");
|
|
870
|
+
|
|
871
|
+
// src/shared/embedding/functions/search-vectors.function.ts
|
|
872
|
+
var import_node_fs4 = require("node:fs");
|
|
873
|
+
|
|
874
|
+
// src/shared/embedding/functions/cosine-similarity.function.ts
|
|
875
|
+
function cosineSimilarity(a, b) {
|
|
876
|
+
let dot = 0;
|
|
877
|
+
let magA = 0;
|
|
878
|
+
let magB = 0;
|
|
879
|
+
for (let i = 0; i < a.length; i++) {
|
|
880
|
+
const ai = a[i] ?? 0;
|
|
881
|
+
const bi = b[i] ?? 0;
|
|
882
|
+
dot += ai * bi;
|
|
883
|
+
magA += ai * ai;
|
|
884
|
+
magB += bi * bi;
|
|
885
|
+
}
|
|
886
|
+
if (magA === 0 || magB === 0) {
|
|
887
|
+
return 0;
|
|
888
|
+
}
|
|
889
|
+
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
// src/shared/embedding/functions/search-vectors.function.ts
|
|
893
|
+
var HEADER_SIZE = 32;
|
|
894
|
+
var KBID_WIDTH = 64;
|
|
895
|
+
function searchVectors(filePath, queryVector, topN) {
|
|
896
|
+
log("searching vectors", 0 /* DEBUG */);
|
|
897
|
+
const buf = (0, import_node_fs4.readFileSync)(filePath);
|
|
898
|
+
if (buf.length < HEADER_SIZE) {
|
|
899
|
+
return [];
|
|
900
|
+
}
|
|
901
|
+
const dimensions = buf.readUInt32LE(8);
|
|
902
|
+
const count = buf.readUInt32LE(12);
|
|
903
|
+
const modelLen = buf.readUInt32LE(16);
|
|
904
|
+
const dataStart = HEADER_SIZE + modelLen;
|
|
905
|
+
const recordSize = KBID_WIDTH + dimensions * 4;
|
|
906
|
+
const results = [];
|
|
907
|
+
for (let i = 0; i < count; i++) {
|
|
908
|
+
const recOffset = dataStart + i * recordSize;
|
|
909
|
+
const kbid = buf.toString("utf-8", recOffset, recOffset + KBID_WIDTH).replace(/\0/g, "");
|
|
910
|
+
const vector = new Float32Array(dimensions);
|
|
911
|
+
for (let d = 0; d < dimensions; d++) {
|
|
912
|
+
vector[d] = buf.readFloatLE(recOffset + KBID_WIDTH + d * 4);
|
|
913
|
+
}
|
|
914
|
+
const score = cosineSimilarity(queryVector, vector);
|
|
915
|
+
results.push({ kbid, score });
|
|
916
|
+
}
|
|
917
|
+
results.sort((a, b) => b.score - a.score);
|
|
918
|
+
return results.slice(0, topN);
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
// src/shared/embedding/functions/rrf-fuse.function.ts
|
|
922
|
+
var DEFAULT_K = 60;
|
|
923
|
+
function rrfFuse(lexicalRanks, vectorRanks, k = DEFAULT_K) {
|
|
924
|
+
const scores = /* @__PURE__ */ new Map();
|
|
925
|
+
for (const [kbid, rank] of lexicalRanks) {
|
|
926
|
+
scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));
|
|
927
|
+
}
|
|
928
|
+
for (const [kbid, rank] of vectorRanks) {
|
|
929
|
+
scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));
|
|
930
|
+
}
|
|
931
|
+
return scores;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// src/shared/worker-daemon/classes/ipc-error.class.ts
|
|
935
|
+
var IpcError = class extends Error {
|
|
936
|
+
/** JSON-RPC error code. */
|
|
937
|
+
code;
|
|
938
|
+
/**
|
|
939
|
+
* @param code - JSON-RPC error code (e.g. `-32601` for
|
|
940
|
+
* method-not-found, `-32000` for application errors)
|
|
941
|
+
* @param message - human-readable error description
|
|
942
|
+
*/
|
|
943
|
+
constructor(code, message) {
|
|
944
|
+
super(message);
|
|
945
|
+
this.code = code;
|
|
946
|
+
this.name = "IpcError";
|
|
947
|
+
}
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
// src/shared/worker-daemon/functions/handle-hybrid-search.function.ts
|
|
951
|
+
async function fuseSearchResults(lexical, algo, query, provider, targetDir) {
|
|
952
|
+
log("handling hybrid search", 0 /* DEBUG */);
|
|
953
|
+
if (algo === "lexical") {
|
|
954
|
+
return {
|
|
955
|
+
...lexical,
|
|
956
|
+
search_mode: "lexical",
|
|
957
|
+
retrieval_method: "lexical"
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
assertProvider(provider);
|
|
961
|
+
const embeddings = await provider.embed([query]);
|
|
962
|
+
if (embeddings.length === 0 || embeddings[0].length === 0) {
|
|
963
|
+
return {
|
|
964
|
+
...lexical,
|
|
965
|
+
search_mode: algo,
|
|
966
|
+
retrieval_method: "lexical"
|
|
967
|
+
};
|
|
968
|
+
}
|
|
969
|
+
const queryVec = embeddings[0];
|
|
970
|
+
const vectorPath = (0, import_node_path6.join)(targetDir, "vectors.idx");
|
|
971
|
+
const vectorResults = (0, import_node_fs5.existsSync)(vectorPath) ? searchVectors(vectorPath, queryVec, lexical.limit) : [];
|
|
972
|
+
if (algo === "vector") {
|
|
973
|
+
return buildVectorOnly(vectorResults, lexical);
|
|
974
|
+
}
|
|
975
|
+
return buildHybrid(lexical, vectorResults);
|
|
976
|
+
}
|
|
977
|
+
function assertProvider(provider) {
|
|
978
|
+
if (!provider || provider.dimensions() === 0) {
|
|
979
|
+
const embeddingErrMsg = "embedding provider not configured; set [embedding] in worker.toml";
|
|
980
|
+
log(embeddingErrMsg, 3 /* ERROR */);
|
|
981
|
+
throw new IpcError(-32e3, embeddingErrMsg);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
function buildVectorOnly(vectorResults, lexical) {
|
|
985
|
+
const lookup = new Map(
|
|
986
|
+
lexical.items.map((item) => [item.kbid, item])
|
|
987
|
+
);
|
|
988
|
+
const items = vectorResults.map((vr) => {
|
|
989
|
+
const existing = lookup.get(vr.kbid);
|
|
990
|
+
if (existing) {
|
|
991
|
+
return { ...existing, score: vr.score };
|
|
992
|
+
}
|
|
993
|
+
return emptyItem(vr.kbid, vr.score);
|
|
994
|
+
});
|
|
995
|
+
return {
|
|
996
|
+
items,
|
|
997
|
+
total: items.length,
|
|
998
|
+
offset: lexical.offset,
|
|
999
|
+
limit: lexical.limit,
|
|
1000
|
+
has_more: false,
|
|
1001
|
+
relaxed: lexical.relaxed,
|
|
1002
|
+
search_mode: "vector",
|
|
1003
|
+
retrieval_method: "vector"
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
function buildHybrid(lexical, vectorResults) {
|
|
1007
|
+
const lexRanks = /* @__PURE__ */ new Map();
|
|
1008
|
+
lexical.items.forEach((item, i) => {
|
|
1009
|
+
lexRanks.set(item.kbid, i + 1);
|
|
1010
|
+
});
|
|
1011
|
+
const vecRanks = /* @__PURE__ */ new Map();
|
|
1012
|
+
vectorResults.forEach((vr, i) => {
|
|
1013
|
+
vecRanks.set(vr.kbid, i + 1);
|
|
1014
|
+
});
|
|
1015
|
+
const fused = rrfFuse(lexRanks, vecRanks);
|
|
1016
|
+
const sorted = [...fused.entries()].sort((a, b) => b[1] - a[1]);
|
|
1017
|
+
const lookup = new Map(
|
|
1018
|
+
lexical.items.map((item) => [item.kbid, item])
|
|
1019
|
+
);
|
|
1020
|
+
const items = sorted.slice(0, lexical.limit).map(([kbid, score]) => {
|
|
1021
|
+
const existing = lookup.get(kbid);
|
|
1022
|
+
if (existing) {
|
|
1023
|
+
return { ...existing, score };
|
|
1024
|
+
}
|
|
1025
|
+
return emptyItem(kbid, score);
|
|
1026
|
+
});
|
|
1027
|
+
return {
|
|
1028
|
+
items,
|
|
1029
|
+
total: sorted.length,
|
|
1030
|
+
offset: lexical.offset,
|
|
1031
|
+
limit: lexical.limit,
|
|
1032
|
+
has_more: sorted.length > lexical.limit,
|
|
1033
|
+
relaxed: lexical.relaxed,
|
|
1034
|
+
search_mode: "hybrid",
|
|
1035
|
+
retrieval_method: "rrf"
|
|
1036
|
+
};
|
|
1037
|
+
}
|
|
1038
|
+
function emptyItem(kbid, score) {
|
|
1039
|
+
return {
|
|
1040
|
+
kbid,
|
|
1041
|
+
heading: null,
|
|
1042
|
+
type: "",
|
|
1043
|
+
docids: [],
|
|
1044
|
+
score,
|
|
1045
|
+
confidence: 0,
|
|
1046
|
+
snippet: "",
|
|
1047
|
+
matched_terms: [],
|
|
1048
|
+
matched_fields: [],
|
|
1049
|
+
created_at: ""
|
|
1050
|
+
};
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
// src/shared/embedding/functions/rebuild-vectors.function.ts
|
|
1054
|
+
var import_node_fs7 = require("node:fs");
|
|
1055
|
+
var import_node_path8 = require("node:path");
|
|
1056
|
+
|
|
1057
|
+
// src/shared/embedding/functions/build-vector-index.function.ts
|
|
1058
|
+
var import_node_fs6 = require("node:fs");
|
|
1059
|
+
var import_node_path7 = require("node:path");
|
|
1060
|
+
var MAGIC = "KBVX";
|
|
1061
|
+
var VERSION = 1;
|
|
1062
|
+
var KBID_WIDTH2 = 64;
|
|
1063
|
+
var HEADER_SIZE2 = 32;
|
|
1064
|
+
function writeHeader(buf, dimensions, count, modelLen) {
|
|
1065
|
+
buf.write(MAGIC, 0, "ascii");
|
|
1066
|
+
buf.writeUInt32LE(VERSION, 4);
|
|
1067
|
+
buf.writeUInt32LE(dimensions, 8);
|
|
1068
|
+
buf.writeUInt32LE(count, 12);
|
|
1069
|
+
buf.writeUInt32LE(modelLen, 16);
|
|
1070
|
+
}
|
|
1071
|
+
function writeRecord(buf, offset, entry, dimensions, encoder3) {
|
|
1072
|
+
const kbidBytes = encoder3.encode(entry.kbid);
|
|
1073
|
+
kbidBytes.forEach((b, i) => {
|
|
1074
|
+
if (i < KBID_WIDTH2) buf.writeUInt8(b, offset + i);
|
|
1075
|
+
});
|
|
1076
|
+
for (let d = 0; d < dimensions; d++) {
|
|
1077
|
+
buf.writeFloatLE(
|
|
1078
|
+
entry.vector[d] ?? 0,
|
|
1079
|
+
offset + KBID_WIDTH2 + d * 4
|
|
1080
|
+
);
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
function buildVectorIndex(dirPath, modelName, dimensions, entries) {
|
|
1084
|
+
log("building vector index", 0 /* DEBUG */);
|
|
1085
|
+
const encoder3 = new TextEncoder();
|
|
1086
|
+
const modelBytes = encoder3.encode(modelName);
|
|
1087
|
+
const modelLen = modelBytes.length;
|
|
1088
|
+
const recordSize = KBID_WIDTH2 + dimensions * 4;
|
|
1089
|
+
const totalSize = HEADER_SIZE2 + modelLen + entries.length * recordSize;
|
|
1090
|
+
const buf = Buffer.alloc(totalSize, 0);
|
|
1091
|
+
writeHeader(buf, dimensions, entries.length, modelLen);
|
|
1092
|
+
modelBytes.forEach((b, i) => buf.writeUInt8(b, HEADER_SIZE2 + i));
|
|
1093
|
+
let recOffset = HEADER_SIZE2 + modelLen;
|
|
1094
|
+
for (const entry of entries) {
|
|
1095
|
+
writeRecord(buf, recOffset, entry, dimensions, encoder3);
|
|
1096
|
+
recOffset += recordSize;
|
|
1097
|
+
}
|
|
1098
|
+
(0, import_node_fs6.writeFileSync)((0, import_node_path7.join)(dirPath, "vectors.idx"), buf);
|
|
1099
|
+
return Promise.resolve();
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
// src/shared/embedding/functions/rebuild-vectors.function.ts
|
|
1103
|
+
var SECTION_SEPARATOR = "\n---\n";
|
|
1104
|
+
function extractBody(raw) {
|
|
1105
|
+
const sep = raw.indexOf(SECTION_SEPARATOR);
|
|
1106
|
+
return sep >= 0 ? raw.slice(sep + SECTION_SEPARATOR.length) : raw;
|
|
1107
|
+
}
|
|
1108
|
+
function collectSections(sectionsDir) {
|
|
1109
|
+
let shards;
|
|
1110
|
+
try {
|
|
1111
|
+
shards = (0, import_node_fs7.readdirSync)(sectionsDir);
|
|
1112
|
+
} catch {
|
|
1113
|
+
return [];
|
|
1114
|
+
}
|
|
1115
|
+
const result = [];
|
|
1116
|
+
for (const shard of shards) {
|
|
1117
|
+
let files;
|
|
1118
|
+
try {
|
|
1119
|
+
files = (0, import_node_fs7.readdirSync)((0, import_node_path8.join)(sectionsDir, shard));
|
|
1120
|
+
} catch {
|
|
1121
|
+
continue;
|
|
1122
|
+
}
|
|
1123
|
+
for (const file of files) {
|
|
1124
|
+
if (!file.endsWith(".section")) continue;
|
|
1125
|
+
const kbid = file.slice(0, -8);
|
|
1126
|
+
try {
|
|
1127
|
+
const raw = (0, import_node_fs7.readFileSync)(
|
|
1128
|
+
(0, import_node_path8.join)(sectionsDir, shard, file),
|
|
1129
|
+
"utf-8"
|
|
1130
|
+
);
|
|
1131
|
+
const body = extractBody(raw);
|
|
1132
|
+
if (body.length > 0) {
|
|
1133
|
+
result.push({ kbid, body });
|
|
1134
|
+
}
|
|
1135
|
+
} catch {
|
|
1136
|
+
continue;
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
return result;
|
|
1141
|
+
}
|
|
1142
|
+
async function rebuildVectors(targetDir, provider) {
|
|
1143
|
+
log("rebuilding vectors", 0 /* DEBUG */);
|
|
1144
|
+
if (provider.dimensions() === 0) {
|
|
1145
|
+
return 0;
|
|
1146
|
+
}
|
|
1147
|
+
const sectionsDir = (0, import_node_path8.join)(targetDir, "sections");
|
|
1148
|
+
if (!(0, import_node_fs7.existsSync)(sectionsDir)) {
|
|
1149
|
+
return 0;
|
|
1150
|
+
}
|
|
1151
|
+
const sections = collectSections(sectionsDir);
|
|
1152
|
+
if (sections.length === 0) {
|
|
1153
|
+
return 0;
|
|
1154
|
+
}
|
|
1155
|
+
const texts = sections.map((s) => s.body);
|
|
1156
|
+
const vectors = await provider.embed(texts);
|
|
1157
|
+
const entries = sections.map((s, i) => ({
|
|
1158
|
+
kbid: s.kbid,
|
|
1159
|
+
vector: vectors[i] ?? new Float32Array(provider.dimensions())
|
|
1160
|
+
}));
|
|
1161
|
+
await buildVectorIndex(
|
|
1162
|
+
targetDir,
|
|
1163
|
+
provider.modelName(),
|
|
1164
|
+
provider.dimensions(),
|
|
1165
|
+
entries
|
|
1166
|
+
);
|
|
1167
|
+
log(
|
|
1168
|
+
"rebuilt " + sections.length.toString() + " vectors",
|
|
1169
|
+
1 /* INFO */
|
|
1170
|
+
);
|
|
1171
|
+
return sections.length;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
456
1174
|
// src/shared/wasm-codec/functions/encode-string.function.ts
|
|
457
1175
|
var encoder = new TextEncoder();
|
|
458
1176
|
function encodeString(value) {
|
|
@@ -1270,7 +1988,9 @@ var WASM_METHOD_MAP = {
|
|
|
1270
1988
|
list_docs_by_type: "worker_list_docs_by_type",
|
|
1271
1989
|
recall: "worker_recall",
|
|
1272
1990
|
export: "worker_export",
|
|
1273
|
-
exportDb: "worker_export"
|
|
1991
|
+
exportDb: "worker_export",
|
|
1992
|
+
importDb: "worker_import",
|
|
1993
|
+
import_db: "worker_import"
|
|
1274
1994
|
};
|
|
1275
1995
|
var CONFIG_PREFIX = "config_";
|
|
1276
1996
|
var CONFIG_KEY_MAP = {
|
|
@@ -1279,7 +1999,7 @@ var CONFIG_KEY_MAP = {
|
|
|
1279
1999
|
item_limit: "itemLimit",
|
|
1280
2000
|
index_limit: "indexLimit"
|
|
1281
2001
|
};
|
|
1282
|
-
var
|
|
2002
|
+
var IpcError2 = class extends Error {
|
|
1283
2003
|
/** JSON-RPC error code. */
|
|
1284
2004
|
code;
|
|
1285
2005
|
constructor(code, message) {
|
|
@@ -1301,9 +2021,11 @@ var WorkerDaemon = class {
|
|
|
1301
2021
|
}
|
|
1302
2022
|
_connectionCount = 0;
|
|
1303
2023
|
_wasmModules = null;
|
|
2024
|
+
_embeddingProvider = null;
|
|
1304
2025
|
_idleAt = 0;
|
|
1305
2026
|
_idleTimer = null;
|
|
1306
2027
|
_server = null;
|
|
2028
|
+
_sockets = /* @__PURE__ */ new Set();
|
|
1307
2029
|
_wasmDir;
|
|
1308
2030
|
/** Queue of waiters for the single-writer lock. */
|
|
1309
2031
|
_writeQueue = [];
|
|
@@ -1339,20 +2061,24 @@ var WorkerDaemon = class {
|
|
|
1339
2061
|
* catches this, prints to stderr, and exits with code 1
|
|
1340
2062
|
*/
|
|
1341
2063
|
checkPreconditions() {
|
|
1342
|
-
if (!(0,
|
|
2064
|
+
if (!(0, import_node_fs8.existsSync)(this.targetDir)) {
|
|
2065
|
+
log(
|
|
2066
|
+
`database directory not found: ${this.targetDir}`,
|
|
2067
|
+
3 /* ERROR */
|
|
2068
|
+
);
|
|
1343
2069
|
throw new Error(
|
|
1344
2070
|
`database directory not found: ${this.targetDir}`
|
|
1345
2071
|
);
|
|
1346
2072
|
}
|
|
1347
2073
|
try {
|
|
1348
|
-
(0,
|
|
2074
|
+
(0, import_node_fs8.accessSync)(
|
|
1349
2075
|
this.targetDir,
|
|
1350
|
-
|
|
2076
|
+
import_node_fs8.constants.R_OK | import_node_fs8.constants.W_OK
|
|
1351
2077
|
);
|
|
1352
2078
|
} catch {
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
);
|
|
2079
|
+
const msg = `cannot access database directory: ${this.targetDir} -- permission denied`;
|
|
2080
|
+
log(msg, 3 /* ERROR */);
|
|
2081
|
+
throw new Error(msg);
|
|
1356
2082
|
}
|
|
1357
2083
|
this.checkCatalogVersion();
|
|
1358
2084
|
}
|
|
@@ -1368,34 +2094,69 @@ var WorkerDaemon = class {
|
|
|
1368
2094
|
* be created
|
|
1369
2095
|
*/
|
|
1370
2096
|
async start() {
|
|
2097
|
+
log(
|
|
2098
|
+
"start: loading wasm modules ctx=" + this.ctx,
|
|
2099
|
+
0 /* DEBUG */
|
|
2100
|
+
);
|
|
1371
2101
|
const wasmModules = await loadWasmModules(
|
|
1372
2102
|
this.config,
|
|
1373
2103
|
this._wasmDir
|
|
1374
2104
|
);
|
|
1375
2105
|
this._wasmModules = wasmModules;
|
|
2106
|
+
log("start: wasm modules loaded", 0 /* DEBUG */);
|
|
2107
|
+
this._embeddingProvider = createEmbeddingProvider(
|
|
2108
|
+
this.config.embedding,
|
|
2109
|
+
wasmModules.embedding
|
|
2110
|
+
);
|
|
2111
|
+
log(
|
|
2112
|
+
"start: embedding provider created embedding=" + (this.config.embedding?.provider ?? "none"),
|
|
2113
|
+
0 /* DEBUG */
|
|
2114
|
+
);
|
|
1376
2115
|
this.initWorkerContext();
|
|
2116
|
+
log("start: worker context initialized", 0 /* DEBUG */);
|
|
1377
2117
|
this.runStartupIntegrityCheck();
|
|
1378
|
-
|
|
1379
|
-
|
|
2118
|
+
log(
|
|
2119
|
+
"start: integrity check done ok=" + String(this._integrityOk),
|
|
2120
|
+
0 /* DEBUG */
|
|
2121
|
+
);
|
|
1380
2122
|
const ipcPath = getIpcPath(this.ctx);
|
|
1381
|
-
if ((0,
|
|
2123
|
+
if ((0, import_node_fs8.existsSync)(ipcPath)) {
|
|
2124
|
+
log("start: removing stale socket " + ipcPath, 0 /* DEBUG */);
|
|
1382
2125
|
try {
|
|
1383
|
-
(0,
|
|
2126
|
+
(0, import_node_fs8.unlinkSync)(ipcPath);
|
|
1384
2127
|
} catch {
|
|
1385
2128
|
}
|
|
1386
2129
|
}
|
|
1387
2130
|
const handler = (req) => this.handleRequest(req);
|
|
1388
|
-
this._server = createIpcServer(ipcPath, handler);
|
|
1389
|
-
|
|
2131
|
+
this._server = await createIpcServer(ipcPath, handler);
|
|
2132
|
+
log("IPC server listening on " + ipcPath, 1 /* INFO */);
|
|
2133
|
+
this._server.on("connection", (socket) => {
|
|
2134
|
+
this._sockets.add(socket);
|
|
1390
2135
|
this.incrementConnections();
|
|
1391
2136
|
this.resetIdleTimer();
|
|
2137
|
+
log(
|
|
2138
|
+
"client connected (count: " + String(this._connectionCount) + ")",
|
|
2139
|
+
0 /* DEBUG */
|
|
2140
|
+
);
|
|
2141
|
+
socket.on("close", () => {
|
|
2142
|
+
this._sockets.delete(socket);
|
|
2143
|
+
this.decrementConnections();
|
|
2144
|
+
log(
|
|
2145
|
+
"client disconnected (count: " + String(this._connectionCount) + ")",
|
|
2146
|
+
0 /* DEBUG */
|
|
2147
|
+
);
|
|
2148
|
+
if (this._connectionCount === 0) {
|
|
2149
|
+
this.resetIdleTimer();
|
|
2150
|
+
}
|
|
2151
|
+
});
|
|
1392
2152
|
});
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
2153
|
+
const pidPath = (0, import_node_path9.join)((0, import_node_os2.tmpdir)(), `kbdb-${this.ctx}.pid`);
|
|
2154
|
+
(0, import_node_fs8.writeFileSync)(pidPath, process.pid.toString());
|
|
2155
|
+
log(
|
|
2156
|
+
"start: pid file written pid=" + String(process.pid),
|
|
2157
|
+
0 /* DEBUG */
|
|
2158
|
+
);
|
|
2159
|
+
log("start: daemon ready ctx=" + this.ctx, 0 /* DEBUG */);
|
|
1399
2160
|
this.resetIdleTimer();
|
|
1400
2161
|
}
|
|
1401
2162
|
/**
|
|
@@ -1406,30 +2167,44 @@ var WorkerDaemon = class {
|
|
|
1406
2167
|
* the process.
|
|
1407
2168
|
*/
|
|
1408
2169
|
stop() {
|
|
2170
|
+
log(
|
|
2171
|
+
"stop: entry sockets=" + String(this._sockets.size),
|
|
2172
|
+
0 /* DEBUG */
|
|
2173
|
+
);
|
|
2174
|
+
log("shutting down", 1 /* INFO */);
|
|
1409
2175
|
if (this._idleTimer !== null) {
|
|
1410
2176
|
clearTimeout(this._idleTimer);
|
|
1411
2177
|
this._idleTimer = null;
|
|
1412
2178
|
}
|
|
2179
|
+
for (const socket of this._sockets) {
|
|
2180
|
+
socket.destroy();
|
|
2181
|
+
}
|
|
2182
|
+
this._sockets.clear();
|
|
1413
2183
|
if (this._server !== null) {
|
|
1414
2184
|
this._server.close();
|
|
1415
2185
|
this._server = null;
|
|
2186
|
+
log("stop: server closed", 0 /* DEBUG */);
|
|
1416
2187
|
}
|
|
1417
2188
|
this._wasmModules = null;
|
|
1418
|
-
|
|
2189
|
+
log("stop: wasm resources released", 0 /* DEBUG */);
|
|
2190
|
+
const pidPath = (0, import_node_path9.join)((0, import_node_os2.tmpdir)(), `kbdb-${this.ctx}.pid`);
|
|
1419
2191
|
try {
|
|
1420
|
-
(0,
|
|
2192
|
+
(0, import_node_fs8.unlinkSync)(pidPath);
|
|
2193
|
+
log("stop: pid file removed", 0 /* DEBUG */);
|
|
1421
2194
|
} catch {
|
|
1422
2195
|
}
|
|
1423
2196
|
const ipcPath = getIpcPath(this.ctx);
|
|
1424
2197
|
try {
|
|
1425
|
-
(0,
|
|
2198
|
+
(0, import_node_fs8.unlinkSync)(ipcPath);
|
|
2199
|
+
log("stop: socket file removed", 0 /* DEBUG */);
|
|
1426
2200
|
} catch {
|
|
1427
2201
|
}
|
|
1428
|
-
const crashPath = (0,
|
|
2202
|
+
const crashPath = (0, import_node_path9.join)((0, import_node_os2.tmpdir)(), `kbdb-${this.ctx}.crash`);
|
|
1429
2203
|
try {
|
|
1430
|
-
(0,
|
|
2204
|
+
(0, import_node_fs8.unlinkSync)(crashPath);
|
|
1431
2205
|
} catch {
|
|
1432
2206
|
}
|
|
2207
|
+
log("stop: daemon exiting", 0 /* DEBUG */);
|
|
1433
2208
|
process.exit(0);
|
|
1434
2209
|
}
|
|
1435
2210
|
/**
|
|
@@ -1443,8 +2218,16 @@ var WorkerDaemon = class {
|
|
|
1443
2218
|
* @returns the JSON-RPC response
|
|
1444
2219
|
*/
|
|
1445
2220
|
async handleRequest(request) {
|
|
2221
|
+
log(
|
|
2222
|
+
"handle-request: method=" + request.method + " id=" + String(request.id),
|
|
2223
|
+
0 /* DEBUG */
|
|
2224
|
+
);
|
|
1446
2225
|
const params = request.params;
|
|
1447
2226
|
if (params === void 0 || params.ctx !== this.ctx) {
|
|
2227
|
+
log(
|
|
2228
|
+
"handle-request: context mismatch id=" + String(request.id),
|
|
2229
|
+
0 /* DEBUG */
|
|
2230
|
+
);
|
|
1448
2231
|
return this.errorResponse(
|
|
1449
2232
|
request.id,
|
|
1450
2233
|
-32001,
|
|
@@ -1455,6 +2238,10 @@ var WorkerDaemon = class {
|
|
|
1455
2238
|
try {
|
|
1456
2239
|
const result = await this.dispatch(request.method, params);
|
|
1457
2240
|
this._idleAt = Math.floor(Date.now() / 1e3);
|
|
2241
|
+
log(
|
|
2242
|
+
"handle-request: success method=" + request.method + " id=" + String(request.id),
|
|
2243
|
+
0 /* DEBUG */
|
|
2244
|
+
);
|
|
1458
2245
|
return {
|
|
1459
2246
|
jsonrpc: "2.0",
|
|
1460
2247
|
id: request.id,
|
|
@@ -1462,7 +2249,11 @@ var WorkerDaemon = class {
|
|
|
1462
2249
|
};
|
|
1463
2250
|
} catch (err) {
|
|
1464
2251
|
this._idleAt = Math.floor(Date.now() / 1e3);
|
|
1465
|
-
if (err instanceof
|
|
2252
|
+
if (err instanceof IpcError2) {
|
|
2253
|
+
log(
|
|
2254
|
+
"handle-request: ipc error method=" + request.method + " id=" + String(request.id) + " code=" + String(err.code),
|
|
2255
|
+
0 /* DEBUG */
|
|
2256
|
+
);
|
|
1466
2257
|
return this.errorResponse(
|
|
1467
2258
|
request.id,
|
|
1468
2259
|
err.code,
|
|
@@ -1470,6 +2261,10 @@ var WorkerDaemon = class {
|
|
|
1470
2261
|
);
|
|
1471
2262
|
}
|
|
1472
2263
|
const message = err instanceof Error ? err.message : String(err);
|
|
2264
|
+
log(
|
|
2265
|
+
"handle-request: error method=" + request.method + " id=" + String(request.id),
|
|
2266
|
+
0 /* DEBUG */
|
|
2267
|
+
);
|
|
1473
2268
|
return this.errorResponse(request.id, -32e3, message);
|
|
1474
2269
|
}
|
|
1475
2270
|
}
|
|
@@ -1513,37 +2308,45 @@ var WorkerDaemon = class {
|
|
|
1513
2308
|
clearTimeout(this._idleTimer);
|
|
1514
2309
|
}
|
|
1515
2310
|
if (this._connectionCount === 0) {
|
|
2311
|
+
log(
|
|
2312
|
+
"idle timer started (" + String(this.config.timeoutMs) + "ms)",
|
|
2313
|
+
0 /* DEBUG */
|
|
2314
|
+
);
|
|
1516
2315
|
this._idleTimer = setTimeout(() => {
|
|
2316
|
+
log(
|
|
2317
|
+
"idle timer fired: shutting down ctx=" + this.ctx,
|
|
2318
|
+
0 /* DEBUG */
|
|
2319
|
+
);
|
|
1517
2320
|
this.stop();
|
|
1518
2321
|
}, this.config.timeoutMs);
|
|
1519
2322
|
}
|
|
1520
2323
|
}
|
|
1521
2324
|
/** Reads catalog.toml and validates the version field. */
|
|
1522
2325
|
checkCatalogVersion() {
|
|
1523
|
-
const catalogPath = (0,
|
|
2326
|
+
const catalogPath = (0, import_node_path9.join)(this.targetDir, "catalog.toml");
|
|
1524
2327
|
let text;
|
|
1525
2328
|
try {
|
|
1526
|
-
text = (0,
|
|
2329
|
+
text = (0, import_node_fs8.readFileSync)(catalogPath, "utf-8");
|
|
1527
2330
|
} catch {
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
);
|
|
2331
|
+
const msg = `cannot read database directory: ${this.targetDir} -- permission denied`;
|
|
2332
|
+
log(msg, 3 /* ERROR */);
|
|
2333
|
+
throw new Error(msg);
|
|
1531
2334
|
}
|
|
1532
2335
|
const version = parseCatalogVersion(text);
|
|
1533
2336
|
if (version === null) {
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
);
|
|
2337
|
+
const msg = "database version 0 requires migration to version " + String(DB_FORMAT_VERSION) + " -- run `kbdb --migrate` before starting the daemon";
|
|
2338
|
+
log(msg, 3 /* ERROR */);
|
|
2339
|
+
throw new Error(msg);
|
|
1537
2340
|
}
|
|
1538
2341
|
if (version > DB_FORMAT_VERSION) {
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
);
|
|
2342
|
+
const msg = "database version " + String(version) + " is newer than kbdb version " + String(DB_FORMAT_VERSION) + " -- upgrade kbdb to open this database";
|
|
2343
|
+
log(msg, 3 /* ERROR */);
|
|
2344
|
+
throw new Error(msg);
|
|
1542
2345
|
}
|
|
1543
2346
|
if (version < DB_FORMAT_VERSION) {
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
);
|
|
2347
|
+
const msg = "database version " + String(version) + " requires migration to version " + String(DB_FORMAT_VERSION) + " -- run `kbdb --migrate` before starting the daemon";
|
|
2348
|
+
log(msg, 3 /* ERROR */);
|
|
2349
|
+
throw new Error(msg);
|
|
1547
2350
|
}
|
|
1548
2351
|
}
|
|
1549
2352
|
/** Builds a JSON-RPC error response. */
|
|
@@ -1582,7 +2385,7 @@ var WorkerDaemon = class {
|
|
|
1582
2385
|
if (wasmMethod !== void 0) {
|
|
1583
2386
|
return this.dispatchWasm(method, wasmMethod, params);
|
|
1584
2387
|
}
|
|
1585
|
-
throw new
|
|
2388
|
+
throw new IpcError2(-32601, `Method not found: ${method}`);
|
|
1586
2389
|
}
|
|
1587
2390
|
async dispatchWasm(method, wasmExport, params) {
|
|
1588
2391
|
if (method === "search" || method === "query") {
|
|
@@ -1648,13 +2451,16 @@ var WorkerDaemon = class {
|
|
|
1648
2451
|
return this.handleGc();
|
|
1649
2452
|
}
|
|
1650
2453
|
if (method === "rebuildIndexes" || method === "rebuild_indexes") {
|
|
1651
|
-
return this.handleRebuild();
|
|
2454
|
+
return await this.handleRebuild();
|
|
1652
2455
|
}
|
|
1653
2456
|
if (method === "initDirectory" || method === "init_directory") {
|
|
1654
2457
|
return this.handleInitDirectory(params);
|
|
1655
2458
|
}
|
|
2459
|
+
if (method === "importDb" || method === "import_db") {
|
|
2460
|
+
return await this.handleImport(params);
|
|
2461
|
+
}
|
|
1656
2462
|
if (method === "migrateDatabase") {
|
|
1657
|
-
throw new
|
|
2463
|
+
throw new IpcError2(
|
|
1658
2464
|
-32601,
|
|
1659
2465
|
"migrateDatabase is not yet supported"
|
|
1660
2466
|
);
|
|
@@ -1665,12 +2471,25 @@ var WorkerDaemon = class {
|
|
|
1665
2471
|
}
|
|
1666
2472
|
}
|
|
1667
2473
|
// -- Search/query (token-based async) --
|
|
1668
|
-
handleSearch(params) {
|
|
2474
|
+
async handleSearch(params) {
|
|
1669
2475
|
const query = params["query"] ?? "";
|
|
1670
2476
|
const mode = params["mode"] ?? "and";
|
|
1671
2477
|
const limit = Number(params["limit"] ?? 20);
|
|
1672
2478
|
const offset = Number(params["offset"] ?? 0);
|
|
2479
|
+
const algo = params["algo"] ?? "lexical";
|
|
1673
2480
|
const encoded = encodeSearchParams(query, mode, limit, offset);
|
|
2481
|
+
const start = Date.now();
|
|
2482
|
+
const lexical = this.runLexicalSearch(encoded);
|
|
2483
|
+
const fused = await fuseSearchResults(
|
|
2484
|
+
lexical,
|
|
2485
|
+
algo,
|
|
2486
|
+
query,
|
|
2487
|
+
this._embeddingProvider ?? void 0,
|
|
2488
|
+
this.targetDir
|
|
2489
|
+
);
|
|
2490
|
+
return { ...fused, elapsed_ms: Date.now() - start };
|
|
2491
|
+
}
|
|
2492
|
+
runLexicalSearch(encoded) {
|
|
1674
2493
|
const searchFn = this.getExport("worker_search");
|
|
1675
2494
|
const ptr = this.wasmAlloc(encoded.length);
|
|
1676
2495
|
this.wasmWrite(ptr, encoded);
|
|
@@ -1679,20 +2498,17 @@ var WorkerDaemon = class {
|
|
|
1679
2498
|
const statusFn = this.getExport("worker_result_status");
|
|
1680
2499
|
const status = statusFn(token);
|
|
1681
2500
|
if (status === 3) {
|
|
1682
|
-
|
|
1683
|
-
getResultFn2(token);
|
|
2501
|
+
this.getExport("worker_get_result")(token);
|
|
1684
2502
|
const errBytes = this.readReturnSlot();
|
|
1685
|
-
|
|
1686
|
-
throw new IpcError(-32e3, errMsg);
|
|
2503
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1687
2504
|
}
|
|
1688
2505
|
const getResultFn = this.getExport("worker_get_result");
|
|
1689
2506
|
const rc = getResultFn(token);
|
|
1690
2507
|
if (rc === -1) {
|
|
1691
2508
|
const errBytes = this.readReturnSlot();
|
|
1692
|
-
throw new
|
|
2509
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1693
2510
|
}
|
|
1694
|
-
|
|
1695
|
-
return decodePagedSearchResult(resultBytes);
|
|
2511
|
+
return decodePagedSearchResult(this.readReturnSlot());
|
|
1696
2512
|
}
|
|
1697
2513
|
// -- Token status/result (u32 direct params) --
|
|
1698
2514
|
handleResultStatus(params) {
|
|
@@ -1707,7 +2523,7 @@ var WorkerDaemon = class {
|
|
|
1707
2523
|
const rc = fn(token);
|
|
1708
2524
|
if (rc === -1) {
|
|
1709
2525
|
const errBytes = this.readReturnSlot();
|
|
1710
|
-
throw new
|
|
2526
|
+
throw new IpcError2(-32e3, new TextDecoder().decode(errBytes));
|
|
1711
2527
|
}
|
|
1712
2528
|
const bytes = this.readReturnSlot();
|
|
1713
2529
|
return decodePagedSearchResult(bytes);
|
|
@@ -1734,7 +2550,11 @@ var WorkerDaemon = class {
|
|
|
1734
2550
|
const encoded = encodeAddSectionParams(input);
|
|
1735
2551
|
const bytes = this.callWasmSync("worker_add_section", encoded);
|
|
1736
2552
|
const decoded = decodeAddSectionResult(bytes);
|
|
1737
|
-
const
|
|
2553
|
+
const wasmDups = decoded.nearDuplicates;
|
|
2554
|
+
const tsDups = wasmDups.length > 0 ? [] : this.scanNearDuplicates(input.content, decoded.kbid);
|
|
2555
|
+
const nearDups = (wasmDups.length > 0 ? wasmDups : tsDups).map(
|
|
2556
|
+
(d) => ({ ...d, method: "jaccard" })
|
|
2557
|
+
);
|
|
1738
2558
|
return {
|
|
1739
2559
|
kbid: decoded.kbid,
|
|
1740
2560
|
indexed_terms_count: decoded.indexedTermsCount,
|
|
@@ -1823,7 +2643,7 @@ var WorkerDaemon = class {
|
|
|
1823
2643
|
this.wasmFree(ptr, encoded.length);
|
|
1824
2644
|
if (rc === -1) {
|
|
1825
2645
|
const errBytes = this.readReturnSlot();
|
|
1826
|
-
throw new
|
|
2646
|
+
throw new IpcError2(
|
|
1827
2647
|
-32e3,
|
|
1828
2648
|
new TextDecoder().decode(errBytes) || "invalidate failed"
|
|
1829
2649
|
);
|
|
@@ -1862,7 +2682,12 @@ var WorkerDaemon = class {
|
|
|
1862
2682
|
this.callWasmZeroArg("worker_status");
|
|
1863
2683
|
const bytes = this.readReturnSlot();
|
|
1864
2684
|
const text = new TextDecoder().decode(bytes);
|
|
1865
|
-
|
|
2685
|
+
const kv = decodeKeyValueText(text);
|
|
2686
|
+
const mem = this._wasmModules?.memory;
|
|
2687
|
+
if (mem) {
|
|
2688
|
+
kv["wasm_memory_bytes"] = String(mem.buffer.byteLength);
|
|
2689
|
+
}
|
|
2690
|
+
return kv;
|
|
1866
2691
|
}
|
|
1867
2692
|
handleIntegrityCheck() {
|
|
1868
2693
|
this.callWasmZeroArg("worker_check_integrity");
|
|
@@ -1885,13 +2710,13 @@ var WorkerDaemon = class {
|
|
|
1885
2710
|
stale_sources: staleSources
|
|
1886
2711
|
};
|
|
1887
2712
|
}
|
|
1888
|
-
handleRebuild() {
|
|
2713
|
+
async handleRebuild() {
|
|
1889
2714
|
const fn = this.getExport("worker_rebuild_indexes");
|
|
1890
2715
|
const rc = fn();
|
|
1891
2716
|
if (rc === -1) {
|
|
1892
2717
|
const errBytes = this.readReturnSlot();
|
|
1893
2718
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
1894
|
-
throw new
|
|
2719
|
+
throw new IpcError2(-32e3, errMsg || "rebuild failed");
|
|
1895
2720
|
}
|
|
1896
2721
|
const resultBytes = this.readReturnSlot();
|
|
1897
2722
|
const reindexed = resultBytes.length >= 4 ? new DataView(
|
|
@@ -1899,7 +2724,18 @@ var WorkerDaemon = class {
|
|
|
1899
2724
|
resultBytes.byteOffset,
|
|
1900
2725
|
resultBytes.byteLength
|
|
1901
2726
|
).getUint32(0, true) : 0;
|
|
1902
|
-
|
|
2727
|
+
let vectorsRebuilt = 0;
|
|
2728
|
+
if (this._embeddingProvider !== null) {
|
|
2729
|
+
vectorsRebuilt = await rebuildVectors(
|
|
2730
|
+
this.targetDir,
|
|
2731
|
+
this._embeddingProvider
|
|
2732
|
+
);
|
|
2733
|
+
}
|
|
2734
|
+
return {
|
|
2735
|
+
ok: true,
|
|
2736
|
+
sections_reindexed: reindexed,
|
|
2737
|
+
vectors_rebuilt: vectorsRebuilt
|
|
2738
|
+
};
|
|
1903
2739
|
}
|
|
1904
2740
|
// -- Export (read operation, no lock required) --
|
|
1905
2741
|
handleExport(params) {
|
|
@@ -1917,14 +2753,57 @@ var WorkerDaemon = class {
|
|
|
1917
2753
|
elapsed_ms: elapsed
|
|
1918
2754
|
};
|
|
1919
2755
|
}
|
|
2756
|
+
async handleImport(params) {
|
|
2757
|
+
const sourcePath = params["sourcePath"] ?? "";
|
|
2758
|
+
const dryRun = params["dryRun"] === true;
|
|
2759
|
+
const start = Date.now();
|
|
2760
|
+
const sectionCount = this.countFiles(
|
|
2761
|
+
(0, import_node_path9.join)(sourcePath, "sections"),
|
|
2762
|
+
".section"
|
|
2763
|
+
);
|
|
2764
|
+
const documentCount = this.countFiles(
|
|
2765
|
+
(0, import_node_path9.join)(sourcePath, "documents"),
|
|
2766
|
+
".toml"
|
|
2767
|
+
);
|
|
2768
|
+
let rebuilt = false;
|
|
2769
|
+
if (!dryRun && sectionCount > 0) {
|
|
2770
|
+
await this.handleRebuild();
|
|
2771
|
+
rebuilt = true;
|
|
2772
|
+
}
|
|
2773
|
+
return {
|
|
2774
|
+
sections_imported: sectionCount,
|
|
2775
|
+
documents_imported: documentCount,
|
|
2776
|
+
rebuilt,
|
|
2777
|
+
dry_run: dryRun,
|
|
2778
|
+
elapsed_ms: Date.now() - start
|
|
2779
|
+
};
|
|
2780
|
+
}
|
|
2781
|
+
countFiles(dir, ext) {
|
|
2782
|
+
if (!(0, import_node_fs8.existsSync)(dir)) return 0;
|
|
2783
|
+
return this.collectFiles(dir, ext).length;
|
|
2784
|
+
}
|
|
2785
|
+
collectFiles(dir, ext) {
|
|
2786
|
+
const result = [];
|
|
2787
|
+
for (const entry of (0, import_node_fs8.readdirSync)(dir, {
|
|
2788
|
+
withFileTypes: true
|
|
2789
|
+
})) {
|
|
2790
|
+
const full = (0, import_node_path9.join)(dir, entry.name);
|
|
2791
|
+
if (entry.isDirectory()) {
|
|
2792
|
+
result.push(...this.collectFiles(full, ext));
|
|
2793
|
+
} else if (entry.name.endsWith(ext)) {
|
|
2794
|
+
result.push(full);
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
return result;
|
|
2798
|
+
}
|
|
1920
2799
|
// -- Near-duplicate detection --
|
|
1921
2800
|
scanNearDuplicates(content, newKbid) {
|
|
1922
2801
|
const newTerms = this.extractTermSet(content);
|
|
1923
2802
|
if (newTerms.size === 0) return [];
|
|
1924
|
-
const sectionsDir = (0,
|
|
2803
|
+
const sectionsDir = (0, import_node_path9.join)(this.targetDir, "sections");
|
|
1925
2804
|
let shards;
|
|
1926
2805
|
try {
|
|
1927
|
-
shards = (0,
|
|
2806
|
+
shards = (0, import_node_fs8.readdirSync)(sectionsDir);
|
|
1928
2807
|
} catch {
|
|
1929
2808
|
return [];
|
|
1930
2809
|
}
|
|
@@ -1932,7 +2811,7 @@ var WorkerDaemon = class {
|
|
|
1932
2811
|
for (const shard of shards) {
|
|
1933
2812
|
let files;
|
|
1934
2813
|
try {
|
|
1935
|
-
files = (0,
|
|
2814
|
+
files = (0, import_node_fs8.readdirSync)((0, import_node_path9.join)(sectionsDir, shard));
|
|
1936
2815
|
} catch {
|
|
1937
2816
|
continue;
|
|
1938
2817
|
}
|
|
@@ -1941,8 +2820,8 @@ var WorkerDaemon = class {
|
|
|
1941
2820
|
const kbid = file.slice(0, -8);
|
|
1942
2821
|
if (kbid === newKbid) continue;
|
|
1943
2822
|
try {
|
|
1944
|
-
const data = (0,
|
|
1945
|
-
(0,
|
|
2823
|
+
const data = (0, import_node_fs8.readFileSync)(
|
|
2824
|
+
(0, import_node_path9.join)(sectionsDir, shard, file),
|
|
1946
2825
|
"utf-8"
|
|
1947
2826
|
);
|
|
1948
2827
|
const sep = data.indexOf("\n---\n");
|
|
@@ -1983,8 +2862,13 @@ var WorkerDaemon = class {
|
|
|
1983
2862
|
acquireWriteLock() {
|
|
1984
2863
|
if (!this._writeLocked) {
|
|
1985
2864
|
this._writeLocked = true;
|
|
2865
|
+
log("write-lock: acquired", 0 /* DEBUG */);
|
|
1986
2866
|
return Promise.resolve();
|
|
1987
2867
|
}
|
|
2868
|
+
log(
|
|
2869
|
+
"write-lock: queued depth=" + String(this._writeQueue.length + 1),
|
|
2870
|
+
0 /* DEBUG */
|
|
2871
|
+
);
|
|
1988
2872
|
return new Promise((resolve2) => {
|
|
1989
2873
|
this._writeQueue.push({ resolve: resolve2 });
|
|
1990
2874
|
});
|
|
@@ -1998,9 +2882,14 @@ var WorkerDaemon = class {
|
|
|
1998
2882
|
releaseWriteLock() {
|
|
1999
2883
|
const next = this._writeQueue.shift();
|
|
2000
2884
|
if (next !== void 0) {
|
|
2885
|
+
log(
|
|
2886
|
+
"write-lock: released to next waiter depth=" + String(this._writeQueue.length),
|
|
2887
|
+
0 /* DEBUG */
|
|
2888
|
+
);
|
|
2001
2889
|
next.resolve();
|
|
2002
2890
|
} else {
|
|
2003
2891
|
this._writeLocked = false;
|
|
2892
|
+
log("write-lock: released", 0 /* DEBUG */);
|
|
2004
2893
|
}
|
|
2005
2894
|
}
|
|
2006
2895
|
// -- WASM lifecycle --
|
|
@@ -2025,26 +2914,29 @@ var WorkerDaemon = class {
|
|
|
2025
2914
|
this._integrityOk = kv["ok"] === "true";
|
|
2026
2915
|
if (!this._integrityOk) {
|
|
2027
2916
|
this._integrityErrors = Object.entries(kv).filter(([k]) => k !== "ok").map(([k, v]) => `${k}=${v}`);
|
|
2028
|
-
|
|
2029
|
-
"[kbdb-worker] startup integrity check failed:",
|
|
2030
|
-
|
|
2917
|
+
log(
|
|
2918
|
+
"[kbdb-worker] startup integrity check failed: " + this._integrityErrors.join(", "),
|
|
2919
|
+
2 /* WARNING */
|
|
2031
2920
|
);
|
|
2032
2921
|
}
|
|
2033
2922
|
} catch {
|
|
2034
2923
|
this._integrityOk = false;
|
|
2035
2924
|
this._integrityErrors = ["integrity_check_failed"];
|
|
2036
|
-
|
|
2037
|
-
"[kbdb-worker] startup integrity check threw an error"
|
|
2925
|
+
log(
|
|
2926
|
+
"[kbdb-worker] startup integrity check threw an error",
|
|
2927
|
+
2 /* WARNING */
|
|
2038
2928
|
);
|
|
2039
2929
|
}
|
|
2040
2930
|
}
|
|
2041
2931
|
// -- WASM bridge primitives --
|
|
2042
2932
|
getExport(name) {
|
|
2043
2933
|
if (this._wasmModules === null) {
|
|
2934
|
+
log("WASM modules not loaded", 3 /* ERROR */);
|
|
2044
2935
|
throw new Error("WASM modules not loaded");
|
|
2045
2936
|
}
|
|
2046
2937
|
const fn = this._wasmModules.kbWorker.exports[name];
|
|
2047
2938
|
if (typeof fn !== "function") {
|
|
2939
|
+
log(`WASM export not found: ${name}`, 3 /* ERROR */);
|
|
2048
2940
|
throw new Error(`WASM export not found: ${name}`);
|
|
2049
2941
|
}
|
|
2050
2942
|
return fn;
|
|
@@ -2068,6 +2960,7 @@ var WorkerDaemon = class {
|
|
|
2068
2960
|
if (!memory) return;
|
|
2069
2961
|
const memView = new Uint8Array(memory.buffer);
|
|
2070
2962
|
if (ptr + data.length > memView.length) {
|
|
2963
|
+
log("WASM memory overflow", 3 /* ERROR */);
|
|
2071
2964
|
throw new Error("WASM memory overflow");
|
|
2072
2965
|
}
|
|
2073
2966
|
memView.set(data, ptr);
|
|
@@ -2098,7 +2991,7 @@ var WorkerDaemon = class {
|
|
|
2098
2991
|
if (rc === -1) {
|
|
2099
2992
|
const errBytes = this.readReturnSlot();
|
|
2100
2993
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
2101
|
-
throw new
|
|
2994
|
+
throw new IpcError2(-32e3, errMsg || exportName + " failed");
|
|
2102
2995
|
}
|
|
2103
2996
|
return this.readReturnSlot();
|
|
2104
2997
|
}
|
|
@@ -2108,7 +3001,7 @@ var WorkerDaemon = class {
|
|
|
2108
3001
|
if (rc === -1) {
|
|
2109
3002
|
const errBytes = this.readReturnSlot();
|
|
2110
3003
|
const errMsg = new TextDecoder().decode(errBytes);
|
|
2111
|
-
throw new
|
|
3004
|
+
throw new IpcError2(-32e3, errMsg || exportName + " failed");
|
|
2112
3005
|
}
|
|
2113
3006
|
}
|
|
2114
3007
|
invokeWasmRaw(exportName, input) {
|
|
@@ -2116,10 +3009,10 @@ var WorkerDaemon = class {
|
|
|
2116
3009
|
}
|
|
2117
3010
|
handleCheckVersion(params) {
|
|
2118
3011
|
const targetPath = typeof params.targetPath === "string" ? params.targetPath : this.targetDir;
|
|
2119
|
-
const catalogPath = (0,
|
|
3012
|
+
const catalogPath = (0, import_node_path9.join)(targetPath, "catalog.toml");
|
|
2120
3013
|
let text;
|
|
2121
3014
|
try {
|
|
2122
|
-
text = (0,
|
|
3015
|
+
text = (0, import_node_fs8.readFileSync)(catalogPath, "utf-8");
|
|
2123
3016
|
} catch {
|
|
2124
3017
|
return {
|
|
2125
3018
|
status: "needs_migration",
|
|
@@ -2160,7 +3053,7 @@ var WorkerDaemon = class {
|
|
|
2160
3053
|
const key = method.slice(CONFIG_PREFIX.length);
|
|
2161
3054
|
const prop = CONFIG_KEY_MAP[key];
|
|
2162
3055
|
if (prop === void 0) {
|
|
2163
|
-
throw new
|
|
3056
|
+
throw new IpcError2(-32601, `Method not found: ${method}`);
|
|
2164
3057
|
}
|
|
2165
3058
|
return this.config[prop];
|
|
2166
3059
|
}
|
|
@@ -2179,9 +3072,18 @@ function parseCatalogVersion(text) {
|
|
|
2179
3072
|
|
|
2180
3073
|
// src/shared/worker-daemon/functions/start-daemon.function.ts
|
|
2181
3074
|
async function startDaemon(contextPath, wasmDir2) {
|
|
3075
|
+
log(
|
|
3076
|
+
"start-daemon: entry contextPath=" + contextPath,
|
|
3077
|
+
0 /* DEBUG */
|
|
3078
|
+
);
|
|
2182
3079
|
const config = readConfig(contextPath);
|
|
3080
|
+
log(
|
|
3081
|
+
"start-daemon: config loaded timeoutMs=" + String(config.timeoutMs) + " embedding=" + (config.embedding?.provider ?? "none"),
|
|
3082
|
+
0 /* DEBUG */
|
|
3083
|
+
);
|
|
2183
3084
|
const hash = await computeSha256(contextPath);
|
|
2184
3085
|
const contextId = hash.slice(0, 16);
|
|
3086
|
+
log("start-daemon: contextId=" + contextId, 0 /* DEBUG */);
|
|
2185
3087
|
const daemon = new WorkerDaemon(
|
|
2186
3088
|
contextId,
|
|
2187
3089
|
contextPath,
|
|
@@ -2192,48 +3094,69 @@ async function startDaemon(contextPath, wasmDir2) {
|
|
|
2192
3094
|
daemon.checkPreconditions();
|
|
2193
3095
|
} catch (err) {
|
|
2194
3096
|
const message = err instanceof Error ? err.message : String(err);
|
|
2195
|
-
|
|
3097
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
2196
3098
|
writeCrashLog(contextId, message);
|
|
2197
3099
|
process.exit(1);
|
|
2198
3100
|
}
|
|
3101
|
+
log("preconditions passed", 0 /* DEBUG */);
|
|
2199
3102
|
try {
|
|
2200
3103
|
await daemon.start();
|
|
2201
3104
|
} catch (err) {
|
|
2202
3105
|
const message = err instanceof Error ? err.message : String(err);
|
|
2203
|
-
|
|
3106
|
+
log(`kbdb-worker: ${message}`, 3 /* ERROR */);
|
|
2204
3107
|
writeCrashLog(contextId, message);
|
|
2205
3108
|
process.exit(1);
|
|
2206
3109
|
}
|
|
3110
|
+
log("daemon started", 1 /* INFO */);
|
|
3111
|
+
log(
|
|
3112
|
+
"start-daemon: registering SIGTERM/SIGINT handlers",
|
|
3113
|
+
0 /* DEBUG */
|
|
3114
|
+
);
|
|
2207
3115
|
process.on("SIGTERM", () => {
|
|
3116
|
+
log("start-daemon: SIGTERM received", 0 /* DEBUG */);
|
|
2208
3117
|
daemon.stop();
|
|
2209
3118
|
});
|
|
2210
3119
|
process.on("SIGINT", () => {
|
|
3120
|
+
log("start-daemon: SIGINT received", 0 /* DEBUG */);
|
|
2211
3121
|
daemon.stop();
|
|
2212
3122
|
});
|
|
2213
3123
|
}
|
|
2214
3124
|
function writeCrashLog(contextId, message) {
|
|
2215
3125
|
try {
|
|
2216
|
-
const crashPath = (0,
|
|
3126
|
+
const crashPath = (0, import_node_path10.join)((0, import_node_os3.tmpdir)(), `kbdb-${contextId}.crash`);
|
|
2217
3127
|
const payload = JSON.stringify({
|
|
2218
3128
|
error: message,
|
|
2219
3129
|
timestamp: Date.now()
|
|
2220
3130
|
});
|
|
2221
|
-
(0,
|
|
3131
|
+
(0, import_node_fs9.writeFileSync)(crashPath, payload);
|
|
2222
3132
|
} catch {
|
|
2223
3133
|
}
|
|
2224
3134
|
}
|
|
2225
3135
|
|
|
2226
3136
|
// src/shared/worker-daemon/functions/run-worker.function.ts
|
|
2227
|
-
var
|
|
2228
|
-
|
|
2229
|
-
|
|
3137
|
+
var import_node_path11 = require("node:path");
|
|
3138
|
+
|
|
3139
|
+
// src/shared/log/functions/parse-log-level.function.ts
|
|
3140
|
+
var LOG_LEVEL_MAP = {
|
|
3141
|
+
debug: 0 /* DEBUG */,
|
|
3142
|
+
info: 1 /* INFO */,
|
|
3143
|
+
warning: 2 /* WARNING */,
|
|
3144
|
+
error: 3 /* ERROR */
|
|
3145
|
+
};
|
|
3146
|
+
function parseLogLevel(value) {
|
|
3147
|
+
return LOG_LEVEL_MAP[value.toLowerCase()] ?? 2 /* WARNING */;
|
|
3148
|
+
}
|
|
3149
|
+
|
|
3150
|
+
// src/shared/worker-daemon/functions/run-worker.function.ts
|
|
3151
|
+
async function runWorker(argv2, deps) {
|
|
3152
|
+
const { contextPath, logLevel } = parseWorkerArgs(argv2);
|
|
2230
3153
|
if (!contextPath) {
|
|
2231
3154
|
return {
|
|
2232
|
-
error: "usage: kbdb-worker <context-path>",
|
|
3155
|
+
error: "usage: kbdb-worker <context-path> [--log-level <level>]",
|
|
2233
3156
|
exitCode: 1
|
|
2234
3157
|
};
|
|
2235
3158
|
}
|
|
2236
|
-
const resolved = (0,
|
|
3159
|
+
const resolved = (0, import_node_path11.resolve)(contextPath);
|
|
2237
3160
|
if (!deps.existsSync(resolved)) {
|
|
2238
3161
|
return {
|
|
2239
3162
|
error: `error: path not found: ${resolved}`,
|
|
@@ -2241,28 +3164,85 @@ async function runWorker(argv, deps) {
|
|
|
2241
3164
|
};
|
|
2242
3165
|
}
|
|
2243
3166
|
await deps.startDaemon(resolved, deps.wasmDir);
|
|
2244
|
-
return { exitCode: 0 };
|
|
3167
|
+
return { exitCode: 0, logLevel };
|
|
3168
|
+
}
|
|
3169
|
+
function parseWorkerArgs(argv2) {
|
|
3170
|
+
let contextPath;
|
|
3171
|
+
let logLevel;
|
|
3172
|
+
for (let i = 0; i < argv2.length; i++) {
|
|
3173
|
+
if (argv2[i] === "--log-level" && argv2[i + 1]) {
|
|
3174
|
+
logLevel = parseLogLevel(argv2[++i]);
|
|
3175
|
+
} else if (!contextPath) {
|
|
3176
|
+
contextPath = argv2[i];
|
|
3177
|
+
}
|
|
3178
|
+
}
|
|
3179
|
+
return { contextPath, logLevel };
|
|
3180
|
+
}
|
|
3181
|
+
|
|
3182
|
+
// src/shared/log/functions/resolve-log-level.function.ts
|
|
3183
|
+
function resolveLogLevel(cliLevel) {
|
|
3184
|
+
if (cliLevel !== void 0) {
|
|
3185
|
+
return cliLevel;
|
|
3186
|
+
}
|
|
3187
|
+
const envValue = process.env["KBDB_LOG_LEVEL"];
|
|
3188
|
+
if (envValue !== void 0) {
|
|
3189
|
+
return parseLogLevel(envValue);
|
|
3190
|
+
}
|
|
3191
|
+
return DEFAULT_LOG_LEVEL;
|
|
3192
|
+
}
|
|
3193
|
+
|
|
3194
|
+
// src/shared/log/functions/configure-log.function.ts
|
|
3195
|
+
function configureLog(config) {
|
|
3196
|
+
setLogLevel(config.level);
|
|
3197
|
+
if (config.outputs === void 0) {
|
|
3198
|
+
return;
|
|
3199
|
+
}
|
|
3200
|
+
const levels = [
|
|
3201
|
+
0 /* DEBUG */,
|
|
3202
|
+
1 /* INFO */,
|
|
3203
|
+
2 /* WARNING */,
|
|
3204
|
+
3 /* ERROR */
|
|
3205
|
+
];
|
|
3206
|
+
for (const level of levels) {
|
|
3207
|
+
const output = config.outputs[level];
|
|
3208
|
+
if (output !== void 0) {
|
|
3209
|
+
setLogOutput(level, output.write);
|
|
3210
|
+
}
|
|
3211
|
+
}
|
|
2245
3212
|
}
|
|
2246
3213
|
|
|
2247
3214
|
// src/worker.ts
|
|
2248
3215
|
var import_meta = {};
|
|
2249
3216
|
var baseDir = resolveBaseDir(import_meta.url, import_meta.dirname);
|
|
2250
3217
|
var wasmDir = resolveWasmDir(baseDir.scriptDir);
|
|
3218
|
+
var argv = getArgs();
|
|
3219
|
+
var cliLogLevel = extractLogLevel(argv);
|
|
3220
|
+
configureLog({ level: resolveLogLevel(cliLogLevel) });
|
|
3221
|
+
log("daemon process starting", 0 /* DEBUG */);
|
|
2251
3222
|
async function main() {
|
|
2252
|
-
const result = await runWorker(
|
|
2253
|
-
existsSync:
|
|
3223
|
+
const result = await runWorker(argv, {
|
|
3224
|
+
existsSync: import_node_fs10.existsSync,
|
|
2254
3225
|
startDaemon,
|
|
2255
3226
|
wasmDir
|
|
2256
3227
|
});
|
|
2257
3228
|
if (result.error) {
|
|
2258
|
-
|
|
3229
|
+
log(result.error, 3 /* ERROR */);
|
|
2259
3230
|
}
|
|
2260
3231
|
if (result.exitCode !== 0) {
|
|
2261
3232
|
process.exitCode = result.exitCode;
|
|
2262
3233
|
}
|
|
2263
3234
|
}
|
|
2264
3235
|
main().catch((err) => {
|
|
2265
|
-
|
|
3236
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
3237
|
+
log(msg, 3 /* ERROR */);
|
|
2266
3238
|
process.exitCode = 1;
|
|
2267
3239
|
});
|
|
3240
|
+
function extractLogLevel(args) {
|
|
3241
|
+
for (let i = 0; i < args.length; i++) {
|
|
3242
|
+
if (args[i] === "--log-level" && args[i + 1]) {
|
|
3243
|
+
return parseLogLevel(args[i + 1]);
|
|
3244
|
+
}
|
|
3245
|
+
}
|
|
3246
|
+
return void 0;
|
|
3247
|
+
}
|
|
2268
3248
|
//# sourceMappingURL=kbdb-worker.cjs.map
|