@dikolab/kbdb 0.6.3 → 0.6.5

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.
Files changed (79) hide show
  1. package/dist/cli.cjs +681 -249
  2. package/dist/cli.cjs.map +4 -4
  3. package/dist/cli.mjs +638 -206
  4. package/dist/cli.mjs.map +4 -4
  5. package/dist/kbdb-worker.cjs +49 -7
  6. package/dist/kbdb-worker.cjs.map +4 -4
  7. package/dist/mod.cjs +1 -1
  8. package/dist/mod.cjs.map +1 -1
  9. package/dist/mod.mjs +1 -1
  10. package/dist/mod.mjs.map +1 -1
  11. package/dist/src/shared/cli/constants/defaults.constant.d.ts +1 -1
  12. package/dist/src/shared/cli/functions/learn-markdown-document.function.d.ts +22 -0
  13. package/dist/src/shared/cli/functions/learn-structured-document.function.d.ts +10 -0
  14. package/dist/src/shared/cli/functions/learn-target-content.function.d.ts +12 -0
  15. package/dist/src/shared/cli/functions/map-add-section-result.function.d.ts +12 -0
  16. package/dist/src/shared/cli/functions/run-agent-list.function.d.ts +13 -9
  17. package/dist/src/shared/cli/functions/run-learn.function.d.ts +10 -59
  18. package/dist/src/shared/cli/functions/run-skill-list.function.d.ts +11 -7
  19. package/dist/src/shared/cli/functions/split-markdown-sections.function.d.ts +16 -0
  20. package/dist/src/shared/cli/typings/learn-client.interface.d.ts +16 -28
  21. package/dist/src/shared/cli/typings/learn-result.model.d.ts +2 -0
  22. package/dist/src/shared/cli/typings/markdown-section.interface.d.ts +23 -0
  23. package/dist/src/shared/content-splitter/classes/heading-parent-tracker.class.d.ts +20 -0
  24. package/dist/src/shared/content-splitter/constants/content-type-maps.constant.d.ts +5 -0
  25. package/dist/src/shared/content-splitter/constants/split-strategy-map.constant.d.ts +4 -0
  26. package/dist/src/shared/content-splitter/functions/detect-content-type.function.d.ts +13 -0
  27. package/dist/src/shared/content-splitter/functions/flush-markdown-draft.function.d.ts +14 -0
  28. package/dist/src/shared/content-splitter/functions/flush-toml-draft.function.d.ts +15 -0
  29. package/dist/src/shared/content-splitter/functions/push-content-section.function.d.ts +16 -0
  30. package/dist/src/shared/content-splitter/functions/resolve-parent-ids.function.d.ts +14 -0
  31. package/dist/src/shared/content-splitter/functions/split-content.function.d.ts +11 -0
  32. package/dist/src/shared/content-splitter/functions/split-html.function.d.ts +12 -0
  33. package/dist/src/shared/content-splitter/functions/split-markdown.function.d.ts +13 -0
  34. package/dist/src/shared/content-splitter/functions/split-plain-text.function.d.ts +8 -0
  35. package/dist/src/shared/content-splitter/functions/split-toml.function.d.ts +12 -0
  36. package/dist/src/shared/content-splitter/index.d.ts +11 -0
  37. package/dist/src/shared/content-splitter/typings/content-format.type.d.ts +2 -0
  38. package/dist/src/shared/content-splitter/typings/content-section.interface.d.ts +17 -0
  39. package/dist/src/shared/content-splitter/typings/markdown-draft.interface.d.ts +12 -0
  40. package/dist/src/shared/content-splitter/typings/split-result.interface.d.ts +8 -0
  41. package/dist/src/shared/content-splitter/typings/split-strategy.interface.d.ts +3 -0
  42. package/dist/src/shared/content-splitter/typings/toml-draft.interface.d.ts +15 -0
  43. package/dist/src/shared/mcp/functions/build-learn-payload.function.d.ts +24 -0
  44. package/dist/src/shared/mcp/functions/determine-learn-split.function.d.ts +18 -0
  45. package/dist/src/shared/mcp/functions/handle-agent-list.function.d.ts +11 -21
  46. package/dist/src/shared/mcp/functions/handle-tool-call.function.d.ts +1 -15
  47. package/dist/src/shared/mcp/functions/handle-tool-learn.function.d.ts +3 -1
  48. package/dist/src/shared/mcp/functions/handle-tool-skill-list.function.d.ts +13 -3
  49. package/dist/src/shared/mcp/functions/learn-with-splitting.function.d.ts +22 -0
  50. package/dist/src/shared/mcp/functions/parse-learn-args.function.d.ts +24 -0
  51. package/dist/src/shared/mcp/functions/store-split-learn-sections.function.d.ts +16 -0
  52. package/dist/src/shared/mcp/functions/unwrap-json-content.function.d.ts +9 -0
  53. package/dist/src/shared/mcp/typings/learn-section-params.interface.d.ts +20 -0
  54. package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +4 -0
  55. package/dist/src/shared/mcp/typings/mcp-worker-client.interface.d.ts +4 -0
  56. package/dist/src/shared/query-filter/functions/matches-query.function.d.ts +17 -0
  57. package/dist/src/shared/version/constants/version.constant.d.ts +1 -1
  58. package/dist/src/shared/wasm-codec/functions/decode-one-recall-result.function.d.ts +2 -1
  59. package/dist/src/shared/wasm-codec/functions/decode-recall-document.function.d.ts +2 -1
  60. package/dist/src/shared/wasm-codec/functions/decode-recall-result.function.d.ts +2 -0
  61. package/dist/src/shared/wasm-codec/functions/decode-recall-sibling.function.d.ts +2 -1
  62. package/dist/src/shared/wasm-codec/functions/decode-scored-results.function.d.ts +6 -0
  63. package/dist/src/shared/wasm-codec/functions/decode-section-match.function.d.ts +2 -1
  64. package/dist/src/shared/wasm-codec/functions/decode-section-records.function.d.ts +4 -0
  65. package/dist/src/shared/wasm-codec/functions/encode-add-section-params.function.d.ts +1 -0
  66. package/dist/src/shared/wasm-codec/typings/add-section-input.model.d.ts +2 -0
  67. package/dist/src/shared/wasm-codec/typings/section-match.model.d.ts +4 -0
  68. package/dist/src/shared/wasm-codec/typings/section-record-trailing.model.d.ts +2 -0
  69. package/dist/src/shared/wasm-codec/typings/section-record.model.d.ts +2 -0
  70. package/dist/src/shared/worker-client/typings/recall-result.model.d.ts +12 -0
  71. package/dist/src/shared/worker-client/typings/search-result.model.d.ts +4 -0
  72. package/dist/src/shared/worker-client/typings/section.model.d.ts +2 -0
  73. package/dist/wasm/default-embedding/kbdb_default_embedding_bg.wasm +0 -0
  74. package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  75. package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  76. package/dist/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
  77. package/dist/worker.mjs +49 -7
  78. package/dist/worker.mjs.map +4 -4
  79. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/worker.ts", "../src/shared/worker-daemon/functions/read-config.function.ts", "../src/shared/worker-daemon/functions/start-daemon.function.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/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/constants/tfidf-defaults.constant.ts", "../src/shared/embedding/classes/tfidf-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/worker-daemon/functions/validate-daemon-path.function.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/strip-recall-by-depth.function.ts", "../src/shared/worker-daemon/functions/run-worker.function.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\n/**\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';\nimport { resolveLogLevel } from './shared/log/functions/resolve-log-level.function.ts';\nimport { configureLog } from './shared/log/functions/configure-log.function.ts';\nimport { parseLogLevel } from './shared/log/functions/parse-log-level.function.ts';\nimport { log } from './shared/log/functions/log.function.ts';\nimport { LogLevel } from './shared/log/typings/log-level.type.ts';\n\nconst baseDir = resolveBaseDir(import.meta.url, import.meta.dirname);\nconst wasmDir = resolveWasmDir(baseDir.scriptDir);\n\nconst argv = getArgs();\nconst cliLogLevel = extractLogLevel(argv);\nconfigureLog({ level: resolveLogLevel(cliLogLevel) });\nlog('daemon process starting', LogLevel.DEBUG);\n\nasync function main(): Promise<void> {\n const result = await runWorker(argv, {\n existsSync,\n startDaemon,\n wasmDir,\n });\n if (result.error) {\n log(result.error, LogLevel.ERROR);\n }\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n}\n\nmain().catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n log(msg, LogLevel.ERROR);\n process.exitCode = 1;\n});\n\nfunction extractLogLevel(args: string[]): LogLevel | undefined {\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--log-level' && args[i + 1]) {\n return parseLogLevel(args[i + 1]);\n }\n }\n return undefined;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log(\n 'start-daemon: entry contextPath=' + contextPath,\n LogLevel.DEBUG,\n );\n\n const config = readConfig(contextPath);\n log(\n 'start-daemon: config loaded' +\n ' timeoutMs=' +\n String(config.timeoutMs) +\n ' embedding=' +\n (config.embedding?.provider ?? 'none'),\n LogLevel.DEBUG,\n );\n\n const hash = await computeSha256(contextPath);\n const contextId = hash.slice(0, 16);\n log('start-daemon: contextId=' + contextId, LogLevel.DEBUG);\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 log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n log('preconditions passed', LogLevel.DEBUG);\n\n try {\n await daemon.start();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n log('daemon started', LogLevel.INFO);\n\n log(\n 'start-daemon: registering SIGTERM/SIGINT handlers',\n LogLevel.DEBUG,\n );\n process.on('SIGTERM', () => {\n log('start-daemon: SIGTERM received', LogLevel.DEBUG);\n daemon.stop();\n });\n process.on('SIGINT', () => {\n log('start-daemon: SIGINT received', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport {\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, Socket } from 'node:net';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 { validateDaemonPath } from '../functions/validate-daemon-path.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';\nimport { applyRecallDepth } from '../functions/strip-recall-by-depth.function.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 _sockets = new Set<Socket>();\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 log(\n `database directory not found: ${this.targetDir}`,\n LogLevel.ERROR,\n );\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 const msg =\n `cannot access database directory: ${this.targetDir}` +\n ' -- permission denied';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\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 log(\n 'start: loading wasm modules ctx=' + this.ctx,\n LogLevel.DEBUG,\n );\n const wasmModules = await loadWasmModules(\n this.config,\n this._wasmDir,\n );\n this._wasmModules = wasmModules;\n log('start: wasm modules loaded', LogLevel.DEBUG);\n\n this._embeddingProvider = createEmbeddingProvider(\n this.config.embedding,\n wasmModules.embedding,\n );\n log(\n 'start: embedding provider created embedding=' +\n (this.config.embedding?.provider ?? 'none'),\n LogLevel.DEBUG,\n );\n\n this.initWorkerContext();\n log('start: worker context initialized', LogLevel.DEBUG);\n\n this.runStartupIntegrityCheck();\n log(\n 'start: integrity check done ok=' + String(this._integrityOk),\n LogLevel.DEBUG,\n );\n\n const ipcPath = getIpcPath(this.ctx);\n\n if (existsSync(ipcPath)) {\n log('start: removing stale socket ' + ipcPath, LogLevel.DEBUG);\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 log('IPC server listening on ' + ipcPath, LogLevel.INFO);\n\n this._server.on('connection', (socket: Socket) => {\n this._sockets.add(socket);\n this.incrementConnections();\n this.resetIdleTimer();\n log(\n 'client connected (count: ' +\n String(this._connectionCount) +\n ')',\n LogLevel.DEBUG,\n );\n socket.on('close', () => {\n this._sockets.delete(socket);\n this.decrementConnections();\n log(\n 'client disconnected (count: ' +\n String(this._connectionCount) +\n ')',\n LogLevel.DEBUG,\n );\n if (this._connectionCount === 0) {\n this.resetIdleTimer();\n }\n });\n });\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n writeFileSync(pidPath, process.pid.toString());\n log(\n 'start: pid file written pid=' + String(process.pid),\n LogLevel.DEBUG,\n );\n\n log('start: daemon ready ctx=' + this.ctx, LogLevel.DEBUG);\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 log(\n 'stop: entry sockets=' + String(this._sockets.size),\n LogLevel.DEBUG,\n );\n log('shutting down', LogLevel.INFO);\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n this._idleTimer = null;\n }\n\n for (const socket of this._sockets) {\n socket.destroy();\n }\n this._sockets.clear();\n\n if (this._server !== null) {\n this._server.close();\n this._server = null;\n log('stop: server closed', LogLevel.DEBUG);\n }\n\n this._wasmModules = null;\n log('stop: wasm resources released', LogLevel.DEBUG);\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n try {\n unlinkSync(pidPath);\n log('stop: pid file removed', LogLevel.DEBUG);\n } catch {\n // ignore cleanup errors\n }\n\n const ipcPath = getIpcPath(this.ctx);\n try {\n unlinkSync(ipcPath);\n log('stop: socket file removed', LogLevel.DEBUG);\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 log('stop: daemon exiting', LogLevel.DEBUG);\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 log(\n 'handle-request: method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\n\n const params = request.params as\n | Record<string, unknown>\n | undefined;\n if (params === undefined || params.ctx !== this.ctx) {\n log(\n 'handle-request: context mismatch id=' + String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: success method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: ipc error method=' +\n request.method +\n ' id=' +\n String(request.id) +\n ' code=' +\n String(err.code),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: error method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'idle timer started (' +\n String(this.config.timeoutMs) +\n 'ms)',\n LogLevel.DEBUG,\n );\n this._idleTimer = setTimeout(() => {\n log(\n 'idle timer fired: shutting down ctx=' + this.ctx,\n LogLevel.DEBUG,\n );\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 const msg =\n `cannot read database directory: ${this.targetDir}` +\n ' -- permission denied';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n const version = parseCatalogVersion(text);\n if (version === null) {\n const msg =\n 'database version 0 requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n if (version > DB_FORMAT_VERSION) {\n const msg =\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 log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n if (version < DB_FORMAT_VERSION) {\n const msg =\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 log(msg, LogLevel.ERROR);\n throw new Error(msg);\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 title = (params['title'] as string | null) ?? null;\n const explicitDocid = (params['docid'] as string | null) ?? null;\n const docid =\n explicitDocid ??\n (typeName && title ? `${typeName}:${title}` : null);\n const input: AddSectionInput = {\n sectionType: semanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title,\n description: (params['description'] as string | null) ?? null,\n docid,\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 level:\n typeof params['level'] === 'number'\n ? params['level']\n : undefined,\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 items: [decoded.kbid],\n total: 1,\n offset: 0,\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 level:\n typeof params['level'] === 'number'\n ? params['level']\n : undefined,\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 type: 'text/markdown',\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 const decoded = decodeRecallResult(bytes);\n return applyRecallDepth(decoded, depth);\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 ctxPath = kv['ctx_path'] || kv['context_path'] || '';\n return {\n initialized: kv['initialized'] === 'true',\n context_path: ctxPath,\n contextPath: ctxPath,\n document_count: Number(\n kv['document_count'] || kv['documents'] || 0,\n ),\n section_count: Number(\n kv['section_count'] || kv['sections'] || 0,\n ),\n wasm_memory_bytes:\n this._wasmModules?.memory.buffer.byteLength ?? 0,\n };\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 const kv = decodeKeyValueText(text);\n const divContent = kv['divergent_content'] || '';\n const errors: Record<string, string>[] = [];\n if (divContent) {\n errors.push({\n type: 'divergent_content',\n entity: divContent,\n detail: 'sections share source key with different content',\n });\n }\n return {\n type: 'integrity',\n ok: kv['ok'] === 'true',\n sections_checked: Number(kv['sections_checked'] || 0),\n documents_checked: Number(kv['documents_checked'] || 0),\n references_checked: Number(kv['references_checked'] || 0),\n elapsed_ms: Number(kv['elapsed_ms'] || 0),\n errors,\n divergent_content: divContent,\n };\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 join(this.targetDir, 'kbdb-export');\n validateDaemonPath(targetPath);\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 validateDaemonPath(sourcePath);\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 log('write-lock: acquired', LogLevel.DEBUG);\n return Promise.resolve();\n }\n log(\n 'write-lock: queued depth=' +\n String(this._writeQueue.length + 1),\n LogLevel.DEBUG,\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 log(\n 'write-lock: released to next waiter depth=' +\n String(this._writeQueue.length),\n LogLevel.DEBUG,\n );\n next.resolve();\n } else {\n this._writeLocked = false;\n log('write-lock: released', LogLevel.DEBUG);\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 log(\n '[kbdb-worker] startup integrity check failed: ' +\n this._integrityErrors.join(', '),\n LogLevel.WARNING,\n );\n }\n } catch {\n this._integrityOk = false;\n this._integrityErrors = ['integrity_check_failed'];\n log(\n '[kbdb-worker] startup integrity check threw an error',\n LogLevel.WARNING,\n );\n }\n }\n\n // -- WASM bridge primitives --\n\n private getExport(name: string): WasmFn {\n if (this._wasmModules === null) {\n log('WASM modules not loaded', LogLevel.ERROR);\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 log(`WASM export not found: ${name}`, LogLevel.ERROR);\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 log('WASM memory overflow', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('loading WASM module: kb-worker', LogLevel.DEBUG);\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 const embPath = joinPath(\n wasmDir,\n 'default-embedding',\n 'kbdb_default_embedding_bg.wasm',\n );\n let embedding: WebAssembly.Instance | undefined;\n try {\n const embBytes = await readWasmFile(embPath, 'default-embedding');\n const embModule = await WebAssembly.compile(embBytes);\n embedding = await WebAssembly.instantiate(embModule, {});\n } catch {\n // optional -- gracefully degrade to NullEmbeddingProvider\n }\n\n log('all WASM modules loaded', LogLevel.INFO);\n return { memory, kbWorker, embedding };\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 log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n throw new Error(message, { cause: err });\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport {\n readFileSync,\n writeFileSync,\n renameSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 log('WASM memory not initialized', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('ipc: connection accepted', LogLevel.DEBUG);\n\n let buffer = '';\n let processingQueue = Promise.resolve();\n\n socket.on('data', (chunk: Buffer) => {\n log(\n 'ipc: data received bytes=' + String(chunk.length),\n LogLevel.DEBUG,\n );\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 log(\n `kbdb-worker: ipc connection error: ${err.message}`,\n LogLevel.WARNING,\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 log(\n `kbdb-worker: ipc server error: ${err.message}`,\n LogLevel.ERROR,\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 log(\n 'ipc: request parsed method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\n response = await handler(request);\n } catch {\n log('ipc: parse error on malformed request', LogLevel.DEBUG);\n response = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n }\n const encoded = JSON.stringify(response, bigintReplacer) + '\\n';\n log(\n 'ipc: response sent bytes=' + String(encoded.length),\n LogLevel.DEBUG,\n );\n socket.write(encoded);\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('embed called on OnnxEmbeddingProvider', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 log('Unexpected embedding API response shape', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\nimport 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 const msg = `Embedding API error: ${String(response.status)}`;\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\n/** Number of dimensions in a TF-IDF embedding vector. */\nexport const TFIDF_DIMENSIONS = 256;\n\n/** Model name reported by the TF-IDF embedding provider. */\nexport const TFIDF_MODEL_NAME = 'tfidf-v1';\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport {\n TFIDF_DIMENSIONS,\n TFIDF_MODEL_NAME,\n} from '../constants/tfidf-defaults.constant.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\n\n/**\n * Embedding provider backed by the `kbdb-default-embedding` WASM\n * module.\n *\n * Delegates `embed()` to the `embedding_tfidf_batch` WASM export,\n * reads the resulting `Float32Array` vectors from WASM linear memory,\n * and returns them as a plain JavaScript array.\n */\nexport class TfidfEmbeddingProvider implements EmbeddingProvider {\n private readonly _alloc: (size: number) => number;\n private readonly _batch: (ptr: number, len: number) => number;\n private readonly _retPtr: () => number;\n private readonly _memory: WebAssembly.Memory;\n\n /** @param wasm - instantiated `kbdb-default-embedding` WASM module */\n constructor(wasm: WebAssembly.Instance) {\n const ex = wasm.exports;\n this._memory = ex['memory'] as WebAssembly.Memory;\n this._alloc = ex['kbdb_alloc'] as (size: number) => number;\n this._batch = ex['embedding_tfidf_batch'] as (\n ptr: number,\n len: number,\n ) => number;\n this._retPtr = ex['get_return_ptr'] as () => number;\n }\n\n /**\n * Embeds a batch of texts using TF-IDF computation in WASM.\n *\n * @param texts - input strings to embed\n * @returns one 256-dimension `Float32Array` per input text\n */\n embed(texts: string[]): Promise<Float32Array[]> {\n log(\n 'embed called on TfidfEmbeddingProvider: ' +\n texts.length.toString() +\n ' texts',\n LogLevel.DEBUG,\n );\n const input = texts.join('\\n');\n const encoded = new TextEncoder().encode(input);\n const ptr = this._alloc(encoded.byteLength);\n const view = new Uint8Array(this._memory.buffer);\n view.set(encoded, ptr);\n this._batch(ptr, encoded.byteLength);\n const outPtr = this._retPtr();\n const dv = new DataView(this._memory.buffer);\n const count = dv.getUint32(outPtr, true);\n const results: Float32Array[] = [];\n let offset = outPtr + 4;\n for (let i = 0; i < count; i++) {\n const vec = new Float32Array(TFIDF_DIMENSIONS);\n for (let d = 0; d < TFIDF_DIMENSIONS; d++) {\n vec[d] = dv.getFloat32(offset, true);\n offset += 4;\n }\n results.push(vec);\n }\n return Promise.resolve(results);\n }\n\n /** Returns 256 -- the fixed dimension count for TF-IDF vectors. */\n dimensions(): number {\n return TFIDF_DIMENSIONS;\n }\n\n /** Returns `'tfidf-v1'`. */\n modelName(): string {\n return TFIDF_MODEL_NAME;\n }\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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';\nimport { TfidfEmbeddingProvider } from '../classes/tfidf-embedding-provider.class.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\n\n/**\n * Creates an embedding provider from the given configuration.\n *\n * - `undefined` + WASM instance \u2192 `TfidfEmbeddingProvider`\n * - `undefined` without WASM \u2192 `NullEmbeddingProvider` (fallback)\n * - `'none'` \u2192 `NullEmbeddingProvider`\n * - `'onnx'` \u2192 `OnnxEmbeddingProvider`\n * - `'api'` \u2192 `ApiEmbeddingProvider`\n *\n * @param config - embedding configuration from `worker.toml`\n * @param wasmInstance - optional default-embedding WASM instance\n */\nexport function createEmbeddingProvider(\n config: EmbeddingConfig | undefined,\n wasmInstance?: WebAssembly.Instance,\n): EmbeddingProvider {\n log('creating embedding provider', LogLevel.DEBUG);\n if (!config) {\n if (wasmInstance) {\n log('using TfidfEmbeddingProvider', LogLevel.DEBUG);\n return new TfidfEmbeddingProvider(wasmInstance);\n }\n log('using NullEmbeddingProvider', LogLevel.DEBUG);\n return new NullEmbeddingProvider();\n }\n if (config.provider === 'none') {\n log('using NullEmbeddingProvider', LogLevel.DEBUG);\n return new NullEmbeddingProvider();\n }\n if (config.provider === 'onnx') {\n log('using OnnxEmbeddingProvider', LogLevel.DEBUG);\n return new OnnxEmbeddingProvider(\n config.model ?? '',\n config.dimensions ?? 0,\n );\n }\n log('using ApiEmbeddingProvider', LogLevel.DEBUG);\n return new ApiEmbeddingProvider(\n config.endpoint ?? '',\n config.dimensions ?? 0,\n config.model,\n );\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('handling hybrid search', LogLevel.DEBUG);\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 const embeddingErrMsg =\n 'embedding provider not configured; ' +\n 'set [embedding] in worker.toml';\n log(embeddingErrMsg, LogLevel.ERROR);\n throw new IpcError(-32000, embeddingErrMsg);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { readFileSync } from 'node:fs';\nimport type { VectorSearchResult } from '../typings/vector-search-result.model.ts';\nimport { cosineSimilarity } from './cosine-similarity.function.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('searching vectors', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { IpcError } from '../classes/ipc-error.class.ts';\n\n/**\n * Validates that a daemon-received path is absolute and free of\n * `..` traversal segments.\n *\n * The daemon trusts paths sent by IPC clients to read from and\n * write to the filesystem. Rejecting relative and traversal paths\n * here, at the boundary, prevents a malformed or malicious client\n * from escaping the intended target directory.\n *\n * @param path - path received from an IPC request\n * @returns the same path, unchanged, when valid\n * @throws {IpcError} with code `-32602` when `path` is not\n * absolute, or contains a `..` segment\n */\nexport function validateDaemonPath(path: string): string {\n if (!path.startsWith('/')) {\n throw new IpcError(-32602, `path must be absolute: ${path}`);\n }\n if (path.split('/').includes('..')) {\n throw new IpcError(-32602, `path traversal not allowed: ${path}`);\n }\n return path;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('rebuilding vectors', LogLevel.DEBUG);\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 log(\n 'rebuilt ' + sections.length.toString() + ' vectors',\n LogLevel.INFO,\n );\n return sections.length;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { VectorIndexEntry } from '../typings/vector-index-entry.model.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('building vector index', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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\nimport type { AddSectionInput } from '../typings/add-section-input.model.ts';\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 * - `level`: `u8` flag + optional `u8` (`Option<u8>`)\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 const levelBytes =\n params.level != null\n ? new Uint8Array([0x01, params.level])\n : new Uint8Array([0x00]);\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 levelBytes,\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { encodeString } from './encode-string.function.ts';\nimport { encodeAddSectionParams } from './encode-add-section-params.function.ts';\n\nimport type { AddSectionInput } from '../typings/add-section-input.model.ts';\n\n/**\n * Encodes parameters for updating an existing section as the\n * binary format expected by the `worker_update_section` WASM\n * export.\n *\n * Wire format: the target section's `kbid` `String`, followed\n * by the same `AddSectionInput` encoding used by\n * {@link encodeAddSectionParams}.\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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 * Hierarchical level (1-6). `null` when not set.\n */\n level?: number | null;\n}\n\nfunction decodeOptionU8(\n bytes: Uint8Array,\n offset: number,\n): { value: number | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x01) {\n return { value: bytes[offset + 1], bytesRead: 2 };\n }\n return { value: null, bytesRead: 1 };\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 let level: number | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionU8(bytes, offset);\n offset += v.bytesRead;\n level = 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 level,\n };\n if (st.mimeType !== undefined) {\n record.mimeType = st.mimeType;\n }\n records.push(record);\n }\n\n return records;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport function decodeRemoveFlag(bytes: Uint8Array): boolean {\n return bytes.length > 0 && bytes[0] === 0x01;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { RecallResult } from '../../worker-client/typings/recall-result.model.ts';\n\n/**\n * Strips depth-dependent fields from a recall result.\n *\n * Depth 0 returns only `kbid`, `heading`, `type`, `content`,\n * and `docids`. Depth 1 adds `documents` and\n * `back_references`. Depth 2+ keeps all fields.\n *\n * @param result - decoded recall result from WASM\n * @param depth - requested recall depth (0-3)\n * @returns recall result with omitted fields removed\n */\nexport function stripRecallByDepth(\n result: RecallResult,\n depth: number,\n): Record<string, unknown> {\n const base: Record<string, unknown> = {\n kbid: result.kbid,\n heading: result.heading,\n type: result.type,\n content: result.content,\n docids: result.docids,\n };\n if (depth >= 1) {\n base['documents'] = result.documents;\n base['back_references'] = result.back_references;\n }\n if (depth >= 2) {\n base['siblings'] = result.siblings;\n base['references'] = result.references;\n }\n return base;\n}\n\n/**\n * Applies depth-based stripping to a single or batch\n * recall result.\n *\n * @param decoded - result from `decodeRecallResult`\n * @param depth - requested recall depth (0-3)\n * @returns the stripped result(s)\n */\nexport function applyRecallDepth(\n decoded: RecallResult | RecallResult[],\n depth: number,\n): unknown {\n if (Array.isArray(decoded)) {\n const items = decoded.map((r) => stripRecallByDepth(r, depth));\n return items.length === 1 ? items[0] : items;\n }\n return stripRecallByDepth(decoded, depth);\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { resolve } from 'node:path';\nimport type { LogLevel } from '../../log/typings/log-level.type.ts';\nimport { parseLogLevel } from '../../log/functions/parse-log-level.function.ts';\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 /** Parsed log level from `--log-level`, if provided. */\n logLevel?: LogLevel;\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 * Accepts `--log-level <level>` to configure daemon logging.\n *\n * @param argv - raw arguments\n * @param deps - injectable dependencies\n */\nexport async function runWorker(\n argv: string[],\n deps: WorkerDeps,\n): Promise<WorkerResult> {\n const { contextPath, logLevel } = parseWorkerArgs(argv);\n\n if (!contextPath) {\n return {\n error:\n 'usage: kbdb-worker <context-path>' +\n ' [--log-level <level>]',\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, logLevel };\n}\n\n/**\n * Parses `--log-level <level>` from the worker argv,\n * returning the context path and optional log level.\n */\nfunction parseWorkerArgs(argv: string[]): {\n contextPath?: string;\n logLevel?: LogLevel;\n} {\n let contextPath: string | undefined;\n let logLevel: LogLevel | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--log-level' && argv[i + 1]) {\n logLevel = parseLogLevel(argv[++i]);\n } else if (!contextPath) {\n contextPath = argv[i];\n }\n }\n\n return { contextPath, logLevel };\n}\n"],
5
- "mappings": "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",
6
- "names": ["existsSync", "writeFileSync", "join", "tmpdir", "existsSync", "readFileSync", "readdirSync", "writeFileSync", "unlinkSync", "join", "readFileSync", "readFileSync", "join", "readFileSync", "join", "dv", "wasmDir", "readFileSync", "resolve", "existsSync", "join", "readFileSync", "readFileSync", "join", "existsSync", "readdirSync", "readFileSync", "existsSync", "join", "writeFileSync", "join", "KBID_WIDTH", "HEADER_SIZE", "encoder", "writeFileSync", "join", "readdirSync", "join", "readFileSync", "existsSync", "encoder", "decodeOptionString", "totalLen", "result", "offset", "kbidBytes", "item", "decodeOptionString", "IpcError", "wasmDir", "existsSync", "unlinkSync", "join", "writeFileSync", "readFileSync", "readdirSync", "resolve", "wasmDir", "join", "tmpdir", "writeFileSync", "argv", "existsSync"]
3
+ "sources": ["../src/worker.ts", "../src/shared/worker-daemon/functions/read-config.function.ts", "../src/shared/worker-daemon/functions/start-daemon.function.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/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/constants/tfidf-defaults.constant.ts", "../src/shared/embedding/classes/tfidf-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/worker-daemon/functions/validate-daemon-path.function.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-option-u8.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/strip-recall-by-depth.function.ts", "../src/shared/worker-daemon/functions/run-worker.function.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\n/**\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';\nimport { resolveLogLevel } from './shared/log/functions/resolve-log-level.function.ts';\nimport { configureLog } from './shared/log/functions/configure-log.function.ts';\nimport { parseLogLevel } from './shared/log/functions/parse-log-level.function.ts';\nimport { log } from './shared/log/functions/log.function.ts';\nimport { LogLevel } from './shared/log/typings/log-level.type.ts';\n\nconst baseDir = resolveBaseDir(import.meta.url, import.meta.dirname);\nconst wasmDir = resolveWasmDir(baseDir.scriptDir);\n\nconst argv = getArgs();\nconst cliLogLevel = extractLogLevel(argv);\nconfigureLog({ level: resolveLogLevel(cliLogLevel) });\nlog('daemon process starting', LogLevel.DEBUG);\n\nasync function main(): Promise<void> {\n const result = await runWorker(argv, {\n existsSync,\n startDaemon,\n wasmDir,\n });\n if (result.error) {\n log(result.error, LogLevel.ERROR);\n }\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n}\n\nmain().catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n log(msg, LogLevel.ERROR);\n process.exitCode = 1;\n});\n\nfunction extractLogLevel(args: string[]): LogLevel | undefined {\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--log-level' && args[i + 1]) {\n return parseLogLevel(args[i + 1]);\n }\n }\n return undefined;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log(\n 'start-daemon: entry contextPath=' + contextPath,\n LogLevel.DEBUG,\n );\n\n const config = readConfig(contextPath);\n log(\n 'start-daemon: config loaded' +\n ' timeoutMs=' +\n String(config.timeoutMs) +\n ' embedding=' +\n (config.embedding?.provider ?? 'none'),\n LogLevel.DEBUG,\n );\n\n const hash = await computeSha256(contextPath);\n const contextId = hash.slice(0, 16);\n log('start-daemon: contextId=' + contextId, LogLevel.DEBUG);\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 log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n log('preconditions passed', LogLevel.DEBUG);\n\n try {\n await daemon.start();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n writeCrashLog(contextId, message);\n process.exit(1);\n }\n\n log('daemon started', LogLevel.INFO);\n\n log(\n 'start-daemon: registering SIGTERM/SIGINT handlers',\n LogLevel.DEBUG,\n );\n process.on('SIGTERM', () => {\n log('start-daemon: SIGTERM received', LogLevel.DEBUG);\n daemon.stop();\n });\n process.on('SIGINT', () => {\n log('start-daemon: SIGINT received', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport {\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, Socket } from 'node:net';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 { validateDaemonPath } from '../functions/validate-daemon-path.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';\nimport { applyRecallDepth } from '../functions/strip-recall-by-depth.function.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 _sockets = new Set<Socket>();\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 log(\n `database directory not found: ${this.targetDir}`,\n LogLevel.ERROR,\n );\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 const msg =\n `cannot access database directory: ${this.targetDir}` +\n ' -- permission denied';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\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 log(\n 'start: loading wasm modules ctx=' + this.ctx,\n LogLevel.DEBUG,\n );\n const wasmModules = await loadWasmModules(\n this.config,\n this._wasmDir,\n );\n this._wasmModules = wasmModules;\n log('start: wasm modules loaded', LogLevel.DEBUG);\n\n this._embeddingProvider = createEmbeddingProvider(\n this.config.embedding,\n wasmModules.embedding,\n );\n log(\n 'start: embedding provider created embedding=' +\n (this.config.embedding?.provider ?? 'none'),\n LogLevel.DEBUG,\n );\n\n this.initWorkerContext();\n log('start: worker context initialized', LogLevel.DEBUG);\n\n this.runStartupIntegrityCheck();\n log(\n 'start: integrity check done ok=' + String(this._integrityOk),\n LogLevel.DEBUG,\n );\n\n const ipcPath = getIpcPath(this.ctx);\n\n if (existsSync(ipcPath)) {\n log('start: removing stale socket ' + ipcPath, LogLevel.DEBUG);\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 log('IPC server listening on ' + ipcPath, LogLevel.INFO);\n\n this._server.on('connection', (socket: Socket) => {\n this._sockets.add(socket);\n this.incrementConnections();\n this.resetIdleTimer();\n log(\n 'client connected (count: ' +\n String(this._connectionCount) +\n ')',\n LogLevel.DEBUG,\n );\n socket.on('close', () => {\n this._sockets.delete(socket);\n this.decrementConnections();\n log(\n 'client disconnected (count: ' +\n String(this._connectionCount) +\n ')',\n LogLevel.DEBUG,\n );\n if (this._connectionCount === 0) {\n this.resetIdleTimer();\n }\n });\n });\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n writeFileSync(pidPath, process.pid.toString());\n log(\n 'start: pid file written pid=' + String(process.pid),\n LogLevel.DEBUG,\n );\n\n log('start: daemon ready ctx=' + this.ctx, LogLevel.DEBUG);\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 log(\n 'stop: entry sockets=' + String(this._sockets.size),\n LogLevel.DEBUG,\n );\n log('shutting down', LogLevel.INFO);\n if (this._idleTimer !== null) {\n clearTimeout(this._idleTimer);\n this._idleTimer = null;\n }\n\n for (const socket of this._sockets) {\n socket.destroy();\n }\n this._sockets.clear();\n\n if (this._server !== null) {\n this._server.close();\n this._server = null;\n log('stop: server closed', LogLevel.DEBUG);\n }\n\n this._wasmModules = null;\n log('stop: wasm resources released', LogLevel.DEBUG);\n\n const pidPath = join(tmpdir(), `kbdb-${this.ctx}.pid`);\n try {\n unlinkSync(pidPath);\n log('stop: pid file removed', LogLevel.DEBUG);\n } catch {\n // ignore cleanup errors\n }\n\n const ipcPath = getIpcPath(this.ctx);\n try {\n unlinkSync(ipcPath);\n log('stop: socket file removed', LogLevel.DEBUG);\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 log('stop: daemon exiting', LogLevel.DEBUG);\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 log(\n 'handle-request: method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\n\n const params = request.params as\n | Record<string, unknown>\n | undefined;\n if (params === undefined || params.ctx !== this.ctx) {\n log(\n 'handle-request: context mismatch id=' + String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: success method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: ipc error method=' +\n request.method +\n ' id=' +\n String(request.id) +\n ' code=' +\n String(err.code),\n LogLevel.DEBUG,\n );\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 log(\n 'handle-request: error method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\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 log(\n 'idle timer started (' +\n String(this.config.timeoutMs) +\n 'ms)',\n LogLevel.DEBUG,\n );\n this._idleTimer = setTimeout(() => {\n log(\n 'idle timer fired: shutting down ctx=' + this.ctx,\n LogLevel.DEBUG,\n );\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 const msg =\n `cannot read database directory: ${this.targetDir}` +\n ' -- permission denied';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n const version = parseCatalogVersion(text);\n if (version === null) {\n const msg =\n 'database version 0 requires migration to version ' +\n String(DB_FORMAT_VERSION) +\n ' -- run `kbdb --migrate` before starting the daemon';\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n if (version > DB_FORMAT_VERSION) {\n const msg =\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 log(msg, LogLevel.ERROR);\n throw new Error(msg);\n }\n\n if (version < DB_FORMAT_VERSION) {\n const msg =\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 log(msg, LogLevel.ERROR);\n throw new Error(msg);\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 title = (params['title'] as string | null) ?? null;\n const explicitDocid = (params['docid'] as string | null) ?? null;\n const docid =\n explicitDocid ??\n (typeName && title ? `${typeName}:${title}` : null);\n const input: AddSectionInput = {\n sectionType: semanticType,\n mimeType: params['mimeType'] as string | undefined,\n content: (params['content'] as string | undefined) ?? '',\n title,\n description: (params['description'] as string | null) ?? null,\n docid,\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 level:\n typeof params['level'] === 'number'\n ? params['level']\n : undefined,\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 items: [decoded.kbid],\n total: 1,\n offset: 0,\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 level:\n typeof params['level'] === 'number'\n ? params['level']\n : undefined,\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 type: 'text/markdown',\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 const decoded = decodeRecallResult(bytes);\n return applyRecallDepth(decoded, depth);\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 ctxPath = kv['ctx_path'] || kv['context_path'] || '';\n return {\n initialized: kv['initialized'] === 'true',\n context_path: ctxPath,\n contextPath: ctxPath,\n document_count: Number(\n kv['document_count'] || kv['documents'] || 0,\n ),\n section_count: Number(\n kv['section_count'] || kv['sections'] || 0,\n ),\n wasm_memory_bytes:\n this._wasmModules?.memory.buffer.byteLength ?? 0,\n };\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 const kv = decodeKeyValueText(text);\n const divContent = kv['divergent_content'] || '';\n const errors: Record<string, string>[] = [];\n if (divContent) {\n errors.push({\n type: 'divergent_content',\n entity: divContent,\n detail: 'sections share source key with different content',\n });\n }\n return {\n type: 'integrity',\n ok: kv['ok'] === 'true',\n sections_checked: Number(kv['sections_checked'] || 0),\n documents_checked: Number(kv['documents_checked'] || 0),\n references_checked: Number(kv['references_checked'] || 0),\n elapsed_ms: Number(kv['elapsed_ms'] || 0),\n errors,\n divergent_content: divContent,\n };\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 join(this.targetDir, 'kbdb-export');\n validateDaemonPath(targetPath);\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 validateDaemonPath(sourcePath);\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 log('write-lock: acquired', LogLevel.DEBUG);\n return Promise.resolve();\n }\n log(\n 'write-lock: queued depth=' +\n String(this._writeQueue.length + 1),\n LogLevel.DEBUG,\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 log(\n 'write-lock: released to next waiter depth=' +\n String(this._writeQueue.length),\n LogLevel.DEBUG,\n );\n next.resolve();\n } else {\n this._writeLocked = false;\n log('write-lock: released', LogLevel.DEBUG);\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 log(\n '[kbdb-worker] startup integrity check failed: ' +\n this._integrityErrors.join(', '),\n LogLevel.WARNING,\n );\n }\n } catch {\n this._integrityOk = false;\n this._integrityErrors = ['integrity_check_failed'];\n log(\n '[kbdb-worker] startup integrity check threw an error',\n LogLevel.WARNING,\n );\n }\n }\n\n // -- WASM bridge primitives --\n\n private getExport(name: string): WasmFn {\n if (this._wasmModules === null) {\n log('WASM modules not loaded', LogLevel.ERROR);\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 log(`WASM export not found: ${name}`, LogLevel.ERROR);\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 log('WASM memory overflow', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('loading WASM module: kb-worker', LogLevel.DEBUG);\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 const embPath = joinPath(\n wasmDir,\n 'default-embedding',\n 'kbdb_default_embedding_bg.wasm',\n );\n let embedding: WebAssembly.Instance | undefined;\n try {\n const embBytes = await readWasmFile(embPath, 'default-embedding');\n const embModule = await WebAssembly.compile(embBytes);\n embedding = await WebAssembly.instantiate(embModule, {});\n } catch {\n // optional -- gracefully degrade to NullEmbeddingProvider\n }\n\n log('all WASM modules loaded', LogLevel.INFO);\n return { memory, kbWorker, embedding };\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 log(`kbdb-worker: ${message}`, LogLevel.ERROR);\n throw new Error(message, { cause: err });\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport {\n readFileSync,\n writeFileSync,\n renameSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 log('WASM memory not initialized', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('ipc: connection accepted', LogLevel.DEBUG);\n\n let buffer = '';\n let processingQueue = Promise.resolve();\n\n socket.on('data', (chunk: Buffer) => {\n log(\n 'ipc: data received bytes=' + String(chunk.length),\n LogLevel.DEBUG,\n );\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 log(\n `kbdb-worker: ipc connection error: ${err.message}`,\n LogLevel.WARNING,\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 log(\n `kbdb-worker: ipc server error: ${err.message}`,\n LogLevel.ERROR,\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 log(\n 'ipc: request parsed method=' +\n request.method +\n ' id=' +\n String(request.id),\n LogLevel.DEBUG,\n );\n response = await handler(request);\n } catch {\n log('ipc: parse error on malformed request', LogLevel.DEBUG);\n response = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n }\n const encoded = JSON.stringify(response, bigintReplacer) + '\\n';\n log(\n 'ipc: response sent bytes=' + String(encoded.length),\n LogLevel.DEBUG,\n );\n socket.write(encoded);\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('embed called on OnnxEmbeddingProvider', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\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 log('Unexpected embedding API response shape', LogLevel.ERROR);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\nimport 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 const msg = `Embedding API error: ${String(response.status)}`;\n log(msg, LogLevel.ERROR);\n throw new Error(msg);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\n/** Number of dimensions in a TF-IDF embedding vector. */\nexport const TFIDF_DIMENSIONS = 256;\n\n/** Model name reported by the TF-IDF embedding provider. */\nexport const TFIDF_MODEL_NAME = 'tfidf-v1';\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { EmbeddingProvider } from '../typings/embedding-provider.interface.ts';\nimport {\n TFIDF_DIMENSIONS,\n TFIDF_MODEL_NAME,\n} from '../constants/tfidf-defaults.constant.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\n\n/**\n * Embedding provider backed by the `kbdb-default-embedding` WASM\n * module.\n *\n * Delegates `embed()` to the `embedding_tfidf_batch` WASM export,\n * reads the resulting `Float32Array` vectors from WASM linear memory,\n * and returns them as a plain JavaScript array.\n */\nexport class TfidfEmbeddingProvider implements EmbeddingProvider {\n private readonly _alloc: (size: number) => number;\n private readonly _batch: (ptr: number, len: number) => number;\n private readonly _retPtr: () => number;\n private readonly _memory: WebAssembly.Memory;\n\n /** @param wasm - instantiated `kbdb-default-embedding` WASM module */\n constructor(wasm: WebAssembly.Instance) {\n const ex = wasm.exports;\n this._memory = ex['memory'] as WebAssembly.Memory;\n this._alloc = ex['kbdb_alloc'] as (size: number) => number;\n this._batch = ex['embedding_tfidf_batch'] as (\n ptr: number,\n len: number,\n ) => number;\n this._retPtr = ex['get_return_ptr'] as () => number;\n }\n\n /**\n * Embeds a batch of texts using TF-IDF computation in WASM.\n *\n * @param texts - input strings to embed\n * @returns one 256-dimension `Float32Array` per input text\n */\n embed(texts: string[]): Promise<Float32Array[]> {\n log(\n 'embed called on TfidfEmbeddingProvider: ' +\n texts.length.toString() +\n ' texts',\n LogLevel.DEBUG,\n );\n const input = texts.join('\\n');\n const encoded = new TextEncoder().encode(input);\n const ptr = this._alloc(encoded.byteLength);\n const view = new Uint8Array(this._memory.buffer);\n view.set(encoded, ptr);\n this._batch(ptr, encoded.byteLength);\n const outPtr = this._retPtr();\n const dv = new DataView(this._memory.buffer);\n const count = dv.getUint32(outPtr, true);\n const results: Float32Array[] = [];\n let offset = outPtr + 4;\n for (let i = 0; i < count; i++) {\n const vec = new Float32Array(TFIDF_DIMENSIONS);\n for (let d = 0; d < TFIDF_DIMENSIONS; d++) {\n vec[d] = dv.getFloat32(offset, true);\n offset += 4;\n }\n results.push(vec);\n }\n return Promise.resolve(results);\n }\n\n /** Returns 256 -- the fixed dimension count for TF-IDF vectors. */\n dimensions(): number {\n return TFIDF_DIMENSIONS;\n }\n\n /** Returns `'tfidf-v1'`. */\n modelName(): string {\n return TFIDF_MODEL_NAME;\n }\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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';\nimport { TfidfEmbeddingProvider } from '../classes/tfidf-embedding-provider.class.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.ts';\n\n/**\n * Creates an embedding provider from the given configuration.\n *\n * - `undefined` + WASM instance \u2192 `TfidfEmbeddingProvider`\n * - `undefined` without WASM \u2192 `NullEmbeddingProvider` (fallback)\n * - `'none'` \u2192 `NullEmbeddingProvider`\n * - `'onnx'` \u2192 `OnnxEmbeddingProvider`\n * - `'api'` \u2192 `ApiEmbeddingProvider`\n *\n * @param config - embedding configuration from `worker.toml`\n * @param wasmInstance - optional default-embedding WASM instance\n */\nexport function createEmbeddingProvider(\n config: EmbeddingConfig | undefined,\n wasmInstance?: WebAssembly.Instance,\n): EmbeddingProvider {\n log('creating embedding provider', LogLevel.DEBUG);\n if (!config) {\n if (wasmInstance) {\n log('using TfidfEmbeddingProvider', LogLevel.DEBUG);\n return new TfidfEmbeddingProvider(wasmInstance);\n }\n log('using NullEmbeddingProvider', LogLevel.DEBUG);\n return new NullEmbeddingProvider();\n }\n if (config.provider === 'none') {\n log('using NullEmbeddingProvider', LogLevel.DEBUG);\n return new NullEmbeddingProvider();\n }\n if (config.provider === 'onnx') {\n log('using OnnxEmbeddingProvider', LogLevel.DEBUG);\n return new OnnxEmbeddingProvider(\n config.model ?? '',\n config.dimensions ?? 0,\n );\n }\n log('using ApiEmbeddingProvider', LogLevel.DEBUG);\n return new ApiEmbeddingProvider(\n config.endpoint ?? '',\n config.dimensions ?? 0,\n config.model,\n );\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('handling hybrid search', LogLevel.DEBUG);\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 const embeddingErrMsg =\n 'embedding provider not configured; ' +\n 'set [embedding] in worker.toml';\n log(embeddingErrMsg, LogLevel.ERROR);\n throw new IpcError(-32000, embeddingErrMsg);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { readFileSync } from 'node:fs';\nimport type { VectorSearchResult } from '../typings/vector-search-result.model.ts';\nimport { cosineSimilarity } from './cosine-similarity.function.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('searching vectors', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { IpcError } from '../classes/ipc-error.class.ts';\n\n/**\n * Validates that a daemon-received path is absolute and free of\n * `..` traversal segments.\n *\n * The daemon trusts paths sent by IPC clients to read from and\n * write to the filesystem. Rejecting relative and traversal paths\n * here, at the boundary, prevents a malformed or malicious client\n * from escaping the intended target directory.\n *\n * @param path - path received from an IPC request\n * @returns the same path, unchanged, when valid\n * @throws {IpcError} with code `-32602` when `path` is not\n * absolute, or contains a `..` segment\n */\nexport function validateDaemonPath(path: string): string {\n if (!path.startsWith('/')) {\n throw new IpcError(-32602, `path must be absolute: ${path}`);\n }\n if (path.split('/').includes('..')) {\n throw new IpcError(-32602, `path traversal not allowed: ${path}`);\n }\n return path;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('rebuilding vectors', LogLevel.DEBUG);\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 log(\n 'rebuilt ' + sections.length.toString() + ' vectors',\n LogLevel.INFO,\n );\n return sections.length;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { VectorIndexEntry } from '../typings/vector-index-entry.model.ts';\nimport { log } from '../../log/functions/log.function.ts';\nimport { LogLevel } from '../../log/typings/log-level.type.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 log('building vector index', LogLevel.DEBUG);\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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\nimport type { AddSectionInput } from '../typings/add-section-input.model.ts';\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 * - `level`: `u8` flag + optional `u8` (`Option<u8>`)\n * - `parent`: `u8` flag + optional `String`\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 const levelBytes =\n params.level != null\n ? new Uint8Array([0x01, params.level])\n : new Uint8Array([0x00]);\n const parentBytes = encodeOptionString(params.parent);\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 levelBytes,\n parentBytes,\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { encodeString } from './encode-string.function.ts';\nimport { encodeAddSectionParams } from './encode-add-section-params.function.ts';\n\nimport type { AddSectionInput } from '../typings/add-section-input.model.ts';\n\n/**\n * Encodes parameters for updating an existing section as the\n * binary format expected by the `worker_update_section` WASM\n * export.\n *\n * Wire format: the target section's `kbid` `String`, followed\n * by the same `AddSectionInput` encoding used by\n * {@link encodeAddSectionParams}.\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nconst 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\n/**\n * Decodes an `Option<u8>` from WASM binary output.\n *\n * Wire format: `0x00` = None, `0x01 <byte>` = Some.\n */\nexport function decodeOptionU8(\n bytes: Uint8Array,\n offset: number,\n): { value: number | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x01) {\n return { value: bytes[offset + 1], bytesRead: 2 };\n }\n return { value: null, bytesRead: 1 };\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeF32 } from './decode-f32.function.ts';\nimport { decodeOptionU8 } from './decode-option-u8.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 /** Heading level (1-6), or `null` when unset. */\n level: number | null;\n /** Kbid of the parent section, or `null`. */\n parent: string | null;\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 * - `level`: `Option<u8>`\n * - `parent`: `Option<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 // level and parent added after created_at\n const optLevel = decodeOptionU8(bytes, offset);\n offset += optLevel.bytesRead;\n\n const optParent = decodeOptionString(bytes, offset);\n offset += optParent.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 level: optLevel.value,\n parent: optParent.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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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 * Hierarchical level (1-6). `null` when not set.\n */\n level?: number | null;\n /**\n * KBDB ID of the parent section for nesting. `null` for root.\n */\n parent?: string | null;\n}\n\nfunction decodeOptionU8(\n bytes: Uint8Array,\n offset: number,\n): { value: number | null; bytesRead: number } {\n const tag = bytes[offset];\n if (tag === 0x01) {\n return { value: bytes[offset + 1], bytesRead: 2 };\n }\n return { value: null, bytesRead: 1 };\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 let level: number | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionU8(bytes, offset);\n offset += v.bytesRead;\n level = v.value;\n }\n let parent: string | null = null;\n if (offset < bytes.length) {\n const v = decodeOptionString(bytes, offset);\n offset += v.bytesRead;\n parent = 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 level,\n parent,\n };\n if (st.mimeType !== undefined) {\n record.mimeType = st.mimeType;\n }\n records.push(record);\n }\n\n return records;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nexport function decodeRemoveFlag(bytes: Uint8Array): boolean {\n return bytes.length > 0 && bytes[0] === 0x01;\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { decodeString } from './decode-string.function.ts';\nimport { decodeU32 } from './decode-u32.function.ts';\nimport { decodeOptionU8 } from './decode-option-u8.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 * Option<u8> level\n * Option<String> parent\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 const optLevel = decodeOptionU8(bytes, pos);\n pos += optLevel.bytesRead;\n const optParent = decodeOptionString(bytes, pos);\n pos += optParent.bytesRead;\n\n return {\n value: {\n kbid: kbid.value,\n heading: heading.value,\n type: sectionType.value,\n content: content.value,\n level: optLevel.value,\n parent: optParent.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 const secLevel = decodeOptionU8(bytes, pos);\n pos += secLevel.bytesRead;\n const secParent = decodeOptionString(bytes, pos);\n pos += secParent.bytesRead;\n\n sections.push({\n kbid: secKbid.value,\n heading: secHeading.value,\n type: secType.value,\n level: secLevel.value,\n parent: secParent.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 optLevel = decodeOptionU8(bytes, pos);\n pos += optLevel.bytesRead;\n const optParent = decodeOptionString(bytes, pos);\n pos += optParent.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 level: optLevel.value,\n parent: optParent.value,\n docids,\n documents,\n back_references,\n siblings,\n references,\n },\n bytesRead: pos - startOffset,\n };\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { 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", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport type { RecallResult } from '../../worker-client/typings/recall-result.model.ts';\n\n/**\n * Strips depth-dependent fields from a recall result.\n *\n * Depth 0 returns only `kbid`, `heading`, `type`, `content`,\n * and `docids`. Depth 1 adds `documents` and\n * `back_references`. Depth 2+ keeps all fields.\n *\n * @param result - decoded recall result from WASM\n * @param depth - requested recall depth (0-3)\n * @returns recall result with omitted fields removed\n */\nexport function stripRecallByDepth(\n result: RecallResult,\n depth: number,\n): Record<string, unknown> {\n const base: Record<string, unknown> = {\n kbid: result.kbid,\n heading: result.heading,\n type: result.type,\n content: result.content,\n docids: result.docids,\n };\n if (depth >= 1) {\n base['documents'] = result.documents;\n base['back_references'] = result.back_references;\n }\n if (depth >= 2) {\n base['siblings'] = result.siblings;\n base['references'] = result.references;\n }\n return base;\n}\n\n/**\n * Applies depth-based stripping to a single or batch\n * recall result.\n *\n * @param decoded - result from `decodeRecallResult`\n * @param depth - requested recall depth (0-3)\n * @returns the stripped result(s)\n */\nexport function applyRecallDepth(\n decoded: RecallResult | RecallResult[],\n depth: number,\n): unknown {\n if (Array.isArray(decoded)) {\n const items = decoded.map((r) => stripRecallByDepth(r, depth));\n return items.length === 1 ? items[0] : items;\n }\n return stripRecallByDepth(decoded, depth);\n}\n", "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright (C) 2026 Diko Tech Slave\n\nimport { resolve } from 'node:path';\nimport type { LogLevel } from '../../log/typings/log-level.type.ts';\nimport { parseLogLevel } from '../../log/functions/parse-log-level.function.ts';\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 /** Parsed log level from `--log-level`, if provided. */\n logLevel?: LogLevel;\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 * Accepts `--log-level <level>` to configure daemon logging.\n *\n * @param argv - raw arguments\n * @param deps - injectable dependencies\n */\nexport async function runWorker(\n argv: string[],\n deps: WorkerDeps,\n): Promise<WorkerResult> {\n const { contextPath, logLevel } = parseWorkerArgs(argv);\n\n if (!contextPath) {\n return {\n error:\n 'usage: kbdb-worker <context-path>' +\n ' [--log-level <level>]',\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, logLevel };\n}\n\n/**\n * Parses `--log-level <level>` from the worker argv,\n * returning the context path and optional log level.\n */\nfunction parseWorkerArgs(argv: string[]): {\n contextPath?: string;\n logLevel?: LogLevel;\n} {\n let contextPath: string | undefined;\n let logLevel: LogLevel | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--log-level' && argv[i + 1]) {\n logLevel = parseLogLevel(argv[++i]);\n } else if (!contextPath) {\n contextPath = argv[i];\n }\n }\n\n return { contextPath, logLevel };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "writeFileSync", "join", "tmpdir", "existsSync", "readFileSync", "readdirSync", "writeFileSync", "unlinkSync", "join", "readFileSync", "readFileSync", "join", "readFileSync", "join", "dv", "wasmDir", "readFileSync", "resolve", "existsSync", "join", "readFileSync", "readFileSync", "join", "existsSync", "readdirSync", "readFileSync", "existsSync", "join", "writeFileSync", "join", "KBID_WIDTH", "HEADER_SIZE", "encoder", "writeFileSync", "join", "readdirSync", "join", "readFileSync", "existsSync", "encoder", "decodeOptionU8", "decodeOptionString", "totalLen", "result", "offset", "kbidBytes", "item", "decodeOptionString", "IpcError", "wasmDir", "existsSync", "unlinkSync", "join", "writeFileSync", "readFileSync", "readdirSync", "resolve", "wasmDir", "join", "tmpdir", "writeFileSync", "argv", "existsSync"]
7
7
  }