@dikolab/kbdb 0.3.2 → 0.4.1

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