@dikolab/kbdb 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/README.md +108 -126
  2. package/dist/chunk-BJPSPNGX.mjs +223 -0
  3. package/dist/chunk-BJPSPNGX.mjs.map +7 -0
  4. package/dist/cli.cjs +956 -319
  5. package/dist/cli.cjs.map +4 -4
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.mjs +840 -321
  8. package/dist/cli.mjs.map +4 -4
  9. package/dist/kbdb-worker.cjs +714 -94
  10. package/dist/kbdb-worker.cjs.map +4 -4
  11. package/dist/mod.cjs +122 -16
  12. package/dist/mod.cjs.map +3 -3
  13. package/dist/mod.d.ts +23 -2
  14. package/dist/mod.mjs +121 -16
  15. package/dist/mod.mjs.map +3 -3
  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 +17 -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/functions/append-vector-entry.function.d.ts +14 -0
  38. package/dist/src/shared/embedding/functions/create-embedding-provider.function.d.ts +12 -0
  39. package/dist/src/shared/embedding/functions/detect-stale-vectors.function.d.ts +16 -0
  40. package/dist/src/shared/embedding/functions/parse-api-embedding-response.function.d.ts +11 -0
  41. package/dist/src/shared/embedding/functions/rebuild-vectors.function.d.ts +15 -0
  42. package/dist/src/shared/embedding/functions/scan-semantic-contradictions.function.d.ts +13 -0
  43. package/dist/src/shared/embedding/index.d.ts +7 -0
  44. package/dist/src/shared/embedding/typings/semantic-contradiction.model.d.ts +21 -0
  45. package/dist/src/shared/embedding/typings/stale-vectors-report.model.d.ts +16 -0
  46. package/dist/src/shared/mcp/classes/mcp-server.class.d.ts +22 -2
  47. package/dist/src/shared/mcp/functions/create-mcp-server.function.d.ts +6 -1
  48. package/dist/src/shared/mcp/functions/has-sampling-capability.function.d.ts +8 -0
  49. package/dist/src/shared/mcp/functions/run-auto-capture.function.d.ts +26 -0
  50. package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +2 -0
  51. package/dist/src/shared/mcp/typings/mcp-integrity-check-result.model.d.ts +24 -0
  52. package/dist/src/shared/mcp/typings/mcp-worker-client.interface.d.ts +3 -1
  53. package/dist/src/shared/version/constants/version.constant.d.ts +1 -1
  54. package/dist/src/shared/wasm-codec/typings/paged-search-result.model.d.ts +2 -0
  55. package/dist/src/shared/worker-client/classes/worker-client.class.d.ts +31 -1
  56. package/dist/src/shared/worker-client/constants/request-timeout.constant.d.ts +2 -0
  57. package/dist/src/shared/worker-client/constants/retry-defaults.constant.d.ts +2 -0
  58. package/dist/src/shared/worker-client/functions/get-or-create-client.function.d.ts +20 -0
  59. package/dist/src/shared/worker-client/functions/retry-on-timeout.function.d.ts +17 -0
  60. package/dist/src/shared/worker-client/index.d.ts +4 -1
  61. package/dist/src/shared/worker-client/typings/import-result.model.d.ts +16 -0
  62. package/dist/src/shared/worker-client/typings/integrity-check-result.model.d.ts +24 -0
  63. package/dist/src/shared/worker-client/typings/search-params.model.d.ts +4 -0
  64. package/dist/src/shared/worker-client/typings/search-result.model.d.ts +6 -0
  65. package/dist/src/shared/worker-client/typings/worker-client-options.interface.d.ts +7 -0
  66. package/dist/src/shared/worker-daemon/classes/worker-daemon.class.d.ts +5 -0
  67. package/dist/src/shared/worker-daemon/functions/create-ipc-server.function.d.ts +11 -11
  68. package/dist/src/shared/worker-daemon/functions/embed-after-learn.function.d.ts +13 -0
  69. package/dist/src/shared/worker-daemon/functions/handle-hybrid-search.function.d.ts +44 -0
  70. package/dist/src/shared/worker-daemon/functions/handle-import.function.d.ts +14 -0
  71. package/dist/src/shared/worker-daemon/functions/handle-read-ops.function.d.ts +7 -1
  72. package/dist/src/shared/worker-daemon/functions/handle-write-ops.function.d.ts +9 -4
  73. package/dist/src/shared/worker-daemon/typings/handler-context.interface.d.ts +3 -0
  74. package/dist/wasm/fs-database/kbdb_fs_database.d.ts +16 -85
  75. package/dist/wasm/fs-database/kbdb_fs_database.js +16 -85
  76. package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  77. package/dist/wasm/kb-worker/kbdb_worker.d.ts +20 -115
  78. package/dist/wasm/kb-worker/kbdb_worker.js +20 -115
  79. package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  80. package/dist/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
  81. package/dist/worker.d.ts +8 -0
  82. package/dist/worker.mjs +606 -102
  83. package/dist/worker.mjs.map +4 -4
  84. package/docs/details/README.md +4 -0
  85. package/docs/details/agent-tooling.md +122 -0
  86. package/docs/details/cli.md +78 -12
  87. package/docs/details/knowledge-base.md +173 -0
  88. package/docs/details/library-api.md +42 -2
  89. package/docs/details/mcp-server.md +39 -8
  90. package/docs/details/search-and-ranking.md +56 -0
  91. package/docs/goals/cli.md +110 -34
  92. package/docs/goals/mcp.md +22 -19
  93. package/docs/goals/query-parser.md +8 -0
  94. package/docs/goals/worker-client.md +62 -1
  95. package/docs/goals/worker-daemon.md +52 -10
  96. package/docs/modules/typescript/cli.md +1 -1
  97. package/docs/modules/typescript/shared/cli/functions.md +116 -13
  98. package/docs/modules/typescript/shared/cli/module.md +33 -20
  99. package/docs/modules/typescript/shared/cli/typings.md +4 -0
  100. package/docs/modules/typescript/shared/embedding/functions.md +104 -25
  101. package/docs/modules/typescript/shared/mcp/module.md +1 -1
  102. package/docs/modules/typescript/shared/mcp/typings.md +8 -1
  103. package/docs/modules/typescript/shared/worker-client/module.md +9 -1
  104. package/docs/modules/typescript/shared/worker-client/typings.md +3 -0
  105. package/docs/modules/typescript/shared/worker-daemon/module.md +6 -3
  106. package/docs/overview.md +43 -22
  107. package/docs/release-notes/0.3.1.md +10 -0
  108. package/docs/release-notes/0.3.2.md +64 -0
  109. package/docs/release-notes/0.4.0.md +80 -0
  110. package/docs/release-notes/README.md +2 -0
  111. package/mod.ts +33 -15
  112. package/package.json +11 -10
  113. package/dist/chunk-JG2UCKLI.mjs +0 -95
  114. package/dist/chunk-JG2UCKLI.mjs.map +0 -7
  115. package/src/cli.ts +0 -71
  116. package/src/shared/auto-capture/classes/auto-capture-controller.class.ts +0 -62
  117. package/src/shared/auto-capture/constants/auto-capture-defaults.constant.ts +0 -15
  118. package/src/shared/auto-capture/functions/build-capture-prompt.function.ts +0 -27
  119. package/src/shared/auto-capture/functions/evaluate-trigger.function.ts +0 -50
  120. package/src/shared/auto-capture/index.ts +0 -7
  121. package/src/shared/auto-capture/typings/auto-capture-config.interface.ts +0 -13
  122. package/src/shared/auto-capture/typings/auto-capture-state.interface.ts +0 -13
  123. package/src/shared/auto-capture/typings/auto-capture-trigger.interface.ts +0 -7
  124. package/src/shared/cli/constants/defaults.constant.ts +0 -19
  125. package/src/shared/cli/constants/global-help.constant.ts +0 -73
  126. package/src/shared/cli/constants/help-text.constant.ts +0 -4
  127. package/src/shared/cli/constants/leaf-help.constant.ts +0 -219
  128. package/src/shared/cli/constants/memory-protocol-body.constant.ts +0 -39
  129. package/src/shared/cli/constants/query-guidance-body.constant.ts +0 -37
  130. package/src/shared/cli/constants/subcommand-help.constant.ts +0 -195
  131. package/src/shared/cli/functions/collect-files.function.ts +0 -55
  132. package/src/shared/cli/functions/compute-section-kbid.function.ts +0 -49
  133. package/src/shared/cli/functions/dispatch-command.function.ts +0 -390
  134. package/src/shared/cli/functions/ensure-db.function.ts +0 -21
  135. package/src/shared/cli/functions/error-to-message.function.ts +0 -9
  136. package/src/shared/cli/functions/find-db.function.ts +0 -20
  137. package/src/shared/cli/functions/format-mcp-output.function.ts +0 -41
  138. package/src/shared/cli/functions/format-output.function.ts +0 -95
  139. package/src/shared/cli/functions/format-text-output.function.ts +0 -42
  140. package/src/shared/cli/functions/generate-group-help.function.ts +0 -41
  141. package/src/shared/cli/functions/generate-help.function.ts +0 -654
  142. package/src/shared/cli/functions/handle-data-command.function.ts +0 -67
  143. package/src/shared/cli/functions/handle-mcp.function.ts +0 -56
  144. package/src/shared/cli/functions/handle-migrate.function.ts +0 -64
  145. package/src/shared/cli/functions/hydrate-search-previews.function.ts +0 -29
  146. package/src/shared/cli/functions/install-default-skills.function.ts +0 -296
  147. package/src/shared/cli/functions/is-stdin-tty.function.ts +0 -12
  148. package/src/shared/cli/functions/parse-args.function.ts +0 -156
  149. package/src/shared/cli/functions/prompt-user.function.ts +0 -36
  150. package/src/shared/cli/functions/resolve-skill-names.function.ts +0 -43
  151. package/src/shared/cli/functions/run-agent-create.function.ts +0 -114
  152. package/src/shared/cli/functions/run-agent-delete.function.ts +0 -47
  153. package/src/shared/cli/functions/run-agent-get.function.ts +0 -166
  154. package/src/shared/cli/functions/run-agent-list.function.ts +0 -58
  155. package/src/shared/cli/functions/run-check.function.ts +0 -159
  156. package/src/shared/cli/functions/run-cli.function.ts +0 -299
  157. package/src/shared/cli/functions/run-content.function.ts +0 -47
  158. package/src/shared/cli/functions/run-db-init.function.ts +0 -44
  159. package/src/shared/cli/functions/run-db-migrate.function.ts +0 -40
  160. package/src/shared/cli/functions/run-export.function.ts +0 -40
  161. package/src/shared/cli/functions/run-gc.function.ts +0 -51
  162. package/src/shared/cli/functions/run-init.function.ts +0 -93
  163. package/src/shared/cli/functions/run-learn.function.ts +0 -223
  164. package/src/shared/cli/functions/run-migrate.function.ts +0 -85
  165. package/src/shared/cli/functions/run-rebuild.function.ts +0 -47
  166. package/src/shared/cli/functions/run-recall.function.ts +0 -66
  167. package/src/shared/cli/functions/run-search.function.ts +0 -133
  168. package/src/shared/cli/functions/run-skill-delete.function.ts +0 -47
  169. package/src/shared/cli/functions/run-skill-get.function.ts +0 -90
  170. package/src/shared/cli/functions/run-skill-learn.function.ts +0 -70
  171. package/src/shared/cli/functions/run-skill-list.function.ts +0 -74
  172. package/src/shared/cli/functions/run-status.function.ts +0 -29
  173. package/src/shared/cli/functions/run-unlearn.function.ts +0 -58
  174. package/src/shared/cli/functions/version-gate.function.ts +0 -44
  175. package/src/shared/cli/functions/wrap-command.function.ts +0 -34
  176. package/src/shared/cli/index.ts +0 -55
  177. package/src/shared/cli/typings/agent-create-client.interface.ts +0 -47
  178. package/src/shared/cli/typings/agent-get-client.interface.ts +0 -39
  179. package/src/shared/cli/typings/check-client.interface.ts +0 -66
  180. package/src/shared/cli/typings/cli-deps.interface.ts +0 -54
  181. package/src/shared/cli/typings/cli-options.interface.ts +0 -72
  182. package/src/shared/cli/typings/command-result.model.ts +0 -15
  183. package/src/shared/cli/typings/disconnectable-client.interface.ts +0 -29
  184. package/src/shared/cli/typings/dispatch-client.type.ts +0 -46
  185. package/src/shared/cli/typings/learn-client.interface.ts +0 -53
  186. package/src/shared/cli/typings/learn-io.interface.ts +0 -5
  187. package/src/shared/cli/typings/learn-result.model.ts +0 -27
  188. package/src/shared/cli/typings/search-client.interface.ts +0 -73
  189. package/src/shared/cli/typings/search-display.model.ts +0 -54
  190. package/src/shared/dir-resolver/functions/join-path.function.ts +0 -13
  191. package/src/shared/dir-resolver/functions/resolve-base-dir.function.ts +0 -25
  192. package/src/shared/dir-resolver/functions/resolve-wasm-dir.function.ts +0 -5
  193. package/src/shared/dir-resolver/functions/resolve-worker-script.function.ts +0 -13
  194. package/src/shared/dir-resolver/index.ts +0 -11
  195. package/src/shared/dir-resolver/typings/base-dir.interface.ts +0 -4
  196. package/src/shared/embedding/classes/null-embedding-provider.class.ts +0 -29
  197. package/src/shared/embedding/constants/near-duplicate-thresholds.constant.ts +0 -17
  198. package/src/shared/embedding/functions/build-vector-index.function.ts +0 -79
  199. package/src/shared/embedding/functions/cosine-similarity.function.ts +0 -31
  200. package/src/shared/embedding/functions/detect-near-duplicates.function.ts +0 -69
  201. package/src/shared/embedding/functions/jaccard-coefficient.function.ts +0 -26
  202. package/src/shared/embedding/functions/read-vector-index-meta.function.ts +0 -44
  203. package/src/shared/embedding/functions/rrf-fuse.function.ts +0 -33
  204. package/src/shared/embedding/functions/search-vectors.function.ts +0 -59
  205. package/src/shared/embedding/index.ts +0 -20
  206. package/src/shared/embedding/typings/embedding-config.interface.ts +0 -23
  207. package/src/shared/embedding/typings/embedding-provider.interface.ts +0 -25
  208. package/src/shared/embedding/typings/near-duplicate-candidate.model.ts +0 -25
  209. package/src/shared/embedding/typings/near-duplicate-result.model.ts +0 -26
  210. package/src/shared/embedding/typings/vector-index-entry.model.ts +0 -13
  211. package/src/shared/embedding/typings/vector-index-meta.model.ts +0 -14
  212. package/src/shared/embedding/typings/vector-search-result.model.ts +0 -8
  213. package/src/shared/hash/functions/compute-sha256.ts +0 -17
  214. package/src/shared/hash/index.ts +0 -1
  215. package/src/shared/mcp/classes/mcp-server.class.ts +0 -480
  216. package/src/shared/mcp/constants/mcp-error-codes.constant.ts +0 -30
  217. package/src/shared/mcp/constants/tool-agent-create.constant.ts +0 -39
  218. package/src/shared/mcp/constants/tool-agent-delete.constant.ts +0 -26
  219. package/src/shared/mcp/constants/tool-agent-get.constant.ts +0 -24
  220. package/src/shared/mcp/constants/tool-agent-list.constant.ts +0 -18
  221. package/src/shared/mcp/constants/tool-auto-capture-review.constant.ts +0 -32
  222. package/src/shared/mcp/constants/tool-check.constant.ts +0 -21
  223. package/src/shared/mcp/constants/tool-content.constant.ts +0 -29
  224. package/src/shared/mcp/constants/tool-export.constant.ts +0 -27
  225. package/src/shared/mcp/constants/tool-gc.constant.ts +0 -21
  226. package/src/shared/mcp/constants/tool-learn.constant.ts +0 -58
  227. package/src/shared/mcp/constants/tool-rebuild.constant.ts +0 -21
  228. package/src/shared/mcp/constants/tool-recall.constant.ts +0 -36
  229. package/src/shared/mcp/constants/tool-retrieve.constant.ts +0 -31
  230. package/src/shared/mcp/constants/tool-search.constant.ts +0 -51
  231. package/src/shared/mcp/constants/tool-skill-delete.constant.ts +0 -24
  232. package/src/shared/mcp/constants/tool-skill-get.constant.ts +0 -27
  233. package/src/shared/mcp/constants/tool-skill-learn.constant.ts +0 -37
  234. package/src/shared/mcp/constants/tool-skill-list.constant.ts +0 -18
  235. package/src/shared/mcp/constants/tool-status.constant.ts +0 -20
  236. package/src/shared/mcp/constants/tool-unlearn.constant.ts +0 -25
  237. package/src/shared/mcp/functions/as-boolean-or-undefined.function.ts +0 -11
  238. package/src/shared/mcp/functions/as-string-array-or-undefined.function.ts +0 -17
  239. package/src/shared/mcp/functions/as-string-array.function.ts +0 -15
  240. package/src/shared/mcp/functions/as-string.function.ts +0 -10
  241. package/src/shared/mcp/functions/build-skills-text.function.ts +0 -43
  242. package/src/shared/mcp/functions/create-mcp-server.function.ts +0 -14
  243. package/src/shared/mcp/functions/create-prompt-definitions.function.ts +0 -102
  244. package/src/shared/mcp/functions/create-resource-templates.function.ts +0 -23
  245. package/src/shared/mcp/functions/create-tool-definitions.function.ts +0 -530
  246. package/src/shared/mcp/functions/extract-skill-arguments.function.ts +0 -27
  247. package/src/shared/mcp/functions/handle-agent-create.function.ts +0 -116
  248. package/src/shared/mcp/functions/handle-agent-delete.function.ts +0 -50
  249. package/src/shared/mcp/functions/handle-agent-get.function.ts +0 -160
  250. package/src/shared/mcp/functions/handle-agent-list.function.ts +0 -50
  251. package/src/shared/mcp/functions/handle-agent-prompt.function.ts +0 -68
  252. package/src/shared/mcp/functions/handle-completion.function.ts +0 -114
  253. package/src/shared/mcp/functions/handle-mcp-request.function.ts +0 -202
  254. package/src/shared/mcp/functions/handle-prompt-get.function.ts +0 -220
  255. package/src/shared/mcp/functions/handle-recall.function.ts +0 -66
  256. package/src/shared/mcp/functions/handle-resource-read.function.ts +0 -56
  257. package/src/shared/mcp/functions/handle-roots-list.function.ts +0 -29
  258. package/src/shared/mcp/functions/handle-skill-prompt.function.ts +0 -44
  259. package/src/shared/mcp/functions/handle-tool-auto-capture-review.function.ts +0 -24
  260. package/src/shared/mcp/functions/handle-tool-call.function.ts +0 -560
  261. package/src/shared/mcp/functions/handle-tool-check.function.ts +0 -21
  262. package/src/shared/mcp/functions/handle-tool-content.function.ts +0 -23
  263. package/src/shared/mcp/functions/handle-tool-export.function.ts +0 -25
  264. package/src/shared/mcp/functions/handle-tool-gc.function.ts +0 -21
  265. package/src/shared/mcp/functions/handle-tool-learn.function.ts +0 -69
  266. package/src/shared/mcp/functions/handle-tool-rebuild.function.ts +0 -21
  267. package/src/shared/mcp/functions/handle-tool-retrieve.function.ts +0 -40
  268. package/src/shared/mcp/functions/handle-tool-search.function.ts +0 -47
  269. package/src/shared/mcp/functions/handle-tool-skill-delete.function.ts +0 -34
  270. package/src/shared/mcp/functions/handle-tool-skill-get.function.ts +0 -59
  271. package/src/shared/mcp/functions/handle-tool-skill-learn.function.ts +0 -61
  272. package/src/shared/mcp/functions/handle-tool-skill-list.function.ts +0 -39
  273. package/src/shared/mcp/functions/handle-tool-status.function.ts +0 -21
  274. package/src/shared/mcp/functions/handle-tool-unlearn.function.ts +0 -24
  275. package/src/shared/mcp/functions/parse-agent-meta.function.ts +0 -27
  276. package/src/shared/mcp/functions/parse-skill-arguments.function.ts +0 -36
  277. package/src/shared/mcp/functions/parse-skill-content.function.ts +0 -38
  278. package/src/shared/mcp/functions/read-agent-meta.function.ts +0 -41
  279. package/src/shared/mcp/functions/resolve-skill-refs.function.ts +0 -50
  280. package/src/shared/mcp/functions/run-startup-health-check.function.ts +0 -34
  281. package/src/shared/mcp/functions/serialize-skill-content.function.ts +0 -12
  282. package/src/shared/mcp/functions/should-emit-log.function.ts +0 -38
  283. package/src/shared/mcp/index.ts +0 -28
  284. package/src/shared/mcp/typings/agent-types.interface.ts +0 -39
  285. package/src/shared/mcp/typings/log-types.interface.ts +0 -26
  286. package/src/shared/mcp/typings/mcp-capabilities.interface.ts +0 -16
  287. package/src/shared/mcp/typings/mcp-client.interface.ts +0 -317
  288. package/src/shared/mcp/typings/mcp-completion.interface.ts +0 -45
  289. package/src/shared/mcp/typings/mcp-content-result.model.ts +0 -9
  290. package/src/shared/mcp/typings/mcp-export-result.model.ts +0 -11
  291. package/src/shared/mcp/typings/mcp-gc-result.model.ts +0 -15
  292. package/src/shared/mcp/typings/mcp-integrity-check-result.model.ts +0 -17
  293. package/src/shared/mcp/typings/mcp-integrity-error.model.ts +0 -15
  294. package/src/shared/mcp/typings/mcp-notification.interface.ts +0 -9
  295. package/src/shared/mcp/typings/mcp-rebuild-result.model.ts +0 -9
  296. package/src/shared/mcp/typings/mcp-request.interface.ts +0 -11
  297. package/src/shared/mcp/typings/mcp-resource-result.interface.ts +0 -12
  298. package/src/shared/mcp/typings/mcp-resource-template.interface.ts +0 -11
  299. package/src/shared/mcp/typings/mcp-response.interface.ts +0 -18
  300. package/src/shared/mcp/typings/mcp-server-info.interface.ts +0 -7
  301. package/src/shared/mcp/typings/mcp-server-state.interface.ts +0 -17
  302. package/src/shared/mcp/typings/mcp-tool-annotations.interface.ts +0 -32
  303. package/src/shared/mcp/typings/mcp-tool-definition.interface.ts +0 -16
  304. package/src/shared/mcp/typings/mcp-tool-result.interface.ts +0 -19
  305. package/src/shared/mcp/typings/mcp-types.interface.ts +0 -158
  306. package/src/shared/mcp/typings/mcp-worker-client.interface.ts +0 -243
  307. package/src/shared/mcp/typings/prompt-types.interface.ts +0 -39
  308. package/src/shared/mcp/typings/remove-section-result.model.ts +0 -10
  309. package/src/shared/mcp/typings/sampling-types.interface.ts +0 -48
  310. package/src/shared/mcp/typings/skill-types.interface.ts +0 -29
  311. package/src/shared/mcp/typings/tool-call-result.model.ts +0 -18
  312. package/src/shared/mod.ts +0 -1
  313. package/src/shared/platform/functions/get-ipc-path.function.ts +0 -19
  314. package/src/shared/platform/functions/get-tmpdir.function.ts +0 -8
  315. package/src/shared/platform/functions/is-process-alive.function.ts +0 -17
  316. package/src/shared/platform/index.ts +0 -3
  317. package/src/shared/runtime/functions/detect-runtime.ts +0 -14
  318. package/src/shared/runtime/functions/get-args.ts +0 -16
  319. package/src/shared/runtime/index.ts +0 -3
  320. package/src/shared/runtime/typings/runtime.ts +0 -2
  321. package/src/shared/sync/functions/build-import-report.function.ts +0 -40
  322. package/src/shared/sync/functions/parse-export-entry.function.ts +0 -45
  323. package/src/shared/sync/functions/resolve-conflict.function.ts +0 -31
  324. package/src/shared/sync/functions/serialize-export-entry.function.ts +0 -18
  325. package/src/shared/sync/index.ts +0 -9
  326. package/src/shared/sync/typings/conflict-resolution.type.ts +0 -8
  327. package/src/shared/sync/typings/export-entry.interface.ts +0 -13
  328. package/src/shared/sync/typings/export-options.interface.ts +0 -9
  329. package/src/shared/sync/typings/import-options.interface.ts +0 -7
  330. package/src/shared/sync/typings/import-report.interface.ts +0 -15
  331. package/src/shared/version/constants/version.constant.ts +0 -2
  332. package/src/shared/version/index.ts +0 -1
  333. package/src/shared/wasm-codec/functions/decode-add-section-result.function.ts +0 -112
  334. package/src/shared/wasm-codec/functions/decode-compose-output.function.ts +0 -16
  335. package/src/shared/wasm-codec/functions/decode-document-manifest-list.function.ts +0 -70
  336. package/src/shared/wasm-codec/functions/decode-document-manifest.function.ts +0 -87
  337. package/src/shared/wasm-codec/functions/decode-f32.function.ts +0 -16
  338. package/src/shared/wasm-codec/functions/decode-key-value-text.function.ts +0 -15
  339. package/src/shared/wasm-codec/functions/decode-one-recall-result.function.ts +0 -86
  340. package/src/shared/wasm-codec/functions/decode-option-string.function.ts +0 -24
  341. package/src/shared/wasm-codec/functions/decode-recall-document.function.ts +0 -59
  342. package/src/shared/wasm-codec/functions/decode-recall-reference.function.ts +0 -52
  343. package/src/shared/wasm-codec/functions/decode-recall-result.function.ts +0 -267
  344. package/src/shared/wasm-codec/functions/decode-recall-sibling.function.ts +0 -43
  345. package/src/shared/wasm-codec/functions/decode-remove-flag.function.ts +0 -3
  346. package/src/shared/wasm-codec/functions/decode-scored-results.function.ts +0 -194
  347. package/src/shared/wasm-codec/functions/decode-section-match.function.ts +0 -80
  348. package/src/shared/wasm-codec/functions/decode-section-record-list.function.ts +0 -20
  349. package/src/shared/wasm-codec/functions/decode-section-record-trailing.function.ts +0 -75
  350. package/src/shared/wasm-codec/functions/decode-section-record.function.ts +0 -85
  351. package/src/shared/wasm-codec/functions/decode-section-records.function.ts +0 -249
  352. package/src/shared/wasm-codec/functions/decode-section-type.function.ts +0 -30
  353. package/src/shared/wasm-codec/functions/decode-string.function.ts +0 -22
  354. package/src/shared/wasm-codec/functions/decode-u32.function.ts +0 -16
  355. package/src/shared/wasm-codec/functions/decode-u64.function.ts +0 -16
  356. package/src/shared/wasm-codec/functions/decode-wasm-list.function.ts +0 -31
  357. package/src/shared/wasm-codec/functions/encode-add-section-params.function.ts +0 -102
  358. package/src/shared/wasm-codec/functions/encode-group-params.function.ts +0 -28
  359. package/src/shared/wasm-codec/functions/encode-identifier-list.function.ts +0 -17
  360. package/src/shared/wasm-codec/functions/encode-kbid-list.function.ts +0 -17
  361. package/src/shared/wasm-codec/functions/encode-option-string.function.ts +0 -14
  362. package/src/shared/wasm-codec/functions/encode-recall-params.function.ts +0 -68
  363. package/src/shared/wasm-codec/functions/encode-search-params.function.ts +0 -12
  364. package/src/shared/wasm-codec/functions/encode-section-type.function.ts +0 -18
  365. package/src/shared/wasm-codec/functions/encode-string.function.ts +0 -9
  366. package/src/shared/wasm-codec/functions/encode-type-filter-param.function.ts +0 -13
  367. package/src/shared/wasm-codec/functions/encode-u32.function.ts +0 -5
  368. package/src/shared/wasm-codec/functions/encode-update-section-params.function.ts +0 -16
  369. package/src/shared/wasm-codec/index.ts +0 -49
  370. package/src/shared/wasm-codec/typings/add-section-input.model.ts +0 -45
  371. package/src/shared/wasm-codec/typings/add-section-result.model.ts +0 -28
  372. package/src/shared/wasm-codec/typings/document-manifest.model.ts +0 -20
  373. package/src/shared/wasm-codec/typings/document-section.model.ts +0 -12
  374. package/src/shared/wasm-codec/typings/item-decoder.type.ts +0 -10
  375. package/src/shared/wasm-codec/typings/near-duplicate.model.ts +0 -16
  376. package/src/shared/wasm-codec/typings/paged-search-result.model.ts +0 -22
  377. package/src/shared/wasm-codec/typings/section-match.model.ts +0 -31
  378. package/src/shared/wasm-codec/typings/section-record-trailing.model.ts +0 -38
  379. package/src/shared/wasm-codec/typings/section-record.model.ts +0 -66
  380. package/src/shared/wasm-codec/typings/section-type-result.model.ts +0 -12
  381. package/src/shared/worker-client/classes/worker-client.class.ts +0 -466
  382. package/src/shared/worker-client/functions/compute-context-id.function.ts +0 -18
  383. package/src/shared/worker-client/functions/create-worker-client.function.ts +0 -70
  384. package/src/shared/worker-client/functions/discover-daemon.function.ts +0 -47
  385. package/src/shared/worker-client/functions/handle-ipc-data.function.ts +0 -49
  386. package/src/shared/worker-client/functions/resolve-db-path.function.ts +0 -21
  387. package/src/shared/worker-client/functions/send-ipc-request.function.ts +0 -39
  388. package/src/shared/worker-client/functions/spawn-daemon.function.ts +0 -35
  389. package/src/shared/worker-client/functions/wait-for-daemon.function.ts +0 -34
  390. package/src/shared/worker-client/index.ts +0 -44
  391. package/src/shared/worker-client/typings/add-section-result.model.ts +0 -39
  392. package/src/shared/worker-client/typings/content-result.model.ts +0 -12
  393. package/src/shared/worker-client/typings/daemon-info.model.ts +0 -7
  394. package/src/shared/worker-client/typings/export-result.model.ts +0 -14
  395. package/src/shared/worker-client/typings/gc-result.model.ts +0 -18
  396. package/src/shared/worker-client/typings/integrity-check-result.model.ts +0 -43
  397. package/src/shared/worker-client/typings/json-rpc-response.interface.ts +0 -17
  398. package/src/shared/worker-client/typings/migrate-result.model.ts +0 -11
  399. package/src/shared/worker-client/typings/pending-call.interface.ts +0 -7
  400. package/src/shared/worker-client/typings/rebuild-result.model.ts +0 -12
  401. package/src/shared/worker-client/typings/recall-document.model.ts +0 -16
  402. package/src/shared/worker-client/typings/recall-params.model.ts +0 -15
  403. package/src/shared/worker-client/typings/recall-reference.model.ts +0 -32
  404. package/src/shared/worker-client/typings/recall-result.model.ts +0 -98
  405. package/src/shared/worker-client/typings/recall-sibling.model.ts +0 -11
  406. package/src/shared/worker-client/typings/recall-single-result.model.ts +0 -41
  407. package/src/shared/worker-client/typings/remove-section-result.model.ts +0 -7
  408. package/src/shared/worker-client/typings/search-params.model.ts +0 -14
  409. package/src/shared/worker-client/typings/search-result.model.ts +0 -43
  410. package/src/shared/worker-client/typings/section.model.ts +0 -43
  411. package/src/shared/worker-client/typings/status-result.model.ts +0 -14
  412. package/src/shared/worker-client/typings/version-status.model.ts +0 -28
  413. package/src/shared/worker-client/typings/worker-client-error.interface.ts +0 -8
  414. package/src/shared/worker-client/typings/worker-client-options.interface.ts +0 -30
  415. package/src/shared/worker-daemon/classes/ipc-error.class.ts +0 -22
  416. package/src/shared/worker-daemon/classes/worker-daemon.class.ts +0 -1291
  417. package/src/shared/worker-daemon/constants/daemon-defaults.constant.ts +0 -29
  418. package/src/shared/worker-daemon/constants/wasm-method-map.constant.ts +0 -69
  419. package/src/shared/worker-daemon/functions/build-ipc-error-response.function.ts +0 -16
  420. package/src/shared/worker-daemon/functions/check-catalog-version.function.ts +0 -54
  421. package/src/shared/worker-daemon/functions/check-preconditions.function.ts +0 -28
  422. package/src/shared/worker-daemon/functions/create-host-imports.function.ts +0 -328
  423. package/src/shared/worker-daemon/functions/create-ipc-server.function.ts +0 -87
  424. package/src/shared/worker-daemon/functions/detect-stale-pid.function.ts +0 -33
  425. package/src/shared/worker-daemon/functions/dispatch-request.function.ts +0 -190
  426. package/src/shared/worker-daemon/functions/handle-check-version.function.ts +0 -74
  427. package/src/shared/worker-daemon/functions/handle-config-method.function.ts +0 -27
  428. package/src/shared/worker-daemon/functions/handle-read-ops.function.ts +0 -236
  429. package/src/shared/worker-daemon/functions/handle-write-ops.function.ts +0 -257
  430. package/src/shared/worker-daemon/functions/load-wasm-modules.function.ts +0 -95
  431. package/src/shared/worker-daemon/functions/parse-auto-capture-section.function.ts +0 -51
  432. package/src/shared/worker-daemon/functions/parse-catalog-version.function.ts +0 -20
  433. package/src/shared/worker-daemon/functions/parse-embedding-section.function.ts +0 -38
  434. package/src/shared/worker-daemon/functions/parse-worker-toml.function.ts +0 -104
  435. package/src/shared/worker-daemon/functions/read-config.function.ts +0 -83
  436. package/src/shared/worker-daemon/functions/run-startup-integrity-check.function.ts +0 -55
  437. package/src/shared/worker-daemon/functions/run-worker.function.ts +0 -57
  438. package/src/shared/worker-daemon/functions/scan-near-duplicates.function.ts +0 -92
  439. package/src/shared/worker-daemon/functions/start-daemon.function.ts +0 -74
  440. package/src/shared/worker-daemon/functions/wasm-bridge.function.ts +0 -144
  441. package/src/shared/worker-daemon/functions/wasm-memory-helpers.function.ts +0 -41
  442. package/src/shared/worker-daemon/functions/write-lock.function.ts +0 -49
  443. package/src/shared/worker-daemon/index.ts +0 -16
  444. package/src/shared/worker-daemon/typings/allocator-ref.interface.ts +0 -16
  445. package/src/shared/worker-daemon/typings/daemon-config.interface.ts +0 -20
  446. package/src/shared/worker-daemon/typings/fs-adapter.interface.ts +0 -22
  447. package/src/shared/worker-daemon/typings/handler-context.interface.ts +0 -19
  448. package/src/shared/worker-daemon/typings/ipc-handler.interface.ts +0 -39
  449. package/src/shared/worker-daemon/typings/memory-ref.interface.ts +0 -13
  450. package/src/shared/worker-daemon/typings/wasm-fn.type.ts +0 -2
  451. package/src/shared/worker-daemon/typings/wasm-modules.interface.ts +0 -7
  452. package/src/shared/worker-daemon/typings/write-lock.interface.ts +0 -13
  453. package/src/wasm/fs-database/kbdb_fs_database.d.ts +0 -259
  454. package/src/wasm/fs-database/kbdb_fs_database.js +0 -515
  455. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  456. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +0 -35
  457. package/src/wasm/fs-database/package.json +0 -13
  458. package/src/wasm/kb-worker/kbdb_worker.d.ts +0 -650
  459. package/src/wasm/kb-worker/kbdb_worker.js +0 -1181
  460. package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  461. package/src/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +0 -77
  462. package/src/wasm/kb-worker/package.json +0 -13
  463. package/src/wasm/query-parser/kbdb_query_parser.d.ts +0 -195
  464. package/src/wasm/query-parser/kbdb_query_parser.js +0 -403
  465. package/src/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
  466. package/src/wasm/query-parser/kbdb_query_parser_bg.wasm.d.ts +0 -25
  467. package/src/wasm/query-parser/package.json +0 -13
  468. package/src/worker.ts +0 -42
package/dist/mod.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/shared/version/constants/version.constant.ts
2
- var VERSION = "0.2.2";
2
+ var VERSION = "0.4.0";
3
3
 
4
4
  // src/shared/worker-client/classes/worker-client.class.ts
5
5
  import { connect } from "node:net";
@@ -9,10 +9,13 @@ var WorkerClient = class {
9
9
  * (or Windows named pipe path)
10
10
  * @param contextId - 16-character context identifier sent as
11
11
  * `ctx` in every JSON-RPC request
12
+ * @param requestTimeoutMs - per-request timeout in ms
13
+ * (0 or undefined disables the timeout)
12
14
  */
13
- constructor(socketPath, contextId) {
15
+ constructor(socketPath, contextId, requestTimeoutMs) {
14
16
  this.socketPath = socketPath;
15
17
  this.contextId = contextId;
18
+ this.requestTimeoutMs = requestTimeoutMs;
16
19
  }
17
20
  /** Underlying socket; `null` when not connected. */
18
21
  socket = null;
@@ -22,30 +25,85 @@ var WorkerClient = class {
22
25
  pending = /* @__PURE__ */ new Map();
23
26
  /** Partial line buffer for split TCP/IPC frames. */
24
27
  buffer = "";
28
+ /** Whether the underlying socket is connected. */
29
+ get isConnected() {
30
+ return this.socket !== null;
31
+ }
25
32
  /**
26
33
  * Establishes the IPC connection to the worker daemon.
27
34
  *
35
+ * Retries up to 5 times with exponential backoff on
36
+ * transient errors (`ENOENT`, `ECONNREFUSED`).
37
+ *
28
38
  * @throws {Error} if the connection cannot be established
29
39
  */
30
40
  async connect() {
41
+ const maxRetries = 5;
42
+ let delay = 50;
43
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
44
+ try {
45
+ await this.tryConnect();
46
+ return;
47
+ } catch (err) {
48
+ const code = err.code;
49
+ const retriable = code === "ENOENT" || code === "ECONNREFUSED";
50
+ if (!retriable || attempt === maxRetries) {
51
+ throw err;
52
+ }
53
+ await new Promise((r) => setTimeout(r, delay));
54
+ delay = Math.min(delay * 2, 1e3);
55
+ }
56
+ }
57
+ }
58
+ /** Destroys the IPC socket and clears the connection state. */
59
+ disconnect() {
60
+ if (this.socket) {
61
+ this.socket.destroy();
62
+ this.socket = null;
63
+ }
64
+ }
65
+ /**
66
+ * Single connection attempt with keepalive and
67
+ * post-connect failure handlers.
68
+ */
69
+ async tryConnect() {
31
70
  return new Promise((resolve2, reject) => {
32
- this.socket = connect(this.socketPath, () => {
71
+ const sock = connect(this.socketPath, () => {
72
+ sock.removeListener("error", reject);
73
+ sock.setKeepAlive(true, 3e4);
74
+ sock.on("error", (err) => {
75
+ this.handleSocketFailure(err);
76
+ });
77
+ sock.on("close", () => {
78
+ if (this.pending.size > 0) {
79
+ this.handleSocketFailure(
80
+ new Error("connection closed")
81
+ );
82
+ }
83
+ this.socket = null;
84
+ });
85
+ this.socket = sock;
33
86
  resolve2();
34
87
  });
35
- this.socket.on("error", (err) => {
36
- reject(err);
37
- });
38
- this.socket.on("data", (chunk) => {
88
+ sock.on("error", reject);
89
+ sock.on("data", (chunk) => {
39
90
  this.handleData(chunk.toString());
40
91
  });
41
92
  });
42
93
  }
43
- /** Destroys the IPC socket and clears the connection state. */
44
- disconnect() {
45
- if (this.socket) {
46
- this.socket.destroy();
47
- this.socket = null;
94
+ /**
95
+ * Rejects all pending calls and marks the client as
96
+ * disconnected.
97
+ */
98
+ handleSocketFailure(err) {
99
+ const sock = this.socket;
100
+ this.socket = null;
101
+ for (const [id, call] of this.pending) {
102
+ this.pending.delete(id);
103
+ if (call.timer) clearTimeout(call.timer);
104
+ call.reject(err);
48
105
  }
106
+ if (sock) sock.destroy();
49
107
  }
50
108
  /**
51
109
  * Searches the knowledge base.
@@ -54,7 +112,10 @@ var WorkerClient = class {
54
112
  * @returns paginated search results with metadata
55
113
  */
56
114
  async search(params) {
57
- return this.call("search", params);
115
+ return this.call("search", {
116
+ ...params,
117
+ algo: params.algo
118
+ });
58
119
  }
59
120
  /**
60
121
  * Retrieves full content and context for one or more sections by
@@ -305,7 +366,20 @@ var WorkerClient = class {
305
366
  */
306
367
  async export(params) {
307
368
  return this.call("export", {
308
- targetPath: params?.path || void 0
369
+ targetPath: params?.path || void 0,
370
+ format: params?.format
371
+ });
372
+ }
373
+ /**
374
+ * Imports an exported database from the given path.
375
+ *
376
+ * @param params - source path and dry-run flag
377
+ * @returns import report with counts and timing
378
+ */
379
+ async import(params) {
380
+ return this.call("importDb", {
381
+ sourcePath: params.from,
382
+ dryRun: params.dryRun
309
383
  });
310
384
  }
311
385
  /**
@@ -328,8 +402,21 @@ var WorkerClient = class {
328
402
  method,
329
403
  params: { ctx: this.contextId, ...params }
330
404
  };
405
+ const timeoutMs = this.requestTimeoutMs;
331
406
  return new Promise((resolve2, reject) => {
332
- this.pending.set(id, { resolve: resolve2, reject });
407
+ const call = { resolve: resolve2, reject };
408
+ if (timeoutMs) {
409
+ call.timer = setTimeout(() => {
410
+ if (!this.pending.has(id)) return;
411
+ this.pending.delete(id);
412
+ const err = new Error(
413
+ `request timeout after ${String(timeoutMs)}ms`
414
+ );
415
+ err.code = "REQUEST_TIMEOUT";
416
+ reject(err);
417
+ }, timeoutMs);
418
+ }
419
+ this.pending.set(id, call);
333
420
  socket.write(JSON.stringify(request) + "\n");
334
421
  });
335
422
  }
@@ -350,6 +437,7 @@ var WorkerClient = class {
350
437
  const pending = this.pending.get(response.id);
351
438
  if (pending) {
352
439
  this.pending.delete(response.id);
440
+ if (pending.timer) clearTimeout(pending.timer);
353
441
  if (response.error) {
354
442
  const err = new Error(response.error.message);
355
443
  err.code = response.error.code;
@@ -507,7 +595,11 @@ async function createWorkerClient(options) {
507
595
  `kbdb worker daemon did not start: ${readCrashReason(contextId)}`
508
596
  );
509
597
  }
510
- const client = new WorkerClient(socketPath, contextId);
598
+ const client = new WorkerClient(
599
+ socketPath,
600
+ contextId,
601
+ options?.requestTimeoutMs
602
+ );
511
603
  await client.connect();
512
604
  return client;
513
605
  }
@@ -525,10 +617,23 @@ function readCrashReason(contextId) {
525
617
  return "daemon failed to start (crash log unreadable)";
526
618
  }
527
619
  }
620
+
621
+ // src/shared/worker-client/functions/get-or-create-client.function.ts
622
+ var cache = /* @__PURE__ */ new Map();
623
+ async function getOrCreateClient(options) {
624
+ const dbPath = options?.contextPath ?? resolveDbPath(options?.dbPath);
625
+ const cached = cache.get(dbPath);
626
+ if (cached?.isConnected) return cached;
627
+ cache.delete(dbPath);
628
+ const client = await createWorkerClient(options);
629
+ cache.set(dbPath, client);
630
+ return client;
631
+ }
528
632
  export {
529
633
  WorkerClient,
530
634
  computeContextId,
531
635
  createWorkerClient,
636
+ getOrCreateClient,
532
637
  resolveDbPath,
533
638
  VERSION as version
534
639
  };
package/dist/mod.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/shared/version/constants/version.constant.ts", "../src/shared/worker-client/classes/worker-client.class.ts", "../src/shared/worker-client/functions/create-worker-client.function.ts", "../src/shared/worker-client/functions/resolve-db-path.function.ts", "../src/shared/hash/functions/compute-sha256.ts", "../src/shared/worker-client/functions/compute-context-id.function.ts", "../src/shared/worker-client/functions/discover-daemon.function.ts", "../src/shared/platform/functions/is-process-alive.function.ts", "../src/shared/worker-client/functions/spawn-daemon.function.ts", "../src/shared/worker-client/functions/wait-for-daemon.function.ts", "../src/shared/runtime/functions/detect-runtime.ts", "../src/shared/platform/functions/get-ipc-path.function.ts", "../src/shared/platform/functions/get-tmpdir.function.ts"],
4
- "sourcesContent": ["/** Current package version, kept in sync with package.json. */\nexport const VERSION = '0.2.2';\n", "import { connect } from 'node:net';\nimport type { Socket } from 'node:net';\nimport type { SearchParams } from '../typings/search-params.model.ts';\nimport type { PagedSearchResult } from '../typings/search-result.model.ts';\nimport type {\n AddSectionParams,\n Section,\n} from '../typings/section.model.ts';\nimport type { StatusResult } from '../typings/status-result.model.ts';\nimport type { AddSectionResult } from '../typings/add-section-result.model.ts';\nimport type { RemoveSectionResult } from '../typings/remove-section-result.model.ts';\nimport type { ContentResult } from '../typings/content-result.model.ts';\nimport type { IntegrityCheckResult } from '../typings/integrity-check-result.model.ts';\nimport type { GcResult } from '../typings/gc-result.model.ts';\nimport type { RebuildResult } from '../typings/rebuild-result.model.ts';\nimport type { MigrateResult } from '../typings/migrate-result.model.ts';\nimport type { VersionStatus } from '../typings/version-status.model.ts';\nimport type { SectionRecord } from '../../wasm-codec/functions/decode-section-records.function.ts';\nimport type { DocumentManifest } from '../../wasm-codec/functions/decode-document-manifest.function.ts';\nimport type {\n RecallParams,\n RecallResult,\n} from '../typings/recall-result.model.ts';\nimport type { ExportResult } from '../typings/export-result.model.ts';\n\n/** Pending JSON-RPC call awaiting a response from the daemon. */\ninterface PendingCall {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n}\n\n/** Shape of a JSON-RPC 2.0 error object from the daemon. */\ninterface JsonRpcError {\n readonly code: number;\n readonly message: string;\n}\n\n/** Shape of a JSON-RPC 2.0 response from the daemon. */\ninterface JsonRpcResponse {\n readonly id: number;\n readonly result?: unknown;\n readonly error?: JsonRpcError;\n}\n\n/**\n * IPC client that communicates with the worker daemon over a Unix\n * domain socket (or Windows named pipe) using JSON-RPC 2.0 with\n * newline-delimited message framing.\n *\n * Call `connect()` before any other method and `disconnect()` when\n * done to release the underlying socket.\n */\nexport class WorkerClient {\n /** Underlying socket; `null` when not connected. */\n private socket: Socket | null = null;\n\n /** Monotonically increasing request ID counter. */\n private nextId = 1;\n\n /** Map of outstanding request IDs to their resolve/reject pairs. */\n private readonly pending = new Map<number, PendingCall>();\n\n /** Partial line buffer for split TCP/IPC frames. */\n private buffer = '';\n\n /**\n * @param socketPath - absolute path to the daemon's IPC socket\n * (or Windows named pipe path)\n * @param contextId - 16-character context identifier sent as\n * `ctx` in every JSON-RPC request\n */\n constructor(\n private readonly socketPath: string,\n private readonly contextId: string,\n ) {}\n\n /**\n * Establishes the IPC connection to the worker daemon.\n *\n * @throws {Error} if the connection cannot be established\n */\n async connect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.socket = connect(this.socketPath, () => {\n resolve();\n });\n this.socket.on('error', (err: Error) => {\n reject(err);\n });\n this.socket.on('data', (chunk: Buffer) => {\n this.handleData(chunk.toString());\n });\n });\n }\n\n /** Destroys the IPC socket and clears the connection state. */\n disconnect(): void {\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n }\n\n /**\n * Searches the knowledge base.\n *\n * @param params - query parameters including the search string\n * @returns paginated search results with metadata\n */\n async search(params: SearchParams): Promise<PagedSearchResult> {\n return this.call('search', params) as Promise<PagedSearchResult>;\n }\n\n /**\n * Retrieves full content and context for one or more sections by\n * their knowledge-base identifiers.\n *\n * @param params - section identifier(s) and optional expansion depth\n * @returns a single `RecallResult` when `kbid` is provided without\n * `kbids`, or a `RecallResult[]` when `kbids` is provided\n */\n async recall(\n params: RecallParams,\n ): Promise<RecallResult | RecallResult[]> {\n return this.call('recall', params) as Promise<\n RecallResult | RecallResult[]\n >;\n }\n\n /**\n * Adds a new section to the knowledge base.\n *\n * @param params - section content and metadata\n * @returns the result including the assigned knowledge-base\n * identifier and indexing statistics\n */\n async addSection(\n params: AddSectionParams,\n ): Promise<AddSectionResult> {\n return this.call(\n 'addSection',\n params,\n ) as Promise<AddSectionResult>;\n }\n\n /**\n * Replaces an existing section's content and metadata.\n *\n * @param kbid - identifier of the section to update\n * @param params - new content and metadata\n * @returns the knowledge-base identifier of the updated section\n */\n async updateSection(\n kbid: string,\n params: AddSectionParams,\n ): Promise<string> {\n return this.call('updateSection', {\n kbid,\n ...params,\n }) as Promise<string>;\n }\n\n /**\n * Removes a section from the knowledge base.\n *\n * @param kbid - identifier of the section to remove\n * @returns removal result with `removed` flag and elapsed time\n */\n async removeSection(kbid: string): Promise<RemoveSectionResult> {\n return this.call('removeSection', {\n kbid,\n }) as Promise<RemoveSectionResult>;\n }\n\n /**\n * Retrieves multiple sections by their identifiers.\n *\n * @param kbids - list of knowledge-base identifiers to fetch\n * @returns sections in the order their IDs were requested\n */\n async readSections(kbids: string[]): Promise<Section[]> {\n return this.call('readSections', {\n kbids,\n }) as Promise<Section[]>;\n }\n\n /**\n * Groups a set of sections under a named document.\n *\n * @param title - human-readable document title\n * @param kbids - identifiers of the sections to group\n * @param docType - application-level document type tag; omit or\n * pass an empty string for untagged documents\n * @returns the assigned document identifier\n */\n async groupSections(\n title: string,\n kbids: string[],\n docType?: string,\n ): Promise<string> {\n const result = (await this.call('groupSections', {\n title,\n kbids,\n docType: docType ?? '',\n })) as { docid: string } | string;\n return typeof result === 'string' ? result : result.docid;\n }\n\n /**\n * Removes the document grouping for the given document.\n *\n * The sections themselves are not deleted; only the grouping\n * record is removed.\n *\n * @param docid - identifier of the document grouping to remove\n */\n async removeGrouping(docid: string): Promise<void> {\n await this.call('removeGrouping', { docid });\n }\n\n /**\n * Retrieves a full document record including its sections.\n *\n * @param docid - identifier of the document to retrieve\n * @returns the document record as returned by the daemon\n */\n async retrieveDocument(docid: string): Promise<unknown> {\n return this.call('retrieveDocument', { docid });\n }\n\n /**\n * Composes a rendered Markdown document from one or more kbid\n * or docid identifiers.\n *\n * @param ids - list of kbid or docid identifiers (may be mixed)\n * @returns composed Markdown result with character count\n */\n async content(ids: string[]): Promise<ContentResult> {\n return this.call('content', { ids }) as Promise<ContentResult>;\n }\n\n /**\n * Runs an integrity check on the knowledge-base database.\n *\n * @returns a report of all issues found; `ok` is `true` when\n * no errors were detected\n */\n async integrityCheck(): Promise<IntegrityCheckResult> {\n return this.call(\n 'integrityCheck',\n {},\n ) as Promise<IntegrityCheckResult>;\n }\n\n /**\n * Removes unreferenced sections from the database.\n *\n * @returns a report of sections removed and bytes freed\n */\n async gc(): Promise<GcResult> {\n return this.call('gc', {}) as Promise<GcResult>;\n }\n\n /**\n * Reconstructs all index files from section files and document\n * manifests on disk. Text and code sections are re-tokenized;\n * image sections are skipped.\n *\n * @returns a report of sections and terms re-indexed\n */\n async rebuildIndexes(): Promise<RebuildResult> {\n return this.call('rebuildIndexes', {}) as Promise<RebuildResult>;\n }\n\n /**\n * Invalidates the in-memory cache entry for a single section.\n *\n * @param kbid - identifier of the section to evict from cache\n */\n async invalidate(kbid: string): Promise<void> {\n await this.call('invalidate', { kbid });\n }\n\n /** Clears all entries from the daemon's in-memory cache. */\n async invalidateAll(): Promise<void> {\n await this.call('invalidateAll', {});\n }\n\n /**\n * Retrieves diagnostic status information from the daemon.\n *\n * @returns current initialization state and cache statistics\n */\n async status(): Promise<StatusResult> {\n return this.call('status', {}) as Promise<StatusResult>;\n }\n\n /**\n * Returns database metadata and status from the daemon,\n * including document count, section count, index size, and\n * cache statistics.\n *\n * @returns database metadata from the daemon's cached state\n */\n async dbStatus(): Promise<StatusResult> {\n return this.call('dbStatus', {}) as Promise<StatusResult>;\n }\n\n /**\n * Initialises a new `.kbdb` database directory at the given path\n * by sending an init request to the worker daemon.\n *\n * The daemon creates all required subdirectories and seed files via\n * the `worker_init_directory` WASM export.\n *\n * @param targetPath - absolute path to the directory that will\n * contain the new `.kbdb` database\n * @throws {Error} if the `.kbdb` directory already exists or the\n * daemon cannot create the layout\n */\n async initDirectory(targetPath: string): Promise<void> {\n await this.call('initDirectory', { targetPath });\n }\n\n /**\n * Runs all pending database migrations for the `.kbdb` directory\n * at the given path.\n *\n * Delegates to the `worker_migrate` WASM export on the daemon.\n * Each migration step updates `catalog.toml` on success, so\n * retrying after a partial failure is safe.\n *\n * @param targetPath - absolute path to the `.kbdb` database root\n * @returns migration report with old version, new version, and\n * number of migration steps applied\n */\n async migrateDatabase(targetPath: string): Promise<MigrateResult> {\n return this.call('migrateDatabase', {\n targetPath,\n }) as Promise<MigrateResult>;\n }\n\n /**\n * Checks the format version of the `.kbdb` database at the given\n * path against the version required by the current WASM engine.\n *\n * This is a read-only operation: it reads `catalog.toml` and\n * returns the compatibility status without making any changes.\n *\n * @param targetPath - absolute path to the `.kbdb` database root\n * @returns version compatibility report\n */\n async checkVersion(targetPath: string): Promise<VersionStatus> {\n return this.call('checkVersion', {\n targetPath,\n }) as Promise<VersionStatus>;\n }\n\n /**\n * Retrieves all sections whose type name matches the given string.\n *\n * @param sectionType - the application-level type name to filter by\n * @returns all section records with a matching type name\n */\n async listByType(sectionType: string): Promise<SectionRecord[]> {\n return this.call('listByType', {\n sectionType,\n }) as Promise<SectionRecord[]>;\n }\n\n /**\n * Retrieves all documents whose type name matches the given string.\n *\n * @param docType - the application-level document type to filter by\n * @returns all document manifests with a matching type name\n */\n async listDocumentsByType(\n docType: string,\n ): Promise<DocumentManifest[]> {\n return this.call('listDocumentsByType', {\n docType,\n }) as Promise<DocumentManifest[]>;\n }\n\n /**\n * Exports the database to a target directory on disk.\n *\n * Copies section files, document manifests, and `catalog.toml`\n * to `params.path`. Index files are not exported because they\n * are derivable from the section and document data.\n *\n * @param params - optional export parameters\n * @param params.path - target directory path; defaults to\n * `./kbdb-export/` when not provided\n * @returns export report with the resolved path and file counts\n */\n async export(params?: { path?: string }): Promise<ExportResult> {\n return this.call('export', {\n targetPath: params?.path || undefined,\n }) as Promise<ExportResult>;\n }\n\n /**\n * Sends a JSON-RPC 2.0 request and awaits the response.\n *\n * @param method - the RPC method name\n * @param params - parameters to include in the request\n * @throws {Error} if not connected\n * @throws {Error} when the daemon returns an error response\n */\n private async call(\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const socket = this.socket;\n if (!socket) {\n throw new Error('not connected');\n }\n\n const id = this.nextId++;\n const request = {\n jsonrpc: '2.0',\n id,\n method,\n params: { ctx: this.contextId, ...(params as object) },\n };\n\n return new Promise<unknown>((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n socket.write(JSON.stringify(request) + '\\n');\n });\n }\n\n /**\n * Processes incoming data from the socket, splitting on newlines\n * and dispatching complete JSON-RPC response objects.\n *\n * @param data - raw string chunk received from the socket\n */\n private handleData(data: string): void {\n this.buffer += data;\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const response = JSON.parse(line) as JsonRpcResponse;\n const pending = this.pending.get(response.id);\n if (pending) {\n this.pending.delete(response.id);\n if (response.error) {\n const err = new Error(response.error.message);\n (err as unknown as Record<string, unknown>).code =\n response.error.code;\n pending.reject(err);\n } else {\n pending.resolve(response.result);\n }\n }\n } catch {\n // Ignore unparseable lines\n }\n }\n }\n}\n", "import { existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { WorkerClient } from '../classes/worker-client.class.ts';\nimport { resolveDbPath } from './resolve-db-path.function.ts';\nimport { computeContextId } from './compute-context-id.function.ts';\nimport { discoverDaemon } from './discover-daemon.function.ts';\nimport { spawnDaemon } from './spawn-daemon.function.ts';\nimport { waitForDaemon } from './wait-for-daemon.function.ts';\nimport { detectRuntime } from '../../runtime/functions/detect-runtime.ts';\nimport { getIpcPath } from '../../platform/functions/get-ipc-path.function.ts';\nimport type { WorkerClientOptions } from '../typings/worker-client-options.interface.ts';\n\n/**\n * Creates and connects a `WorkerClient` to the worker daemon.\n *\n * Resolves the context path, derives a stable context identifier,\n * and checks whether a daemon is already running. If no daemon is\n * found and `autoSpawn` is not `false`, a new daemon process is\n * spawned and the factory waits for its PID file to appear before\n * connecting.\n *\n * @param options - optional configuration for path resolution,\n * auto-spawn behaviour, and connection timeout\n * @returns a connected `WorkerClient` ready to send requests\n * @throws {Error} if the `.kbdb` directory cannot be found\n * @throws {Error} if the socket connection cannot be established\n */\nexport async function createWorkerClient(\n options?: WorkerClientOptions,\n): Promise<WorkerClient> {\n const dbPath =\n options?.contextPath ?? resolveDbPath(options?.dbPath);\n const contextId = await computeContextId(dbPath);\n const socketPath = getIpcPath(contextId);\n\n let daemon = discoverDaemon(contextId);\n\n if (!daemon && options?.autoSpawn !== false) {\n const runtime = detectRuntime();\n spawnDaemon(dbPath, runtime, options?.workerScript);\n await waitForDaemon(contextId, options?.connectTimeoutMs);\n daemon = discoverDaemon(contextId);\n }\n\n if (!daemon) {\n throw new Error(\n `kbdb worker daemon did not start: ${readCrashReason(contextId)}`,\n );\n }\n\n const client = new WorkerClient(socketPath, contextId);\n await client.connect();\n return client;\n}\n\nfunction readCrashReason(contextId: string): string {\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n if (!existsSync(crashPath)) {\n return 'daemon failed to start (no details available)';\n }\n try {\n const raw = readFileSync(crashPath, 'utf-8');\n const crash = JSON.parse(raw) as { error?: string };\n unlinkSync(crashPath);\n return crash.error ?? 'unknown error (crash log empty)';\n } catch {\n return 'daemon failed to start (crash log unreadable)';\n }\n}\n", "import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\n/**\n * Resolves the absolute path to the `.kbdb` database directory.\n *\n * Searches for a `.kbdb` sub-directory inside `targetDir`. When\n * `targetDir` is omitted, `process.cwd()` is used as the base.\n *\n * @param targetDir - directory to search in; defaults to cwd\n * @throws {Error} if no `.kbdb` directory exists at the resolved\n * path\n */\nexport function resolveDbPath(targetDir?: string): string {\n const base = targetDir ? resolve(targetDir) : process.cwd();\n const dbPath = join(base, '.kbdb');\n if (!existsSync(dbPath)) {\n throw new Error(`database not found: ${dbPath}`);\n }\n return dbPath;\n}\n", "/**\n * Computes the SHA-256 hash of a UTF-8 string.\n *\n * Uses the Web Crypto API (`crypto.subtle`), which is available\n * in both Deno and Node.js >= 20 without additional imports.\n *\n * @param input - the string to hash\n * @returns lowercase hex-encoded SHA-256 digest (64 characters)\n */\nexport async function computeSha256(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(hash);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import { computeSha256 } from '../../hash/functions/compute-sha256.ts';\n\n/**\n * Computes a short context identifier for an absolute path.\n *\n * Hashes the path with SHA-256 and returns the first 16 hex\n * characters. The result is stable for the same input and unique\n * enough to avoid accidental collisions across typical path sets.\n *\n * @param absolutePath - the absolute filesystem path to identify\n * @returns a 16-character lowercase hex string\n */\nexport async function computeContextId(\n absolutePath: string,\n): Promise<string> {\n const hash = await computeSha256(absolutePath);\n return hash.slice(0, 16);\n}\n", "import { existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { isProcessAlive } from '../../platform/functions/is-process-alive.function.ts';\nimport type { DaemonInfo } from '../typings/daemon-info.model.ts';\n\nexport type { DaemonInfo };\n\n/**\n * Discovers a running worker daemon for the given context.\n *\n * Reads the PID file at `<tmpdir>/kbdb-<contextId>.pid`. If the\n * file exists and the process is alive, returns its PID and the\n * expected socket path. If the file is stale (process dead or PID\n * unparseable), removes the PID file and returns `null`.\n *\n * @param contextId - the 16-character context identifier\n * @returns daemon location info, or `null` if no live daemon found\n */\nexport function discoverDaemon(contextId: string): DaemonInfo | null {\n const pidPath = join(tmpdir(), `kbdb-${contextId}.pid`);\n\n if (!existsSync(pidPath)) return null;\n\n const pidStr = readFileSync(pidPath, 'utf-8').trim();\n const pid = parseInt(pidStr, 10);\n\n if (isNaN(pid) || !isProcessAlive(pid)) {\n try {\n unlinkSync(pidPath);\n } catch {\n // Stale PID file removal is best-effort\n }\n return null;\n }\n\n const socketPath = join(tmpdir(), `kbdb-${contextId}.sock`);\n\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n try {\n unlinkSync(crashPath);\n } catch {\n // stale crash file removal is best-effort\n }\n\n return { pid, socketPath };\n}\n", "/**\n * Checks whether a process with the given PID is alive.\n *\n * Sends signal `0` to the process, which performs a permission\n * check without sending an actual signal. Returns `true` if the\n * process exists and is reachable, `false` otherwise.\n *\n * @param pid - the process identifier to probe\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n", "import { spawn } from 'node:child_process';\nimport type { Runtime } from '../../runtime/typings/runtime.ts';\n\n/**\n * Spawns a detached worker daemon process for the given context.\n *\n * @param contextPath - absolute path to the context directory the\n * daemon should serve\n * @param runtime - the current JavaScript runtime environment\n * @param workerScript - absolute path to the worker daemon script,\n * resolved at the entry point by `resolveWorkerScript`\n */\nexport function spawnDaemon(\n contextPath: string,\n runtime: Runtime,\n workerScript?: string,\n): void {\n if (!workerScript) {\n throw new Error(\n 'workerScript must be provided' + ' (resolve at entry point)',\n );\n }\n const execPath = runtime === 'deno' ? 'deno' : process.execPath;\n\n const args =\n runtime === 'deno'\n ? ['run', '--allow-all', workerScript, contextPath]\n : [workerScript, contextPath];\n\n const child = spawn(execPath, args, {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n}\n", "import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\n\n/** Default maximum wait time for the daemon PID file to appear. */\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/** Polling interval in milliseconds between existence checks. */\nconst POLL_INTERVAL_MS = 100;\n\n/**\n * Waits for the worker daemon's PID file to appear on disk.\n *\n * Polls every 100 ms until the PID file at\n * `<tmpdir>/kbdb-<contextId>.pid` exists or the timeout elapses.\n *\n * @param contextId - the 16-character context identifier\n * @param timeoutMs - maximum wait time in milliseconds; defaults\n * to 10 000 ms\n * @returns `true` if the PID file appeared before the timeout,\n * `false` otherwise\n */\nexport async function waitForDaemon(\n contextId: string,\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n): Promise<boolean> {\n const pidPath = join(tmpdir(), `kbdb-${contextId}.pid`);\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (existsSync(pidPath)) return true;\n await new Promise<void>((r) => setTimeout(r, POLL_INTERVAL_MS));\n }\n return false;\n}\n", "import type { Runtime } from '../typings/runtime.ts';\n\n/**\n * Detects the current JavaScript runtime environment.\n *\n * Returns `'deno'` when the global `Deno` object is present,\n * otherwise returns `'node'`.\n */\nexport function detectRuntime(): Runtime {\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n return 'deno';\n }\n return 'node';\n}\n", "import { join } from 'node:path';\nimport { getTmpdir } from './get-tmpdir.function.ts';\n\n/**\n * Returns the platform-appropriate IPC socket path for a given\n * context identifier.\n *\n * On Windows, returns a named pipe path (`\\\\.\\pipe\\kbdb-<ctx>`).\n * On POSIX systems, returns a Unix domain socket path under the\n * system temp directory (`<tmpdir>/kbdb-<ctx>.sock`).\n *\n * @param ctx - unique context identifier embedded in the path\n */\nexport function getIpcPath(ctx: string): string {\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\kbdb-${ctx}`;\n }\n return join(getTmpdir(), `kbdb-${ctx}.sock`);\n}\n", "import { tmpdir } from 'node:os';\n\n/**\n * Returns the operating system's default temporary directory path.\n */\nexport function getTmpdir(): string {\n return tmpdir();\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/shared/version/constants/version.constant.ts", "../src/shared/worker-client/classes/worker-client.class.ts", "../src/shared/worker-client/functions/create-worker-client.function.ts", "../src/shared/worker-client/functions/resolve-db-path.function.ts", "../src/shared/hash/functions/compute-sha256.ts", "../src/shared/worker-client/functions/compute-context-id.function.ts", "../src/shared/worker-client/functions/discover-daemon.function.ts", "../src/shared/platform/functions/is-process-alive.function.ts", "../src/shared/worker-client/functions/spawn-daemon.function.ts", "../src/shared/worker-client/functions/wait-for-daemon.function.ts", "../src/shared/runtime/functions/detect-runtime.ts", "../src/shared/platform/functions/get-ipc-path.function.ts", "../src/shared/platform/functions/get-tmpdir.function.ts", "../src/shared/worker-client/functions/get-or-create-client.function.ts"],
4
+ "sourcesContent": ["/** Current package version, kept in sync with package.json. */\nexport const VERSION = '0.4.0';\n", "import { connect } from 'node:net';\nimport type { Socket } from 'node:net';\nimport type { SearchParams } from '../typings/search-params.model.ts';\nimport type { PagedSearchResult } from '../typings/search-result.model.ts';\nimport type {\n AddSectionParams,\n Section,\n} from '../typings/section.model.ts';\nimport type { StatusResult } from '../typings/status-result.model.ts';\nimport type { AddSectionResult } from '../typings/add-section-result.model.ts';\nimport type { RemoveSectionResult } from '../typings/remove-section-result.model.ts';\nimport type { ContentResult } from '../typings/content-result.model.ts';\nimport type { IntegrityCheckResult } from '../typings/integrity-check-result.model.ts';\nimport type { GcResult } from '../typings/gc-result.model.ts';\nimport type { RebuildResult } from '../typings/rebuild-result.model.ts';\nimport type { MigrateResult } from '../typings/migrate-result.model.ts';\nimport type { VersionStatus } from '../typings/version-status.model.ts';\nimport type { SectionRecord } from '../../wasm-codec/functions/decode-section-records.function.ts';\nimport type { DocumentManifest } from '../../wasm-codec/functions/decode-document-manifest.function.ts';\nimport type {\n RecallParams,\n RecallResult,\n} from '../typings/recall-result.model.ts';\nimport type { ExportResult } from '../typings/export-result.model.ts';\nimport type { ImportResult } from '../typings/import-result.model.ts';\n\n/** Pending JSON-RPC call awaiting a response from the daemon. */\ninterface PendingCall {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n/** Shape of a JSON-RPC 2.0 error object from the daemon. */\ninterface JsonRpcError {\n readonly code: number;\n readonly message: string;\n}\n\n/** Shape of a JSON-RPC 2.0 response from the daemon. */\ninterface JsonRpcResponse {\n readonly id: number;\n readonly result?: unknown;\n readonly error?: JsonRpcError;\n}\n\n/**\n * IPC client that communicates with the worker daemon over a Unix\n * domain socket (or Windows named pipe) using JSON-RPC 2.0 with\n * newline-delimited message framing.\n *\n * Call `connect()` before any other method and `disconnect()` when\n * done to release the underlying socket.\n */\nexport class WorkerClient {\n /** Underlying socket; `null` when not connected. */\n private socket: Socket | null = null;\n\n /** Monotonically increasing request ID counter. */\n private nextId = 1;\n\n /** Map of outstanding request IDs to their resolve/reject pairs. */\n private readonly pending = new Map<number, PendingCall>();\n\n /** Partial line buffer for split TCP/IPC frames. */\n private buffer = '';\n\n /**\n * @param socketPath - absolute path to the daemon's IPC socket\n * (or Windows named pipe path)\n * @param contextId - 16-character context identifier sent as\n * `ctx` in every JSON-RPC request\n * @param requestTimeoutMs - per-request timeout in ms\n * (0 or undefined disables the timeout)\n */\n constructor(\n private readonly socketPath: string,\n private readonly contextId: string,\n private readonly requestTimeoutMs?: number,\n ) {}\n\n /** Whether the underlying socket is connected. */\n get isConnected(): boolean {\n return this.socket !== null;\n }\n\n /**\n * Establishes the IPC connection to the worker daemon.\n *\n * Retries up to 5 times with exponential backoff on\n * transient errors (`ENOENT`, `ECONNREFUSED`).\n *\n * @throws {Error} if the connection cannot be established\n */\n async connect(): Promise<void> {\n const maxRetries = 5;\n let delay = 50;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n await this.tryConnect();\n return;\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n const retriable =\n code === 'ENOENT' || code === 'ECONNREFUSED';\n if (!retriable || attempt === maxRetries) {\n throw err;\n }\n await new Promise<void>((r) => setTimeout(r, delay));\n delay = Math.min(delay * 2, 1000);\n }\n }\n }\n\n /** Destroys the IPC socket and clears the connection state. */\n disconnect(): void {\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n }\n\n /**\n * Single connection attempt with keepalive and\n * post-connect failure handlers.\n */\n private async tryConnect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const sock = connect(this.socketPath, () => {\n sock.removeListener('error', reject);\n sock.setKeepAlive(true, 30_000);\n sock.on('error', (err: Error) => {\n this.handleSocketFailure(err);\n });\n sock.on('close', () => {\n if (this.pending.size > 0) {\n this.handleSocketFailure(\n new Error('connection closed'),\n );\n }\n this.socket = null;\n });\n this.socket = sock;\n resolve();\n });\n sock.on('error', reject);\n sock.on('data', (chunk: Buffer) => {\n this.handleData(chunk.toString());\n });\n });\n }\n\n /**\n * Rejects all pending calls and marks the client as\n * disconnected.\n */\n private handleSocketFailure(err: Error): void {\n const sock = this.socket;\n this.socket = null;\n for (const [id, call] of this.pending) {\n this.pending.delete(id);\n if (call.timer) clearTimeout(call.timer);\n call.reject(err);\n }\n if (sock) sock.destroy();\n }\n\n /**\n * Searches the knowledge base.\n *\n * @param params - query parameters including the search string\n * @returns paginated search results with metadata\n */\n async search(params: SearchParams): Promise<PagedSearchResult> {\n return this.call('search', {\n ...params,\n algo: params.algo,\n }) as Promise<PagedSearchResult>;\n }\n\n /**\n * Retrieves full content and context for one or more sections by\n * their knowledge-base identifiers.\n *\n * @param params - section identifier(s) and optional expansion depth\n * @returns a single `RecallResult` when `kbid` is provided without\n * `kbids`, or a `RecallResult[]` when `kbids` is provided\n */\n async recall(\n params: RecallParams,\n ): Promise<RecallResult | RecallResult[]> {\n return this.call('recall', params) as Promise<\n RecallResult | RecallResult[]\n >;\n }\n\n /**\n * Adds a new section to the knowledge base.\n *\n * @param params - section content and metadata\n * @returns the result including the assigned knowledge-base\n * identifier and indexing statistics\n */\n async addSection(\n params: AddSectionParams,\n ): Promise<AddSectionResult> {\n return this.call(\n 'addSection',\n params,\n ) as Promise<AddSectionResult>;\n }\n\n /**\n * Replaces an existing section's content and metadata.\n *\n * @param kbid - identifier of the section to update\n * @param params - new content and metadata\n * @returns the knowledge-base identifier of the updated section\n */\n async updateSection(\n kbid: string,\n params: AddSectionParams,\n ): Promise<string> {\n return this.call('updateSection', {\n kbid,\n ...params,\n }) as Promise<string>;\n }\n\n /**\n * Removes a section from the knowledge base.\n *\n * @param kbid - identifier of the section to remove\n * @returns removal result with `removed` flag and elapsed time\n */\n async removeSection(kbid: string): Promise<RemoveSectionResult> {\n return this.call('removeSection', {\n kbid,\n }) as Promise<RemoveSectionResult>;\n }\n\n /**\n * Retrieves multiple sections by their identifiers.\n *\n * @param kbids - list of knowledge-base identifiers to fetch\n * @returns sections in the order their IDs were requested\n */\n async readSections(kbids: string[]): Promise<Section[]> {\n return this.call('readSections', {\n kbids,\n }) as Promise<Section[]>;\n }\n\n /**\n * Groups a set of sections under a named document.\n *\n * @param title - human-readable document title\n * @param kbids - identifiers of the sections to group\n * @param docType - application-level document type tag; omit or\n * pass an empty string for untagged documents\n * @returns the assigned document identifier\n */\n async groupSections(\n title: string,\n kbids: string[],\n docType?: string,\n ): Promise<string> {\n const result = (await this.call('groupSections', {\n title,\n kbids,\n docType: docType ?? '',\n })) as { docid: string } | string;\n return typeof result === 'string' ? result : result.docid;\n }\n\n /**\n * Removes the document grouping for the given document.\n *\n * The sections themselves are not deleted; only the grouping\n * record is removed.\n *\n * @param docid - identifier of the document grouping to remove\n */\n async removeGrouping(docid: string): Promise<void> {\n await this.call('removeGrouping', { docid });\n }\n\n /**\n * Retrieves a full document record including its sections.\n *\n * @param docid - identifier of the document to retrieve\n * @returns the document record as returned by the daemon\n */\n async retrieveDocument(docid: string): Promise<unknown> {\n return this.call('retrieveDocument', { docid });\n }\n\n /**\n * Composes a rendered Markdown document from one or more kbid\n * or docid identifiers.\n *\n * @param ids - list of kbid or docid identifiers (may be mixed)\n * @returns composed Markdown result with character count\n */\n async content(ids: string[]): Promise<ContentResult> {\n return this.call('content', { ids }) as Promise<ContentResult>;\n }\n\n /**\n * Runs an integrity check on the knowledge-base database.\n *\n * @returns a report of all issues found; `ok` is `true` when\n * no errors were detected\n */\n async integrityCheck(): Promise<IntegrityCheckResult> {\n return this.call(\n 'integrityCheck',\n {},\n ) as Promise<IntegrityCheckResult>;\n }\n\n /**\n * Removes unreferenced sections from the database.\n *\n * @returns a report of sections removed and bytes freed\n */\n async gc(): Promise<GcResult> {\n return this.call('gc', {}) as Promise<GcResult>;\n }\n\n /**\n * Reconstructs all index files from section files and document\n * manifests on disk. Text and code sections are re-tokenized;\n * image sections are skipped.\n *\n * @returns a report of sections and terms re-indexed\n */\n async rebuildIndexes(): Promise<RebuildResult> {\n return this.call('rebuildIndexes', {}) as Promise<RebuildResult>;\n }\n\n /**\n * Invalidates the in-memory cache entry for a single section.\n *\n * @param kbid - identifier of the section to evict from cache\n */\n async invalidate(kbid: string): Promise<void> {\n await this.call('invalidate', { kbid });\n }\n\n /** Clears all entries from the daemon's in-memory cache. */\n async invalidateAll(): Promise<void> {\n await this.call('invalidateAll', {});\n }\n\n /**\n * Retrieves diagnostic status information from the daemon.\n *\n * @returns current initialization state and cache statistics\n */\n async status(): Promise<StatusResult> {\n return this.call('status', {}) as Promise<StatusResult>;\n }\n\n /**\n * Returns database metadata and status from the daemon,\n * including document count, section count, index size, and\n * cache statistics.\n *\n * @returns database metadata from the daemon's cached state\n */\n async dbStatus(): Promise<StatusResult> {\n return this.call('dbStatus', {}) as Promise<StatusResult>;\n }\n\n /**\n * Initialises a new `.kbdb` database directory at the given path\n * by sending an init request to the worker daemon.\n *\n * The daemon creates all required subdirectories and seed files via\n * the `worker_init_directory` WASM export.\n *\n * @param targetPath - absolute path to the directory that will\n * contain the new `.kbdb` database\n * @throws {Error} if the `.kbdb` directory already exists or the\n * daemon cannot create the layout\n */\n async initDirectory(targetPath: string): Promise<void> {\n await this.call('initDirectory', { targetPath });\n }\n\n /**\n * Runs all pending database migrations for the `.kbdb` directory\n * at the given path.\n *\n * Delegates to the `worker_migrate` WASM export on the daemon.\n * Each migration step updates `catalog.toml` on success, so\n * retrying after a partial failure is safe.\n *\n * @param targetPath - absolute path to the `.kbdb` database root\n * @returns migration report with old version, new version, and\n * number of migration steps applied\n */\n async migrateDatabase(targetPath: string): Promise<MigrateResult> {\n return this.call('migrateDatabase', {\n targetPath,\n }) as Promise<MigrateResult>;\n }\n\n /**\n * Checks the format version of the `.kbdb` database at the given\n * path against the version required by the current WASM engine.\n *\n * This is a read-only operation: it reads `catalog.toml` and\n * returns the compatibility status without making any changes.\n *\n * @param targetPath - absolute path to the `.kbdb` database root\n * @returns version compatibility report\n */\n async checkVersion(targetPath: string): Promise<VersionStatus> {\n return this.call('checkVersion', {\n targetPath,\n }) as Promise<VersionStatus>;\n }\n\n /**\n * Retrieves all sections whose type name matches the given string.\n *\n * @param sectionType - the application-level type name to filter by\n * @returns all section records with a matching type name\n */\n async listByType(sectionType: string): Promise<SectionRecord[]> {\n return this.call('listByType', {\n sectionType,\n }) as Promise<SectionRecord[]>;\n }\n\n /**\n * Retrieves all documents whose type name matches the given string.\n *\n * @param docType - the application-level document type to filter by\n * @returns all document manifests with a matching type name\n */\n async listDocumentsByType(\n docType: string,\n ): Promise<DocumentManifest[]> {\n return this.call('listDocumentsByType', {\n docType,\n }) as Promise<DocumentManifest[]>;\n }\n\n /**\n * Exports the database to a target directory on disk.\n *\n * Copies section files, document manifests, and `catalog.toml`\n * to `params.path`. Index files are not exported because they\n * are derivable from the section and document data.\n *\n * @param params - optional export parameters\n * @param params.path - target directory path; defaults to\n * `./kbdb-export/` when not provided\n * @returns export report with the resolved path and file counts\n */\n async export(params?: {\n path?: string;\n format?: string;\n }): Promise<ExportResult> {\n return this.call('export', {\n targetPath: params?.path || undefined,\n format: params?.format,\n }) as Promise<ExportResult>;\n }\n\n /**\n * Imports an exported database from the given path.\n *\n * @param params - source path and dry-run flag\n * @returns import report with counts and timing\n */\n async import(params: {\n from: string;\n dryRun: boolean;\n }): Promise<ImportResult> {\n return this.call('importDb', {\n sourcePath: params.from,\n dryRun: params.dryRun,\n }) as Promise<ImportResult>;\n }\n\n /**\n * Sends a JSON-RPC 2.0 request and awaits the response.\n *\n * @param method - the RPC method name\n * @param params - parameters to include in the request\n * @throws {Error} if not connected\n * @throws {Error} when the daemon returns an error response\n */\n private async call(\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const socket = this.socket;\n if (!socket) {\n throw new Error('not connected');\n }\n\n const id = this.nextId++;\n const request = {\n jsonrpc: '2.0',\n id,\n method,\n params: { ctx: this.contextId, ...(params as object) },\n };\n\n const timeoutMs = this.requestTimeoutMs;\n return new Promise<unknown>((resolve, reject) => {\n const call: PendingCall = { resolve, reject };\n if (timeoutMs) {\n call.timer = setTimeout(() => {\n if (!this.pending.has(id)) return;\n this.pending.delete(id);\n const err = new Error(\n `request timeout after ${String(timeoutMs)}ms`,\n );\n (err as unknown as Record<string, unknown>).code =\n 'REQUEST_TIMEOUT';\n reject(err);\n }, timeoutMs);\n }\n this.pending.set(id, call);\n socket.write(JSON.stringify(request) + '\\n');\n });\n }\n\n /**\n * Processes incoming data from the socket, splitting on newlines\n * and dispatching complete JSON-RPC response objects.\n *\n * @param data - raw string chunk received from the socket\n */\n private handleData(data: string): void {\n this.buffer += data;\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const response = JSON.parse(line) as JsonRpcResponse;\n const pending = this.pending.get(response.id);\n if (pending) {\n this.pending.delete(response.id);\n if (pending.timer) clearTimeout(pending.timer);\n if (response.error) {\n const err = new Error(response.error.message);\n (err as unknown as Record<string, unknown>).code =\n response.error.code;\n pending.reject(err);\n } else {\n pending.resolve(response.result);\n }\n }\n } catch {\n // Ignore unparseable lines\n }\n }\n }\n}\n", "import { existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { WorkerClient } from '../classes/worker-client.class.ts';\nimport { resolveDbPath } from './resolve-db-path.function.ts';\nimport { computeContextId } from './compute-context-id.function.ts';\nimport { discoverDaemon } from './discover-daemon.function.ts';\nimport { spawnDaemon } from './spawn-daemon.function.ts';\nimport { waitForDaemon } from './wait-for-daemon.function.ts';\nimport { detectRuntime } from '../../runtime/functions/detect-runtime.ts';\nimport { getIpcPath } from '../../platform/functions/get-ipc-path.function.ts';\nimport type { WorkerClientOptions } from '../typings/worker-client-options.interface.ts';\n\n/**\n * Creates and connects a `WorkerClient` to the worker daemon.\n *\n * Resolves the context path, derives a stable context identifier,\n * and checks whether a daemon is already running. If no daemon is\n * found and `autoSpawn` is not `false`, a new daemon process is\n * spawned and the factory waits for its PID file to appear before\n * connecting.\n *\n * @param options - optional configuration for path resolution,\n * auto-spawn behaviour, and connection timeout\n * @returns a connected `WorkerClient` ready to send requests\n * @throws {Error} if the `.kbdb` directory cannot be found\n * @throws {Error} if the socket connection cannot be established\n */\nexport async function createWorkerClient(\n options?: WorkerClientOptions,\n): Promise<WorkerClient> {\n const dbPath =\n options?.contextPath ?? resolveDbPath(options?.dbPath);\n const contextId = await computeContextId(dbPath);\n const socketPath = getIpcPath(contextId);\n\n let daemon = discoverDaemon(contextId);\n\n if (!daemon && options?.autoSpawn !== false) {\n const runtime = detectRuntime();\n spawnDaemon(dbPath, runtime, options?.workerScript);\n await waitForDaemon(contextId, options?.connectTimeoutMs);\n daemon = discoverDaemon(contextId);\n }\n\n if (!daemon) {\n throw new Error(\n `kbdb worker daemon did not start: ${readCrashReason(contextId)}`,\n );\n }\n\n const client = new WorkerClient(\n socketPath,\n contextId,\n options?.requestTimeoutMs,\n );\n await client.connect();\n return client;\n}\n\nfunction readCrashReason(contextId: string): string {\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n if (!existsSync(crashPath)) {\n return 'daemon failed to start (no details available)';\n }\n try {\n const raw = readFileSync(crashPath, 'utf-8');\n const crash = JSON.parse(raw) as { error?: string };\n unlinkSync(crashPath);\n return crash.error ?? 'unknown error (crash log empty)';\n } catch {\n return 'daemon failed to start (crash log unreadable)';\n }\n}\n", "import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\n/**\n * Resolves the absolute path to the `.kbdb` database directory.\n *\n * Searches for a `.kbdb` sub-directory inside `targetDir`. When\n * `targetDir` is omitted, `process.cwd()` is used as the base.\n *\n * @param targetDir - directory to search in; defaults to cwd\n * @throws {Error} if no `.kbdb` directory exists at the resolved\n * path\n */\nexport function resolveDbPath(targetDir?: string): string {\n const base = targetDir ? resolve(targetDir) : process.cwd();\n const dbPath = join(base, '.kbdb');\n if (!existsSync(dbPath)) {\n throw new Error(`database not found: ${dbPath}`);\n }\n return dbPath;\n}\n", "/**\n * Computes the SHA-256 hash of a UTF-8 string.\n *\n * Uses the Web Crypto API (`crypto.subtle`), which is available\n * in both Deno and Node.js >= 20 without additional imports.\n *\n * @param input - the string to hash\n * @returns lowercase hex-encoded SHA-256 digest (64 characters)\n */\nexport async function computeSha256(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(hash);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import { computeSha256 } from '../../hash/functions/compute-sha256.ts';\n\n/**\n * Computes a short context identifier for an absolute path.\n *\n * Hashes the path with SHA-256 and returns the first 16 hex\n * characters. The result is stable for the same input and unique\n * enough to avoid accidental collisions across typical path sets.\n *\n * @param absolutePath - the absolute filesystem path to identify\n * @returns a 16-character lowercase hex string\n */\nexport async function computeContextId(\n absolutePath: string,\n): Promise<string> {\n const hash = await computeSha256(absolutePath);\n return hash.slice(0, 16);\n}\n", "import { existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { isProcessAlive } from '../../platform/functions/is-process-alive.function.ts';\nimport type { DaemonInfo } from '../typings/daemon-info.model.ts';\n\nexport type { DaemonInfo };\n\n/**\n * Discovers a running worker daemon for the given context.\n *\n * Reads the PID file at `<tmpdir>/kbdb-<contextId>.pid`. If the\n * file exists and the process is alive, returns its PID and the\n * expected socket path. If the file is stale (process dead or PID\n * unparseable), removes the PID file and returns `null`.\n *\n * @param contextId - the 16-character context identifier\n * @returns daemon location info, or `null` if no live daemon found\n */\nexport function discoverDaemon(contextId: string): DaemonInfo | null {\n const pidPath = join(tmpdir(), `kbdb-${contextId}.pid`);\n\n if (!existsSync(pidPath)) return null;\n\n const pidStr = readFileSync(pidPath, 'utf-8').trim();\n const pid = parseInt(pidStr, 10);\n\n if (isNaN(pid) || !isProcessAlive(pid)) {\n try {\n unlinkSync(pidPath);\n } catch {\n // Stale PID file removal is best-effort\n }\n return null;\n }\n\n const socketPath = join(tmpdir(), `kbdb-${contextId}.sock`);\n\n const crashPath = join(tmpdir(), `kbdb-${contextId}.crash`);\n try {\n unlinkSync(crashPath);\n } catch {\n // stale crash file removal is best-effort\n }\n\n return { pid, socketPath };\n}\n", "/**\n * Checks whether a process with the given PID is alive.\n *\n * Sends signal `0` to the process, which performs a permission\n * check without sending an actual signal. Returns `true` if the\n * process exists and is reachable, `false` otherwise.\n *\n * @param pid - the process identifier to probe\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n", "import { spawn } from 'node:child_process';\nimport type { Runtime } from '../../runtime/typings/runtime.ts';\n\n/**\n * Spawns a detached worker daemon process for the given context.\n *\n * @param contextPath - absolute path to the context directory the\n * daemon should serve\n * @param runtime - the current JavaScript runtime environment\n * @param workerScript - absolute path to the worker daemon script,\n * resolved at the entry point by `resolveWorkerScript`\n */\nexport function spawnDaemon(\n contextPath: string,\n runtime: Runtime,\n workerScript?: string,\n): void {\n if (!workerScript) {\n throw new Error(\n 'workerScript must be provided' + ' (resolve at entry point)',\n );\n }\n const execPath = runtime === 'deno' ? 'deno' : process.execPath;\n\n const args =\n runtime === 'deno'\n ? ['run', '--allow-all', workerScript, contextPath]\n : [workerScript, contextPath];\n\n const child = spawn(execPath, args, {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n}\n", "import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\n\n/** Default maximum wait time for the daemon PID file to appear. */\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/** Polling interval in milliseconds between existence checks. */\nconst POLL_INTERVAL_MS = 100;\n\n/**\n * Waits for the worker daemon's PID file to appear on disk.\n *\n * Polls every 100 ms until the PID file at\n * `<tmpdir>/kbdb-<contextId>.pid` exists or the timeout elapses.\n *\n * @param contextId - the 16-character context identifier\n * @param timeoutMs - maximum wait time in milliseconds; defaults\n * to 10 000 ms\n * @returns `true` if the PID file appeared before the timeout,\n * `false` otherwise\n */\nexport async function waitForDaemon(\n contextId: string,\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n): Promise<boolean> {\n const pidPath = join(tmpdir(), `kbdb-${contextId}.pid`);\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (existsSync(pidPath)) return true;\n await new Promise<void>((r) => setTimeout(r, POLL_INTERVAL_MS));\n }\n return false;\n}\n", "import type { Runtime } from '../typings/runtime.ts';\n\n/**\n * Detects the current JavaScript runtime environment.\n *\n * Returns `'deno'` when the global `Deno` object is present,\n * otherwise returns `'node'`.\n */\nexport function detectRuntime(): Runtime {\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n return 'deno';\n }\n return 'node';\n}\n", "import { join } from 'node:path';\nimport { getTmpdir } from './get-tmpdir.function.ts';\n\n/**\n * Returns the platform-appropriate IPC socket path for a given\n * context identifier.\n *\n * On Windows, returns a named pipe path (`\\\\.\\pipe\\kbdb-<ctx>`).\n * On POSIX systems, returns a Unix domain socket path under the\n * system temp directory (`<tmpdir>/kbdb-<ctx>.sock`).\n *\n * @param ctx - unique context identifier embedded in the path\n */\nexport function getIpcPath(ctx: string): string {\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\kbdb-${ctx}`;\n }\n return join(getTmpdir(), `kbdb-${ctx}.sock`);\n}\n", "import { tmpdir } from 'node:os';\n\n/**\n * Returns the operating system's default temporary directory path.\n */\nexport function getTmpdir(): string {\n return tmpdir();\n}\n", "import { createWorkerClient } from './create-worker-client.function.ts';\nimport type { WorkerClient } from '../classes/worker-client.class.ts';\nimport type { WorkerClientOptions } from '../typings/worker-client-options.interface.ts';\nimport { resolveDbPath } from './resolve-db-path.function.ts';\n\n/** Cache of connected clients keyed by database path. */\nconst cache = new Map<string, WorkerClient>();\n\n/**\n * Returns a cached `WorkerClient` for the given context\n * path, or creates and caches a new one if the cached\n * client is disconnected or absent.\n *\n * Intended for library consumers and the MCP server. CLI\n * one-shots should use `createWorkerClient()` directly.\n *\n * @param options - optional configuration forwarded to\n * `createWorkerClient`\n * @returns a connected `WorkerClient`\n */\nexport async function getOrCreateClient(\n options?: WorkerClientOptions,\n): Promise<WorkerClient> {\n const dbPath =\n options?.contextPath ?? resolveDbPath(options?.dbPath);\n const cached = cache.get(dbPath);\n if (cached?.isConnected) return cached;\n cache.delete(dbPath);\n const client = await createWorkerClient(options);\n cache.set(dbPath, client);\n return client;\n}\n\n/**\n * Clears the internal client cache. Intended for tests\n * that need isolation between runs.\n */\nexport function clearClientCache(): void {\n for (const [key, client] of cache) {\n client.disconnect();\n cache.delete(key);\n }\n}\n"],
5
+ "mappings": ";AACO,IAAM,UAAU;;;ACDvB,SAAS,eAAe;AAsDjB,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBvB,YACoB,YACA,WACA,kBAClB;AAHkB;AACA;AACA;AAAA,EACjB;AAAA;AAAA,EAvBK,SAAwB;AAAA;AAAA,EAGxB,SAAS;AAAA;AAAA,EAGA,UAAU,oBAAI,IAAyB;AAAA;AAAA,EAGhD,SAAS;AAAA;AAAA,EAiBjB,IAAI,cAAuB;AACxB,WAAO,KAAK,WAAW;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAyB;AAC5B,UAAM,aAAa;AACnB,QAAI,QAAQ;AACZ,aAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACrD,UAAI;AACD,cAAM,KAAK,WAAW;AACtB;AAAA,MACH,SAAS,KAAc;AACpB,cAAM,OAAQ,IAA8B;AAC5C,cAAM,YACH,SAAS,YAAY,SAAS;AACjC,YAAI,CAAC,aAAa,YAAY,YAAY;AACvC,gBAAM;AAAA,QACT;AACA,cAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACnD,gBAAQ,KAAK,IAAI,QAAQ,GAAG,GAAI;AAAA,MACnC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,aAAmB;AAChB,QAAI,KAAK,QAAQ;AACd,WAAK,OAAO,QAAQ;AACpB,WAAK,SAAS;AAAA,IACjB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAA4B;AACvC,WAAO,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,YAAM,OAAO,QAAQ,KAAK,YAAY,MAAM;AACzC,aAAK,eAAe,SAAS,MAAM;AACnC,aAAK,aAAa,MAAM,GAAM;AAC9B,aAAK,GAAG,SAAS,CAAC,QAAe;AAC9B,eAAK,oBAAoB,GAAG;AAAA,QAC/B,CAAC;AACD,aAAK,GAAG,SAAS,MAAM;AACpB,cAAI,KAAK,QAAQ,OAAO,GAAG;AACxB,iBAAK;AAAA,cACF,IAAI,MAAM,mBAAmB;AAAA,YAChC;AAAA,UACH;AACA,eAAK,SAAS;AAAA,QACjB,CAAC;AACD,aAAK,SAAS;AACd,QAAAA,SAAQ;AAAA,MACX,CAAC;AACD,WAAK,GAAG,SAAS,MAAM;AACvB,WAAK,GAAG,QAAQ,CAAC,UAAkB;AAChC,aAAK,WAAW,MAAM,SAAS,CAAC;AAAA,MACnC,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,KAAkB;AAC3C,UAAM,OAAO,KAAK;AAClB,SAAK,SAAS;AACd,eAAW,CAAC,IAAI,IAAI,KAAK,KAAK,SAAS;AACpC,WAAK,QAAQ,OAAO,EAAE;AACtB,UAAI,KAAK,MAAO,cAAa,KAAK,KAAK;AACvC,WAAK,OAAO,GAAG;AAAA,IAClB;AACA,QAAI,KAAM,MAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAkD;AAC5D,WAAO,KAAK,KAAK,UAAU;AAAA,MACxB,GAAG;AAAA,MACH,MAAM,OAAO;AAAA,IAChB,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OACH,QACuC;AACvC,WAAO,KAAK,KAAK,UAAU,MAAM;AAAA,EAGpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WACH,QAC0B;AAC1B,WAAO,KAAK;AAAA,MACT;AAAA,MACA;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACH,MACA,QACgB;AAChB,WAAO,KAAK,KAAK,iBAAiB;AAAA,MAC/B;AAAA,MACA,GAAG;AAAA,IACN,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,MAA4C;AAC7D,WAAO,KAAK,KAAK,iBAAiB;AAAA,MAC/B;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAa,OAAqC;AACrD,WAAO,KAAK,KAAK,gBAAgB;AAAA,MAC9B;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cACH,OACA,OACA,SACgB;AAChB,UAAM,SAAU,MAAM,KAAK,KAAK,iBAAiB;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,IACvB,CAAC;AACD,WAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe,OAA8B;AAChD,UAAM,KAAK,KAAK,kBAAkB,EAAE,MAAM,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,OAAiC;AACrD,WAAO,KAAK,KAAK,oBAAoB,EAAE,MAAM,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,KAAuC;AAClD,WAAO,KAAK,KAAK,WAAW,EAAE,IAAI,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAgD;AACnD,WAAO,KAAK;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAwB;AAC3B,WAAO,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAyC;AAC5C,WAAO,KAAK,KAAK,kBAAkB,CAAC,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,MAA6B;AAC3C,UAAM,KAAK,KAAK,cAAc,EAAE,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,gBAA+B;AAClC,UAAM,KAAK,KAAK,iBAAiB,CAAC,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAgC;AACnC,WAAO,KAAK,KAAK,UAAU,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAkC;AACrC,WAAO,KAAK,KAAK,YAAY,CAAC,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,cAAc,YAAmC;AACpD,UAAM,KAAK,KAAK,iBAAiB,EAAE,WAAW,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,gBAAgB,YAA4C;AAC/D,WAAO,KAAK,KAAK,mBAAmB;AAAA,MACjC;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,aAAa,YAA4C;AAC5D,WAAO,KAAK,KAAK,gBAAgB;AAAA,MAC9B;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,aAA+C;AAC7D,WAAO,KAAK,KAAK,cAAc;AAAA,MAC5B;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBACH,SAC4B;AAC5B,WAAO,KAAK,KAAK,uBAAuB;AAAA,MACrC;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAO,QAGa;AACvB,WAAO,KAAK,KAAK,UAAU;AAAA,MACxB,YAAY,QAAQ,QAAQ;AAAA,MAC5B,QAAQ,QAAQ;AAAA,IACnB,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAGa;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC1B,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,IAClB,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,KACX,QACA,QACiB;AACjB,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,QAAQ;AACV,YAAM,IAAI,MAAM,eAAe;AAAA,IAClC;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,UAAU;AAAA,MACb,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ,EAAE,KAAK,KAAK,WAAW,GAAI,OAAkB;AAAA,IACxD;AAEA,UAAM,YAAY,KAAK;AACvB,WAAO,IAAI,QAAiB,CAACA,UAAS,WAAW;AAC9C,YAAM,OAAoB,EAAE,SAAAA,UAAS,OAAO;AAC5C,UAAI,WAAW;AACZ,aAAK,QAAQ,WAAW,MAAM;AAC3B,cAAI,CAAC,KAAK,QAAQ,IAAI,EAAE,EAAG;AAC3B,eAAK,QAAQ,OAAO,EAAE;AACtB,gBAAM,MAAM,IAAI;AAAA,YACb,yBAAyB,OAAO,SAAS,CAAC;AAAA,UAC7C;AACA,UAAC,IAA2C,OACzC;AACH,iBAAO,GAAG;AAAA,QACb,GAAG,SAAS;AAAA,MACf;AACA,WAAK,QAAQ,IAAI,IAAI,IAAI;AACzB,aAAO,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,IAC9C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,WAAW,MAAoB;AACpC,SAAK,UAAU;AACf,UAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;AACpC,SAAK,SAAS,MAAM,IAAI,KAAK;AAE7B,eAAW,QAAQ,OAAO;AACvB,UAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAI;AACD,cAAM,WAAW,KAAK,MAAM,IAAI;AAChC,cAAM,UAAU,KAAK,QAAQ,IAAI,SAAS,EAAE;AAC5C,YAAI,SAAS;AACV,eAAK,QAAQ,OAAO,SAAS,EAAE;AAC/B,cAAI,QAAQ,MAAO,cAAa,QAAQ,KAAK;AAC7C,cAAI,SAAS,OAAO;AACjB,kBAAM,MAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAC5C,YAAC,IAA2C,OACzC,SAAS,MAAM;AAClB,oBAAQ,OAAO,GAAG;AAAA,UACrB,OAAO;AACJ,oBAAQ,QAAQ,SAAS,MAAM;AAAA,UAClC;AAAA,QACH;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACH;AAAA,EACH;AACH;;;ACvjBA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,cAAAC,mBAAkB;AACrD,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;;;ACFvB,SAAS,kBAAkB;AAC3B,SAAS,MAAM,eAAe;AAYvB,SAAS,cAAc,WAA4B;AACvD,QAAM,OAAO,YAAY,QAAQ,SAAS,IAAI,QAAQ,IAAI;AAC1D,QAAM,SAAS,KAAK,MAAM,OAAO;AACjC,MAAI,CAAC,WAAW,MAAM,GAAG;AACtB,UAAM,IAAI,MAAM,uBAAuB,MAAM,EAAE;AAAA,EAClD;AACA,SAAO;AACV;;;ACXA,eAAsB,cAAc,OAAgC;AACjE,QAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAC3C,QAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AACvD,QAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,SAAO,MAAM,KAAK,KAAK,EACnB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACd;;;ACJA,eAAsB,iBACnB,cACgB;AAChB,QAAM,OAAO,MAAM,cAAc,YAAY;AAC7C,SAAO,KAAK,MAAM,GAAG,EAAE;AAC1B;;;ACjBA,SAAS,cAAAC,aAAY,cAAc,kBAAkB;AACrD,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAc;;;ACOhB,SAAS,eAAe,KAAsB;AAClD,MAAI;AACD,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACV,QAAQ;AACL,WAAO;AAAA,EACV;AACH;;;ADGO,SAAS,eAAe,WAAsC;AAClE,QAAM,UAAUC,MAAK,OAAO,GAAG,QAAQ,SAAS,MAAM;AAEtD,MAAI,CAACC,YAAW,OAAO,EAAG,QAAO;AAEjC,QAAM,SAAS,aAAa,SAAS,OAAO,EAAE,KAAK;AACnD,QAAM,MAAM,SAAS,QAAQ,EAAE;AAE/B,MAAI,MAAM,GAAG,KAAK,CAAC,eAAe,GAAG,GAAG;AACrC,QAAI;AACD,iBAAW,OAAO;AAAA,IACrB,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACV;AAEA,QAAM,aAAaD,MAAK,OAAO,GAAG,QAAQ,SAAS,OAAO;AAE1D,QAAM,YAAYA,MAAK,OAAO,GAAG,QAAQ,SAAS,QAAQ;AAC1D,MAAI;AACD,eAAW,SAAS;AAAA,EACvB,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,KAAK,WAAW;AAC5B;;;AE9CA,SAAS,aAAa;AAYf,SAAS,YACb,aACA,SACA,cACK;AACL,MAAI,CAAC,cAAc;AAChB,UAAM,IAAI;AAAA,MACP;AAAA,IACH;AAAA,EACH;AACA,QAAM,WAAW,YAAY,SAAS,SAAS,QAAQ;AAEvD,QAAM,OACH,YAAY,SACP,CAAC,OAAO,eAAe,cAAc,WAAW,IAChD,CAAC,cAAc,WAAW;AAElC,QAAM,QAAQ,MAAM,UAAU,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,OAAO;AAAA,EACV,CAAC;AACD,QAAM,MAAM;AACf;;;AClCA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;AAGvB,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAczB,eAAsB,cACnB,WACA,YAAoB,oBACH;AACjB,QAAM,UAAUD,MAAKC,QAAO,GAAG,QAAQ,SAAS,MAAM;AACtD,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,KAAK,IAAI,IAAI,QAAQ,WAAW;AACpC,QAAIF,YAAW,OAAO,EAAG,QAAO;AAChC,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAAA,EACjE;AACA,SAAO;AACV;;;ACzBO,SAAS,gBAAyB;AACtC,MAAI,OAAO,eAAe,eAAe,UAAU,YAAY;AAC5D,WAAO;AAAA,EACV;AACA,SAAO;AACV;;;ACbA,SAAS,QAAAG,aAAY;;;ACArB,SAAS,UAAAC,eAAc;AAKhB,SAAS,YAAoB;AACjC,SAAOA,QAAO;AACjB;;;ADMO,SAAS,WAAW,KAAqB;AAC7C,MAAI,QAAQ,aAAa,SAAS;AAC/B,WAAO,qBAAqB,GAAG;AAAA,EAClC;AACA,SAAOC,MAAK,UAAU,GAAG,QAAQ,GAAG,OAAO;AAC9C;;;ATUA,eAAsB,mBACnB,SACsB;AACtB,QAAM,SACH,SAAS,eAAe,cAAc,SAAS,MAAM;AACxD,QAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,QAAM,aAAa,WAAW,SAAS;AAEvC,MAAI,SAAS,eAAe,SAAS;AAErC,MAAI,CAAC,UAAU,SAAS,cAAc,OAAO;AAC1C,UAAM,UAAU,cAAc;AAC9B,gBAAY,QAAQ,SAAS,SAAS,YAAY;AAClD,UAAM,cAAc,WAAW,SAAS,gBAAgB;AACxD,aAAS,eAAe,SAAS;AAAA,EACpC;AAEA,MAAI,CAAC,QAAQ;AACV,UAAM,IAAI;AAAA,MACP,qCAAqC,gBAAgB,SAAS,CAAC;AAAA,IAClE;AAAA,EACH;AAEA,QAAM,SAAS,IAAI;AAAA,IAChB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACZ;AACA,QAAM,OAAO,QAAQ;AACrB,SAAO;AACV;AAEA,SAAS,gBAAgB,WAA2B;AACjD,QAAM,YAAYC,MAAKC,QAAO,GAAG,QAAQ,SAAS,QAAQ;AAC1D,MAAI,CAACC,YAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACV;AACA,MAAI;AACD,UAAM,MAAMC,cAAa,WAAW,OAAO;AAC3C,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,IAAAC,YAAW,SAAS;AACpB,WAAO,MAAM,SAAS;AAAA,EACzB,QAAQ;AACL,WAAO;AAAA,EACV;AACH;;;AWnEA,IAAM,QAAQ,oBAAI,IAA0B;AAc5C,eAAsB,kBACnB,SACsB;AACtB,QAAM,SACH,SAAS,eAAe,cAAc,SAAS,MAAM;AACxD,QAAM,SAAS,MAAM,IAAI,MAAM;AAC/B,MAAI,QAAQ,YAAa,QAAO;AAChC,QAAM,OAAO,MAAM;AACnB,QAAM,SAAS,MAAM,mBAAmB,OAAO;AAC/C,QAAM,IAAI,QAAQ,MAAM;AACxB,SAAO;AACV;",
6
6
  "names": ["resolve", "existsSync", "readFileSync", "unlinkSync", "join", "tmpdir", "existsSync", "join", "join", "existsSync", "existsSync", "join", "tmpdir", "join", "tmpdir", "join", "join", "tmpdir", "existsSync", "readFileSync", "unlinkSync"]
7
7
  }
@@ -20,6 +20,7 @@ import type { AgentGetClient } from './run-agent-get.function.ts';
20
20
  import type { AgentDeleteClient } from './run-agent-delete.function.ts';
21
21
  import type { RecallClient } from './run-recall.function.ts';
22
22
  import type { ExportClient } from './run-export.function.ts';
23
+ import type { ImportClient } from './run-import.function.ts';
23
24
  /**
24
25
  * Intersection of all data-command client interfaces.
25
26
  *
@@ -27,7 +28,7 @@ import type { ExportClient } from './run-export.function.ts';
27
28
  * intersection combines them so `dispatchCommand` can route
28
29
  * to any command handler with full type safety.
29
30
  */
30
- export type DispatchClient = SearchClient & LearnClient & UnlearnClient & ContentClient & CheckClient & GcClient & RebuildClient & StatusClient & DbMigrateClient & SkillLearnClient & SkillListClient & SkillGetClient & SkillDeleteClient & AgentCreateClient & AgentListClient & AgentGetClient & AgentDeleteClient & RecallClient & ExportClient;
31
+ export type DispatchClient = SearchClient & LearnClient & UnlearnClient & ContentClient & CheckClient & GcClient & RebuildClient & StatusClient & DbMigrateClient & SkillLearnClient & SkillListClient & SkillGetClient & SkillDeleteClient & AgentCreateClient & AgentListClient & AgentGetClient & AgentDeleteClient & RecallClient & ExportClient & ImportClient;
31
32
  /**
32
33
  * Routes a parsed CLI command to the appropriate handler and
33
34
  * returns a `CommandResult` without touching process globals.
@@ -1,13 +1,12 @@
1
1
  /**
2
- * Resolves the absolute path to the `.kbdb` database directory
3
- * under the given base path (or the current working directory).
2
+ * Locates the `.kbdb` database directory.
4
3
  *
5
- * Unlike `ensureDb`, this function is purely read-only: it never
6
- * creates the directory. Returns `null` when the `.kbdb` directory
7
- * does not exist.
4
+ * When `dbPath` is provided, checks only that directory.
5
+ * When omitted, walks up from the current working directory
6
+ * until a `.kbdb` directory is found or the filesystem root
7
+ * is reached.
8
8
  *
9
- * @param dbPath - optional path to the knowledge-base root directory
10
- * @returns absolute path to the `.kbdb` directory, or `null` when
11
- * it does not exist
9
+ * @param dbPath - explicit base directory; skips traversal
10
+ * @returns absolute path to `.kbdb`, or `null` when not found
12
11
  */
13
12
  export declare function findDb(dbPath?: string): string | null;
@@ -8,7 +8,7 @@ import type { CliDeps } from '../typings/cli-deps.interface.ts';
8
8
  * the version gate, and starts the MCP server. Disconnects the
9
9
  * worker client when finished.
10
10
  *
11
- * @param options - parsed CLI options (uses `dbPath` and env fallback)
11
+ * @param options - parsed CLI options
12
12
  * @param deps - injectable CLI dependencies
13
13
  * @returns a `CommandResult` with `exitCode: 0` on success
14
14
  */
@@ -8,9 +8,10 @@ import type { CliOptions } from '../typings/cli-options.interface.ts';
8
8
  * becomes the command; subsequent non-flag tokens become `args`.
9
9
  *
10
10
  * Compound commands are supported: when the first positional token is
11
- * a group name (`db`, `skill`, or `agent`), the next positional token
12
- * is joined with a hyphen to form the compound command
13
- * (e.g. `db init` → `'db-init'`).
11
+ * a group name (`db`, `skill`, `agent`, or `worker`), the next
12
+ * positional token is joined with a hyphen to form the compound
13
+ * command (e.g. `db init` → `'db-init'`,
14
+ * `worker stop` → `'worker-stop'`).
14
15
  *
15
16
  * Context-aware `--help`: when `--help` or `-h` appears after a
16
17
  * command has been set, the existing command is moved to `args[0]`
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Minimal client interface for listing section kbids.
3
+ *
4
+ * Decouples prefix resolution from the concrete
5
+ * `WorkerClient` so tests can use lightweight mocks.
6
+ */
7
+ export interface PrefixResolver {
8
+ /** Returns all sections of the given type. */
9
+ listByType(sectionType: string): Promise<readonly {
10
+ kbid: string;
11
+ }[]>;
12
+ }
13
+ /**
14
+ * Resolves a potentially short kbid prefix to its full
15
+ * 26-character identifier.
16
+ *
17
+ * Full-length identifiers (>= 26 chars) are returned as-is.
18
+ * For shorter prefixes, all section types are scanned to find
19
+ * matching kbids. Throws when no match is found or the prefix
20
+ * is ambiguous (matches more than one kbid).
21
+ *
22
+ * @param prefix - full or partial kbid string
23
+ * @param client - client providing `listByType`
24
+ * @returns the resolved full kbid
25
+ * @throws when no match or ambiguous match is found
26
+ */
27
+ export declare function resolveKbidPrefix(prefix: string, client: PrefixResolver): Promise<string>;
@@ -0,0 +1,10 @@
1
+ import type { CliOptions } from '../typings/cli-options.interface.ts';
2
+ /**
3
+ * Resolves the explicit database path from CLI
4
+ * options or the `KBDB_DB_DIR` environment variable.
5
+ *
6
+ * Returns `undefined` when neither is set so that
7
+ * `findDb` can fall back to upward directory
8
+ * traversal from the current working directory.
9
+ */
10
+ export declare function resolveRawDbPath(options: Pick<CliOptions, 'dbPath'>): string | undefined;
@@ -18,13 +18,15 @@ export interface DisconnectableClient extends DispatchClient {
18
18
  */
19
19
  export interface CliDeps {
20
20
  isStdinTty: () => boolean;
21
+ isStdoutTty: () => boolean;
21
22
  promptUser: (question: string) => Promise<string>;
22
23
  createWorkerClient: (opts: {
23
24
  contextPath: string;
25
+ requestTimeoutMs?: number;
24
26
  }) => Promise<DisconnectableClient>;
25
27
  findDb: (basePath?: string) => string | null;
26
28
  runInit: (options: CliOptions) => InitResult;
27
- startMcpServer?: (contextPath: string) => Promise<void>;
29
+ startMcpServer?: (contextPath: string, clientFactory?: () => Promise<DisconnectableClient>, maxRetries?: number) => Promise<void>;
28
30
  }
29
31
  /**
30
32
  * Full CLI orchestrator extracted from `src/cli.ts`.
@@ -1,4 +1,5 @@
1
1
  import type { CliOptions } from '../typings/cli-options.interface.ts';
2
+ import type { PrefixResolver } from './resolve-kbid-prefix.function.ts';
2
3
  /** Result returned by content composition. */
3
4
  interface ContentResult {
4
5
  /** MIME type of the composed output, always `'text/markdown'`. */
@@ -13,8 +14,10 @@ interface ContentResult {
13
14
  *
14
15
  * Decouples the CLI function from the concrete `WorkerClient`
15
16
  * implementation, making it straightforward to test with mocks.
17
+ * Extends `PrefixResolver` so short kbid prefixes can be resolved
18
+ * before the content call is made.
16
19
  */
17
- export interface ContentClient {
20
+ export interface ContentClient extends PrefixResolver {
18
21
  /**
19
22
  * Composes a rendered Markdown document from one or more kbid
20
23
  * or docid identifiers.
@@ -28,13 +31,15 @@ export interface ContentClient {
28
31
  * Composes and returns a rendered Markdown document from the
29
32
  * identifiers listed in `options.args`.
30
33
  *
31
- * Delegates to `client.content(ids)`. The caller is responsible for
32
- * writing the result to stdout.
34
+ * Short kbid prefixes in `options.args` are resolved to full
35
+ * identifiers before calling `client.content`. The caller is
36
+ * responsible for writing the result to stdout.
33
37
  *
34
38
  * @param client - content client to delegate composition to
35
39
  * @param options - parsed CLI options whose `args` list the kbid or
36
40
  * docid identifiers to compose
37
41
  * @returns the composed content result from the daemon
42
+ * @throws when a prefix matches no section or is ambiguous
38
43
  */
39
44
  export declare function runContent(client: ContentClient, options: CliOptions): Promise<ContentResult>;
40
45
  export {};
@@ -0,0 +1,27 @@
1
+ import type { CliOptions } from '../typings/cli-options.interface.ts';
2
+ import type { ImportResult } from '../../worker-client/typings/import-result.model.ts';
3
+ /**
4
+ * Minimal client interface required by `runImport`.
5
+ */
6
+ export interface ImportClient {
7
+ /**
8
+ * Imports an exported database from the given directory.
9
+ *
10
+ * @param params - source path and dry-run flag
11
+ * @returns import report with counts and timing
12
+ */
13
+ import(params: {
14
+ from: string;
15
+ dryRun: boolean;
16
+ }): Promise<ImportResult>;
17
+ }
18
+ /**
19
+ * Imports an exported knowledge-base from the path specified by
20
+ * `--from`, delegating to the worker client.
21
+ *
22
+ * @param client - import client to delegate to
23
+ * @param options - parsed CLI options with `from` path
24
+ * @returns the import result with section/document counts
25
+ * @throws when `--from` is not provided
26
+ */
27
+ export declare function runImport(client: ImportClient, options: CliOptions): Promise<ImportResult>;
@@ -1,12 +1,15 @@
1
1
  import type { CliOptions } from '../typings/cli-options.interface.ts';
2
2
  import type { RecallResult } from '../../worker-client/typings/recall-result.model.ts';
3
+ import type { PrefixResolver } from './resolve-kbid-prefix.function.ts';
3
4
  /**
4
5
  * Minimal client interface required by `runRecall`.
5
6
  *
6
7
  * Decouples the CLI function from the concrete `WorkerClient`
7
8
  * implementation, making it straightforward to test with mocks.
9
+ * Extends `PrefixResolver` so short kbid prefixes can be resolved
10
+ * before the recall call is made.
8
11
  */
9
- export interface RecallClient {
12
+ export interface RecallClient extends PrefixResolver {
10
13
  /**
11
14
  * Retrieves full content and context for one or more sections
12
15
  * by their knowledge-base identifiers.
@@ -27,9 +30,11 @@ export interface RecallClient {
27
30
  * sections by kbid via the provided client.
28
31
  *
29
32
  * Returns an error result when no kbids are provided in
30
- * `options.args`. For a single kbid, calls `client.recall` with the
31
- * `kbid` parameter and returns the single `RecallResult`. For
32
- * multiple kbids, calls `client.recall` with the `kbids` array.
33
+ * `options.args`. Short kbid prefixes in `options.args` are
34
+ * resolved to full identifiers before the recall call. For a single
35
+ * kbid, calls `client.recall` with the `kbid` parameter and returns
36
+ * the single `RecallResult`. For multiple kbids, calls
37
+ * `client.recall` with the `kbids` array.
33
38
  *
34
39
  * The `depth` option is read from `options.depth`, defaulting to 0
35
40
  * and clamped to the range 0--3.
@@ -39,6 +44,7 @@ export interface RecallClient {
39
44
  * expansion depth in `depth`
40
45
  * @returns the `RecallResult` or `RecallResult[]` from the client,
41
46
  * or an error object when no kbids are provided
47
+ * @throws when a prefix matches no section or is ambiguous
42
48
  */
43
49
  export declare function runRecall(client: RecallClient, options: CliOptions): Promise<RecallResult | RecallResult[] | {
44
50
  error: string;