@vpxa/kb 0.1.13 → 0.1.16

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 (490) hide show
  1. package/README.md +65 -12
  2. package/package.json +14 -7
  3. package/packages/analyzers/dist/blast-radius-analyzer.d.ts +17 -21
  4. package/packages/analyzers/dist/blast-radius-analyzer.js +5 -12
  5. package/packages/analyzers/dist/dependency-analyzer.d.ts +31 -28
  6. package/packages/analyzers/dist/dependency-analyzer.js +6 -9
  7. package/packages/analyzers/dist/diagram-generator.d.ts +12 -9
  8. package/packages/analyzers/dist/diagram-generator.js +2 -4
  9. package/packages/analyzers/dist/entry-point-analyzer.d.ts +39 -36
  10. package/packages/analyzers/dist/entry-point-analyzer.js +4 -6
  11. package/packages/analyzers/dist/index.d.ts +12 -14
  12. package/packages/analyzers/dist/index.js +1 -1
  13. package/packages/analyzers/dist/knowledge-producer.d.ts +34 -26
  14. package/packages/analyzers/dist/knowledge-producer.js +17 -15
  15. package/packages/analyzers/dist/pattern-analyzer.d.ts +14 -11
  16. package/packages/analyzers/dist/pattern-analyzer.js +2 -5
  17. package/packages/analyzers/dist/regex-call-graph.d.ts +6 -13
  18. package/packages/analyzers/dist/regex-call-graph.js +1 -1
  19. package/packages/analyzers/dist/structure-analyzer.d.ts +13 -10
  20. package/packages/analyzers/dist/structure-analyzer.js +2 -4
  21. package/packages/analyzers/dist/symbol-analyzer.d.ts +13 -9
  22. package/packages/analyzers/dist/symbol-analyzer.js +9 -13
  23. package/packages/analyzers/dist/ts-call-graph.d.ts +16 -14
  24. package/packages/analyzers/dist/ts-call-graph.js +1 -1
  25. package/packages/analyzers/dist/types.d.ts +82 -80
  26. package/packages/analyzers/dist/types.js +1 -0
  27. package/packages/chunker/dist/call-graph-extractor.d.ts +15 -12
  28. package/packages/chunker/dist/call-graph-extractor.js +1 -1
  29. package/packages/chunker/dist/chunker-factory.d.ts +16 -4
  30. package/packages/chunker/dist/chunker-factory.js +1 -1
  31. package/packages/chunker/dist/chunker.interface.d.ts +8 -5
  32. package/packages/chunker/dist/chunker.interface.js +1 -0
  33. package/packages/chunker/dist/code-chunker.d.ts +16 -13
  34. package/packages/chunker/dist/code-chunker.js +11 -14
  35. package/packages/chunker/dist/extractors/call-extractor.d.ts +24 -0
  36. package/packages/chunker/dist/extractors/call-extractor.js +1 -0
  37. package/packages/chunker/dist/extractors/entry-point-detector.d.ts +14 -0
  38. package/packages/chunker/dist/extractors/entry-point-detector.js +1 -0
  39. package/packages/chunker/dist/extractors/import-extractor.d.ts +14 -0
  40. package/packages/chunker/dist/extractors/import-extractor.js +1 -0
  41. package/packages/chunker/dist/extractors/pattern-detector.d.ts +14 -0
  42. package/packages/chunker/dist/extractors/pattern-detector.js +1 -0
  43. package/packages/chunker/dist/extractors/scope-resolver.d.ts +26 -0
  44. package/packages/chunker/dist/extractors/scope-resolver.js +1 -0
  45. package/packages/chunker/dist/extractors/symbol-extractor.d.ts +14 -0
  46. package/packages/chunker/dist/extractors/symbol-extractor.js +1 -0
  47. package/packages/chunker/dist/extractors/types.d.ts +36 -0
  48. package/packages/chunker/dist/extractors/types.js +1 -0
  49. package/packages/chunker/dist/generic-chunker.d.ts +14 -11
  50. package/packages/chunker/dist/generic-chunker.js +5 -5
  51. package/packages/chunker/dist/index.d.ts +19 -8
  52. package/packages/chunker/dist/index.js +1 -1
  53. package/packages/chunker/dist/markdown-chunker.d.ts +16 -13
  54. package/packages/chunker/dist/markdown-chunker.js +3 -10
  55. package/packages/chunker/dist/wasm/languages.d.ts +18 -0
  56. package/packages/chunker/dist/wasm/languages.js +1 -0
  57. package/packages/chunker/dist/wasm/query-executor.d.ts +70 -0
  58. package/packages/chunker/dist/wasm/query-executor.js +1 -0
  59. package/packages/chunker/dist/wasm/runtime.d.ts +44 -0
  60. package/packages/chunker/dist/wasm/runtime.js +1 -0
  61. package/packages/chunker/dist/wasm/types.d.ts +84 -0
  62. package/packages/chunker/dist/wasm/types.js +1 -0
  63. package/packages/chunker/dist/wasm-chunker.d.ts +23 -0
  64. package/packages/chunker/dist/wasm-chunker.js +6 -0
  65. package/packages/chunker/src/queries/go/calls.scm +11 -0
  66. package/packages/chunker/src/queries/go/entry-points.scm +20 -0
  67. package/packages/chunker/src/queries/go/imports.scm +6 -0
  68. package/packages/chunker/src/queries/go/patterns.scm +25 -0
  69. package/packages/chunker/src/queries/go/symbols.scm +26 -0
  70. package/packages/chunker/src/queries/java/calls.scm +10 -0
  71. package/packages/chunker/src/queries/java/entry-points.scm +27 -0
  72. package/packages/chunker/src/queries/java/imports.scm +11 -0
  73. package/packages/chunker/src/queries/java/patterns.scm +27 -0
  74. package/packages/chunker/src/queries/java/symbols.scm +28 -0
  75. package/packages/chunker/src/queries/javascript/calls.scm +21 -0
  76. package/packages/chunker/src/queries/javascript/entry-points.scm +31 -0
  77. package/packages/chunker/src/queries/javascript/imports.scm +32 -0
  78. package/packages/chunker/src/queries/javascript/patterns.scm +28 -0
  79. package/packages/chunker/src/queries/javascript/symbols.scm +52 -0
  80. package/packages/chunker/src/queries/python/calls.scm +11 -0
  81. package/packages/chunker/src/queries/python/entry-points.scm +21 -0
  82. package/packages/chunker/src/queries/python/imports.scm +14 -0
  83. package/packages/chunker/src/queries/python/patterns.scm +25 -0
  84. package/packages/chunker/src/queries/python/symbols.scm +17 -0
  85. package/packages/chunker/src/queries/rust/calls.scm +20 -0
  86. package/packages/chunker/src/queries/rust/entry-points.scm +7 -0
  87. package/packages/chunker/src/queries/rust/imports.scm +26 -0
  88. package/packages/chunker/src/queries/rust/patterns.scm +18 -0
  89. package/packages/chunker/src/queries/rust/symbols.scm +73 -0
  90. package/packages/chunker/src/queries/typescript/calls.scm +21 -0
  91. package/packages/chunker/src/queries/typescript/entry-points.scm +48 -0
  92. package/packages/chunker/src/queries/typescript/imports.scm +35 -0
  93. package/packages/chunker/src/queries/typescript/patterns.scm +47 -0
  94. package/packages/chunker/src/queries/typescript/symbols.scm +79 -0
  95. package/packages/chunker/wasm/tree-sitter-go.wasm +0 -0
  96. package/packages/chunker/wasm/tree-sitter-java.wasm +0 -0
  97. package/packages/chunker/wasm/tree-sitter-javascript.wasm +0 -0
  98. package/packages/chunker/wasm/tree-sitter-python.wasm +0 -0
  99. package/packages/chunker/wasm/tree-sitter-rust.wasm +0 -0
  100. package/packages/chunker/wasm/tree-sitter-typescript.wasm +0 -0
  101. package/packages/chunker/wasm/tree-sitter.wasm +0 -0
  102. package/packages/cli/dist/commands/analyze.d.ts +6 -3
  103. package/packages/cli/dist/commands/analyze.js +2 -3
  104. package/packages/cli/dist/commands/context-cmds.d.ts +6 -3
  105. package/packages/cli/dist/commands/context-cmds.js +1 -1
  106. package/packages/cli/dist/commands/environment.d.ts +6 -3
  107. package/packages/cli/dist/commands/environment.js +1 -2
  108. package/packages/cli/dist/commands/execution.d.ts +6 -3
  109. package/packages/cli/dist/commands/execution.js +1 -1
  110. package/packages/cli/dist/commands/graph.d.ts +6 -3
  111. package/packages/cli/dist/commands/graph.js +5 -6
  112. package/packages/cli/dist/commands/init/adapters.d.ts +28 -0
  113. package/packages/cli/dist/commands/init/adapters.js +1 -0
  114. package/packages/cli/dist/commands/init/config.d.ts +10 -0
  115. package/packages/cli/dist/commands/init/config.js +3 -0
  116. package/packages/cli/dist/commands/init/constants.d.ts +18 -0
  117. package/packages/cli/dist/commands/init/constants.js +1 -0
  118. package/packages/cli/dist/commands/init/curated.d.ts +7 -0
  119. package/packages/cli/dist/commands/init/curated.js +1 -0
  120. package/packages/cli/dist/commands/init/global.d.ts +34 -0
  121. package/packages/cli/dist/commands/init/global.js +5 -0
  122. package/packages/cli/dist/commands/init/index.d.ts +28 -0
  123. package/packages/cli/dist/commands/init/index.js +5 -0
  124. package/packages/cli/dist/commands/init/scaffold.d.ts +23 -0
  125. package/packages/cli/dist/commands/init/scaffold.js +1 -0
  126. package/packages/cli/dist/commands/init/templates.d.ts +9 -0
  127. package/packages/cli/dist/commands/init/templates.js +165 -0
  128. package/packages/cli/dist/commands/knowledge.d.ts +6 -3
  129. package/packages/cli/dist/commands/knowledge.js +1 -1
  130. package/packages/cli/dist/commands/search.d.ts +6 -3
  131. package/packages/cli/dist/commands/search.js +1 -8
  132. package/packages/cli/dist/commands/system.d.ts +6 -3
  133. package/packages/cli/dist/commands/system.js +4 -7
  134. package/packages/cli/dist/commands/workspace.d.ts +6 -3
  135. package/packages/cli/dist/commands/workspace.js +1 -2
  136. package/packages/cli/dist/context.d.ts +7 -5
  137. package/packages/cli/dist/context.js +1 -1
  138. package/packages/cli/dist/helpers.d.ts +51 -48
  139. package/packages/cli/dist/helpers.js +5 -5
  140. package/packages/cli/dist/index.d.ts +4 -2
  141. package/packages/cli/dist/index.js +2 -2
  142. package/packages/cli/dist/kb-init.d.ts +48 -51
  143. package/packages/cli/dist/kb-init.js +1 -1
  144. package/packages/cli/dist/types.d.ts +8 -6
  145. package/packages/cli/dist/types.js +1 -0
  146. package/packages/core/dist/constants.d.ts +58 -34
  147. package/packages/core/dist/constants.js +1 -1
  148. package/packages/core/dist/content-detector.d.ts +8 -8
  149. package/packages/core/dist/content-detector.js +1 -1
  150. package/packages/core/dist/errors.d.ts +15 -13
  151. package/packages/core/dist/errors.js +1 -1
  152. package/packages/core/dist/global-registry.d.ts +62 -0
  153. package/packages/core/dist/global-registry.js +1 -0
  154. package/packages/core/dist/index.d.ts +7 -6
  155. package/packages/core/dist/index.js +1 -1
  156. package/packages/core/dist/logger.d.ts +19 -8
  157. package/packages/core/dist/logger.js +1 -1
  158. package/packages/core/dist/types.d.ts +107 -92
  159. package/packages/core/dist/types.js +1 -0
  160. package/packages/embeddings/dist/embedder.interface.d.ts +22 -20
  161. package/packages/embeddings/dist/embedder.interface.js +1 -0
  162. package/packages/embeddings/dist/index.d.ts +3 -3
  163. package/packages/embeddings/dist/index.js +1 -1
  164. package/packages/embeddings/dist/onnx-embedder.d.ts +21 -23
  165. package/packages/embeddings/dist/onnx-embedder.js +1 -1
  166. package/packages/enterprise-bridge/dist/cache.d.ts +28 -0
  167. package/packages/enterprise-bridge/dist/cache.js +1 -0
  168. package/packages/enterprise-bridge/dist/er-client.d.ts +37 -0
  169. package/packages/enterprise-bridge/dist/er-client.js +1 -0
  170. package/packages/enterprise-bridge/dist/evolution-collector.d.ts +62 -0
  171. package/packages/enterprise-bridge/dist/evolution-collector.js +1 -0
  172. package/packages/enterprise-bridge/dist/index.d.ts +8 -0
  173. package/packages/enterprise-bridge/dist/index.js +1 -0
  174. package/packages/enterprise-bridge/dist/policy-store.d.ts +45 -0
  175. package/packages/enterprise-bridge/dist/policy-store.js +1 -0
  176. package/packages/enterprise-bridge/dist/push-adapter.d.ts +23 -0
  177. package/packages/enterprise-bridge/dist/push-adapter.js +1 -0
  178. package/packages/enterprise-bridge/dist/result-merger.d.ts +14 -0
  179. package/packages/enterprise-bridge/dist/result-merger.js +1 -0
  180. package/packages/enterprise-bridge/dist/types.d.ts +81 -0
  181. package/packages/enterprise-bridge/dist/types.js +1 -0
  182. package/packages/indexer/dist/file-hasher.d.ts +5 -3
  183. package/packages/indexer/dist/file-hasher.js +1 -1
  184. package/packages/indexer/dist/filesystem-crawler.d.ts +23 -21
  185. package/packages/indexer/dist/filesystem-crawler.js +1 -1
  186. package/packages/indexer/dist/graph-extractor.d.ts +9 -13
  187. package/packages/indexer/dist/graph-extractor.js +1 -1
  188. package/packages/indexer/dist/incremental-indexer.d.ts +49 -44
  189. package/packages/indexer/dist/incremental-indexer.js +1 -1
  190. package/packages/indexer/dist/index.d.ts +5 -5
  191. package/packages/indexer/dist/index.js +1 -1
  192. package/packages/server/dist/api.d.ts +3 -8
  193. package/packages/server/dist/api.js +1 -1
  194. package/packages/server/dist/config.d.ts +6 -3
  195. package/packages/server/dist/config.js +1 -1
  196. package/packages/server/dist/cross-workspace.d.ts +43 -0
  197. package/packages/server/dist/cross-workspace.js +1 -0
  198. package/packages/server/dist/curated-manager.d.ts +80 -78
  199. package/packages/server/dist/curated-manager.js +5 -10
  200. package/packages/server/dist/index.d.ts +1 -2
  201. package/packages/server/dist/index.js +1 -1
  202. package/packages/server/dist/replay-interceptor.d.ts +6 -7
  203. package/packages/server/dist/replay-interceptor.js +1 -1
  204. package/packages/server/dist/resources/resources.d.ts +7 -4
  205. package/packages/server/dist/resources/resources.js +2 -2
  206. package/packages/server/dist/server.d.ts +37 -25
  207. package/packages/server/dist/server.js +1 -1
  208. package/packages/server/dist/tools/analyze.tools.d.ts +14 -11
  209. package/packages/server/dist/tools/analyze.tools.js +1 -3
  210. package/packages/server/dist/tools/audit.tool.d.ts +8 -5
  211. package/packages/server/dist/tools/audit.tool.js +1 -4
  212. package/packages/server/dist/tools/bridge.tools.d.ts +34 -0
  213. package/packages/server/dist/tools/bridge.tools.js +15 -0
  214. package/packages/server/dist/tools/evolution.tools.d.ts +7 -0
  215. package/packages/server/dist/tools/evolution.tools.js +5 -0
  216. package/packages/server/dist/tools/forge.tools.d.ts +13 -12
  217. package/packages/server/dist/tools/forge.tools.js +10 -13
  218. package/packages/server/dist/tools/forget.tool.d.ts +7 -4
  219. package/packages/server/dist/tools/forget.tool.js +1 -7
  220. package/packages/server/dist/tools/graph.tool.d.ts +7 -4
  221. package/packages/server/dist/tools/graph.tool.js +4 -5
  222. package/packages/server/dist/tools/list.tool.d.ts +7 -4
  223. package/packages/server/dist/tools/list.tool.js +2 -8
  224. package/packages/server/dist/tools/lookup.tool.d.ts +7 -4
  225. package/packages/server/dist/tools/lookup.tool.js +2 -9
  226. package/packages/server/dist/tools/onboard.tool.d.ts +8 -5
  227. package/packages/server/dist/tools/onboard.tool.js +2 -2
  228. package/packages/server/dist/tools/policy.tools.d.ts +7 -0
  229. package/packages/server/dist/tools/policy.tools.js +2 -0
  230. package/packages/server/dist/tools/produce.tool.d.ts +6 -3
  231. package/packages/server/dist/tools/produce.tool.js +2 -2
  232. package/packages/server/dist/tools/read.tool.d.ts +7 -4
  233. package/packages/server/dist/tools/read.tool.js +2 -6
  234. package/packages/server/dist/tools/reindex.tool.d.ts +10 -7
  235. package/packages/server/dist/tools/reindex.tool.js +3 -2
  236. package/packages/server/dist/tools/remember.tool.d.ts +8 -4
  237. package/packages/server/dist/tools/remember.tool.js +3 -5
  238. package/packages/server/dist/tools/replay.tool.d.ts +6 -3
  239. package/packages/server/dist/tools/replay.tool.js +2 -6
  240. package/packages/server/dist/tools/search.tool.d.ts +10 -5
  241. package/packages/server/dist/tools/search.tool.js +6 -22
  242. package/packages/server/dist/tools/status.tool.d.ts +12 -4
  243. package/packages/server/dist/tools/status.tool.js +2 -3
  244. package/packages/server/dist/tools/toolkit.tools.d.ts +36 -35
  245. package/packages/server/dist/tools/toolkit.tools.js +20 -24
  246. package/packages/server/dist/tools/update.tool.d.ts +7 -4
  247. package/packages/server/dist/tools/update.tool.js +1 -6
  248. package/packages/server/dist/tools/utility.tools.d.ts +15 -15
  249. package/packages/server/dist/tools/utility.tools.js +10 -23
  250. package/packages/server/dist/version-check.d.ts +5 -2
  251. package/packages/server/dist/version-check.js +1 -1
  252. package/packages/store/dist/graph-store.interface.d.ts +89 -87
  253. package/packages/store/dist/graph-store.interface.js +1 -0
  254. package/packages/store/dist/index.d.ts +6 -6
  255. package/packages/store/dist/index.js +1 -1
  256. package/packages/store/dist/lance-store.d.ts +37 -31
  257. package/packages/store/dist/lance-store.js +1 -1
  258. package/packages/store/dist/sqlite-graph-store.d.ts +43 -47
  259. package/packages/store/dist/sqlite-graph-store.js +13 -13
  260. package/packages/store/dist/store-factory.d.ts +11 -8
  261. package/packages/store/dist/store-factory.js +1 -1
  262. package/packages/store/dist/store.interface.d.ts +47 -47
  263. package/packages/store/dist/store.interface.js +1 -0
  264. package/packages/tools/dist/audit.d.ts +61 -62
  265. package/packages/tools/dist/audit.js +4 -5
  266. package/packages/tools/dist/batch.d.ts +20 -18
  267. package/packages/tools/dist/batch.js +1 -1
  268. package/packages/tools/dist/changelog.d.ts +29 -27
  269. package/packages/tools/dist/changelog.js +2 -2
  270. package/packages/tools/dist/check.d.ts +42 -39
  271. package/packages/tools/dist/check.js +2 -2
  272. package/packages/tools/dist/checkpoint.d.ts +17 -15
  273. package/packages/tools/dist/checkpoint.js +1 -2
  274. package/packages/tools/dist/codemod.d.ts +35 -33
  275. package/packages/tools/dist/codemod.js +2 -2
  276. package/packages/tools/dist/compact.d.ts +34 -38
  277. package/packages/tools/dist/compact.js +2 -2
  278. package/packages/tools/dist/data-transform.d.ts +10 -8
  279. package/packages/tools/dist/data-transform.js +1 -1
  280. package/packages/tools/dist/dead-symbols.d.ts +29 -26
  281. package/packages/tools/dist/dead-symbols.js +2 -2
  282. package/packages/tools/dist/delegate.d.ts +26 -24
  283. package/packages/tools/dist/delegate.js +1 -5
  284. package/packages/tools/dist/diff-parse.d.ts +24 -22
  285. package/packages/tools/dist/diff-parse.js +3 -3
  286. package/packages/tools/dist/digest.d.ts +43 -46
  287. package/packages/tools/dist/digest.js +4 -5
  288. package/packages/tools/dist/dogfood-log.d.ts +49 -0
  289. package/packages/tools/dist/dogfood-log.js +2 -0
  290. package/packages/tools/dist/encode.d.ts +11 -9
  291. package/packages/tools/dist/encode.js +1 -1
  292. package/packages/tools/dist/env-info.d.ts +25 -23
  293. package/packages/tools/dist/env-info.js +1 -1
  294. package/packages/tools/dist/eval.d.ts +13 -11
  295. package/packages/tools/dist/eval.js +2 -3
  296. package/packages/tools/dist/evidence-map.d.ts +64 -62
  297. package/packages/tools/dist/evidence-map.js +2 -3
  298. package/packages/tools/dist/file-cache.d.ts +41 -0
  299. package/packages/tools/dist/file-cache.js +3 -0
  300. package/packages/tools/dist/file-summary.d.ts +50 -30
  301. package/packages/tools/dist/file-summary.js +2 -2
  302. package/packages/tools/dist/file-walk.d.ts +6 -4
  303. package/packages/tools/dist/file-walk.js +1 -1
  304. package/packages/tools/dist/find-examples.d.ts +26 -22
  305. package/packages/tools/dist/find-examples.js +3 -3
  306. package/packages/tools/dist/find.d.ts +39 -41
  307. package/packages/tools/dist/find.js +1 -1
  308. package/packages/tools/dist/forge-classify.d.ts +35 -39
  309. package/packages/tools/dist/forge-classify.js +2 -2
  310. package/packages/tools/dist/forge-ground.d.ts +58 -61
  311. package/packages/tools/dist/forge-ground.js +1 -1
  312. package/packages/tools/dist/git-context.d.ts +22 -20
  313. package/packages/tools/dist/git-context.js +3 -3
  314. package/packages/tools/dist/graph-query.d.ts +75 -79
  315. package/packages/tools/dist/graph-query.js +1 -1
  316. package/packages/tools/dist/guide.d.ts +14 -12
  317. package/packages/tools/dist/guide.js +1 -1
  318. package/packages/tools/dist/health.d.ts +13 -11
  319. package/packages/tools/dist/health.js +2 -2
  320. package/packages/tools/dist/http-request.d.ts +20 -18
  321. package/packages/tools/dist/http-request.js +1 -1
  322. package/packages/tools/dist/index.d.ts +55 -53
  323. package/packages/tools/dist/index.js +1 -1
  324. package/packages/tools/dist/lane.d.ts +28 -26
  325. package/packages/tools/dist/lane.js +6 -7
  326. package/packages/tools/dist/measure.d.ts +34 -30
  327. package/packages/tools/dist/measure.js +2 -2
  328. package/packages/tools/dist/onboard.d.ts +29 -27
  329. package/packages/tools/dist/onboard.js +17 -41
  330. package/packages/tools/dist/parse-output.d.ts +48 -46
  331. package/packages/tools/dist/parse-output.js +2 -2
  332. package/packages/tools/dist/path-resolver.d.ts +4 -2
  333. package/packages/tools/dist/path-resolver.js +1 -1
  334. package/packages/tools/dist/process-manager.d.ts +18 -16
  335. package/packages/tools/dist/process-manager.js +1 -1
  336. package/packages/tools/dist/queue.d.ts +28 -26
  337. package/packages/tools/dist/queue.js +1 -2
  338. package/packages/tools/dist/regex-test.d.ts +26 -24
  339. package/packages/tools/dist/regex-test.js +1 -1
  340. package/packages/tools/dist/rename.d.ts +28 -26
  341. package/packages/tools/dist/rename.js +2 -2
  342. package/packages/tools/dist/replay.d.ts +33 -31
  343. package/packages/tools/dist/replay.js +4 -6
  344. package/packages/tools/dist/response-envelope.d.ts +32 -30
  345. package/packages/tools/dist/response-envelope.js +1 -1
  346. package/packages/tools/dist/schema-validate.d.ts +15 -13
  347. package/packages/tools/dist/schema-validate.js +1 -1
  348. package/packages/tools/dist/scope-map.d.ts +45 -48
  349. package/packages/tools/dist/scope-map.js +1 -1
  350. package/packages/tools/dist/snippet.d.ts +26 -25
  351. package/packages/tools/dist/snippet.js +1 -1
  352. package/packages/tools/dist/stash.d.ts +13 -11
  353. package/packages/tools/dist/stash.js +1 -2
  354. package/packages/tools/dist/stratum-card.d.ts +27 -28
  355. package/packages/tools/dist/stratum-card.js +3 -5
  356. package/packages/tools/dist/symbol.d.ts +31 -26
  357. package/packages/tools/dist/symbol.js +3 -3
  358. package/packages/tools/dist/test-run.d.ts +19 -16
  359. package/packages/tools/dist/test-run.js +2 -2
  360. package/packages/tools/dist/text-utils.d.ts +6 -4
  361. package/packages/tools/dist/text-utils.js +2 -2
  362. package/packages/tools/dist/time-utils.d.ts +15 -13
  363. package/packages/tools/dist/time-utils.js +1 -1
  364. package/packages/tools/dist/trace.d.ts +26 -21
  365. package/packages/tools/dist/trace.js +2 -2
  366. package/packages/tools/dist/truncation.d.ts +6 -4
  367. package/packages/tools/dist/truncation.js +6 -13
  368. package/packages/tools/dist/watch.d.ts +28 -26
  369. package/packages/tools/dist/watch.js +1 -1
  370. package/packages/tools/dist/web-fetch.d.ts +35 -33
  371. package/packages/tools/dist/web-fetch.js +6 -12
  372. package/packages/tools/dist/web-search.d.ts +16 -14
  373. package/packages/tools/dist/web-search.js +1 -1
  374. package/packages/tools/dist/workset.d.ts +19 -17
  375. package/packages/tools/dist/workset.js +1 -2
  376. package/packages/tui/dist/App-CYLNJLr6.js +2 -0
  377. package/packages/tui/dist/App.d.ts +11 -6
  378. package/packages/tui/dist/App.js +1 -450
  379. package/packages/tui/dist/CuratedPanel-sYdZAICX.js +2 -0
  380. package/packages/tui/dist/LogPanel-DtMnoyXT.js +3 -0
  381. package/packages/tui/dist/SearchPanel-DREo6zgt.js +2 -0
  382. package/packages/tui/dist/StatusPanel-2ex8fLOO.js +2 -0
  383. package/packages/tui/dist/chunk-D6axbAb-.js +2 -0
  384. package/packages/tui/dist/devtools-DUyj952l.js +7 -0
  385. package/packages/tui/dist/embedder.interface-D4ew0HPW.d.ts +28 -0
  386. package/packages/tui/dist/index-B9VpfVPP.d.ts +13 -0
  387. package/packages/tui/dist/index.d.ts +3 -19
  388. package/packages/tui/dist/index.js +1 -476
  389. package/packages/tui/dist/jsx-runtime-Cof-kwFn.js +316 -0
  390. package/packages/tui/dist/panels/CuratedPanel.d.ts +11 -6
  391. package/packages/tui/dist/panels/CuratedPanel.js +1 -371
  392. package/packages/tui/dist/panels/LogPanel.d.ts +7 -3
  393. package/packages/tui/dist/panels/LogPanel.js +1 -449
  394. package/packages/tui/dist/panels/SearchPanel.d.ts +14 -8
  395. package/packages/tui/dist/panels/SearchPanel.js +1 -372
  396. package/packages/tui/dist/panels/StatusPanel.d.ts +11 -6
  397. package/packages/tui/dist/panels/StatusPanel.js +1 -371
  398. package/packages/tui/dist/store.interface-CnY6SPOH.d.ts +150 -0
  399. package/scaffold/adapters/claude-code.mjs +20 -0
  400. package/scaffold/adapters/copilot.mjs +320 -0
  401. package/scaffold/copilot/agents/Architect-Reviewer-Alpha.agent.md +21 -0
  402. package/scaffold/copilot/agents/Architect-Reviewer-Beta.agent.md +21 -0
  403. package/scaffold/copilot/agents/Documenter.agent.md +42 -0
  404. package/scaffold/copilot/agents/Orchestrator.agent.md +104 -0
  405. package/scaffold/copilot/agents/Planner.agent.md +54 -0
  406. package/scaffold/copilot/agents/Refactor.agent.md +36 -0
  407. package/scaffold/copilot/agents/Researcher-Alpha.agent.md +20 -0
  408. package/scaffold/copilot/agents/Researcher-Beta.agent.md +20 -0
  409. package/scaffold/copilot/agents/Researcher-Delta.agent.md +20 -0
  410. package/scaffold/copilot/agents/Researcher-Gamma.agent.md +20 -0
  411. package/scaffold/definitions/agents.mjs +165 -0
  412. package/scaffold/definitions/bodies.mjs +292 -0
  413. package/scaffold/definitions/hooks.mjs +43 -0
  414. package/scaffold/definitions/models.mjs +56 -0
  415. package/scaffold/definitions/plugins.mjs +24 -0
  416. package/scaffold/definitions/prompts.mjs +145 -0
  417. package/scaffold/definitions/protocols.mjs +322 -0
  418. package/scaffold/definitions/tools.mjs +176 -0
  419. package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +21 -0
  420. package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +21 -0
  421. package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +12 -0
  422. package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +12 -0
  423. package/scaffold/general/agents/Debugger.agent.md +31 -0
  424. package/scaffold/general/agents/Documenter.agent.md +42 -0
  425. package/scaffold/general/agents/Explorer.agent.md +50 -0
  426. package/scaffold/general/agents/Frontend.agent.md +29 -0
  427. package/scaffold/general/agents/Implementer.agent.md +31 -0
  428. package/scaffold/general/agents/Orchestrator.agent.md +104 -0
  429. package/scaffold/general/agents/Planner.agent.md +55 -0
  430. package/scaffold/general/agents/README.md +57 -0
  431. package/scaffold/general/agents/Refactor.agent.md +36 -0
  432. package/scaffold/general/agents/Researcher-Alpha.agent.md +20 -0
  433. package/scaffold/general/agents/Researcher-Beta.agent.md +20 -0
  434. package/scaffold/general/agents/Researcher-Delta.agent.md +20 -0
  435. package/scaffold/general/agents/Researcher-Gamma.agent.md +20 -0
  436. package/scaffold/general/agents/Security.agent.md +42 -0
  437. package/scaffold/general/agents/_shared/adr-protocol.md +91 -0
  438. package/scaffold/general/agents/_shared/architect-reviewer-base.md +50 -0
  439. package/scaffold/general/agents/_shared/code-agent-base.md +88 -0
  440. package/scaffold/general/agents/_shared/code-reviewer-base.md +54 -0
  441. package/scaffold/general/agents/_shared/decision-protocol.md +27 -0
  442. package/scaffold/general/agents/_shared/forge-protocol.md +46 -0
  443. package/scaffold/general/agents/_shared/researcher-base.md +61 -0
  444. package/scaffold/general/agents/templates/adr-template.md +27 -0
  445. package/scaffold/general/agents/templates/execution-state.md +25 -0
  446. package/scaffold/general/prompts/ask.prompt.md +20 -0
  447. package/scaffold/general/prompts/debug.prompt.md +25 -0
  448. package/scaffold/general/prompts/design.prompt.md +22 -0
  449. package/scaffold/general/prompts/implement.prompt.md +26 -0
  450. package/scaffold/general/prompts/plan.prompt.md +24 -0
  451. package/scaffold/general/prompts/review.prompt.md +31 -0
  452. package/scaffold/generate.mjs +74 -0
  453. package/skills/adr-skill/SKILL.md +329 -0
  454. package/skills/adr-skill/assets/templates/adr-madr.md +89 -0
  455. package/skills/adr-skill/assets/templates/adr-readme.md +20 -0
  456. package/skills/adr-skill/assets/templates/adr-simple.md +46 -0
  457. package/skills/adr-skill/references/adr-conventions.md +95 -0
  458. package/skills/adr-skill/references/examples.md +193 -0
  459. package/skills/adr-skill/references/review-checklist.md +77 -0
  460. package/skills/adr-skill/references/template-variants.md +52 -0
  461. package/skills/adr-skill/scripts/bootstrap_adr.js +259 -0
  462. package/skills/adr-skill/scripts/new_adr.js +391 -0
  463. package/skills/adr-skill/scripts/set_adr_status.js +169 -0
  464. package/skills/brainstorming/SKILL.md +259 -0
  465. package/skills/brainstorming/scripts/frame-template.html +365 -0
  466. package/skills/brainstorming/scripts/helper.js +216 -0
  467. package/skills/brainstorming/scripts/server.cjs +9 -0
  468. package/skills/brainstorming/scripts/server.src.cjs +249 -0
  469. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  470. package/skills/brainstorming/visual-companion.md +430 -0
  471. package/skills/c4-architecture/SKILL.md +295 -0
  472. package/skills/c4-architecture/references/advanced-patterns.md +552 -0
  473. package/skills/c4-architecture/references/c4-syntax.md +492 -0
  474. package/skills/c4-architecture/references/common-mistakes.md +437 -0
  475. package/skills/knowledge-base/SKILL.md +100 -10
  476. package/skills/lesson-learned/SKILL.md +105 -0
  477. package/skills/lesson-learned/references/anti-patterns.md +55 -0
  478. package/skills/lesson-learned/references/se-principles.md +109 -0
  479. package/skills/requirements-clarity/SKILL.md +324 -0
  480. package/skills/session-handoff/SKILL.md +189 -0
  481. package/skills/session-handoff/references/handoff-template.md +139 -0
  482. package/skills/session-handoff/references/resume-checklist.md +80 -0
  483. package/skills/session-handoff/scripts/check_staleness.js +269 -0
  484. package/skills/session-handoff/scripts/create_handoff.js +299 -0
  485. package/skills/session-handoff/scripts/list_handoffs.js +113 -0
  486. package/skills/session-handoff/scripts/validate_handoff.js +241 -0
  487. package/packages/chunker/dist/treesitter-chunker.d.ts +0 -47
  488. package/packages/chunker/dist/treesitter-chunker.js +0 -8
  489. package/packages/cli/dist/commands/init.d.ts +0 -10
  490. package/packages/cli/dist/commands/init.js +0 -308
@@ -1,47 +1,52 @@
1
- import type { IndexStats, KBConfig } from '@kb/core';
2
- import type { IEmbedder } from '@kb/embeddings';
3
- import type { IGraphStore, IKnowledgeStore } from '@kb/store';
4
- export interface IndexProgress {
5
- phase: 'crawling' | 'chunking' | 'embedding' | 'storing' | 'cleanup' | 'done';
6
- filesTotal: number;
7
- filesProcessed: number;
8
- chunksTotal: number;
9
- chunksProcessed: number;
10
- /** The file currently being processed */
11
- currentFile?: string;
1
+ import { IGraphStore, IKnowledgeStore } from "@kb/store";
2
+ import { IndexStats, KBConfig } from "@kb/core";
3
+ import { IEmbedder } from "@kb/embeddings";
4
+
5
+ //#region packages/indexer/src/incremental-indexer.d.ts
6
+ interface IndexProgress {
7
+ phase: 'crawling' | 'chunking' | 'embedding' | 'storing' | 'cleanup' | 'done';
8
+ filesTotal: number;
9
+ filesProcessed: number;
10
+ chunksTotal: number;
11
+ chunksProcessed: number;
12
+ /** The file currently being processed */
13
+ currentFile?: string;
12
14
  }
13
- export type ProgressCallback = (progress: IndexProgress) => void;
14
- export interface IndexResult {
15
- filesProcessed: number;
16
- filesSkipped: number;
17
- chunksCreated: number;
18
- filesRemoved: number;
19
- durationMs: number;
15
+ type ProgressCallback = (progress: IndexProgress) => void;
16
+ interface IndexResult {
17
+ filesProcessed: number;
18
+ filesSkipped: number;
19
+ chunksCreated: number;
20
+ filesRemoved: number;
21
+ durationMs: number;
20
22
  }
21
- export declare class IncrementalIndexer {
22
- private readonly embedder;
23
- private readonly store;
24
- private readonly crawler;
25
- private indexing;
26
- private graphStore?;
27
- constructor(embedder: IEmbedder, store: IKnowledgeStore);
28
- /** Set the graph store for auto-population during indexing and cleanup on re-index. */
29
- setGraphStore(graphStore: IGraphStore): void;
30
- /**
31
- * Index all configured sources. Only re-indexes files that have changed.
32
- * Sources are crawled in parallel, and file processing runs concurrently
33
- * up to `config.indexing.concurrency` (default: half of CPU cores).
34
- */
35
- index(config: KBConfig, onProgress?: ProgressCallback): Promise<IndexResult>;
36
- private doIndex;
37
- /**
38
- * Force re-index all files (ignoring hashes).
39
- */
40
- reindexAll(config: KBConfig, onProgress?: ProgressCallback): Promise<IndexResult>;
41
- private doReindex;
42
- /**
43
- * Get current index statistics.
44
- */
45
- getStats(): Promise<IndexStats>;
23
+ declare class IncrementalIndexer {
24
+ private readonly embedder;
25
+ private readonly store;
26
+ private readonly crawler;
27
+ private indexing;
28
+ private graphStore?;
29
+ /** Whether an index operation is currently in progress. */
30
+ get isIndexing(): boolean;
31
+ constructor(embedder: IEmbedder, store: IKnowledgeStore);
32
+ /** Set the graph store for auto-population during indexing and cleanup on re-index. */
33
+ setGraphStore(graphStore: IGraphStore): void;
34
+ /**
35
+ * Index all configured sources. Only re-indexes files that have changed.
36
+ * Sources are crawled in parallel, and file processing runs concurrently
37
+ * up to `config.indexing.concurrency` (default: half of CPU cores).
38
+ */
39
+ index(config: KBConfig, onProgress?: ProgressCallback): Promise<IndexResult>;
40
+ private doIndex;
41
+ /**
42
+ * Force re-index all files (ignoring hashes).
43
+ */
44
+ reindexAll(config: KBConfig, onProgress?: ProgressCallback): Promise<IndexResult>;
45
+ private doReindex;
46
+ /**
47
+ * Get current index statistics.
48
+ */
49
+ getStats(): Promise<IndexStats>;
46
50
  }
47
- //# sourceMappingURL=incremental-indexer.d.ts.map
51
+ //#endregion
52
+ export { IncrementalIndexer, IndexProgress, IndexResult, ProgressCallback };
@@ -1 +1 @@
1
- import{availableParallelism as G}from"node:os";import{createChunker as F}from"../../chunker/dist/index.js";import{detectContentType as B}from"../../core/dist/index.js";import{generateRecordId as K,hashContent as I}from"./file-hasher.js";import{FilesystemCrawler as H}from"./filesystem-crawler.js";import{extractGraph as A}from"./graph-extractor.js";async function S(c,s,r,o){let g=0;async function l(){for(;g<c.length;){const d=g++;try{await s(c[d])}catch(a){o?.(c[d],a)}}}await Promise.all(Array.from({length:Math.min(r,c.length)},()=>l()))}const L=Math.max(1,Math.floor(G()/2));class O{constructor(s,r){this.embedder=s;this.store=r;this.crawler=new H}crawler;indexing=!1;graphStore;setGraphStore(s){this.graphStore=s}async index(s,r){if(this.indexing)throw new Error("Indexing is already in progress");this.indexing=!0;try{return await this.doIndex(s,r,{})}finally{this.indexing=!1}}async doIndex(s,r,o={}){const g=Date.now();let l=0,d=0,a=0,C=0;const w=s.indexing.concurrency??L;r?.({phase:"crawling",filesTotal:0,filesProcessed:0,chunksTotal:0,chunksProcessed:0});const y=(await Promise.all(s.sources.map(e=>this.crawler.crawl({rootDir:e.path,excludePatterns:e.excludePatterns})))).flat();let p,f;if(o.skipHashCheck)p=y,f=[];else{const e=await this.store.listSourcePaths(),h=new Set(y.map(n=>n.relativePath));f=e.filter(n=>!h.has(n)&&!n.startsWith("curated/")),p=[],await S(y,async n=>{const i=I(n.content),P=await this.store.getBySourcePath(n.relativePath);if(P.length>0&&P[0].fileHash===i){d++;return}p.push(n)},w,(n,i)=>console.error(`[indexer] hash check failed for ${n.relativePath}:`,i))}const u=p.length,b=50;let m=[],x=[],k=0;const v=async()=>{if(this.graphStore){try{m.length>0&&await this.graphStore.upsertNodes(m),x.length>0&&await this.graphStore.upsertEdges(x)}catch(e){console.error("[indexer] graph batch flush failed:",e)}m=[],x=[],k=0}};return await S(p,async e=>{r?.({phase:"chunking",filesTotal:u,filesProcessed:l,chunksTotal:a,chunksProcessed:a,currentFile:e.relativePath});const h=B(e.relativePath),i=F(e.extension).chunk(e.content,{sourcePath:e.relativePath,contentType:h});if(i.length===0)return;r?.({phase:"embedding",filesTotal:u,filesProcessed:l,chunksTotal:a+i.length,chunksProcessed:a,currentFile:e.relativePath});const P=await this.embedder.embedBatch(i.map(t=>t.text)),T=I(e.content),R=i.map((t,E)=>({id:K(e.relativePath,E),content:t.text,sourcePath:t.sourcePath,contentType:t.contentType,headingPath:t.headingPath,chunkIndex:t.chunkIndex,totalChunks:t.totalChunks,startLine:t.startLine,endLine:t.endLine,fileHash:T,indexedAt:new Date().toISOString(),origin:"indexed",tags:[],version:1}));if(r?.({phase:"storing",filesTotal:u,filesProcessed:l,chunksTotal:a+i.length,chunksProcessed:a,currentFile:e.relativePath}),await this.store.upsert(R,P),this.graphStore)try{o.graphCleared||await this.graphStore.deleteBySourcePath(e.relativePath);const t=A(e.content,e.relativePath);t.nodes.length>0&&m.push(...t.nodes),t.edges.length>0&&x.push(...t.edges),k++,k>=b&&await v()}catch(t){console.error(`[indexer] graph extraction failed for ${e.relativePath}:`,t)}l++,a+=i.length},w,(e,h)=>console.error(`[indexer] processing failed for ${e.relativePath}:`,h)),await v(),f.length>0&&(r?.({phase:"cleanup",filesTotal:u,filesProcessed:l,chunksTotal:a,chunksProcessed:a}),await S(f,async e=>{await this.store.deleteBySourcePath(e),this.graphStore&&await this.graphStore.deleteBySourcePath(e).catch(h=>console.error(`[indexer] graph cleanup failed for ${e}:`,h)),C++},w,(e,h)=>console.error(`[indexer] cleanup failed for ${e}:`,h))),r?.({phase:"done",filesTotal:u,filesProcessed:l,chunksTotal:a,chunksProcessed:a}),{filesProcessed:l,filesSkipped:d,chunksCreated:a,filesRemoved:C,durationMs:Date.now()-g}}async reindexAll(s,r){if(await this.store.dropTable(),this.graphStore)try{const o=await this.graphStore.getStats();o.nodeCount>0&&(await this.graphStore.clear(),console.error(`[indexer] Graph store cleared (was ${o.nodeCount} nodes, ${o.edgeCount} edges)`))}catch(o){console.error("[indexer] Graph store clear failed:",o)}return this.doReindex(s,r)}async doReindex(s,r){if(this.indexing)throw new Error("Indexing is already in progress");this.indexing=!0;try{return await this.doIndex(s,r,{skipHashCheck:!0,graphCleared:!0})}finally{this.indexing=!1}}async getStats(){return this.store.getStats()}}export{O as IncrementalIndexer};
1
+ import{generateRecordId as e,hashContent as t}from"./file-hasher.js";import{FilesystemCrawler as n}from"./filesystem-crawler.js";import{extractGraph as r}from"./graph-extractor.js";import{KB_PATHS as i,createLogger as a,detectContentType as o,serializeError as s}from"../../core/dist/index.js";import{availableParallelism as c}from"node:os";import{createChunkerSync as l}from"../../chunker/dist/index.js";const u=a(`indexer`);async function d(e,t,n,r){let i=0;async function a(){for(;i<e.length;){let n=i++;try{await t(e[n])}catch(t){r?.(e[n],t)}}}await Promise.all(Array.from({length:Math.min(n,e.length)},()=>a()))}const f=Math.max(1,Math.floor(c()/2));var p=class{crawler;indexing=!1;graphStore;get isIndexing(){return this.indexing}constructor(e,t){this.embedder=e,this.store=t,this.crawler=new n}setGraphStore(e){this.graphStore=e}async index(e,t){if(this.indexing)throw Error(`Indexing is already in progress`);this.indexing=!0;try{return await this.doIndex(e,t,{})}finally{this.indexing=!1}}async doIndex(n,a,c={}){let p=Date.now(),m=0,h=0,g=0,_=0,v=n.indexing.concurrency??f;a?.({phase:`crawling`,filesTotal:0,filesProcessed:0,chunksTotal:0,chunksProcessed:0});let y=(await Promise.all(n.sources.map(e=>this.crawler.crawl({rootDir:e.path,excludePatterns:e.excludePatterns})))).flat(),b,x;if(c.skipHashCheck)b=y,x=[];else{let e=await this.store.listSourcePaths(),n=new Set(y.map(e=>e.relativePath));x=e.filter(e=>!n.has(e)&&!e.startsWith(`${i.aiCurated}/`)),b=[],await d(y,async e=>{let n=t(e.content),r=await this.store.getBySourcePath(e.relativePath);if(r.length>0&&r[0].fileHash===n){h++;return}b.push(e)},v,(e,t)=>u.error(`Hash check failed`,{sourcePath:e.relativePath,...s(t)}))}let S=b.length,C=[],w=[],T=0,E=async()=>{if(this.graphStore){try{C.length>0&&await this.graphStore.upsertNodes(C),w.length>0&&await this.graphStore.upsertEdges(w)}catch(e){u.warn(`Graph batch flush failed`,s(e))}C=[],w=[],T=0}};return await d(b,async n=>{a?.({phase:`chunking`,filesTotal:S,filesProcessed:m,chunksTotal:g,chunksProcessed:g,currentFile:n.relativePath});let i=o(n.relativePath),d=l(n.extension).chunk(n.content,{sourcePath:n.relativePath,contentType:i});if(d.length===0)return;a?.({phase:`embedding`,filesTotal:S,filesProcessed:m,chunksTotal:g+d.length,chunksProcessed:g,currentFile:n.relativePath});let f=await this.embedder.embedBatch(d.map(e=>e.text)),p=t(n.content),h=d.map((t,r)=>({id:e(n.relativePath,r),content:t.text,sourcePath:t.sourcePath,contentType:t.contentType,headingPath:t.headingPath,chunkIndex:t.chunkIndex,totalChunks:t.totalChunks,startLine:t.startLine,endLine:t.endLine,fileHash:p,indexedAt:new Date().toISOString(),origin:`indexed`,tags:[],version:1}));if(a?.({phase:`storing`,filesTotal:S,filesProcessed:m,chunksTotal:g+d.length,chunksProcessed:g,currentFile:n.relativePath}),await this.store.upsert(h,f),this.graphStore)try{c.graphCleared||await this.graphStore.deleteBySourcePath(n.relativePath);let e=r(n.content,n.relativePath);e.nodes.length>0&&C.push(...e.nodes),e.edges.length>0&&w.push(...e.edges),T++,T>=50&&await E()}catch(e){u.warn(`Graph extraction failed`,{sourcePath:n.relativePath,...s(e)})}m++,g+=d.length},v,(e,t)=>u.error(`Processing failed`,{sourcePath:e.relativePath,...s(t)})),await E(),x.length>0&&(a?.({phase:`cleanup`,filesTotal:S,filesProcessed:m,chunksTotal:g,chunksProcessed:g}),await d(x,async e=>{await this.store.deleteBySourcePath(e),this.graphStore&&await this.graphStore.deleteBySourcePath(e).catch(t=>u.warn(`Graph cleanup failed`,{sourcePath:e,...s(t)})),_++},v,(e,t)=>u.error(`Cleanup failed`,{sourcePath:e,...s(t)}))),a?.({phase:`done`,filesTotal:S,filesProcessed:m,chunksTotal:g,chunksProcessed:g}),{filesProcessed:m,filesSkipped:h,chunksCreated:g,filesRemoved:_,durationMs:Date.now()-p}}async reindexAll(e,t){if(this.indexing)throw Error(`Indexing is already in progress`);this.indexing=!0;try{if(await this.store.dropTable(),this.graphStore)try{let e=await this.graphStore.getStats();e.nodeCount>0&&(await this.graphStore.clear(),u.info(`Graph store cleared`,{nodeCount:e.nodeCount,edgeCount:e.edgeCount}))}catch(e){u.warn(`Graph store clear failed`,s(e))}return await this.doReindex(e,t)}catch(e){throw this.indexing=!1,e}}async doReindex(e,t){try{return await this.doIndex(e,t,{skipHashCheck:!0,graphCleared:!0})}finally{this.indexing=!1}}async getStats(){return this.store.getStats()}};export{p as IncrementalIndexer};
@@ -1,5 +1,5 @@
1
- export { generateRecordId, hashContent } from './file-hasher.js';
2
- export { type CrawlOptions, type CrawlResult, FilesystemCrawler } from './filesystem-crawler.js';
3
- export { type ExtractedGraph, extractGraph } from './graph-extractor.js';
4
- export { IncrementalIndexer, type IndexProgress, type IndexResult, type ProgressCallback, } from './incremental-indexer.js';
5
- //# sourceMappingURL=index.d.ts.map
1
+ import { generateRecordId, hashContent } from "./file-hasher.js";
2
+ import { CrawlOptions, CrawlResult, FilesystemCrawler } from "./filesystem-crawler.js";
3
+ import { ExtractedGraph, extractGraph } from "./graph-extractor.js";
4
+ import { IncrementalIndexer, IndexProgress, IndexResult, ProgressCallback } from "./incremental-indexer.js";
5
+ export { type CrawlOptions, type CrawlResult, type ExtractedGraph, FilesystemCrawler, IncrementalIndexer, type IndexProgress, type IndexResult, type ProgressCallback, extractGraph, generateRecordId, hashContent };
@@ -1 +1 @@
1
- import{generateRecordId as t,hashContent as o}from"./file-hasher.js";import{FilesystemCrawler as a}from"./filesystem-crawler.js";import{extractGraph as l}from"./graph-extractor.js";import{IncrementalIndexer as x}from"./incremental-indexer.js";export{a as FilesystemCrawler,x as IncrementalIndexer,l as extractGraph,t as generateRecordId,o as hashContent};
1
+ import{generateRecordId as e,hashContent as t}from"./file-hasher.js";import{FilesystemCrawler as n}from"./filesystem-crawler.js";import{extractGraph as r}from"./graph-extractor.js";import{IncrementalIndexer as i}from"./incremental-indexer.js";export{n as FilesystemCrawler,i as IncrementalIndexer,r as extractGraph,e as generateRecordId,t as hashContent};
@@ -1,8 +1,3 @@
1
- /**
2
- * Public API for @kb/server imported by CLI and other consumers.
3
- * Does NOT start the server (unlike index.ts which auto-calls main()).
4
- */
5
- export { loadConfig } from './config.js';
6
- export type { KnowledgeBaseComponents } from './server.js';
7
- export { createMcpServer, createServer, initializeKnowledgeBase } from './server.js';
8
- //# sourceMappingURL=api.d.ts.map
1
+ import { loadConfig } from "./config.js";
2
+ import { KnowledgeBaseComponents, createMcpServer, createServer, initializeKnowledgeBase } from "./server.js";
3
+ export { type KnowledgeBaseComponents, createMcpServer, createServer, initializeKnowledgeBase, loadConfig };
@@ -1 +1 @@
1
- import{loadConfig as o}from"./config.js";import{createMcpServer as a,createServer as n,initializeKnowledgeBase as p}from"./server.js";export{a as createMcpServer,n as createServer,p as initializeKnowledgeBase,o as loadConfig};
1
+ import{loadConfig as e}from"./config.js";import{createMcpServer as t,createServer as n,initializeKnowledgeBase as r}from"./server.js";export{t as createMcpServer,n as createServer,r as initializeKnowledgeBase,e as loadConfig};
@@ -1,3 +1,6 @@
1
- import type { KBConfig } from '@kb/core';
2
- export declare function loadConfig(): KBConfig;
3
- //# sourceMappingURL=config.d.ts.map
1
+ import { KBConfig } from "@kb/core";
2
+
3
+ //#region packages/server/src/config.d.ts
4
+ declare function loadConfig(): KBConfig;
5
+ //#endregion
6
+ export { loadConfig };
@@ -1 +1 @@
1
- import{existsSync as i,readFileSync as d}from"node:fs";import{dirname as c,resolve as r}from"node:path";import{fileURLToPath as u}from"node:url";const p=c(u(import.meta.url));function a(e,n,o){const t=r(e),s=r(n);if(!t.startsWith(s))throw new Error(`Config ${o} path escapes workspace root: ${e} is not under ${n}`);return t}function l(){const e=process.env.KB_CONFIG_PATH??(i(r(process.cwd(),"kb.config.json"))?r(process.cwd(),"kb.config.json"):r(p,"..","..","..","kb.config.json"));try{const n=d(e,"utf-8"),o=JSON.parse(n);if(!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw new Error("Config must have at least one source");if(!o.store?.path)throw new Error("Config must specify store.path");const t=c(e);return o.sources=o.sources.map(s=>({...s,path:a(r(t,s.path),t,"source")})),o.store.path=a(r(t,o.store.path),t,"store"),o.curated=o.curated??{path:"curated"},o.curated.path=a(r(t,o.curated.path),t,"curated"),o}catch(n){const o=n instanceof Error?n.message:String(n);return console.error(`[KB] Failed to load config from ${e}: ${o}`),console.error("[KB] Falling back to default configuration"),f()}}function f(){const e=process.env.KB_WORKSPACE_ROOT??process.cwd();return{sources:[{path:e,excludePatterns:["node_modules/**","dist/**",".git/**","coverage/**","*.lock","pnpm-lock.yaml"]}],indexing:{chunkSize:1500,chunkOverlap:200,minChunkSize:100},embedding:{model:"mixedbread-ai/mxbai-embed-large-v1",dimensions:1024},store:{backend:"lancedb",path:r(e,".kb-data")},curated:{path:r(e,"curated")}}}export{l as loadConfig};
1
+ import{existsSync as e,readFileSync as t}from"node:fs";import{dirname as n,resolve as r}from"node:path";import{fileURLToPath as i}from"node:url";import{KB_PATHS as a,createLogger as o,getPartitionDir as s,isGlobalInstalled as c,registerWorkspace as l,serializeError as u}from"../../core/dist/index.js";const d=n(i(import.meta.url)),f=o(`server`);function p(e,t,n){let i=r(e),a=r(t);if(!i.startsWith(a))throw Error(`Config ${n} path escapes workspace root: ${e} is not under ${t}`);return i}function m(){let i=process.env.KB_CONFIG_PATH??(e(r(process.cwd(),`kb.config.json`))?r(process.cwd(),`kb.config.json`):r(d,`..`,`..`,`..`,`kb.config.json`));try{let e=t(i,`utf-8`),o=JSON.parse(e);if(!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw Error(`Config must have at least one source`);if(!o.store?.path)throw Error(`Config must specify store.path`);let s=n(i);return o.sources=o.sources.map(e=>({...e,path:p(r(s,e.path),s,`source`)})),o.store.path=p(r(s,o.store.path),s,`store`),o.curated=o.curated??{path:a.aiCurated},o.curated.path=p(r(s,o.curated.path),s,`curated`),g(o,s),o}catch(e){return f.error(`Failed to load config`,{configPath:i,...u(e)}),f.warn(`Falling back to default configuration`,{configPath:i}),h()}}function h(){let e=process.env.KB_WORKSPACE_ROOT??process.cwd(),t={sources:[{path:e,excludePatterns:[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],serverName:`knowledge-base`,indexing:{chunkSize:1500,chunkOverlap:200,minChunkSize:100},embedding:{model:`mixedbread-ai/mxbai-embed-large-v1`,dimensions:1024},store:{backend:`lancedb`,path:r(e,a.data)},curated:{path:r(e,a.aiCurated)}};return g(t,e),t}function g(e,t){if(!c())return;let n=t,i=l(n);e.store.path=r(s(i.partition)),e.curated||={path:r(n,a.aiCurated)}}export{m as loadConfig};
@@ -0,0 +1,43 @@
1
+ import { RegistryEntry, SearchResult } from "@kb/core";
2
+ import { IKnowledgeStore, SearchOptions } from "@kb/store";
3
+
4
+ //#region packages/server/src/cross-workspace.d.ts
5
+ interface CrossWorkspaceOptions {
6
+ /** Workspace partition names or folder basenames to include. `"*"` means all. */
7
+ workspaces: string[];
8
+ /** Current workspace partition (excluded from cross-workspace queries to avoid double results) */
9
+ currentPartition?: string;
10
+ }
11
+ /**
12
+ * Resolve workspace identifiers to partition entries.
13
+ * Accepts partition keys (exact) or folder basenames (fuzzy match).
14
+ * Special value `"*"` resolves to all registered workspaces.
15
+ */
16
+ declare function resolveWorkspaces(identifiers: string[], currentPartition?: string): RegistryEntry[];
17
+ /**
18
+ * Open temporary read-only store instances for the specified workspace partitions.
19
+ * Caller MUST call closeAll() when done.
20
+ */
21
+ declare function openWorkspaceStores(entries: RegistryEntry[]): Promise<{
22
+ stores: Map<string, IKnowledgeStore>;
23
+ closeAll: () => Promise<void>;
24
+ }>;
25
+ /**
26
+ * Fan-out a vector search to multiple workspace stores in parallel.
27
+ * Returns merged results sorted by score descending, with workspace labels.
28
+ */
29
+ declare function fanOutSearch(stores: Map<string, IKnowledgeStore>, queryVector: Float32Array, options: SearchOptions & {
30
+ limit: number;
31
+ }): Promise<Array<SearchResult & {
32
+ workspace: string;
33
+ }>>;
34
+ /**
35
+ * Fan-out a full-text search to multiple workspace stores in parallel.
36
+ */
37
+ declare function fanOutFtsSearch(stores: Map<string, IKnowledgeStore>, query: string, options: SearchOptions & {
38
+ limit: number;
39
+ }): Promise<Array<SearchResult & {
40
+ workspace: string;
41
+ }>>;
42
+ //#endregion
43
+ export { CrossWorkspaceOptions, fanOutFtsSearch, fanOutSearch, openWorkspaceStores, resolveWorkspaces };
@@ -0,0 +1 @@
1
+ import{createLogger as e,getPartitionDir as t,isGlobalInstalled as n,listWorkspaces as r}from"../../core/dist/index.js";import{createStore as i}from"../../store/dist/index.js";const a=e(`cross-workspace`);function o(e,t){if(!n())return[];let i=r();if(i.length===0)return[];if(e.includes(`*`))return t?i.filter(e=>e.partition!==t):i;let a=[];for(let n of e){let e=i.find(e=>e.partition===n);if(e){e.partition!==t&&a.push(e);continue}let r=i.filter(e=>e.partition!==t&&e.partition.replace(/-[a-f0-9]{8}$/,``)===n.toLowerCase());a.push(...r)}let o=new Set;return a.filter(e=>o.has(e.partition)?!1:(o.add(e.partition),!0))}async function s(e){let n=new Map;for(let r of e)try{let e=await i({backend:`lancedb`,path:t(r.partition)});await e.initialize(),n.set(r.partition,e)}catch(e){a.warn(`Failed to open workspace store`,{partition:r.partition,err:e})}return{stores:n,closeAll:async()=>{for(let[,e]of n)try{await e.close()}catch{}}}}async function c(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.search(t,n)).map(t=>({...t,workspace:e}))}catch(t){return a.warn(`Cross-workspace search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}async function l(e,t,n){let r=[...e.entries()].map(async([e,r])=>{try{return(await r.ftsSearch(t,n)).map(t=>({...t,workspace:e}))}catch(t){return a.warn(`Cross-workspace FTS search failed for partition`,{partition:e,err:t}),[]}});return(await Promise.all(r)).flat().sort((e,t)=>t.score-e.score).slice(0,n.limit)}export{l as fanOutFtsSearch,c as fanOutSearch,s as openWorkspaceStores,o as resolveWorkspaces};
@@ -1,86 +1,88 @@
1
- import type { IEmbedder } from '@kb/embeddings';
2
- import type { IKnowledgeStore } from '@kb/store';
3
- export type CuratedCategory = string;
4
- export interface CuratedEntry {
5
- path: string;
6
- title: string;
7
- category: string;
8
- tags: string[];
9
- version: number;
10
- created: string;
11
- updated: string;
12
- contentPreview: string;
1
+ import { IEmbedder } from "@kb/embeddings";
2
+ import { IKnowledgeStore } from "@kb/store";
3
+
4
+ //#region packages/server/src/curated-manager.d.ts
5
+ type CuratedCategory = string;
6
+ interface CuratedEntry {
7
+ path: string;
8
+ title: string;
9
+ category: string;
10
+ tags: string[];
11
+ version: number;
12
+ created: string;
13
+ updated: string;
14
+ contentPreview: string;
13
15
  }
14
16
  interface CuratedFrontmatter {
15
- title: string;
16
- category: string;
17
- tags: string[];
18
- created: string;
19
- updated: string;
17
+ title: string;
18
+ category: string;
19
+ tags: string[];
20
+ created: string;
21
+ updated: string;
22
+ version: number;
23
+ origin: 'curated';
24
+ changelog: Array<{
20
25
  version: number;
21
- origin: 'curated';
22
- changelog: Array<{
23
- version: number;
24
- date: string;
25
- reason: string;
26
- }>;
26
+ date: string;
27
+ reason: string;
28
+ }>;
27
29
  }
28
30
  /**
29
31
  * Manages curated knowledge files — the LLM's persistent memory.
30
- * Files are stored as markdown in a curated/ directory with YAML frontmatter.
32
+ * Files are stored as markdown in a .ai/curated/ directory with YAML frontmatter.
31
33
  */
32
- export declare class CuratedKnowledgeManager {
33
- private readonly curatedDir;
34
- private readonly store;
35
- private readonly embedder;
36
- constructor(curatedDir: string, store: IKnowledgeStore, embedder: IEmbedder);
37
- remember(title: string, content: string, category: CuratedCategory, tags?: string[]): Promise<{
38
- path: string;
39
- }>;
40
- update(relativePath: string, newContent: string, reason: string): Promise<{
41
- path: string;
42
- version: number;
43
- }>;
44
- forget(relativePath: string, _reason: string): Promise<{
45
- path: string;
46
- }>;
47
- read(relativePath: string): Promise<CuratedEntry & {
48
- content: string;
49
- }>;
50
- list(filters?: {
51
- category?: CuratedCategory;
52
- tag?: string;
53
- }): Promise<CuratedEntry[]>;
54
- /**
55
- * Re-index all curated files into the vector store.
56
- * Call this after the indexer has run to restore curated vectors
57
- * that may have been lost, or to bulk-sync disk state to vectors.
58
- */
59
- reindexAll(): Promise<{
60
- indexed: number;
61
- errors: string[];
62
- }>;
63
- private indexCuratedFile;
64
- private discoverCategories;
65
- private guardPath;
66
- private validateCategoryName;
67
- private validateContentSize;
68
- private slugify;
69
- /** Return a unique `category/slug.md` path, appending `-2`, `-3`, … on collision. */
70
- private uniqueRelativePath;
71
- private hash;
72
- private hashId;
73
- /**
74
- * Simple YAML frontmatter serializer (no gray-matter dependency).
75
- */
76
- private serializeFile;
77
- /**
78
- * Simple YAML frontmatter parser (no gray-matter dependency).
79
- */
80
- parseFile(raw: string): {
81
- frontmatter: CuratedFrontmatter;
82
- content: string;
83
- };
34
+ declare class CuratedKnowledgeManager {
35
+ private readonly curatedDir;
36
+ private readonly store;
37
+ private readonly embedder;
38
+ constructor(curatedDir: string, store: IKnowledgeStore, embedder: IEmbedder);
39
+ remember(title: string, content: string, category: CuratedCategory, tags?: string[]): Promise<{
40
+ path: string;
41
+ }>;
42
+ update(relativePath: string, newContent: string, reason: string): Promise<{
43
+ path: string;
44
+ version: number;
45
+ }>;
46
+ forget(relativePath: string, _reason: string): Promise<{
47
+ path: string;
48
+ }>;
49
+ read(relativePath: string): Promise<CuratedEntry & {
50
+ content: string;
51
+ }>;
52
+ list(filters?: {
53
+ category?: CuratedCategory;
54
+ tag?: string;
55
+ }): Promise<CuratedEntry[]>;
56
+ /**
57
+ * Re-index all curated files into the vector store.
58
+ * Call this after the indexer has run to restore curated vectors
59
+ * that may have been lost, or to bulk-sync disk state to vectors.
60
+ */
61
+ reindexAll(): Promise<{
62
+ indexed: number;
63
+ errors: string[];
64
+ }>;
65
+ private indexCuratedFile;
66
+ private discoverCategories;
67
+ private guardPath;
68
+ private validateCategoryName;
69
+ private validateContentSize;
70
+ private slugify;
71
+ /** Return a unique `category/slug.md` path, appending `-2`, `-3`, … on collision. */
72
+ private uniqueRelativePath;
73
+ private hash;
74
+ private hashId;
75
+ /**
76
+ * Simple YAML frontmatter serializer (no gray-matter dependency).
77
+ */
78
+ private serializeFile;
79
+ /**
80
+ * Simple YAML frontmatter parser (no gray-matter dependency).
81
+ */
82
+ parseFile(raw: string): {
83
+ frontmatter: CuratedFrontmatter;
84
+ content: string;
85
+ };
84
86
  }
85
- export {};
86
- //# sourceMappingURL=curated-manager.d.ts.map
87
+ //#endregion
88
+ export { CuratedCategory, CuratedEntry, CuratedKnowledgeManager };
@@ -1,10 +1,5 @@
1
- import{createHash as C}from"node:crypto";import{mkdir as b,readdir as f,readFile as m,stat as y,unlink as P,writeFile as v}from"node:fs/promises";import{dirname as x,isAbsolute as F,join as u}from"node:path";const w=50*1024;class k{constructor(t,e,n){this.curatedDir=t;this.store=e;this.embedder=n}async remember(t,e,n,r=[]){this.validateCategoryName(n),this.validateContentSize(e);const a=this.slugify(t),s=await this.uniqueRelativePath(n,a),i=u(this.curatedDir,s),g=new Date().toISOString(),c={title:t,category:n,tags:r,created:g,updated:g,version:1,origin:"curated",changelog:[{version:1,date:g,reason:"Initial creation"}]},d=this.serializeFile(e,c);return await b(x(i),{recursive:!0}),await v(i,d,"utf-8"),await this.indexCuratedFile(s,e,c),{path:s}}async update(t,e,n){this.guardPath(t),this.validateContentSize(e);const r=u(this.curatedDir,t),a=await m(r,"utf-8"),{frontmatter:s}=this.parseFile(a),i=(s.version??1)+1,g=new Date().toISOString();s.version=i,s.updated=g,s.changelog=[...s.changelog??[],{version:i,date:g,reason:n}];const c=this.serializeFile(e,s);return await v(r,c,"utf-8"),await this.indexCuratedFile(t,e,s),{path:t,version:i}}async forget(t,e){this.guardPath(t);const n=u(this.curatedDir,t),r=`curated/${t}`;return await this.store.deleteBySourcePath(r),await P(n),{path:t}}async read(t){this.guardPath(t);const e=u(this.curatedDir,t),n=await m(e,"utf-8"),{frontmatter:r,content:a}=this.parseFile(n),s=t.split("/")[0];return{path:t,title:r.title??t,category:s,tags:r.tags??[],version:r.version??1,created:r.created??"",updated:r.updated??"",contentPreview:a.slice(0,200),content:a}}async list(t){const e=[],n=t?.category?[t.category]:await this.discoverCategories();for(const r of n){const a=u(this.curatedDir,r);try{const s=await f(a);for(const i of s){if(!i.endsWith(".md"))continue;const g=u(a,i),c=await m(g,"utf-8"),{frontmatter:d,content:h}=this.parseFile(c);t?.tag&&!(d.tags??[]).includes(t.tag)||e.push({path:`${r}/${i}`,title:d.title??i,category:r,tags:d.tags??[],version:d.version??1,created:d.created??"",updated:d.updated??"",contentPreview:h.slice(0,200)})}}catch{}}return e}async reindexAll(){const t=await this.discoverCategories(),e=[],n=[];for(const i of t){const g=u(this.curatedDir,i);let c;try{c=(await f(g)).filter(d=>d.endsWith(".md"))}catch{continue}for(const d of c){const h=`${i}/${d}`,p=u(g,d);try{const o=await m(p,"utf-8"),{frontmatter:l,content:$}=this.parseFile(o);n.push({relativePath:h,content:$,frontmatter:l})}catch(o){e.push(`${h}: ${o.message}`)}}}if(n.length===0)return{indexed:0,errors:e};const r=await this.embedder.embedBatch(n.map(i=>i.content)),a=new Date().toISOString(),s=n.map(i=>{const g=`curated/${i.relativePath}`;return{id:this.hashId(g,0),content:i.content,sourcePath:g,contentType:"curated-knowledge",headingPath:i.frontmatter.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:i.content.split(`
2
- `).length,fileHash:this.hash(i.content),indexedAt:a,origin:"curated",tags:i.frontmatter.tags,category:i.frontmatter.category,version:i.frontmatter.version}});return await this.store.upsert(s,r),{indexed:n.length,errors:e}}async indexCuratedFile(t,e,n){const r=await this.embedder.embed(e),a=`curated/${t}`,s=new Date().toISOString(),i={id:this.hashId(a,0),content:e,sourcePath:a,contentType:"curated-knowledge",headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:e.split(`
3
- `).length,fileHash:this.hash(e),indexedAt:s,origin:"curated",tags:n.tags,category:n.category,version:n.version};await this.store.upsert([i],[r])}async discoverCategories(){try{return(await f(this.curatedDir,{withFileTypes:!0})).filter(e=>e.isDirectory()&&/^[a-z][a-z0-9-]*$/.test(e.name)).map(e=>e.name)}catch{return[]}}guardPath(t){if(t.includes("..")||F(t))throw new Error(`Invalid path: ${t}. Must be relative within curated/ directory.`);const e=t.split("/")[0];this.validateCategoryName(e)}validateCategoryName(t){if(!/^[a-z][a-z0-9-]*$/.test(t))throw new Error(`Invalid category name: "${t}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(t){if(Buffer.byteLength(t,"utf-8")>w)throw new Error(`Content exceeds maximum size of ${w/1024}KB`)}slugify(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,80)}async uniqueRelativePath(t,e){const n=`${t}/${e}.md`,r=u(this.curatedDir,n);try{await y(r)}catch{return n}for(let a=2;a<=100;a++){const s=`${t}/${e}-${a}.md`;try{await y(u(this.curatedDir,s))}catch{return s}}throw new Error(`Too many entries with slug "${e}" in category "${t}"`)}hash(t){return C("sha256").update(t).digest("hex").slice(0,16)}hashId(t,e){return this.hash(`${t}::${e}`)}serializeFile(t,e){return`${["---",`title: "${e.title.replace(/"/g,'\\"')}"`,`category: ${e.category}`,`tags: [${e.tags.map(r=>`"${r}"`).join(", ")}]`,`created: ${e.created}`,`updated: ${e.updated}`,`version: ${e.version}`,`origin: ${e.origin}`,"changelog:",...e.changelog.map(r=>` - version: ${r.version}
4
- date: ${r.date}
5
- reason: "${r.reason.replace(/"/g,'\\"')}"`),"---"].join(`
6
- `)}
7
-
8
- ${t}
9
- `}parseFile(t){const e=t.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!e)return{frontmatter:{title:"Untitled",category:"notes",tags:[],created:"",updated:"",version:1,origin:"curated",changelog:[]},content:t};const n=e[1],r=e[2].trim(),a={},s=[],i=n.split(`
10
- `);let g=!1,c={};for(const d of i){if(/^changelog:\s*$/.test(d)){g=!0;continue}if(g){const p=d.match(/^\s+-\s+version:\s*(\d+)$/);if(p){c.version!=null&&s.push(c),c={version:parseInt(p[1],10)};continue}const o=d.match(/^\s+date:\s*(.+)$/);if(o){c.date=o[1].trim();continue}const l=d.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(l){c.reason=l[1];continue}/^\w/.test(d)&&(g=!1,c.version!=null&&s.push(c),c={});continue}const h=d.match(/^(\w+):\s*(.*)$/);if(h){const p=h[1];let o=h[2];typeof o=="string"&&o.startsWith("[")&&o.endsWith("]")?o=o.slice(1,-1).split(",").map(l=>l.trim().replace(/^"|"$/g,"")).filter(l=>l.length>0):typeof o=="string"&&/^\d+$/.test(o)?o=parseInt(o,10):typeof o=="string"&&o.startsWith('"')&&o.endsWith('"')&&(o=o.slice(1,-1)),a[p]=o}}return c.version!=null&&s.push(c),{frontmatter:{title:a.title??"Untitled",category:a.category??"notes",tags:a.tags??[],created:a.created??"",updated:a.updated??"",version:a.version??1,origin:"curated",changelog:s},content:r}}}export{k as CuratedKnowledgeManager};
1
+ import{dirname as e,isAbsolute as t,join as n}from"node:path";import{createLogger as r,serializeError as i}from"../../core/dist/index.js";import{createHash as a}from"node:crypto";import{mkdir as o,readFile as s,readdir as c,stat as l,unlink as u,writeFile as d}from"node:fs/promises";const f=50*1024,p=r(`server`);var m=class{constructor(e,t,n){this.curatedDir=e,this.store=t,this.embedder=n}async remember(t,r,i,a=[]){this.validateCategoryName(i),this.validateContentSize(r);let s=this.slugify(t),c=await this.uniqueRelativePath(i,s),l=n(this.curatedDir,c),f=new Date().toISOString(),p={title:t,category:i,tags:a,created:f,updated:f,version:1,origin:`curated`,changelog:[{version:1,date:f,reason:`Initial creation`}]},m=this.serializeFile(r,p);await o(e(l),{recursive:!0});try{await d(l,m,{encoding:`utf-8`,flag:`wx`})}catch(e){throw e.code===`EEXIST`?Error(`Concurrent write collision for "${c}" — retry the operation`):e}try{await this.indexCuratedFile(c,r,p)}catch(e){throw await u(l).catch(()=>{}),Error(`Remember failed: wrote file but indexing failed — rolled back. ${e.message}`)}return{path:c}}async update(e,t,r){this.guardPath(e),this.validateContentSize(t);let i=n(this.curatedDir,e),a=await s(i,`utf-8`),{frontmatter:o}=this.parseFile(a),c=(o.version??1)+1,l=new Date().toISOString();return o.version=c,o.updated=l,o.changelog=[...o.changelog??[],{version:c,date:l,reason:r}],await d(i,this.serializeFile(t,o),`utf-8`),await this.indexCuratedFile(e,t,o),{path:e,version:c}}async forget(e,t){this.guardPath(e),await u(n(this.curatedDir,e));let r=`.ai/curated/${e}`;return await this.store.deleteBySourcePath(r).catch(e=>{p.warn(`File deleted but vector cleanup failed`,{sourcePath:r,...i(e)})}),{path:e}}async read(e){this.guardPath(e);let t=await s(n(this.curatedDir,e),`utf-8`),{frontmatter:r,content:i}=this.parseFile(t),a=e.split(`/`)[0];return{path:e,title:r.title??e,category:a,tags:r.tags??[],version:r.version??1,created:r.created??``,updated:r.updated??``,contentPreview:i.slice(0,200),content:i}}async list(e){let t=[],r=e?.category?[e.category]:await this.discoverCategories();for(let i of r){let r=n(this.curatedDir,i);try{let a=await c(r);for(let o of a){if(!o.endsWith(`.md`))continue;let a=await s(n(r,o),`utf-8`),{frontmatter:c,content:l}=this.parseFile(a);e?.tag&&!(c.tags??[]).includes(e.tag)||t.push({path:`${i}/${o}`,title:c.title??o,category:i,tags:c.tags??[],version:c.version??1,created:c.created??``,updated:c.updated??``,contentPreview:l.slice(0,200)})}}catch{}}return t}async reindexAll(){let e=await this.discoverCategories(),t=[],r=[];for(let a of e){let e=n(this.curatedDir,a),o;try{o=(await c(e)).filter(e=>e.endsWith(`.md`))}catch{continue}for(let c of o){let o=`${a}/${c}`,l=n(e,c);try{let e=await s(l,`utf-8`),{frontmatter:t,content:n}=this.parseFile(e);r.push({relativePath:o,content:n,frontmatter:t})}catch(e){p.error(`Failed to read curated file`,{relativePath:o,...i(e)}),t.push(`${o}: read failed`)}}}if(r.length===0)return{indexed:0,errors:t};let a=await this.embedder.embedBatch(r.map(e=>e.content)),o=new Date().toISOString(),l=r.map(e=>{let t=`.ai/curated/${e.relativePath}`;return{id:this.hashId(t,0),content:e.content,sourcePath:t,contentType:`curated-knowledge`,headingPath:e.frontmatter.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:e.content.split(`
2
+ `).length,fileHash:this.hash(e.content),indexedAt:o,origin:`curated`,tags:e.frontmatter.tags,category:e.frontmatter.category,version:e.frontmatter.version}});return await this.store.upsert(l,a),{indexed:r.length,errors:t}}async indexCuratedFile(e,t,n){let r=await this.embedder.embed(t),i=`.ai/curated/${e}`,a=new Date().toISOString(),o={id:this.hashId(i,0),content:t,sourcePath:i,contentType:`curated-knowledge`,headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:t.split(`
3
+ `).length,fileHash:this.hash(t),indexedAt:a,origin:`curated`,tags:n.tags,category:n.category,version:n.version};await this.store.upsert([o],[r])}async discoverCategories(){try{return(await c(this.curatedDir,{withFileTypes:!0})).filter(e=>e.isDirectory()&&/^[a-z][a-z0-9-]*$/.test(e.name)).map(e=>e.name)}catch{return[]}}guardPath(e){if(e.includes(`..`)||t(e))throw Error(`Invalid path: ${e}. Must be relative within .ai/curated/ directory.`);let n=e.split(`/`)[0];this.validateCategoryName(n)}validateCategoryName(e){if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid category name: "${e}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(e){if(Buffer.byteLength(e,`utf-8`)>f)throw Error(`Content exceeds maximum size of ${f/1024}KB`)}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)}async uniqueRelativePath(e,t){let r=`${e}/${t}.md`,i=n(this.curatedDir,r);try{await l(i)}catch{return r}for(let r=2;r<=100;r++){let i=`${e}/${t}-${r}.md`;try{await l(n(this.curatedDir,i))}catch{return i}}throw Error(`Too many entries with slug "${t}" in category "${e}"`)}hash(e){return a(`sha256`).update(e).digest(`hex`).slice(0,16)}hashId(e,t){return this.hash(`${e}::${t}`)}serializeFile(e,t){return`${[`---`,`title: "${t.title.replace(/"/g,`\\"`)}"`,`category: ${t.category}`,`tags: [${t.tags.map(e=>`"${e}"`).join(`, `)}]`,`created: ${t.created}`,`updated: ${t.updated}`,`version: ${t.version}`,`origin: ${t.origin}`,`changelog:`,...t.changelog.map(e=>` - version: ${e.version}\n date: ${e.date}\n reason: "${e.reason.replace(/"/g,`\\"`)}"`),`---`].join(`
4
+ `)}\n\n${e}\n`}parseFile(e){let t=e.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!t)return{frontmatter:{title:`Untitled`,category:`notes`,tags:[],created:``,updated:``,version:1,origin:`curated`,changelog:[]},content:e};let n=t[1],r=t[2].trim(),i={},a=[],o=n.split(`
5
+ `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};export{m as CuratedKnowledgeManager};
@@ -1,2 +1 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
1
+ export { };
@@ -1 +1 @@
1
- import{parseArgs as m}from"node:util";import{loadConfig as f}from"./config.js";import{createLazyServer as w,createMcpServer as x,initializeKnowledgeBase as g}from"./server.js";import{checkForUpdates as I}from"./version-check.js";const{values:h}=m({options:{transport:{type:"string",default:process.env.KB_TRANSPORT??"stdio"},port:{type:"string",default:process.env.KB_PORT??"3210"}}});async function B(){console.error("[KB] Starting MCP Knowledge Base server...");const t=f();if(console.error(`[KB] Config loaded: ${t.sources.length} source(s), store at ${t.store.path}`),I(),h.transport==="http"){const{StreamableHTTPServerTransport:d}=await import("@modelcontextprotocol/sdk/server/streamableHttp.js"),a=(await import("express")).default,i=await g(t),c=x(i,t);console.error("[KB] MCP server configured with 46 tools and 2 resources");const n=a();n.use(a.json()),n.use((s,e,o)=>{if(e.setHeader("Access-Control-Allow-Origin",process.env.KB_CORS_ORIGIN??"*"),e.setHeader("Access-Control-Allow-Methods","GET, POST, DELETE, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),s.method==="OPTIONS"){e.status(204).end();return}o()}),n.get("/health",(s,e)=>{e.json({status:"ok"})}),n.post("/mcp",async(s,e)=>{try{const o=new d({sessionIdGenerator:void 0});await c.connect(o),await o.handleRequest(s,e,s.body),e.on("close",()=>{o.close()})}catch(o){console.error("[KB] MCP handler error:",o),e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}}),n.get("/mcp",(s,e)=>{e.writeHead(405).end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Method not allowed."},id:null}))}),n.delete("/mcp",(s,e)=>{e.writeHead(405).end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Method not allowed."},id:null}))});const l=Number(h.port),p=n.listen(l,()=>{console.error(`[KB] MCP server listening on http://0.0.0.0:${l}/mcp`),(async()=>{try{const e=t.sources.map(r=>r.path).join(", ");console.error(`[KB] Running initial index for sources: ${e}`);const o=await i.indexer.index(t,r=>{r.phase==="crawling"||r.phase==="done"||r.phase==="chunking"&&r.currentFile&&console.error(`[KB] [${r.filesProcessed+1}/${r.filesTotal}] ${r.currentFile}`)});console.error(`[KB] Indexed ${o.filesProcessed} files (${o.filesSkipped} skipped, ${o.chunksCreated} chunks) in ${(o.durationMs/1e3).toFixed(1)}s`);try{const r=await i.curated.reindexAll();console.error(`[KB] Curated re-index: ${r.indexed} entries restored to vector store`)}catch(r){console.error("[KB] Curated re-index failed:",r)}}catch(e){console.error("[KB] Initial index failed (will retry on kb_reindex):",e)}})()}),u=async s=>{console.error(`[KB] ${s} received \u2014 shutting down...`),p.close(),await c.close(),await i.store.close(),await i.embedder.shutdown(),process.exit(0)};process.on("SIGINT",()=>u("SIGINT")),process.on("SIGTERM",()=>u("SIGTERM"))}else{const{server:d,ready:a,runInitialIndex:i}=w(t),{StdioServerTransport:c}=await import("@modelcontextprotocol/sdk/server/stdio.js"),n=new c;await d.connect(n),console.error("[KB] MCP server started (stdio)"),a.catch(p=>{console.error("[KB] Initialization failed:",p),process.exit(1)}),process.env.KB_AUTO_INDEX!=="false"?i():console.error("[KB] Auto-index disabled (KB_AUTO_INDEX=false). Use kb_reindex to index manually.")}}B().catch(t=>{console.error("[KB] Fatal error:",t),process.exit(1)});
1
+ import{loadConfig as e}from"./config.js";import{checkForUpdates as t}from"./version-check.js";import{ALL_TOOL_NAMES as n,createLazyServer as r,createMcpServer as i,initializeKnowledgeBase as a}from"./server.js";import{createLogger as o,serializeError as s}from"../../core/dist/index.js";import{parseArgs as c}from"node:util";const l=o(`server`),{values:u}=c({options:{transport:{type:`string`,default:process.env.KB_TRANSPORT??`stdio`},port:{type:`string`,default:process.env.KB_PORT??`3210`}}});async function d(){process.on(`unhandledRejection`,e=>{l.error(`Unhandled rejection`,s(e))}),l.info(`Starting MCP Knowledge Base server`);let o=e();if(l.info(`Config loaded`,{sourceCount:o.sources.length,storePath:o.store.path}),t(),u.transport===`http`){let{StreamableHTTPServerTransport:e}=await import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),t=(await import(`express`)).default,r=await a(o),c=i(r,o);l.info(`MCP server configured`,{toolCount:n.length,resourceCount:2});let d=t();d.use(t.json()),d.use((e,t,n)=>{if(t.setHeader(`Access-Control-Allow-Origin`,process.env.KB_CORS_ORIGIN??`*`),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization`),e.method===`OPTIONS`){t.status(204).end();return}n()}),d.get(`/health`,(e,t)=>{t.json({status:`ok`})}),d.post(`/mcp`,async(t,n)=>{try{let r=new e({sessionIdGenerator:void 0});await c.connect(r),await r.handleRequest(t,n,t.body),n.on(`close`,()=>{r.close()})}catch(e){l.error(`MCP handler error`,s(e)),n.headersSent||n.status(500).json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null})}}),d.get(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))}),d.delete(`/mcp`,(e,t)=>{t.writeHead(405).end(JSON.stringify({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not allowed.`},id:null}))});let f=Number(u.port),p=d.listen(f,()=>{l.info(`MCP server listening`,{url:`http://0.0.0.0:${f}/mcp`,port:f}),(async()=>{try{let e=o.sources.map(e=>e.path).join(`, `);l.info(`Running initial index`,{sourcePaths:e});let t=await r.indexer.index(o,e=>{e.phase===`crawling`||e.phase===`done`||e.phase===`chunking`&&e.currentFile&&l.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile})});l.info(`Initial index complete`,{filesProcessed:t.filesProcessed,filesSkipped:t.filesSkipped,chunksCreated:t.chunksCreated,durationMs:t.durationMs});try{let e=await r.curated.reindexAll();l.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){l.error(`Curated re-index failed`,s(e))}}catch(e){l.error(`Initial index failed; will retry on kb_reindex`,s(e))}})().catch(e=>l.error(`Initial index failed`,s(e)))}),m=async e=>{l.info(`Shutdown signal received`,{signal:e}),p.close(),await c.close(),await r.graphStore.close().catch(()=>{}),await r.store.close(),await r.embedder.shutdown(),process.exit(0)};process.on(`SIGINT`,()=>m(`SIGINT`)),process.on(`SIGTERM`,()=>m(`SIGTERM`))}else{let{server:e,ready:t,runInitialIndex:n}=r(o),{StdioServerTransport:i}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),a=new i;await e.connect(a),l.info(`MCP server started`,{transport:`stdio`}),t.catch(e=>{l.error(`Initialization failed`,s(e)),process.exit(1)}),process.env.KB_AUTO_INDEX===`false`?l.warn(`Auto-index disabled; use kb_reindex to index manually`):n().catch(e=>l.error(`Initial index failed`,s(e)))}}d().catch(e=>{l.error(`Fatal error`,s(e)),process.exit(1)});export{};
@@ -1,11 +1,10 @@
1
- /**
2
- * Replay interceptor — wraps McpServer.registerTool to capture all tool invocations
3
- * to the audit trail. Applied once in createMcpServer.
4
- */
5
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/replay-interceptor.d.ts
6
4
  /**
7
5
  * Wrap the McpServer's registerTool method so that every tool invocation
8
6
  * is logged to the replay JSONL audit trail.
9
7
  */
10
- export declare function installReplayInterceptor(server: McpServer): void;
11
- //# sourceMappingURL=replay-interceptor.d.ts.map
8
+ declare function installReplayInterceptor(server: McpServer): void;
9
+ //#endregion
10
+ export { installReplayInterceptor };
@@ -1 +1 @@
1
- import{replayAppend as s}from"../../tools/dist/index.js";function w(n){const i=n.registerTool.bind(n);n.registerTool=(o,a,p)=>i(o,a,async(r,c)=>{const e=Date.now();try{const t=await p(r,c);return s({ts:new Date().toISOString(),source:"mcp",tool:o,input:JSON.stringify(r),durationMs:Date.now()-e,status:"ok",output:JSON.stringify(t).slice(0,200)}),t}catch(t){throw s({ts:new Date().toISOString(),source:"mcp",tool:o,input:JSON.stringify(r),durationMs:Date.now()-e,status:"error",output:t instanceof Error?t.message:String(t)}),t}})}export{w as installReplayInterceptor};
1
+ import{replayAppend as e}from"../../tools/dist/index.js";const t=/key|token|secret|auth|password|bearer/i,n=new Set([`eval`,`env`]);function r(e,r){if(n.has(e))return JSON.stringify({_redacted:!0,tool:e});if(e===`http`&&r.headers&&typeof r.headers==`object`){let e={...r},n={};for(let[e,i]of Object.entries(r.headers))n[e]=t.test(e)?`[REDACTED]`:i;return e.headers=n,JSON.stringify(e).slice(0,200)}return JSON.stringify(r).slice(0,200)}function i(t){let n=t.registerTool.bind(t);t.registerTool=(t,i,a)=>n(t,i,async(n,i)=>{let o=Date.now();try{let s=await a(n,i);return e({ts:new Date().toISOString(),source:`mcp`,tool:t,input:r(t,n),durationMs:Date.now()-o,status:`ok`,output:JSON.stringify(s).slice(0,200)}),s}catch(i){throw e({ts:new Date().toISOString(),source:`mcp`,tool:t,input:r(t,n),durationMs:Date.now()-o,status:`error`,output:i instanceof Error?i.message:String(i)}),i}})}export{i as installReplayInterceptor};
@@ -1,4 +1,7 @@
1
- import type { IKnowledgeStore } from '@kb/store';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- export declare function registerResources(server: McpServer, store: IKnowledgeStore): void;
4
- //# sourceMappingURL=resources.d.ts.map
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { IKnowledgeStore } from "@kb/store";
3
+
4
+ //#region packages/server/src/resources/resources.d.ts
5
+ declare function registerResources(server: McpServer, store: IKnowledgeStore): void;
6
+ //#endregion
7
+ export { registerResources };
@@ -1,2 +1,2 @@
1
- function r(t,s){t.resource("kb-status","kb://status",{description:"Current knowledge base status and statistics",mimeType:"text/plain"},async()=>{const e=await s.getStats();return{contents:[{uri:"kb://status",text:`Knowledge Base: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??"Never"}`,mimeType:"text/plain"}]}}),t.resource("kb-file-tree","kb://file-tree",{description:"List of all indexed source files",mimeType:"text/plain"},async()=>({contents:[{uri:"kb://file-tree",text:(await s.listSourcePaths()).sort().join(`
2
- `),mimeType:"text/plain"}]}))}export{r as registerResources};
1
+ function e(e,t){e.resource(`kb-status`,`kb://status`,{description:`Current knowledge base status and statistics`,mimeType:`text/plain`},async()=>{let e=await t.getStats();return{contents:[{uri:`kb://status`,text:`Knowledge Base: ${e.totalRecords} records from ${e.totalFiles} files. Last indexed: ${e.lastIndexedAt??`Never`}`,mimeType:`text/plain`}]}}),e.resource(`kb-file-tree`,`kb://file-tree`,{description:`List of all indexed source files`,mimeType:`text/plain`},async()=>({contents:[{uri:`kb://file-tree`,text:(await t.listSourcePaths()).sort().join(`
2
+ `),mimeType:`text/plain`}]}))}export{e as registerResources};