@dikolab/kbdb 0.3.2 → 0.4.0
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 +83 -89
- package/dist/chunk-BJPSPNGX.mjs +223 -0
- package/dist/chunk-BJPSPNGX.mjs.map +7 -0
- package/dist/cli.cjs +956 -319
- package/dist/cli.cjs.map +4 -4
- package/dist/cli.d.ts +9 -0
- package/dist/cli.mjs +840 -321
- package/dist/cli.mjs.map +4 -4
- package/dist/kbdb-worker.cjs +714 -94
- package/dist/kbdb-worker.cjs.map +4 -4
- package/dist/mod.cjs +122 -16
- package/dist/mod.cjs.map +3 -3
- package/dist/mod.d.ts +23 -2
- package/dist/mod.mjs +121 -16
- package/dist/mod.mjs.map +3 -3
- 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 +17 -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/functions/append-vector-entry.function.d.ts +14 -0
- package/dist/src/shared/embedding/functions/create-embedding-provider.function.d.ts +12 -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 +7 -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/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 +31 -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 +17 -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 +5 -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/typings/handler-context.interface.d.ts +3 -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/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 +606 -102
- package/dist/worker.mjs.map +4 -4
- package/docs/details/README.md +4 -0
- package/docs/details/agent-tooling.md +122 -0
- package/docs/details/cli.md +70 -13
- package/docs/details/knowledge-base.md +173 -0
- package/docs/details/library-api.md +42 -2
- package/docs/details/mcp-server.md +38 -7
- package/docs/details/search-and-ranking.md +11 -10
- package/docs/goals/cli.md +110 -34
- package/docs/goals/mcp.md +22 -19
- package/docs/goals/query-parser.md +8 -0
- package/docs/goals/worker-client.md +62 -1
- package/docs/goals/worker-daemon.md +52 -10
- package/docs/modules/typescript/cli.md +1 -1
- package/docs/modules/typescript/shared/cli/functions.md +116 -13
- package/docs/modules/typescript/shared/cli/module.md +33 -20
- package/docs/modules/typescript/shared/cli/typings.md +4 -0
- package/docs/modules/typescript/shared/embedding/functions.md +104 -25
- 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/worker-client/module.md +9 -1
- package/docs/modules/typescript/shared/worker-client/typings.md +3 -0
- package/docs/modules/typescript/shared/worker-daemon/module.md +6 -3
- package/docs/overview.md +1 -2
- package/docs/release-notes/0.4.0.md +80 -0
- package/docs/release-notes/README.md +1 -0
- package/mod.ts +33 -15
- package/package.json +11 -10
- 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 +0 -0
- 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.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/worker.ts", "../src/shared/runtime/functions/detect-runtime.ts", "../src/shared/runtime/functions/get-args.ts", "../src/shared/dir-resolver/functions/resolve-base-dir.function.ts", "../src/shared/dir-resolver/functions/join-path.function.ts", "../src/shared/dir-resolver/functions/resolve-wasm-dir.function.ts", "../src/shared/worker-daemon/functions/read-config.function.ts", "../src/shared/worker-daemon/constants/daemon-defaults.constant.ts", "../src/shared/worker-daemon/functions/start-daemon.function.ts", "../src/shared/hash/functions/compute-sha256.ts", "../src/shared/worker-daemon/classes/worker-daemon.class.ts", "../src/shared/worker-daemon/functions/load-wasm-modules.function.ts", "../src/shared/worker-daemon/functions/create-host-imports.function.ts", "../src/shared/worker-daemon/functions/create-ipc-server.function.ts", "../src/shared/platform/functions/get-ipc-path.function.ts", "../src/shared/platform/functions/get-tmpdir.function.ts", "../src/shared/wasm-codec/functions/encode-string.function.ts", "../src/shared/wasm-codec/functions/encode-u32.function.ts", "../src/shared/wasm-codec/functions/encode-option-string.function.ts", "../src/shared/wasm-codec/functions/encode-section-type.function.ts", "../src/shared/wasm-codec/functions/encode-add-section-params.function.ts", "../src/shared/wasm-codec/functions/encode-update-section-params.function.ts", "../src/shared/wasm-codec/functions/encode-kbid-list.function.ts", "../src/shared/wasm-codec/functions/encode-group-params.function.ts", "../src/shared/wasm-codec/functions/encode-identifier-list.function.ts", "../src/shared/wasm-codec/functions/encode-search-params.function.ts", "../src/shared/wasm-codec/functions/encode-type-filter-param.function.ts", "../src/shared/wasm-codec/functions/decode-string.function.ts", "../src/shared/wasm-codec/functions/decode-u32.function.ts", "../src/shared/wasm-codec/functions/decode-f32.function.ts", "../src/shared/wasm-codec/functions/decode-u64.function.ts", "../src/shared/wasm-codec/functions/decode-scored-results.function.ts", "../src/shared/wasm-codec/functions/decode-section-records.function.ts", "../src/shared/wasm-codec/functions/decode-section-record-list.function.ts", "../src/shared/wasm-codec/functions/decode-document-manifest.function.ts", "../src/shared/wasm-codec/functions/decode-document-manifest-list.function.ts", "../src/shared/wasm-codec/functions/decode-compose-output.function.ts", "../src/shared/wasm-codec/functions/decode-key-value-text.function.ts", "../src/shared/wasm-codec/functions/decode-remove-flag.function.ts", "../src/shared/wasm-codec/functions/encode-recall-params.function.ts", "../src/shared/wasm-codec/functions/decode-recall-result.function.ts", "../src/shared/wasm-codec/functions/decode-add-section-result.function.ts", "../src/shared/worker-daemon/functions/run-worker.function.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module\n *\n * Worker daemon executable for kbdb. Runs as a detached\n * background process that loads WASM modules and serves\n * JSON-RPC 2.0 requests over local IPC.\n */\n\nimport { existsSync } from 'node:fs';\nimport { getArgs } from './shared/runtime/index.ts';\nimport {\n resolveBaseDir,\n resolveWasmDir,\n} from './shared/dir-resolver/index.ts';\nimport {\n startDaemon,\n runWorker,\n} from './shared/worker-daemon/index.ts';\n\nconst baseDir = resolveBaseDir(import.meta.url, import.meta.dirname);\nconst wasmDir = resolveWasmDir(baseDir.scriptDir);\n\nasync function main(): Promise<void> {\n const result = await runWorker(getArgs(), {\n existsSync,\n startDaemon,\n wasmDir,\n });\n if (result.error) {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n}\n\nmain().catch((err: unknown) => {\n // eslint-disable-next-line no-console\n console.error(err);\n process.exitCode = 1;\n});\n", "import type { Runtime } from '../typings/runtime.ts';\n\n/**\n * Detects the current JavaScript runtime environment.\n *\n * Returns `'deno'` when the global `Deno` object is present,\n * otherwise returns `'node'`.\n */\nexport function detectRuntime(): Runtime {\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n return 'deno';\n }\n return 'node';\n}\n", "import { detectRuntime } from './detect-runtime.ts';\n\n/**\n * Returns the command-line arguments for the current runtime.\n *\n * In Deno, reads `Deno.args`; in Node.js, slices `process.argv`\n * past the interpreter and script entries.\n */\nexport function getArgs(): string[] {\n if (detectRuntime() === 'deno') {\n const g = globalThis as Record<string, unknown>;\n const deno = g['Deno'] as { args: string[] } | undefined;\n return deno?.args ?? [];\n }\n return process.argv.slice(2);\n}\n", "import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { BaseDir } from '../typings/base-dir.interface.ts';\n\nexport function resolveScriptDir(\n entryUrl: string,\n entryDirname?: string,\n): string {\n if (entryDirname) return entryDirname;\n if (entryUrl.startsWith('file:'))\n return dirname(fileURLToPath(entryUrl));\n return dirname(entryUrl);\n}\n\nexport function resolveBaseDir(\n entryUrl: string,\n entryDirname?: string,\n): BaseDir {\n const scriptDir =\n typeof __dirname !== 'undefined'\n ? __dirname\n : resolveScriptDir(entryUrl, entryDirname);\n return { scriptDir, cwd: process.cwd() };\n}\n", "import { join } from 'node:path';\n\nexport function isRemoteUrl(path: string): boolean {\n return path.startsWith('http://') || path.startsWith('https://');\n}\n\nexport function joinPath(base: string, ...segments: string[]): string {\n if (isRemoteUrl(base)) {\n const trailing = base.endsWith('/') ? '' : '/';\n return base + trailing + segments.join('/');\n }\n return join(base, ...segments);\n}\n", "import { joinPath } from './join-path.function.ts';\n\nexport function resolveWasmDir(scriptDir: string): string {\n return joinPath(scriptDir, 'wasm');\n}\n", "import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport {\n DEFAULT_ITEM_LIMIT,\n DEFAULT_INDEX_LIMIT,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_ITEM_TTL_MS,\n WORKER_TOML_FILENAME,\n} from '../constants/daemon-defaults.constant.ts';\n\n/**\n * Reads the `worker.toml` configuration file from the given\n * context directory and returns a `DaemonConfig`.\n *\n * Falls back to all-default values when the file is absent or\n * unreadable.\n *\n * @param contextPath - absolute path to the `.kbdb` context\n * directory\n */\nexport function readConfig(contextPath: string): DaemonConfig {\n const configPath = join(contextPath, WORKER_TOML_FILENAME);\n try {\n const text = readFileSync(configPath, 'utf-8');\n return parseWorkerToml(text, contextPath);\n } catch {\n return {\n contextPath,\n itemLimit: DEFAULT_ITEM_LIMIT,\n indexLimit: DEFAULT_INDEX_LIMIT,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n itemTtlMs: DEFAULT_ITEM_TTL_MS,\n };\n }\n}\n\nfunction parseWorkerToml(\n text: string,\n contextPath: string,\n): DaemonConfig {\n const config: DaemonConfig = {\n contextPath,\n itemLimit: DEFAULT_ITEM_LIMIT,\n indexLimit: DEFAULT_INDEX_LIMIT,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n itemTtlMs: DEFAULT_ITEM_TTL_MS,\n };\n\n const result = { ...config };\n\n for (const line of text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('#') || !trimmed.includes('=')) {\n continue;\n }\n const eqIdx = trimmed.indexOf('=');\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n switch (key) {\n case 'item_limit':\n result.itemLimit =\n parseInt(value, 10) || DEFAULT_ITEM_LIMIT;\n break;\n case 'index_limit':\n result.indexLimit =\n parseInt(value, 10) || DEFAULT_INDEX_LIMIT;\n break;\n case 'timeout_ms':\n result.timeoutMs =\n parseInt(value, 10) || DEFAULT_TIMEOUT_MS;\n break;\n case 'item_ttl_ms':\n result.itemTtlMs =\n parseInt(value, 10) || DEFAULT_ITEM_TTL_MS;\n break;\n default:\n break;\n }\n }\n\n return result;\n}\n", "/** Default maximum number of items held in daemon memory. */\nexport const DEFAULT_ITEM_LIMIT = 1000;\n\n/** Default maximum number of index entries held in daemon memory. */\nexport const DEFAULT_INDEX_LIMIT = 100;\n\n/**\n * Default idle timeout in milliseconds before the daemon shuts\n * down automatically (5 minutes).\n */\nexport const DEFAULT_TIMEOUT_MS = 300_000;\n\n/**\n * Default time-to-live in milliseconds for each cached item\n * (1 minute).\n */\nexport const DEFAULT_ITEM_TTL_MS = 60_000;\n\n/** Filename of the daemon configuration file inside `.kbdb/`. */\nexport const WORKER_TOML_FILENAME = 'worker.toml';\n\n/**\n * Database format version the daemon supports.\n *\n * Read from `catalog.toml` at startup. If the catalog version\n * differs, the daemon prints a structured error to stderr and\n * exits with code 1 before loading any WASM modules.\n */\nexport const DB_FORMAT_VERSION = 1;\n", "import { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { readConfig } from './read-config.function.ts';\nimport { computeSha256 } from '../../hash/functions/compute-sha256.ts';\nimport { WorkerDaemon } from '../classes/worker-daemon.class.ts';\n\n/**\n * Starts the worker daemon for the given knowledge-base context.\n *\n * Reads configuration from `worker.toml` in the context directory,\n * validates startup preconditions (directory exists, accessible, and\n * database version compatible), and then starts the `WorkerDaemon`.\n *\n * Signal handlers for `SIGTERM` and `SIGINT` trigger a graceful stop.\n * Precondition failures are printed to stderr and cause exit code 1.\n *\n * @param contextPath - absolute path to the `.kbdb` context directory\n */\nexport async function startDaemon(\n contextPath: string,\n wasmDir?: string,\n): Promise<void> {\n const config = readConfig(contextPath);\n const hash = await computeSha256(contextPath);\n const contextId = hash.slice(0, 16);\n\n const daemon = new WorkerDaemon(\n contextId,\n contextPath,\n config,\n wasmDir,\n );\n\n try {\n daemon.checkPreconditions();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n try {\n await daemon.start();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n process.on('SIGTERM', () => {\n daemon.stop();\n });\n process.on('SIGINT', () => {\n daemon.stop();\n });\n}\n\nfunction writeCrashLog(contextId: string, message: string): void {\n try {\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n const payload = JSON.stringify({\n error: message,\n timestamp: Date.now(),\n });\n writeFileSync(crashPath, payload);\n } catch {\n // never mask the original error\n }\n}\n", "/**\n * Computes the SHA-256 hash of a UTF-8 string.\n *\n * Uses the Web Crypto API (`crypto.subtle`), which is available\n * in both Deno and Node.js >= 20 without additional imports.\n *\n * @param input - the string to hash\n * @returns lowercase hex-encoded SHA-256 digest (64 characters)\n */\nexport async function computeSha256(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(hash);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import {\n existsSync,\n readFileSync,\n readdirSync,\n accessSync,\n writeFileSync,\n unlinkSync,\n constants,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { Server } from 'node:net';\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport type { WasmModules } from '../typings/wasm-modules.interface.ts';\nimport type {\n IpcRequest,\n IpcResponse,\n IpcHandler,\n} from '../typings/ipc-handler.interface.ts';\nimport { DB_FORMAT_VERSION } from '../constants/daemon-defaults.constant.ts';\nimport { loadWasmModules } from '../functions/load-wasm-modules.function.ts';\nimport { createIpcServer } from '../functions/create-ipc-server.function.ts';\nimport { getIpcPath } from '../../platform/functions/get-ipc-path.function.ts';\nimport {\n encodeSearchParams,\n encodeAddSectionParams,\n encodeUpdateSectionParams,\n encodeKbidList,\n encodeGroupParams,\n encodeIdentifierList,\n encodeTypeFilterParam,\n encodeRecallParams,\n decodePagedSearchResult,\n decodeSectionRecords,\n decodeSectionRecordList,\n decodeDocumentManifest,\n decodeDocumentManifestList,\n decodeComposeOutput,\n decodeKeyValueText,\n decodeRemoveFlag,\n decodeRecallResult,\n decodeAddSectionResult,\n} from '../../wasm-codec/index.ts';\n\nimport type { AddSectionInput } from '../../wasm-codec/index.ts';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Callable WASM export function signature. */\ntype WasmFn = (...args: unknown[]) => unknown;\n\n/** Mapping from IPC method name to kb-worker.wasm export name. */\nconst WASM_METHOD_MAP: Readonly<Partial<Record<string, string>>> = {\n search: 'worker_search',\n addSection: 'worker_add_section',\n add_section: 'worker_add_section',\n updateSection: 'worker_update_section',\n update_section: 'worker_update_section',\n removeSection: 'worker_remove_section',\n remove_section: 'worker_remove_section',\n readSections: 'worker_read_sections',\n read_sections: 'worker_read_sections',\n groupSections: 'worker_group_sections',\n group_sections: 'worker_group_sections',\n removeGrouping: 'worker_remove_grouping',\n remove_grouping: 'worker_remove_grouping',\n retrieveDocument: 'worker_retrieve_doc',\n retrieve_doc: 'worker_retrieve_doc',\n content: 'worker_compose',\n compose: 'worker_compose',\n integrity_check: 'worker_check_integrity',\n integrityCheck: 'worker_check_integrity',\n gc: 'worker_garbage_collect',\n rebuild_indexes: 'worker_rebuild_indexes',\n rebuildIndexes: 'worker_rebuild_indexes',\n init_directory: 'worker_init_directory',\n initDirectory: 'worker_init_directory',\n migrateDatabase: 'worker_migrate',\n query: 'worker_query',\n get_result_status: 'worker_result_status',\n get_result: 'worker_get_result',\n invalidate: 'worker_invalidate',\n invalidate_all: 'worker_invalidate_all',\n invalidateAll: 'worker_invalidate_all',\n db_status: 'worker_status',\n dbStatus: 'worker_status',\n listByType: 'worker_list_by_type',\n list_by_type: 'worker_list_by_type',\n listDocumentsByType: 'worker_list_docs_by_type',\n list_docs_by_type: 'worker_list_docs_by_type',\n recall: 'worker_recall',\n export: 'worker_export',\n exportDb: 'worker_export',\n};\n\n/** Config method name prefix. */\nconst CONFIG_PREFIX = 'config_';\n\n/** Config key \u2192 DaemonConfig property mapping. */\nconst CONFIG_KEY_MAP: Readonly<\n Partial<Record<string, keyof DaemonConfig>>\n> = {\n timeout_ms: 'timeoutMs',\n item_ttl_ms: 'itemTtlMs',\n item_limit: 'itemLimit',\n index_limit: 'indexLimit',\n};\n\n// ---------------------------------------------------------------------------\n// IpcError\n// ---------------------------------------------------------------------------\n\n/** Typed JSON-RPC error used internally by WorkerDaemon dispatch. */\nclass IpcError extends Error {\n /** JSON-RPC error code. */\n readonly code: number;\n\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n this.name = 'IpcError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// WorkerDaemon\n// ---------------------------------------------------------------------------\n\n/**\n * Core daemon class that manages the full worker daemon lifecycle.\n *\n * Orchestrates WASM module loading, IPC server creation, request\n * routing to `kb-worker.wasm` exports, idle timeout tracking, and\n * graceful shutdown. The daemon validates startup preconditions before\n * loading WASM modules and rejects IPC requests whose `ctx` param does\n * not match the daemon's context ID.\n */\nexport class WorkerDaemon {\n /** Context ID (16-character hex SHA-256 prefix). */\n readonly ctx: string;\n\n /** Absolute path to the `.kbdb` directory. */\n readonly targetDir: string;\n\n /** Parsed daemon configuration from `worker.toml`. */\n readonly config: DaemonConfig;\n\n /** Number of currently active IPC client connections. */\n get connectionCount(): number {\n return this._connectionCount;\n }\n\n private _connectionCount = 0;\n private _wasmModules: WasmModules | null = null;\n private _idleAt = 0;\n private _idleTimer: ReturnType<typeof setTimeout> | null = null;\n private _server: Server | null = null;\n private readonly _wasmDir: string;\n\n /** Queue of waiters for the single-writer lock. */\n private _writeQueue: { resolve: () => void }[] = [];\n\n /** Whether the write lock is currently held. */\n private _writeLocked = false;\n\n /** Whether the startup integrity check passed. */\n private _integrityOk = true;\n\n /** Integrity errors found at startup, if any. */\n private _integrityErrors: string[] = [];\n\n /**\n * @param ctx - context ID (16-hex characters), the first 16 of\n * the SHA-256 hash of `targetDir`\n * @param targetDir - absolute path to the `.kbdb` directory\n * @param config - parsed daemon configuration\n * @param wasmDir - path to the WASM build output directory\n */\n constructor(\n ctx: string,\n targetDir: string,\n config: DaemonConfig,\n wasmDir?: string,\n ) {\n this.ctx = ctx;\n this.targetDir = targetDir;\n this.config = config;\n this._wasmDir = wasmDir ?? '';\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Validates startup preconditions before WASM module loading.\n *\n * Checks that the database directory exists, is readable and\n * writable, and that `catalog.toml` reports a compatible version.\n *\n * @throws {Error} if any precondition fails -- `startDaemon`\n * catches this, prints to stderr, and exits with code 1\n */\n checkPreconditions(): void {\n if (!existsSync(this.targetDir)) {\n throw new Error(\n `database directory not found: ${this.targetDir}`,\n );\n }\n\n try {\n accessSync(\n this.targetDir,\n\n constants.R_OK | constants.W_OK,\n );\n } catch {\n throw new Error(\n `cannot access database directory: ${this.targetDir}` +\n ' -- permission denied',\n );\n }\n\n this.checkCatalogVersion();\n }\n\n /**\n * Starts the daemon: loads WASM modules, writes the PID file,\n * creates the IPC socket, and begins listening for connections.\n *\n * Call `checkPreconditions()` before `start()` to validate the\n * database directory. The daemon will not start if any precondition\n * fails.\n *\n * @throws when WASM module loading fails or the IPC socket cannot\n * be created\n */\n async start(): Promise<void> {\n const wasmModules = await loadWasmModules(\n this.config,\n this._wasmDir,\n );\n this._wasmModules = wasmModules;\n\n this.initWorkerContext();\n this.runStartupIntegrityCheck();\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n writeFileSync(pidPath, process.pid.toString());\n\n const ipcPath = getIpcPath(this.ctx);\n\n if (existsSync(ipcPath)) {\n try {\n unlinkSync(ipcPath);\n } catch {\n // ignore stale socket removal errors\n }\n }\n\n const handler: IpcHandler = (req) => this.handleRequest(req);\n this._server = createIpcServer(ipcPath, handler);\n\n this._server.on('connection', () => {\n this.incrementConnections();\n this.resetIdleTimer();\n });\n\n this._server.on('close', () => {\n this.decrementConnections();\n if (this._connectionCount === 0) {\n this.resetIdleTimer();\n }\n });\n\n this.resetIdleTimer();\n }\n\n /**\n * Gracefully shuts down the daemon.\n *\n * Stops accepting new connections, clears the idle timer, purges\n * WASM state, removes the PID file and IPC socket file, then exits\n * the process.\n */\n stop(): void {\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n this._idleTimer = null;\n }\n\n if (this._server !== null) {\n this._server.close();\n this._server = null;\n }\n\n this._wasmModules = null;\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n try {\n unlinkSync(pidPath);\n } catch {\n // ignore cleanup errors\n }\n\n const ipcPath = getIpcPath(this.ctx);\n try {\n unlinkSync(ipcPath);\n } catch {\n // ignore cleanup errors\n }\n\n const crashPath = join(tmpdir(), `kbdb-${this.ctx}.crash`);\n try {\n unlinkSync(crashPath);\n } catch {\n // ignore cleanup errors\n }\n\n process.exit(0);\n }\n\n /**\n * Handles a single JSON-RPC 2.0 request.\n *\n * Validates context, then routes to a daemon-state handler or a\n * WASM export. Requests whose `ctx` param does not match the\n * daemon's context ID are rejected with error code `-32001`.\n *\n * @param request - incoming JSON-RPC request\n * @returns the JSON-RPC response\n */\n async handleRequest(request: IpcRequest): Promise<IpcResponse> {\n const params = request.params as\n | Record<string, unknown>\n | undefined;\n if (params === undefined || params.ctx !== this.ctx) {\n return this.errorResponse(\n request.id,\n -32001,\n 'context mismatch',\n );\n }\n\n this.resetIdleTimer();\n\n try {\n const result = await this.dispatch(request.method, params);\n this._idleAt = Math.floor(Date.now() / 1000);\n return {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n } catch (err) {\n this._idleAt = Math.floor(Date.now() / 1000);\n if (err instanceof IpcError) {\n return this.errorResponse(\n request.id,\n err.code,\n err.message,\n );\n }\n const message =\n err instanceof Error ? err.message : String(err);\n return this.errorResponse(request.id, -32000, message);\n }\n }\n\n /**\n * Increments the active connection count.\n *\n * Call when a new IPC client connects.\n */\n incrementConnections(): void {\n this._connectionCount++;\n }\n\n /**\n * Decrements the active connection count, clamped to zero.\n *\n * Call when an IPC client disconnects.\n */\n decrementConnections(): void {\n if (this._connectionCount > 0) {\n this._connectionCount--;\n }\n }\n\n /**\n * Injects pre-built WASM modules for unit testing.\n *\n * This method exists solely to support unit tests that cannot\n * load real WASM binaries. It must not be called in production\n * code -- production code uses `start()` to load modules.\n *\n * @param modules - pre-built WASM module instances\n * @internal\n */\n injectModulesForTesting(modules: WasmModules): void {\n this._wasmModules = modules;\n }\n\n // -----------------------------------------------------------------------\n // Private helpers\n // -----------------------------------------------------------------------\n\n /** Resets the idle timer; triggers stop() when it fires. */\n private resetIdleTimer(): void {\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n }\n if (this._connectionCount === 0) {\n this._idleTimer = setTimeout(() => {\n this.stop();\n }, this.config.timeoutMs);\n }\n }\n\n /** Reads catalog.toml and validates the version field. */\n private checkCatalogVersion(): void {\n const catalogPath = join(this.targetDir, 'catalog.toml');\n let text: string;\n try {\n text = readFileSync(catalogPath, 'utf-8');\n } catch {\n throw new Error(\n `cannot read database directory: ${this.targetDir}` +\n ' -- permission denied',\n );\n }\n\n const version = parseCatalogVersion(text);\n if (version === null) {\n throw new Error(\n 'database version 0 requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon',\n );\n }\n\n if (version > DB_FORMAT_VERSION) {\n throw new Error(\n 'database version ' +\n String(version) +\n ' is newer than kbdb version ' +\n String(DB_FORMAT_VERSION) +\n ' -- upgrade kbdb to open this database',\n );\n }\n\n if (version < DB_FORMAT_VERSION) {\n throw new Error(\n 'database version ' +\n String(version) +\n ' requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon',\n );\n }\n }\n\n /** Builds a JSON-RPC error response. */\n private errorResponse(\n id: number | string,\n code: number,\n message: string,\n ): IpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code, message },\n };\n }\n\n /**\n * Dispatches a request method to the appropriate handler.\n *\n * Handles daemon-state methods (`status`, `idle_at`,\n * `config_{key}`) inline and routes WASM methods to the\n * correct calling convention for each export.\n */\n private dispatch(\n method: string,\n params: Record<string, unknown>,\n ): unknown {\n if (method === 'status') {\n return {\n status: this._connectionCount > 0 ? 'busy' : 'idle',\n integrityOk: this._integrityOk,\n integrityErrors: this._integrityErrors,\n };\n }\n\n if (method === 'idle_at') {\n return this._idleAt;\n }\n\n if (method === 'checkVersion') {\n return this.handleCheckVersion(params);\n }\n\n if (method.startsWith(CONFIG_PREFIX)) {\n return this.handleConfigMethod(method);\n }\n\n const wasmMethod = WASM_METHOD_MAP[method];\n if (wasmMethod !== undefined) {\n return this.dispatchWasm(method, wasmMethod, params);\n }\n\n throw new IpcError(-32601, `Method not found: ${method}`);\n }\n\n private async dispatchWasm(\n method: string,\n wasmExport: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n // Read-only operations \u2014 no write lock required.\n if (method === 'search' || method === 'query') {\n return this.handleSearch(params);\n }\n if (method === 'readSections' || method === 'read_sections') {\n return this.handleReadSections(params);\n }\n if (method === 'retrieveDocument' || method === 'retrieve_doc') {\n return this.handleRetrieveDoc(params);\n }\n if (method === 'content' || method === 'compose') {\n return this.handleCompose(params);\n }\n if (method === 'integrityCheck' || method === 'integrity_check') {\n return this.handleIntegrityCheck();\n }\n if (method === 'dbStatus' || method === 'db_status') {\n return this.handleDbStatus();\n }\n if (method === 'get_result_status') {\n return this.handleResultStatus(params);\n }\n if (method === 'get_result') {\n return this.handleGetResult(params);\n }\n if (method === 'listByType' || method === 'list_by_type') {\n return this.handleListByType(params);\n }\n if (\n method === 'listDocumentsByType' ||\n method === 'list_docs_by_type'\n ) {\n return this.handleListDocsByType(params);\n }\n if (method === 'recall') {\n return this.handleRecall(params);\n }\n if (method === 'export' || method === 'exportDb') {\n return this.handleExport(params);\n }\n\n // Write operations \u2014 serialised through the single-writer lock.\n await this.acquireWriteLock();\n try {\n if (method === 'invalidate') {\n return this.handleInvalidate(params);\n }\n if (\n method === 'invalidateAll' ||\n method === 'invalidate_all'\n ) {\n return this.handleInvalidateAll();\n }\n if (method === 'addSection' || method === 'add_section') {\n return this.handleAddSection(params);\n }\n if (\n method === 'updateSection' ||\n method === 'update_section'\n ) {\n return this.handleUpdateSection(params);\n }\n if (\n method === 'removeSection' ||\n method === 'remove_section'\n ) {\n return this.handleRemoveSection(params);\n }\n if (\n method === 'groupSections' ||\n method === 'group_sections'\n ) {\n return this.handleGroupSections(params);\n }\n if (\n method === 'removeGrouping' ||\n method === 'remove_grouping'\n ) {\n return this.handleRemoveGrouping(params);\n }\n if (method === 'gc') {\n return this.handleGc();\n }\n if (\n method === 'rebuildIndexes' ||\n method === 'rebuild_indexes'\n ) {\n return this.handleRebuild();\n }\n if (\n method === 'initDirectory' ||\n method === 'init_directory'\n ) {\n return this.handleInitDirectory(params);\n }\n if (method === 'migrateDatabase') {\n throw new IpcError(\n -32601,\n 'migrateDatabase is not yet supported',\n );\n }\n return this.invokeWasmRaw(wasmExport, new Uint8Array(0));\n } finally {\n this.releaseWriteLock();\n }\n }\n\n // -- Search/query (token-based async) --\n\n private handleSearch(params: Record<string, unknown>): unknown {\n const query = (params['query'] as string | undefined) ?? '';\n const mode = (params['mode'] as string | undefined) ?? 'and';\n const limit = Number(params['limit'] ?? 20);\n const offset = Number(params['offset'] ?? 0);\n const encoded = encodeSearchParams(query, mode, limit, offset);\n\n const searchFn = this.getExport('worker_search');\n const ptr = this.wasmAlloc(encoded.length);\n this.wasmWrite(ptr, encoded);\n const token = searchFn(ptr, encoded.length) as number;\n this.wasmFree(ptr, encoded.length);\n\n const statusFn = this.getExport('worker_result_status');\n const status = statusFn(token) as number;\n if (status === 3) {\n const getResultFn = this.getExport('worker_get_result');\n getResultFn(token);\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg);\n }\n\n const getResultFn = this.getExport('worker_get_result');\n const rc = getResultFn(token) as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(-32000, new TextDecoder().decode(errBytes));\n }\n const resultBytes = this.readReturnSlot();\n return decodePagedSearchResult(resultBytes);\n }\n\n // -- Token status/result (u32 direct params) --\n\n private handleResultStatus(\n params: Record<string, unknown>,\n ): unknown {\n const token = Number(params['token'] ?? 0);\n const fn = this.getExport('worker_result_status');\n const status = fn(token) as number;\n return { status };\n }\n\n private handleGetResult(params: Record<string, unknown>): unknown {\n const token = Number(params['token'] ?? 0);\n const fn = this.getExport('worker_get_result');\n const rc = fn(token) as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(-32000, new TextDecoder().decode(errBytes));\n }\n const bytes = this.readReturnSlot();\n return decodePagedSearchResult(bytes);\n }\n\n // -- Binary-encoded input methods --\n\n private handleAddSection(params: Record<string, unknown>): unknown {\n const sectionType = (params['sectionType'] ?? 'text') as string;\n const semanticType =\n sectionType === 'text' ||\n sectionType === 'code' ||\n sectionType === 'image'\n ? sectionType\n : 'text';\n const typeName =\n sectionType !== semanticType ? sectionType : null;\n const tags = Array.isArray(params['tags'])\n ? (params['tags'] as string[])\n : [];\n const input: AddSectionInput = {\n sectionType: semanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title: (params['title'] as string | null) ?? null,\n description: (params['description'] as string | null) ?? null,\n docid: (params['docid'] as string | null) ?? null,\n typeName,\n sourcePath:\n typeof params['sourcePath'] === 'string'\n ? params['sourcePath']\n : undefined,\n sourceMtime:\n typeof params['sourceMtime'] === 'string'\n ? params['sourceMtime']\n : undefined,\n tags,\n replace: params['replace'] === true,\n };\n const encoded = encodeAddSectionParams(input);\n const bytes = this.callWasmSync('worker_add_section', encoded);\n const decoded = decodeAddSectionResult(bytes);\n const nearDups =\n decoded.nearDuplicates.length > 0\n ? decoded.nearDuplicates\n : this.scanNearDuplicates(input.content, decoded.kbid);\n return {\n kbid: decoded.kbid,\n indexed_terms_count: decoded.indexedTermsCount,\n elapsed_ms: decoded.elapsedMs,\n superseded: decoded.superseded,\n warnings: decoded.warnings,\n near_duplicates: nearDups,\n };\n }\n\n private handleUpdateSection(\n params: Record<string, unknown>,\n ): unknown {\n const oldKbid = (params['kbid'] as string | undefined) ?? '';\n const updSectionType = (params['sectionType'] ??\n 'text') as string;\n const updSemanticType =\n updSectionType === 'text' ||\n updSectionType === 'code' ||\n updSectionType === 'image'\n ? updSectionType\n : 'text';\n const updTypeName =\n updSectionType !== updSemanticType ? updSectionType : null;\n const input: AddSectionInput = {\n sectionType: updSemanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title: (params['title'] as string | null) ?? null,\n description: (params['description'] as string | null) ?? null,\n docid: (params['docid'] as string | null) ?? null,\n typeName: updTypeName,\n };\n const encoded = encodeUpdateSectionParams(oldKbid, input);\n const bytes = this.callWasmSync('worker_update_section', encoded);\n const newKbid = new TextDecoder().decode(bytes);\n return { kbid: newKbid };\n }\n\n private handleReadSections(\n params: Record<string, unknown>,\n ): unknown {\n const kbids = (params['kbids'] ?? []) as string[];\n const encoded = encodeKbidList(kbids);\n const bytes = this.callWasmSync('worker_read_sections', encoded);\n return decodeSectionRecords(bytes);\n }\n\n private handleGroupSections(\n params: Record<string, unknown>,\n ): unknown {\n const title = (params['title'] as string | undefined) ?? '';\n const kbids = (params['kbids'] ?? []) as string[];\n const docType = (params['docType'] as string | undefined) ?? '';\n const encoded = encodeGroupParams(title, kbids, docType);\n const bytes = this.callWasmSync('worker_group_sections', encoded);\n const docid = new TextDecoder().decode(bytes);\n return { docid };\n }\n\n private handleCompose(params: Record<string, unknown>): unknown {\n const ids = (params['ids'] ?? []) as string[];\n const encoded = encodeIdentifierList(ids);\n const bytes = this.callWasmSync('worker_compose', encoded);\n const output = decodeComposeOutput(bytes);\n return {\n data: output.markdown,\n total: Number(output.totalChars),\n };\n }\n\n // -- Raw UTF-8 string input methods --\n\n private handleRemoveSection(\n params: Record<string, unknown>,\n ): unknown {\n const kbid = (params['kbid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(kbid);\n const bytes = this.callWasmSync('worker_remove_section', encoded);\n return { removed: decodeRemoveFlag(bytes) };\n }\n\n private handleRetrieveDoc(params: Record<string, unknown>): unknown {\n const docid = (params['docid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(docid);\n const bytes = this.callWasmSync('worker_retrieve_doc', encoded);\n return decodeDocumentManifest(bytes);\n }\n\n private handleRemoveGrouping(\n params: Record<string, unknown>,\n ): unknown {\n const docid = (params['docid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(docid);\n this.callWasmSync('worker_remove_grouping', encoded);\n return { ok: true };\n }\n\n private handleInitDirectory(\n params: Record<string, unknown>,\n ): unknown {\n const path =\n (params['path'] as string | undefined) ?? this.targetDir;\n const encoded = new TextEncoder().encode(path);\n this.callWasmSync('worker_init_directory', encoded);\n return { ok: true };\n }\n\n private handleInvalidate(params: Record<string, unknown>): unknown {\n const kbid = (params['kbid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(kbid);\n const fn = this.getExport('worker_invalidate');\n const ptr = this.wasmAlloc(encoded.length);\n this.wasmWrite(ptr, encoded);\n const rc = fn(ptr, encoded.length) as number;\n this.wasmFree(ptr, encoded.length);\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(\n -32000,\n new TextDecoder().decode(errBytes) || 'invalidate failed',\n );\n }\n return { ok: true };\n }\n\n private handleListByType(params: Record<string, unknown>): unknown {\n const typeStr =\n (params['sectionType'] as string | undefined) ?? '';\n const encoded = encodeTypeFilterParam(typeStr);\n const bytes = this.callWasmSync('worker_list_by_type', encoded);\n return decodeSectionRecordList(bytes);\n }\n\n private handleListDocsByType(\n params: Record<string, unknown>,\n ): unknown {\n const typeStr = (params['docType'] as string | undefined) ?? '';\n const encoded = encodeTypeFilterParam(typeStr);\n const bytes = this.callWasmSync(\n 'worker_list_docs_by_type',\n encoded,\n );\n return decodeDocumentManifestList(bytes);\n }\n\n private handleRecall(params: Record<string, unknown>): unknown {\n const kbid =\n typeof params['kbid'] === 'string'\n ? params['kbid']\n : undefined;\n const kbids = Array.isArray(params['kbids'])\n ? (params['kbids'] as string[])\n : undefined;\n const depth = Number(params['depth'] ?? 0);\n const encoded = encodeRecallParams({ kbid, kbids, depth });\n const bytes = this.callWasmSync('worker_recall', encoded);\n return decodeRecallResult(bytes);\n }\n\n // -- Zero-arg methods --\n\n private handleInvalidateAll(): unknown {\n this.callWasmZeroArg('worker_invalidate_all');\n return { ok: true };\n }\n\n private handleDbStatus(): unknown {\n this.callWasmZeroArg('worker_status');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n return decodeKeyValueText(text);\n }\n\n private handleIntegrityCheck(): unknown {\n this.callWasmZeroArg('worker_check_integrity');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n return decodeKeyValueText(text);\n }\n\n private handleGc(): unknown {\n const start = Date.now();\n this.callWasmZeroArg('worker_garbage_collect');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n const removedCount = Number(kv['removed'] ?? 0);\n const staleSources = Number(kv['stale_sources'] ?? 0);\n return {\n removed_sections: removedCount,\n removed_bytes: 0,\n elapsed_ms: Date.now() - start,\n stale_sources: staleSources,\n };\n }\n\n private handleRebuild(): unknown {\n const fn = this.getExport('worker_rebuild_indexes');\n const rc = fn() as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || 'rebuild failed');\n }\n const resultBytes = this.readReturnSlot();\n const reindexed =\n resultBytes.length >= 4\n ? new DataView(\n resultBytes.buffer,\n resultBytes.byteOffset,\n resultBytes.byteLength,\n ).getUint32(0, true)\n : 0;\n return { ok: true, sections_reindexed: reindexed };\n }\n\n // -- Export (read operation, no lock required) --\n\n private handleExport(params: Record<string, unknown>): unknown {\n const targetPath =\n (params['targetPath'] as string | undefined) ??\n (params['path'] as string | undefined) ??\n './kbdb-export/';\n const encoded = new TextEncoder().encode(targetPath);\n const start = Date.now();\n const bytes = this.callWasmSync('worker_export', encoded);\n const elapsed = Date.now() - start;\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n return {\n path: kv['path'] ?? targetPath,\n sections_exported: Number(kv['sections_exported'] ?? 0),\n documents_exported: Number(kv['documents_exported'] ?? 0),\n elapsed_ms: elapsed,\n };\n }\n\n // -- Near-duplicate detection --\n\n private scanNearDuplicates(\n content: string,\n newKbid: string,\n ): { kbid: string; similarity: number }[] {\n const newTerms = this.extractTermSet(content);\n if (newTerms.size === 0) return [];\n\n const sectionsDir = join(this.targetDir, 'sections');\n let shards: string[];\n try {\n shards = readdirSync(sectionsDir);\n } catch {\n return [];\n }\n\n const results: { kbid: string; similarity: number }[] = [];\n for (const shard of shards) {\n let files: string[];\n try {\n files = readdirSync(join(sectionsDir, shard));\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.endsWith('.section')) continue;\n const kbid = file.slice(0, -8);\n if (kbid === newKbid) continue;\n try {\n const data = readFileSync(\n join(sectionsDir, shard, file),\n 'utf-8',\n );\n const sep = data.indexOf('\\n---\\n');\n const body = sep >= 0 ? data.slice(sep + 5) : data;\n const existing = this.extractTermSet(body);\n let intersection = 0;\n for (const t of newTerms) {\n if (existing.has(t)) intersection++;\n }\n const union =\n newTerms.size + existing.size - intersection;\n const sim = union > 0 ? intersection / union : 0;\n if (sim >= 0.85) {\n results.push({\n kbid,\n similarity: Math.round(sim * 100) / 100,\n });\n }\n } catch {\n continue;\n }\n }\n }\n return results;\n }\n\n private extractTermSet(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .split(/\\W+/)\n .filter((w) => w.length > 2),\n );\n }\n\n // -- Single-writer lock --\n\n /**\n * Acquires the write lock.\n *\n * If the lock is free it is granted immediately. If it is held the\n * caller is queued and its promise resolves once the lock is\n * released by the current holder.\n */\n private acquireWriteLock(): Promise<void> {\n if (!this._writeLocked) {\n this._writeLocked = true;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this._writeQueue.push({ resolve });\n });\n }\n\n /**\n * Releases the write lock.\n *\n * If waiters are queued the next one is granted the lock\n * immediately. Otherwise the lock is marked free.\n */\n private releaseWriteLock(): void {\n const next = this._writeQueue.shift();\n if (next !== undefined) {\n next.resolve();\n } else {\n this._writeLocked = false;\n }\n }\n\n // -- WASM lifecycle --\n\n private initWorkerContext(): void {\n const pathBytes = new TextEncoder().encode('.');\n this.callWasmSync('worker_init', pathBytes);\n }\n\n /**\n * Runs a database integrity check immediately after context\n * initialisation.\n *\n * Stores the result in `_integrityOk` and `_integrityErrors`.\n * Logs a warning to stderr when issues are found so operators\n * are alerted without aborting the daemon.\n */\n private runStartupIntegrityCheck(): void {\n try {\n this.callWasmZeroArg('worker_check_integrity');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n this._integrityOk = kv['ok'] === 'true';\n if (!this._integrityOk) {\n this._integrityErrors = Object.entries(kv)\n .filter(([k]) => k !== 'ok')\n .map(([k, v]) => `${k}=${v}`);\n // eslint-disable-next-line no-console\n console.error(\n '[kbdb-worker] startup integrity check failed:',\n this._integrityErrors.join(', '),\n );\n }\n } catch {\n this._integrityOk = false;\n this._integrityErrors = ['integrity_check_failed'];\n // eslint-disable-next-line no-console\n console.error(\n '[kbdb-worker] startup integrity check threw an error',\n );\n }\n }\n\n // -- WASM bridge primitives --\n\n private getExport(name: string): WasmFn {\n if (this._wasmModules === null) {\n throw new Error('WASM modules not loaded');\n }\n const fn = this._wasmModules.kbWorker.exports[name] as\n | WasmFn\n | undefined;\n if (typeof fn !== 'function') {\n throw new Error(`WASM export not found: ${name}`);\n }\n return fn;\n }\n\n private wasmAlloc(size: number): number {\n if (size === 0) return 0;\n const allocFn = this._wasmModules?.kbWorker.exports[\n 'kbdb_alloc'\n ] as WasmFn | undefined;\n if (typeof allocFn !== 'function') return 0;\n return allocFn(size) as number;\n }\n\n private wasmFree(ptr: number, size: number): void {\n if (ptr === 0 || size === 0) return;\n const freeFn = this._wasmModules?.kbWorker.exports[\n 'kbdb_free'\n ] as WasmFn | undefined;\n if (typeof freeFn === 'function') {\n freeFn(ptr, size);\n }\n }\n\n private wasmWrite(ptr: number, data: Uint8Array): void {\n if (data.length === 0) return;\n const memory = this._wasmModules?.memory;\n if (!memory) return;\n const memView = new Uint8Array(memory.buffer);\n if (ptr + data.length > memView.length) {\n throw new Error('WASM memory overflow');\n }\n memView.set(data, ptr);\n }\n\n private readReturnSlot(): Uint8Array {\n const getPtrFn = this._wasmModules?.kbWorker.exports[\n 'get_return_ptr'\n ] as WasmFn | undefined;\n const getLenFn = this._wasmModules?.kbWorker.exports[\n 'get_return_len'\n ] as WasmFn | undefined;\n if (\n typeof getPtrFn !== 'function' ||\n typeof getLenFn !== 'function'\n ) {\n return new Uint8Array(0);\n }\n const ptr = getPtrFn() as number;\n const len = getLenFn() as number;\n if (ptr === 0 || len === 0) {\n return new Uint8Array(0);\n }\n const memory = this._wasmModules?.memory;\n if (!memory) return new Uint8Array(0);\n const data = new Uint8Array(memory.buffer, ptr, len).slice();\n this.wasmFree(ptr, len);\n return data;\n }\n\n private callWasmSync(\n exportName: string,\n input: Uint8Array,\n ): Uint8Array {\n const fn = this.getExport(exportName);\n const ptr = this.wasmAlloc(input.length);\n this.wasmWrite(ptr, input);\n const rc = fn(ptr, input.length) as number;\n this.wasmFree(ptr, input.length);\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || exportName + ' failed');\n }\n return this.readReturnSlot();\n }\n\n private callWasmZeroArg(exportName: string): void {\n const fn = this.getExport(exportName);\n const rc = fn() as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || exportName + ' failed');\n }\n }\n\n private invokeWasmRaw(\n exportName: string,\n input: Uint8Array,\n ): unknown {\n return this.callWasmSync(exportName, input);\n }\n\n private handleCheckVersion(\n params: Record<string, unknown>,\n ): unknown {\n const targetPath =\n typeof params.targetPath === 'string'\n ? params.targetPath\n : this.targetDir;\n const catalogPath = join(targetPath, 'catalog.toml');\n let text: string;\n try {\n text = readFileSync(catalogPath, 'utf-8');\n } catch {\n return {\n status: 'needs_migration',\n currentVersion: 0,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n const version = parseCatalogVersion(text);\n if (version === null) {\n return {\n status: 'needs_migration',\n currentVersion: 0,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n if (version > DB_FORMAT_VERSION) {\n return {\n status: 'too_new',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n if (version < DB_FORMAT_VERSION) {\n return {\n status: 'needs_migration',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n return {\n status: 'compatible',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n\n /** Returns a daemon config value by config method name. */\n private handleConfigMethod(method: string): unknown {\n const key = method.slice(CONFIG_PREFIX.length);\n const prop = CONFIG_KEY_MAP[key];\n if (prop === undefined) {\n throw new IpcError(-32601, `Method not found: ${method}`);\n }\n return this.config[prop];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Parses the `version` field from a minimal TOML string.\n *\n * Supports only `version = <integer>` syntax. Returns `null` if the\n * field is absent.\n */\nfunction parseCatalogVersion(text: string): number | null {\n for (const line of text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('#')) continue;\n const match = /^version\\s*=\\s*(\\d+)/.exec(trimmed);\n if (match?.[1] !== undefined) {\n return parseInt(match[1], 10);\n }\n }\n return null;\n}\n", "import { readFileSync } from 'node:fs';\n\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport type { WasmModules } from '../typings/wasm-modules.interface.ts';\nimport { createHostImports } from './create-host-imports.function.ts';\nimport type {\n AllocatorRef,\n MemoryRef,\n} from './create-host-imports.function.ts';\nimport { isRemoteUrl, joinPath } from '../../dir-resolver/index.ts';\n\nexport async function loadWasmModules(\n config: DaemonConfig,\n wasmDir: string,\n): Promise<WasmModules> {\n const memoryRef: MemoryRef = { memory: null };\n const allocator: AllocatorRef = { alloc: null };\n\n const hostImports = createHostImports(\n config.contextPath,\n memoryRef,\n undefined,\n allocator,\n );\n\n const wkPath = joinPath(wasmDir, 'kb-worker', 'kbdb_worker_bg.wasm');\n const wkBytes = await readWasmFile(wkPath, 'kb-worker');\n\n let wkModule: WebAssembly.Module;\n try {\n wkModule = await WebAssembly.compile(wkBytes);\n } catch (err) {\n rethrow('compile', 'kb-worker', err);\n }\n\n let kbWorker: WebAssembly.Instance;\n try {\n kbWorker = await WebAssembly.instantiate(wkModule, {\n env: { ...hostImports },\n });\n } catch (err) {\n rethrow('instantiate', 'kb-worker', err);\n }\n\n const memory = kbWorker.exports['memory'] as WebAssembly.Memory;\n memoryRef.memory = memory;\n\n allocator.alloc = (size: number): number => {\n const fn_ = kbWorker.exports['kbdb_alloc'] as\n | ((s: number) => number)\n | undefined;\n if (typeof fn_ !== 'function') return 0;\n return fn_(size);\n };\n\n return { memory, kbWorker };\n}\n\nasync function readWasmFile(\n path: string,\n label: string,\n): Promise<ArrayBuffer> {\n try {\n if (isRemoteUrl(path)) {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(\n `HTTP ${String(response.status)} ${response.statusText}`,\n );\n }\n return await response.arrayBuffer();\n }\n const buf = readFileSync(path);\n return buf.buffer.slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n );\n } catch (err) {\n rethrow('load', label, err, path);\n }\n}\n\nfunction rethrow(\n stage: string,\n label: string,\n err: unknown,\n path?: string,\n): never {\n const detail = err instanceof Error ? err.message : String(err);\n const suffix = path ? ` (path: ${path})` : '';\n const message = `failed to ${stage} ${label} WASM: ${detail}${suffix}`;\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n throw new Error(message, { cause: err });\n}\n", "import {\n readFileSync,\n writeFileSync,\n renameSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\n// ---------------------------------------------------------------------------\n// FsAdapter interface (enables dependency injection for testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal filesystem operations required by the host imports.\n *\n * The default implementation delegates to `node:fs` synchronous\n * APIs. Tests inject a stub to avoid touching the real filesystem.\n */\nexport interface FsAdapter {\n /** Read entire file as a Buffer. */\n readFileSync(path: string): Buffer;\n /** Write data buffer to file. */\n writeFileSync(path: string, data: Uint8Array): void;\n /** Rename `oldPath` to `newPath`. */\n renameSync(oldPath: string, newPath: string): void;\n /** Delete a file. */\n unlinkSync(path: string): void;\n /** List directory entries as strings. */\n readdirSync(path: string): string[];\n /** Create a directory (and parents) recursively. */\n mkdirSync(path: string): void;\n /** Return true if the path exists. */\n existsSync(path: string): boolean;\n}\n\n// ---------------------------------------------------------------------------\n// MemoryRef interface\n// ---------------------------------------------------------------------------\n\n/**\n * A mutable reference to the WASM linear memory.\n *\n * The `memory` field starts as `null` and is wired up after the\n * `kb-worker` WASM module is instantiated (the module exports its\n * own memory rather than importing one). Host import functions\n * read `memory` at call time, not at creation time, so the ref\n * can be populated after the import record is built.\n */\nexport interface MemoryRef {\n memory: WebAssembly.Memory | null;\n}\n\n// ---------------------------------------------------------------------------\n// AllocatorRef interface\n// ---------------------------------------------------------------------------\n\n/**\n * A mutable reference to the WASM allocator function.\n *\n * The `alloc` field starts as `null` and is wired up after the\n * `kb-worker` WASM module is instantiated. Host import functions\n * that must allocate memory in WASM linear memory check this\n * reference before proceeding and return -1 when it is null.\n */\nexport interface AllocatorRef {\n /**\n * Allocates `size` bytes in WASM linear memory and returns the\n * byte offset of the allocated region, or `null` when the\n * allocator is not yet available.\n */\n alloc: ((size: number) => number) | null;\n}\n\n/** Default `FsAdapter` backed by `node:fs` synchronous APIs. */\nconst nodeFsAdapter: FsAdapter = {\n readFileSync: (p) => readFileSync(p),\n writeFileSync: (p, d) => {\n writeFileSync(p, d);\n },\n renameSync: (o, n) => {\n renameSync(o, n);\n },\n unlinkSync: (p) => {\n unlinkSync(p);\n },\n readdirSync: (p) => readdirSync(p),\n mkdirSync: (p) => {\n mkdirSync(p, { recursive: true });\n },\n existsSync: (p) => existsSync(p),\n};\n\n/** Default `MemoryRef` with no memory wired. */\nconst nullMemory: MemoryRef = { memory: null };\n\n/** Default `AllocatorRef` with no allocator wired. */\nconst nullAllocator: AllocatorRef = { alloc: null };\n\n// ---------------------------------------------------------------------------\n// createHostImports\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the host I/O import functions required by `kb-worker.wasm`.\n *\n * All functions read the WASM linear memory through `memoryRef`,\n * a deferred reference wired up after module instantiation (the\n * module exports its own memory). Paths from WASM are resolved\n * relative to `contextPath`.\n *\n * @param contextPath - absolute path to the `.kbdb` database directory\n * @param memoryRef - deferred reference to the WASM module's\n * exported memory; wired after instantiation\n * @param fs - filesystem adapter; defaults to real `node:fs` operations\n * @param allocator - reference to the WASM allocator; wired after\n * `kb-worker` instantiation. Defaults to a null (uninitialized) ref.\n * @returns a record of host import functions keyed by their WASM import\n * names\n */\nexport function createHostImports(\n contextPath: string,\n memoryRef: MemoryRef = nullMemory,\n fs: FsAdapter = nodeFsAdapter,\n allocator: AllocatorRef = nullAllocator,\n): Record<string, WebAssembly.ImportValue> {\n function getBuffer(): ArrayBuffer {\n if (!memoryRef.memory) {\n throw new Error('WASM memory not initialized');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return memoryRef.memory.buffer as ArrayBuffer;\n }\n\n function readPathArg(ptr: number, len: number): string {\n const bytes = new Uint8Array(getBuffer(), ptr, len);\n const decoded = new TextDecoder().decode(bytes);\n if (decoded.startsWith('/')) return decoded;\n return join(contextPath, decoded);\n }\n\n return {\n /**\n * Reads a file at the path encoded in shared memory and writes\n * the result back via the out-pointer protocol.\n *\n * `outPtr` and `outLen` are WASM linear-memory addresses. On\n * success, the host allocates a buffer via `allocator.alloc`,\n * copies the file data there, and writes the allocated pointer\n * as a LE u32 to `outPtr` and the data length as a LE u32 to\n * `outLen`. Returns 0 on success, -1 on error or when the\n * allocator is not yet available.\n */\n host_read_file(\n pathPtr: number,\n pathLen: number,\n outPtr: number,\n outLen: number,\n ): number {\n try {\n if (!allocator.alloc) return -1;\n const filePath = readPathArg(pathPtr, pathLen);\n const data = fs.readFileSync(filePath);\n const dataLen = data.byteLength;\n if (dataLen === 0) {\n // No allocation -- buffer cannot have grown; safe to\n // create DataView now.\n const dv = new DataView(getBuffer());\n dv.setUint32(outPtr, 0, true);\n dv.setUint32(outLen, 0, true);\n return 0;\n }\n const dataPtr = allocator.alloc(dataLen);\n if (dataPtr === 0) return -1;\n // Create DataView AFTER alloc() -- alloc may trigger WASM\n // memory growth, which detaches the old ArrayBuffer and\n // replaces it with a new one. A DataView captured before\n // growth would reference the detached buffer and throw.\n const dv = new DataView(getBuffer());\n const memView = new Uint8Array(getBuffer());\n memView.set(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ),\n dataPtr,\n );\n dv.setUint32(outPtr, dataPtr, true);\n dv.setUint32(outLen, dataLen, true);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Writes bytes from shared memory (`dataPtr`, `dataLen`) to the\n * file at the path encoded in shared memory. Returns 0 on\n * success, -1 on error.\n */\n host_write_file(\n pathPtr: number,\n pathLen: number,\n dataPtr: number,\n dataLen: number,\n ): number {\n try {\n const filePath = readPathArg(pathPtr, pathLen);\n const data = new Uint8Array(getBuffer(), dataPtr, dataLen);\n fs.writeFileSync(filePath, data);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Renames the file at `oldPtr/oldLen` to `newPtr/newLen`.\n * Both paths are resolved relative to `contextPath`. Returns 0\n * on success, -1 on error.\n */\n host_rename(\n oldPtr: number,\n oldLen: number,\n newPtr: number,\n newLen: number,\n ): number {\n try {\n const oldPath = readPathArg(oldPtr, oldLen);\n const newPath = readPathArg(newPtr, newLen);\n fs.renameSync(oldPath, newPath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Deletes the file at the path encoded in shared memory.\n * Returns 0 on success, -1 on error.\n */\n host_remove_file(pathPtr: number, pathLen: number): number {\n try {\n const filePath = readPathArg(pathPtr, pathLen);\n fs.unlinkSync(filePath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Lists the directory at the path encoded in shared memory and\n * writes the result back via the out-pointer protocol.\n *\n * `outPtr` and `outLen` are WASM linear-memory addresses. On\n * success, the host allocates a buffer via `allocator.alloc`,\n * copies a newline-delimited UTF-8 listing there, and writes\n * the allocated pointer as a LE u32 to `outPtr` and the byte\n * length as a LE u32 to `outLen`. Returns 0 on success, -1 on\n * error or when the allocator is not yet available.\n */\n host_list_dir(\n pathPtr: number,\n pathLen: number,\n outPtr: number,\n outLen: number,\n ): number {\n try {\n if (!allocator.alloc) return -1;\n const dirPath = readPathArg(pathPtr, pathLen);\n const entries = fs.readdirSync(dirPath);\n const text = entries.join('\\n');\n const encoded = new TextEncoder().encode(text);\n if (encoded.length === 0) {\n // No allocation -- buffer cannot have grown; safe to\n // create DataView now.\n const dv = new DataView(getBuffer());\n dv.setUint32(outPtr, 0, true);\n dv.setUint32(outLen, 0, true);\n return 0;\n }\n const dataPtr = allocator.alloc(encoded.length);\n if (dataPtr === 0) return -1;\n // Create DataView AFTER alloc() -- alloc may trigger WASM\n // memory growth, which detaches the old ArrayBuffer and\n // replaces it with a new one. A DataView captured before\n // growth would reference the detached buffer and throw.\n const dv = new DataView(getBuffer());\n new Uint8Array(getBuffer(), dataPtr, encoded.length).set(\n encoded,\n );\n dv.setUint32(outPtr, dataPtr, true);\n dv.setUint32(outLen, encoded.length, true);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Creates the directory at the path encoded in shared memory,\n * including any missing parent directories (recursive). Returns\n * 0 on success, -1 on error.\n */\n host_mkdir(pathPtr: number, pathLen: number): number {\n try {\n const dirPath = readPathArg(pathPtr, pathLen);\n fs.mkdirSync(dirPath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Checks whether the file at the path encoded in shared memory\n * exists. Returns 1 if it exists, 0 if it does not.\n */\n host_file_exists(pathPtr: number, pathLen: number): number {\n const filePath = readPathArg(pathPtr, pathLen);\n return fs.existsSync(filePath) ? 1 : 0;\n },\n };\n}\n", "import { createServer } from 'node:net';\nimport type { Server, Socket } from 'node:net';\nimport type {\n IpcHandler,\n IpcRequest,\n IpcResponse,\n} from '../typings/ipc-handler.interface.ts';\n\n/**\n * Creates a Unix socket (or named pipe on Windows) IPC server that\n * reads newline-delimited JSON-RPC requests and writes responses.\n *\n * Each line received on a socket connection is parsed as an\n * `IpcRequest`, dispatched to `handler`, and the resulting\n * `IpcResponse` is written back as a newline-terminated JSON string.\n * A malformed line that cannot be parsed results in a JSON-RPC\n * parse-error response (`-32700`).\n *\n * @param socketPath - path to the Unix domain socket or Windows\n * named pipe\n * @param handler - async function invoked for each valid request\n * @returns the listening `net.Server` instance\n */\nexport function createIpcServer(\n socketPath: string,\n handler: IpcHandler,\n): Server {\n const server = createServer((socket) => {\n let buffer = '';\n\n let processingQueue = Promise.resolve();\n\n socket.on('data', (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n processingQueue = processingQueue.then(() =>\n handleLine(line, handler, socket),\n );\n }\n });\n\n socket.on('error', (err: Error) => {\n // eslint-disable-next-line no-console\n console.error(\n `kbdb-worker: ipc connection error: ${err.message}`,\n );\n });\n });\n\n server.on('error', (err: Error) => {\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ipc server error: ${err.message}`);\n });\n\n server.listen(socketPath);\n return server;\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? Number(value) : value;\n}\n\nasync function handleLine(\n line: string,\n handler: IpcHandler,\n socket: Socket,\n): Promise<void> {\n let response: IpcResponse;\n try {\n const request = JSON.parse(line) as IpcRequest;\n response = await handler(request);\n } catch {\n response = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n }\n socket.write(JSON.stringify(response, bigintReplacer) + '\\n');\n}\n", "import { join } from 'node:path';\nimport { getTmpdir } from './get-tmpdir.function.ts';\n\n/**\n * Returns the platform-appropriate IPC socket path for a given\n * context identifier.\n *\n * On Windows, returns a named pipe path (`\\\\.\\pipe\\kbdb-<ctx>`).\n * On POSIX systems, returns a Unix domain socket path under the\n * system temp directory (`<tmpdir>/kbdb-<ctx>.sock`).\n *\n * @param ctx - unique context identifier embedded in the path\n */\nexport function getIpcPath(ctx: string): string {\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\kbdb-${ctx}`;\n }\n return join(getTmpdir(), `kbdb-${ctx}.sock`);\n}\n", "import { tmpdir } from 'node:os';\n\n/**\n * Returns the operating system's default temporary directory path.\n */\nexport function getTmpdir(): string {\n return tmpdir();\n}\n", "const encoder = new TextEncoder();\n\nexport function encodeString(value: string): Uint8Array {\n const utf8 = encoder.encode(value);\n const result = new Uint8Array(4 + utf8.length);\n new DataView(result.buffer).setUint32(0, utf8.length, true);\n result.set(utf8, 4);\n return result;\n}\n", "export function encodeU32(value: number): Uint8Array {\n const result = new Uint8Array(4);\n new DataView(result.buffer).setUint32(0, value, true);\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\n\nexport function encodeOptionString(\n value: string | null | undefined,\n): Uint8Array {\n if (value == null) {\n return new Uint8Array([0x00]);\n }\n const encoded = encodeString(value);\n const result = new Uint8Array(1 + encoded.length);\n result[0] = 0x01;\n result.set(encoded, 1);\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\n\nexport function encodeSectionType(\n kind: 'text' | 'code' | 'image',\n mimeType?: string,\n): Uint8Array {\n if (kind === 'text') {\n return new Uint8Array([0x00]);\n }\n\n const tag = kind === 'code' ? 0x01 : 0x02;\n const mime = mimeType ?? 'text/plain';\n const encoded = encodeString(mime);\n const result = new Uint8Array(1 + encoded.length);\n result[0] = tag;\n result.set(encoded, 1);\n return result;\n}\n", "import { encodeSectionType } from './encode-section-type.function.ts';\nimport { encodeString } from './encode-string.function.ts';\nimport { encodeOptionString } from './encode-option-string.function.ts';\nimport { encodeU32 } from './encode-u32.function.ts';\n\n/**\n * Parameters for adding a new section to the knowledge base.\n *\n * Maps to the Rust `AddSectionParams` struct encoded for the\n * `worker_add_section` WASM export.\n */\nexport interface AddSectionInput {\n /** Semantic content category. */\n sectionType: 'text' | 'code' | 'image';\n /** MIME type; required for `code` and `image` section types. */\n mimeType?: string;\n /** Raw section content. */\n content: string;\n /** Optional section heading. */\n title?: string | null;\n /** Optional description summary. */\n description?: string | null;\n /** Optional document identifier to attach the section to. */\n docid?: string | null;\n /**\n * Application-level type name for the section (e.g. `'skill'`,\n * `'fact'`). `null` means no custom type.\n */\n typeName?: string | null;\n /**\n * Absolute path of the source file being learned. `undefined`\n * means stdin input or programmatic API call.\n */\n sourcePath?: string;\n /**\n * ISO 8601 modified time of the source file. `undefined` means\n * no source file exists.\n */\n sourceMtime?: string;\n /**\n * User-supplied tags for scoping and filtering. Defaults to\n * an empty list when not provided.\n */\n tags?: string[];\n /**\n * When `true`, supersede any existing section with the same\n * source key. Defaults to `false`.\n */\n replace?: boolean;\n}\n\n/**\n * Encodes `AddSectionInput` as the binary format expected by the\n * `worker_add_section` WASM export.\n *\n * Wire format (little-endian):\n * - `SectionType` tag byte (+ optional MIME string for code/image)\n * - `content`: `u32` length + UTF-8 bytes\n * - `title`: `u8` flag + optional `String`\n * - `description`: `u8` flag + optional `String`\n * - `docid`: `u8` flag + optional `String`\n * - `typeName`: `u8` flag + optional `String`\n * - `sourcePath`: `u8` flag + optional `String`\n * - `sourceMtime`: `u8` flag + optional `String`\n * - `tags`: `u32` count + each `String`\n * - `replace`: `u8` (0 or 1)\n */\nexport function encodeAddSectionParams(\n params: AddSectionInput,\n): Uint8Array {\n const tags = params.tags ?? [];\n const tagParts: Uint8Array[] = [];\n for (const tag of tags) {\n tagParts.push(encodeString(tag));\n }\n const tagsCountBytes = encodeU32(tags.length);\n const replaceByte = new Uint8Array([\n params.replace === true ? 1 : 0,\n ]);\n\n const parts = [\n encodeSectionType(params.sectionType, params.mimeType),\n encodeString(params.content),\n encodeOptionString(params.title),\n encodeOptionString(params.description),\n encodeOptionString(params.docid),\n encodeOptionString(params.typeName),\n encodeOptionString(params.sourcePath),\n encodeOptionString(params.sourceMtime),\n tagsCountBytes,\n ...tagParts,\n replaceByte,\n ];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\nimport { encodeAddSectionParams } from './encode-add-section-params.function.ts';\n\nimport type { AddSectionInput } from './encode-add-section-params.function.ts';\n\nexport function encodeUpdateSectionParams(\n oldKbid: string,\n params: AddSectionInput,\n): Uint8Array {\n const kbidBytes = encodeString(oldKbid);\n const paramBytes = encodeAddSectionParams(params);\n const result = new Uint8Array(kbidBytes.length + paramBytes.length);\n result.set(kbidBytes, 0);\n result.set(paramBytes, kbidBytes.length);\n return result;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\nexport function encodeKbidList(kbids: string[]): Uint8Array {\n if (kbids.length === 0) {\n return new Uint8Array(0);\n }\n const parts = [encodeU32(kbids.length), ...kbids.map(encodeString)];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\nimport { encodeKbidList } from './encode-kbid-list.function.ts';\n\n/**\n * Encodes parameters for the `worker_group_sections` WASM call into\n * a single byte buffer: title, kbid list, then doc type tag.\n *\n * @param title - human-readable document title\n * @param kbids - identifiers of the sections to group\n * @param docType - application-level document type tag; defaults to\n * empty string when not specified\n */\nexport function encodeGroupParams(\n title: string,\n kbids: string[],\n docType = '',\n): Uint8Array {\n const titleBytes = encodeString(title);\n const listBytes = encodeKbidList(kbids);\n const docTypeBytes = encodeString(docType);\n const result = new Uint8Array(\n titleBytes.length + listBytes.length + docTypeBytes.length,\n );\n result.set(titleBytes, 0);\n result.set(listBytes, titleBytes.length);\n result.set(docTypeBytes, titleBytes.length + listBytes.length);\n return result;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\nexport function encodeIdentifierList(ids: string[]): Uint8Array {\n if (ids.length === 0) {\n return new Uint8Array(0);\n }\n const parts = [encodeU32(ids.length), ...ids.map(encodeString)];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "const encoder = new TextEncoder();\n\nexport function encodeSearchParams(\n query: string,\n mode = 'and',\n limit = 20,\n offset = 0,\n): Uint8Array {\n return encoder.encode(\n `${query}\\n${mode}\\n${String(limit)}\\n${String(offset)}`,\n );\n}\n", "/**\n * Encodes a type filter string as raw UTF-8 bytes for WASM input.\n *\n * Used to pass a type name to WASM exports such as\n * `worker_list_by_type` and `worker_list_docs_by_type`, which accept\n * a plain UTF-8 byte slice without a length prefix.\n *\n * @param typeStr - the type name to filter by (e.g. `'article'`)\n * @returns UTF-8 encoded bytes ready to pass to the WASM export\n */\nexport function encodeTypeFilterParam(typeStr: string): Uint8Array {\n return new TextEncoder().encode(typeStr);\n}\n", "const decoder = new TextDecoder();\n\nexport interface DecodeResult<T> {\n value: T;\n bytesRead: number;\n}\n\nexport function decodeString(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<string> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n const len = view.getUint32(offset, true);\n const value = decoder.decode(\n bytes.subarray(offset + 4, offset + 4 + len),\n );\n return { value, bytesRead: 4 + len };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeU32(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<number> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getUint32(offset, true),\n bytesRead: 4,\n };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeF32(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<number> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getFloat32(offset, true),\n bytesRead: 4,\n };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeU64(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<bigint> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getBigUint64(offset, true),\n bytesRead: 8,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeF32 } from './decode-f32.function.ts';\n\n/**\n * A single ranked result item from a paged search response.\n */\nexport interface SectionMatch {\n /** Knowledge-base identifier for the matched section. */\n kbid: string;\n /** Section heading, or `null` when untitled. */\n heading: string | null;\n /** MIME type of the section content. */\n type: string;\n /** Document IDs this section belongs to. */\n docids: string[];\n /** Relevance score from the ranking engine. */\n score: number;\n /**\n * Confidence modifier (0.0\u20131.0) applied after relaxed search.\n * Always 1.0 for strict-mode results.\n */\n confidence: number;\n /** KWIC snippet (~150 chars around the best match). */\n snippet: string;\n /** Query terms that matched within this section. */\n matched_terms: string[];\n /**\n * Document fields that contained at least one matched term\n * (e.g. `'title'`, `'body'`).\n */\n matched_fields: string[];\n /** ISO 8601 creation timestamp of the section. */\n created_at: string;\n}\n\n/**\n * Paginated search response envelope returned by the WASM engine.\n */\nexport interface PagedSearchResult {\n /** Matching sections for the current page. */\n items: SectionMatch[];\n /** Total number of matches across all pages. */\n total: number;\n /** Number of results skipped (pagination offset). */\n offset: number;\n /** Maximum results per page. */\n limit: number;\n /** Whether more results exist beyond this page. */\n has_more: boolean;\n /**\n * Whether the engine fell back to relaxed (OR-mode) search\n * after strict (AND-mode) returned no results.\n */\n relaxed: boolean;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\n/**\n * Decodes the binary `PagedSearchResult` returned by the\n * `worker_get_result` WASM export after a `worker_search` call.\n *\n * Wire format (little-endian):\n * - `total`: `u32`\n * - `offset`: `u32`\n * - `limit`: `u32`\n * - `has_more`: `u8` (0/1)\n * - `relaxed`: `u8` (0/1)\n * - `item_count`: `u32`\n * - Per item:\n * - `kbid`: `String`\n * - `heading`: `Option<String>`\n * - `section_type`: `String`\n * - `docids`: `u32` count + `String[]`\n * - `score`: `f32`\n * - `confidence`: `f32`\n * - `snippet`: `String`\n * - `matched_terms`: `u32` count + `String[]`\n * - `matched_fields`: `u32` count + `String[]`\n * - `created_at`: `String`\n */\nexport function decodePagedSearchResult(\n bytes: Uint8Array,\n): PagedSearchResult {\n let offset = 0;\n\n const total = decodeU32(bytes, offset);\n offset += total.bytesRead;\n\n const resultOffset = decodeU32(bytes, offset);\n offset += resultOffset.bytesRead;\n\n const limit = decodeU32(bytes, offset);\n offset += limit.bytesRead;\n\n const hasMore = bytes[offset] === 1;\n offset += 1;\n\n // relaxed flag added after has_more\n const relaxed = offset < bytes.length && bytes[offset] === 1;\n if (offset < bytes.length) {\n offset += 1;\n }\n\n const itemCount = decodeU32(bytes, offset);\n offset += itemCount.bytesRead;\n\n const items: SectionMatch[] = [];\n for (let i = 0; i < itemCount.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, offset);\n offset += heading.bytesRead;\n\n const sectionType = decodeString(bytes, offset);\n offset += sectionType.bytesRead;\n\n const docidCount = decodeU32(bytes, offset);\n offset += docidCount.bytesRead;\n const docids: string[] = [];\n for (let j = 0; j < docidCount.value; j++) {\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n docids.push(docid.value);\n }\n\n const score = decodeF32(bytes, offset);\n offset += score.bytesRead;\n\n // confidence added after score\n const confidence = decodeF32(bytes, offset);\n offset += confidence.bytesRead;\n\n const snippet = decodeString(bytes, offset);\n offset += snippet.bytesRead;\n\n const termCount = decodeU32(bytes, offset);\n offset += termCount.bytesRead;\n const matched_terms: string[] = [];\n for (let j = 0; j < termCount.value; j++) {\n const term = decodeString(bytes, offset);\n offset += term.bytesRead;\n matched_terms.push(term.value);\n }\n\n // matched_fields added after matched_terms\n const fieldCount = decodeU32(bytes, offset);\n offset += fieldCount.bytesRead;\n const matched_fields: string[] = [];\n for (let j = 0; j < fieldCount.value; j++) {\n const field = decodeString(bytes, offset);\n offset += field.bytesRead;\n matched_fields.push(field.value);\n }\n\n // created_at added after matched_fields\n const createdAt = decodeString(bytes, offset);\n offset += createdAt.bytesRead;\n\n items.push({\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n docids,\n score: score.value,\n confidence: confidence.value,\n snippet: snippet.value,\n matched_terms,\n matched_fields,\n created_at: createdAt.value,\n });\n }\n\n return {\n items,\n total: total.value,\n offset: resultOffset.value,\n limit: limit.value,\n has_more: hasMore,\n relaxed,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\n/**\n * A single section record decoded from WASM binary output.\n *\n * Represents a stored knowledge-base section with all its metadata\n * and token counts as returned by `worker_read_sections` or\n * `worker_list_by_type`.\n */\nexport interface SectionRecord {\n /** Unique knowledge-base identifier for this section. */\n kbid: string;\n /** Document identifier this section belongs to, or `null`. */\n docid: string | null;\n /** Semantic type discriminant: `'text'`, `'code'`, or `'image'`. */\n sectionType: string;\n /** MIME type string, present only for `'code'` and `'image'` types. */\n mimeType?: string;\n /** Human-readable title for the section, or `null`. */\n title: string | null;\n /** Optional description of the section content, or `null`. */\n description: string | null;\n /** Raw text or base64-encoded content of the section. */\n content: string;\n /** Byte size of the stored content. */\n size: number;\n /** Section creation timestamp as a Unix epoch value. */\n createdAt: bigint;\n /** Integrity checksum of the stored content. */\n checksum: string;\n /** Total number of tokens in the section. */\n tokenCount: number;\n /** Number of heading tokens in the section. */\n headingTokenCount: number;\n /** Number of body tokens in the section. */\n bodyTokenCount: number;\n /** Number of code tokens in the section. */\n codeTokenCount: number;\n /** Application-level type name assigned to this section. */\n typeName: string;\n /**\n * Stable logical identity derived from source path and heading.\n * `null` for stdin input or sections without a source path.\n */\n sourceKey: string | null;\n /**\n * Absolute path of the source file that was learned.\n * `null` for stdin input or programmatic API calls.\n */\n sourcePath: string | null;\n /**\n * ISO 8601 modified time of the source file at learn time.\n * `null` when no source file exists.\n */\n sourceMtime: string | null;\n /**\n * ISO 8601 timestamp of the last supersession.\n * `null` on first creation.\n */\n updatedAt: string | null;\n /** User-supplied tags for scoping and filtering. */\n tags: string[];\n /**\n * The kbid of the section this one replaced via supersession.\n * `null` on first creation or non-superseding additions.\n */\n supersedes: string | null;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\nfunction decodeSectionType(\n bytes: Uint8Array,\n offset: number,\n): {\n sectionType: string;\n mimeType?: string;\n bytesRead: number;\n} {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { sectionType: 'text', bytesRead: 1 };\n }\n const mime = decodeString(bytes, offset + 1);\n const kind = tag === 0x01 ? 'code' : 'image';\n return {\n sectionType: kind,\n mimeType: mime.value,\n bytesRead: 1 + mime.bytesRead,\n };\n}\n\n/**\n * Decodes a list of `SectionRecord` values from WASM binary output.\n *\n * Reads a leading u32 count followed by that many encoded records.\n * Each record is decoded in field order as produced by the Rust\n * `SectionRecord::encode` implementation.\n *\n * Trailing fields (`sourceKey`, `sourcePath`, `sourceMtime`,\n * `updatedAt`, `tags`, `supersedes`) were added after the initial\n * format. When decoding legacy bytes that stop after `typeName`,\n * those fields default to `null` / `[]`. This matches the Rust\n * decoder's backward-compatibility guards.\n *\n * @param bytes - raw bytes returned by a WASM section-list export\n * @returns decoded array of section records, empty when count is zero\n */\nexport function decodeSectionRecords(\n bytes: Uint8Array,\n): SectionRecord[] {\n let offset = 0;\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const records: SectionRecord[] = [];\n for (let i = 0; i < count.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const docid = decodeOptionString(bytes, offset);\n offset += docid.bytesRead;\n\n const st = decodeSectionType(bytes, offset);\n offset += st.bytesRead;\n\n const title = decodeOptionString(bytes, offset);\n offset += title.bytesRead;\n\n const description = decodeOptionString(bytes, offset);\n offset += description.bytesRead;\n\n const content = decodeString(bytes, offset);\n offset += content.bytesRead;\n\n const size = decodeU32(bytes, offset);\n offset += size.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const checksum = decodeString(bytes, offset);\n offset += checksum.bytesRead;\n\n const tokenCount = decodeU32(bytes, offset);\n offset += tokenCount.bytesRead;\n\n const headingTokenCount = decodeU32(bytes, offset);\n offset += headingTokenCount.bytesRead;\n\n const bodyTokenCount = decodeU32(bytes, offset);\n offset += bodyTokenCount.bytesRead;\n\n const codeTokenCount = decodeU32(bytes, offset);\n offset += codeTokenCount.bytesRead;\n\n const typeName = decodeString(bytes, offset);\n offset += typeName.bytesRead;\n\n // New trailing fields -- use length guards for backward compat.\n let sourceKey: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourceKey = v.value;\n }\n\n let sourcePath: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourcePath = v.value;\n }\n\n let sourceMtime: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourceMtime = v.value;\n }\n\n let updatedAt: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n updatedAt = v.value;\n }\n\n let tags: string[] = [];\n if (offset < bytes.length) {\n const tagCount = decodeU32(bytes, offset);\n offset += tagCount.bytesRead;\n tags = [];\n for (let j = 0; j < tagCount.value; j++) {\n const tag = decodeString(bytes, offset);\n offset += tag.bytesRead;\n tags.push(tag.value);\n }\n }\n\n let supersedes: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n supersedes = v.value;\n }\n\n const record: SectionRecord = {\n kbid: kbid.value,\n docid: docid.value,\n sectionType: st.sectionType,\n title: title.value,\n description: description.value,\n content: content.value,\n size: size.value,\n createdAt: createdAt.value,\n checksum: checksum.value,\n tokenCount: tokenCount.value,\n headingTokenCount: headingTokenCount.value,\n bodyTokenCount: bodyTokenCount.value,\n codeTokenCount: codeTokenCount.value,\n typeName: typeName.value,\n sourceKey,\n sourcePath,\n sourceMtime,\n updatedAt,\n tags,\n supersedes,\n };\n if (st.mimeType !== undefined) {\n record.mimeType = st.mimeType;\n }\n records.push(record);\n }\n\n return records;\n}\n", "import { decodeSectionRecords } from './decode-section-records.function.ts';\nimport type { SectionRecord } from './decode-section-records.function.ts';\n\nexport type { SectionRecord };\n\n/**\n * Decodes a WASM byte slice into an array of `SectionRecord` values.\n *\n * Thin wrapper around `decodeSectionRecords` provided as the\n * canonical entry point for list-response decoding from WASM exports\n * such as `worker_list_by_type`.\n *\n * @param bytes - raw bytes returned by a WASM section-list export\n * @returns decoded array of section records\n */\nexport function decodeSectionRecordList(\n bytes: Uint8Array,\n): SectionRecord[] {\n return decodeSectionRecords(bytes);\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\n/**\n * A single section reference within a document manifest.\n *\n * Associates a knowledge-base identifier with the section's\n * ordinal position in the document.\n */\nexport interface DocumentSection {\n /** Knowledge-base identifier of the referenced section. */\n kbid: string;\n /** Zero-based position of this section within its document. */\n position: number;\n}\n\n/**\n * A document manifest decoded from WASM binary output.\n *\n * Represents a grouped document record with its ordered list of\n * section references as returned by `worker_retrieve_doc`.\n */\nexport interface DocumentManifest {\n /** Unique document identifier. */\n docid: string;\n /** Human-readable document title. */\n title: string;\n /** Document creation timestamp as a Unix epoch value. */\n createdAt: bigint;\n /** Application-level type name assigned to this document. */\n docType: string;\n /** Ordered list of section references belonging to the document. */\n sections: DocumentSection[];\n}\n\n/**\n * Decodes a single `DocumentManifest` from WASM binary output.\n *\n * Reads fields in the order: docid, title, createdAt, docType,\n * section count, then each section's kbid and position.\n *\n * @param bytes - raw bytes returned by `worker_retrieve_doc`\n * @returns the decoded document manifest\n */\nexport function decodeDocumentManifest(\n bytes: Uint8Array,\n): DocumentManifest {\n let offset = 0;\n\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n\n const title = decodeString(bytes, offset);\n offset += title.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const docType = decodeString(bytes, offset);\n offset += docType.bytesRead;\n\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const sections: DocumentSection[] = [];\n for (let i = 0; i < count.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const position = decodeU32(bytes, offset);\n offset += position.bytesRead;\n\n sections.push({\n kbid: kbid.value,\n position: position.value,\n });\n }\n\n return {\n docid: docid.value,\n title: title.value,\n createdAt: createdAt.value,\n docType: docType.value,\n sections,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\nimport type {\n DocumentManifest,\n DocumentSection,\n} from './decode-document-manifest.function.ts';\n\nexport type { DocumentManifest, DocumentSection };\n\n/**\n * Decodes a WASM byte slice into an array of `DocumentManifest` values.\n *\n * The binary format is: u32 count, followed by count \u00D7 DocumentManifest\n * entries. Each entry contains: docid (string), title (string),\n * createdAt (u64), docType (string), section count (u32), then each\n * section's kbid (string) and position (u32).\n *\n * @param bytes - raw bytes returned by `worker_list_docs_by_type`\n * @returns decoded array of document manifests, empty when count is zero\n */\nexport function decodeDocumentManifestList(\n bytes: Uint8Array,\n): DocumentManifest[] {\n let offset = 0;\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const manifests: DocumentManifest[] = [];\n for (let i = 0; i < count.value; i++) {\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n\n const title = decodeString(bytes, offset);\n offset += title.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const docType = decodeString(bytes, offset);\n offset += docType.bytesRead;\n\n const secCount = decodeU32(bytes, offset);\n offset += secCount.bytesRead;\n\n const sections: DocumentSection[] = [];\n for (let j = 0; j < secCount.value; j++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const position = decodeU32(bytes, offset);\n offset += position.bytesRead;\n\n sections.push({\n kbid: kbid.value,\n position: position.value,\n });\n }\n\n manifests.push({\n docid: docid.value,\n title: title.value,\n createdAt: createdAt.value,\n docType: docType.value,\n sections,\n });\n }\n\n return manifests;\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\nexport interface ComposeOutput {\n markdown: string;\n totalChars: bigint;\n}\n\nexport function decodeComposeOutput(bytes: Uint8Array): ComposeOutput {\n const md = decodeString(bytes, 0);\n const totalChars = decodeU64(bytes, md.bytesRead);\n return {\n markdown: md.value,\n totalChars: totalChars.value,\n };\n}\n", "export function decodeKeyValueText(\n text: string,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of text.split('\\n')) {\n const idx = line.indexOf('=');\n if (idx < 0) continue;\n const key = line.slice(0, idx);\n const value = line.slice(idx + 1);\n if (key) {\n result[key] = value;\n }\n }\n return result;\n}\n", "export function decodeRemoveFlag(bytes: Uint8Array): boolean {\n return bytes.length > 0 && bytes[0] === 0x01;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\n/**\n * Encodes recall parameters to the binary format expected by the\n * `worker_recall` WASM export.\n *\n * Binary layout:\n * - `u8 tag`: `0` = single kbid, `1` = batch\n * - If tag=0: `u32 len + utf8` kbid\n * - If tag=1: `u32 count` + (`u32 len + utf8`) per kbid\n * - `u32 depth` (little-endian)\n *\n * When both `kbid` and `kbids` are provided, `kbids` takes precedence\n * and `kbid` is appended to the batch.\n *\n * @param params - recall parameters; at least one of `kbid` or\n * `kbids` must be present\n */\nexport function encodeRecallParams(params: {\n kbid?: string;\n kbids?: readonly string[];\n depth?: number;\n}): Uint8Array {\n const depth = params.depth ?? 0;\n const depthBytes = encodeU32(depth);\n\n // Batch: kbids provided (kbid optionally appended)\n if (params.kbids !== undefined) {\n const allKbids: string[] =\n params.kbid !== undefined\n ? [...params.kbids, params.kbid]\n : [...params.kbids];\n\n const countBytes = encodeU32(allKbids.length);\n const encodedKbids = allKbids.map(encodeString);\n\n const totalLen =\n 1 + // tag\n countBytes.length +\n encodedKbids.reduce((sum, b) => sum + b.length, 0) +\n depthBytes.length;\n\n const result = new Uint8Array(totalLen);\n let offset = 0;\n result[offset++] = 0x01; // tag = batch\n result.set(countBytes, offset);\n offset += countBytes.length;\n for (const kbidBytes of encodedKbids) {\n result.set(kbidBytes, offset);\n offset += kbidBytes.length;\n }\n result.set(depthBytes, offset);\n return result;\n }\n\n // Single kbid\n const kbid = params.kbid ?? '';\n const kbidBytes = encodeString(kbid);\n const totalLen = 1 + kbidBytes.length + depthBytes.length;\n const result = new Uint8Array(totalLen);\n let offset = 0;\n result[offset++] = 0x00; // tag = single\n result.set(kbidBytes, offset);\n offset += kbidBytes.length;\n result.set(depthBytes, offset);\n return result;\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport type {\n RecallResult,\n RecallDocument,\n RecallSibling,\n RecallReference,\n} from '../../worker-client/typings/recall-result.model.ts';\n\n/**\n * Decodes recall result binary output from the `worker_recall` WASM\n * export.\n *\n * Binary layout:\n * - `u8 tag`: `0` = single result, `1` = batch\n * - If tag=0: one RecallResult record\n * - If tag=1: `u32 count` + `count` RecallResult records\n *\n * Each RecallResult:\n * ```\n * String kbid\n * Option<String> heading (0x00=null, 0x01 + String)\n * String section_type\n * String content\n * u32 docids_count + String[] docids\n * u32 documents_count + RecallDocument[]\n * u32 back_references_count + RecallReference[]\n * u32 siblings_count + RecallSibling[]\n * u32 references_count + RecallReference[]\n * ```\n *\n * @param bytes - raw binary output from the WASM export\n * @returns a single `RecallResult` for tag=0, or `RecallResult[]`\n * for tag=1\n */\nexport function decodeRecallResult(\n bytes: Uint8Array,\n): RecallResult | RecallResult[] {\n const tag = bytes[0];\n let offset = 1;\n\n if (tag === 0x01) {\n // Batch\n const countResult = decodeU32(bytes, offset);\n offset += countResult.bytesRead;\n const items: RecallResult[] = [];\n for (let i = 0; i < countResult.value; i++) {\n const { item, bytesRead } = decodeOneResult(bytes, offset);\n offset += bytesRead;\n items.push(item);\n }\n return items;\n }\n\n // Single (tag=0 or any other value)\n const { item } = decodeOneResult(bytes, offset);\n return item;\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\ninterface DecodeResultPair {\n item: RecallResult;\n bytesRead: number;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\nfunction decodeReference(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallReference; bytesRead: number } {\n let pos = offset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const markerType = decodeString(bytes, pos);\n pos += markerType.bytesRead;\n\n const contextSnippet = decodeString(bytes, pos);\n pos += contextSnippet.bytesRead;\n\n const direction = decodeString(bytes, pos);\n pos += direction.bytesRead;\n\n return {\n value: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n marker_type: markerType.value,\n context_snippet: contextSnippet.value,\n direction: direction.value as 'forward' | 'back',\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeSibling(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallSibling; bytesRead: number } {\n let pos = offset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const content = decodeString(bytes, pos);\n pos += content.bytesRead;\n\n return {\n value: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n content: content.value,\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeDocument(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallDocument; bytesRead: number } {\n let pos = offset;\n\n const docid = decodeString(bytes, pos);\n pos += docid.bytesRead;\n\n const title = decodeString(bytes, pos);\n pos += title.bytesRead;\n\n const sectionCount = decodeU32(bytes, pos);\n pos += sectionCount.bytesRead;\n\n const sections: RecallDocument['sections'][number][] = [];\n for (let i = 0; i < sectionCount.value; i++) {\n const secKbid = decodeString(bytes, pos);\n pos += secKbid.bytesRead;\n\n const secHeading = decodeOptionString(bytes, pos);\n pos += secHeading.bytesRead;\n\n const secType = decodeString(bytes, pos);\n pos += secType.bytesRead;\n\n sections.push({\n kbid: secKbid.value,\n heading: secHeading.value,\n type: secType.value,\n });\n }\n\n return {\n value: {\n docid: docid.value,\n title: title.value,\n sections,\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeOneResult(\n bytes: Uint8Array,\n startOffset: number,\n): DecodeResultPair {\n let pos = startOffset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const content = decodeString(bytes, pos);\n pos += content.bytesRead;\n\n const docidCount = decodeU32(bytes, pos);\n pos += docidCount.bytesRead;\n const docids: string[] = [];\n for (let i = 0; i < docidCount.value; i++) {\n const docid = decodeString(bytes, pos);\n pos += docid.bytesRead;\n docids.push(docid.value);\n }\n\n const docCount = decodeU32(bytes, pos);\n pos += docCount.bytesRead;\n const documents: RecallDocument[] = [];\n for (let i = 0; i < docCount.value; i++) {\n const doc = decodeDocument(bytes, pos);\n pos += doc.bytesRead;\n documents.push(doc.value);\n }\n\n const backRefCount = decodeU32(bytes, pos);\n pos += backRefCount.bytesRead;\n const back_references: RecallReference[] = [];\n for (let i = 0; i < backRefCount.value; i++) {\n const ref = decodeReference(bytes, pos);\n pos += ref.bytesRead;\n back_references.push(ref.value);\n }\n\n const sibCount = decodeU32(bytes, pos);\n pos += sibCount.bytesRead;\n const siblings: RecallSibling[] = [];\n for (let i = 0; i < sibCount.value; i++) {\n const sib = decodeSibling(bytes, pos);\n pos += sib.bytesRead;\n siblings.push(sib.value);\n }\n\n const refCount = decodeU32(bytes, pos);\n pos += refCount.bytesRead;\n const references: RecallReference[] = [];\n for (let i = 0; i < refCount.value; i++) {\n const ref = decodeReference(bytes, pos);\n pos += ref.bytesRead;\n references.push(ref.value);\n }\n\n return {\n item: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n content: content.value,\n docids,\n documents,\n back_references,\n siblings,\n references,\n },\n bytesRead: pos - startOffset,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\nimport { decodeF32 } from './decode-f32.function.ts';\n\n/**\n * A near-duplicate section identified during add-section indexing.\n */\nexport interface NearDuplicate {\n /** Knowledge-base identifier of the near-duplicate section. */\n readonly kbid: string;\n /** Jaccard similarity score (0.0\u20131.0). */\n readonly similarity: number;\n}\n\n/**\n * Decoded result of a `worker_add_section` WASM call.\n *\n * Mirrors the Rust `AddSectionResult` struct encoded via the\n * `Encode` trait wire format.\n */\nexport interface AddSectionResult {\n /** Knowledge-base identifier assigned to the new section. */\n readonly kbid: string;\n /** Number of unique terms indexed for the section. */\n readonly indexedTermsCount: number;\n /** Wall-clock time the add operation took, in milliseconds. */\n readonly elapsedMs: number;\n /**\n * Knowledge-base identifier of the section that was superseded,\n * or `null` if no supersession occurred.\n */\n readonly superseded: string | null;\n /** Advisory warnings emitted during indexing. */\n readonly warnings: string[];\n /**\n * Near-duplicate sections detected above the similarity threshold\n * (Jaccard \u2265 0.85).\n */\n readonly nearDuplicates: NearDuplicate[];\n}\n\n/**\n * Decodes the binary `AddSectionResult` returned by the\n * `worker_add_section` WASM export.\n *\n * Wire format (little-endian):\n * - `kbid`: `u32` length + UTF-8 bytes\n * - `indexed_terms_count`: `u32`\n * - `elapsed_ms`: `u64`\n * - `superseded`: `u8` flag (0=None, 1=Some) + optional `String`\n * - `warnings`: `u32` count + each `String`\n * - `near_duplicates`: `u32` count + each (`String` + `f32`)\n */\nexport function decodeAddSectionResult(\n bytes: Uint8Array,\n): AddSectionResult {\n let offset = 0;\n\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const indexedTermsCount = decodeU32(bytes, offset);\n offset += indexedTermsCount.bytesRead;\n\n const elapsedMsBig = decodeU64(bytes, offset);\n offset += elapsedMsBig.bytesRead;\n\n // Decode Option<String> for superseded\n const supersededTag = bytes[offset];\n offset += 1;\n let superseded: string | null = null;\n if (supersededTag === 0x01) {\n const supersededStr = decodeString(bytes, offset);\n offset += supersededStr.bytesRead;\n superseded = supersededStr.value;\n }\n\n // Decode Vec<String> for warnings\n const warningCount = decodeU32(bytes, offset);\n offset += warningCount.bytesRead;\n const warnings: string[] = [];\n for (let i = 0; i < warningCount.value; i++) {\n const warning = decodeString(bytes, offset);\n offset += warning.bytesRead;\n warnings.push(warning.value);\n }\n\n // Decode Vec<(String, f32)> for near_duplicates\n const dupCount = decodeU32(bytes, offset);\n offset += dupCount.bytesRead;\n const nearDuplicates: NearDuplicate[] = [];\n for (let i = 0; i < dupCount.value; i++) {\n const dupKbid = decodeString(bytes, offset);\n offset += dupKbid.bytesRead;\n const similarity = decodeF32(bytes, offset);\n offset += similarity.bytesRead;\n nearDuplicates.push({\n kbid: dupKbid.value,\n similarity: similarity.value,\n });\n }\n\n return {\n kbid: kbid.value,\n indexedTermsCount: indexedTermsCount.value,\n elapsedMs: Number(elapsedMsBig.value),\n superseded,\n warnings,\n nearDuplicates,\n };\n}\n", "import { resolve } from 'node:path';\n\n/** Result of the worker entry point. */\nexport interface WorkerResult {\n /** Error message (if any). */\n error?: string;\n /** Process exit code. `0` means success. */\n exitCode: number;\n}\n\n/**\n * Injectable dependencies for the worker entry point.\n */\nexport interface WorkerDeps {\n existsSync: (path: string) => boolean;\n startDaemon: (\n contextPath: string,\n wasmDir?: string,\n ) => Promise<void>;\n wasmDir?: string;\n}\n\n/**\n * Worker daemon entry point extracted from `src/worker.ts`.\n *\n * Validates the context path argument, resolves it to an\n * absolute path, checks existence, and delegates to\n * `startDaemon`.\n *\n * @param argv - raw arguments (expects `[contextPath]`)\n * @param deps - injectable dependencies\n */\nexport async function runWorker(\n argv: string[],\n deps: WorkerDeps,\n): Promise<WorkerResult> {\n const contextPath = argv[0];\n\n if (!contextPath) {\n return {\n error: 'usage: kbdb-worker <context-path>',\n exitCode: 1,\n };\n }\n\n const resolved = resolve(contextPath);\n\n if (!deps.existsSync(resolved)) {\n return {\n error: `error: path not found: ${resolved}`,\n exitCode: 1,\n };\n }\n\n await deps.startDaemon(resolved, deps.wasmDir);\n return { exitCode: 0 };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_node_fs", "import_node_path", "import_node_path", "import_node_fs", "import_node_path", "import_node_os", "import_node_fs", "import_node_path", "import_node_os", "import_node_fs", "import_node_fs", "import_node_path", "dv", "wasmDir", "import_node_path", "encoder", "decodeOptionString", "totalLen", "result", "offset", "kbidBytes", "item", "decodeOptionString", "
|
|
3
|
+
"sources": ["../src/worker.ts", "../src/shared/runtime/functions/detect-runtime.ts", "../src/shared/runtime/functions/get-args.ts", "../src/shared/dir-resolver/functions/resolve-base-dir.function.ts", "../src/shared/dir-resolver/functions/join-path.function.ts", "../src/shared/dir-resolver/functions/resolve-wasm-dir.function.ts", "../src/shared/worker-daemon/functions/read-config.function.ts", "../src/shared/worker-daemon/constants/daemon-defaults.constant.ts", "../src/shared/worker-daemon/functions/parse-embedding-section.function.ts", "../src/shared/auto-capture/constants/auto-capture-defaults.constant.ts", "../src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts", "../src/shared/worker-daemon/functions/parse-worker-toml.function.ts", "../src/shared/worker-daemon/functions/start-daemon.function.ts", "../src/shared/hash/functions/compute-sha256.ts", "../src/shared/worker-daemon/classes/worker-daemon.class.ts", "../src/shared/worker-daemon/functions/load-wasm-modules.function.ts", "../src/shared/worker-daemon/functions/create-host-imports.function.ts", "../src/shared/worker-daemon/functions/create-ipc-server.function.ts", "../src/shared/platform/functions/get-ipc-path.function.ts", "../src/shared/platform/functions/get-tmpdir.function.ts", "../src/shared/embedding/classes/null-embedding-provider.class.ts", "../src/shared/embedding/classes/onnx-embedding-provider.class.ts", "../src/shared/embedding/functions/parse-api-embedding-response.function.ts", "../src/shared/embedding/classes/api-embedding-provider.class.ts", "../src/shared/embedding/functions/create-embedding-provider.function.ts", "../src/shared/worker-daemon/functions/handle-hybrid-search.function.ts", "../src/shared/embedding/functions/search-vectors.function.ts", "../src/shared/embedding/functions/cosine-similarity.function.ts", "../src/shared/embedding/functions/rrf-fuse.function.ts", "../src/shared/worker-daemon/classes/ipc-error.class.ts", "../src/shared/embedding/functions/rebuild-vectors.function.ts", "../src/shared/embedding/functions/build-vector-index.function.ts", "../src/shared/wasm-codec/functions/encode-string.function.ts", "../src/shared/wasm-codec/functions/encode-u32.function.ts", "../src/shared/wasm-codec/functions/encode-option-string.function.ts", "../src/shared/wasm-codec/functions/encode-section-type.function.ts", "../src/shared/wasm-codec/functions/encode-add-section-params.function.ts", "../src/shared/wasm-codec/functions/encode-update-section-params.function.ts", "../src/shared/wasm-codec/functions/encode-kbid-list.function.ts", "../src/shared/wasm-codec/functions/encode-group-params.function.ts", "../src/shared/wasm-codec/functions/encode-identifier-list.function.ts", "../src/shared/wasm-codec/functions/encode-search-params.function.ts", "../src/shared/wasm-codec/functions/encode-type-filter-param.function.ts", "../src/shared/wasm-codec/functions/decode-string.function.ts", "../src/shared/wasm-codec/functions/decode-u32.function.ts", "../src/shared/wasm-codec/functions/decode-f32.function.ts", "../src/shared/wasm-codec/functions/decode-u64.function.ts", "../src/shared/wasm-codec/functions/decode-scored-results.function.ts", "../src/shared/wasm-codec/functions/decode-section-records.function.ts", "../src/shared/wasm-codec/functions/decode-section-record-list.function.ts", "../src/shared/wasm-codec/functions/decode-document-manifest.function.ts", "../src/shared/wasm-codec/functions/decode-document-manifest-list.function.ts", "../src/shared/wasm-codec/functions/decode-compose-output.function.ts", "../src/shared/wasm-codec/functions/decode-key-value-text.function.ts", "../src/shared/wasm-codec/functions/decode-remove-flag.function.ts", "../src/shared/wasm-codec/functions/encode-recall-params.function.ts", "../src/shared/wasm-codec/functions/decode-recall-result.function.ts", "../src/shared/wasm-codec/functions/decode-add-section-result.function.ts", "../src/shared/worker-daemon/functions/run-worker.function.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @module\n *\n * Worker daemon executable for kbdb. Runs as a detached\n * background process that loads WASM modules and serves\n * JSON-RPC 2.0 requests over local IPC.\n */\n\nimport { existsSync } from 'node:fs';\nimport { getArgs } from './shared/runtime/index.ts';\nimport {\n resolveBaseDir,\n resolveWasmDir,\n} from './shared/dir-resolver/index.ts';\nimport {\n startDaemon,\n runWorker,\n} from './shared/worker-daemon/index.ts';\n\nconst baseDir = resolveBaseDir(import.meta.url, import.meta.dirname);\nconst wasmDir = resolveWasmDir(baseDir.scriptDir);\n\nasync function main(): Promise<void> {\n const result = await runWorker(getArgs(), {\n existsSync,\n startDaemon,\n wasmDir,\n });\n if (result.error) {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n}\n\nmain().catch((err: unknown) => {\n // eslint-disable-next-line no-console\n console.error(err);\n process.exitCode = 1;\n});\n", "import type { Runtime } from '../typings/runtime.ts';\n\n/**\n * Detects the current JavaScript runtime environment.\n *\n * Returns `'deno'` when the global `Deno` object is present,\n * otherwise returns `'node'`.\n */\nexport function detectRuntime(): Runtime {\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n return 'deno';\n }\n return 'node';\n}\n", "import { detectRuntime } from './detect-runtime.ts';\n\n/**\n * Returns the command-line arguments for the current runtime.\n *\n * In Deno, reads `Deno.args`; in Node.js, slices `process.argv`\n * past the interpreter and script entries.\n */\nexport function getArgs(): string[] {\n if (detectRuntime() === 'deno') {\n const g = globalThis as Record<string, unknown>;\n const deno = g['Deno'] as { args: string[] } | undefined;\n return deno?.args ?? [];\n }\n return process.argv.slice(2);\n}\n", "import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { BaseDir } from '../typings/base-dir.interface.ts';\n\nexport function resolveScriptDir(\n entryUrl: string,\n entryDirname?: string,\n): string {\n if (entryDirname) return entryDirname;\n if (entryUrl.startsWith('file:'))\n return dirname(fileURLToPath(entryUrl));\n return dirname(entryUrl);\n}\n\nexport function resolveBaseDir(\n entryUrl: string,\n entryDirname?: string,\n): BaseDir {\n const scriptDir =\n typeof __dirname !== 'undefined'\n ? __dirname\n : resolveScriptDir(entryUrl, entryDirname);\n return { scriptDir, cwd: process.cwd() };\n}\n", "import { join } from 'node:path';\n\nexport function isRemoteUrl(path: string): boolean {\n return path.startsWith('http://') || path.startsWith('https://');\n}\n\nexport function joinPath(base: string, ...segments: string[]): string {\n if (isRemoteUrl(base)) {\n const trailing = base.endsWith('/') ? '' : '/';\n return base + trailing + segments.join('/');\n }\n return join(base, ...segments);\n}\n", "import { joinPath } from './join-path.function.ts';\n\nexport function resolveWasmDir(scriptDir: string): string {\n return joinPath(scriptDir, 'wasm');\n}\n", "import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport {\n DEFAULT_ITEM_LIMIT,\n DEFAULT_INDEX_LIMIT,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_ITEM_TTL_MS,\n WORKER_TOML_FILENAME,\n} from '../constants/daemon-defaults.constant.ts';\nimport { parseWorkerToml } from './parse-worker-toml.function.ts';\n\n/**\n * Reads the `worker.toml` configuration file from the given\n * context directory and returns a `DaemonConfig`.\n *\n * Falls back to all-default values when the file is absent or\n * unreadable.\n *\n * @param contextPath - absolute path to the `.kbdb` context\n * directory\n */\nexport function readConfig(contextPath: string): DaemonConfig {\n const configPath = join(contextPath, WORKER_TOML_FILENAME);\n try {\n const text = readFileSync(configPath, 'utf-8');\n return parseWorkerToml(text, contextPath);\n } catch {\n return {\n contextPath,\n itemLimit: DEFAULT_ITEM_LIMIT,\n indexLimit: DEFAULT_INDEX_LIMIT,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n itemTtlMs: DEFAULT_ITEM_TTL_MS,\n };\n }\n}\n", "/** Default maximum number of items held in daemon memory. */\nexport const DEFAULT_ITEM_LIMIT = 1000;\n\n/** Default maximum number of index entries held in daemon memory. */\nexport const DEFAULT_INDEX_LIMIT = 100;\n\n/**\n * Default idle timeout in milliseconds before the daemon shuts\n * down automatically (5 minutes).\n */\nexport const DEFAULT_TIMEOUT_MS = 300_000;\n\n/**\n * Default time-to-live in milliseconds for each cached item\n * (1 minute).\n */\nexport const DEFAULT_ITEM_TTL_MS = 60_000;\n\n/** Filename of the daemon configuration file inside `.kbdb/`. */\nexport const WORKER_TOML_FILENAME = 'worker.toml';\n\n/**\n * Database format version the daemon supports.\n *\n * Read from `catalog.toml` at startup. If the catalog version\n * differs, the daemon prints a structured error to stderr and\n * exits with code 1 before loading any WASM modules.\n */\nexport const DB_FORMAT_VERSION = 1;\n", "import type { EmbeddingConfig } from '../../embedding/typings/embedding-config.interface.ts';\n\n/**\n * Parses key-value pairs from a `[embedding]` TOML section into an\n * `EmbeddingConfig`.\n *\n * Recognises: `provider`, `model`, `endpoint`, `dimensions`.\n * Unknown keys are silently ignored. Returns `undefined` when the\n * `provider` key is absent from the supplied entries.\n *\n * @param entries - key-value pairs from inside the `[embedding]`\n * section\n */\nexport function parseEmbeddingSection(\n entries: ReadonlyMap<string, string>,\n): EmbeddingConfig | undefined {\n const provider = entries.get('provider') as\n | EmbeddingConfig['provider']\n | undefined;\n\n if (!provider) {\n return undefined;\n }\n\n const model = entries.get('model');\n const endpoint = entries.get('endpoint');\n const dimensionsRaw = entries.get('dimensions');\n const dimensions = dimensionsRaw\n ? parseInt(dimensionsRaw, 10) || undefined\n : undefined;\n\n return {\n provider,\n ...(model !== undefined ? { model } : {}),\n ...(endpoint !== undefined ? { endpoint } : {}),\n ...(dimensions !== undefined ? { dimensions } : {}),\n };\n}\n", "import type { AutoCaptureConfig } from '../typings/auto-capture-config.interface.ts';\n\n/**\n * Default configuration for the auto-capture feature.\n *\n * Auto-capture is disabled by default. Enable it in\n * `worker.toml` under `[auto_capture]`.\n */\nexport const AUTO_CAPTURE_DEFAULTS: AutoCaptureConfig = {\n enabled: false,\n triggerAfterToolCalls: 5,\n minIntervalMs: 60_000,\n maxCapturesPerSession: 10,\n dryRun: false,\n};\n", "import type { AutoCaptureConfig } from '../../auto-capture/typings/auto-capture-config.interface.ts';\nimport { AUTO_CAPTURE_DEFAULTS } from '../../auto-capture/constants/auto-capture-defaults.constant.ts';\n\n/**\n * Parses key-value pairs from an `[auto_capture]` TOML section\n * into an `AutoCaptureConfig`.\n *\n * Recognised keys: `enabled`, `trigger_after_tool_calls`,\n * `min_interval_ms`, `max_captures_per_session`, `dry_run`.\n * Unknown keys are silently ignored. Falls back to\n * `AUTO_CAPTURE_DEFAULTS` for any absent key.\n *\n * @param entries - key-value pairs from inside the\n * `[auto_capture]` section\n */\nexport function parseAutoCaptureSection(\n entries: ReadonlyMap<string, string>,\n): AutoCaptureConfig {\n const enabled = entries.has('enabled')\n ? entries.get('enabled') === 'true'\n : AUTO_CAPTURE_DEFAULTS.enabled;\n\n const dryRun = entries.has('dry_run')\n ? entries.get('dry_run') === 'true'\n : AUTO_CAPTURE_DEFAULTS.dryRun;\n\n const triggerRaw = entries.get('trigger_after_tool_calls');\n const triggerAfterToolCalls = triggerRaw\n ? parseInt(triggerRaw, 10) ||\n AUTO_CAPTURE_DEFAULTS.triggerAfterToolCalls\n : AUTO_CAPTURE_DEFAULTS.triggerAfterToolCalls;\n\n const intervalRaw = entries.get('min_interval_ms');\n const minIntervalMs = intervalRaw\n ? parseInt(intervalRaw, 10) || AUTO_CAPTURE_DEFAULTS.minIntervalMs\n : AUTO_CAPTURE_DEFAULTS.minIntervalMs;\n\n const capRaw = entries.get('max_captures_per_session');\n const maxCapturesPerSession = capRaw\n ? parseInt(capRaw, 10) ||\n AUTO_CAPTURE_DEFAULTS.maxCapturesPerSession\n : AUTO_CAPTURE_DEFAULTS.maxCapturesPerSession;\n\n return {\n enabled,\n triggerAfterToolCalls,\n minIntervalMs,\n maxCapturesPerSession,\n dryRun,\n };\n}\n", "import type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport {\n DEFAULT_ITEM_LIMIT,\n DEFAULT_INDEX_LIMIT,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_ITEM_TTL_MS,\n} from '../constants/daemon-defaults.constant.ts';\nimport { parseEmbeddingSection } from './parse-embedding-section.function.ts';\nimport { parseAutoCaptureSection } from './parse-auto-capture-section.function.ts';\n\ninterface RootAccum {\n itemLimit: number;\n indexLimit: number;\n timeoutMs: number;\n itemTtlMs: number;\n}\n\nfunction applyRootKey(\n acc: RootAccum,\n key: string,\n value: string,\n): void {\n switch (key) {\n case 'item_limit':\n acc.itemLimit = parseInt(value, 10) || DEFAULT_ITEM_LIMIT;\n break;\n case 'index_limit':\n acc.indexLimit = parseInt(value, 10) || DEFAULT_INDEX_LIMIT;\n break;\n case 'timeout_ms':\n acc.timeoutMs = parseInt(value, 10) || DEFAULT_TIMEOUT_MS;\n break;\n case 'item_ttl_ms':\n acc.itemTtlMs = parseInt(value, 10) || DEFAULT_ITEM_TTL_MS;\n break;\n default:\n break;\n }\n}\n\n/**\n * Parses a `worker.toml` file body into a partial `DaemonConfig`.\n *\n * Handles `[embedding]` sub-sections and root key-value pairs.\n * Unknown keys are silently ignored.\n *\n * @param text - raw content of `worker.toml`\n * @param contextPath - daemon context directory path\n */\nexport function parseWorkerToml(\n text: string,\n contextPath: string,\n): DaemonConfig {\n let section = '';\n const embeddingEntries = new Map<string, string>();\n const autoCaptureEntries = new Map<string, string>();\n const acc: RootAccum = {\n itemLimit: DEFAULT_ITEM_LIMIT,\n indexLimit: DEFAULT_INDEX_LIMIT,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n itemTtlMs: DEFAULT_ITEM_TTL_MS,\n };\n\n for (const line of text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed === '[embedding]') {\n section = 'embedding';\n continue;\n }\n if (trimmed === '[auto_capture]') {\n section = 'auto_capture';\n continue;\n }\n if (trimmed.startsWith('[')) {\n section = '';\n continue;\n }\n if (trimmed.startsWith('#') || !trimmed.includes('=')) continue;\n const eqIdx = trimmed.indexOf('=');\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n if (section === 'embedding') {\n embeddingEntries.set(key, value);\n continue;\n }\n if (section === 'auto_capture') {\n autoCaptureEntries.set(key, value);\n continue;\n }\n applyRootKey(acc, key, value);\n }\n\n const embedding = parseEmbeddingSection(embeddingEntries);\n const autoCapture =\n autoCaptureEntries.size > 0\n ? parseAutoCaptureSection(autoCaptureEntries)\n : undefined;\n return {\n contextPath,\n ...acc,\n ...(embedding !== undefined ? { embedding } : {}),\n ...(autoCapture !== undefined ? { autoCapture } : {}),\n };\n}\n", "import { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { readConfig } from './read-config.function.ts';\nimport { computeSha256 } from '../../hash/functions/compute-sha256.ts';\nimport { WorkerDaemon } from '../classes/worker-daemon.class.ts';\n\n/**\n * Starts the worker daemon for the given knowledge-base context.\n *\n * Reads configuration from `worker.toml` in the context directory,\n * validates startup preconditions (directory exists, accessible, and\n * database version compatible), and then starts the `WorkerDaemon`.\n *\n * Signal handlers for `SIGTERM` and `SIGINT` trigger a graceful stop.\n * Precondition failures are printed to stderr and cause exit code 1.\n *\n * @param contextPath - absolute path to the `.kbdb` context directory\n */\nexport async function startDaemon(\n contextPath: string,\n wasmDir?: string,\n): Promise<void> {\n const config = readConfig(contextPath);\n const hash = await computeSha256(contextPath);\n const contextId = hash.slice(0, 16);\n\n const daemon = new WorkerDaemon(\n contextId,\n contextPath,\n config,\n wasmDir,\n );\n\n try {\n daemon.checkPreconditions();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n try {\n await daemon.start();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n process.on('SIGTERM', () => {\n daemon.stop();\n });\n process.on('SIGINT', () => {\n daemon.stop();\n });\n}\n\nfunction writeCrashLog(contextId: string, message: string): void {\n try {\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n const payload = JSON.stringify({\n error: message,\n timestamp: Date.now(),\n });\n writeFileSync(crashPath, payload);\n } catch {\n // never mask the original error\n }\n}\n", "/**\n * Computes the SHA-256 hash of a UTF-8 string.\n *\n * Uses the Web Crypto API (`crypto.subtle`), which is available\n * in both Deno and Node.js >= 20 without additional imports.\n *\n * @param input - the string to hash\n * @returns lowercase hex-encoded SHA-256 digest (64 characters)\n */\nexport async function computeSha256(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(hash);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import {\n existsSync,\n readFileSync,\n readdirSync,\n accessSync,\n writeFileSync,\n unlinkSync,\n constants,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { Server } from 'node:net';\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport type { WasmModules } from '../typings/wasm-modules.interface.ts';\nimport type { EmbeddingProvider } from '../../embedding/typings/embedding-provider.interface.ts';\nimport type {\n IpcRequest,\n IpcResponse,\n IpcHandler,\n} from '../typings/ipc-handler.interface.ts';\nimport { DB_FORMAT_VERSION } from '../constants/daemon-defaults.constant.ts';\nimport { loadWasmModules } from '../functions/load-wasm-modules.function.ts';\nimport { createIpcServer } from '../functions/create-ipc-server.function.ts';\nimport { getIpcPath } from '../../platform/functions/get-ipc-path.function.ts';\nimport { createEmbeddingProvider } from '../../embedding/functions/create-embedding-provider.function.ts';\nimport { fuseSearchResults } from '../functions/handle-hybrid-search.function.ts';\nimport { rebuildVectors } from '../../embedding/functions/rebuild-vectors.function.ts';\nimport {\n encodeSearchParams,\n encodeAddSectionParams,\n encodeUpdateSectionParams,\n encodeKbidList,\n encodeGroupParams,\n encodeIdentifierList,\n encodeTypeFilterParam,\n encodeRecallParams,\n decodePagedSearchResult,\n decodeSectionRecords,\n decodeSectionRecordList,\n decodeDocumentManifest,\n decodeDocumentManifestList,\n decodeComposeOutput,\n decodeKeyValueText,\n decodeRemoveFlag,\n decodeRecallResult,\n decodeAddSectionResult,\n} from '../../wasm-codec/index.ts';\n\nimport type { AddSectionInput } from '../../wasm-codec/index.ts';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Callable WASM export function signature. */\ntype WasmFn = (...args: unknown[]) => unknown;\n\n/** Mapping from IPC method name to kb-worker.wasm export name. */\nconst WASM_METHOD_MAP: Readonly<Partial<Record<string, string>>> = {\n search: 'worker_search',\n addSection: 'worker_add_section',\n add_section: 'worker_add_section',\n updateSection: 'worker_update_section',\n update_section: 'worker_update_section',\n removeSection: 'worker_remove_section',\n remove_section: 'worker_remove_section',\n readSections: 'worker_read_sections',\n read_sections: 'worker_read_sections',\n groupSections: 'worker_group_sections',\n group_sections: 'worker_group_sections',\n removeGrouping: 'worker_remove_grouping',\n remove_grouping: 'worker_remove_grouping',\n retrieveDocument: 'worker_retrieve_doc',\n retrieve_doc: 'worker_retrieve_doc',\n content: 'worker_compose',\n compose: 'worker_compose',\n integrity_check: 'worker_check_integrity',\n integrityCheck: 'worker_check_integrity',\n gc: 'worker_garbage_collect',\n rebuild_indexes: 'worker_rebuild_indexes',\n rebuildIndexes: 'worker_rebuild_indexes',\n init_directory: 'worker_init_directory',\n initDirectory: 'worker_init_directory',\n migrateDatabase: 'worker_migrate',\n query: 'worker_query',\n get_result_status: 'worker_result_status',\n get_result: 'worker_get_result',\n invalidate: 'worker_invalidate',\n invalidate_all: 'worker_invalidate_all',\n invalidateAll: 'worker_invalidate_all',\n db_status: 'worker_status',\n dbStatus: 'worker_status',\n listByType: 'worker_list_by_type',\n list_by_type: 'worker_list_by_type',\n listDocumentsByType: 'worker_list_docs_by_type',\n list_docs_by_type: 'worker_list_docs_by_type',\n recall: 'worker_recall',\n export: 'worker_export',\n exportDb: 'worker_export',\n importDb: 'worker_import',\n import_db: 'worker_import',\n};\n\n/** Config method name prefix. */\nconst CONFIG_PREFIX = 'config_';\n\n/** Config key \u2192 DaemonConfig property mapping. */\nconst CONFIG_KEY_MAP: Readonly<\n Partial<Record<string, keyof DaemonConfig>>\n> = {\n timeout_ms: 'timeoutMs',\n item_ttl_ms: 'itemTtlMs',\n item_limit: 'itemLimit',\n index_limit: 'indexLimit',\n};\n\n// ---------------------------------------------------------------------------\n// IpcError\n// ---------------------------------------------------------------------------\n\n/** Typed JSON-RPC error used internally by WorkerDaemon dispatch. */\nclass IpcError extends Error {\n /** JSON-RPC error code. */\n readonly code: number;\n\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n this.name = 'IpcError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// WorkerDaemon\n// ---------------------------------------------------------------------------\n\n/**\n * Core daemon class that manages the full worker daemon lifecycle.\n *\n * Orchestrates WASM module loading, IPC server creation, request\n * routing to `kb-worker.wasm` exports, idle timeout tracking, and\n * graceful shutdown. The daemon validates startup preconditions before\n * loading WASM modules and rejects IPC requests whose `ctx` param does\n * not match the daemon's context ID.\n */\nexport class WorkerDaemon {\n /** Context ID (16-character hex SHA-256 prefix). */\n readonly ctx: string;\n\n /** Absolute path to the `.kbdb` directory. */\n readonly targetDir: string;\n\n /** Parsed daemon configuration from `worker.toml`. */\n readonly config: DaemonConfig;\n\n /** Number of currently active IPC client connections. */\n get connectionCount(): number {\n return this._connectionCount;\n }\n\n private _connectionCount = 0;\n private _wasmModules: WasmModules | null = null;\n private _embeddingProvider: EmbeddingProvider | null = null;\n private _idleAt = 0;\n private _idleTimer: ReturnType<typeof setTimeout> | null = null;\n private _server: Server | null = null;\n private readonly _wasmDir: string;\n\n /** Queue of waiters for the single-writer lock. */\n private _writeQueue: { resolve: () => void }[] = [];\n\n /** Whether the write lock is currently held. */\n private _writeLocked = false;\n\n /** Whether the startup integrity check passed. */\n private _integrityOk = true;\n\n /** Integrity errors found at startup, if any. */\n private _integrityErrors: string[] = [];\n\n /**\n * @param ctx - context ID (16-hex characters), the first 16 of\n * the SHA-256 hash of `targetDir`\n * @param targetDir - absolute path to the `.kbdb` directory\n * @param config - parsed daemon configuration\n * @param wasmDir - path to the WASM build output directory\n */\n constructor(\n ctx: string,\n targetDir: string,\n config: DaemonConfig,\n wasmDir?: string,\n ) {\n this.ctx = ctx;\n this.targetDir = targetDir;\n this.config = config;\n this._wasmDir = wasmDir ?? '';\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Validates startup preconditions before WASM module loading.\n *\n * Checks that the database directory exists, is readable and\n * writable, and that `catalog.toml` reports a compatible version.\n *\n * @throws {Error} if any precondition fails -- `startDaemon`\n * catches this, prints to stderr, and exits with code 1\n */\n checkPreconditions(): void {\n if (!existsSync(this.targetDir)) {\n throw new Error(\n `database directory not found: ${this.targetDir}`,\n );\n }\n\n try {\n accessSync(\n this.targetDir,\n\n constants.R_OK | constants.W_OK,\n );\n } catch {\n throw new Error(\n `cannot access database directory: ${this.targetDir}` +\n ' -- permission denied',\n );\n }\n\n this.checkCatalogVersion();\n }\n\n /**\n * Starts the daemon: loads WASM modules, writes the PID file,\n * creates the IPC socket, and begins listening for connections.\n *\n * Call `checkPreconditions()` before `start()` to validate the\n * database directory. The daemon will not start if any precondition\n * fails.\n *\n * @throws when WASM module loading fails or the IPC socket cannot\n * be created\n */\n async start(): Promise<void> {\n const wasmModules = await loadWasmModules(\n this.config,\n this._wasmDir,\n );\n this._wasmModules = wasmModules;\n this._embeddingProvider = createEmbeddingProvider(\n this.config.embedding,\n );\n\n this.initWorkerContext();\n this.runStartupIntegrityCheck();\n\n const ipcPath = getIpcPath(this.ctx);\n\n if (existsSync(ipcPath)) {\n try {\n unlinkSync(ipcPath);\n } catch {\n // ignore stale socket removal errors\n }\n }\n\n const handler: IpcHandler = (req) => this.handleRequest(req);\n this._server = await createIpcServer(ipcPath, handler);\n\n this._server.on('connection', () => {\n this.incrementConnections();\n this.resetIdleTimer();\n });\n\n this._server.on('close', () => {\n this.decrementConnections();\n if (this._connectionCount === 0) {\n this.resetIdleTimer();\n }\n });\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n writeFileSync(pidPath, process.pid.toString());\n\n this.resetIdleTimer();\n }\n\n /**\n * Gracefully shuts down the daemon.\n *\n * Stops accepting new connections, clears the idle timer, purges\n * WASM state, removes the PID file and IPC socket file, then exits\n * the process.\n */\n stop(): void {\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n this._idleTimer = null;\n }\n\n if (this._server !== null) {\n this._server.close();\n this._server = null;\n }\n\n this._wasmModules = null;\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n try {\n unlinkSync(pidPath);\n } catch {\n // ignore cleanup errors\n }\n\n const ipcPath = getIpcPath(this.ctx);\n try {\n unlinkSync(ipcPath);\n } catch {\n // ignore cleanup errors\n }\n\n const crashPath = join(tmpdir(), `kbdb-${this.ctx}.crash`);\n try {\n unlinkSync(crashPath);\n } catch {\n // ignore cleanup errors\n }\n\n process.exit(0);\n }\n\n /**\n * Handles a single JSON-RPC 2.0 request.\n *\n * Validates context, then routes to a daemon-state handler or a\n * WASM export. Requests whose `ctx` param does not match the\n * daemon's context ID are rejected with error code `-32001`.\n *\n * @param request - incoming JSON-RPC request\n * @returns the JSON-RPC response\n */\n async handleRequest(request: IpcRequest): Promise<IpcResponse> {\n const params = request.params as\n | Record<string, unknown>\n | undefined;\n if (params === undefined || params.ctx !== this.ctx) {\n return this.errorResponse(\n request.id,\n -32001,\n 'context mismatch',\n );\n }\n\n this.resetIdleTimer();\n\n try {\n const result = await this.dispatch(request.method, params);\n this._idleAt = Math.floor(Date.now() / 1000);\n return {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n } catch (err) {\n this._idleAt = Math.floor(Date.now() / 1000);\n if (err instanceof IpcError) {\n return this.errorResponse(\n request.id,\n err.code,\n err.message,\n );\n }\n const message =\n err instanceof Error ? err.message : String(err);\n return this.errorResponse(request.id, -32000, message);\n }\n }\n\n /**\n * Increments the active connection count.\n *\n * Call when a new IPC client connects.\n */\n incrementConnections(): void {\n this._connectionCount++;\n }\n\n /**\n * Decrements the active connection count, clamped to zero.\n *\n * Call when an IPC client disconnects.\n */\n decrementConnections(): void {\n if (this._connectionCount > 0) {\n this._connectionCount--;\n }\n }\n\n /**\n * Injects pre-built WASM modules for unit testing.\n *\n * This method exists solely to support unit tests that cannot\n * load real WASM binaries. It must not be called in production\n * code -- production code uses `start()` to load modules.\n *\n * @param modules - pre-built WASM module instances\n * @internal\n */\n injectModulesForTesting(modules: WasmModules): void {\n this._wasmModules = modules;\n }\n\n // -----------------------------------------------------------------------\n // Private helpers\n // -----------------------------------------------------------------------\n\n /** Resets the idle timer; triggers stop() when it fires. */\n private resetIdleTimer(): void {\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n }\n if (this._connectionCount === 0) {\n this._idleTimer = setTimeout(() => {\n this.stop();\n }, this.config.timeoutMs);\n }\n }\n\n /** Reads catalog.toml and validates the version field. */\n private checkCatalogVersion(): void {\n const catalogPath = join(this.targetDir, 'catalog.toml');\n let text: string;\n try {\n text = readFileSync(catalogPath, 'utf-8');\n } catch {\n throw new Error(\n `cannot read database directory: ${this.targetDir}` +\n ' -- permission denied',\n );\n }\n\n const version = parseCatalogVersion(text);\n if (version === null) {\n throw new Error(\n 'database version 0 requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon',\n );\n }\n\n if (version > DB_FORMAT_VERSION) {\n throw new Error(\n 'database version ' +\n String(version) +\n ' is newer than kbdb version ' +\n String(DB_FORMAT_VERSION) +\n ' -- upgrade kbdb to open this database',\n );\n }\n\n if (version < DB_FORMAT_VERSION) {\n throw new Error(\n 'database version ' +\n String(version) +\n ' requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon',\n );\n }\n }\n\n /** Builds a JSON-RPC error response. */\n private errorResponse(\n id: number | string,\n code: number,\n message: string,\n ): IpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code, message },\n };\n }\n\n /**\n * Dispatches a request method to the appropriate handler.\n *\n * Handles daemon-state methods (`status`, `idle_at`,\n * `config_{key}`) inline and routes WASM methods to the\n * correct calling convention for each export.\n */\n private dispatch(\n method: string,\n params: Record<string, unknown>,\n ): unknown {\n if (method === 'status') {\n return {\n status: this._connectionCount > 0 ? 'busy' : 'idle',\n integrityOk: this._integrityOk,\n integrityErrors: this._integrityErrors,\n };\n }\n\n if (method === 'idle_at') {\n return this._idleAt;\n }\n\n if (method === 'checkVersion') {\n return this.handleCheckVersion(params);\n }\n\n if (method.startsWith(CONFIG_PREFIX)) {\n return this.handleConfigMethod(method);\n }\n\n const wasmMethod = WASM_METHOD_MAP[method];\n if (wasmMethod !== undefined) {\n return this.dispatchWasm(method, wasmMethod, params);\n }\n\n throw new IpcError(-32601, `Method not found: ${method}`);\n }\n\n private async dispatchWasm(\n method: string,\n wasmExport: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n // Read-only operations \u2014 no write lock required.\n if (method === 'search' || method === 'query') {\n return this.handleSearch(params);\n }\n if (method === 'readSections' || method === 'read_sections') {\n return this.handleReadSections(params);\n }\n if (method === 'retrieveDocument' || method === 'retrieve_doc') {\n return this.handleRetrieveDoc(params);\n }\n if (method === 'content' || method === 'compose') {\n return this.handleCompose(params);\n }\n if (method === 'integrityCheck' || method === 'integrity_check') {\n return this.handleIntegrityCheck();\n }\n if (method === 'dbStatus' || method === 'db_status') {\n return this.handleDbStatus();\n }\n if (method === 'get_result_status') {\n return this.handleResultStatus(params);\n }\n if (method === 'get_result') {\n return this.handleGetResult(params);\n }\n if (method === 'listByType' || method === 'list_by_type') {\n return this.handleListByType(params);\n }\n if (\n method === 'listDocumentsByType' ||\n method === 'list_docs_by_type'\n ) {\n return this.handleListDocsByType(params);\n }\n if (method === 'recall') {\n return this.handleRecall(params);\n }\n if (method === 'export' || method === 'exportDb') {\n return this.handleExport(params);\n }\n\n // Write operations \u2014 serialised through the single-writer lock.\n await this.acquireWriteLock();\n try {\n if (method === 'invalidate') {\n return this.handleInvalidate(params);\n }\n if (\n method === 'invalidateAll' ||\n method === 'invalidate_all'\n ) {\n return this.handleInvalidateAll();\n }\n if (method === 'addSection' || method === 'add_section') {\n return this.handleAddSection(params);\n }\n if (\n method === 'updateSection' ||\n method === 'update_section'\n ) {\n return this.handleUpdateSection(params);\n }\n if (\n method === 'removeSection' ||\n method === 'remove_section'\n ) {\n return this.handleRemoveSection(params);\n }\n if (\n method === 'groupSections' ||\n method === 'group_sections'\n ) {\n return this.handleGroupSections(params);\n }\n if (\n method === 'removeGrouping' ||\n method === 'remove_grouping'\n ) {\n return this.handleRemoveGrouping(params);\n }\n if (method === 'gc') {\n return this.handleGc();\n }\n if (\n method === 'rebuildIndexes' ||\n method === 'rebuild_indexes'\n ) {\n return await this.handleRebuild();\n }\n if (\n method === 'initDirectory' ||\n method === 'init_directory'\n ) {\n return this.handleInitDirectory(params);\n }\n if (method === 'importDb' || method === 'import_db') {\n return await this.handleImport(params);\n }\n if (method === 'migrateDatabase') {\n throw new IpcError(\n -32601,\n 'migrateDatabase is not yet supported',\n );\n }\n return this.invokeWasmRaw(wasmExport, new Uint8Array(0));\n } finally {\n this.releaseWriteLock();\n }\n }\n\n // -- Search/query (token-based async) --\n\n private async handleSearch(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const query = (params['query'] as string | undefined) ?? '';\n const mode = (params['mode'] as string | undefined) ?? 'and';\n const limit = Number(params['limit'] ?? 20);\n const offset = Number(params['offset'] ?? 0);\n const algo = (params['algo'] as string | undefined) ?? 'lexical';\n const encoded = encodeSearchParams(query, mode, limit, offset);\n\n const start = Date.now();\n const lexical = this.runLexicalSearch(encoded);\n\n const fused = await fuseSearchResults(\n lexical,\n algo,\n query,\n this._embeddingProvider ?? undefined,\n this.targetDir,\n );\n return { ...fused, elapsed_ms: Date.now() - start };\n }\n\n private runLexicalSearch(encoded: Uint8Array) {\n const searchFn = this.getExport('worker_search');\n const ptr = this.wasmAlloc(encoded.length);\n this.wasmWrite(ptr, encoded);\n const token = searchFn(ptr, encoded.length) as number;\n this.wasmFree(ptr, encoded.length);\n\n const statusFn = this.getExport('worker_result_status');\n const status = statusFn(token) as number;\n if (status === 3) {\n this.getExport('worker_get_result')(token);\n const errBytes = this.readReturnSlot();\n throw new IpcError(-32000, new TextDecoder().decode(errBytes));\n }\n\n const getResultFn = this.getExport('worker_get_result');\n const rc = getResultFn(token) as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(-32000, new TextDecoder().decode(errBytes));\n }\n return decodePagedSearchResult(this.readReturnSlot());\n }\n\n // -- Token status/result (u32 direct params) --\n\n private handleResultStatus(\n params: Record<string, unknown>,\n ): unknown {\n const token = Number(params['token'] ?? 0);\n const fn = this.getExport('worker_result_status');\n const status = fn(token) as number;\n return { status };\n }\n\n private handleGetResult(params: Record<string, unknown>): unknown {\n const token = Number(params['token'] ?? 0);\n const fn = this.getExport('worker_get_result');\n const rc = fn(token) as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(-32000, new TextDecoder().decode(errBytes));\n }\n const bytes = this.readReturnSlot();\n return decodePagedSearchResult(bytes);\n }\n\n // -- Binary-encoded input methods --\n\n private handleAddSection(params: Record<string, unknown>): unknown {\n const sectionType = (params['sectionType'] ?? 'text') as string;\n const semanticType =\n sectionType === 'text' ||\n sectionType === 'code' ||\n sectionType === 'image'\n ? sectionType\n : 'text';\n const typeName =\n sectionType !== semanticType ? sectionType : null;\n const tags = Array.isArray(params['tags'])\n ? (params['tags'] as string[])\n : [];\n const input: AddSectionInput = {\n sectionType: semanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title: (params['title'] as string | null) ?? null,\n description: (params['description'] as string | null) ?? null,\n docid: (params['docid'] as string | null) ?? null,\n typeName,\n sourcePath:\n typeof params['sourcePath'] === 'string'\n ? params['sourcePath']\n : undefined,\n sourceMtime:\n typeof params['sourceMtime'] === 'string'\n ? params['sourceMtime']\n : undefined,\n tags,\n replace: params['replace'] === true,\n };\n const encoded = encodeAddSectionParams(input);\n const bytes = this.callWasmSync('worker_add_section', encoded);\n const decoded = decodeAddSectionResult(bytes);\n const wasmDups = decoded.nearDuplicates;\n const tsDups =\n wasmDups.length > 0\n ? []\n : this.scanNearDuplicates(input.content, decoded.kbid);\n const nearDups = (wasmDups.length > 0 ? wasmDups : tsDups).map(\n (d) => ({ ...d, method: 'jaccard' as const }),\n );\n return {\n kbid: decoded.kbid,\n indexed_terms_count: decoded.indexedTermsCount,\n elapsed_ms: decoded.elapsedMs,\n superseded: decoded.superseded,\n warnings: decoded.warnings,\n near_duplicates: nearDups,\n };\n }\n\n private handleUpdateSection(\n params: Record<string, unknown>,\n ): unknown {\n const oldKbid = (params['kbid'] as string | undefined) ?? '';\n const updSectionType = (params['sectionType'] ??\n 'text') as string;\n const updSemanticType =\n updSectionType === 'text' ||\n updSectionType === 'code' ||\n updSectionType === 'image'\n ? updSectionType\n : 'text';\n const updTypeName =\n updSectionType !== updSemanticType ? updSectionType : null;\n const input: AddSectionInput = {\n sectionType: updSemanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title: (params['title'] as string | null) ?? null,\n description: (params['description'] as string | null) ?? null,\n docid: (params['docid'] as string | null) ?? null,\n typeName: updTypeName,\n };\n const encoded = encodeUpdateSectionParams(oldKbid, input);\n const bytes = this.callWasmSync('worker_update_section', encoded);\n const newKbid = new TextDecoder().decode(bytes);\n return { kbid: newKbid };\n }\n\n private handleReadSections(\n params: Record<string, unknown>,\n ): unknown {\n const kbids = (params['kbids'] ?? []) as string[];\n const encoded = encodeKbidList(kbids);\n const bytes = this.callWasmSync('worker_read_sections', encoded);\n return decodeSectionRecords(bytes);\n }\n\n private handleGroupSections(\n params: Record<string, unknown>,\n ): unknown {\n const title = (params['title'] as string | undefined) ?? '';\n const kbids = (params['kbids'] ?? []) as string[];\n const docType = (params['docType'] as string | undefined) ?? '';\n const encoded = encodeGroupParams(title, kbids, docType);\n const bytes = this.callWasmSync('worker_group_sections', encoded);\n const docid = new TextDecoder().decode(bytes);\n return { docid };\n }\n\n private handleCompose(params: Record<string, unknown>): unknown {\n const ids = (params['ids'] ?? []) as string[];\n const encoded = encodeIdentifierList(ids);\n const bytes = this.callWasmSync('worker_compose', encoded);\n const output = decodeComposeOutput(bytes);\n return {\n data: output.markdown,\n total: Number(output.totalChars),\n };\n }\n\n // -- Raw UTF-8 string input methods --\n\n private handleRemoveSection(\n params: Record<string, unknown>,\n ): unknown {\n const kbid = (params['kbid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(kbid);\n const bytes = this.callWasmSync('worker_remove_section', encoded);\n return { removed: decodeRemoveFlag(bytes) };\n }\n\n private handleRetrieveDoc(params: Record<string, unknown>): unknown {\n const docid = (params['docid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(docid);\n const bytes = this.callWasmSync('worker_retrieve_doc', encoded);\n return decodeDocumentManifest(bytes);\n }\n\n private handleRemoveGrouping(\n params: Record<string, unknown>,\n ): unknown {\n const docid = (params['docid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(docid);\n this.callWasmSync('worker_remove_grouping', encoded);\n return { ok: true };\n }\n\n private handleInitDirectory(\n params: Record<string, unknown>,\n ): unknown {\n const path =\n (params['path'] as string | undefined) ?? this.targetDir;\n const encoded = new TextEncoder().encode(path);\n this.callWasmSync('worker_init_directory', encoded);\n return { ok: true };\n }\n\n private handleInvalidate(params: Record<string, unknown>): unknown {\n const kbid = (params['kbid'] as string | undefined) ?? '';\n const encoded = new TextEncoder().encode(kbid);\n const fn = this.getExport('worker_invalidate');\n const ptr = this.wasmAlloc(encoded.length);\n this.wasmWrite(ptr, encoded);\n const rc = fn(ptr, encoded.length) as number;\n this.wasmFree(ptr, encoded.length);\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n throw new IpcError(\n -32000,\n new TextDecoder().decode(errBytes) || 'invalidate failed',\n );\n }\n return { ok: true };\n }\n\n private handleListByType(params: Record<string, unknown>): unknown {\n const typeStr =\n (params['sectionType'] as string | undefined) ?? '';\n const encoded = encodeTypeFilterParam(typeStr);\n const bytes = this.callWasmSync('worker_list_by_type', encoded);\n return decodeSectionRecordList(bytes);\n }\n\n private handleListDocsByType(\n params: Record<string, unknown>,\n ): unknown {\n const typeStr = (params['docType'] as string | undefined) ?? '';\n const encoded = encodeTypeFilterParam(typeStr);\n const bytes = this.callWasmSync(\n 'worker_list_docs_by_type',\n encoded,\n );\n return decodeDocumentManifestList(bytes);\n }\n\n private handleRecall(params: Record<string, unknown>): unknown {\n const kbid =\n typeof params['kbid'] === 'string'\n ? params['kbid']\n : undefined;\n const kbids = Array.isArray(params['kbids'])\n ? (params['kbids'] as string[])\n : undefined;\n const depth = Number(params['depth'] ?? 0);\n const encoded = encodeRecallParams({ kbid, kbids, depth });\n const bytes = this.callWasmSync('worker_recall', encoded);\n return decodeRecallResult(bytes);\n }\n\n // -- Zero-arg methods --\n\n private handleInvalidateAll(): unknown {\n this.callWasmZeroArg('worker_invalidate_all');\n return { ok: true };\n }\n\n private handleDbStatus(): unknown {\n this.callWasmZeroArg('worker_status');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n const mem = this._wasmModules?.memory;\n if (mem) {\n kv['wasm_memory_bytes'] = String(mem.buffer.byteLength);\n }\n return kv;\n }\n\n private handleIntegrityCheck(): unknown {\n this.callWasmZeroArg('worker_check_integrity');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n return decodeKeyValueText(text);\n }\n\n private handleGc(): unknown {\n const start = Date.now();\n this.callWasmZeroArg('worker_garbage_collect');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n const removedCount = Number(kv['removed'] ?? 0);\n const staleSources = Number(kv['stale_sources'] ?? 0);\n return {\n removed_sections: removedCount,\n removed_bytes: 0,\n elapsed_ms: Date.now() - start,\n stale_sources: staleSources,\n };\n }\n\n private async handleRebuild(): Promise<unknown> {\n const fn = this.getExport('worker_rebuild_indexes');\n const rc = fn() as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || 'rebuild failed');\n }\n const resultBytes = this.readReturnSlot();\n const reindexed =\n resultBytes.length >= 4\n ? new DataView(\n resultBytes.buffer,\n resultBytes.byteOffset,\n resultBytes.byteLength,\n ).getUint32(0, true)\n : 0;\n\n let vectorsRebuilt = 0;\n if (this._embeddingProvider !== null) {\n vectorsRebuilt = await rebuildVectors(\n this.targetDir,\n this._embeddingProvider,\n );\n }\n\n return {\n ok: true,\n sections_reindexed: reindexed,\n vectors_rebuilt: vectorsRebuilt,\n };\n }\n\n // -- Export (read operation, no lock required) --\n\n private handleExport(params: Record<string, unknown>): unknown {\n const targetPath =\n (params['targetPath'] as string | undefined) ??\n (params['path'] as string | undefined) ??\n './kbdb-export/';\n const encoded = new TextEncoder().encode(targetPath);\n const start = Date.now();\n const bytes = this.callWasmSync('worker_export', encoded);\n const elapsed = Date.now() - start;\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n return {\n path: kv['path'] ?? targetPath,\n sections_exported: Number(kv['sections_exported'] ?? 0),\n documents_exported: Number(kv['documents_exported'] ?? 0),\n elapsed_ms: elapsed,\n };\n }\n\n private async handleImport(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const sourcePath =\n (params['sourcePath'] as string | undefined) ?? '';\n const dryRun = params['dryRun'] === true;\n const start = Date.now();\n\n const sectionCount = this.countFiles(\n join(sourcePath, 'sections'),\n '.section',\n );\n const documentCount = this.countFiles(\n join(sourcePath, 'documents'),\n '.toml',\n );\n\n let rebuilt = false;\n if (!dryRun && sectionCount > 0) {\n await this.handleRebuild();\n rebuilt = true;\n }\n\n return {\n sections_imported: sectionCount,\n documents_imported: documentCount,\n rebuilt,\n dry_run: dryRun,\n elapsed_ms: Date.now() - start,\n };\n }\n\n private countFiles(dir: string, ext: string): number {\n if (!existsSync(dir)) return 0;\n return this.collectFiles(dir, ext).length;\n }\n\n private collectFiles(dir: string, ext: string): string[] {\n const result: string[] = [];\n for (const entry of readdirSync(dir, {\n withFileTypes: true,\n })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n result.push(...this.collectFiles(full, ext));\n } else if (entry.name.endsWith(ext)) {\n result.push(full);\n }\n }\n return result;\n }\n\n // -- Near-duplicate detection --\n\n private scanNearDuplicates(\n content: string,\n newKbid: string,\n ): { kbid: string; similarity: number }[] {\n const newTerms = this.extractTermSet(content);\n if (newTerms.size === 0) return [];\n\n const sectionsDir = join(this.targetDir, 'sections');\n let shards: string[];\n try {\n shards = readdirSync(sectionsDir);\n } catch {\n return [];\n }\n\n const results: { kbid: string; similarity: number }[] = [];\n for (const shard of shards) {\n let files: string[];\n try {\n files = readdirSync(join(sectionsDir, shard));\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.endsWith('.section')) continue;\n const kbid = file.slice(0, -8);\n if (kbid === newKbid) continue;\n try {\n const data = readFileSync(\n join(sectionsDir, shard, file),\n 'utf-8',\n );\n const sep = data.indexOf('\\n---\\n');\n const body = sep >= 0 ? data.slice(sep + 5) : data;\n const existing = this.extractTermSet(body);\n let intersection = 0;\n for (const t of newTerms) {\n if (existing.has(t)) intersection++;\n }\n const union =\n newTerms.size + existing.size - intersection;\n const sim = union > 0 ? intersection / union : 0;\n if (sim >= 0.85) {\n results.push({\n kbid,\n similarity: Math.round(sim * 100) / 100,\n });\n }\n } catch {\n continue;\n }\n }\n }\n return results;\n }\n\n private extractTermSet(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .split(/\\W+/)\n .filter((w) => w.length > 2),\n );\n }\n\n // -- Single-writer lock --\n\n /**\n * Acquires the write lock.\n *\n * If the lock is free it is granted immediately. If it is held the\n * caller is queued and its promise resolves once the lock is\n * released by the current holder.\n */\n private acquireWriteLock(): Promise<void> {\n if (!this._writeLocked) {\n this._writeLocked = true;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this._writeQueue.push({ resolve });\n });\n }\n\n /**\n * Releases the write lock.\n *\n * If waiters are queued the next one is granted the lock\n * immediately. Otherwise the lock is marked free.\n */\n private releaseWriteLock(): void {\n const next = this._writeQueue.shift();\n if (next !== undefined) {\n next.resolve();\n } else {\n this._writeLocked = false;\n }\n }\n\n // -- WASM lifecycle --\n\n private initWorkerContext(): void {\n const pathBytes = new TextEncoder().encode('.');\n this.callWasmSync('worker_init', pathBytes);\n }\n\n /**\n * Runs a database integrity check immediately after context\n * initialisation.\n *\n * Stores the result in `_integrityOk` and `_integrityErrors`.\n * Logs a warning to stderr when issues are found so operators\n * are alerted without aborting the daemon.\n */\n private runStartupIntegrityCheck(): void {\n try {\n this.callWasmZeroArg('worker_check_integrity');\n const bytes = this.readReturnSlot();\n const text = new TextDecoder().decode(bytes);\n const kv = decodeKeyValueText(text);\n this._integrityOk = kv['ok'] === 'true';\n if (!this._integrityOk) {\n this._integrityErrors = Object.entries(kv)\n .filter(([k]) => k !== 'ok')\n .map(([k, v]) => `${k}=${v}`);\n // eslint-disable-next-line no-console\n console.error(\n '[kbdb-worker] startup integrity check failed:',\n this._integrityErrors.join(', '),\n );\n }\n } catch {\n this._integrityOk = false;\n this._integrityErrors = ['integrity_check_failed'];\n // eslint-disable-next-line no-console\n console.error(\n '[kbdb-worker] startup integrity check threw an error',\n );\n }\n }\n\n // -- WASM bridge primitives --\n\n private getExport(name: string): WasmFn {\n if (this._wasmModules === null) {\n throw new Error('WASM modules not loaded');\n }\n const fn = this._wasmModules.kbWorker.exports[name] as\n | WasmFn\n | undefined;\n if (typeof fn !== 'function') {\n throw new Error(`WASM export not found: ${name}`);\n }\n return fn;\n }\n\n private wasmAlloc(size: number): number {\n if (size === 0) return 0;\n const allocFn = this._wasmModules?.kbWorker.exports[\n 'kbdb_alloc'\n ] as WasmFn | undefined;\n if (typeof allocFn !== 'function') return 0;\n return allocFn(size) as number;\n }\n\n private wasmFree(ptr: number, size: number): void {\n if (ptr === 0 || size === 0) return;\n const freeFn = this._wasmModules?.kbWorker.exports[\n 'kbdb_free'\n ] as WasmFn | undefined;\n if (typeof freeFn === 'function') {\n freeFn(ptr, size);\n }\n }\n\n private wasmWrite(ptr: number, data: Uint8Array): void {\n if (data.length === 0) return;\n const memory = this._wasmModules?.memory;\n if (!memory) return;\n const memView = new Uint8Array(memory.buffer);\n if (ptr + data.length > memView.length) {\n throw new Error('WASM memory overflow');\n }\n memView.set(data, ptr);\n }\n\n private readReturnSlot(): Uint8Array {\n const getPtrFn = this._wasmModules?.kbWorker.exports[\n 'get_return_ptr'\n ] as WasmFn | undefined;\n const getLenFn = this._wasmModules?.kbWorker.exports[\n 'get_return_len'\n ] as WasmFn | undefined;\n if (\n typeof getPtrFn !== 'function' ||\n typeof getLenFn !== 'function'\n ) {\n return new Uint8Array(0);\n }\n const ptr = getPtrFn() as number;\n const len = getLenFn() as number;\n if (ptr === 0 || len === 0) {\n return new Uint8Array(0);\n }\n const memory = this._wasmModules?.memory;\n if (!memory) return new Uint8Array(0);\n const data = new Uint8Array(memory.buffer, ptr, len).slice();\n this.wasmFree(ptr, len);\n return data;\n }\n\n private callWasmSync(\n exportName: string,\n input: Uint8Array,\n ): Uint8Array {\n const fn = this.getExport(exportName);\n const ptr = this.wasmAlloc(input.length);\n this.wasmWrite(ptr, input);\n const rc = fn(ptr, input.length) as number;\n this.wasmFree(ptr, input.length);\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || exportName + ' failed');\n }\n return this.readReturnSlot();\n }\n\n private callWasmZeroArg(exportName: string): void {\n const fn = this.getExport(exportName);\n const rc = fn() as number;\n if (rc === -1) {\n const errBytes = this.readReturnSlot();\n const errMsg = new TextDecoder().decode(errBytes);\n throw new IpcError(-32000, errMsg || exportName + ' failed');\n }\n }\n\n private invokeWasmRaw(\n exportName: string,\n input: Uint8Array,\n ): unknown {\n return this.callWasmSync(exportName, input);\n }\n\n private handleCheckVersion(\n params: Record<string, unknown>,\n ): unknown {\n const targetPath =\n typeof params.targetPath === 'string'\n ? params.targetPath\n : this.targetDir;\n const catalogPath = join(targetPath, 'catalog.toml');\n let text: string;\n try {\n text = readFileSync(catalogPath, 'utf-8');\n } catch {\n return {\n status: 'needs_migration',\n currentVersion: 0,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n const version = parseCatalogVersion(text);\n if (version === null) {\n return {\n status: 'needs_migration',\n currentVersion: 0,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n if (version > DB_FORMAT_VERSION) {\n return {\n status: 'too_new',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n if (version < DB_FORMAT_VERSION) {\n return {\n status: 'needs_migration',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n return {\n status: 'compatible',\n currentVersion: version,\n requiredVersion: DB_FORMAT_VERSION,\n };\n }\n\n /** Returns a daemon config value by config method name. */\n private handleConfigMethod(method: string): unknown {\n const key = method.slice(CONFIG_PREFIX.length);\n const prop = CONFIG_KEY_MAP[key];\n if (prop === undefined) {\n throw new IpcError(-32601, `Method not found: ${method}`);\n }\n return this.config[prop];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Parses the `version` field from a minimal TOML string.\n *\n * Supports only `version = <integer>` syntax. Returns `null` if the\n * field is absent.\n */\nfunction parseCatalogVersion(text: string): number | null {\n for (const line of text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('#')) continue;\n const match = /^version\\s*=\\s*(\\d+)/.exec(trimmed);\n if (match?.[1] !== undefined) {\n return parseInt(match[1], 10);\n }\n }\n return null;\n}\n", "import { readFileSync } from 'node:fs';\n\nimport type { DaemonConfig } from '../typings/daemon-config.interface.ts';\nimport type { WasmModules } from '../typings/wasm-modules.interface.ts';\nimport { createHostImports } from './create-host-imports.function.ts';\nimport type {\n AllocatorRef,\n MemoryRef,\n} from './create-host-imports.function.ts';\nimport { isRemoteUrl, joinPath } from '../../dir-resolver/index.ts';\n\nexport async function loadWasmModules(\n config: DaemonConfig,\n wasmDir: string,\n): Promise<WasmModules> {\n const memoryRef: MemoryRef = { memory: null };\n const allocator: AllocatorRef = { alloc: null };\n\n const hostImports = createHostImports(\n config.contextPath,\n memoryRef,\n undefined,\n allocator,\n );\n\n const wkPath = joinPath(wasmDir, 'kb-worker', 'kbdb_worker_bg.wasm');\n const wkBytes = await readWasmFile(wkPath, 'kb-worker');\n\n let wkModule: WebAssembly.Module;\n try {\n wkModule = await WebAssembly.compile(wkBytes);\n } catch (err) {\n rethrow('compile', 'kb-worker', err);\n }\n\n let kbWorker: WebAssembly.Instance;\n try {\n kbWorker = await WebAssembly.instantiate(wkModule, {\n env: { ...hostImports },\n });\n } catch (err) {\n rethrow('instantiate', 'kb-worker', err);\n }\n\n const memory = kbWorker.exports['memory'] as WebAssembly.Memory;\n memoryRef.memory = memory;\n\n allocator.alloc = (size: number): number => {\n const fn_ = kbWorker.exports['kbdb_alloc'] as\n | ((s: number) => number)\n | undefined;\n if (typeof fn_ !== 'function') return 0;\n return fn_(size);\n };\n\n return { memory, kbWorker };\n}\n\nasync function readWasmFile(\n path: string,\n label: string,\n): Promise<ArrayBuffer> {\n try {\n if (isRemoteUrl(path)) {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(\n `HTTP ${String(response.status)} ${response.statusText}`,\n );\n }\n return await response.arrayBuffer();\n }\n const buf = readFileSync(path);\n return buf.buffer.slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n );\n } catch (err) {\n rethrow('load', label, err, path);\n }\n}\n\nfunction rethrow(\n stage: string,\n label: string,\n err: unknown,\n path?: string,\n): never {\n const detail = err instanceof Error ? err.message : String(err);\n const suffix = path ? ` (path: ${path})` : '';\n const message = `failed to ${stage} ${label} WASM: ${detail}${suffix}`;\n // eslint-disable-next-line no-console\n console.error(`kbdb-worker: ${message}`);\n throw new Error(message, { cause: err });\n}\n", "import {\n readFileSync,\n writeFileSync,\n renameSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\n// ---------------------------------------------------------------------------\n// FsAdapter interface (enables dependency injection for testing)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal filesystem operations required by the host imports.\n *\n * The default implementation delegates to `node:fs` synchronous\n * APIs. Tests inject a stub to avoid touching the real filesystem.\n */\nexport interface FsAdapter {\n /** Read entire file as a Buffer. */\n readFileSync(path: string): Buffer;\n /** Write data buffer to file. */\n writeFileSync(path: string, data: Uint8Array): void;\n /** Rename `oldPath` to `newPath`. */\n renameSync(oldPath: string, newPath: string): void;\n /** Delete a file. */\n unlinkSync(path: string): void;\n /** List directory entries as strings. */\n readdirSync(path: string): string[];\n /** Create a directory (and parents) recursively. */\n mkdirSync(path: string): void;\n /** Return true if the path exists. */\n existsSync(path: string): boolean;\n}\n\n// ---------------------------------------------------------------------------\n// MemoryRef interface\n// ---------------------------------------------------------------------------\n\n/**\n * A mutable reference to the WASM linear memory.\n *\n * The `memory` field starts as `null` and is wired up after the\n * `kb-worker` WASM module is instantiated (the module exports its\n * own memory rather than importing one). Host import functions\n * read `memory` at call time, not at creation time, so the ref\n * can be populated after the import record is built.\n */\nexport interface MemoryRef {\n memory: WebAssembly.Memory | null;\n}\n\n// ---------------------------------------------------------------------------\n// AllocatorRef interface\n// ---------------------------------------------------------------------------\n\n/**\n * A mutable reference to the WASM allocator function.\n *\n * The `alloc` field starts as `null` and is wired up after the\n * `kb-worker` WASM module is instantiated. Host import functions\n * that must allocate memory in WASM linear memory check this\n * reference before proceeding and return -1 when it is null.\n */\nexport interface AllocatorRef {\n /**\n * Allocates `size` bytes in WASM linear memory and returns the\n * byte offset of the allocated region, or `null` when the\n * allocator is not yet available.\n */\n alloc: ((size: number) => number) | null;\n}\n\n/** Default `FsAdapter` backed by `node:fs` synchronous APIs. */\nconst nodeFsAdapter: FsAdapter = {\n readFileSync: (p) => readFileSync(p),\n writeFileSync: (p, d) => {\n writeFileSync(p, d);\n },\n renameSync: (o, n) => {\n renameSync(o, n);\n },\n unlinkSync: (p) => {\n unlinkSync(p);\n },\n readdirSync: (p) => readdirSync(p),\n mkdirSync: (p) => {\n mkdirSync(p, { recursive: true });\n },\n existsSync: (p) => existsSync(p),\n};\n\n/** Default `MemoryRef` with no memory wired. */\nconst nullMemory: MemoryRef = { memory: null };\n\n/** Default `AllocatorRef` with no allocator wired. */\nconst nullAllocator: AllocatorRef = { alloc: null };\n\n// ---------------------------------------------------------------------------\n// createHostImports\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the host I/O import functions required by `kb-worker.wasm`.\n *\n * All functions read the WASM linear memory through `memoryRef`,\n * a deferred reference wired up after module instantiation (the\n * module exports its own memory). Paths from WASM are resolved\n * relative to `contextPath`.\n *\n * @param contextPath - absolute path to the `.kbdb` database directory\n * @param memoryRef - deferred reference to the WASM module's\n * exported memory; wired after instantiation\n * @param fs - filesystem adapter; defaults to real `node:fs` operations\n * @param allocator - reference to the WASM allocator; wired after\n * `kb-worker` instantiation. Defaults to a null (uninitialized) ref.\n * @returns a record of host import functions keyed by their WASM import\n * names\n */\nexport function createHostImports(\n contextPath: string,\n memoryRef: MemoryRef = nullMemory,\n fs: FsAdapter = nodeFsAdapter,\n allocator: AllocatorRef = nullAllocator,\n): Record<string, WebAssembly.ImportValue> {\n function getBuffer(): ArrayBuffer {\n if (!memoryRef.memory) {\n throw new Error('WASM memory not initialized');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return memoryRef.memory.buffer as ArrayBuffer;\n }\n\n function readPathArg(ptr: number, len: number): string {\n const bytes = new Uint8Array(getBuffer(), ptr, len);\n const decoded = new TextDecoder().decode(bytes);\n if (decoded.startsWith('/')) return decoded;\n return join(contextPath, decoded);\n }\n\n return {\n /**\n * Reads a file at the path encoded in shared memory and writes\n * the result back via the out-pointer protocol.\n *\n * `outPtr` and `outLen` are WASM linear-memory addresses. On\n * success, the host allocates a buffer via `allocator.alloc`,\n * copies the file data there, and writes the allocated pointer\n * as a LE u32 to `outPtr` and the data length as a LE u32 to\n * `outLen`. Returns 0 on success, -1 on error or when the\n * allocator is not yet available.\n */\n host_read_file(\n pathPtr: number,\n pathLen: number,\n outPtr: number,\n outLen: number,\n ): number {\n try {\n if (!allocator.alloc) return -1;\n const filePath = readPathArg(pathPtr, pathLen);\n const data = fs.readFileSync(filePath);\n const dataLen = data.byteLength;\n if (dataLen === 0) {\n // No allocation -- buffer cannot have grown; safe to\n // create DataView now.\n const dv = new DataView(getBuffer());\n dv.setUint32(outPtr, 0, true);\n dv.setUint32(outLen, 0, true);\n return 0;\n }\n const dataPtr = allocator.alloc(dataLen);\n if (dataPtr === 0) return -1;\n // Create DataView AFTER alloc() -- alloc may trigger WASM\n // memory growth, which detaches the old ArrayBuffer and\n // replaces it with a new one. A DataView captured before\n // growth would reference the detached buffer and throw.\n const dv = new DataView(getBuffer());\n const memView = new Uint8Array(getBuffer());\n memView.set(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ),\n dataPtr,\n );\n dv.setUint32(outPtr, dataPtr, true);\n dv.setUint32(outLen, dataLen, true);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Writes bytes from shared memory (`dataPtr`, `dataLen`) to the\n * file at the path encoded in shared memory. Returns 0 on\n * success, -1 on error.\n */\n host_write_file(\n pathPtr: number,\n pathLen: number,\n dataPtr: number,\n dataLen: number,\n ): number {\n try {\n const filePath = readPathArg(pathPtr, pathLen);\n const data = new Uint8Array(getBuffer(), dataPtr, dataLen);\n fs.writeFileSync(filePath, data);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Renames the file at `oldPtr/oldLen` to `newPtr/newLen`.\n * Both paths are resolved relative to `contextPath`. Returns 0\n * on success, -1 on error.\n */\n host_rename(\n oldPtr: number,\n oldLen: number,\n newPtr: number,\n newLen: number,\n ): number {\n try {\n const oldPath = readPathArg(oldPtr, oldLen);\n const newPath = readPathArg(newPtr, newLen);\n fs.renameSync(oldPath, newPath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Deletes the file at the path encoded in shared memory.\n * Returns 0 on success, -1 on error.\n */\n host_remove_file(pathPtr: number, pathLen: number): number {\n try {\n const filePath = readPathArg(pathPtr, pathLen);\n fs.unlinkSync(filePath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Lists the directory at the path encoded in shared memory and\n * writes the result back via the out-pointer protocol.\n *\n * `outPtr` and `outLen` are WASM linear-memory addresses. On\n * success, the host allocates a buffer via `allocator.alloc`,\n * copies a newline-delimited UTF-8 listing there, and writes\n * the allocated pointer as a LE u32 to `outPtr` and the byte\n * length as a LE u32 to `outLen`. Returns 0 on success, -1 on\n * error or when the allocator is not yet available.\n */\n host_list_dir(\n pathPtr: number,\n pathLen: number,\n outPtr: number,\n outLen: number,\n ): number {\n try {\n if (!allocator.alloc) return -1;\n const dirPath = readPathArg(pathPtr, pathLen);\n const entries = fs.readdirSync(dirPath);\n const text = entries.join('\\n');\n const encoded = new TextEncoder().encode(text);\n if (encoded.length === 0) {\n // No allocation -- buffer cannot have grown; safe to\n // create DataView now.\n const dv = new DataView(getBuffer());\n dv.setUint32(outPtr, 0, true);\n dv.setUint32(outLen, 0, true);\n return 0;\n }\n const dataPtr = allocator.alloc(encoded.length);\n if (dataPtr === 0) return -1;\n // Create DataView AFTER alloc() -- alloc may trigger WASM\n // memory growth, which detaches the old ArrayBuffer and\n // replaces it with a new one. A DataView captured before\n // growth would reference the detached buffer and throw.\n const dv = new DataView(getBuffer());\n new Uint8Array(getBuffer(), dataPtr, encoded.length).set(\n encoded,\n );\n dv.setUint32(outPtr, dataPtr, true);\n dv.setUint32(outLen, encoded.length, true);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Creates the directory at the path encoded in shared memory,\n * including any missing parent directories (recursive). Returns\n * 0 on success, -1 on error.\n */\n host_mkdir(pathPtr: number, pathLen: number): number {\n try {\n const dirPath = readPathArg(pathPtr, pathLen);\n fs.mkdirSync(dirPath);\n return 0;\n } catch {\n return -1;\n }\n },\n\n /**\n * Checks whether the file at the path encoded in shared memory\n * exists. Returns 1 if it exists, 0 if it does not.\n */\n host_file_exists(pathPtr: number, pathLen: number): number {\n const filePath = readPathArg(pathPtr, pathLen);\n return fs.existsSync(filePath) ? 1 : 0;\n },\n };\n}\n", "import { createServer } from 'node:net';\nimport type { Server, Socket } from 'node:net';\nimport type {\n IpcHandler,\n IpcRequest,\n IpcResponse,\n} from '../typings/ipc-handler.interface.ts';\n\n/** Socket backlog size for handling connection bursts. */\nconst LISTEN_BACKLOG = 256;\n\n/** SO_KEEPALIVE interval in milliseconds. */\nconst KEEPALIVE_MS = 30_000;\n\n/**\n * Creates a Unix socket (or named pipe on Windows) IPC\n * server that reads newline-delimited JSON-RPC requests\n * and writes responses.\n *\n * Resolves after the server is bound and listening.\n * Accepted connections have `SO_KEEPALIVE` enabled at\n * a 30-second interval.\n *\n * @param socketPath - path to the Unix domain socket or\n * Windows named pipe\n * @param handler - async function invoked for each valid\n * request\n * @returns the listening `net.Server` instance\n */\nexport function createIpcServer(\n socketPath: string,\n handler: IpcHandler,\n): Promise<Server> {\n const server = createServer((socket) => {\n socket.setKeepAlive(true, KEEPALIVE_MS);\n\n let buffer = '';\n let processingQueue = Promise.resolve();\n\n socket.on('data', (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n processingQueue = processingQueue.then(() =>\n handleLine(line, handler, socket),\n );\n }\n });\n\n socket.on('error', (err: Error) => {\n // eslint-disable-next-line no-console\n console.error(\n `kbdb-worker: ipc connection error:` + ` ${err.message}`,\n );\n });\n });\n\n return new Promise<Server>((resolve, reject) => {\n server.once('error', reject);\n server.listen(\n { path: socketPath, backlog: LISTEN_BACKLOG },\n () => {\n server.removeListener('error', reject);\n server.on('error', (err: Error) => {\n // eslint-disable-next-line no-console\n console.error(\n `kbdb-worker: ipc server error:` + ` ${err.message}`,\n );\n });\n resolve(server);\n },\n );\n });\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? Number(value) : value;\n}\n\nasync function handleLine(\n line: string,\n handler: IpcHandler,\n socket: Socket,\n): Promise<void> {\n let response: IpcResponse;\n try {\n const request = JSON.parse(line) as IpcRequest;\n response = await handler(request);\n } catch {\n response = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n }\n socket.write(JSON.stringify(response, bigintReplacer) + '\\n');\n}\n", "import { join } from 'node:path';\nimport { getTmpdir } from './get-tmpdir.function.ts';\n\n/**\n * Returns the platform-appropriate IPC socket path for a given\n * context identifier.\n *\n * On Windows, returns a named pipe path (`\\\\.\\pipe\\kbdb-<ctx>`).\n * On POSIX systems, returns a Unix domain socket path under the\n * system temp directory (`<tmpdir>/kbdb-<ctx>.sock`).\n *\n * @param ctx - unique context identifier embedded in the path\n */\nexport function getIpcPath(ctx: string): string {\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\kbdb-${ctx}`;\n }\n return join(getTmpdir(), `kbdb-${ctx}.sock`);\n}\n", "import { tmpdir } from 'node:os';\n\n/**\n * Returns the operating system's default temporary directory path.\n */\nexport function getTmpdir(): string {\n return tmpdir();\n}\n", "import type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\n\n/**\n * No-op embedding provider used when embeddings are not configured.\n *\n * Satisfies the `EmbeddingProvider` contract without performing any\n * computation. Use this as the default when no provider is selected\n * in the config.\n */\nexport class NullEmbeddingProvider implements EmbeddingProvider {\n /**\n * Returns an empty `Float32Array` for each input text.\n *\n * @param texts - input strings (contents are ignored)\n */\n embed(texts: string[]): Promise<Float32Array[]> {\n return Promise.resolve(texts.map(() => new Float32Array(0)));\n }\n\n /** Always returns 0 -- no dimensions when disabled. */\n dimensions(): number {\n return 0;\n }\n\n /** Always returns `'none'`. */\n modelName(): string {\n return 'none';\n }\n}\n", "import type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\n\n/**\n * ONNX Runtime embedding provider.\n *\n * Satisfies the `EmbeddingProvider` contract with the correct\n * structure but defers actual inference to Phase 3+. Calling\n * `embed()` throws until `onnxruntime-node` is available and\n * wired in.\n *\n * @throws {Error} on `embed()` when ONNX Runtime is not available\n */\nexport class OnnxEmbeddingProvider implements EmbeddingProvider {\n /** Path to the ONNX model file. */\n private readonly model: string;\n\n /** Number of embedding dimensions the model produces. */\n private readonly dims: number;\n\n /**\n * @param model - filesystem path to the ONNX model file\n * @param dimensions - number of dimensions the model produces\n */\n constructor(model: string, dimensions: number) {\n this.model = model;\n this.dims = dimensions;\n }\n\n /**\n * Not yet implemented.\n *\n * @throws {Error} always -- ONNX Runtime is an optional peer\n * dependency not yet wired\n */\n embed(_texts: string[]): Promise<Float32Array[]> {\n return Promise.reject(\n new Error(\n 'ONNX Runtime not available; install onnxruntime-node',\n ),\n );\n }\n\n /** Returns the configured number of embedding dimensions. */\n dimensions(): number {\n return this.dims;\n }\n\n /** Returns the configured model file path. */\n modelName(): string {\n return this.model;\n }\n}\n", "/** Expected shape of a single entry in the API response data array. */\ninterface EmbeddingEntry {\n readonly embedding: number[];\n}\n\n/** Expected shape of the OpenAI-compatible embeddings API response. */\ninterface EmbeddingApiResponse {\n readonly data: EmbeddingEntry[];\n}\n\n/**\n * Validates and parses an OpenAI-compatible embedding API response.\n *\n * Narrows `unknown` to the expected response shape and converts\n * each `embedding` array to a `Float32Array`.\n *\n * @param raw - the parsed JSON body from the embedding API\n * @throws {Error} when the response does not match the expected\n * `{ data: [{ embedding: number[] }] }` shape\n */\nexport function parseApiEmbeddingResponse(\n raw: unknown,\n): Float32Array[] {\n if (!isEmbeddingApiResponse(raw)) {\n throw new Error('Unexpected embedding API response shape');\n }\n return raw.data.map((entry) => new Float32Array(entry.embedding));\n}\n\n/** Type guard for the expected API response shape. */\nfunction isEmbeddingApiResponse(\n value: unknown,\n): value is EmbeddingApiResponse {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n if (!Array.isArray(candidate['data'])) {\n return false;\n }\n return (candidate['data'] as unknown[]).every(isEmbeddingEntry);\n}\n\n/** Type guard for a single embedding entry. */\nfunction isEmbeddingEntry(value: unknown): value is EmbeddingEntry {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return Array.isArray(candidate['embedding']);\n}\n", "import type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport { parseApiEmbeddingResponse } from '../functions/parse-api-embedding-response.function.ts';\n\n/**\n * HTTP API embedding provider compatible with the OpenAI\n * embeddings API format.\n *\n * Sends texts to a remote endpoint and maps the response\n * `data[].embedding` arrays to `Float32Array[]`.\n */\nexport class ApiEmbeddingProvider implements EmbeddingProvider {\n /** Remote endpoint URL for embedding requests. */\n private readonly endpoint: string;\n\n /** Number of dimensions in the returned vectors. */\n private readonly dims: number;\n\n /** Model name sent in the request body. */\n private readonly model: string;\n\n /**\n * @param endpoint - URL to POST embedding requests to\n * @param dimensions - number of vector dimensions expected\n * @param model - optional model name; defaults to `'api'`\n */\n constructor(endpoint: string, dimensions: number, model?: string) {\n this.endpoint = endpoint;\n this.dims = dimensions;\n this.model = model ?? 'api';\n }\n\n /**\n * Posts texts to the endpoint and returns one `Float32Array`\n * per input.\n *\n * @throws {Error} when the HTTP response status is not 2xx\n */\n async embed(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ input: texts, model: this.model }),\n });\n if (!response.ok) {\n throw new Error(\n `Embedding API error: ${String(response.status)}`,\n );\n }\n const json: unknown = await response.json();\n return parseApiEmbeddingResponse(json);\n }\n\n /** Returns the configured number of embedding dimensions. */\n dimensions(): number {\n return this.dims;\n }\n\n /** Returns the configured model name, defaulting to `'api'`. */\n modelName(): string {\n return this.model;\n }\n}\n", "import type { EmbeddingConfig } from '../typings/embedding-config.interface.ts';\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport { NullEmbeddingProvider } from '../classes/null-embedding-provider.class.ts';\nimport { OnnxEmbeddingProvider } from '../classes/onnx-embedding-provider.class.ts';\nimport { ApiEmbeddingProvider } from '../classes/api-embedding-provider.class.ts';\n\n/**\n * Creates an embedding provider from the given configuration.\n *\n * - `'none'` or missing config \u2192 `NullEmbeddingProvider`\n * - `'onnx'` \u2192 `OnnxEmbeddingProvider`\n * - `'api'` \u2192 `ApiEmbeddingProvider`\n *\n * @param config - embedding configuration from `worker.toml`\n */\nexport function createEmbeddingProvider(\n config: EmbeddingConfig | undefined,\n): EmbeddingProvider {\n if (!config || config.provider === 'none') {\n return new NullEmbeddingProvider();\n }\n if (config.provider === 'onnx') {\n return new OnnxEmbeddingProvider(\n config.model ?? '',\n config.dimensions ?? 0,\n );\n }\n return new ApiEmbeddingProvider(\n config.endpoint ?? '',\n config.dimensions ?? 0,\n config.model,\n );\n}\n", "import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { EmbeddingProvider } from '../../embedding/typings/embedding-provider.interface.ts';\nimport { searchVectors } from '../../embedding/functions/search-vectors.function.ts';\nimport { rrfFuse } from '../../embedding/functions/rrf-fuse.function.ts';\nimport { IpcError } from '../classes/ipc-error.class.ts';\n\n/** Lexical search result from WASM decoder. */\ninterface LexicalResult {\n items: LexicalItem[];\n total: number;\n offset: number;\n limit: number;\n has_more: boolean;\n relaxed: boolean;\n}\n\n/** A single item from the lexical search result. */\ninterface LexicalItem {\n kbid: string;\n heading: string | null;\n type: string;\n docids: string[];\n score: number;\n confidence: number;\n snippet: string;\n matched_terms: string[];\n matched_fields: string[];\n created_at: string;\n}\n\n/** Search result with search_mode and retrieval_method. */\ninterface FusedSearchResult extends LexicalResult {\n search_mode: string;\n retrieval_method: string;\n}\n\n/**\n * Fuses lexical search results with vector search results.\n *\n * When `algo` is `'lexical'`, returns the lexical result as-is.\n * When `algo` is `'hybrid'`, runs vector search against\n * `vectors.idx` and fuses via RRF. When `algo` is `'vector'`,\n * returns vector-only results.\n *\n * @param lexical - decoded lexical result from WASM\n * @param algo - search algorithm: lexical, hybrid, or vector\n * @param query - the original search query text\n * @param provider - embedding provider (undefined = disabled)\n * @param targetDir - path to the `.kbdb` directory\n */\nexport async function fuseSearchResults(\n lexical: LexicalResult,\n algo: string,\n query: string,\n provider: EmbeddingProvider | undefined,\n targetDir: string,\n): Promise<FusedSearchResult> {\n if (algo === 'lexical') {\n return {\n ...lexical,\n search_mode: 'lexical',\n retrieval_method: 'lexical',\n };\n }\n\n assertProvider(provider);\n\n const embeddings = await provider.embed([query]);\n if (embeddings.length === 0 || embeddings[0].length === 0) {\n return {\n ...lexical,\n search_mode: algo,\n retrieval_method: 'lexical',\n };\n }\n const queryVec = embeddings[0];\n\n const vectorPath = join(targetDir, 'vectors.idx');\n const vectorResults = existsSync(vectorPath)\n ? searchVectors(vectorPath, queryVec, lexical.limit)\n : [];\n\n if (algo === 'vector') {\n return buildVectorOnly(vectorResults, lexical);\n }\n\n return buildHybrid(lexical, vectorResults);\n}\n\nfunction assertProvider(\n provider: EmbeddingProvider | undefined,\n): asserts provider is EmbeddingProvider {\n if (!provider || provider.dimensions() === 0) {\n throw new IpcError(\n -32000,\n 'embedding provider not configured; ' +\n 'set [embedding] in worker.toml',\n );\n }\n}\n\nfunction buildVectorOnly(\n vectorResults: { kbid: string; score: number }[],\n lexical: LexicalResult,\n): FusedSearchResult {\n const lookup = new Map(\n lexical.items.map((item) => [item.kbid, item]),\n );\n const items: LexicalItem[] = vectorResults.map((vr) => {\n const existing = lookup.get(vr.kbid);\n if (existing) {\n return { ...existing, score: vr.score };\n }\n return emptyItem(vr.kbid, vr.score);\n });\n return {\n items,\n total: items.length,\n offset: lexical.offset,\n limit: lexical.limit,\n has_more: false,\n relaxed: lexical.relaxed,\n search_mode: 'vector',\n retrieval_method: 'vector',\n };\n}\n\nfunction buildHybrid(\n lexical: LexicalResult,\n vectorResults: { kbid: string; score: number }[],\n): FusedSearchResult {\n const lexRanks = new Map<string, number>();\n lexical.items.forEach((item, i) => {\n lexRanks.set(item.kbid, i + 1);\n });\n\n const vecRanks = new Map<string, number>();\n vectorResults.forEach((vr, i) => {\n vecRanks.set(vr.kbid, i + 1);\n });\n\n const fused = rrfFuse(lexRanks, vecRanks);\n const sorted = [...fused.entries()].sort((a, b) => b[1] - a[1]);\n\n const lookup = new Map(\n lexical.items.map((item) => [item.kbid, item]),\n );\n const items: LexicalItem[] = sorted\n .slice(0, lexical.limit)\n .map(([kbid, score]) => {\n const existing = lookup.get(kbid);\n if (existing) {\n return { ...existing, score };\n }\n return emptyItem(kbid, score);\n });\n\n return {\n items,\n total: sorted.length,\n offset: lexical.offset,\n limit: lexical.limit,\n has_more: sorted.length > lexical.limit,\n relaxed: lexical.relaxed,\n search_mode: 'hybrid',\n retrieval_method: 'rrf',\n };\n}\n\nfunction emptyItem(kbid: string, score: number): LexicalItem {\n return {\n kbid,\n heading: null,\n type: '',\n docids: [],\n score,\n confidence: 0,\n snippet: '',\n matched_terms: [],\n matched_fields: [],\n created_at: '',\n };\n}\n", "import { readFileSync } from 'node:fs';\nimport type { VectorSearchResult } from '../typings/vector-search-result.model.ts';\nimport { cosineSimilarity } from './cosine-similarity.function.ts';\n\n/** Fixed header size in bytes. */\nconst HEADER_SIZE = 32;\n\n/** Fixed width in bytes for the stored kbid string. */\nconst KBID_WIDTH = 64;\n\n/**\n * Brute-force linear scan of a `vectors.idx` file.\n *\n * Reads every stored vector, computes cosine similarity against\n * `queryVector`, then returns the top `topN` results sorted by\n * score descending.\n *\n * @param filePath - absolute path to the `vectors.idx` file\n * @param queryVector - embedding to search against\n * @param topN - maximum number of results to return\n * @returns results sorted by descending cosine similarity score\n */\nexport function searchVectors(\n filePath: string,\n queryVector: Float32Array,\n topN: number,\n): VectorSearchResult[] {\n const buf = readFileSync(filePath);\n\n if (buf.length < HEADER_SIZE) {\n return [];\n }\n\n const dimensions = buf.readUInt32LE(8);\n const count = buf.readUInt32LE(12);\n const modelLen = buf.readUInt32LE(16);\n const dataStart = HEADER_SIZE + modelLen;\n const recordSize = KBID_WIDTH + dimensions * 4;\n\n const results: VectorSearchResult[] = [];\n\n for (let i = 0; i < count; i++) {\n const recOffset = dataStart + i * recordSize;\n const kbid = buf\n .toString('utf-8', recOffset, recOffset + KBID_WIDTH)\n .replace(/\\0/g, '');\n\n const vector = new Float32Array(dimensions);\n for (let d = 0; d < dimensions; d++) {\n vector[d] = buf.readFloatLE(recOffset + KBID_WIDTH + d * 4);\n }\n\n const score = cosineSimilarity(queryVector, vector);\n results.push({ kbid, score });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topN);\n}\n", "/**\n * Computes cosine similarity between two vectors.\n *\n * Returns `dot(a, b) / (||a|| * ||b||)`. Returns `0` when either\n * vector has zero magnitude to avoid division by zero.\n *\n * @param a - first embedding vector\n * @param b - second embedding vector\n */\nexport function cosineSimilarity(\n a: Float32Array,\n b: Float32Array,\n): number {\n let dot = 0;\n let magA = 0;\n let magB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const ai = a[i] ?? 0;\n const bi = b[i] ?? 0;\n dot += ai * bi;\n magA += ai * ai;\n magB += bi * bi;\n }\n\n if (magA === 0 || magB === 0) {\n return 0;\n }\n\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n", "/** Default RRF smoothing constant. */\nconst DEFAULT_K = 60;\n\n/**\n * Fuses lexical and vector rankings using Reciprocal Rank Fusion.\n *\n * For each kbid in either map the fused score is:\n * `1/(k + lexicalRank) + 1/(k + vectorRank)`.\n * When a kbid appears in only one map the missing rank contributes\n * `0` (treated as infinite rank -- no contribution).\n *\n * @param lexicalRanks - map of kbid to 1-based lexical rank position\n * @param vectorRanks - map of kbid to 1-based vector rank position\n * @param k - RRF smoothing constant (default 60)\n * @returns map of kbid to fused RRF score\n */\nexport function rrfFuse(\n lexicalRanks: Map<string, number>,\n vectorRanks: Map<string, number>,\n k: number = DEFAULT_K,\n): Map<string, number> {\n const scores = new Map<string, number>();\n\n for (const [kbid, rank] of lexicalRanks) {\n scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));\n }\n\n for (const [kbid, rank] of vectorRanks) {\n scores.set(kbid, (scores.get(kbid) ?? 0) + 1 / (k + rank));\n }\n\n return scores;\n}\n", "/**\n * Typed JSON-RPC error thrown inside WorkerDaemon dispatch.\n *\n * Carries a numeric JSON-RPC error code alongside the standard\n * `Error` message so that `handleRequest` can build a well-formed\n * JSON-RPC error response without an additional type check.\n */\nexport class IpcError extends Error {\n /** JSON-RPC error code. */\n readonly code: number;\n\n /**\n * @param code - JSON-RPC error code (e.g. `-32601` for\n * method-not-found, `-32000` for application errors)\n * @param message - human-readable error description\n */\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n this.name = 'IpcError';\n }\n}\n", "import { readdirSync, readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport type { VectorIndexEntry } from '../typings/vector-index-entry.model.ts';\nimport { buildVectorIndex } from './build-vector-index.function.ts';\n\n/** Separator between section metadata header and body text. */\nconst SECTION_SEPARATOR = '\\n---\\n';\n\n/** Extracts the embeddable body from a raw section file string. */\nfunction extractBody(raw: string): string {\n const sep = raw.indexOf(SECTION_SEPARATOR);\n return sep >= 0 ? raw.slice(sep + SECTION_SEPARATOR.length) : raw;\n}\n\n/** Reads all kbid/body pairs from the sections directory. */\nfunction collectSections(\n sectionsDir: string,\n): { kbid: string; body: string }[] {\n let shards: string[];\n try {\n shards = readdirSync(sectionsDir);\n } catch {\n return [];\n }\n\n const result: { kbid: string; body: string }[] = [];\n for (const shard of shards) {\n let files: string[];\n try {\n files = readdirSync(join(sectionsDir, shard));\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.endsWith('.section')) continue;\n const kbid = file.slice(0, -8);\n try {\n const raw = readFileSync(\n join(sectionsDir, shard, file),\n 'utf-8',\n );\n const body = extractBody(raw);\n if (body.length > 0) {\n result.push({ kbid, body });\n }\n } catch {\n continue;\n }\n }\n }\n return result;\n}\n\n/**\n * Re-embeds all section files and writes a fresh `vectors.idx`.\n *\n * Scans `targetDir/sections/<shard>/<kbid>.section`, extracts each\n * body (after `\\n---\\n` separator or full content), embeds all texts\n * in a single batch, and writes the result via `buildVectorIndex`.\n *\n * Returns 0 immediately when `provider.dimensions() === 0`.\n *\n * @param targetDir - absolute path to the `.kbdb` directory\n * @param provider - embedding provider to use for vectorisation\n * @returns number of sections embedded\n */\nexport async function rebuildVectors(\n targetDir: string,\n provider: EmbeddingProvider,\n): Promise<number> {\n if (provider.dimensions() === 0) {\n return 0;\n }\n\n const sectionsDir = join(targetDir, 'sections');\n if (!existsSync(sectionsDir)) {\n return 0;\n }\n\n const sections = collectSections(sectionsDir);\n if (sections.length === 0) {\n return 0;\n }\n\n const texts = sections.map((s) => s.body);\n const vectors = await provider.embed(texts);\n\n const entries: VectorIndexEntry[] = sections.map((s, i) => ({\n kbid: s.kbid,\n vector: vectors[i] ?? new Float32Array(provider.dimensions()),\n }));\n\n await buildVectorIndex(\n targetDir,\n provider.modelName(),\n provider.dimensions(),\n entries,\n );\n\n return sections.length;\n}\n", "import { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { VectorIndexEntry } from '../typings/vector-index-entry.model.ts';\n\nconst MAGIC = 'KBVX';\nconst VERSION = 1;\nconst KBID_WIDTH = 64;\nconst HEADER_SIZE = 32;\n\nfunction writeHeader(\n buf: Buffer,\n dimensions: number,\n count: number,\n modelLen: number,\n): void {\n buf.write(MAGIC, 0, 'ascii');\n buf.writeUInt32LE(VERSION, 4);\n buf.writeUInt32LE(dimensions, 8);\n buf.writeUInt32LE(count, 12);\n buf.writeUInt32LE(modelLen, 16);\n}\n\nfunction writeRecord(\n buf: Buffer,\n offset: number,\n entry: VectorIndexEntry,\n dimensions: number,\n encoder: TextEncoder,\n): void {\n const kbidBytes = encoder.encode(entry.kbid);\n kbidBytes.forEach((b, i) => {\n if (i < KBID_WIDTH) buf.writeUInt8(b, offset + i);\n });\n for (let d = 0; d < dimensions; d++) {\n buf.writeFloatLE(\n entry.vector[d] ?? 0,\n offset + KBID_WIDTH + d * 4,\n );\n }\n}\n\n/**\n * Writes a binary `vectors.idx` file to the given directory.\n *\n * Header: 32 bytes (magic KBVX, version u32, dimensions u32, count\n * u32, model-name length u32, 12 reserved bytes). Followed by the\n * model name (UTF-8) then records (64-byte kbid + dims*4 floats).\n *\n * @param dirPath - directory where `vectors.idx` will be written\n * @param modelName - name of the embedding model used\n * @param dimensions - vector dimension count\n * @param entries - kbid/vector pairs to index\n */\nexport function buildVectorIndex(\n dirPath: string,\n modelName: string,\n dimensions: number,\n entries: VectorIndexEntry[],\n): Promise<void> {\n const encoder = new TextEncoder();\n const modelBytes = encoder.encode(modelName);\n const modelLen = modelBytes.length;\n const recordSize = KBID_WIDTH + dimensions * 4;\n const totalSize =\n HEADER_SIZE + modelLen + entries.length * recordSize;\n\n const buf = Buffer.alloc(totalSize, 0);\n writeHeader(buf, dimensions, entries.length, modelLen);\n modelBytes.forEach((b, i) => buf.writeUInt8(b, HEADER_SIZE + i));\n\n let recOffset = HEADER_SIZE + modelLen;\n for (const entry of entries) {\n writeRecord(buf, recOffset, entry, dimensions, encoder);\n recOffset += recordSize;\n }\n\n writeFileSync(join(dirPath, 'vectors.idx'), buf);\n return Promise.resolve();\n}\n", "const encoder = new TextEncoder();\n\nexport function encodeString(value: string): Uint8Array {\n const utf8 = encoder.encode(value);\n const result = new Uint8Array(4 + utf8.length);\n new DataView(result.buffer).setUint32(0, utf8.length, true);\n result.set(utf8, 4);\n return result;\n}\n", "export function encodeU32(value: number): Uint8Array {\n const result = new Uint8Array(4);\n new DataView(result.buffer).setUint32(0, value, true);\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\n\nexport function encodeOptionString(\n value: string | null | undefined,\n): Uint8Array {\n if (value == null) {\n return new Uint8Array([0x00]);\n }\n const encoded = encodeString(value);\n const result = new Uint8Array(1 + encoded.length);\n result[0] = 0x01;\n result.set(encoded, 1);\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\n\nexport function encodeSectionType(\n kind: 'text' | 'code' | 'image',\n mimeType?: string,\n): Uint8Array {\n if (kind === 'text') {\n return new Uint8Array([0x00]);\n }\n\n const tag = kind === 'code' ? 0x01 : 0x02;\n const mime = mimeType ?? 'text/plain';\n const encoded = encodeString(mime);\n const result = new Uint8Array(1 + encoded.length);\n result[0] = tag;\n result.set(encoded, 1);\n return result;\n}\n", "import { encodeSectionType } from './encode-section-type.function.ts';\nimport { encodeString } from './encode-string.function.ts';\nimport { encodeOptionString } from './encode-option-string.function.ts';\nimport { encodeU32 } from './encode-u32.function.ts';\n\n/**\n * Parameters for adding a new section to the knowledge base.\n *\n * Maps to the Rust `AddSectionParams` struct encoded for the\n * `worker_add_section` WASM export.\n */\nexport interface AddSectionInput {\n /** Semantic content category. */\n sectionType: 'text' | 'code' | 'image';\n /** MIME type; required for `code` and `image` section types. */\n mimeType?: string;\n /** Raw section content. */\n content: string;\n /** Optional section heading. */\n title?: string | null;\n /** Optional description summary. */\n description?: string | null;\n /** Optional document identifier to attach the section to. */\n docid?: string | null;\n /**\n * Application-level type name for the section (e.g. `'skill'`,\n * `'fact'`). `null` means no custom type.\n */\n typeName?: string | null;\n /**\n * Absolute path of the source file being learned. `undefined`\n * means stdin input or programmatic API call.\n */\n sourcePath?: string;\n /**\n * ISO 8601 modified time of the source file. `undefined` means\n * no source file exists.\n */\n sourceMtime?: string;\n /**\n * User-supplied tags for scoping and filtering. Defaults to\n * an empty list when not provided.\n */\n tags?: string[];\n /**\n * When `true`, supersede any existing section with the same\n * source key. Defaults to `false`.\n */\n replace?: boolean;\n}\n\n/**\n * Encodes `AddSectionInput` as the binary format expected by the\n * `worker_add_section` WASM export.\n *\n * Wire format (little-endian):\n * - `SectionType` tag byte (+ optional MIME string for code/image)\n * - `content`: `u32` length + UTF-8 bytes\n * - `title`: `u8` flag + optional `String`\n * - `description`: `u8` flag + optional `String`\n * - `docid`: `u8` flag + optional `String`\n * - `typeName`: `u8` flag + optional `String`\n * - `sourcePath`: `u8` flag + optional `String`\n * - `sourceMtime`: `u8` flag + optional `String`\n * - `tags`: `u32` count + each `String`\n * - `replace`: `u8` (0 or 1)\n */\nexport function encodeAddSectionParams(\n params: AddSectionInput,\n): Uint8Array {\n const tags = params.tags ?? [];\n const tagParts: Uint8Array[] = [];\n for (const tag of tags) {\n tagParts.push(encodeString(tag));\n }\n const tagsCountBytes = encodeU32(tags.length);\n const replaceByte = new Uint8Array([\n params.replace === true ? 1 : 0,\n ]);\n\n const parts = [\n encodeSectionType(params.sectionType, params.mimeType),\n encodeString(params.content),\n encodeOptionString(params.title),\n encodeOptionString(params.description),\n encodeOptionString(params.docid),\n encodeOptionString(params.typeName),\n encodeOptionString(params.sourcePath),\n encodeOptionString(params.sourceMtime),\n tagsCountBytes,\n ...tagParts,\n replaceByte,\n ];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\nimport { encodeAddSectionParams } from './encode-add-section-params.function.ts';\n\nimport type { AddSectionInput } from './encode-add-section-params.function.ts';\n\nexport function encodeUpdateSectionParams(\n oldKbid: string,\n params: AddSectionInput,\n): Uint8Array {\n const kbidBytes = encodeString(oldKbid);\n const paramBytes = encodeAddSectionParams(params);\n const result = new Uint8Array(kbidBytes.length + paramBytes.length);\n result.set(kbidBytes, 0);\n result.set(paramBytes, kbidBytes.length);\n return result;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\nexport function encodeKbidList(kbids: string[]): Uint8Array {\n if (kbids.length === 0) {\n return new Uint8Array(0);\n }\n const parts = [encodeU32(kbids.length), ...kbids.map(encodeString)];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "import { encodeString } from './encode-string.function.ts';\nimport { encodeKbidList } from './encode-kbid-list.function.ts';\n\n/**\n * Encodes parameters for the `worker_group_sections` WASM call into\n * a single byte buffer: title, kbid list, then doc type tag.\n *\n * @param title - human-readable document title\n * @param kbids - identifiers of the sections to group\n * @param docType - application-level document type tag; defaults to\n * empty string when not specified\n */\nexport function encodeGroupParams(\n title: string,\n kbids: string[],\n docType = '',\n): Uint8Array {\n const titleBytes = encodeString(title);\n const listBytes = encodeKbidList(kbids);\n const docTypeBytes = encodeString(docType);\n const result = new Uint8Array(\n titleBytes.length + listBytes.length + docTypeBytes.length,\n );\n result.set(titleBytes, 0);\n result.set(listBytes, titleBytes.length);\n result.set(docTypeBytes, titleBytes.length + listBytes.length);\n return result;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\nexport function encodeIdentifierList(ids: string[]): Uint8Array {\n if (ids.length === 0) {\n return new Uint8Array(0);\n }\n const parts = [encodeU32(ids.length), ...ids.map(encodeString)];\n const totalLen = parts.reduce((sum, p) => sum + p.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n", "const encoder = new TextEncoder();\n\nexport function encodeSearchParams(\n query: string,\n mode = 'and',\n limit = 20,\n offset = 0,\n): Uint8Array {\n return encoder.encode(\n `${query}\\n${mode}\\n${String(limit)}\\n${String(offset)}`,\n );\n}\n", "/**\n * Encodes a type filter string as raw UTF-8 bytes for WASM input.\n *\n * Used to pass a type name to WASM exports such as\n * `worker_list_by_type` and `worker_list_docs_by_type`, which accept\n * a plain UTF-8 byte slice without a length prefix.\n *\n * @param typeStr - the type name to filter by (e.g. `'article'`)\n * @returns UTF-8 encoded bytes ready to pass to the WASM export\n */\nexport function encodeTypeFilterParam(typeStr: string): Uint8Array {\n return new TextEncoder().encode(typeStr);\n}\n", "const decoder = new TextDecoder();\n\nexport interface DecodeResult<T> {\n value: T;\n bytesRead: number;\n}\n\nexport function decodeString(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<string> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n const len = view.getUint32(offset, true);\n const value = decoder.decode(\n bytes.subarray(offset + 4, offset + 4 + len),\n );\n return { value, bytesRead: 4 + len };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeU32(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<number> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getUint32(offset, true),\n bytesRead: 4,\n };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeF32(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<number> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getFloat32(offset, true),\n bytesRead: 4,\n };\n}\n", "import type { DecodeResult } from './decode-string.function.ts';\n\nexport function decodeU64(\n bytes: Uint8Array,\n offset: number,\n): DecodeResult<bigint> {\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength,\n );\n return {\n value: view.getBigUint64(offset, true),\n bytesRead: 8,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeF32 } from './decode-f32.function.ts';\n\n/**\n * A single ranked result item from a paged search response.\n */\nexport interface SectionMatch {\n /** Knowledge-base identifier for the matched section. */\n kbid: string;\n /** Section heading, or `null` when untitled. */\n heading: string | null;\n /** MIME type of the section content. */\n type: string;\n /** Document IDs this section belongs to. */\n docids: string[];\n /** Relevance score from the ranking engine. */\n score: number;\n /**\n * Confidence modifier (0.0\u20131.0) applied after relaxed search.\n * Always 1.0 for strict-mode results.\n */\n confidence: number;\n /** KWIC snippet (~150 chars around the best match). */\n snippet: string;\n /** Query terms that matched within this section. */\n matched_terms: string[];\n /**\n * Document fields that contained at least one matched term\n * (e.g. `'title'`, `'body'`).\n */\n matched_fields: string[];\n /** ISO 8601 creation timestamp of the section. */\n created_at: string;\n}\n\n/**\n * Paginated search response envelope returned by the WASM engine.\n */\nexport interface PagedSearchResult {\n /** Matching sections for the current page. */\n items: SectionMatch[];\n /** Total number of matches across all pages. */\n total: number;\n /** Number of results skipped (pagination offset). */\n offset: number;\n /** Maximum results per page. */\n limit: number;\n /** Whether more results exist beyond this page. */\n has_more: boolean;\n /**\n * Whether the engine fell back to relaxed (OR-mode) search\n * after strict (AND-mode) returned no results.\n */\n relaxed: boolean;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\n/**\n * Decodes the binary `PagedSearchResult` returned by the\n * `worker_get_result` WASM export after a `worker_search` call.\n *\n * Wire format (little-endian):\n * - `total`: `u32`\n * - `offset`: `u32`\n * - `limit`: `u32`\n * - `has_more`: `u8` (0/1)\n * - `relaxed`: `u8` (0/1)\n * - `item_count`: `u32`\n * - Per item:\n * - `kbid`: `String`\n * - `heading`: `Option<String>`\n * - `section_type`: `String`\n * - `docids`: `u32` count + `String[]`\n * - `score`: `f32`\n * - `confidence`: `f32`\n * - `snippet`: `String`\n * - `matched_terms`: `u32` count + `String[]`\n * - `matched_fields`: `u32` count + `String[]`\n * - `created_at`: `String`\n */\nexport function decodePagedSearchResult(\n bytes: Uint8Array,\n): PagedSearchResult {\n let offset = 0;\n\n const total = decodeU32(bytes, offset);\n offset += total.bytesRead;\n\n const resultOffset = decodeU32(bytes, offset);\n offset += resultOffset.bytesRead;\n\n const limit = decodeU32(bytes, offset);\n offset += limit.bytesRead;\n\n const hasMore = bytes[offset] === 1;\n offset += 1;\n\n // relaxed flag added after has_more\n const relaxed = offset < bytes.length && bytes[offset] === 1;\n if (offset < bytes.length) {\n offset += 1;\n }\n\n const itemCount = decodeU32(bytes, offset);\n offset += itemCount.bytesRead;\n\n const items: SectionMatch[] = [];\n for (let i = 0; i < itemCount.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, offset);\n offset += heading.bytesRead;\n\n const sectionType = decodeString(bytes, offset);\n offset += sectionType.bytesRead;\n\n const docidCount = decodeU32(bytes, offset);\n offset += docidCount.bytesRead;\n const docids: string[] = [];\n for (let j = 0; j < docidCount.value; j++) {\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n docids.push(docid.value);\n }\n\n const score = decodeF32(bytes, offset);\n offset += score.bytesRead;\n\n // confidence added after score\n const confidence = decodeF32(bytes, offset);\n offset += confidence.bytesRead;\n\n const snippet = decodeString(bytes, offset);\n offset += snippet.bytesRead;\n\n const termCount = decodeU32(bytes, offset);\n offset += termCount.bytesRead;\n const matched_terms: string[] = [];\n for (let j = 0; j < termCount.value; j++) {\n const term = decodeString(bytes, offset);\n offset += term.bytesRead;\n matched_terms.push(term.value);\n }\n\n // matched_fields added after matched_terms\n const fieldCount = decodeU32(bytes, offset);\n offset += fieldCount.bytesRead;\n const matched_fields: string[] = [];\n for (let j = 0; j < fieldCount.value; j++) {\n const field = decodeString(bytes, offset);\n offset += field.bytesRead;\n matched_fields.push(field.value);\n }\n\n // created_at added after matched_fields\n const createdAt = decodeString(bytes, offset);\n offset += createdAt.bytesRead;\n\n items.push({\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n docids,\n score: score.value,\n confidence: confidence.value,\n snippet: snippet.value,\n matched_terms,\n matched_fields,\n created_at: createdAt.value,\n });\n }\n\n return {\n items,\n total: total.value,\n offset: resultOffset.value,\n limit: limit.value,\n has_more: hasMore,\n relaxed,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\n/**\n * A single section record decoded from WASM binary output.\n *\n * Represents a stored knowledge-base section with all its metadata\n * and token counts as returned by `worker_read_sections` or\n * `worker_list_by_type`.\n */\nexport interface SectionRecord {\n /** Unique knowledge-base identifier for this section. */\n kbid: string;\n /** Document identifier this section belongs to, or `null`. */\n docid: string | null;\n /** Semantic type discriminant: `'text'`, `'code'`, or `'image'`. */\n sectionType: string;\n /** MIME type string, present only for `'code'` and `'image'` types. */\n mimeType?: string;\n /** Human-readable title for the section, or `null`. */\n title: string | null;\n /** Optional description of the section content, or `null`. */\n description: string | null;\n /** Raw text or base64-encoded content of the section. */\n content: string;\n /** Byte size of the stored content. */\n size: number;\n /** Section creation timestamp as a Unix epoch value. */\n createdAt: bigint;\n /** Integrity checksum of the stored content. */\n checksum: string;\n /** Total number of tokens in the section. */\n tokenCount: number;\n /** Number of heading tokens in the section. */\n headingTokenCount: number;\n /** Number of body tokens in the section. */\n bodyTokenCount: number;\n /** Number of code tokens in the section. */\n codeTokenCount: number;\n /** Application-level type name assigned to this section. */\n typeName: string;\n /**\n * Stable logical identity derived from source path and heading.\n * `null` for stdin input or sections without a source path.\n */\n sourceKey: string | null;\n /**\n * Absolute path of the source file that was learned.\n * `null` for stdin input or programmatic API calls.\n */\n sourcePath: string | null;\n /**\n * ISO 8601 modified time of the source file at learn time.\n * `null` when no source file exists.\n */\n sourceMtime: string | null;\n /**\n * ISO 8601 timestamp of the last supersession.\n * `null` on first creation.\n */\n updatedAt: string | null;\n /** User-supplied tags for scoping and filtering. */\n tags: string[];\n /**\n * The kbid of the section this one replaced via supersession.\n * `null` on first creation or non-superseding additions.\n */\n supersedes: string | null;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\nfunction decodeSectionType(\n bytes: Uint8Array,\n offset: number,\n): {\n sectionType: string;\n mimeType?: string;\n bytesRead: number;\n} {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { sectionType: 'text', bytesRead: 1 };\n }\n const mime = decodeString(bytes, offset + 1);\n const kind = tag === 0x01 ? 'code' : 'image';\n return {\n sectionType: kind,\n mimeType: mime.value,\n bytesRead: 1 + mime.bytesRead,\n };\n}\n\n/**\n * Decodes a list of `SectionRecord` values from WASM binary output.\n *\n * Reads a leading u32 count followed by that many encoded records.\n * Each record is decoded in field order as produced by the Rust\n * `SectionRecord::encode` implementation.\n *\n * Trailing fields (`sourceKey`, `sourcePath`, `sourceMtime`,\n * `updatedAt`, `tags`, `supersedes`) were added after the initial\n * format. When decoding legacy bytes that stop after `typeName`,\n * those fields default to `null` / `[]`. This matches the Rust\n * decoder's backward-compatibility guards.\n *\n * @param bytes - raw bytes returned by a WASM section-list export\n * @returns decoded array of section records, empty when count is zero\n */\nexport function decodeSectionRecords(\n bytes: Uint8Array,\n): SectionRecord[] {\n let offset = 0;\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const records: SectionRecord[] = [];\n for (let i = 0; i < count.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const docid = decodeOptionString(bytes, offset);\n offset += docid.bytesRead;\n\n const st = decodeSectionType(bytes, offset);\n offset += st.bytesRead;\n\n const title = decodeOptionString(bytes, offset);\n offset += title.bytesRead;\n\n const description = decodeOptionString(bytes, offset);\n offset += description.bytesRead;\n\n const content = decodeString(bytes, offset);\n offset += content.bytesRead;\n\n const size = decodeU32(bytes, offset);\n offset += size.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const checksum = decodeString(bytes, offset);\n offset += checksum.bytesRead;\n\n const tokenCount = decodeU32(bytes, offset);\n offset += tokenCount.bytesRead;\n\n const headingTokenCount = decodeU32(bytes, offset);\n offset += headingTokenCount.bytesRead;\n\n const bodyTokenCount = decodeU32(bytes, offset);\n offset += bodyTokenCount.bytesRead;\n\n const codeTokenCount = decodeU32(bytes, offset);\n offset += codeTokenCount.bytesRead;\n\n const typeName = decodeString(bytes, offset);\n offset += typeName.bytesRead;\n\n // New trailing fields -- use length guards for backward compat.\n let sourceKey: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourceKey = v.value;\n }\n\n let sourcePath: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourcePath = v.value;\n }\n\n let sourceMtime: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n sourceMtime = v.value;\n }\n\n let updatedAt: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n updatedAt = v.value;\n }\n\n let tags: string[] = [];\n if (offset < bytes.length) {\n const tagCount = decodeU32(bytes, offset);\n offset += tagCount.bytesRead;\n tags = [];\n for (let j = 0; j < tagCount.value; j++) {\n const tag = decodeString(bytes, offset);\n offset += tag.bytesRead;\n tags.push(tag.value);\n }\n }\n\n let supersedes: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n supersedes = v.value;\n }\n\n const record: SectionRecord = {\n kbid: kbid.value,\n docid: docid.value,\n sectionType: st.sectionType,\n title: title.value,\n description: description.value,\n content: content.value,\n size: size.value,\n createdAt: createdAt.value,\n checksum: checksum.value,\n tokenCount: tokenCount.value,\n headingTokenCount: headingTokenCount.value,\n bodyTokenCount: bodyTokenCount.value,\n codeTokenCount: codeTokenCount.value,\n typeName: typeName.value,\n sourceKey,\n sourcePath,\n sourceMtime,\n updatedAt,\n tags,\n supersedes,\n };\n if (st.mimeType !== undefined) {\n record.mimeType = st.mimeType;\n }\n records.push(record);\n }\n\n return records;\n}\n", "import { decodeSectionRecords } from './decode-section-records.function.ts';\nimport type { SectionRecord } from './decode-section-records.function.ts';\n\nexport type { SectionRecord };\n\n/**\n * Decodes a WASM byte slice into an array of `SectionRecord` values.\n *\n * Thin wrapper around `decodeSectionRecords` provided as the\n * canonical entry point for list-response decoding from WASM exports\n * such as `worker_list_by_type`.\n *\n * @param bytes - raw bytes returned by a WASM section-list export\n * @returns decoded array of section records\n */\nexport function decodeSectionRecordList(\n bytes: Uint8Array,\n): SectionRecord[] {\n return decodeSectionRecords(bytes);\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\n/**\n * A single section reference within a document manifest.\n *\n * Associates a knowledge-base identifier with the section's\n * ordinal position in the document.\n */\nexport interface DocumentSection {\n /** Knowledge-base identifier of the referenced section. */\n kbid: string;\n /** Zero-based position of this section within its document. */\n position: number;\n}\n\n/**\n * A document manifest decoded from WASM binary output.\n *\n * Represents a grouped document record with its ordered list of\n * section references as returned by `worker_retrieve_doc`.\n */\nexport interface DocumentManifest {\n /** Unique document identifier. */\n docid: string;\n /** Human-readable document title. */\n title: string;\n /** Document creation timestamp as a Unix epoch value. */\n createdAt: bigint;\n /** Application-level type name assigned to this document. */\n docType: string;\n /** Ordered list of section references belonging to the document. */\n sections: DocumentSection[];\n}\n\n/**\n * Decodes a single `DocumentManifest` from WASM binary output.\n *\n * Reads fields in the order: docid, title, createdAt, docType,\n * section count, then each section's kbid and position.\n *\n * @param bytes - raw bytes returned by `worker_retrieve_doc`\n * @returns the decoded document manifest\n */\nexport function decodeDocumentManifest(\n bytes: Uint8Array,\n): DocumentManifest {\n let offset = 0;\n\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n\n const title = decodeString(bytes, offset);\n offset += title.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const docType = decodeString(bytes, offset);\n offset += docType.bytesRead;\n\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const sections: DocumentSection[] = [];\n for (let i = 0; i < count.value; i++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const position = decodeU32(bytes, offset);\n offset += position.bytesRead;\n\n sections.push({\n kbid: kbid.value,\n position: position.value,\n });\n }\n\n return {\n docid: docid.value,\n title: title.value,\n createdAt: createdAt.value,\n docType: docType.value,\n sections,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\nimport type {\n DocumentManifest,\n DocumentSection,\n} from './decode-document-manifest.function.ts';\n\nexport type { DocumentManifest, DocumentSection };\n\n/**\n * Decodes a WASM byte slice into an array of `DocumentManifest` values.\n *\n * The binary format is: u32 count, followed by count \u00D7 DocumentManifest\n * entries. Each entry contains: docid (string), title (string),\n * createdAt (u64), docType (string), section count (u32), then each\n * section's kbid (string) and position (u32).\n *\n * @param bytes - raw bytes returned by `worker_list_docs_by_type`\n * @returns decoded array of document manifests, empty when count is zero\n */\nexport function decodeDocumentManifestList(\n bytes: Uint8Array,\n): DocumentManifest[] {\n let offset = 0;\n const count = decodeU32(bytes, offset);\n offset += count.bytesRead;\n\n const manifests: DocumentManifest[] = [];\n for (let i = 0; i < count.value; i++) {\n const docid = decodeString(bytes, offset);\n offset += docid.bytesRead;\n\n const title = decodeString(bytes, offset);\n offset += title.bytesRead;\n\n const createdAt = decodeU64(bytes, offset);\n offset += createdAt.bytesRead;\n\n const docType = decodeString(bytes, offset);\n offset += docType.bytesRead;\n\n const secCount = decodeU32(bytes, offset);\n offset += secCount.bytesRead;\n\n const sections: DocumentSection[] = [];\n for (let j = 0; j < secCount.value; j++) {\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const position = decodeU32(bytes, offset);\n offset += position.bytesRead;\n\n sections.push({\n kbid: kbid.value,\n position: position.value,\n });\n }\n\n manifests.push({\n docid: docid.value,\n title: title.value,\n createdAt: createdAt.value,\n docType: docType.value,\n sections,\n });\n }\n\n return manifests;\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\n\nexport interface ComposeOutput {\n markdown: string;\n totalChars: bigint;\n}\n\nexport function decodeComposeOutput(bytes: Uint8Array): ComposeOutput {\n const md = decodeString(bytes, 0);\n const totalChars = decodeU64(bytes, md.bytesRead);\n return {\n markdown: md.value,\n totalChars: totalChars.value,\n };\n}\n", "export function decodeKeyValueText(\n text: string,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of text.split('\\n')) {\n const idx = line.indexOf('=');\n if (idx < 0) continue;\n const key = line.slice(0, idx);\n const value = line.slice(idx + 1);\n if (key) {\n result[key] = value;\n }\n }\n return result;\n}\n", "export function decodeRemoveFlag(bytes: Uint8Array): boolean {\n return bytes.length > 0 && bytes[0] === 0x01;\n}\n", "import { encodeU32 } from './encode-u32.function.ts';\nimport { encodeString } from './encode-string.function.ts';\n\n/**\n * Encodes recall parameters to the binary format expected by the\n * `worker_recall` WASM export.\n *\n * Binary layout:\n * - `u8 tag`: `0` = single kbid, `1` = batch\n * - If tag=0: `u32 len + utf8` kbid\n * - If tag=1: `u32 count` + (`u32 len + utf8`) per kbid\n * - `u32 depth` (little-endian)\n *\n * When both `kbid` and `kbids` are provided, `kbids` takes precedence\n * and `kbid` is appended to the batch.\n *\n * @param params - recall parameters; at least one of `kbid` or\n * `kbids` must be present\n */\nexport function encodeRecallParams(params: {\n kbid?: string;\n kbids?: readonly string[];\n depth?: number;\n}): Uint8Array {\n const depth = params.depth ?? 0;\n const depthBytes = encodeU32(depth);\n\n // Batch: kbids provided (kbid optionally appended)\n if (params.kbids !== undefined) {\n const allKbids: string[] =\n params.kbid !== undefined\n ? [...params.kbids, params.kbid]\n : [...params.kbids];\n\n const countBytes = encodeU32(allKbids.length);\n const encodedKbids = allKbids.map(encodeString);\n\n const totalLen =\n 1 + // tag\n countBytes.length +\n encodedKbids.reduce((sum, b) => sum + b.length, 0) +\n depthBytes.length;\n\n const result = new Uint8Array(totalLen);\n let offset = 0;\n result[offset++] = 0x01; // tag = batch\n result.set(countBytes, offset);\n offset += countBytes.length;\n for (const kbidBytes of encodedKbids) {\n result.set(kbidBytes, offset);\n offset += kbidBytes.length;\n }\n result.set(depthBytes, offset);\n return result;\n }\n\n // Single kbid\n const kbid = params.kbid ?? '';\n const kbidBytes = encodeString(kbid);\n const totalLen = 1 + kbidBytes.length + depthBytes.length;\n const result = new Uint8Array(totalLen);\n let offset = 0;\n result[offset++] = 0x00; // tag = single\n result.set(kbidBytes, offset);\n offset += kbidBytes.length;\n result.set(depthBytes, offset);\n return result;\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport type {\n RecallResult,\n RecallDocument,\n RecallSibling,\n RecallReference,\n} from '../../worker-client/typings/recall-result.model.ts';\n\n/**\n * Decodes recall result binary output from the `worker_recall` WASM\n * export.\n *\n * Binary layout:\n * - `u8 tag`: `0` = single result, `1` = batch\n * - If tag=0: one RecallResult record\n * - If tag=1: `u32 count` + `count` RecallResult records\n *\n * Each RecallResult:\n * ```\n * String kbid\n * Option<String> heading (0x00=null, 0x01 + String)\n * String section_type\n * String content\n * u32 docids_count + String[] docids\n * u32 documents_count + RecallDocument[]\n * u32 back_references_count + RecallReference[]\n * u32 siblings_count + RecallSibling[]\n * u32 references_count + RecallReference[]\n * ```\n *\n * @param bytes - raw binary output from the WASM export\n * @returns a single `RecallResult` for tag=0, or `RecallResult[]`\n * for tag=1\n */\nexport function decodeRecallResult(\n bytes: Uint8Array,\n): RecallResult | RecallResult[] {\n const tag = bytes[0];\n let offset = 1;\n\n if (tag === 0x01) {\n // Batch\n const countResult = decodeU32(bytes, offset);\n offset += countResult.bytesRead;\n const items: RecallResult[] = [];\n for (let i = 0; i < countResult.value; i++) {\n const { item, bytesRead } = decodeOneResult(bytes, offset);\n offset += bytesRead;\n items.push(item);\n }\n return items;\n }\n\n // Single (tag=0 or any other value)\n const { item } = decodeOneResult(bytes, offset);\n return item;\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\ninterface DecodeResultPair {\n item: RecallResult;\n bytesRead: number;\n}\n\nfunction decodeOptionString(\n bytes: Uint8Array,\n offset: number,\n): { value: string | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x00) {\n return { value: null, bytesRead: 1 };\n }\n const str = decodeString(bytes, offset + 1);\n return { value: str.value, bytesRead: 1 + str.bytesRead };\n}\n\nfunction decodeReference(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallReference; bytesRead: number } {\n let pos = offset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const markerType = decodeString(bytes, pos);\n pos += markerType.bytesRead;\n\n const contextSnippet = decodeString(bytes, pos);\n pos += contextSnippet.bytesRead;\n\n const direction = decodeString(bytes, pos);\n pos += direction.bytesRead;\n\n return {\n value: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n marker_type: markerType.value,\n context_snippet: contextSnippet.value,\n direction: direction.value as 'forward' | 'back',\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeSibling(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallSibling; bytesRead: number } {\n let pos = offset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const content = decodeString(bytes, pos);\n pos += content.bytesRead;\n\n return {\n value: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n content: content.value,\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeDocument(\n bytes: Uint8Array,\n offset: number,\n): { value: RecallDocument; bytesRead: number } {\n let pos = offset;\n\n const docid = decodeString(bytes, pos);\n pos += docid.bytesRead;\n\n const title = decodeString(bytes, pos);\n pos += title.bytesRead;\n\n const sectionCount = decodeU32(bytes, pos);\n pos += sectionCount.bytesRead;\n\n const sections: RecallDocument['sections'][number][] = [];\n for (let i = 0; i < sectionCount.value; i++) {\n const secKbid = decodeString(bytes, pos);\n pos += secKbid.bytesRead;\n\n const secHeading = decodeOptionString(bytes, pos);\n pos += secHeading.bytesRead;\n\n const secType = decodeString(bytes, pos);\n pos += secType.bytesRead;\n\n sections.push({\n kbid: secKbid.value,\n heading: secHeading.value,\n type: secType.value,\n });\n }\n\n return {\n value: {\n docid: docid.value,\n title: title.value,\n sections,\n },\n bytesRead: pos - offset,\n };\n}\n\nfunction decodeOneResult(\n bytes: Uint8Array,\n startOffset: number,\n): DecodeResultPair {\n let pos = startOffset;\n\n const kbid = decodeString(bytes, pos);\n pos += kbid.bytesRead;\n\n const heading = decodeOptionString(bytes, pos);\n pos += heading.bytesRead;\n\n const sectionType = decodeString(bytes, pos);\n pos += sectionType.bytesRead;\n\n const content = decodeString(bytes, pos);\n pos += content.bytesRead;\n\n const docidCount = decodeU32(bytes, pos);\n pos += docidCount.bytesRead;\n const docids: string[] = [];\n for (let i = 0; i < docidCount.value; i++) {\n const docid = decodeString(bytes, pos);\n pos += docid.bytesRead;\n docids.push(docid.value);\n }\n\n const docCount = decodeU32(bytes, pos);\n pos += docCount.bytesRead;\n const documents: RecallDocument[] = [];\n for (let i = 0; i < docCount.value; i++) {\n const doc = decodeDocument(bytes, pos);\n pos += doc.bytesRead;\n documents.push(doc.value);\n }\n\n const backRefCount = decodeU32(bytes, pos);\n pos += backRefCount.bytesRead;\n const back_references: RecallReference[] = [];\n for (let i = 0; i < backRefCount.value; i++) {\n const ref = decodeReference(bytes, pos);\n pos += ref.bytesRead;\n back_references.push(ref.value);\n }\n\n const sibCount = decodeU32(bytes, pos);\n pos += sibCount.bytesRead;\n const siblings: RecallSibling[] = [];\n for (let i = 0; i < sibCount.value; i++) {\n const sib = decodeSibling(bytes, pos);\n pos += sib.bytesRead;\n siblings.push(sib.value);\n }\n\n const refCount = decodeU32(bytes, pos);\n pos += refCount.bytesRead;\n const references: RecallReference[] = [];\n for (let i = 0; i < refCount.value; i++) {\n const ref = decodeReference(bytes, pos);\n pos += ref.bytesRead;\n references.push(ref.value);\n }\n\n return {\n item: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n content: content.value,\n docids,\n documents,\n back_references,\n siblings,\n references,\n },\n bytesRead: pos - startOffset,\n };\n}\n", "import { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeU64 } from './decode-u64.function.ts';\nimport { decodeF32 } from './decode-f32.function.ts';\n\n/**\n * A near-duplicate section identified during add-section indexing.\n */\nexport interface NearDuplicate {\n /** Knowledge-base identifier of the near-duplicate section. */\n readonly kbid: string;\n /** Jaccard similarity score (0.0\u20131.0). */\n readonly similarity: number;\n}\n\n/**\n * Decoded result of a `worker_add_section` WASM call.\n *\n * Mirrors the Rust `AddSectionResult` struct encoded via the\n * `Encode` trait wire format.\n */\nexport interface AddSectionResult {\n /** Knowledge-base identifier assigned to the new section. */\n readonly kbid: string;\n /** Number of unique terms indexed for the section. */\n readonly indexedTermsCount: number;\n /** Wall-clock time the add operation took, in milliseconds. */\n readonly elapsedMs: number;\n /**\n * Knowledge-base identifier of the section that was superseded,\n * or `null` if no supersession occurred.\n */\n readonly superseded: string | null;\n /** Advisory warnings emitted during indexing. */\n readonly warnings: string[];\n /**\n * Near-duplicate sections detected above the similarity threshold\n * (Jaccard \u2265 0.85).\n */\n readonly nearDuplicates: NearDuplicate[];\n}\n\n/**\n * Decodes the binary `AddSectionResult` returned by the\n * `worker_add_section` WASM export.\n *\n * Wire format (little-endian):\n * - `kbid`: `u32` length + UTF-8 bytes\n * - `indexed_terms_count`: `u32`\n * - `elapsed_ms`: `u64`\n * - `superseded`: `u8` flag (0=None, 1=Some) + optional `String`\n * - `warnings`: `u32` count + each `String`\n * - `near_duplicates`: `u32` count + each (`String` + `f32`)\n */\nexport function decodeAddSectionResult(\n bytes: Uint8Array,\n): AddSectionResult {\n let offset = 0;\n\n const kbid = decodeString(bytes, offset);\n offset += kbid.bytesRead;\n\n const indexedTermsCount = decodeU32(bytes, offset);\n offset += indexedTermsCount.bytesRead;\n\n const elapsedMsBig = decodeU64(bytes, offset);\n offset += elapsedMsBig.bytesRead;\n\n // Decode Option<String> for superseded\n const supersededTag = bytes[offset];\n offset += 1;\n let superseded: string | null = null;\n if (supersededTag === 0x01) {\n const supersededStr = decodeString(bytes, offset);\n offset += supersededStr.bytesRead;\n superseded = supersededStr.value;\n }\n\n // Decode Vec<String> for warnings\n const warningCount = decodeU32(bytes, offset);\n offset += warningCount.bytesRead;\n const warnings: string[] = [];\n for (let i = 0; i < warningCount.value; i++) {\n const warning = decodeString(bytes, offset);\n offset += warning.bytesRead;\n warnings.push(warning.value);\n }\n\n // Decode Vec<(String, f32)> for near_duplicates\n const dupCount = decodeU32(bytes, offset);\n offset += dupCount.bytesRead;\n const nearDuplicates: NearDuplicate[] = [];\n for (let i = 0; i < dupCount.value; i++) {\n const dupKbid = decodeString(bytes, offset);\n offset += dupKbid.bytesRead;\n const similarity = decodeF32(bytes, offset);\n offset += similarity.bytesRead;\n nearDuplicates.push({\n kbid: dupKbid.value,\n similarity: similarity.value,\n });\n }\n\n return {\n kbid: kbid.value,\n indexedTermsCount: indexedTermsCount.value,\n elapsedMs: Number(elapsedMsBig.value),\n superseded,\n warnings,\n nearDuplicates,\n };\n}\n", "import { resolve } from 'node:path';\n\n/** Result of the worker entry point. */\nexport interface WorkerResult {\n /** Error message (if any). */\n error?: string;\n /** Process exit code. `0` means success. */\n exitCode: number;\n}\n\n/**\n * Injectable dependencies for the worker entry point.\n */\nexport interface WorkerDeps {\n existsSync: (path: string) => boolean;\n startDaemon: (\n contextPath: string,\n wasmDir?: string,\n ) => Promise<void>;\n wasmDir?: string;\n}\n\n/**\n * Worker daemon entry point extracted from `src/worker.ts`.\n *\n * Validates the context path argument, resolves it to an\n * absolute path, checks existence, and delegates to\n * `startDaemon`.\n *\n * @param argv - raw arguments (expects `[contextPath]`)\n * @param deps - injectable dependencies\n */\nexport async function runWorker(\n argv: string[],\n deps: WorkerDeps,\n): Promise<WorkerResult> {\n const contextPath = argv[0];\n\n if (!contextPath) {\n return {\n error: 'usage: kbdb-worker <context-path>',\n exitCode: 1,\n };\n }\n\n const resolved = resolve(contextPath);\n\n if (!deps.existsSync(resolved)) {\n return {\n error: `error: path not found: ${resolved}`,\n exitCode: 1,\n };\n }\n\n await deps.startDaemon(resolved, deps.wasmDir);\n return { exitCode: 0 };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_node_fs", "import_node_path", "import_node_path", "import_node_fs", "import_node_path", "import_node_os", "import_node_fs", "import_node_path", "import_node_os", "import_node_fs", "import_node_fs", "import_node_path", "dv", "wasmDir", "resolve", "import_node_path", "import_node_fs", "import_node_path", "import_node_fs", "import_node_fs", "import_node_path", "import_node_fs", "import_node_path", "KBID_WIDTH", "HEADER_SIZE", "encoder", "encoder", "decodeOptionString", "totalLen", "result", "offset", "kbidBytes", "item", "decodeOptionString", "IpcError", "wasmDir", "resolve", "wasmDir", "import_node_path"]
|
|
7
7
|
}
|