@vpxa/kb 0.1.13 → 0.1.15

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 (383) hide show
  1. package/README.md +8 -2
  2. package/package.json +10 -7
  3. package/packages/analyzers/dist/blast-radius-analyzer.d.ts +17 -20
  4. package/packages/analyzers/dist/blast-radius-analyzer.js +6 -12
  5. package/packages/analyzers/dist/dependency-analyzer.d.ts +31 -27
  6. package/packages/analyzers/dist/dependency-analyzer.js +7 -9
  7. package/packages/analyzers/dist/diagram-generator.d.ts +12 -8
  8. package/packages/analyzers/dist/diagram-generator.js +3 -4
  9. package/packages/analyzers/dist/entry-point-analyzer.d.ts +39 -35
  10. package/packages/analyzers/dist/entry-point-analyzer.js +5 -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 +29 -25
  14. package/packages/analyzers/dist/knowledge-producer.js +16 -15
  15. package/packages/analyzers/dist/pattern-analyzer.d.ts +14 -10
  16. package/packages/analyzers/dist/pattern-analyzer.js +3 -5
  17. package/packages/analyzers/dist/regex-call-graph.d.ts +6 -12
  18. package/packages/analyzers/dist/regex-call-graph.js +2 -1
  19. package/packages/analyzers/dist/structure-analyzer.d.ts +13 -9
  20. package/packages/analyzers/dist/structure-analyzer.js +3 -4
  21. package/packages/analyzers/dist/symbol-analyzer.d.ts +12 -8
  22. package/packages/analyzers/dist/symbol-analyzer.js +8 -13
  23. package/packages/analyzers/dist/ts-call-graph.d.ts +16 -13
  24. package/packages/analyzers/dist/ts-call-graph.js +2 -1
  25. package/packages/analyzers/dist/types.d.ts +82 -79
  26. package/packages/analyzers/dist/types.js +1 -0
  27. package/packages/chunker/dist/call-graph-extractor.d.ts +13 -10
  28. package/packages/chunker/dist/call-graph-extractor.js +2 -1
  29. package/packages/chunker/dist/chunker-factory.d.ts +6 -2
  30. package/packages/chunker/dist/chunker-factory.js +2 -1
  31. package/packages/chunker/dist/chunker.interface.d.ts +8 -4
  32. package/packages/chunker/dist/chunker.interface.js +1 -0
  33. package/packages/chunker/dist/code-chunker.d.ts +16 -12
  34. package/packages/chunker/dist/code-chunker.js +12 -14
  35. package/packages/chunker/dist/generic-chunker.d.ts +14 -10
  36. package/packages/chunker/dist/generic-chunker.js +6 -5
  37. package/packages/chunker/dist/index.d.ts +8 -8
  38. package/packages/chunker/dist/index.js +1 -1
  39. package/packages/chunker/dist/markdown-chunker.d.ts +16 -12
  40. package/packages/chunker/dist/markdown-chunker.js +4 -10
  41. package/packages/chunker/dist/treesitter-chunker.d.ts +28 -31
  42. package/packages/chunker/dist/treesitter-chunker.js +7 -8
  43. package/packages/cli/dist/commands/analyze.d.ts +6 -2
  44. package/packages/cli/dist/commands/analyze.js +3 -3
  45. package/packages/cli/dist/commands/context-cmds.d.ts +6 -2
  46. package/packages/cli/dist/commands/context-cmds.js +2 -1
  47. package/packages/cli/dist/commands/environment.d.ts +6 -2
  48. package/packages/cli/dist/commands/environment.js +2 -2
  49. package/packages/cli/dist/commands/execution.d.ts +6 -2
  50. package/packages/cli/dist/commands/execution.js +2 -1
  51. package/packages/cli/dist/commands/graph.d.ts +6 -2
  52. package/packages/cli/dist/commands/graph.js +6 -6
  53. package/packages/cli/dist/commands/init/adapters.d.ts +27 -0
  54. package/packages/cli/dist/commands/init/adapters.js +2 -0
  55. package/packages/cli/dist/commands/init/config.d.ts +11 -0
  56. package/packages/cli/dist/commands/init/config.js +4 -0
  57. package/packages/cli/dist/commands/init/curated.d.ts +8 -0
  58. package/packages/cli/dist/commands/init/curated.js +2 -0
  59. package/packages/cli/dist/commands/init/index.d.ts +23 -0
  60. package/packages/cli/dist/commands/init/index.js +3 -0
  61. package/packages/cli/dist/commands/init/scaffold.d.ts +24 -0
  62. package/packages/cli/dist/commands/init/scaffold.js +2 -0
  63. package/packages/cli/dist/commands/init/templates.d.ts +10 -0
  64. package/packages/cli/dist/commands/init/templates.js +302 -0
  65. package/packages/cli/dist/commands/init.d.ts +8 -3
  66. package/packages/cli/dist/commands/init.js +120 -123
  67. package/packages/cli/dist/commands/knowledge.d.ts +6 -2
  68. package/packages/cli/dist/commands/knowledge.js +2 -1
  69. package/packages/cli/dist/commands/search.d.ts +6 -2
  70. package/packages/cli/dist/commands/search.js +2 -8
  71. package/packages/cli/dist/commands/system.d.ts +6 -2
  72. package/packages/cli/dist/commands/system.js +5 -7
  73. package/packages/cli/dist/commands/workspace.d.ts +6 -2
  74. package/packages/cli/dist/commands/workspace.js +2 -2
  75. package/packages/cli/dist/context.d.ts +7 -4
  76. package/packages/cli/dist/context.js +2 -1
  77. package/packages/cli/dist/helpers.d.ts +51 -47
  78. package/packages/cli/dist/helpers.js +6 -5
  79. package/packages/cli/dist/index.d.ts +4 -1
  80. package/packages/cli/dist/index.js +3 -2
  81. package/packages/cli/dist/kb-init.d.ts +48 -50
  82. package/packages/cli/dist/kb-init.js +2 -1
  83. package/packages/cli/dist/types.d.ts +8 -5
  84. package/packages/cli/dist/types.js +1 -0
  85. package/packages/core/dist/constants.d.ts +36 -33
  86. package/packages/core/dist/constants.js +2 -1
  87. package/packages/core/dist/content-detector.d.ts +8 -7
  88. package/packages/core/dist/content-detector.js +2 -1
  89. package/packages/core/dist/errors.d.ts +15 -12
  90. package/packages/core/dist/errors.js +2 -1
  91. package/packages/core/dist/index.d.ts +6 -6
  92. package/packages/core/dist/index.js +1 -1
  93. package/packages/core/dist/logger.d.ts +16 -7
  94. package/packages/core/dist/logger.js +2 -1
  95. package/packages/core/dist/types.d.ts +107 -91
  96. package/packages/core/dist/types.js +2 -0
  97. package/packages/embeddings/dist/embedder.interface.d.ts +22 -19
  98. package/packages/embeddings/dist/embedder.interface.js +1 -0
  99. package/packages/embeddings/dist/index.d.ts +3 -3
  100. package/packages/embeddings/dist/index.js +1 -1
  101. package/packages/embeddings/dist/onnx-embedder.d.ts +21 -22
  102. package/packages/embeddings/dist/onnx-embedder.js +2 -1
  103. package/packages/enterprise-bridge/dist/cache.d.ts +29 -0
  104. package/packages/enterprise-bridge/dist/cache.js +2 -0
  105. package/packages/enterprise-bridge/dist/er-client.d.ts +38 -0
  106. package/packages/enterprise-bridge/dist/er-client.js +2 -0
  107. package/packages/enterprise-bridge/dist/evolution-collector.d.ts +63 -0
  108. package/packages/enterprise-bridge/dist/evolution-collector.js +2 -0
  109. package/packages/enterprise-bridge/dist/index.d.ts +8 -0
  110. package/packages/enterprise-bridge/dist/index.js +1 -0
  111. package/packages/enterprise-bridge/dist/policy-store.d.ts +46 -0
  112. package/packages/enterprise-bridge/dist/policy-store.js +2 -0
  113. package/packages/enterprise-bridge/dist/push-adapter.d.ts +24 -0
  114. package/packages/enterprise-bridge/dist/push-adapter.js +2 -0
  115. package/packages/enterprise-bridge/dist/result-merger.d.ts +15 -0
  116. package/packages/enterprise-bridge/dist/result-merger.js +2 -0
  117. package/packages/enterprise-bridge/dist/types.d.ts +82 -0
  118. package/packages/enterprise-bridge/dist/types.js +2 -0
  119. package/packages/indexer/dist/file-hasher.d.ts +5 -2
  120. package/packages/indexer/dist/file-hasher.js +2 -1
  121. package/packages/indexer/dist/filesystem-crawler.d.ts +23 -20
  122. package/packages/indexer/dist/filesystem-crawler.js +2 -1
  123. package/packages/indexer/dist/graph-extractor.d.ts +9 -12
  124. package/packages/indexer/dist/graph-extractor.js +2 -1
  125. package/packages/indexer/dist/incremental-indexer.d.ts +49 -43
  126. package/packages/indexer/dist/incremental-indexer.js +2 -1
  127. package/packages/indexer/dist/index.d.ts +5 -5
  128. package/packages/indexer/dist/index.js +1 -1
  129. package/packages/server/dist/api.d.ts +3 -8
  130. package/packages/server/dist/api.js +1 -1
  131. package/packages/server/dist/config.d.ts +6 -2
  132. package/packages/server/dist/config.js +2 -1
  133. package/packages/server/dist/curated-manager.d.ts +79 -76
  134. package/packages/server/dist/curated-manager.js +6 -10
  135. package/packages/server/dist/index.d.ts +1 -2
  136. package/packages/server/dist/index.js +2 -1
  137. package/packages/server/dist/replay-interceptor.d.ts +6 -6
  138. package/packages/server/dist/replay-interceptor.js +2 -1
  139. package/packages/server/dist/resources/resources.d.ts +7 -3
  140. package/packages/server/dist/resources/resources.js +3 -2
  141. package/packages/server/dist/server.d.ts +34 -24
  142. package/packages/server/dist/server.js +2 -1
  143. package/packages/server/dist/tools/analyze.tools.d.ts +14 -10
  144. package/packages/server/dist/tools/analyze.tools.js +2 -3
  145. package/packages/server/dist/tools/audit.tool.d.ts +8 -4
  146. package/packages/server/dist/tools/audit.tool.js +2 -4
  147. package/packages/server/dist/tools/bridge.tools.d.ts +35 -0
  148. package/packages/server/dist/tools/bridge.tools.js +16 -0
  149. package/packages/server/dist/tools/evolution.tools.d.ts +8 -0
  150. package/packages/server/dist/tools/evolution.tools.js +6 -0
  151. package/packages/server/dist/tools/forge.tools.d.ts +13 -11
  152. package/packages/server/dist/tools/forge.tools.js +11 -13
  153. package/packages/server/dist/tools/forget.tool.d.ts +7 -3
  154. package/packages/server/dist/tools/forget.tool.js +2 -7
  155. package/packages/server/dist/tools/graph.tool.d.ts +7 -3
  156. package/packages/server/dist/tools/graph.tool.js +5 -5
  157. package/packages/server/dist/tools/list.tool.d.ts +7 -3
  158. package/packages/server/dist/tools/list.tool.js +3 -8
  159. package/packages/server/dist/tools/lookup.tool.d.ts +7 -3
  160. package/packages/server/dist/tools/lookup.tool.js +3 -9
  161. package/packages/server/dist/tools/onboard.tool.d.ts +8 -4
  162. package/packages/server/dist/tools/onboard.tool.js +3 -2
  163. package/packages/server/dist/tools/policy.tools.d.ts +8 -0
  164. package/packages/server/dist/tools/policy.tools.js +3 -0
  165. package/packages/server/dist/tools/produce.tool.d.ts +6 -2
  166. package/packages/server/dist/tools/produce.tool.js +3 -2
  167. package/packages/server/dist/tools/read.tool.d.ts +7 -3
  168. package/packages/server/dist/tools/read.tool.js +3 -6
  169. package/packages/server/dist/tools/reindex.tool.d.ts +10 -6
  170. package/packages/server/dist/tools/reindex.tool.js +3 -2
  171. package/packages/server/dist/tools/remember.tool.d.ts +8 -3
  172. package/packages/server/dist/tools/remember.tool.js +4 -5
  173. package/packages/server/dist/tools/replay.tool.d.ts +6 -2
  174. package/packages/server/dist/tools/replay.tool.js +3 -6
  175. package/packages/server/dist/tools/search.tool.d.ts +10 -4
  176. package/packages/server/dist/tools/search.tool.js +7 -22
  177. package/packages/server/dist/tools/status.tool.d.ts +7 -3
  178. package/packages/server/dist/tools/status.tool.js +3 -3
  179. package/packages/server/dist/tools/toolkit.tools.d.ts +36 -34
  180. package/packages/server/dist/tools/toolkit.tools.js +20 -24
  181. package/packages/server/dist/tools/update.tool.d.ts +7 -3
  182. package/packages/server/dist/tools/update.tool.js +2 -6
  183. package/packages/server/dist/tools/utility.tools.d.ts +15 -14
  184. package/packages/server/dist/tools/utility.tools.js +11 -23
  185. package/packages/server/dist/version-check.d.ts +5 -1
  186. package/packages/server/dist/version-check.js +2 -1
  187. package/packages/store/dist/graph-store.interface.d.ts +89 -86
  188. package/packages/store/dist/graph-store.interface.js +1 -0
  189. package/packages/store/dist/index.d.ts +6 -6
  190. package/packages/store/dist/index.js +1 -1
  191. package/packages/store/dist/lance-store.d.ts +37 -30
  192. package/packages/store/dist/lance-store.js +2 -1
  193. package/packages/store/dist/sqlite-graph-store.d.ts +43 -46
  194. package/packages/store/dist/sqlite-graph-store.js +14 -13
  195. package/packages/store/dist/store-factory.d.ts +11 -7
  196. package/packages/store/dist/store-factory.js +2 -1
  197. package/packages/store/dist/store.interface.d.ts +47 -46
  198. package/packages/store/dist/store.interface.js +1 -0
  199. package/packages/tools/dist/audit.d.ts +61 -61
  200. package/packages/tools/dist/audit.js +5 -5
  201. package/packages/tools/dist/batch.d.ts +20 -17
  202. package/packages/tools/dist/batch.js +2 -1
  203. package/packages/tools/dist/changelog.d.ts +29 -26
  204. package/packages/tools/dist/changelog.js +3 -2
  205. package/packages/tools/dist/check.d.ts +42 -38
  206. package/packages/tools/dist/check.js +3 -2
  207. package/packages/tools/dist/checkpoint.d.ts +17 -14
  208. package/packages/tools/dist/checkpoint.js +2 -2
  209. package/packages/tools/dist/codemod.d.ts +35 -32
  210. package/packages/tools/dist/codemod.js +3 -2
  211. package/packages/tools/dist/compact.d.ts +34 -37
  212. package/packages/tools/dist/compact.js +3 -2
  213. package/packages/tools/dist/data-transform.d.ts +10 -7
  214. package/packages/tools/dist/data-transform.js +2 -1
  215. package/packages/tools/dist/dead-symbols.d.ts +29 -25
  216. package/packages/tools/dist/dead-symbols.js +3 -2
  217. package/packages/tools/dist/delegate.d.ts +26 -23
  218. package/packages/tools/dist/delegate.js +2 -5
  219. package/packages/tools/dist/diff-parse.d.ts +24 -21
  220. package/packages/tools/dist/diff-parse.js +4 -3
  221. package/packages/tools/dist/digest.d.ts +43 -45
  222. package/packages/tools/dist/digest.js +5 -5
  223. package/packages/tools/dist/encode.d.ts +11 -8
  224. package/packages/tools/dist/encode.js +2 -1
  225. package/packages/tools/dist/env-info.d.ts +25 -22
  226. package/packages/tools/dist/env-info.js +2 -1
  227. package/packages/tools/dist/eval.d.ts +13 -10
  228. package/packages/tools/dist/eval.js +3 -3
  229. package/packages/tools/dist/evidence-map.d.ts +64 -61
  230. package/packages/tools/dist/evidence-map.js +3 -3
  231. package/packages/tools/dist/file-cache.d.ts +42 -0
  232. package/packages/tools/dist/file-cache.js +4 -0
  233. package/packages/tools/dist/file-summary.d.ts +34 -29
  234. package/packages/tools/dist/file-summary.js +3 -2
  235. package/packages/tools/dist/file-walk.d.ts +6 -3
  236. package/packages/tools/dist/file-walk.js +2 -1
  237. package/packages/tools/dist/find-examples.d.ts +26 -21
  238. package/packages/tools/dist/find-examples.js +4 -3
  239. package/packages/tools/dist/find.d.ts +39 -40
  240. package/packages/tools/dist/find.js +2 -1
  241. package/packages/tools/dist/forge-classify.d.ts +35 -38
  242. package/packages/tools/dist/forge-classify.js +3 -2
  243. package/packages/tools/dist/forge-ground.d.ts +58 -60
  244. package/packages/tools/dist/forge-ground.js +2 -1
  245. package/packages/tools/dist/git-context.d.ts +22 -19
  246. package/packages/tools/dist/git-context.js +4 -3
  247. package/packages/tools/dist/graph-query.d.ts +75 -78
  248. package/packages/tools/dist/graph-query.js +2 -1
  249. package/packages/tools/dist/guide.d.ts +14 -11
  250. package/packages/tools/dist/guide.js +2 -1
  251. package/packages/tools/dist/health.d.ts +13 -10
  252. package/packages/tools/dist/health.js +3 -2
  253. package/packages/tools/dist/http-request.d.ts +20 -17
  254. package/packages/tools/dist/http-request.js +2 -1
  255. package/packages/tools/dist/index.d.ts +54 -53
  256. package/packages/tools/dist/index.js +1 -1
  257. package/packages/tools/dist/lane.d.ts +28 -25
  258. package/packages/tools/dist/lane.js +7 -7
  259. package/packages/tools/dist/measure.d.ts +32 -29
  260. package/packages/tools/dist/measure.js +3 -2
  261. package/packages/tools/dist/onboard.d.ts +29 -26
  262. package/packages/tools/dist/onboard.js +18 -41
  263. package/packages/tools/dist/parse-output.d.ts +48 -45
  264. package/packages/tools/dist/parse-output.js +3 -2
  265. package/packages/tools/dist/path-resolver.d.ts +4 -1
  266. package/packages/tools/dist/path-resolver.js +2 -1
  267. package/packages/tools/dist/process-manager.d.ts +18 -15
  268. package/packages/tools/dist/process-manager.js +2 -1
  269. package/packages/tools/dist/queue.d.ts +28 -25
  270. package/packages/tools/dist/queue.js +2 -2
  271. package/packages/tools/dist/regex-test.d.ts +26 -23
  272. package/packages/tools/dist/regex-test.js +2 -1
  273. package/packages/tools/dist/rename.d.ts +28 -25
  274. package/packages/tools/dist/rename.js +3 -2
  275. package/packages/tools/dist/replay.d.ts +32 -29
  276. package/packages/tools/dist/replay.js +5 -6
  277. package/packages/tools/dist/response-envelope.d.ts +32 -29
  278. package/packages/tools/dist/response-envelope.js +2 -1
  279. package/packages/tools/dist/schema-validate.d.ts +15 -12
  280. package/packages/tools/dist/schema-validate.js +2 -1
  281. package/packages/tools/dist/scope-map.d.ts +45 -47
  282. package/packages/tools/dist/scope-map.js +2 -1
  283. package/packages/tools/dist/snippet.d.ts +26 -24
  284. package/packages/tools/dist/snippet.js +2 -1
  285. package/packages/tools/dist/stash.d.ts +13 -10
  286. package/packages/tools/dist/stash.js +2 -2
  287. package/packages/tools/dist/stratum-card.d.ts +27 -27
  288. package/packages/tools/dist/stratum-card.js +4 -5
  289. package/packages/tools/dist/symbol.d.ts +29 -25
  290. package/packages/tools/dist/symbol.js +4 -3
  291. package/packages/tools/dist/test-run.d.ts +19 -15
  292. package/packages/tools/dist/test-run.js +3 -2
  293. package/packages/tools/dist/text-utils.d.ts +6 -3
  294. package/packages/tools/dist/text-utils.js +3 -2
  295. package/packages/tools/dist/time-utils.d.ts +15 -12
  296. package/packages/tools/dist/time-utils.js +2 -1
  297. package/packages/tools/dist/trace.d.ts +24 -20
  298. package/packages/tools/dist/trace.js +3 -2
  299. package/packages/tools/dist/truncation.d.ts +6 -3
  300. package/packages/tools/dist/truncation.js +8 -14
  301. package/packages/tools/dist/watch.d.ts +28 -25
  302. package/packages/tools/dist/watch.js +2 -1
  303. package/packages/tools/dist/web-fetch.d.ts +35 -32
  304. package/packages/tools/dist/web-fetch.js +7 -12
  305. package/packages/tools/dist/web-search.d.ts +16 -13
  306. package/packages/tools/dist/web-search.js +2 -1
  307. package/packages/tools/dist/workset.d.ts +19 -16
  308. package/packages/tools/dist/workset.js +2 -2
  309. package/packages/tui/dist/App-BAlmxCCw.js +3 -0
  310. package/packages/tui/dist/App.d.ts +11 -5
  311. package/packages/tui/dist/App.js +1 -450
  312. package/packages/tui/dist/CuratedPanel-sYdZAICX.js +3 -0
  313. package/packages/tui/dist/LogPanel-DVB8Sv46.js +4 -0
  314. package/packages/tui/dist/SearchPanel-DREo6zgt.js +3 -0
  315. package/packages/tui/dist/StatusPanel-2ex8fLOO.js +3 -0
  316. package/packages/tui/dist/chunk-D6axbAb-.js +2 -0
  317. package/packages/tui/dist/devtools-DUyj952l.js +8 -0
  318. package/packages/tui/dist/embedder.interface-D4ew0HPW.d.ts +29 -0
  319. package/packages/tui/dist/index-B9VpfVPP.d.ts +14 -0
  320. package/packages/tui/dist/index.d.ts +3 -19
  321. package/packages/tui/dist/index.js +2 -476
  322. package/packages/tui/dist/jsx-runtime-Cof-kwFn.js +317 -0
  323. package/packages/tui/dist/panels/CuratedPanel.d.ts +11 -5
  324. package/packages/tui/dist/panels/CuratedPanel.js +1 -371
  325. package/packages/tui/dist/panels/LogPanel.d.ts +7 -2
  326. package/packages/tui/dist/panels/LogPanel.js +1 -449
  327. package/packages/tui/dist/panels/SearchPanel.d.ts +14 -7
  328. package/packages/tui/dist/panels/SearchPanel.js +1 -372
  329. package/packages/tui/dist/panels/StatusPanel.d.ts +11 -5
  330. package/packages/tui/dist/panels/StatusPanel.js +1 -371
  331. package/packages/tui/dist/store.interface-CnY6SPOH.d.ts +151 -0
  332. package/scaffold/adapters/claude-code.mjs +20 -0
  333. package/scaffold/adapters/copilot.mjs +320 -0
  334. package/scaffold/copilot/agents/Architect-Reviewer-Alpha.agent.md +14 -0
  335. package/scaffold/copilot/agents/Architect-Reviewer-Beta.agent.md +14 -0
  336. package/scaffold/copilot/agents/Code-Reviewer-Alpha.agent.md +12 -0
  337. package/scaffold/copilot/agents/Code-Reviewer-Beta.agent.md +12 -0
  338. package/scaffold/copilot/agents/Debugger.agent.md +31 -0
  339. package/scaffold/copilot/agents/Documenter.agent.md +35 -0
  340. package/scaffold/copilot/agents/Explorer.agent.md +50 -0
  341. package/scaffold/copilot/agents/Frontend.agent.md +29 -0
  342. package/scaffold/copilot/agents/Implementer.agent.md +31 -0
  343. package/scaffold/copilot/agents/Orchestrator.agent.md +96 -0
  344. package/scaffold/copilot/agents/Planner.agent.md +45 -0
  345. package/scaffold/copilot/agents/README.md +57 -0
  346. package/scaffold/copilot/agents/Refactor.agent.md +30 -0
  347. package/scaffold/copilot/agents/Researcher-Alpha.agent.md +12 -0
  348. package/scaffold/copilot/agents/Researcher-Beta.agent.md +12 -0
  349. package/scaffold/copilot/agents/Researcher-Delta.agent.md +12 -0
  350. package/scaffold/copilot/agents/Researcher-Gamma.agent.md +12 -0
  351. package/scaffold/copilot/agents/Security.agent.md +42 -0
  352. package/scaffold/copilot/agents/_shared/adr-protocol.md +91 -0
  353. package/scaffold/copilot/agents/_shared/architect-reviewer-base.md +50 -0
  354. package/scaffold/copilot/agents/_shared/code-agent-base.md +70 -0
  355. package/scaffold/copilot/agents/_shared/code-reviewer-base.md +54 -0
  356. package/scaffold/copilot/agents/_shared/decision-protocol.md +27 -0
  357. package/scaffold/copilot/agents/_shared/forge-protocol.md +46 -0
  358. package/scaffold/copilot/agents/_shared/researcher-base.md +61 -0
  359. package/scaffold/copilot/agents/templates/adr-template.md +27 -0
  360. package/scaffold/copilot/agents/templates/execution-state.md +25 -0
  361. package/scaffold/copilot/prompts/ask.prompt.md +20 -0
  362. package/scaffold/copilot/prompts/debug.prompt.md +25 -0
  363. package/scaffold/copilot/prompts/design.prompt.md +22 -0
  364. package/scaffold/copilot/prompts/implement.prompt.md +26 -0
  365. package/scaffold/copilot/prompts/plan.prompt.md +24 -0
  366. package/scaffold/copilot/prompts/review.prompt.md +31 -0
  367. package/scaffold/definitions/agents.mjs +165 -0
  368. package/scaffold/definitions/bodies.mjs +292 -0
  369. package/scaffold/definitions/hooks.mjs +43 -0
  370. package/scaffold/definitions/models.mjs +56 -0
  371. package/scaffold/definitions/plugins.mjs +24 -0
  372. package/scaffold/definitions/prompts.mjs +145 -0
  373. package/scaffold/definitions/protocols.mjs +322 -0
  374. package/scaffold/definitions/tools.mjs +176 -0
  375. package/scaffold/generate.mjs +74 -0
  376. package/skills/brainstorming/SKILL.md +259 -0
  377. package/skills/brainstorming/scripts/frame-template.html +365 -0
  378. package/skills/brainstorming/scripts/helper.js +216 -0
  379. package/skills/brainstorming/scripts/server.cjs +9 -0
  380. package/skills/brainstorming/scripts/server.src.cjs +249 -0
  381. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  382. package/skills/brainstorming/visual-companion.md +430 -0
  383. package/skills/knowledge-base/SKILL.md +22 -9
@@ -1,15 +1,16 @@
1
- /**
2
- * MCP tool registrations for utility tools (web-search, http, regex, encode, etc.)
3
- */
4
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- export declare function registerWebSearchTool(server: McpServer): void;
6
- export declare function registerHttpTool(server: McpServer): void;
7
- export declare function registerRegexTestTool(server: McpServer): void;
8
- export declare function registerEncodeTool(server: McpServer): void;
9
- export declare function registerMeasureTool(server: McpServer): void;
10
- export declare function registerChangelogTool(server: McpServer): void;
11
- export declare function registerSchemaValidateTool(server: McpServer): void;
12
- export declare function registerSnippetTool(server: McpServer): void;
13
- export declare function registerEnvTool(server: McpServer): void;
14
- export declare function registerTimeTool(server: McpServer): void;
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/utility.tools.d.ts
4
+ declare function registerWebSearchTool(server: McpServer): void;
5
+ declare function registerHttpTool(server: McpServer): void;
6
+ declare function registerRegexTestTool(server: McpServer): void;
7
+ declare function registerEncodeTool(server: McpServer): void;
8
+ declare function registerMeasureTool(server: McpServer): void;
9
+ declare function registerChangelogTool(server: McpServer): void;
10
+ declare function registerSchemaValidateTool(server: McpServer): void;
11
+ declare function registerSnippetTool(server: McpServer): void;
12
+ declare function registerEnvTool(server: McpServer): void;
13
+ declare function registerTimeTool(server: McpServer): void;
14
+ //#endregion
15
+ export { registerChangelogTool, registerEncodeTool, registerEnvTool, registerHttpTool, registerMeasureTool, registerRegexTestTool, registerSchemaValidateTool, registerSnippetTool, registerTimeTool, registerWebSearchTool };
15
16
  //# sourceMappingURL=utility.tools.d.ts.map
@@ -1,24 +1,12 @@
1
- import{changelog as g,encode as f,envInfo as h,httpRequest as y,measure as x,regexTest as $,schemaValidate as b,snippet as S,timeUtils as v,webSearch as T}from"../../../tools/dist/index.js";import{z as e}from"zod";function _(c){c.registerTool("web_search",{description:"PREFERRED web search \u2014 search the web via DuckDuckGo (no API key). Returns structured results with title, URL, and snippet.",inputSchema:{query:e.string().describe("Search query"),limit:e.number().min(1).max(20).default(5).describe("Max results to return"),site:e.string().optional().describe('Restrict to domain (e.g., "docs.aws.amazon.com")')}},async({query:a,limit:i,site:r})=>{try{const s=await T({query:a,limit:i,site:r}),t=[`## Search: ${s.query}`,""];if(s.results.length===0)t.push("No results found.");else for(const n of s.results)t.push(`### [${n.title}](${n.url})`,n.snippet,"");return t.push("---","_Next: Use `web_fetch` to read any of these pages in full._"),{content:[{type:"text",text:t.join(`
2
- `)}]}}catch(s){return{content:[{type:"text",text:`Web search failed: ${s.message}`}],isError:!0}}})}function M(c){c.registerTool("http",{description:"Make HTTP requests (GET/POST/PUT/PATCH/DELETE/HEAD) for API testing. Returns status, headers, and formatted body with timing info.",inputSchema:{url:e.string().url().describe("Request URL (http/https only)"),method:e.enum(["GET","POST","PUT","PATCH","DELETE","HEAD"]).default("GET").describe("HTTP method"),headers:e.record(e.string(),e.string()).optional().describe("Request headers as key-value pairs"),body:e.string().optional().describe("Request body (for POST/PUT/PATCH)"),timeout:e.number().min(1e3).max(6e4).default(15e3).describe("Timeout in milliseconds")}},async({url:a,method:i,headers:r,body:s,timeout:t})=>{try{const n=await y({url:a,method:i,headers:r,body:s,timeout:t}),o=[`## ${i} ${a}`,"",`**Status:** ${n.status} ${n.statusText}`,`**Time:** ${n.durationMs}ms`,`**Size:** ${n.sizeBytes} bytes`,`**Content-Type:** ${n.contentType}`,"","### Headers","```json",JSON.stringify(n.headers,null,2),"```","","### Body",n.contentType.includes("json")?"```json":"```",n.body,"```"];return n.truncated&&o.push("",`_Response truncated \u2014 total size: ${n.sizeBytes} bytes_`),{content:[{type:"text",text:o.join(`
3
- `)}]}}catch(n){return{content:[{type:"text",text:`HTTP request failed: ${n.message}`}],isError:!0}}})}function R(c){c.registerTool("regex_test",{description:"Test a regex pattern against sample strings. Supports match, replace, and split modes.",inputSchema:{pattern:e.string().describe("Regex pattern (without delimiters)"),flags:e.string().default("").describe("Regex flags (g, i, m, s, etc.)"),test_strings:e.array(e.string()).describe("Strings to test the pattern against"),mode:e.enum(["match","replace","split"]).default("match").describe("Test mode"),replacement:e.string().optional().describe("Replacement string (for replace mode)")}},async({pattern:a,flags:i,test_strings:r,mode:s,replacement:t})=>{const n=$({pattern:a,flags:i,testStrings:r,mode:s,replacement:t});if(!n.valid)return{content:[{type:"text",text:`Invalid regex: ${n.error}`}],isError:!0};const o=[`## Regex: \`/${n.pattern}/${n.flags}\``,"",`Mode: ${s}`,""];for(const d of n.results){if(o.push(`**Input:** \`${d.input}\``),o.push(`**Matched:** ${d.matched}`),d.matches)for(const p of d.matches){const l=p.groups.length>0?` groups: [${p.groups.join(", ")}]`:"";o.push(` - "${p.full}" at index ${p.index}${l}`)}d.replaced!==void 0&&o.push(`**Result:** \`${d.replaced}\``),d.split&&o.push(`**Split:** ${JSON.stringify(d.split)}`),o.push("")}return{content:[{type:"text",text:o.join(`
4
- `)}]}})}function j(c){c.registerTool("encode",{description:"Encode, decode, or hash text. Supports base64, URL encoding, SHA-256, MD5, JWT decode, hex.",inputSchema:{operation:e.enum(["base64_encode","base64_decode","url_encode","url_decode","sha256","md5","jwt_decode","hex_encode","hex_decode"]).describe("Operation to perform"),input:e.string().describe("Input text")}},async({operation:a,input:i})=>{try{const r=f({operation:a,input:i});return{content:[{type:"text",text:`## ${a}
1
+ import{createLogger as e,serializeError as t}from"../../../core/dist/index.js";import{changelog as n,encode as r,envInfo as i,httpRequest as a,measure as o,regexTest as s,schemaValidate as c,snippet as l,timeUtils as u,webSearch as d}from"../../../tools/dist/index.js";import{z as f}from"zod";const p=e(`tools`);function m(e){e.registerTool(`web_search`,{description:`PREFERRED web search search the web via DuckDuckGo (no API key). Returns structured results with title, URL, and snippet.`,inputSchema:{query:f.string().max(2e3).describe(`Search query`),limit:f.number().min(1).max(20).default(5).describe(`Max results to return`),site:f.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`)}},async({query:e,limit:n,site:r})=>{try{let t=await d({query:e,limit:n,site:r}),i=[`## Search: ${t.query}`,``];if(t.results.length===0)i.push(`No results found.`);else for(let e of t.results)i.push(`### [${e.title}](${e.url})`,e.snippet,``);return i.push(`---`,"_Next: Use `web_fetch` to read any of these pages in full._"),{content:[{type:`text`,text:i.join(`
2
+ `)}]}}catch(e){return p.error(`Web search failed`,t(e)),{content:[{type:`text`,text:`Web search failed. Check server logs for details.`}],isError:!0}}})}function h(e){e.registerTool(`http`,{description:`Make HTTP requests (GET/POST/PUT/PATCH/DELETE/HEAD) for API testing. Returns status, headers, and formatted body with timing info.`,inputSchema:{url:f.string().url().describe(`Request URL (http/https only)`),method:f.enum([`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`]).default(`GET`).describe(`HTTP method`),headers:f.record(f.string(),f.string()).optional().describe(`Request headers as key-value pairs`),body:f.string().optional().describe(`Request body (for POST/PUT/PATCH)`),timeout:f.number().min(1e3).max(6e4).default(15e3).describe(`Timeout in milliseconds`)}},async({url:e,method:n,headers:r,body:i,timeout:o})=>{try{let t=await a({url:e,method:n,headers:r,body:i,timeout:o}),s=[`## ${n} ${e}`,``,`**Status:** ${t.status} ${t.statusText}`,`**Time:** ${t.durationMs}ms`,`**Size:** ${t.sizeBytes} bytes`,`**Content-Type:** ${t.contentType}`,``,`### Headers`,"```json",JSON.stringify(t.headers,null,2),"```",``,`### Body`,t.contentType.includes(`json`)?"```json":"```",t.body,"```"];return t.truncated&&s.push(``,`_Response truncated total size: ${t.sizeBytes} bytes_`),{content:[{type:`text`,text:s.join(`
3
+ `)}]}}catch(e){return p.error(`HTTP request failed`,t(e)),{content:[{type:`text`,text:`HTTP request failed. Check server logs for details.`}],isError:!0}}})}function g(e){e.registerTool(`regex_test`,{description:`Test a regex pattern against sample strings. Supports match, replace, and split modes.`,inputSchema:{pattern:f.string().max(500).describe(`Regex pattern (without delimiters)`),flags:f.string().max(10).regex(/^[gimsuy]*$/).default(``).describe(`Regex flags (g, i, m, s, etc.)`),test_strings:f.array(f.string().max(1e4)).max(50).describe(`Strings to test the pattern against`),mode:f.enum([`match`,`replace`,`split`]).default(`match`).describe(`Test mode`),replacement:f.string().optional().describe(`Replacement string (for replace mode)`)}},async({pattern:e,flags:t,test_strings:n,mode:r,replacement:i})=>{let a=s({pattern:e,flags:t,testStrings:n,mode:r,replacement:i});if(!a.valid)return{content:[{type:`text`,text:`Invalid regex: ${a.error}`}],isError:!0};let o=[`## Regex: \`/${a.pattern}/${a.flags}\``,``,`Mode: ${r}`,``];for(let e of a.results){if(o.push(`**Input:** \`${e.input}\``),o.push(`**Matched:** ${e.matched}`),e.matches)for(let t of e.matches){let e=t.groups.length>0?` groups: [${t.groups.join(`, `)}]`:``;o.push(` - "${t.full}" at index ${t.index}${e}`)}e.replaced!==void 0&&o.push(`**Result:** \`${e.replaced}\``),e.split&&o.push(`**Split:** ${JSON.stringify(e.split)}`),o.push(``)}return{content:[{type:`text`,text:o.join(`
4
+ `)}]}})}function _(e){e.registerTool(`encode`,{description:`Encode, decode, or hash text. Supports base64, URL encoding, SHA-256, MD5, JWT decode, hex.`,inputSchema:{operation:f.enum([`base64_encode`,`base64_decode`,`url_encode`,`url_decode`,`sha256`,`md5`,`jwt_decode`,`hex_encode`,`hex_decode`]).describe(`Operation to perform`),input:f.string().max(1e6).describe(`Input text`)}},async({operation:e,input:n})=>{try{let t=r({operation:e,input:n});return{content:[{type:`text`,text:`## ${e}\n\n**Input:** \`${n.length>100?`${n.slice(0,100)}...`:n}\`\n**Output:**\n\`\`\`\n${t.output}\n\`\`\``}]}}catch(e){return p.error(`Encode failed`,t(e)),{content:[{type:`text`,text:`Encode failed. Check server logs for details.`}],isError:!0}}})}function v(e){e.registerTool(`measure`,{description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,inputSchema:{path:f.string().describe(`File or directory path to measure`),extensions:f.array(f.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`)}},async({path:e,extensions:n})=>{try{let t=o({path:e,extensions:n}),r=[`## Code Metrics`,``,`**Files:** ${t.summary.totalFiles}`,`**Total lines:** ${t.summary.totalLines} (${t.summary.totalCodeLines} code)`,`**Functions:** ${t.summary.totalFunctions}`,`**Avg complexity:** ${t.summary.avgComplexity}`,`**Max complexity:** ${t.summary.maxComplexity.value} (${t.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Functions | Imports |`,`|------|-------|------|------------|-----------|---------|`];for(let e of t.files.slice(0,20))r.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${e.functions} | ${e.imports} |`);return t.files.length>20&&r.push(``,`_...and ${t.files.length-20} more files_`),{content:[{type:`text`,text:r.join(`
5
+ `)}]}}catch(e){return p.error(`Measure failed`,t(e)),{content:[{type:`text`,text:`Measure failed. Check server logs for details.`}],isError:!0}}})}function y(e){e.registerTool(`changelog`,{description:`Generate a changelog from git history between two refs. Groups by conventional commit type.`,inputSchema:{from:f.string().max(200).describe(`Start ref (tag, SHA, HEAD~N)`),to:f.string().max(200).default(`HEAD`).describe(`End ref (default: HEAD)`),format:f.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).describe(`Output format`),include_breaking:f.boolean().default(!0).describe(`Highlight breaking changes`)}},async({from:e,to:r,format:i,include_breaking:a})=>{try{let t=n({from:e,to:r,format:i,includeBreaking:a}),o=`${t.stats.total} commits (${Object.entries(t.stats.types).map(([e,t])=>`${t} ${e}`).join(`, `)})`;return{content:[{type:`text`,text:`${t.markdown}\n---\n_${o}_`}]}}catch(e){return p.error(`Changelog failed`,t(e)),{content:[{type:`text`,text:`Changelog failed. Check server logs for details.`}],isError:!0}}})}function b(e){e.registerTool(`schema_validate`,{description:`Validate JSON data against a JSON Schema. Supports type, required, properties, items, enum, pattern, min/max.`,inputSchema:{data:f.string().max(5e5).describe(`JSON data to validate (as string)`),schema:f.string().max(5e5).describe(`JSON Schema to validate against (as string)`)}},async({data:e,schema:n})=>{try{let t=c({data:JSON.parse(e),schema:JSON.parse(n)});if(t.valid)return{content:[{type:`text`,text:`## Validation: PASSED
5
6
 
6
- **Input:** \`${i.length>100?`${i.slice(0,100)}...`:i}\`
7
- **Output:**
8
- \`\`\`
9
- ${r.output}
10
- \`\`\``}]}}catch(r){return{content:[{type:"text",text:`Encode failed: ${r.message}`}],isError:!0}}})}function O(c){c.registerTool("measure",{description:"Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.",inputSchema:{path:e.string().describe("File or directory path to measure"),extensions:e.array(e.string()).optional().describe("File extensions to include (default: .ts,.tsx,.js,.jsx)")}},async({path:a,extensions:i})=>{try{const r=x({path:a,extensions:i}),s=["## Code Metrics","",`**Files:** ${r.summary.totalFiles}`,`**Total lines:** ${r.summary.totalLines} (${r.summary.totalCodeLines} code)`,`**Functions:** ${r.summary.totalFunctions}`,`**Avg complexity:** ${r.summary.avgComplexity}`,`**Max complexity:** ${r.summary.maxComplexity.value} (${r.summary.maxComplexity.file})`,"","### Top files by complexity","","| File | Lines | Code | Complexity | Functions | Imports |","|------|-------|------|------------|-----------|---------|"];for(const t of r.files.slice(0,20))s.push(`| ${t.path} | ${t.lines.total} | ${t.lines.code} | ${t.complexity} | ${t.functions} | ${t.imports} |`);return r.files.length>20&&s.push("",`_...and ${r.files.length-20} more files_`),{content:[{type:"text",text:s.join(`
11
- `)}]}}catch(r){return{content:[{type:"text",text:`Measure failed: ${r.message}`}],isError:!0}}})}function P(c){c.registerTool("changelog",{description:"Generate a changelog from git history between two refs. Groups by conventional commit type.",inputSchema:{from:e.string().describe("Start ref (tag, SHA, HEAD~N)"),to:e.string().default("HEAD").describe("End ref (default: HEAD)"),format:e.enum(["grouped","chronological","per-scope"]).default("grouped").describe("Output format"),include_breaking:e.boolean().default(!0).describe("Highlight breaking changes")}},async({from:a,to:i,format:r,include_breaking:s})=>{try{const t=g({from:a,to:i,format:r,includeBreaking:s}),n=`${t.stats.total} commits (${Object.entries(t.stats.types).map(([o,d])=>`${d} ${o}`).join(", ")})`;return{content:[{type:"text",text:`${t.markdown}
12
- ---
13
- _${n}_`}]}}catch(t){return{content:[{type:"text",text:`Changelog failed: ${t.message}`}],isError:!0}}})}function D(c){c.registerTool("schema_validate",{description:"Validate JSON data against a JSON Schema. Supports type, required, properties, items, enum, pattern, min/max.",inputSchema:{data:e.string().describe("JSON data to validate (as string)"),schema:e.string().describe("JSON Schema to validate against (as string)")}},async({data:a,schema:i})=>{try{const r=JSON.parse(a),s=JSON.parse(i),t=b({data:r,schema:s});if(t.valid)return{content:[{type:"text",text:`## Validation: PASSED
14
-
15
- Data matches the schema.`}]};const n=["## Validation: FAILED","",`**${t.errors.length} error(s):**`,""];for(const o of t.errors){const d=o.expected?` (expected: ${o.expected}, got: ${o.received})`:"";n.push(`- \`${o.path}\`: ${o.message}${d}`)}return{content:[{type:"text",text:n.join(`
16
- `)}]}}catch(r){return{content:[{type:"text",text:`Schema validation failed: ${r.message}`}],isError:!0}}})}function k(c){c.registerTool("snippet",{description:"Save, retrieve, search, and manage persistent code snippets/templates.",inputSchema:{action:e.enum(["save","get","list","search","delete"]).describe("Operation to perform"),name:e.string().optional().describe("Snippet name (required for save/get/delete)"),language:e.string().optional().describe("Language tag (for save)"),code:e.string().optional().describe("Code content (for save)"),tags:e.array(e.string()).optional().describe("Tags for categorization (for save)"),query:e.string().optional().describe("Search query (for search)")}},async({action:a,name:i,language:r,code:s,tags:t,query:n})=>{try{const o=S({action:a,name:i,language:r,code:s,tags:t,query:n});if("deleted"in o)return{content:[{type:"text",text:o.deleted?`Snippet "${i}" deleted.`:`Snippet "${i}" not found.`}]};if("snippets"in o){if(o.snippets.length===0)return{content:[{type:"text",text:"No snippets found."}]};const l=["## Snippets",""];for(const u of o.snippets){const m=u.tags.length>0?` [${u.tags.join(", ")}]`:"";l.push(`- **${u.name}** (${u.language})${m}`)}return{content:[{type:"text",text:l.join(`
17
- `)}]}}const d=o,p=d.tags.length>0?`
18
- Tags: ${d.tags.join(", ")}`:"";return{content:[{type:"text",text:`## ${d.name} (${d.language})${p}
19
-
20
- \`\`\`${d.language}
21
- ${d.code}
22
- \`\`\``}]}}catch(o){return{content:[{type:"text",text:`Snippet failed: ${o.message}`}],isError:!0}}})}function A(c){c.registerTool("env",{description:"Get system and runtime environment info. Sensitive env vars are redacted by default.",inputSchema:{include_env:e.boolean().default(!1).describe("Include environment variables"),filter_env:e.string().optional().describe("Filter env vars by name substring"),show_sensitive:e.boolean().default(!1).describe("Show sensitive values (keys, tokens, etc.) \u2014 redacted by default")}},async({include_env:a,filter_env:i,show_sensitive:r})=>{const s=h({includeEnv:a,filterEnv:i,showSensitive:r}),t=["## Environment","",`**Platform:** ${s.system.platform} ${s.system.arch}`,`**OS:** ${s.system.type} ${s.system.release}`,`**Host:** ${s.system.hostname}`,`**CPUs:** ${s.system.cpus}`,`**Memory:** ${s.system.memoryFreeGb}GB free / ${s.system.memoryTotalGb}GB total`,"",`**Node:** ${s.runtime.node}`,`**V8:** ${s.runtime.v8}`,`**CWD:** ${s.cwd}`];if(s.env){t.push("","### Environment Variables","");for(const[n,o]of Object.entries(s.env))t.push(`- \`${n}\`: ${o}`)}return{content:[{type:"text",text:t.join(`
23
- `)}]}})}function H(c){c.registerTool("time",{description:"Parse dates, convert timezones, calculate durations, add time. Supports ISO 8601, unix timestamps, and human-readable formats.",inputSchema:{operation:e.enum(["now","parse","convert","diff","add"]).describe("now: current time | parse: parse a date string | convert: timezone conversion | diff: duration between two dates | add: add duration to date"),input:e.string().optional().describe("Date input (ISO, unix timestamp, or parseable string). For diff: two comma-separated dates"),timezone:e.string().optional().describe('Target timezone (e.g., "America/New_York", "Asia/Tokyo")'),duration:e.string().optional().describe('Duration to add (e.g., "2h30m", "1d", "30s") \u2014 for add operation')}},async({operation:a,input:i,timezone:r,duration:s})=>{try{const t=v({operation:a,input:i,timezone:r,duration:s}),n=[`**${t.output}**`,"",`ISO: ${t.iso}`,`Unix: ${t.unix}`];return t.details&&n.push("","```json",JSON.stringify(t.details,null,2),"```"),{content:[{type:"text",text:n.join(`
24
- `)}]}}catch(t){return{content:[{type:"text",text:`Time failed: ${t.message}`}],isError:!0}}})}export{P as registerChangelogTool,j as registerEncodeTool,A as registerEnvTool,M as registerHttpTool,O as registerMeasureTool,R as registerRegexTestTool,D as registerSchemaValidateTool,k as registerSnippetTool,H as registerTimeTool,_ as registerWebSearchTool};
7
+ Data matches the schema.`}]};let r=[`## Validation: FAILED`,``,`**${t.errors.length} error(s):**`,``];for(let e of t.errors){let t=e.expected?` (expected: ${e.expected}, got: ${e.received})`:``;r.push(`- \`${e.path}\`: ${e.message}${t}`)}return{content:[{type:`text`,text:r.join(`
8
+ `)}]}}catch(e){return p.error(`Schema validation failed`,t(e)),{content:[{type:`text`,text:`Schema validation failed. Check server logs for details.`}],isError:!0}}})}function x(e){e.registerTool(`snippet`,{description:`Save, retrieve, search, and manage persistent code snippets/templates.`,inputSchema:{action:f.enum([`save`,`get`,`list`,`search`,`delete`]).describe(`Operation to perform`),name:f.string().optional().describe(`Snippet name (required for save/get/delete)`),language:f.string().optional().describe(`Language tag (for save)`),code:f.string().max(1e5).optional().describe(`Code content (for save)`),tags:f.array(f.string()).optional().describe(`Tags for categorization (for save)`),query:f.string().optional().describe(`Search query (for search)`)}},async({action:e,name:n,language:r,code:i,tags:a,query:o})=>{try{let t=l({action:e,name:n,language:r,code:i,tags:a,query:o});if(`deleted`in t)return{content:[{type:`text`,text:t.deleted?`Snippet "${n}" deleted.`:`Snippet "${n}" not found.`}]};if(`snippets`in t){if(t.snippets.length===0)return{content:[{type:`text`,text:`No snippets found.`}]};let e=[`## Snippets`,``];for(let n of t.snippets){let t=n.tags.length>0?` [${n.tags.join(`, `)}]`:``;e.push(`- **${n.name}** (${n.language})${t}`)}return{content:[{type:`text`,text:e.join(`
9
+ `)}]}}let s=t,c=s.tags.length>0?`\nTags: ${s.tags.join(`, `)}`:``;return{content:[{type:`text`,text:`## ${s.name} (${s.language})${c}\n\n\`\`\`${s.language}\n${s.code}\n\`\`\``}]}}catch(e){return p.error(`Snippet failed`,t(e)),{content:[{type:`text`,text:`Snippet failed. Check server logs for details.`}],isError:!0}}})}function S(e){e.registerTool(`env`,{description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,inputSchema:{include_env:f.boolean().default(!1).describe(`Include environment variables`),filter_env:f.string().optional().describe(`Filter env vars by name substring`),show_sensitive:f.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)}},async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=i({includeEnv:e,filterEnv:t,showSensitive:n}),a=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){a.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))a.push(`- \`${e}\`: ${t}`)}return{content:[{type:`text`,text:a.join(`
10
+ `)}]}})}function C(e){e.registerTool(`time`,{description:`Parse dates, convert timezones, calculate durations, add time. Supports ISO 8601, unix timestamps, and human-readable formats.`,inputSchema:{operation:f.enum([`now`,`parse`,`convert`,`diff`,`add`]).describe(`now: current time | parse: parse a date string | convert: timezone conversion | diff: duration between two dates | add: add duration to date`),input:f.string().optional().describe(`Date input (ISO, unix timestamp, or parseable string). For diff: two comma-separated dates`),timezone:f.string().optional().describe(`Target timezone (e.g., "America/New_York", "Asia/Tokyo")`),duration:f.string().optional().describe(`Duration to add (e.g., "2h30m", "1d", "30s") — for add operation`)}},async({operation:e,input:n,timezone:r,duration:i})=>{try{let t=u({operation:e,input:n,timezone:r,duration:i}),a=[`**${t.output}**`,``,`ISO: ${t.iso}`,`Unix: ${t.unix}`];return t.details&&a.push(``,"```json",JSON.stringify(t.details,null,2),"```"),{content:[{type:`text`,text:a.join(`
11
+ `)}]}}catch(e){return p.error(`Time failed`,t(e)),{content:[{type:`text`,text:`Time failed. Check server logs for details.`}],isError:!0}}})}export{y as registerChangelogTool,_ as registerEncodeTool,S as registerEnvTool,h as registerHttpTool,v as registerMeasureTool,g as registerRegexTestTool,b as registerSchemaValidateTool,x as registerSnippetTool,C as registerTimeTool,m as registerWebSearchTool};
12
+ //# sourceMappingURL=utility.tools.js.map
@@ -1,10 +1,14 @@
1
+ //#region packages/server/src/version-check.d.ts
1
2
  /**
2
3
  * Non-blocking check for newer @vpxa/kb versions on npm.
3
4
  * Logs a warning to stderr if the running version is outdated.
4
5
  */
6
+ declare function getCurrentVersion(): string;
5
7
  /**
6
8
  * Check for a newer version on npm and log a warning if outdated.
7
9
  * This is fire-and-forget — it never throws and never blocks startup.
8
10
  */
9
- export declare function checkForUpdates(): void;
11
+ declare function checkForUpdates(): void;
12
+ //#endregion
13
+ export { checkForUpdates, getCurrentVersion };
10
14
  //# sourceMappingURL=version-check.d.ts.map
@@ -1 +1,2 @@
1
- import{readFileSync as s}from"node:fs";import{dirname as c,resolve as p}from"node:path";import{fileURLToPath as a}from"node:url";const u="@vpxa/kb",m=`https://registry.npmjs.org/${u}/latest`;function f(){const n=c(a(import.meta.url)),r=p(n,"..","..","..","package.json");try{return JSON.parse(s(r,"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}function l(n,r){const t=n.split(".").map(Number),i=r.split(".").map(Number);for(let e=0;e<3;e++){const o=(t[e]??0)-(i[e]??0);if(o!==0)return o>0?1:-1}return 0}function h(){const n=f();fetch(m,{signal:AbortSignal.timeout(5e3)}).then(r=>{if(r.ok)return r.json()}).then(r=>{if(!r||typeof r!="object")return;const t=r.version;t&&l(n,t)<0&&console.error(`[KB] \u26A0 Update available: ${n} \u2192 ${t}. Run \`npx @vpxa/kb@${t} serve\` or update your mcp.json.`)}).catch(()=>{})}export{h as checkForUpdates};
1
+ import{readFileSync as e}from"node:fs";import{dirname as t,resolve as n}from"node:path";import{fileURLToPath as r}from"node:url";import{createLogger as i}from"../../core/dist/index.js";const a=i(`server`);function o(){let i=n(t(r(import.meta.url)),`..`,`..`,`..`,`package.json`);try{return JSON.parse(e(i,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}function s(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<3;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t>0?1:-1}return 0}function c(){let e=o();fetch(`https://registry.npmjs.org/@vpxa/kb/latest`,{signal:AbortSignal.timeout(5e3)}).then(e=>{if(e.ok)return e.json()}).then(t=>{if(!t||typeof t!=`object`)return;let n=t.version;n&&s(e,n)<0&&a.warn(`Update available`,{currentVersion:e,latestVersion:n,updateCommand:`npx @vpxa/kb@${n} serve`,configHint:`update your mcp.json`})}).catch(()=>{})}export{c as checkForUpdates,o as getCurrentVersion};
2
+ //# sourceMappingURL=version-check.js.map
@@ -1,104 +1,107 @@
1
+ //#region packages/store/src/graph-store.interface.d.ts
1
2
  /**
2
3
  * Knowledge graph store abstraction — typed nodes + edges for entity-relationship storage.
3
4
  * Complements the vector store: vector search finds similar content,
4
5
  * graph traversal finds connected concepts.
5
6
  */
6
7
  /** A node in the knowledge graph (entity, concept, service, etc.) */
7
- export interface GraphNode {
8
- /** Unique identifier */
9
- id: string;
10
- /** Node type (e.g., 'entity', 'service', 'api', 'concept', 'decision') */
11
- type: string;
12
- /** Display name */
13
- name: string;
14
- /** Arbitrary properties */
15
- properties: Record<string, unknown>;
16
- /** Back-link to KnowledgeRecord.id that produced this node */
17
- sourceRecordId?: string;
18
- /** Source file path (for cleanup on re-index) */
19
- sourcePath?: string;
20
- /** ISO timestamp */
21
- createdAt?: string;
8
+ interface GraphNode {
9
+ /** Unique identifier */
10
+ id: string;
11
+ /** Node type (e.g., 'entity', 'service', 'api', 'concept', 'decision') */
12
+ type: string;
13
+ /** Display name */
14
+ name: string;
15
+ /** Arbitrary properties */
16
+ properties: Record<string, unknown>;
17
+ /** Back-link to KnowledgeRecord.id that produced this node */
18
+ sourceRecordId?: string;
19
+ /** Source file path (for cleanup on re-index) */
20
+ sourcePath?: string;
21
+ /** ISO timestamp */
22
+ createdAt?: string;
22
23
  }
23
24
  /** An edge connecting two nodes */
24
- export interface GraphEdge {
25
- /** Unique identifier */
26
- id: string;
27
- /** Source node ID */
28
- fromId: string;
29
- /** Target node ID */
30
- toId: string;
31
- /** Relationship type (e.g., 'depends-on', 'implements', 'calls', 'affects') */
32
- type: string;
33
- /** Optional weight (0-1) */
34
- weight?: number;
35
- /** Arbitrary properties */
36
- properties?: Record<string, unknown>;
25
+ interface GraphEdge {
26
+ /** Unique identifier */
27
+ id: string;
28
+ /** Source node ID */
29
+ fromId: string;
30
+ /** Target node ID */
31
+ toId: string;
32
+ /** Relationship type (e.g., 'depends-on', 'implements', 'calls', 'affects') */
33
+ type: string;
34
+ /** Optional weight (0-1) */
35
+ weight?: number;
36
+ /** Arbitrary properties */
37
+ properties?: Record<string, unknown>;
37
38
  }
38
39
  /** Options for graph traversal */
39
- export interface GraphTraversalOptions {
40
- /** Relationship type filter */
41
- edgeType?: string;
42
- /** Max traversal depth (default: 2) */
43
- maxDepth?: number;
44
- /** Direction: outgoing from start, incoming to start, or both */
45
- direction?: 'outgoing' | 'incoming' | 'both';
46
- /** Max total nodes returned (default: 50) */
47
- limit?: number;
40
+ interface GraphTraversalOptions {
41
+ /** Relationship type filter */
42
+ edgeType?: string;
43
+ /** Max traversal depth (default: 2) */
44
+ maxDepth?: number;
45
+ /** Direction: outgoing from start, incoming to start, or both */
46
+ direction?: 'outgoing' | 'incoming' | 'both';
47
+ /** Max total nodes returned (default: 50) */
48
+ limit?: number;
48
49
  }
49
50
  /** Result of a graph traversal */
50
- export interface GraphTraversalResult {
51
- nodes: GraphNode[];
52
- edges: GraphEdge[];
51
+ interface GraphTraversalResult {
52
+ nodes: GraphNode[];
53
+ edges: GraphEdge[];
53
54
  }
54
55
  /** Graph statistics */
55
- export interface GraphStats {
56
- nodeCount: number;
57
- edgeCount: number;
58
- nodeTypes: Record<string, number>;
59
- edgeTypes: Record<string, number>;
56
+ interface GraphStats {
57
+ nodeCount: number;
58
+ edgeCount: number;
59
+ nodeTypes: Record<string, number>;
60
+ edgeTypes: Record<string, number>;
60
61
  }
61
62
  /** Knowledge graph store interface */
62
- export interface IGraphStore {
63
- /** Initialize the store (create tables, indices) */
64
- initialize(): Promise<void>;
65
- /** Add or update a single node */
66
- upsertNode(node: GraphNode): Promise<void>;
67
- /** Add or update a single edge */
68
- upsertEdge(edge: GraphEdge): Promise<void>;
69
- /** Batch add/update nodes */
70
- upsertNodes(nodes: GraphNode[]): Promise<void>;
71
- /** Batch add/update edges */
72
- upsertEdges(edges: GraphEdge[]): Promise<void>;
73
- /** Get a node by ID */
74
- getNode(id: string): Promise<GraphNode | null>;
75
- /** Get direct neighbors of a node */
76
- getNeighbors(nodeId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
77
- /** Multi-hop traversal from a starting node */
78
- traverse(startId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
79
- /** Find nodes by type and/or name pattern */
80
- findNodes(filter: {
81
- type?: string;
82
- namePattern?: string;
83
- sourcePath?: string;
84
- limit?: number;
85
- }): Promise<GraphNode[]>;
86
- /** Find edges by type between optional node filters */
87
- findEdges(filter: {
88
- type?: string;
89
- fromId?: string;
90
- toId?: string;
91
- limit?: number;
92
- }): Promise<GraphEdge[]>;
93
- /** Delete a node and all its edges */
94
- deleteNode(id: string): Promise<void>;
95
- /** Delete all nodes/edges originating from a source path */
96
- deleteBySourcePath(sourcePath: string): Promise<number>;
97
- /** Delete all nodes and edges (full reset) */
98
- clear(): Promise<void>;
99
- /** Get graph statistics */
100
- getStats(): Promise<GraphStats>;
101
- /** Close the store */
102
- close(): Promise<void>;
63
+ interface IGraphStore {
64
+ /** Initialize the store (create tables, indices) */
65
+ initialize(): Promise<void>;
66
+ /** Add or update a single node */
67
+ upsertNode(node: GraphNode): Promise<void>;
68
+ /** Add or update a single edge */
69
+ upsertEdge(edge: GraphEdge): Promise<void>;
70
+ /** Batch add/update nodes */
71
+ upsertNodes(nodes: GraphNode[]): Promise<void>;
72
+ /** Batch add/update edges */
73
+ upsertEdges(edges: GraphEdge[]): Promise<void>;
74
+ /** Get a node by ID */
75
+ getNode(id: string): Promise<GraphNode | null>;
76
+ /** Get direct neighbors of a node */
77
+ getNeighbors(nodeId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
78
+ /** Multi-hop traversal from a starting node */
79
+ traverse(startId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
80
+ /** Find nodes by type and/or name pattern */
81
+ findNodes(filter: {
82
+ type?: string;
83
+ namePattern?: string;
84
+ sourcePath?: string;
85
+ limit?: number;
86
+ }): Promise<GraphNode[]>;
87
+ /** Find edges by type between optional node filters */
88
+ findEdges(filter: {
89
+ type?: string;
90
+ fromId?: string;
91
+ toId?: string;
92
+ limit?: number;
93
+ }): Promise<GraphEdge[]>;
94
+ /** Delete a node and all its edges */
95
+ deleteNode(id: string): Promise<void>;
96
+ /** Delete all nodes/edges originating from a source path */
97
+ deleteBySourcePath(sourcePath: string): Promise<number>;
98
+ /** Delete all nodes and edges (full reset) */
99
+ clear(): Promise<void>;
100
+ /** Get graph statistics */
101
+ getStats(): Promise<GraphStats>;
102
+ /** Close the store */
103
+ close(): Promise<void>;
103
104
  }
105
+ //#endregion
106
+ export { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, IGraphStore };
104
107
  //# sourceMappingURL=graph-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ export{};
@@ -1,6 +1,6 @@
1
- export type { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, IGraphStore, } from './graph-store.interface.js';
2
- export { LanceStore } from './lance-store.js';
3
- export { SqliteGraphStore } from './sqlite-graph-store.js';
4
- export type { IKnowledgeStore, SearchOptions } from './store.interface.js';
5
- export { createStore, type StoreBackend, type StoreConfig } from './store-factory.js';
6
- //# sourceMappingURL=index.d.ts.map
1
+ import { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, IGraphStore } from "./graph-store.interface.js";
2
+ import { IKnowledgeStore, SearchOptions } from "./store.interface.js";
3
+ import { LanceStore } from "./lance-store.js";
4
+ import { SqliteGraphStore } from "./sqlite-graph-store.js";
5
+ import { StoreBackend, StoreConfig, createStore } from "./store-factory.js";
6
+ export { type GraphEdge, type GraphNode, type GraphStats, type GraphTraversalOptions, type GraphTraversalResult, type IGraphStore, type IKnowledgeStore, LanceStore, type SearchOptions, SqliteGraphStore, type StoreBackend, type StoreConfig, createStore };
@@ -1 +1 @@
1
- import{LanceStore as t}from"./lance-store.js";import{SqliteGraphStore as a}from"./sqlite-graph-store.js";import{createStore as s}from"./store-factory.js";export{t as LanceStore,a as SqliteGraphStore,s as createStore};
1
+ import{LanceStore as e}from"./lance-store.js";import{SqliteGraphStore as t}from"./sqlite-graph-store.js";import{createStore as n}from"./store-factory.js";export{e as LanceStore,t as SqliteGraphStore,n as createStore};
@@ -1,32 +1,39 @@
1
- /**
2
- * LanceDB implementation of the knowledge store.
3
- * Uses @lancedb/lancedb for local vector + full-text search.
4
- */
5
- import type { IndexStats, KnowledgeRecord, SearchResult } from '@kb/core';
6
- import type { IKnowledgeStore, SearchOptions } from './store.interface.js';
7
- export declare class LanceStore implements IKnowledgeStore {
8
- private db;
9
- private table;
10
- private readonly dbPath;
11
- private readonly tableName;
12
- constructor(options?: {
13
- path?: string;
14
- tableName?: string;
15
- });
16
- initialize(): Promise<void>;
17
- upsert(records: KnowledgeRecord[], vectors: Float32Array[]): Promise<void>;
18
- search(queryVector: Float32Array, options?: SearchOptions): Promise<SearchResult[]>;
19
- createFtsIndex(): Promise<void>;
20
- ftsSearch(query: string, options?: SearchOptions): Promise<SearchResult[]>;
21
- getById(id: string): Promise<KnowledgeRecord | null>;
22
- deleteBySourcePath(sourcePath: string): Promise<number>;
23
- deleteById(id: string): Promise<boolean>;
24
- getBySourcePath(sourcePath: string): Promise<KnowledgeRecord[]>;
25
- getStats(): Promise<IndexStats>;
26
- listSourcePaths(): Promise<string[]>;
27
- dropTable(): Promise<void>;
28
- close(): Promise<void>;
29
- private buildFilterString;
30
- private fromLanceRecord;
1
+ import { IKnowledgeStore, SearchOptions } from "./store.interface.js";
2
+ import { IndexStats, KnowledgeRecord, SearchResult } from "@kb/core";
3
+
4
+ //#region packages/store/src/lance-store.d.ts
5
+ declare class LanceStore implements IKnowledgeStore {
6
+ private db;
7
+ private table;
8
+ private readonly dbPath;
9
+ private readonly tableName;
10
+ private _writeQueue;
11
+ private enqueueWrite;
12
+ constructor(options?: {
13
+ path?: string;
14
+ tableName?: string;
15
+ });
16
+ initialize(): Promise<void>;
17
+ upsert(records: KnowledgeRecord[], vectors: Float32Array[]): Promise<void>;
18
+ private _upsertImpl;
19
+ search(queryVector: Float32Array, options?: SearchOptions): Promise<SearchResult[]>;
20
+ createFtsIndex(): Promise<void>;
21
+ private _createFtsIndexImpl;
22
+ ftsSearch(query: string, options?: SearchOptions): Promise<SearchResult[]>;
23
+ getById(id: string): Promise<KnowledgeRecord | null>;
24
+ deleteBySourcePath(sourcePath: string): Promise<number>;
25
+ private _deleteBySourcePathImpl;
26
+ deleteById(id: string): Promise<boolean>;
27
+ private _deleteByIdImpl;
28
+ getBySourcePath(sourcePath: string): Promise<KnowledgeRecord[]>;
29
+ getStats(): Promise<IndexStats>;
30
+ listSourcePaths(): Promise<string[]>;
31
+ dropTable(): Promise<void>;
32
+ private _dropTableImpl;
33
+ close(): Promise<void>;
34
+ private buildFilterString;
35
+ private fromLanceRecord;
31
36
  }
37
+ //#endregion
38
+ export { LanceStore };
32
39
  //# sourceMappingURL=lance-store.d.ts.map
@@ -1 +1,2 @@
1
- import{EMBEDDING_DEFAULTS as h,SEARCH_DEFAULTS as d,STORE_DEFAULTS as u,sourceTypeContentTypes as g}from"../../core/dist/index.js";import{connect as y,Index as m}from"@lancedb/lancedb";const b=/^[\w.\-/ ]+$/;function r(l,e){if(!b.test(l))throw new Error(`Invalid ${e} filter value: contains disallowed characters`);return l.replace(/'/g,"''")}class w{db=null;table=null;dbPath;tableName;constructor(e){this.dbPath=e?.path??u.path,this.tableName=e?.tableName??u.tableName}async initialize(){this.db=await y(this.dbPath),(await this.db.tableNames()).includes(this.tableName)&&(this.table=await this.db.openTable(this.tableName),await this.createFtsIndex())}async upsert(e,n){if(e.length===0)return;if(e.length!==n.length)throw new Error(`Record count (${e.length}) does not match vector count (${n.length})`);const a=e.map((t,i)=>({id:t.id,vector:Array.from(n[i]),content:t.content,sourcePath:t.sourcePath,contentType:t.contentType,headingPath:t.headingPath??"",chunkIndex:t.chunkIndex,totalChunks:t.totalChunks,startLine:t.startLine,endLine:t.endLine,fileHash:t.fileHash,indexedAt:t.indexedAt,origin:t.origin,tags:JSON.stringify(t.tags),category:t.category??"",version:t.version}));if(this.table){const t=[...new Set(e.map(i=>i.sourcePath))];for(const i of t)try{await this.table.delete(`sourcePath = '${r(i,"sourcePath")}'`)}catch{}await this.table.add(a)}else try{this.table=await this.db?.createTable(this.tableName,a)??null}catch(t){if(String(t).includes("already exists")&&this.db)this.table=await this.db.openTable(this.tableName),await this.table.add(a);else throw t}}async search(e,n){if(!this.table)return[];const a=n?.limit??d.maxResults,t=n?.minScore??d.minScore;let i=this.table.search(e).limit(a*2);const o=this.buildFilterString(n);return o&&(i=i.where(o)),(await i.toArray()).map(c=>({record:this.fromLanceRecord(c),score:1-(c._distance??1)})).filter(c=>c.score>=t).slice(0,a)}async createFtsIndex(){if(this.table)try{await this.table.createIndex("content",{config:m.fts()}),console.error("[KB] FTS index created on content column")}catch(e){String(e).includes("already exists")||console.error("[KB] FTS index creation failed (non-fatal):",e)}}async ftsSearch(e,n){if(!this.table)return[];const a=n?.limit??d.maxResults;try{let t=this.table.search(e).limit(a*2);const i=this.buildFilterString(n);return i&&(t=t.where(i)),(await t.toArray()).map(s=>({record:this.fromLanceRecord(s),score:s._score??s._relevance_score??0}))}catch(t){return console.error("[KB] FTS search failed (non-fatal):",t),[]}}async getById(e){if(!this.table)return null;const n=await this.table.query().where(`id = '${r(e,"id")}'`).limit(1).toArray();return n.length===0?null:this.fromLanceRecord(n[0])}async deleteBySourcePath(e){if(!this.table)return 0;const n=await this.getBySourcePath(e);return n.length===0?0:(await this.table.delete(`sourcePath = '${r(e,"sourcePath")}'`),n.length)}async deleteById(e){return!this.table||!await this.getById(e)?!1:(await this.table.delete(`id = '${r(e,"id")}'`),!0)}async getBySourcePath(e){return this.table?(await this.table.query().where(`sourcePath = '${r(e,"sourcePath")}'`).limit(1e3).toArray()).map(a=>this.fromLanceRecord(a)):[]}async getStats(){if(!this.table)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:"lancedb",embeddingModel:h.model};const e=await this.table.countRows(),n=await this.table.query().select(["sourcePath","contentType","indexedAt"]).limit(1e5).toArray(),a={},t=new Set;let i=null;for(const o of n){const s=o;a[s.contentType]=(a[s.contentType]??0)+1,t.add(s.sourcePath),(!i||s.indexedAt>i)&&(i=s.indexedAt)}return{totalRecords:e,totalFiles:t.size,contentTypeBreakdown:a,lastIndexedAt:i,storeBackend:"lancedb",embeddingModel:h.model}}async listSourcePaths(){if(!this.table)return[];const e=await this.table.query().select(["sourcePath"]).limit(1e5).toArray();return[...new Set(e.map(n=>n.sourcePath))]}async dropTable(){if(this.db&&(await this.db.tableNames()).includes(this.tableName))for(let a=1;a<=3;a++)try{await this.db.dropTable(this.tableName);break}catch(t){if(a===3)throw t;const i=a*500;console.error(`[KB] dropTable attempt ${a} failed, retrying in ${i}ms...`),await new Promise(o=>setTimeout(o,i))}this.table=null}async close(){try{this.db&&typeof this.db.close=="function"&&await this.db.close()}catch{}this.table=null,this.db=null}buildFilterString(e){const n=[];if(e?.contentType&&n.push(`contentType = '${r(e.contentType,"contentType")}'`),e?.sourceType){const a=g(e.sourceType);if(a.length>0){const t=a.map(i=>`'${r(i,"sourceType")}'`).join(", ");n.push(`contentType IN (${t})`)}}if(e?.origin&&n.push(`origin = '${r(e.origin,"origin")}'`),e?.category&&n.push(`category = '${r(e.category,"category")}'`),e?.tags&&e.tags.length>0){const a=e.tags.map(t=>`tags LIKE '%${r(t,"tag")}%'`);n.push(`(${a.join(" OR ")})`)}return n.length>0?n.join(" AND "):null}fromLanceRecord(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:JSON.parse(e.tags||"[]"),category:e.category||void 0,version:e.version}}}export{w as LanceStore};
1
+ import{EMBEDDING_DEFAULTS as e,SEARCH_DEFAULTS as t,STORE_DEFAULTS as n,createLogger as r,serializeError as i,sourceTypeContentTypes as a}from"../../core/dist/index.js";import{Index as o,connect as s}from"@lancedb/lancedb";function c(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}const l=/^[\w.\-/ ]+$/,u=r(`store`);function d(e,t){if(!l.test(e))throw Error(`Invalid ${t} filter value: contains disallowed characters`);return e.replace(/'/g,`''`)}var f=class{db=null;table=null;dbPath;tableName;_writeQueue=Promise.resolve();enqueueWrite(e){let t=this._writeQueue.then(()=>e());return this._writeQueue=t.then(()=>void 0,()=>void 0),t}constructor(e){this.dbPath=e?.path??n.path,this.tableName=e?.tableName??n.tableName}async initialize(){this.db=await s(this.dbPath),(await this.db.tableNames()).includes(this.tableName)&&(this.table=await this.db.openTable(this.tableName),await this.createFtsIndex())}async upsert(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);return this.enqueueWrite(()=>this._upsertImpl(e,t))}}async _upsertImpl(e,t){let n=e.map((e,n)=>({id:e.id,vector:Array.from(t[n]),content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath??``,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:JSON.stringify(e.tags),category:e.category??``,version:e.version}));if(this.table){let t=[...new Set(e.map(e=>e.sourcePath))];for(let e of t)try{await this.table.delete(`sourcePath = '${d(e,`sourcePath`)}'`)}catch{}await this.table.add(n)}else try{this.table=await this.db?.createTable(this.tableName,n)??null}catch(e){if(String(e).includes(`already exists`)&&this.db)this.table=await this.db.openTable(this.tableName),await this.table.add(n);else throw e}}async search(e,n){if(!this.table)return[];let r=n?.limit??t.maxResults,i=n?.minScore??t.minScore,a=this.table.search(e).limit(r*2),o=this.buildFilterString(n);return o&&(a=a.where(o)),(await a.toArray()).map(e=>({record:this.fromLanceRecord(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async createFtsIndex(){return this.enqueueWrite(()=>this._createFtsIndexImpl())}async _createFtsIndexImpl(){if(this.table)try{await this.table.createIndex(`content`,{config:o.fts()}),u.info(`FTS index created`,{column:`content`})}catch(e){String(e).includes(`already exists`)||u.warn(`FTS index creation failed`,i(e))}}async ftsSearch(e,n){if(!this.table)return[];let r=n?.limit??t.maxResults;try{let t=this.table.search(e).limit(r*2),i=this.buildFilterString(n);return i&&(t=t.where(i)),(await t.toArray()).map(e=>({record:this.fromLanceRecord(e),score:e._score??e._relevance_score??0}))}catch(e){return u.warn(`FTS search failed`,i(e)),[]}}async getById(e){if(!this.table)return null;let t=await this.table.query().where(`id = '${d(e,`id`)}'`).limit(1).toArray();return t.length===0?null:this.fromLanceRecord(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){if(!this.table)return 0;let t=await this.getBySourcePath(e);return t.length===0?0:(await this.table.delete(`sourcePath = '${d(e,`sourcePath`)}'`),t.length)}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async _deleteByIdImpl(e){return!this.table||!await this.getById(e)?!1:(await this.table.delete(`id = '${d(e,`id`)}'`),!0)}async getBySourcePath(e){return this.table?(await this.table.query().where(`sourcePath = '${d(e,`sourcePath`)}'`).limit(1e3).toArray()).map(e=>this.fromLanceRecord(e)):[]}async getStats(){if(!this.table)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:`lancedb`,embeddingModel:e.model};let t=await this.table.countRows(),n=await this.table.query().select([`sourcePath`,`contentType`,`indexedAt`]).limit(1e5).toArray(),r={},i=new Set,a=null;for(let e of n){let t=e;r[t.contentType]=(r[t.contentType]??0)+1,i.add(t.sourcePath),(!a||t.indexedAt>a)&&(a=t.indexedAt)}return{totalRecords:t,totalFiles:i.size,contentTypeBreakdown:r,lastIndexedAt:a,storeBackend:`lancedb`,embeddingModel:e.model}}async listSourcePaths(){if(!this.table)return[];let e=await this.table.query().select([`sourcePath`]).limit(1e5).toArray();return[...new Set(e.map(e=>e.sourcePath))]}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){if(this.db&&(await this.db.tableNames()).includes(this.tableName))for(let e=1;e<=3;e++)try{await this.db.dropTable(this.tableName);break}catch(t){if(e===3)throw t;let n=e*500;u.warn(`dropTable attempt failed, retrying`,{attempt:e,delayMs:n}),await new Promise(e=>setTimeout(e,n))}this.table=null}async close(){try{this.db&&typeof this.db.close==`function`&&await this.db.close()}catch{}this.table=null,this.db=null}buildFilterString(e){let t=[];if(e?.contentType&&t.push(`contentType = '${d(e.contentType,`contentType`)}'`),e?.sourceType){let n=a(e.sourceType);if(n.length>0){let e=n.map(e=>`'${d(e,`sourceType`)}'`).join(`, `);t.push(`contentType IN (${e})`)}}if(e?.origin&&t.push(`origin = '${d(e.origin,`origin`)}'`),e?.category&&t.push(`category = '${d(e.category,`category`)}'`),e?.tags&&e.tags.length>0){let n=e.tags.map(e=>`tags LIKE '%${d(e,`tag`)}%'`);t.push(`(${n.join(` OR `)})`)}return t.length>0?t.join(` AND `):null}fromLanceRecord(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,indexedAt:e.indexedAt,origin:e.origin,tags:c(e.tags),category:e.category||void 0,version:e.version}}};export{f as LanceStore};
2
+ //# sourceMappingURL=lance-store.js.map
@@ -1,48 +1,45 @@
1
- /**
2
- * SQLite-backed knowledge graph store.
3
- *
4
- * Uses sql.js (WASM) for a zero-native-dependency, embedded, single-file graph database.
5
- * Stores nodes and edges with JSON properties, supports multi-hop traversal.
6
- * Persists to disk by writing the full database buffer on mutations.
7
- */
8
- import type { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, IGraphStore } from './graph-store.interface.js';
9
- export declare class SqliteGraphStore implements IGraphStore {
10
- private db;
11
- private readonly dbPath;
12
- private dirty;
13
- constructor(options?: {
14
- path?: string;
15
- });
16
- initialize(): Promise<void>;
17
- private ensureDb;
18
- private persist;
19
- private markDirty;
20
- private flushIfDirty;
21
- private query;
22
- private run;
23
- upsertNode(node: GraphNode): Promise<void>;
24
- upsertEdge(edge: GraphEdge): Promise<void>;
25
- upsertNodes(nodes: GraphNode[]): Promise<void>;
26
- upsertEdges(edges: GraphEdge[]): Promise<void>;
27
- getNode(id: string): Promise<GraphNode | null>;
28
- getNeighbors(nodeId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
29
- traverse(startId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
30
- findNodes(filter: {
31
- type?: string;
32
- namePattern?: string;
33
- sourcePath?: string;
34
- limit?: number;
35
- }): Promise<GraphNode[]>;
36
- findEdges(filter: {
37
- type?: string;
38
- fromId?: string;
39
- toId?: string;
40
- limit?: number;
41
- }): Promise<GraphEdge[]>;
42
- deleteNode(id: string): Promise<void>;
43
- deleteBySourcePath(sourcePath: string): Promise<number>;
44
- clear(): Promise<void>;
45
- getStats(): Promise<GraphStats>;
46
- close(): Promise<void>;
1
+ import { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, IGraphStore } from "./graph-store.interface.js";
2
+
3
+ //#region packages/store/src/sqlite-graph-store.d.ts
4
+ declare class SqliteGraphStore implements IGraphStore {
5
+ private db;
6
+ private readonly dbPath;
7
+ private dirty;
8
+ constructor(options?: {
9
+ path?: string;
10
+ });
11
+ initialize(): Promise<void>;
12
+ private ensureDb;
13
+ private persist;
14
+ private markDirty;
15
+ private flushIfDirty;
16
+ private query;
17
+ private run;
18
+ upsertNode(node: GraphNode): Promise<void>;
19
+ upsertEdge(edge: GraphEdge): Promise<void>;
20
+ upsertNodes(nodes: GraphNode[]): Promise<void>;
21
+ upsertEdges(edges: GraphEdge[]): Promise<void>;
22
+ getNode(id: string): Promise<GraphNode | null>;
23
+ getNeighbors(nodeId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
24
+ traverse(startId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
25
+ findNodes(filter: {
26
+ type?: string;
27
+ namePattern?: string;
28
+ sourcePath?: string;
29
+ limit?: number;
30
+ }): Promise<GraphNode[]>;
31
+ findEdges(filter: {
32
+ type?: string;
33
+ fromId?: string;
34
+ toId?: string;
35
+ limit?: number;
36
+ }): Promise<GraphEdge[]>;
37
+ deleteNode(id: string): Promise<void>;
38
+ deleteBySourcePath(sourcePath: string): Promise<number>;
39
+ clear(): Promise<void>;
40
+ getStats(): Promise<GraphStats>;
41
+ close(): Promise<void>;
47
42
  }
43
+ //#endregion
44
+ export { SqliteGraphStore };
48
45
  //# sourceMappingURL=sqlite-graph-store.d.ts.map