@vpxa/aikit 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (649) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1207 -0
  3. package/bin/aikit.mjs +10 -0
  4. package/package.json +92 -0
  5. package/packages/aikit-client/dist/direct-client.d.ts +37 -0
  6. package/packages/aikit-client/dist/direct-client.js +1 -0
  7. package/packages/aikit-client/dist/index.d.ts +5 -0
  8. package/packages/aikit-client/dist/index.js +1 -0
  9. package/packages/aikit-client/dist/mcp-client.d.ts +19 -0
  10. package/packages/aikit-client/dist/mcp-client.js +4 -0
  11. package/packages/aikit-client/dist/parsers.d.ts +35 -0
  12. package/packages/aikit-client/dist/parsers.js +2 -0
  13. package/packages/aikit-client/dist/types.d.ts +62 -0
  14. package/packages/aikit-client/dist/types.js +1 -0
  15. package/packages/analyzers/dist/blast-radius-analyzer.d.ts +19 -0
  16. package/packages/analyzers/dist/blast-radius-analyzer.js +6 -0
  17. package/packages/analyzers/dist/dependency-analyzer.d.ts +32 -0
  18. package/packages/analyzers/dist/dependency-analyzer.js +8 -0
  19. package/packages/analyzers/dist/diagram-generator.d.ts +16 -0
  20. package/packages/analyzers/dist/diagram-generator.js +2 -0
  21. package/packages/analyzers/dist/entry-point-analyzer.d.ts +40 -0
  22. package/packages/analyzers/dist/entry-point-analyzer.js +4 -0
  23. package/packages/analyzers/dist/index.d.ts +12 -0
  24. package/packages/analyzers/dist/index.js +1 -0
  25. package/packages/analyzers/dist/knowledge-producer.d.ts +40 -0
  26. package/packages/analyzers/dist/knowledge-producer.js +26 -0
  27. package/packages/analyzers/dist/pattern-analyzer.d.ts +15 -0
  28. package/packages/analyzers/dist/pattern-analyzer.js +2 -0
  29. package/packages/analyzers/dist/regex-call-graph.d.ts +10 -0
  30. package/packages/analyzers/dist/regex-call-graph.js +1 -0
  31. package/packages/analyzers/dist/structure-analyzer.d.ts +19 -0
  32. package/packages/analyzers/dist/structure-analyzer.js +4 -0
  33. package/packages/analyzers/dist/symbol-analyzer.d.ts +14 -0
  34. package/packages/analyzers/dist/symbol-analyzer.js +9 -0
  35. package/packages/analyzers/dist/ts-call-graph.d.ts +29 -0
  36. package/packages/analyzers/dist/ts-call-graph.js +1 -0
  37. package/packages/analyzers/dist/types.d.ts +110 -0
  38. package/packages/analyzers/dist/types.js +1 -0
  39. package/packages/chunker/dist/call-graph-extractor.d.ts +25 -0
  40. package/packages/chunker/dist/call-graph-extractor.js +1 -0
  41. package/packages/chunker/dist/chunker-factory.d.ts +19 -0
  42. package/packages/chunker/dist/chunker-factory.js +1 -0
  43. package/packages/chunker/dist/chunker.interface.d.ts +13 -0
  44. package/packages/chunker/dist/chunker.interface.js +1 -0
  45. package/packages/chunker/dist/code-chunker.d.ts +17 -0
  46. package/packages/chunker/dist/code-chunker.js +11 -0
  47. package/packages/chunker/dist/extractors/call-extractor.d.ts +24 -0
  48. package/packages/chunker/dist/extractors/call-extractor.js +1 -0
  49. package/packages/chunker/dist/extractors/entry-point-detector.d.ts +14 -0
  50. package/packages/chunker/dist/extractors/entry-point-detector.js +1 -0
  51. package/packages/chunker/dist/extractors/import-extractor.d.ts +14 -0
  52. package/packages/chunker/dist/extractors/import-extractor.js +1 -0
  53. package/packages/chunker/dist/extractors/pattern-detector.d.ts +14 -0
  54. package/packages/chunker/dist/extractors/pattern-detector.js +1 -0
  55. package/packages/chunker/dist/extractors/scope-resolver.d.ts +26 -0
  56. package/packages/chunker/dist/extractors/scope-resolver.js +1 -0
  57. package/packages/chunker/dist/extractors/symbol-extractor.d.ts +14 -0
  58. package/packages/chunker/dist/extractors/symbol-extractor.js +3 -0
  59. package/packages/chunker/dist/extractors/types.d.ts +44 -0
  60. package/packages/chunker/dist/extractors/types.js +1 -0
  61. package/packages/chunker/dist/generic-chunker.d.ts +15 -0
  62. package/packages/chunker/dist/generic-chunker.js +5 -0
  63. package/packages/chunker/dist/index.d.ts +19 -0
  64. package/packages/chunker/dist/index.js +1 -0
  65. package/packages/chunker/dist/markdown-chunker.d.ts +17 -0
  66. package/packages/chunker/dist/markdown-chunker.js +3 -0
  67. package/packages/chunker/dist/wasm/languages.d.ts +18 -0
  68. package/packages/chunker/dist/wasm/languages.js +1 -0
  69. package/packages/chunker/dist/wasm/query-executor.d.ts +70 -0
  70. package/packages/chunker/dist/wasm/query-executor.js +1 -0
  71. package/packages/chunker/dist/wasm/runtime.d.ts +44 -0
  72. package/packages/chunker/dist/wasm/runtime.js +1 -0
  73. package/packages/chunker/dist/wasm/types.d.ts +84 -0
  74. package/packages/chunker/dist/wasm/types.js +1 -0
  75. package/packages/chunker/dist/wasm-chunker.d.ts +23 -0
  76. package/packages/chunker/dist/wasm-chunker.js +6 -0
  77. package/packages/chunker/src/queries/go/calls.scm +11 -0
  78. package/packages/chunker/src/queries/go/entry-points.scm +20 -0
  79. package/packages/chunker/src/queries/go/imports.scm +6 -0
  80. package/packages/chunker/src/queries/go/patterns.scm +25 -0
  81. package/packages/chunker/src/queries/go/symbols.scm +26 -0
  82. package/packages/chunker/src/queries/java/calls.scm +10 -0
  83. package/packages/chunker/src/queries/java/entry-points.scm +27 -0
  84. package/packages/chunker/src/queries/java/imports.scm +11 -0
  85. package/packages/chunker/src/queries/java/patterns.scm +27 -0
  86. package/packages/chunker/src/queries/java/symbols.scm +28 -0
  87. package/packages/chunker/src/queries/javascript/calls.scm +21 -0
  88. package/packages/chunker/src/queries/javascript/entry-points.scm +31 -0
  89. package/packages/chunker/src/queries/javascript/imports.scm +32 -0
  90. package/packages/chunker/src/queries/javascript/patterns.scm +28 -0
  91. package/packages/chunker/src/queries/javascript/symbols.scm +52 -0
  92. package/packages/chunker/src/queries/python/calls.scm +11 -0
  93. package/packages/chunker/src/queries/python/entry-points.scm +21 -0
  94. package/packages/chunker/src/queries/python/imports.scm +14 -0
  95. package/packages/chunker/src/queries/python/patterns.scm +25 -0
  96. package/packages/chunker/src/queries/python/symbols.scm +17 -0
  97. package/packages/chunker/src/queries/rust/calls.scm +20 -0
  98. package/packages/chunker/src/queries/rust/entry-points.scm +7 -0
  99. package/packages/chunker/src/queries/rust/imports.scm +26 -0
  100. package/packages/chunker/src/queries/rust/patterns.scm +18 -0
  101. package/packages/chunker/src/queries/rust/symbols.scm +73 -0
  102. package/packages/chunker/src/queries/typescript/calls.scm +21 -0
  103. package/packages/chunker/src/queries/typescript/entry-points.scm +48 -0
  104. package/packages/chunker/src/queries/typescript/imports.scm +35 -0
  105. package/packages/chunker/src/queries/typescript/patterns.scm +47 -0
  106. package/packages/chunker/src/queries/typescript/symbols.scm +79 -0
  107. package/packages/chunker/wasm/tree-sitter-c.wasm +0 -0
  108. package/packages/chunker/wasm/tree-sitter-c_sharp.wasm +0 -0
  109. package/packages/chunker/wasm/tree-sitter-cpp.wasm +0 -0
  110. package/packages/chunker/wasm/tree-sitter-go.wasm +0 -0
  111. package/packages/chunker/wasm/tree-sitter-java.wasm +0 -0
  112. package/packages/chunker/wasm/tree-sitter-javascript.wasm +0 -0
  113. package/packages/chunker/wasm/tree-sitter-kotlin.wasm +0 -0
  114. package/packages/chunker/wasm/tree-sitter-php.wasm +0 -0
  115. package/packages/chunker/wasm/tree-sitter-python.wasm +0 -0
  116. package/packages/chunker/wasm/tree-sitter-ruby.wasm +0 -0
  117. package/packages/chunker/wasm/tree-sitter-rust.wasm +0 -0
  118. package/packages/chunker/wasm/tree-sitter-scala.wasm +0 -0
  119. package/packages/chunker/wasm/tree-sitter-swift.wasm +0 -0
  120. package/packages/chunker/wasm/tree-sitter-typescript.wasm +0 -0
  121. package/packages/chunker/wasm/tree-sitter.wasm +0 -0
  122. package/packages/cli/dist/aikit-init.d.ts +54 -0
  123. package/packages/cli/dist/aikit-init.js +1 -0
  124. package/packages/cli/dist/commands/analyze.d.ts +6 -0
  125. package/packages/cli/dist/commands/analyze.js +2 -0
  126. package/packages/cli/dist/commands/context-cmds.d.ts +6 -0
  127. package/packages/cli/dist/commands/context-cmds.js +1 -0
  128. package/packages/cli/dist/commands/environment.d.ts +6 -0
  129. package/packages/cli/dist/commands/environment.js +1 -0
  130. package/packages/cli/dist/commands/execution.d.ts +6 -0
  131. package/packages/cli/dist/commands/execution.js +1 -0
  132. package/packages/cli/dist/commands/flow.d.ts +6 -0
  133. package/packages/cli/dist/commands/flow.js +1 -0
  134. package/packages/cli/dist/commands/graph.d.ts +6 -0
  135. package/packages/cli/dist/commands/graph.js +6 -0
  136. package/packages/cli/dist/commands/init/adapters.d.ts +28 -0
  137. package/packages/cli/dist/commands/init/adapters.js +1 -0
  138. package/packages/cli/dist/commands/init/config.d.ts +10 -0
  139. package/packages/cli/dist/commands/init/config.js +3 -0
  140. package/packages/cli/dist/commands/init/constants.d.ts +41 -0
  141. package/packages/cli/dist/commands/init/constants.js +1 -0
  142. package/packages/cli/dist/commands/init/curated.d.ts +7 -0
  143. package/packages/cli/dist/commands/init/curated.js +1 -0
  144. package/packages/cli/dist/commands/init/frontmatter.d.ts +54 -0
  145. package/packages/cli/dist/commands/init/frontmatter.js +2 -0
  146. package/packages/cli/dist/commands/init/index.d.ts +36 -0
  147. package/packages/cli/dist/commands/init/index.js +5 -0
  148. package/packages/cli/dist/commands/init/manifest.d.ts +71 -0
  149. package/packages/cli/dist/commands/init/manifest.js +1 -0
  150. package/packages/cli/dist/commands/init/scaffold.d.ts +46 -0
  151. package/packages/cli/dist/commands/init/scaffold.js +1 -0
  152. package/packages/cli/dist/commands/init/templates.d.ts +9 -0
  153. package/packages/cli/dist/commands/init/templates.js +194 -0
  154. package/packages/cli/dist/commands/init/user.d.ts +61 -0
  155. package/packages/cli/dist/commands/init/user.js +5 -0
  156. package/packages/cli/dist/commands/knowledge.d.ts +6 -0
  157. package/packages/cli/dist/commands/knowledge.js +1 -0
  158. package/packages/cli/dist/commands/search.d.ts +6 -0
  159. package/packages/cli/dist/commands/search.js +1 -0
  160. package/packages/cli/dist/commands/system.d.ts +6 -0
  161. package/packages/cli/dist/commands/system.js +4 -0
  162. package/packages/cli/dist/commands/upgrade.d.ts +6 -0
  163. package/packages/cli/dist/commands/upgrade.js +1 -0
  164. package/packages/cli/dist/commands/workspace.d.ts +6 -0
  165. package/packages/cli/dist/commands/workspace.js +1 -0
  166. package/packages/cli/dist/context.d.ts +7 -0
  167. package/packages/cli/dist/context.js +1 -0
  168. package/packages/cli/dist/helpers.d.ts +55 -0
  169. package/packages/cli/dist/helpers.js +5 -0
  170. package/packages/cli/dist/index.d.ts +10 -0
  171. package/packages/cli/dist/index.js +3 -0
  172. package/packages/cli/dist/types.d.ts +9 -0
  173. package/packages/cli/dist/types.js +1 -0
  174. package/packages/core/dist/constants.d.ts +74 -0
  175. package/packages/core/dist/constants.js +1 -0
  176. package/packages/core/dist/content-detector.d.ts +13 -0
  177. package/packages/core/dist/content-detector.js +1 -0
  178. package/packages/core/dist/errors.d.ts +20 -0
  179. package/packages/core/dist/errors.js +1 -0
  180. package/packages/core/dist/global-registry.d.ts +63 -0
  181. package/packages/core/dist/global-registry.js +1 -0
  182. package/packages/core/dist/index.d.ts +7 -0
  183. package/packages/core/dist/index.js +1 -0
  184. package/packages/core/dist/logger.d.ts +32 -0
  185. package/packages/core/dist/logger.js +1 -0
  186. package/packages/core/dist/types.d.ts +133 -0
  187. package/packages/core/dist/types.js +1 -0
  188. package/packages/dashboard/dist/assets/index-BjA4YODs.js +21 -0
  189. package/packages/dashboard/dist/assets/index-BjA4YODs.js.map +1 -0
  190. package/packages/dashboard/dist/assets/index-CHpVij2M.css +1 -0
  191. package/packages/dashboard/dist/index.html +18 -0
  192. package/packages/elicitation/dist/build.d.ts +14 -0
  193. package/packages/elicitation/dist/build.js +1 -0
  194. package/packages/elicitation/dist/fields.d.ts +32 -0
  195. package/packages/elicitation/dist/fields.js +1 -0
  196. package/packages/elicitation/dist/index.d.ts +5 -0
  197. package/packages/elicitation/dist/index.js +1 -0
  198. package/packages/elicitation/dist/normalize.d.ts +15 -0
  199. package/packages/elicitation/dist/normalize.js +1 -0
  200. package/packages/elicitation/dist/types.d.ts +88 -0
  201. package/packages/elicitation/dist/types.js +1 -0
  202. package/packages/embeddings/dist/embedder.interface.d.ts +26 -0
  203. package/packages/embeddings/dist/embedder.interface.js +1 -0
  204. package/packages/embeddings/dist/index.d.ts +3 -0
  205. package/packages/embeddings/dist/index.js +1 -0
  206. package/packages/embeddings/dist/onnx-embedder.d.ts +22 -0
  207. package/packages/embeddings/dist/onnx-embedder.js +1 -0
  208. package/packages/enterprise-bridge/dist/cache.d.ts +28 -0
  209. package/packages/enterprise-bridge/dist/cache.js +1 -0
  210. package/packages/enterprise-bridge/dist/er-client.d.ts +37 -0
  211. package/packages/enterprise-bridge/dist/er-client.js +1 -0
  212. package/packages/enterprise-bridge/dist/evolution-collector.d.ts +62 -0
  213. package/packages/enterprise-bridge/dist/evolution-collector.js +1 -0
  214. package/packages/enterprise-bridge/dist/index.d.ts +8 -0
  215. package/packages/enterprise-bridge/dist/index.js +1 -0
  216. package/packages/enterprise-bridge/dist/policy-store.d.ts +45 -0
  217. package/packages/enterprise-bridge/dist/policy-store.js +1 -0
  218. package/packages/enterprise-bridge/dist/push-adapter.d.ts +23 -0
  219. package/packages/enterprise-bridge/dist/push-adapter.js +1 -0
  220. package/packages/enterprise-bridge/dist/result-merger.d.ts +14 -0
  221. package/packages/enterprise-bridge/dist/result-merger.js +1 -0
  222. package/packages/enterprise-bridge/dist/types.d.ts +81 -0
  223. package/packages/enterprise-bridge/dist/types.js +1 -0
  224. package/packages/flows/dist/adapters/claude-plugin.d.ts +12 -0
  225. package/packages/flows/dist/adapters/claude-plugin.js +1 -0
  226. package/packages/flows/dist/adapters/copilot.d.ts +10 -0
  227. package/packages/flows/dist/adapters/copilot.js +1 -0
  228. package/packages/flows/dist/adapters/index.d.ts +11 -0
  229. package/packages/flows/dist/adapters/index.js +1 -0
  230. package/packages/flows/dist/adapters/native.d.ts +10 -0
  231. package/packages/flows/dist/adapters/native.js +1 -0
  232. package/packages/flows/dist/builtins.d.ts +16 -0
  233. package/packages/flows/dist/builtins.js +1 -0
  234. package/packages/flows/dist/foundation.d.ts +20 -0
  235. package/packages/flows/dist/foundation.js +11 -0
  236. package/packages/flows/dist/git.d.ts +34 -0
  237. package/packages/flows/dist/git.js +1 -0
  238. package/packages/flows/dist/index.d.ts +12 -0
  239. package/packages/flows/dist/index.js +1 -0
  240. package/packages/flows/dist/loader.d.ts +13 -0
  241. package/packages/flows/dist/loader.js +2 -0
  242. package/packages/flows/dist/registry.d.ts +23 -0
  243. package/packages/flows/dist/registry.js +1 -0
  244. package/packages/flows/dist/state-machine.d.ts +23 -0
  245. package/packages/flows/dist/state-machine.js +1 -0
  246. package/packages/flows/dist/symlinks.d.ts +17 -0
  247. package/packages/flows/dist/symlinks.js +1 -0
  248. package/packages/flows/dist/types.d.ts +112 -0
  249. package/packages/flows/dist/types.js +1 -0
  250. package/packages/indexer/dist/file-hasher.d.ts +13 -0
  251. package/packages/indexer/dist/file-hasher.js +1 -0
  252. package/packages/indexer/dist/filesystem-crawler.d.ts +29 -0
  253. package/packages/indexer/dist/filesystem-crawler.js +1 -0
  254. package/packages/indexer/dist/graph-extractor.d.ts +18 -0
  255. package/packages/indexer/dist/graph-extractor.js +1 -0
  256. package/packages/indexer/dist/hash-cache.d.ts +24 -0
  257. package/packages/indexer/dist/hash-cache.js +1 -0
  258. package/packages/indexer/dist/incremental-indexer.d.ts +56 -0
  259. package/packages/indexer/dist/incremental-indexer.js +1 -0
  260. package/packages/indexer/dist/index.d.ts +6 -0
  261. package/packages/indexer/dist/index.js +1 -0
  262. package/packages/present/dist/index.html +709 -0
  263. package/packages/server/dist/api.d.ts +3 -0
  264. package/packages/server/dist/api.js +1 -0
  265. package/packages/server/dist/auto-gc.d.ts +30 -0
  266. package/packages/server/dist/auto-gc.js +1 -0
  267. package/packages/server/dist/completions.d.ts +14 -0
  268. package/packages/server/dist/completions.js +1 -0
  269. package/packages/server/dist/config.d.ts +14 -0
  270. package/packages/server/dist/config.js +1 -0
  271. package/packages/server/dist/cross-workspace.d.ts +43 -0
  272. package/packages/server/dist/cross-workspace.js +1 -0
  273. package/packages/server/dist/curated-manager.d.ts +92 -0
  274. package/packages/server/dist/curated-manager.js +5 -0
  275. package/packages/server/dist/dashboard-static.d.ts +27 -0
  276. package/packages/server/dist/dashboard-static.js +1 -0
  277. package/packages/server/dist/elicitor.d.ts +18 -0
  278. package/packages/server/dist/elicitor.js +1 -0
  279. package/packages/server/dist/index.d.ts +1 -0
  280. package/packages/server/dist/index.js +1 -0
  281. package/packages/server/dist/mcp-logging.d.ts +11 -0
  282. package/packages/server/dist/mcp-logging.js +1 -0
  283. package/packages/server/dist/output-schemas.d.ts +242 -0
  284. package/packages/server/dist/output-schemas.js +1 -0
  285. package/packages/server/dist/prompts.d.ts +13 -0
  286. package/packages/server/dist/prompts.js +13 -0
  287. package/packages/server/dist/replay-interceptor.d.ts +23 -0
  288. package/packages/server/dist/replay-interceptor.js +1 -0
  289. package/packages/server/dist/resource-links.d.ts +34 -0
  290. package/packages/server/dist/resource-links.js +1 -0
  291. package/packages/server/dist/resources/curated-resources.d.ts +13 -0
  292. package/packages/server/dist/resources/curated-resources.js +2 -0
  293. package/packages/server/dist/resources/resource-notifier.d.ts +45 -0
  294. package/packages/server/dist/resources/resource-notifier.js +1 -0
  295. package/packages/server/dist/resources/resources.d.ts +8 -0
  296. package/packages/server/dist/resources/resources.js +2 -0
  297. package/packages/server/dist/sampling.d.ts +41 -0
  298. package/packages/server/dist/sampling.js +2 -0
  299. package/packages/server/dist/server.d.ts +47 -0
  300. package/packages/server/dist/server.js +3 -0
  301. package/packages/server/dist/structured-content-guard.d.ts +26 -0
  302. package/packages/server/dist/structured-content-guard.js +1 -0
  303. package/packages/server/dist/task-manager.d.ts +40 -0
  304. package/packages/server/dist/task-manager.js +1 -0
  305. package/packages/server/dist/tool-metadata.d.ts +38 -0
  306. package/packages/server/dist/tool-metadata.js +1 -0
  307. package/packages/server/dist/tool-prefix.d.ts +12 -0
  308. package/packages/server/dist/tool-prefix.js +1 -0
  309. package/packages/server/dist/tools/analyze.tools.d.ts +14 -0
  310. package/packages/server/dist/tools/analyze.tools.js +8 -0
  311. package/packages/server/dist/tools/audit.tool.d.ts +8 -0
  312. package/packages/server/dist/tools/audit.tool.js +1 -0
  313. package/packages/server/dist/tools/brainstorm.tool.d.ts +7 -0
  314. package/packages/server/dist/tools/brainstorm.tool.js +9 -0
  315. package/packages/server/dist/tools/bridge.tools.d.ts +34 -0
  316. package/packages/server/dist/tools/bridge.tools.js +15 -0
  317. package/packages/server/dist/tools/context.tools.d.ts +15 -0
  318. package/packages/server/dist/tools/context.tools.js +10 -0
  319. package/packages/server/dist/tools/evolution.tools.d.ts +7 -0
  320. package/packages/server/dist/tools/evolution.tools.js +5 -0
  321. package/packages/server/dist/tools/execution.tools.d.ts +14 -0
  322. package/packages/server/dist/tools/execution.tools.js +4 -0
  323. package/packages/server/dist/tools/flow.tools.d.ts +7 -0
  324. package/packages/server/dist/tools/flow.tools.js +1 -0
  325. package/packages/server/dist/tools/forge.tools.d.ts +13 -0
  326. package/packages/server/dist/tools/forge.tools.js +10 -0
  327. package/packages/server/dist/tools/forget.tool.d.ts +8 -0
  328. package/packages/server/dist/tools/forget.tool.js +1 -0
  329. package/packages/server/dist/tools/graph.tool.d.ts +7 -0
  330. package/packages/server/dist/tools/graph.tool.js +5 -0
  331. package/packages/server/dist/tools/infra.tools.d.ts +10 -0
  332. package/packages/server/dist/tools/infra.tools.js +5 -0
  333. package/packages/server/dist/tools/list.tool.d.ts +7 -0
  334. package/packages/server/dist/tools/list.tool.js +2 -0
  335. package/packages/server/dist/tools/lookup.tool.d.ts +7 -0
  336. package/packages/server/dist/tools/lookup.tool.js +3 -0
  337. package/packages/server/dist/tools/manipulation.tools.d.ts +10 -0
  338. package/packages/server/dist/tools/manipulation.tools.js +4 -0
  339. package/packages/server/dist/tools/onboard.tool.d.ts +9 -0
  340. package/packages/server/dist/tools/onboard.tool.js +2 -0
  341. package/packages/server/dist/tools/persistence.tools.d.ts +10 -0
  342. package/packages/server/dist/tools/persistence.tools.js +5 -0
  343. package/packages/server/dist/tools/policy.tools.d.ts +7 -0
  344. package/packages/server/dist/tools/policy.tools.js +3 -0
  345. package/packages/server/dist/tools/present/browser.d.ts +4 -0
  346. package/packages/server/dist/tools/present/browser.js +93 -0
  347. package/packages/server/dist/tools/present/helpers.d.ts +18 -0
  348. package/packages/server/dist/tools/present/helpers.js +1 -0
  349. package/packages/server/dist/tools/present/html.d.ts +18 -0
  350. package/packages/server/dist/tools/present/html.js +5 -0
  351. package/packages/server/dist/tools/present/index.d.ts +2 -0
  352. package/packages/server/dist/tools/present/index.js +1 -0
  353. package/packages/server/dist/tools/present/markdown.d.ts +17 -0
  354. package/packages/server/dist/tools/present/markdown.js +8 -0
  355. package/packages/server/dist/tools/present/templates.d.ts +14 -0
  356. package/packages/server/dist/tools/present/templates.js +472 -0
  357. package/packages/server/dist/tools/present/tool.d.ts +27 -0
  358. package/packages/server/dist/tools/present/tool.js +19 -0
  359. package/packages/server/dist/tools/present-blocks.d.ts +46 -0
  360. package/packages/server/dist/tools/present-blocks.js +27 -0
  361. package/packages/server/dist/tools/present-charts.d.ts +31 -0
  362. package/packages/server/dist/tools/present-charts.js +34 -0
  363. package/packages/server/dist/tools/present-theme.d.ts +14 -0
  364. package/packages/server/dist/tools/present-theme.js +395 -0
  365. package/packages/server/dist/tools/present-utils.d.ts +11 -0
  366. package/packages/server/dist/tools/present-utils.js +1 -0
  367. package/packages/server/dist/tools/present.tool.d.ts +2 -0
  368. package/packages/server/dist/tools/present.tool.js +1 -0
  369. package/packages/server/dist/tools/produce.tool.d.ts +7 -0
  370. package/packages/server/dist/tools/produce.tool.js +4 -0
  371. package/packages/server/dist/tools/read.tool.d.ts +7 -0
  372. package/packages/server/dist/tools/read.tool.js +2 -0
  373. package/packages/server/dist/tools/reindex.tool.d.ts +11 -0
  374. package/packages/server/dist/tools/reindex.tool.js +3 -0
  375. package/packages/server/dist/tools/remember.tool.d.ts +9 -0
  376. package/packages/server/dist/tools/remember.tool.js +4 -0
  377. package/packages/server/dist/tools/replay.tool.d.ts +6 -0
  378. package/packages/server/dist/tools/replay.tool.js +3 -0
  379. package/packages/server/dist/tools/restore.tool.d.ts +6 -0
  380. package/packages/server/dist/tools/restore.tool.js +3 -0
  381. package/packages/server/dist/tools/search.tool.d.ts +11 -0
  382. package/packages/server/dist/tools/search.tool.js +10 -0
  383. package/packages/server/dist/tools/status.tool.d.ts +20 -0
  384. package/packages/server/dist/tools/status.tool.js +3 -0
  385. package/packages/server/dist/tools/update.tool.d.ts +8 -0
  386. package/packages/server/dist/tools/update.tool.js +1 -0
  387. package/packages/server/dist/tools/utility.tools.d.ts +15 -0
  388. package/packages/server/dist/tools/utility.tools.js +13 -0
  389. package/packages/server/dist/version-check.d.ts +32 -0
  390. package/packages/server/dist/version-check.js +1 -0
  391. package/packages/store/dist/graph-store.interface.d.ts +118 -0
  392. package/packages/store/dist/graph-store.interface.js +1 -0
  393. package/packages/store/dist/index.d.ts +6 -0
  394. package/packages/store/dist/index.js +1 -0
  395. package/packages/store/dist/lance-store.d.ts +44 -0
  396. package/packages/store/dist/lance-store.js +1 -0
  397. package/packages/store/dist/sqlite-graph-store.d.ts +45 -0
  398. package/packages/store/dist/sqlite-graph-store.js +58 -0
  399. package/packages/store/dist/store-factory.d.ts +12 -0
  400. package/packages/store/dist/store-factory.js +1 -0
  401. package/packages/store/dist/store.interface.d.ts +54 -0
  402. package/packages/store/dist/store.interface.js +1 -0
  403. package/packages/tools/dist/audit.d.ts +65 -0
  404. package/packages/tools/dist/audit.js +6 -0
  405. package/packages/tools/dist/batch.d.ts +23 -0
  406. package/packages/tools/dist/batch.js +1 -0
  407. package/packages/tools/dist/changelog.d.ts +36 -0
  408. package/packages/tools/dist/changelog.js +2 -0
  409. package/packages/tools/dist/check.d.ts +48 -0
  410. package/packages/tools/dist/check.js +2 -0
  411. package/packages/tools/dist/checkpoint.d.ts +19 -0
  412. package/packages/tools/dist/checkpoint.js +1 -0
  413. package/packages/tools/dist/codemod.d.ts +39 -0
  414. package/packages/tools/dist/codemod.js +2 -0
  415. package/packages/tools/dist/compact.d.ts +41 -0
  416. package/packages/tools/dist/compact.js +3 -0
  417. package/packages/tools/dist/config-extractor.d.ts +9 -0
  418. package/packages/tools/dist/config-extractor.js +7 -0
  419. package/packages/tools/dist/data-transform.d.ts +12 -0
  420. package/packages/tools/dist/data-transform.js +1 -0
  421. package/packages/tools/dist/dead-symbols.d.ts +28 -0
  422. package/packages/tools/dist/dead-symbols.js +2 -0
  423. package/packages/tools/dist/delegate.d.ts +36 -0
  424. package/packages/tools/dist/delegate.js +1 -0
  425. package/packages/tools/dist/diagram-builder.d.ts +9 -0
  426. package/packages/tools/dist/diagram-builder.js +9 -0
  427. package/packages/tools/dist/diff-parse.d.ts +28 -0
  428. package/packages/tools/dist/diff-parse.js +3 -0
  429. package/packages/tools/dist/digest.d.ts +50 -0
  430. package/packages/tools/dist/digest.js +6 -0
  431. package/packages/tools/dist/dogfood-log.d.ts +49 -0
  432. package/packages/tools/dist/dogfood-log.js +2 -0
  433. package/packages/tools/dist/encode.d.ts +16 -0
  434. package/packages/tools/dist/encode.js +1 -0
  435. package/packages/tools/dist/env-info.d.ts +30 -0
  436. package/packages/tools/dist/env-info.js +1 -0
  437. package/packages/tools/dist/eval.d.ts +15 -0
  438. package/packages/tools/dist/eval.js +2 -0
  439. package/packages/tools/dist/evidence-map.d.ts +92 -0
  440. package/packages/tools/dist/evidence-map.js +2 -0
  441. package/packages/tools/dist/file-cache.d.ts +41 -0
  442. package/packages/tools/dist/file-cache.js +3 -0
  443. package/packages/tools/dist/file-summary.d.ts +52 -0
  444. package/packages/tools/dist/file-summary.js +2 -0
  445. package/packages/tools/dist/file-walk.d.ts +6 -0
  446. package/packages/tools/dist/file-walk.js +1 -0
  447. package/packages/tools/dist/find-examples.d.ts +29 -0
  448. package/packages/tools/dist/find-examples.js +3 -0
  449. package/packages/tools/dist/find.d.ts +49 -0
  450. package/packages/tools/dist/find.js +1 -0
  451. package/packages/tools/dist/forge-classify.d.ts +44 -0
  452. package/packages/tools/dist/forge-classify.js +2 -0
  453. package/packages/tools/dist/forge-ground.d.ts +61 -0
  454. package/packages/tools/dist/forge-ground.js +1 -0
  455. package/packages/tools/dist/git-context.d.ts +25 -0
  456. package/packages/tools/dist/git-context.js +3 -0
  457. package/packages/tools/dist/graph-query.d.ts +86 -0
  458. package/packages/tools/dist/graph-query.js +1 -0
  459. package/packages/tools/dist/guide.d.ts +25 -0
  460. package/packages/tools/dist/guide.js +1 -0
  461. package/packages/tools/dist/health.d.ts +16 -0
  462. package/packages/tools/dist/health.js +2 -0
  463. package/packages/tools/dist/http-request.d.ts +25 -0
  464. package/packages/tools/dist/http-request.js +1 -0
  465. package/packages/tools/dist/index.d.ts +57 -0
  466. package/packages/tools/dist/index.js +1 -0
  467. package/packages/tools/dist/lane.d.ts +41 -0
  468. package/packages/tools/dist/lane.js +6 -0
  469. package/packages/tools/dist/measure.d.ts +42 -0
  470. package/packages/tools/dist/measure.js +2 -0
  471. package/packages/tools/dist/onboard-utils.d.ts +12 -0
  472. package/packages/tools/dist/onboard-utils.js +1 -0
  473. package/packages/tools/dist/onboard.d.ts +50 -0
  474. package/packages/tools/dist/onboard.js +18 -0
  475. package/packages/tools/dist/parse-output.d.ts +82 -0
  476. package/packages/tools/dist/parse-output.js +2 -0
  477. package/packages/tools/dist/path-resolver.d.ts +14 -0
  478. package/packages/tools/dist/path-resolver.js +1 -0
  479. package/packages/tools/dist/process-manager.d.ts +20 -0
  480. package/packages/tools/dist/process-manager.js +1 -0
  481. package/packages/tools/dist/queue.d.ts +40 -0
  482. package/packages/tools/dist/queue.js +1 -0
  483. package/packages/tools/dist/regex-test.d.ts +33 -0
  484. package/packages/tools/dist/regex-test.js +1 -0
  485. package/packages/tools/dist/regex-utils.d.ts +8 -0
  486. package/packages/tools/dist/regex-utils.js +1 -0
  487. package/packages/tools/dist/rename.d.ts +31 -0
  488. package/packages/tools/dist/rename.js +2 -0
  489. package/packages/tools/dist/replay.d.ts +59 -0
  490. package/packages/tools/dist/replay.js +4 -0
  491. package/packages/tools/dist/response-envelope.d.ts +43 -0
  492. package/packages/tools/dist/response-envelope.js +1 -0
  493. package/packages/tools/dist/restore-points.d.ts +22 -0
  494. package/packages/tools/dist/restore-points.js +1 -0
  495. package/packages/tools/dist/schema-validate.d.ts +25 -0
  496. package/packages/tools/dist/schema-validate.js +1 -0
  497. package/packages/tools/dist/scope-map.d.ts +51 -0
  498. package/packages/tools/dist/scope-map.js +1 -0
  499. package/packages/tools/dist/snippet.d.ts +35 -0
  500. package/packages/tools/dist/snippet.js +1 -0
  501. package/packages/tools/dist/stash.d.ts +14 -0
  502. package/packages/tools/dist/stash.js +1 -0
  503. package/packages/tools/dist/stratum-card.d.ts +30 -0
  504. package/packages/tools/dist/stratum-card.js +4 -0
  505. package/packages/tools/dist/symbol.d.ts +45 -0
  506. package/packages/tools/dist/symbol.js +3 -0
  507. package/packages/tools/dist/synthesis-engine.d.ts +13 -0
  508. package/packages/tools/dist/synthesis-engine.js +6 -0
  509. package/packages/tools/dist/test-run.d.ts +28 -0
  510. package/packages/tools/dist/test-run.js +2 -0
  511. package/packages/tools/dist/text-utils.d.ts +24 -0
  512. package/packages/tools/dist/text-utils.js +2 -0
  513. package/packages/tools/dist/time-utils.d.ts +20 -0
  514. package/packages/tools/dist/time-utils.js +1 -0
  515. package/packages/tools/dist/trace.d.ts +29 -0
  516. package/packages/tools/dist/trace.js +2 -0
  517. package/packages/tools/dist/truncation.d.ts +33 -0
  518. package/packages/tools/dist/truncation.js +7 -0
  519. package/packages/tools/dist/watch.d.ts +32 -0
  520. package/packages/tools/dist/watch.js +1 -0
  521. package/packages/tools/dist/web-fetch.d.ts +47 -0
  522. package/packages/tools/dist/web-fetch.js +8 -0
  523. package/packages/tools/dist/web-search.d.ts +25 -0
  524. package/packages/tools/dist/web-search.js +1 -0
  525. package/packages/tools/dist/workset.d.ts +47 -0
  526. package/packages/tools/dist/workset.js +1 -0
  527. package/packages/tui/dist/App-DU2KEylW.js +2 -0
  528. package/packages/tui/dist/App.d.ts +13 -0
  529. package/packages/tui/dist/App.js +2 -0
  530. package/packages/tui/dist/CuratedPanel-BIamXLNy.js +2 -0
  531. package/packages/tui/dist/LogPanel-Bo8a8QXB.js +3 -0
  532. package/packages/tui/dist/SearchPanel-CpJGczAc.js +2 -0
  533. package/packages/tui/dist/StatusPanel-BAbUxyqQ.js +2 -0
  534. package/packages/tui/dist/chunk-D6axbAb-.js +2 -0
  535. package/packages/tui/dist/devtools-DMOZMn70.js +7 -0
  536. package/packages/tui/dist/hooks/useKBClient.d.ts +9 -0
  537. package/packages/tui/dist/hooks/useKBClient.js +2 -0
  538. package/packages/tui/dist/hooks/usePolling.d.ts +8 -0
  539. package/packages/tui/dist/hooks/usePolling.js +2 -0
  540. package/packages/tui/dist/index-BXafekwr.d.ts +64 -0
  541. package/packages/tui/dist/index.d.ts +7 -0
  542. package/packages/tui/dist/index.js +2 -0
  543. package/packages/tui/dist/jsx-runtime-y6Gdq5PZ.js +294 -0
  544. package/packages/tui/dist/panels/CuratedPanel.d.ts +7 -0
  545. package/packages/tui/dist/panels/CuratedPanel.js +2 -0
  546. package/packages/tui/dist/panels/LogPanel.d.ts +7 -0
  547. package/packages/tui/dist/panels/LogPanel.js +2 -0
  548. package/packages/tui/dist/panels/SearchPanel.d.ts +7 -0
  549. package/packages/tui/dist/panels/SearchPanel.js +2 -0
  550. package/packages/tui/dist/panels/StatusPanel.d.ts +7 -0
  551. package/packages/tui/dist/panels/StatusPanel.js +2 -0
  552. package/packages/tui/dist/react-D__J1GQe.js +24 -0
  553. package/packages/tui/dist/useKBClient-C35iA4uG.js +2 -0
  554. package/packages/tui/dist/usePolling-BbjnRWgx.js +2 -0
  555. package/scaffold/README.md +192 -0
  556. package/scaffold/adapters/claude-code.mjs +56 -0
  557. package/scaffold/adapters/copilot.mjs +270 -0
  558. package/scaffold/definitions/agents.mjs +189 -0
  559. package/scaffold/definitions/bodies.mjs +487 -0
  560. package/scaffold/definitions/hooks.mjs +43 -0
  561. package/scaffold/definitions/models.mjs +56 -0
  562. package/scaffold/definitions/plugins.mjs +38 -0
  563. package/scaffold/definitions/prompts.mjs +145 -0
  564. package/scaffold/definitions/protocols.mjs +679 -0
  565. package/scaffold/definitions/tools.mjs +229 -0
  566. package/scaffold/flows/aikit-advanced/flow.json +60 -0
  567. package/scaffold/flows/aikit-advanced/skills/execute/SKILL.md +124 -0
  568. package/scaffold/flows/aikit-advanced/skills/plan/SKILL.md +100 -0
  569. package/scaffold/flows/aikit-advanced/skills/spec/SKILL.md +100 -0
  570. package/scaffold/flows/aikit-advanced/skills/task/SKILL.md +99 -0
  571. package/scaffold/flows/aikit-advanced/skills/verify/SKILL.md +122 -0
  572. package/scaffold/flows/aikit-basic/flow.json +36 -0
  573. package/scaffold/flows/aikit-basic/skills/assess/SKILL.md +82 -0
  574. package/scaffold/flows/aikit-basic/skills/implement/SKILL.md +105 -0
  575. package/scaffold/flows/aikit-basic/skills/verify/SKILL.md +96 -0
  576. package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +21 -0
  577. package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +21 -0
  578. package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +12 -0
  579. package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +12 -0
  580. package/scaffold/general/agents/Debugger.agent.md +34 -0
  581. package/scaffold/general/agents/Documenter.agent.md +53 -0
  582. package/scaffold/general/agents/Explorer.agent.md +63 -0
  583. package/scaffold/general/agents/Frontend.agent.md +29 -0
  584. package/scaffold/general/agents/Implementer.agent.md +33 -0
  585. package/scaffold/general/agents/Orchestrator.agent.md +149 -0
  586. package/scaffold/general/agents/Planner.agent.md +79 -0
  587. package/scaffold/general/agents/README.md +57 -0
  588. package/scaffold/general/agents/Refactor.agent.md +36 -0
  589. package/scaffold/general/agents/Researcher-Alpha.agent.md +20 -0
  590. package/scaffold/general/agents/Researcher-Beta.agent.md +20 -0
  591. package/scaffold/general/agents/Researcher-Delta.agent.md +20 -0
  592. package/scaffold/general/agents/Researcher-Gamma.agent.md +20 -0
  593. package/scaffold/general/agents/Security.agent.md +55 -0
  594. package/scaffold/general/agents/_shared/architect-reviewer-base.md +60 -0
  595. package/scaffold/general/agents/_shared/code-agent-base.md +262 -0
  596. package/scaffold/general/agents/_shared/code-reviewer-base.md +64 -0
  597. package/scaffold/general/agents/_shared/decision-protocol.md +27 -0
  598. package/scaffold/general/agents/_shared/forge-protocol.md +90 -0
  599. package/scaffold/general/agents/_shared/researcher-base.md +101 -0
  600. package/scaffold/general/agents/templates/adr-template.md +28 -0
  601. package/scaffold/general/agents/templates/execution-state.md +26 -0
  602. package/scaffold/general/prompts/ask.prompt.md +21 -0
  603. package/scaffold/general/prompts/debug.prompt.md +25 -0
  604. package/scaffold/general/prompts/design.prompt.md +23 -0
  605. package/scaffold/general/prompts/implement.prompt.md +26 -0
  606. package/scaffold/general/prompts/plan.prompt.md +25 -0
  607. package/scaffold/general/prompts/review.prompt.md +32 -0
  608. package/scaffold/general/skills/adr-skill/SKILL.md +329 -0
  609. package/scaffold/general/skills/adr-skill/assets/templates/adr-madr.md +89 -0
  610. package/scaffold/general/skills/adr-skill/assets/templates/adr-readme.md +20 -0
  611. package/scaffold/general/skills/adr-skill/assets/templates/adr-simple.md +46 -0
  612. package/scaffold/general/skills/adr-skill/references/adr-conventions.md +95 -0
  613. package/scaffold/general/skills/adr-skill/references/examples.md +193 -0
  614. package/scaffold/general/skills/adr-skill/references/review-checklist.md +77 -0
  615. package/scaffold/general/skills/adr-skill/references/template-variants.md +52 -0
  616. package/scaffold/general/skills/adr-skill/scripts/bootstrap_adr.js +259 -0
  617. package/scaffold/general/skills/adr-skill/scripts/new_adr.js +391 -0
  618. package/scaffold/general/skills/adr-skill/scripts/set_adr_status.js +169 -0
  619. package/scaffold/general/skills/aikit/SKILL.md +521 -0
  620. package/scaffold/general/skills/brainstorming/SKILL.md +259 -0
  621. package/scaffold/general/skills/brainstorming/scripts/frame-template.html +365 -0
  622. package/scaffold/general/skills/brainstorming/scripts/helper.js +216 -0
  623. package/scaffold/general/skills/brainstorming/scripts/server.cjs +9 -0
  624. package/scaffold/general/skills/brainstorming/scripts/server.src.cjs +249 -0
  625. package/scaffold/general/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  626. package/scaffold/general/skills/brainstorming/visual-companion.md +430 -0
  627. package/scaffold/general/skills/c4-architecture/SKILL.md +295 -0
  628. package/scaffold/general/skills/c4-architecture/references/advanced-patterns.md +552 -0
  629. package/scaffold/general/skills/c4-architecture/references/c4-syntax.md +492 -0
  630. package/scaffold/general/skills/c4-architecture/references/common-mistakes.md +437 -0
  631. package/scaffold/general/skills/lesson-learned/SKILL.md +105 -0
  632. package/scaffold/general/skills/lesson-learned/references/anti-patterns.md +55 -0
  633. package/scaffold/general/skills/lesson-learned/references/se-principles.md +109 -0
  634. package/scaffold/general/skills/multi-agents-development/SKILL.md +435 -0
  635. package/scaffold/general/skills/multi-agents-development/architecture-review-prompt.md +81 -0
  636. package/scaffold/general/skills/multi-agents-development/code-quality-review-prompt.md +91 -0
  637. package/scaffold/general/skills/multi-agents-development/implementer-prompt.md +93 -0
  638. package/scaffold/general/skills/multi-agents-development/parallel-dispatch-example.md +167 -0
  639. package/scaffold/general/skills/multi-agents-development/spec-review-prompt.md +81 -0
  640. package/scaffold/general/skills/present/SKILL.md +424 -0
  641. package/scaffold/general/skills/requirements-clarity/SKILL.md +324 -0
  642. package/scaffold/general/skills/session-handoff/SKILL.md +189 -0
  643. package/scaffold/general/skills/session-handoff/references/handoff-template.md +139 -0
  644. package/scaffold/general/skills/session-handoff/references/resume-checklist.md +80 -0
  645. package/scaffold/general/skills/session-handoff/scripts/check_staleness.js +269 -0
  646. package/scaffold/general/skills/session-handoff/scripts/create_handoff.js +299 -0
  647. package/scaffold/general/skills/session-handoff/scripts/list_handoffs.js +113 -0
  648. package/scaffold/general/skills/session-handoff/scripts/validate_handoff.js +241 -0
  649. package/scaffold/generate.mjs +82 -0
@@ -0,0 +1,3 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{createTaskRunner as t}from"../task-manager.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";const a=r(`tools`);function o(r,o,s,c,l,u){let d=e(`reindex`);r.registerTool(`reindex`,{title:d.title,description:`Trigger re-indexing of the knowledge base. Can do incremental (only changed files) or full re-index.`,inputSchema:{full:n.boolean().default(!1).describe(`If true, force full re-index ignoring file hashes`)},annotations:d.annotations},async({full:e},n)=>{try{if(o.isIndexing)return{content:[{type:`text`,text:`## Reindex Already in Progress
2
+
3
+ A reindex operation is currently running. Search and other tools continue to work with existing data. Use \`status({})\` to check when it completes.`}]};let r=t(n).createTask(`Reindex`,1);r.progress(0,`Starting ${e?`full`:`incremental`} reindex`),a.info(`Starting background re-index`,{mode:e?`full`:`incremental`});let d=e=>t=>{t.phase===`chunking`&&t.currentFile&&a.debug(`Re-index progress`,{prefix:e,current:t.filesProcessed+1,total:t.filesTotal,file:t.currentFile})};return(e?o.reindexAll(s,d(`Reindex`)):o.index(s,d(`Index`))).then(async e=>{if(a.info(`Background re-index complete`,{filesProcessed:e.filesProcessed,chunksCreated:e.chunksCreated,durationMs:e.durationMs}),r.complete(`Reindex complete: ${e.filesProcessed} files, ${e.chunksCreated} chunks in ${e.durationMs}ms`),l)try{await l.createFtsIndex(),a.info(`FTS index rebuilt after reindex`)}catch(e){a.warn(`FTS index rebuild failed`,i(e))}try{let e=await c.reindexAll();a.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){a.warn(`Curated re-index failed`,i(e))}if(u)try{await u.notifyAfterReindex()}catch(e){a.warn(`Post-reindex resource notification failed`,i(e))}}).catch(e=>{r.fail(`Reindex failed: ${e instanceof Error?e.message:String(e)}`),a.error(`Background reindex failed`,i(e))}),{content:[{type:`text`,text:`## Reindex Started (Background)\n\n- **Mode**: ${e?`Full`:`Incremental`}\n- Search and other tools continue to work with existing data during reindex.\n- Completion will be logged. Use \`status({})\` to check index stats afterward.\n\n---\n_Next: Continue working — the reindex runs in the background._`}]}}catch(e){return a.error(`Reindex failed`,i(e)),{content:[{type:`text`,text:`Reindex failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{o as registerReindexTool};
@@ -0,0 +1,9 @@
1
+ import { CuratedKnowledgeManager } from "../curated-manager.js";
2
+ import { ResourceNotifier } from "../resources/resource-notifier.js";
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { EvolutionCollector, PolicyStore } from "../../../enterprise-bridge/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/remember.tool.d.ts
7
+ declare function registerRememberTool(server: McpServer, curated: CuratedKnowledgeManager, policyStore?: PolicyStore, evolutionCollector?: EvolutionCollector, resourceNotifier?: ResourceNotifier): void;
8
+ //#endregion
9
+ export { registerRememberTool };
@@ -0,0 +1,4 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{curatedResourceLink as t}from"../resource-links.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";const a=r(`tools`);function o(r,o,s,c,l){let u=e(`remember`);r.registerTool(`remember`,{title:u.title,description:`Store a new piece of curated knowledge. Use this to persist decisions, patterns, conventions, or any insight worth remembering across sessions.`,inputSchema:{title:n.string().min(3).max(120).describe(`Short descriptive title for the knowledge entry`),content:n.string().min(10).max(1e5).describe(`The markdown content to store`),category:n.string().regex(/^[a-z][a-z0-9-]*$/).describe(`Category slug (e.g., "decisions", "patterns", "conventions", "api-contracts")`),tags:n.array(n.string()).default([]).describe(`Optional tags for filtering`)},annotations:u.annotations},async({title:e,content:n,category:r,tags:u})=>{try{let i=await o.remember(e,n,r,u),a=``;if(s){let t=s.classify(e,n,u);c&&c.recordClassification(e,t.matchingRules.map(e=>e.ruleId),t.pushRecommended),t.matchingRules.length>0&&(a=`\n\n### Classification Signals\n${t.matchingRules.map(e=>` - **${e.ruleId}** (${e.category}, weight: ${e.pushWeight}) — matched: ${e.matchedPatterns.join(`, `)}`).join(`
2
+ `)}\n- **Push recommended**: ${t.pushRecommended?`yes`:`no`} (max weight: ${t.maxPushWeight})`,t.pushRecommended&&(a+=`
3
+
4
+ > 💡 This entry matches push rules. Consider \`er_push\` to share with Enterprise RAG.`))}l&&l.notifyAfterCuratedWrite(i.path).catch(()=>{});let d=t(i.path,e,`[${r}]`);return{content:[{type:`text`,text:`Remembered: **${e}**\n\nStored at \`.ai/curated/${i.path}\` and indexed for semantic search.${a}\n\n---\n_Next: Use \`search\` to verify the entry is findable, or \`list\` to see all curated entries._`},...d?[d]:[]]}}catch(e){return a.error(`Remember failed`,i(e)),{content:[{type:`text`,text:`Remember failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{o as registerRememberTool};
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/replay.tool.d.ts
4
+ declare function registerReplayTool(server: McpServer): void;
5
+ //#endregion
6
+ export { registerReplayTool };
@@ -0,0 +1,3 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";import{replayClear as i,replayList as a,replayTrim as o}from"../../../tools/dist/index.js";const s=n(`tools`);function c(n){let c=e(`replay`);n.registerTool(`replay`,{title:c.title,description:`View or clear the audit trail of recent MCP tool and CLI invocations. Shows tool name, duration, status, and input/output summaries.`,inputSchema:{action:t.enum([`list`,`clear`]).default(`list`).describe(`Action: "list" (default) to view entries, "clear" to wipe the log`),last:t.number().optional().describe(`Number of entries to return (default: 20, list only)`),tool:t.string().optional().describe(`Filter by tool name (list only)`),source:t.enum([`mcp`,`cli`]).optional().describe(`Filter by source: "mcp" or "cli" (list only)`),since:t.string().optional().describe(`ISO timestamp — only show entries after this time (list only)`)},annotations:c.annotations},async({action:e,last:t,tool:n,source:c,since:l})=>{try{if(e===`clear`)return i(),{content:[{type:`text`,text:`Replay log cleared.`}]};let r=a({last:t,tool:n,source:c,since:l});if(r.length===0)return{content:[{type:`text`,text:`No replay entries found. Activity is logged when tools are invoked via MCP or CLI.`}]};let s=r.map(e=>`${e.ts.split(`T`)[1]?.split(`.`)[0]??e.ts} ${e.status===`ok`?`✓`:`✗`} ${e.tool} (${e.durationMs}ms) [${e.source}]\n in: ${e.input}\n out: ${e.output}`);return o().catch(()=>{}),{content:[{type:`text`,text:`**Replay Log** (${r.length} entries)\n\n${s.join(`
2
+
3
+ `)}`}]}}catch(e){return s.error(`Replay failed`,r(e)),{content:[{type:`text`,text:`Replay failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{c as registerReplayTool};
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/restore.tool.d.ts
4
+ declare function registerRestoreTool(server: McpServer): void;
5
+ //#endregion
6
+ export { registerRestoreTool };
@@ -0,0 +1,3 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";import{listRestorePoints as i,restoreFromPoint as a}from"../../../tools/dist/index.js";const o=n(`tools`);function s(n){let s=e(`restore`);n.registerTool(`restore`,{title:s.title,description:`List and restore file snapshots taken before destructive operations (codemod, rename, forget). Use action=list to see available restore points, action=restore with an id to undo.`,inputSchema:{action:t.enum([`list`,`restore`]).describe(`list: show restore points, restore: apply a restore point`),id:t.string().optional().describe(`Restore point ID (required for action=restore)`),limit:t.number().min(1).max(50).default(10).describe(`Max restore points to list`)},annotations:s.annotations},async({action:e,id:t,limit:n})=>{try{if(e===`list`){let e=i().slice(0,n);return e.length===0?{content:[{type:`text`,text:`No restore points found.`}]}:{content:[{type:`text`,text:`## Restore Points\n\n${e.map(e=>`- **${e.id}** (${e.timestamp}) — ${e.operation}: ${e.description} (${e.files.length} files)`).join(`
2
+ `)}`}]}}if(!t)throw Error(`id is required for restore action`);let r=await a(t);return{content:[{type:`text`,text:`Restored ${r.length} files:\n${r.map(e=>`- \`${e}\``).join(`
3
+ `)}`}]}}catch(e){return o.error(`Restore failed`,r(e)),{content:[{type:`text`,text:`Restore failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{s as registerRestoreTool};
@@ -0,0 +1,11 @@
1
+ import { ISamplingClient } from "../sampling.js";
2
+ import { BridgeComponents } from "./bridge.tools.js";
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { EvolutionCollector } from "../../../enterprise-bridge/dist/index.js";
5
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
6
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
7
+
8
+ //#region packages/server/src/tools/search.tool.d.ts
9
+ declare function registerSearchTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore, graphStore?: IGraphStore, bridge?: BridgeComponents, evolutionCollector?: EvolutionCollector, samplingClient?: ISamplingClient): void;
10
+ //#endregion
11
+ export { registerSearchTool };
@@ -0,0 +1,10 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{SearchOutputSchema as t}from"../output-schemas.js";import{fanOutFtsSearch as n,fanOutSearch as r,openWorkspaceStores as i,resolveWorkspaces as a}from"../cross-workspace.js";import{curatedResourceLink as o,extractCuratedPath as s}from"../resource-links.js";import{basename as c}from"node:path";import{stat as l}from"node:fs/promises";import{z as u}from"zod";import{CONTENT_TYPES as d,KNOWLEDGE_ORIGINS as f,SOURCE_TYPES as p,computePartitionKey as m,createLogger as h,serializeError as g}from"../../../core/dist/index.js";import{bookendReorder as _,graphAugmentSearch as v,stashGet as y,truncateToTokenBudget as ee}from"../../../tools/dist/index.js";import{mergeResults as b}from"../../../enterprise-bridge/dist/index.js";const x=h(`tools`);function S(e){let t=[],n=c(process.cwd());n&&t.push(`[project: ${n}]`);let r=y(`__context_boost`);return r&&t.push(`[focus: ${r.value}]`),t.length===0?e:`${t.join(` `)} ${e}`}async function C(e,t,n,r,i){if(!e||t>=e.config.fallbackThreshold&&n.length>0)return{results:n,triggered:!1,cacheHit:!1};let a=!1;try{let t=e.cache.get(r);return t?a=!0:(t=await e.client.search(r,i),t.length>0&&e.cache.set(r,t)),t.length>0?{results:b(n,t,i).map(e=>({record:{id:`er:${e.sourcePath}`,content:e.content,sourcePath:e.source===`er`?`[ER] ${e.sourcePath}`:e.sourcePath,startLine:e.startLine??0,endLine:e.endLine??0,contentType:e.contentType??`documentation`,headingPath:e.headingPath,origin:e.source===`er`?`curated`:e.origin??`indexed`,category:e.category,tags:e.tags??[],chunkIndex:0,totalChunks:1,fileHash:``,indexedAt:new Date().toISOString(),version:1},score:e.score})),triggered:!0,cacheHit:a}:{results:n,triggered:!0,cacheHit:a}}catch(e){return x.warn(`ER fallback failed`,g(e)),{results:n,triggered:!0,cacheHit:a}}}function te(e,t,n=60){let r=new Map;for(let t=0;t<e.length;t++){let i=e[t];r.set(i.record.id,{record:i.record,score:1/(n+t+1)})}for(let e=0;e<t.length;e++){let i=t[e],a=r.get(i.record.id);a?a.score+=1/(n+e+1):r.set(i.record.id,{record:i.record,score:1/(n+e+1)})}return[...r.values()].sort((e,t)=>t.score-e.score).map(({record:e,score:t})=>({record:e,score:t}))}function w(e,t){let n=t.toLowerCase().split(/\s+/).filter(e=>e.length>=2);return n.length<2?e:e.map(e=>{let t=e.record.content.toLowerCase(),r=n.map(e=>{let n=[],r=t.indexOf(e);for(;r!==-1;)n.push(r),r=t.indexOf(e,r+1);return n});if(r.some(e=>e.length===0))return e;let i=t.length;for(let e of r[0]){let t=e,a=e+n[0].length;for(let i=1;i<r.length;i++){let o=r[i][0],s=Math.abs(o-e);for(let t=1;t<r[i].length;t++){let n=Math.abs(r[i][t]-e);n<s&&(s=n,o=r[i][t])}t=Math.min(t,o),a=Math.max(a,o+n[i].length)}i=Math.min(i,a-t)}let a=1+.25/(1+i/200);return{record:e.record,score:e.score*a}}).sort((e,t)=>t.score-e.score)}function T(e,t,n=8){let r=new Set(t.toLowerCase().split(/\s+/).filter(e=>e.length>=2)),i=new Map,a=e.length;for(let t of e){let e=new Set(t.record.content.split(/[^a-zA-Z0-9_]+/).filter(e=>e.length>=3&&!E.has(e.toLowerCase())));for(let t of e){let e=t.toLowerCase();/[_A-Z]/.test(t)&&i.set(`__id__${e}`,1)}let n=new Set(t.record.content.toLowerCase().split(/[^a-zA-Z0-9_]+/).filter(e=>e.length>=3&&!E.has(e)));for(let e of n)i.set(e,(i.get(e)??0)+1)}let o=[];for(let[e,t]of i){if(e.startsWith(`__id__`)||r.has(e)||t>a*.8)continue;let n=Math.log(a/t),s=i.has(`__id__${e}`)?1:0,c=e.length>8?.5:0;o.push({term:e,score:n+s+c})}return o.sort((e,t)=>t.score-e.score).slice(0,n).map(e=>e.term)}const E=new Set(`the.and.for.are.but.not.you.all.can.had.her.was.one.our.out.has.have.from.this.that.with.they.been.said.each.which.their.will.other.about.many.then.them.these.some.would.make.like.into.could.time.very.when.come.just.know.take.people.also.back.after.only.more.than.over.such.import.export.const.function.return.true.false.null.undefined.string.number.boolean.void.type.interface`.split(`.`));async function D(e,t){try{let n=await e.getStats();if(!n.lastIndexedAt)return;let r=new Date(n.lastIndexedAt).getTime(),i=Date.now(),a=[...new Set(t.map(e=>e.record.sourcePath))].filter(e=>!e.startsWith(`[ER]`)).slice(0,5);if(a.length===0)return;let o=0;for(let e of a)try{(await l(e)).mtimeMs>r&&o++}catch{o++}if(o>0){let e=i-r,t=Math.floor(e/6e4),n=t<1?`<1 min`:`${t} min`;return`> ⚠️ **Index may be stale** — ${o} file(s) modified since last index (${n} ago). Use \`reindex\` to refresh.`}}catch{}}function O(c,l,h,y,b,E,O){let k=e(`search`);c.registerTool(`search`,{title:k.title,description:`Search the knowledge base for code, docs, and prior decisions. Default choice for discovery. Modes: hybrid (default), semantic, keyword. For multi-strategy precision queries use find; for a known file path use lookup.`,outputSchema:t,inputSchema:{query:u.string().max(5e3).describe(`Natural language search query`),limit:u.number().min(1).max(20).default(5).describe(`Maximum results to return`),search_mode:u.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).describe(`Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)`),content_type:u.enum(d).optional().describe(`Filter by content type`),source_type:u.enum(p).optional().describe(`Coarse filter: "source" (code only), "documentation" (md, curated), "test", "config". Overrides content_type if both set.`),origin:u.enum(f).optional().describe(`Filter by knowledge origin`),category:u.string().optional().describe(`Filter by category (e.g., decisions, patterns, conventions)`),tags:u.array(u.string()).optional().describe(`Filter by tags (returns results matching ANY of the specified tags)`),min_score:u.number().min(0).max(1).default(.25).describe(`Minimum similarity score`),graph_hops:u.number().min(0).max(3).default(1).describe(`Number of graph hops to augment results with connected entities (0 = disabled, 1 = direct connections, 2-3 = deeper traversal). Default 1 provides module/symbol context automatically.`),max_tokens:u.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),dedup:u.enum([`file`,`chunk`]).default(`chunk`).describe(`Deduplication mode: "chunk" (default, show all matching chunks) or "file" (collapse chunks from same file into single result with merged line ranges)`),workspaces:u.array(u.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all registered workspaces. Only works in user-level install mode.`)},annotations:k.annotations},async({query:e,limit:t,search_mode:c,content_type:u,source_type:d,origin:f,category:p,tags:k,min_score:ne,graph_hops:A,max_tokens:j,dedup:M,workspaces:N})=>{try{let P={limit:t,minScore:ne,contentType:u,sourceType:d,origin:f,category:p,tags:k},F,I=!1,L=!1,R=``,z=S(e);if(c===`keyword`)F=await h.ftsSearch(e,P),F=F.slice(0,t);else if(c===`semantic`){let n=await l.embedQuery(z);F=await h.search(n,P);let r=await C(b,F[0]?.score??0,F,e,t);F=r.results,I=r.triggered,L=r.cacheHit}else{let n=await l.embedQuery(z),[r,i]=await Promise.all([h.search(n,{...P,limit:t*2}),h.ftsSearch(e,{...P,limit:t*2}).catch(()=>[])]);F=te(r,i).slice(0,t);let a=await C(b,r[0]?.score??0,F,e,t);F=a.results,I=a.triggered,L=a.cacheHit}E&&E.recordSearch(e,I,L),F.length>1&&(F=w(F,e));let B=``;if(N&&N.length>0){let o=a(N,m(process.cwd()));if(o.length>0){let{stores:a,closeAll:s}=await i(o);try{let i;i=c===`keyword`?await n(a,e,{...P,limit:t}):await r(a,await l.embedQuery(e),{...P,limit:t});for(let e of i)F.push({record:{...e.record,sourcePath:`[${e.workspace}] ${e.record.sourcePath}`},score:e.score});F=F.sort((e,t)=>t.score-e.score).slice(0,t),B=` + ${o.length} workspace(s)`}finally{await s()}}}if(M===`file`&&F.length>1){let e=new Map;for(let t of F){let n=t.record.sourcePath,r=e.get(n);r?(t.score>r.best.score&&(r.best=t),r.ranges.push({start:t.record.startLine,end:t.record.endLine})):e.set(n,{best:t,ranges:[{start:t.record.startLine,end:t.record.endLine}]})}F=[...e.values()].sort((e,t)=>t.best.score-e.best.score).map(({best:e,ranges:t})=>({record:{...e.record,content:t.length>1?`${e.record.content}\n\n_Matched ${t.length} sections: ${t.sort((e,t)=>e.start-t.start).map(e=>`L${e.start}-${e.end}`).join(`, `)}_`:e.record.content},score:e.score}))}if(F.length===0){if(O?.available)try{let t=(await O.createMessage({prompt:`The search query "${e}" returned 0 results in a code knowledge base. Suggest ONE alternative search query that might find relevant results. Reply with ONLY the alternative query, nothing else.`,systemPrompt:`You are a search query optimizer for a code knowledge base. Generate a single alternative query.`,maxTokens:100})).text.trim().split(`
2
+ `)[0].slice(0,500);if(t&&t!==e){let n=await l.embedQuery(t),r=await h.search(n,P);r.length>0&&(F=r,R=`> _Original query "${e}" returned 0 results. Auto-reformulated to "${t}"._\n\n`,x.info(`Smart search fallback succeeded`,{originalQuery:e,altQuery:t,resultCount:r.length}))}}catch(e){x.debug(`Smart search fallback failed`,{error:String(e)})}if(F.length===0)return{content:[{type:`text`,text:`No results found for the given query.`}],structuredContent:{results:[],totalResults:0,searchMode:c,query:e}}}let V,H;if(A>0&&!y&&(H="> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped."),A>0&&y)try{let e=await v(y,F.map(e=>({recordId:e.record.id,score:e.score,sourcePath:e.record.sourcePath})),{hops:A,maxPerHit:5});V=new Map;for(let t of e)if(t.graphContext.nodes.length>0){let e=t.graphContext.nodes.slice(0,5).map(e=>` - **${e.name}** (${e.type})`).join(`
3
+ `),n=t.graphContext.edges.slice(0,5).map(e=>` - ${e.fromId} —[${e.type}]→ ${e.toId}`).join(`
4
+ `),r=[`- **Graph Context** (${A} hop${A>1?`s`:``}):`];e&&r.push(` Entities:\n${e}`),n&&r.push(` Relationships:\n${n}`),V.set(t.recordId,r.join(`
5
+ `))}}catch(e){x.warn(`Graph augmentation failed`,g(e)),H=`> **Note:** Graph augmentation failed. Results shown without graph context.`}let U=Date.now();for(let e of F)if(e.record.origin===`curated`&&e.record.indexedAt){let t=U-new Date(e.record.indexedAt).getTime(),n=Math.max(0,t/864e5);e.score*=.95**n}F.sort((e,t)=>t.score-e.score),F=_(F);let W=F.map((e,t)=>{let n=e.record;return`${`### Result ${t+1} (score: ${e.score.toFixed(3)})`}\n${[`- **Source**: ${n.sourcePath}`,n.headingPath?`- **Section**: ${n.headingPath}`:null,`- **Type**: ${n.contentType}`,n.startLine?`- **Lines**: ${n.startLine}-${n.endLine}`:null,n.origin===`indexed`?null:`- **Origin**: ${n.origin}`,n.category?`- **Category**: ${n.category}`:null,n.tags?.length?`- **Tags**: ${n.tags.join(`, `)}`:null,V?.get(n.id)??null].filter(Boolean).join(`
6
+ `)}\n\n${n.content}`}).join(`
7
+
8
+ ---
9
+
10
+ `),G=(c===`hybrid`?`hybrid (vector + keyword RRF)`:c===`keyword`?`keyword (FTS)`:`semantic (vector)`)+B,K=T(F,e),q=K.length>0?`\n_Distinctive terms: ${K.map(e=>`\`${e}\``).join(`, `)}_`:``,J=await D(h,F),Y=[];if(F.length===0)Y.push("`reindex` — no results found, index may be stale"),Y.push("`find` — try federated search with glob/regex");else{let e=F[0]?.record.sourcePath;e&&Y.push(`\`lookup\` — see all chunks from \`${e}\``),Y.push("`symbol` — resolve a specific symbol from the results"),Y.push("`compact` — compress a result file for focused reading")}let X=[H?`${H}\n\n`:``,J?`${J}\n\n`:``,W,`\n\n---\n_Search mode: ${G} | ${F.length} results_${q}`,`\n_Next: ${Y.join(` | `)}_`],Z=R+X.join(``);j&&(Z=ee(Z,j));let Q=new Set,$=[];for(let e of F){if(e.record.origin!==`curated`||e.record.sourcePath.startsWith(`[`))continue;let t=s(e.record.sourcePath);if(!t)continue;let n=o(t,e.record.headingPath??t);n&&!Q.has(n.uri)&&(Q.add(n.uri),$.push(n))}return{content:[{type:`text`,text:Z},...$],structuredContent:{results:F.map(e=>({sourcePath:e.record.sourcePath,contentType:e.record.contentType,score:e.score,...e.record.headingPath?{headingPath:e.record.headingPath}:{},...e.record.startLine?{startLine:e.record.startLine}:{},...e.record.endLine?{endLine:e.record.endLine}:{},...e.record.origin===`indexed`?{}:{origin:e.record.origin},...e.record.category?{category:e.record.category}:{},...e.record.tags?.length?{tags:e.record.tags}:{}})),totalResults:F.length,searchMode:c,query:e}}}catch(e){return x.error(`Search failed`,g(e)),{content:[{type:`text`,text:`Search failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{O as registerSearchTool};
@@ -0,0 +1,20 @@
1
+ import { CuratedKnowledgeManager } from "../curated-manager.js";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { KBConfig } from "../../../core/dist/index.js";
4
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/status.tool.d.ts
7
+ interface OnboardState {
8
+ onboardComplete: boolean;
9
+ onboardTimestamp?: string;
10
+ }
11
+ declare function getScaffoldVersion(): string | null;
12
+ declare function getWorkspaceScaffoldVersion(): string | null;
13
+ /**
14
+ * Lightweight status tool registered during init — returns version info
15
+ * without needing the KB store, graph, or curated manager.
16
+ */
17
+ declare function registerEarlyStatusTool(server: McpServer): void;
18
+ declare function registerStatusTool(server: McpServer, store: IKnowledgeStore, graphStore?: IGraphStore, curated?: CuratedKnowledgeManager, onboardState?: OnboardState, config?: KBConfig): void;
19
+ //#endregion
20
+ export { OnboardState, getScaffoldVersion, getWorkspaceScaffoldVersion, registerEarlyStatusTool, registerStatusTool };
@@ -0,0 +1,3 @@
1
+ import{getGcStatus as e}from"../auto-gc.js";import{getToolTelemetry as t}from"../replay-interceptor.js";import{getToolMeta as n}from"../tool-metadata.js";import{StatusOutputSchema as r}from"../output-schemas.js";import{autoUpgradeScaffold as i,getCurrentVersion as a,getUpgradeState as o}from"../version-check.js";import{existsSync as s,readFileSync as c,statSync as l}from"node:fs";import{resolve as u}from"node:path";import{AIKIT_PATHS as d,createLogger as f,serializeError as p}from"../../../core/dist/index.js";import{WasmRuntime as m}from"../../../chunker/dist/index.js";import{homedir as h}from"node:os";const g=f(`tools`);function _(e,t,n,r=4e3){let i,a=new Promise(e=>{i=setTimeout(()=>{g.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),g.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function v(){try{let e=u(h(),`.copilot`,`.aikit-scaffold.json`);return s(e)?JSON.parse(c(e,`utf-8`)).version??null:null}catch{return null}}function y(){try{let e=u(process.cwd(),`.github`,`.aikit-scaffold.json`);return s(e)?JSON.parse(c(e,`utf-8`)).version??null:null}catch{return null}}function b(e){let t=n(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the knowledge base index.`,outputSchema:r,annotations:t.annotations},async()=>{let e=a(),t=v(),n=y(),r=t!=null&&t!==e,s=n!=null&&n!==e,c=[`## Knowledge Base Status`,``,`⏳ **KB is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${m.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||s){let a=o(),l=[];r&&l.push(`user scaffold v${t}`),s&&l.push(`workspace scaffold v${n}`);let u=l.join(`, `);a.state===`success`?c.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${u} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):a.state===`pending`?c.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${u}`,`- Auto-upgrade is running in the background…`):a.state===`failed`?(i(),c.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${u}`,`- Error: ${a.error??`unknown`}`)):(i(),c.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${u}`,`- Auto-upgrade triggered — check again shortly.`))}let l={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!m.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||s};return{content:[{type:`text`,text:c.join(`
2
+ `)}],structuredContent:l}})}function x(c,f,h,b,x,S){let C=n(`status`);c.registerTool(`status`,{title:C.title,description:`Get the current status and statistics of the knowledge base index.`,outputSchema:r,annotations:C.annotations},async()=>{let n=[];try{let r=await _(f.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),c=r.value;r.timedOut&&n.push(`⚠ Index stats timed out — values may be incomplete`);let p=await _(f.listSourcePaths(),[],`store.listSourcePaths`),g=p.value;p.timedOut&&n.push(`⚠ File listing timed out`);let C=null,w=0,T=[`## Knowledge Base Status`,``,`- **Total Records**: ${c.totalRecords}`,`- **Total Files**: ${c.totalFiles}`,`- **Last Indexed**: ${c.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(c.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...g.slice(0,50).map(e=>`- ${e}`),g.length>50?`\n... and ${g.length-50} more files`:``];if(h)try{let e=await _(h.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)n.push(`⚠ Graph stats timed out`),T.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;C={nodes:t.nodeCount,edges:t.edgeCount},T.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await _(h.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||T.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&T.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{T.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let E=S?.onboardDir??u(process.cwd(),d.aiKb),D=s(E),O=x?.onboardComplete??D;if(T.push(``,`### Onboard Status`,O?`- ✅ Complete${x?.onboardTimestamp?` (last: ${x.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${E}\``),b)try{let e=await _(b.list(),[],`curated.list`);if(e.timedOut)n.push(`⚠ Curated knowledge listing timed out`),T.push(``,`### Curated Knowledge`,`- Listing timed out`);else{let t=e.value;w=t.length,T.push(``,`### Curated Knowledge`,t.length>0?`- ${t.length} entries`:"- Empty — use `remember()` to persist decisions")}}catch{T.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let k=0;if(c.lastIndexedAt){k=new Date(c.lastIndexedAt).getTime();let e=(Date.now()-k)/(1e3*60*60);T.push(``,`### Index Freshness`,e>24?`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}{try{let e=u(process.cwd(),d.data,`stash`);if(s(e)){let t=l(e).mtimeMs;t>k&&(k=t)}}catch{}let e=[];if(b)try{let t=w>0?await b.list():[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>k&&(k=t)}e.push(...t.sort((e,t)=>new Date(t.updated).getTime()-new Date(e.updated).getTime()).slice(0,5))}catch{}let t=k>0?Date.now()-k:0;if(t>=144e5){let n=Math.floor(t/36e5);if(T.push(``,`### 🌅 Session Briefing`,`_${n}+ hours since last activity — here's what to pick up:_`,``),e.length>0){T.push(`**Recent decisions/notes:**`);for(let t of e)T.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}T.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint","- `list()` — browse all stored knowledge")}}T.push(``,`### Runtime`,`- **Tree-sitter (WASM)**: ${m.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`);let A=v(),j=y(),M=a(),N=A!=null&&A!==M,P=j!=null&&j!==M;if(N||P){let e=o(),t=[];N&&t.push(`user scaffold v${A}`),P&&t.push(`workspace scaffold v${j}`);let n=t.join(`, `);e.state===`success`?T.push(``,`### ✅ Upgrade Applied`,`- Server v${M} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?T.push(``,`### ⏳ Upgrade In Progress`,`- Server v${M} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(i(),T.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${M} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(i(),T.push(``,`### ⬆ Upgrade Available`,`- Server v${M} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}n.length>0&&T.push(``,`### ⚠ Warnings`,...n.map(e=>`- ${e}`));let F=t();if(F.length>0){let e=F.sort((e,t)=>t.callCount-e.callCount);T.push(``,`### Tool Usage This Session`,``),T.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),T.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);T.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let I=e();if(I.bufferSize>=10){let e=I.state===`healthy`?`🟢`:I.state===`degraded`?`🔴`:`🟡`;T.push(``,`### Auto-GC: ${e} ${I.state}`),T.push(`- p95 latency: ${I.p95}ms | buffer: ${I.bufferSize} samples`),I.gcCount>0&&T.push(`- GC cycles triggered: ${I.gcCount}`)}let L=T.join(`
3
+ `),R={totalRecords:c.totalRecords,totalFiles:c.totalFiles,lastIndexedAt:c.lastIndexedAt??null,onboarded:O,onboardDir:E,contentTypes:c.contentTypeBreakdown,wasmAvailable:!!m.get(),graphStats:C,curatedCount:w,serverVersion:M,scaffoldVersion:A??null,workspaceScaffoldVersion:j??null,upgradeAvailable:N||P};return{content:[{type:`text`,text:L+"\n\n---\n_Next: Use `search` to query indexed content, `graph(stats)` to explore the knowledge graph, or `reindex` to refresh the index._"}],structuredContent:R}}catch(e){return g.error(`Status failed`,p(e)),{content:[{type:`text`,text:`Status check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{v as getScaffoldVersion,y as getWorkspaceScaffoldVersion,b as registerEarlyStatusTool,x as registerStatusTool};
@@ -0,0 +1,8 @@
1
+ import { CuratedKnowledgeManager } from "../curated-manager.js";
2
+ import { ResourceNotifier } from "../resources/resource-notifier.js";
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+
5
+ //#region packages/server/src/tools/update.tool.d.ts
6
+ declare function registerUpdateTool(server: McpServer, curated: CuratedKnowledgeManager, resourceNotifier?: ResourceNotifier): void;
7
+ //#endregion
8
+ export { registerUpdateTool };
@@ -0,0 +1 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";const i=n(`tools`);function a(n,a,o){let s=e(`update`);n.registerTool(`update`,{title:s.title,description:`Update an existing curated knowledge entry. Increments version and records the reason in the changelog.`,inputSchema:{path:t.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/use-lancedb.md")`),content:t.string().min(10).max(1e5).describe(`New markdown content to replace existing content`),reason:t.string().min(3).max(1e3).describe(`Why this update is being made (recorded in changelog)`)},annotations:s.annotations},async({path:e,content:t,reason:n})=>{try{let r=await a.update(e,t,n);return o&&o.notifyAfterCuratedWrite(e).catch(()=>{}),{content:[{type:`text`,text:`Updated: \`.ai/curated/${r.path}\` → version ${r.version}\n\nReason: ${n}\n\n---\n_Next: Use \`read\` to verify the updated content, or \`search\` to test searchability._`}]}}catch(e){return i.error(`Update failed`,r(e)),{content:[{type:`text`,text:`Update failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{a as registerUpdateTool};
@@ -0,0 +1,15 @@
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 };
@@ -0,0 +1,13 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{EnvOutputSchema as t,MeasureOutputSchema as n,TimeOutputSchema as r}from"../output-schemas.js";import{z as i}from"zod";import{createLogger as a,serializeError as o}from"../../../core/dist/index.js";import{changelog as s,encode as c,envInfo as l,httpRequest as u,measure as d,regexTest as f,schemaValidate as p,snippet as m,timeUtils as h,webSearch as g}from"../../../tools/dist/index.js";const _=a(`tools`);function v(t){let n=e(`web_search`);t.registerTool(`web_search`,{title:n.title,description:`PREFERRED web search — search the web via DuckDuckGo (no API key). Pass one query or multiple for parallel searching. Returns structured results with title, URL, and snippet.`,inputSchema:{queries:i.array(i.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:i.number().min(1).max(20).default(5).describe(`Max results per query`),site:i.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`)},annotations:n.annotations},async({queries:e,limit:t,site:n})=>{let r=e,i=async e=>{let r=await g({query:e,limit:t,site:n}),i=[`## Search: ${r.query}`,``];if(r.results.length===0)i.push(`No results found.`);else for(let e of r.results)i.push(`### [${e.title}](${e.url})`,e.snippet,``);return i.join(`
2
+ `)};if(r.length===1)try{return{content:[{type:`text`,text:`${await i(r[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return _.error(`Web search failed`,o(e)),{content:[{type:`text`,text:`Web search failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let a=await Promise.allSettled(r.map(e=>i(e))),s=[],c=0;for(let e=0;e<a.length;e++){let t=a[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);_.error(`Web search failed`,{query:r[e],error:n}),s.push(`## ❌ Search failed: ${r[e]}\n\n${n}`)}}let l=`_Searched ${a.length-c}/${a.length} queries successfully._`;return s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._"),{content:[{type:`text`,text:s.join(`
3
+
4
+ `)}],...c===a.length?{isError:!0}:{}}})}function y(t){let n=e(`http`);t.registerTool(`http`,{title:n.title,description:`Make HTTP requests (GET/POST/PUT/PATCH/DELETE/HEAD) for API testing. Returns status, headers, and formatted body with timing info.`,inputSchema:{url:i.string().url().describe(`Request URL (http/https only)`),method:i.enum([`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`]).default(`GET`).describe(`HTTP method`),headers:i.record(i.string(),i.string()).optional().describe(`Request headers as key-value pairs`),body:i.string().optional().describe(`Request body (for POST/PUT/PATCH)`),timeout:i.number().min(1e3).max(6e4).default(15e3).describe(`Timeout in milliseconds`)},annotations:n.annotations},async({url:e,method:t,headers:n,body:r,timeout:i})=>{try{let a=await u({url:e,method:t,headers:n,body:r,timeout:i}),o=[`## ${t} ${e}`,``,`**Status:** ${a.status} ${a.statusText}`,`**Time:** ${a.durationMs}ms`,`**Size:** ${a.sizeBytes} bytes`,`**Content-Type:** ${a.contentType}`,``,`### Headers`,"```json",JSON.stringify(a.headers),"```",``,`### Body`,a.contentType.includes(`json`)?"```json":"```",a.body,"```"];return a.truncated&&o.push(``,`_Response truncated — total size: ${a.sizeBytes} bytes_`),{content:[{type:`text`,text:o.join(`
5
+ `)}]}}catch(e){return _.error(`HTTP request failed`,o(e)),{content:[{type:`text`,text:`HTTP request failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function b(t){let n=e(`regex_test`);t.registerTool(`regex_test`,{title:n.title,description:`Test a regex pattern against sample strings. Supports match, replace, and split modes.`,inputSchema:{pattern:i.string().max(500).describe(`Regex pattern (without delimiters)`),flags:i.string().max(10).regex(/^[gimsuy]*$/).default(``).describe(`Regex flags (g, i, m, s, etc.)`),test_strings:i.array(i.string().max(1e4)).max(50).describe(`Strings to test the pattern against`),mode:i.enum([`match`,`replace`,`split`]).default(`match`).describe(`Test mode`),replacement:i.string().optional().describe(`Replacement string (for replace mode)`)},annotations:n.annotations},async({pattern:e,flags:t,test_strings:n,mode:r,replacement:i})=>{let a=f({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(`
6
+ `)}]}})}function x(t){let n=e(`encode`);t.registerTool(`encode`,{title:n.title,description:`Encode, decode, or hash text. Supports base64, URL encoding, SHA-256, MD5, JWT decode, hex.`,inputSchema:{operation:i.enum([`base64_encode`,`base64_decode`,`url_encode`,`url_decode`,`sha256`,`md5`,`jwt_decode`,`hex_encode`,`hex_decode`]).describe(`Operation to perform`),input:i.string().max(1e6).describe(`Input text`)},annotations:n.annotations},async({operation:e,input:t})=>{try{let n=c({operation:e,input:t});return{content:[{type:`text`,text:`## ${e}\n\n**Input:** \`${t.length>100?`${t.slice(0,100)}...`:t}\`\n**Output:**\n\`\`\`\n${n.output}\n\`\`\``}]}}catch(e){return _.error(`Encode failed`,o(e)),{content:[{type:`text`,text:`Encode failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function S(t){let r=e(`measure`);t.registerTool(`measure`,{title:r.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:n,inputSchema:{path:i.string().describe(`File or directory path to measure`),extensions:i.array(i.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`)},annotations:r.annotations},async({path:e,extensions:t})=>{try{let n=await d({path:e,extensions:t}),r=[`## Code Metrics`,``,`**Files:** ${n.summary.totalFiles}`,`**Total lines:** ${n.summary.totalLines} (${n.summary.totalCodeLines} code)`,`**Functions:** ${n.summary.totalFunctions}`,`**Avg complexity:** ${n.summary.avgComplexity}`,`**Max complexity:** ${n.summary.maxComplexity.value} (${n.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of n.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);r.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}n.files.length>20&&r.push(``,`_...and ${n.files.length-20} more files_`);let i={summary:{totalFiles:n.summary.totalFiles,totalLines:n.summary.totalLines,totalCodeLines:n.summary.totalCodeLines,totalFunctions:n.summary.totalFunctions,avgComplexity:n.summary.avgComplexity,maxComplexity:{value:n.summary.maxComplexity.value,file:n.summary.maxComplexity.file}},files:n.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r.join(`
7
+ `)}],structuredContent:i}}catch(e){return _.error(`Measure failed`,o(e)),{content:[{type:`text`,text:`Measure failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function C(t){let n=e(`changelog`);t.registerTool(`changelog`,{title:n.title,description:`Generate a changelog from git history between two refs. Groups by conventional commit type.`,inputSchema:{from:i.string().max(200).describe(`Start ref (tag, SHA, HEAD~N)`),to:i.string().max(200).default(`HEAD`).describe(`End ref (default: HEAD)`),format:i.enum([`grouped`,`chronological`,`per-scope`]).default(`grouped`).describe(`Output format`),include_breaking:i.boolean().default(!0).describe(`Highlight breaking changes`),cwd:i.string().optional().describe(`Repository root or working directory`)},annotations:n.annotations},async({from:e,to:t,format:n,include_breaking:r,cwd:i})=>{try{let a=s({from:e,to:t,format:n,includeBreaking:r,cwd:i}),o=`${a.stats.total} commits (${Object.entries(a.stats.types).map(([e,t])=>`${t} ${e}`).join(`, `)})`;return{content:[{type:`text`,text:`${a.markdown}\n---\n_${o}_`}]}}catch(e){return _.error(`Changelog failed`,o(e)),{content:[{type:`text`,text:`Changelog failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function w(t){let n=e(`schema_validate`);t.registerTool(`schema_validate`,{title:n.title,description:`Validate JSON data against a JSON Schema. Supports type, required, properties, items, enum, pattern, min/max.`,inputSchema:{data:i.string().max(5e5).describe(`JSON data to validate (as string)`),schema:i.string().max(5e5).describe(`JSON Schema to validate against (as string)`)},annotations:n.annotations},async({data:e,schema:t})=>{try{let n=p({data:JSON.parse(e),schema:JSON.parse(t)});if(n.valid)return{content:[{type:`text`,text:`## Validation: PASSED
8
+
9
+ Data matches the schema.`}]};let r=[`## Validation: FAILED`,``,`**${n.errors.length} error(s):**`,``];for(let e of n.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(`
10
+ `)}]}}catch(e){return _.error(`Schema validation failed`,o(e)),{content:[{type:`text`,text:`Schema validation failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function T(t){let n=e(`snippet`);t.registerTool(`snippet`,{title:n.title,description:`Save, retrieve, search, and manage persistent code snippets/templates.`,inputSchema:{action:i.enum([`save`,`get`,`list`,`search`,`delete`]).describe(`Operation to perform`),name:i.string().optional().describe(`Snippet name (required for save/get/delete)`),language:i.string().optional().describe(`Language tag (for save)`),code:i.string().max(1e5).optional().describe(`Code content (for save)`),tags:i.array(i.string()).optional().describe(`Tags for categorization (for save)`),query:i.string().optional().describe(`Search query (for search)`)},annotations:n.annotations},async({action:e,name:t,language:n,code:r,tags:i,query:a})=>{try{let o=m({action:e,name:t,language:n,code:r,tags:i,query:a});if(`deleted`in o)return{content:[{type:`text`,text:o.deleted?`Snippet "${t}" deleted.`:`Snippet "${t}" not found.`}]};if(`snippets`in o){if(o.snippets.length===0)return{content:[{type:`text`,text:`No snippets found.`}]};let e=[`## Snippets`,``];for(let t of o.snippets){let n=t.tags.length>0?` [${t.tags.join(`, `)}]`:``;e.push(`- **${t.name}** (${t.language})${n}`)}return{content:[{type:`text`,text:e.join(`
11
+ `)}]}}let s=o,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 _.error(`Snippet failed`,o(e)),{content:[{type:`text`,text:`Snippet failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function E(n){let r=e(`env`);n.registerTool(`env`,{title:r.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:t,inputSchema:{include_env:i.boolean().default(!1).describe(`Include environment variables`),filter_env:i.string().optional().describe(`Filter env vars by name substring`),show_sensitive:i.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:r.annotations},async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=l({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## 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){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
12
+ `)}],structuredContent:a}})}function D(t){let n=e(`time`);t.registerTool(`time`,{title:n.title,description:`Parse dates, convert timezones, calculate durations, add time. Supports ISO 8601, unix timestamps, and human-readable formats.`,outputSchema:r,inputSchema:{operation:i.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:i.string().optional().describe(`Date input (ISO, unix timestamp, or parseable string). For diff: two comma-separated dates`),timezone:i.string().optional().describe(`Target timezone (e.g., "America/New_York", "Asia/Tokyo")`),duration:i.string().optional().describe(`Duration to add (e.g., "2h30m", "1d", "30s") — for add operation`)},annotations:n.annotations},async({operation:e,input:t,timezone:n,duration:r})=>{try{let i=h({operation:e,input:t,timezone:n,duration:r}),a=[`**${i.output}**`,``,`ISO: ${i.iso}`,`Unix: ${i.unix}`];i.details&&a.push(``,"```json",JSON.stringify(i.details),"```");let o={iso:i.iso,unix:i.unix,timezone:n??Intl.DateTimeFormat().resolvedOptions().timeZone,formatted:i.output};return{content:[{type:`text`,text:a.join(`
13
+ `)}],structuredContent:o}}catch(e){return _.error(`Time failed`,o(e)),{content:[{type:`text`,text:`Time failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{C as registerChangelogTool,x as registerEncodeTool,E as registerEnvTool,y as registerHttpTool,S as registerMeasureTool,b as registerRegexTestTool,w as registerSchemaValidateTool,T as registerSnippetTool,D as registerTimeTool,v as registerWebSearchTool};
@@ -0,0 +1,32 @@
1
+ //#region packages/server/src/version-check.d.ts
2
+ /**
3
+ * Non-blocking check for newer @vpxa/aikit versions on npm.
4
+ * Logs a warning to stderr if the running version is outdated.
5
+ * Auto-upgrades scaffold files when server version ≠ scaffold version.
6
+ */
7
+ declare function getCurrentVersion(): string;
8
+ /**
9
+ * Check for a newer version on npm and log a warning if outdated.
10
+ * This is fire-and-forget — it never throws and never blocks startup.
11
+ */
12
+ declare function checkForUpdates(): void;
13
+ /** Upgrade state visible to other modules (e.g. the status tool). */
14
+ type UpgradeState = 'idle' | 'pending' | 'success' | 'failed';
15
+ /** Return the current auto-upgrade state. */
16
+ declare function getUpgradeState(): {
17
+ state: UpgradeState;
18
+ error: string | null;
19
+ };
20
+ /**
21
+ * Auto-upgrade scaffold files when the running server version differs from
22
+ * the installed scaffold version. This is fire-and-forget — it never throws
23
+ * and never blocks startup. The upgrade process runs in a detached child so
24
+ * the MCP server stays responsive.
25
+ *
26
+ * State is tracked via `getUpgradeState()` so the status tool can report
27
+ * whether the upgrade is pending, succeeded, or failed without asking the
28
+ * LLM to run a terminal command.
29
+ */
30
+ declare function autoUpgradeScaffold(): void;
31
+ //#endregion
32
+ export { UpgradeState, autoUpgradeScaffold, checkForUpdates, getCurrentVersion, getUpgradeState };
@@ -0,0 +1 @@
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{createLogger as a}from"../../core/dist/index.js";import{execFile as o}from"node:child_process";import{homedir as s}from"node:os";const c=a(`server`);function l(){let e=r(n(i(import.meta.url)),`..`,`..`,`..`,`package.json`);try{return JSON.parse(t(e,`utf-8`)).version??`0.0.0`}catch{return`0.0.0`}}function u(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 d(){let e=l();fetch(`https://registry.npmjs.org/@vpxa/aikit/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&&u(e,n)<0&&c.warn(`Update available`,{currentVersion:e,latestVersion:n,updateCommand:`aikit upgrade`})}).catch(()=>{})}function f(){try{let n=r(s(),`.copilot`,`.aikit-scaffold.json`);return e(n)?JSON.parse(t(n,`utf-8`)).version??null:null}catch{return null}}function p(){try{let n=r(process.cwd(),`.github`,`.aikit-scaffold.json`);return e(n)?JSON.parse(t(n,`utf-8`)).version??null:null}catch{return null}}let m=`idle`,h=null;function g(){return{state:m,error:h}}function _(){try{let t=l(),a=f(),s=p();if(!(a!=null&&a!==t)&&!(s!=null&&s!==t)||m===`pending`||m===`success`)return;m=`pending`,h=null,c.info(`Scaffold version mismatch — auto-upgrading`,{serverVersion:t,userScaffoldVersion:a,workspaceScaffoldVersion:s});let u=r(n(i(import.meta.url)),`..`,`..`,`..`,`bin`,`aikit.mjs`);if(!e(u)){m=`failed`,h=`aikit CLI binary not found at ${u}`,c.warn(`Cannot auto-upgrade: aikit CLI binary not found`,{binPath:u});return}o(process.execPath,[u,`upgrade`],{timeout:3e4,windowsHide:!0},(e,t,n)=>{e?(m=`failed`,h=e.message,c.warn(`Auto-upgrade failed`,{error:e.message,stderr:n?.slice(0,500)})):(m=`success`,h=null,c.info(`Auto-upgrade complete`))}).unref()}catch(e){m=`failed`,h=e instanceof Error?e.message:String(e),c.warn(`Auto-upgrade check failed`,{error:h})}}export{_ as autoUpgradeScaffold,d as checkForUpdates,l as getCurrentVersion,g as getUpgradeState};
@@ -0,0 +1,118 @@
1
+ //#region packages/store/src/graph-store.interface.d.ts
2
+ /**
3
+ * Knowledge graph store abstraction — typed nodes + edges for entity-relationship storage.
4
+ * Complements the vector store: vector search finds similar content,
5
+ * graph traversal finds connected concepts.
6
+ */
7
+ /** A node in the knowledge graph (entity, concept, service, etc.) */
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;
23
+ }
24
+ /** An edge connecting two nodes */
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>;
38
+ }
39
+ /** Options for graph traversal */
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;
49
+ }
50
+ /** Result of a graph traversal */
51
+ interface GraphTraversalResult {
52
+ nodes: GraphNode[];
53
+ edges: GraphEdge[];
54
+ }
55
+ /** Graph statistics */
56
+ interface GraphStats {
57
+ nodeCount: number;
58
+ edgeCount: number;
59
+ nodeTypes: Record<string, number>;
60
+ edgeTypes: Record<string, number>;
61
+ }
62
+ /** Result of graph validation */
63
+ interface GraphValidationResult {
64
+ valid: boolean;
65
+ orphanNodes: string[];
66
+ danglingEdges: Array<{
67
+ edgeId: string;
68
+ missingNodeId: string;
69
+ }>;
70
+ stats: GraphStats;
71
+ }
72
+ /** Knowledge graph store interface */
73
+ interface IGraphStore {
74
+ /** Initialize the store (create tables, indices) */
75
+ initialize(): Promise<void>;
76
+ /** Add or update a single node */
77
+ upsertNode(node: GraphNode): Promise<void>;
78
+ /** Add or update a single edge */
79
+ upsertEdge(edge: GraphEdge): Promise<void>;
80
+ /** Batch add/update nodes */
81
+ upsertNodes(nodes: GraphNode[]): Promise<void>;
82
+ /** Batch add/update edges */
83
+ upsertEdges(edges: GraphEdge[]): Promise<void>;
84
+ /** Get a node by ID */
85
+ getNode(id: string): Promise<GraphNode | null>;
86
+ /** Get direct neighbors of a node */
87
+ getNeighbors(nodeId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
88
+ /** Multi-hop traversal from a starting node */
89
+ traverse(startId: string, options?: GraphTraversalOptions): Promise<GraphTraversalResult>;
90
+ /** Find nodes by type and/or name pattern */
91
+ findNodes(filter: {
92
+ type?: string;
93
+ namePattern?: string;
94
+ sourcePath?: string;
95
+ limit?: number;
96
+ }): Promise<GraphNode[]>;
97
+ /** Find edges by type between optional node filters */
98
+ findEdges(filter: {
99
+ type?: string;
100
+ fromId?: string;
101
+ toId?: string;
102
+ limit?: number;
103
+ }): Promise<GraphEdge[]>;
104
+ /** Delete a node and all its edges */
105
+ deleteNode(id: string): Promise<void>;
106
+ /** Delete all nodes/edges originating from a source path */
107
+ deleteBySourcePath(sourcePath: string): Promise<number>;
108
+ /** Delete all nodes and edges (full reset) */
109
+ clear(): Promise<void>;
110
+ /** Get graph statistics */
111
+ getStats(): Promise<GraphStats>;
112
+ /** Validate graph integrity — check for orphan nodes and dangling edges */
113
+ validate(): Promise<GraphValidationResult>;
114
+ /** Close the store */
115
+ close(): Promise<void>;
116
+ }
117
+ //#endregion
118
+ export { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, GraphValidationResult, IGraphStore };
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,6 @@
1
+ import { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, GraphValidationResult, 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 GraphValidationResult, type IGraphStore, type IKnowledgeStore, LanceStore, type SearchOptions, SqliteGraphStore, type StoreBackend, type StoreConfig, createStore };
@@ -0,0 +1 @@
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};
@@ -0,0 +1,44 @@
1
+ import { IKnowledgeStore, SearchOptions } from "./store.interface.js";
2
+ import { IndexStats, KnowledgeRecord, SearchResult } from "../../core/dist/index.js";
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 _draining;
11
+ private _priorityQueue;
12
+ private _normalQueue;
13
+ private _ftsReady;
14
+ private enqueueWrite;
15
+ private _drain;
16
+ constructor(options?: {
17
+ path?: string;
18
+ tableName?: string;
19
+ });
20
+ initialize(): Promise<void>;
21
+ upsert(records: KnowledgeRecord[], vectors: Float32Array[]): Promise<void>;
22
+ upsertInteractive(records: KnowledgeRecord[], vectors: Float32Array[]): Promise<void>;
23
+ private _upsertImpl;
24
+ search(queryVector: Float32Array, options?: SearchOptions): Promise<SearchResult[]>;
25
+ createFtsIndex(): Promise<void>;
26
+ private _createFtsIndexImpl;
27
+ ftsSearch(query: string, options?: SearchOptions): Promise<SearchResult[]>;
28
+ getById(id: string): Promise<KnowledgeRecord | null>;
29
+ deleteBySourcePath(sourcePath: string): Promise<number>;
30
+ private _deleteBySourcePathImpl;
31
+ deleteById(id: string): Promise<boolean>;
32
+ deleteByIdInteractive(id: string): Promise<boolean>;
33
+ private _deleteByIdImpl;
34
+ getBySourcePath(sourcePath: string): Promise<KnowledgeRecord[]>;
35
+ getStats(): Promise<IndexStats>;
36
+ listSourcePaths(): Promise<string[]>;
37
+ dropTable(): Promise<void>;
38
+ private _dropTableImpl;
39
+ close(): Promise<void>;
40
+ private buildFilterString;
41
+ private fromLanceRecord;
42
+ }
43
+ //#endregion
44
+ export { LanceStore };
@@ -0,0 +1 @@
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;_draining=!1;_priorityQueue=[];_normalQueue=[];_ftsReady=!1;enqueueWrite(e,t=!1){return new Promise((n,r)=>{let i=async()=>{try{n(await e())}catch(e){r(e)}};t?this._priorityQueue.push(i):this._normalQueue.push(i),this._drain()})}async _drain(){if(!this._draining){this._draining=!0;try{for(;this._priorityQueue.length>0||this._normalQueue.length>0;){let e=this._priorityQueue.shift()??this._normalQueue.shift();e&&await e()}}finally{this._draining=!1}}}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 upsertInteractive(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),!0)}}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(),replace:!0}),this._ftsReady=!0,u.info(`FTS index created/updated`,{column:`content`})}catch(e){u.warn(`FTS index creation failed`,i(e))}}async ftsSearch(e,n){if(!this.table||!this._ftsReady)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(e instanceof Error?e.message:String(e)).includes(`INVERTED index`)?(u.debug(`FTS search skipped — index not yet available`),this._ftsReady=!1):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 deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}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};
@@ -0,0 +1,45 @@
1
+ import { GraphEdge, GraphNode, GraphStats, GraphTraversalOptions, GraphTraversalResult, GraphValidationResult, 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
+ validate(): Promise<GraphValidationResult>;
42
+ close(): Promise<void>;
43
+ }
44
+ //#endregion
45
+ export { SqliteGraphStore };
@@ -0,0 +1,58 @@
1
+ import{AIKIT_PATHS as e}from"../../core/dist/index.js";import{existsSync as t,mkdirSync as n,readFileSync as r,writeFileSync as i}from"node:fs";import{dirname as a,join as o}from"node:path";var s=class{db=null;dbPath;dirty=!1;constructor(t){this.dbPath=o(t?.path??e.data,`graph.db`)}async initialize(){let e=a(this.dbPath);t(e)||n(e,{recursive:!0});let i=(await import(`sql.js`)).default,o=await i();if(t(this.dbPath)){let e=r(this.dbPath);this.db=new o.Database(e)}else this.db=new o.Database;this.db.run(`PRAGMA journal_mode = WAL`),this.db.exec(`PRAGMA foreign_keys = ON;`),this.db.run(`
2
+ CREATE TABLE IF NOT EXISTS nodes (
3
+ id TEXT PRIMARY KEY,
4
+ type TEXT NOT NULL,
5
+ name TEXT NOT NULL,
6
+ properties TEXT NOT NULL DEFAULT '{}',
7
+ source_record_id TEXT,
8
+ source_path TEXT,
9
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
10
+ )
11
+ `),this.db.run(`
12
+ CREATE TABLE IF NOT EXISTS edges (
13
+ id TEXT PRIMARY KEY,
14
+ from_id TEXT NOT NULL,
15
+ to_id TEXT NOT NULL,
16
+ type TEXT NOT NULL,
17
+ weight REAL DEFAULT 1.0,
18
+ properties TEXT NOT NULL DEFAULT '{}',
19
+ FOREIGN KEY (from_id) REFERENCES nodes(id) ON DELETE CASCADE,
20
+ FOREIGN KEY (to_id) REFERENCES nodes(id) ON DELETE CASCADE
21
+ )
22
+ `),this.db.run(`CREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type)`),this.db.run(`CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name)`),this.db.run(`CREATE INDEX IF NOT EXISTS idx_nodes_source_path ON nodes(source_path)`),this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(from_id)`),this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(to_id)`),this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type)`),this.persist()}ensureDb(){if(!this.db)throw Error(`Graph store not initialized — call initialize() first`);return this.db}persist(){if(!this.db)return;let e=this.db.export();try{i(this.dbPath,Buffer.from(e))}finally{this.db.exec(`PRAGMA foreign_keys = ON;`)}this.dirty=!1}markDirty(){this.dirty=!0}flushIfDirty(){this.dirty&&this.persist()}query(e,t=[]){let n=this.ensureDb().prepare(e);n.bind(t);let r=[];try{for(;n.step();)r.push(n.getAsObject())}finally{n.free()}return r}run(e,t=[]){this.ensureDb().run(e,t)}async upsertNode(e){this.run(`INSERT INTO nodes (id, type, name, properties, source_record_id, source_path, created_at)
23
+ VALUES (?, ?, ?, ?, ?, ?, ?)
24
+ ON CONFLICT(id) DO UPDATE SET
25
+ type = excluded.type, name = excluded.name, properties = excluded.properties,
26
+ source_record_id = excluded.source_record_id, source_path = excluded.source_path`,[e.id,e.type,e.name,JSON.stringify(e.properties),e.sourceRecordId??null,e.sourcePath??null,e.createdAt??new Date().toISOString()]),this.markDirty(),this.flushIfDirty()}async upsertEdge(e){this.run(`INSERT INTO edges (id, from_id, to_id, type, weight, properties)
27
+ VALUES (?, ?, ?, ?, ?, ?)
28
+ ON CONFLICT(id) DO UPDATE SET
29
+ from_id = excluded.from_id, to_id = excluded.to_id,
30
+ type = excluded.type, weight = excluded.weight, properties = excluded.properties`,[e.id,e.fromId,e.toId,e.type,e.weight??1,JSON.stringify(e.properties??{})]),this.markDirty(),this.flushIfDirty()}async upsertNodes(e){if(e.length===0)return;let t=this.ensureDb();t.run(`BEGIN TRANSACTION`);try{for(let t of e)this.run(`INSERT INTO nodes (id, type, name, properties, source_record_id, source_path, created_at)
31
+ VALUES (?, ?, ?, ?, ?, ?, ?)
32
+ ON CONFLICT(id) DO UPDATE SET
33
+ type = excluded.type, name = excluded.name, properties = excluded.properties,
34
+ source_record_id = excluded.source_record_id, source_path = excluded.source_path`,[t.id,t.type,t.name,JSON.stringify(t.properties),t.sourceRecordId??null,t.sourcePath??null,t.createdAt??new Date().toISOString()]);t.run(`COMMIT`)}catch(e){throw t.run(`ROLLBACK`),e}this.markDirty(),this.flushIfDirty()}async upsertEdges(e){if(e.length===0)return;let t=this.ensureDb();t.run(`PRAGMA foreign_keys = OFF`),t.run(`BEGIN TRANSACTION`);try{for(let t of e)this.run(`INSERT INTO edges (id, from_id, to_id, type, weight, properties)
35
+ VALUES (?, ?, ?, ?, ?, ?)
36
+ ON CONFLICT(id) DO UPDATE SET
37
+ from_id = excluded.from_id, to_id = excluded.to_id,
38
+ type = excluded.type, weight = excluded.weight, properties = excluded.properties`,[t.id,t.fromId,t.toId,t.type,t.weight??1,JSON.stringify(t.properties??{})]);t.run(`COMMIT`)}catch(e){throw t.run(`ROLLBACK`),e}finally{t.run(`PRAGMA foreign_keys = ON`)}this.markDirty(),this.flushIfDirty()}async getNode(e){let t=this.query(`SELECT * FROM nodes WHERE id = ?`,[e]);return t.length>0?l(t[0]):null}async getNeighbors(e,t){let n=t?.direction??`both`,r=t?.edgeType,i=t?.limit??50,a=[],o=[],s=new Set;if(n===`outgoing`||n===`both`){let t=`
39
+ SELECT e.id AS edge_id, e.from_id, e.to_id, e.type AS edge_type, e.weight, e.properties AS edge_props,
40
+ n.id AS node_id, n.type AS node_type, n.name AS node_name, n.properties AS node_props,
41
+ n.source_record_id AS node_src_rec, n.source_path AS node_src_path, n.created_at AS node_created
42
+ FROM edges e JOIN nodes n ON e.to_id = n.id WHERE e.from_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(d(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(f(e)))}if(n===`incoming`||n===`both`){let t=`
43
+ SELECT e.id AS edge_id, e.from_id, e.to_id, e.type AS edge_type, e.weight, e.properties AS edge_props,
44
+ n.id AS node_id, n.type AS node_type, n.name AS node_name, n.properties AS node_props,
45
+ n.source_record_id AS node_src_rec, n.source_path AS node_src_path, n.created_at AS node_created
46
+ FROM edges e JOIN nodes n ON e.from_id = n.id WHERE e.to_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(d(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(f(e)))}return{nodes:a,edges:o}}async traverse(e,t){let n=t?.maxDepth??2,r=t?.direction??`both`,i=t?.edgeType,a=t?.limit??50,o=new Map,s=new Map,c=new Set,l=[{nodeId:e,depth:0}];for(;l.length>0&&o.size<a;){let e=l.shift();if(!e||c.has(e.nodeId)||e.depth>n)continue;c.add(e.nodeId);let t=await this.getNeighbors(e.nodeId,{direction:r,edgeType:i,limit:a-o.size});for(let r of t.nodes)o.has(r.id)||(o.set(r.id,r),e.depth+1<n&&l.push({nodeId:r.id,depth:e.depth+1}));for(let e of t.edges)s.set(e.id,e)}return{nodes:[...o.values()],edges:[...s.values()]}}async findNodes(e){let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.namePattern&&(t.push(`name LIKE ?`),n.push(`%${e.namePattern}%`)),e.sourcePath&&(t.push(`source_path = ?`),n.push(e.sourcePath));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM nodes ${r} LIMIT ?`,[...n,i]).map(e=>l(e))}async findEdges(e){let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.fromId&&(t.push(`from_id = ?`),n.push(e.fromId)),e.toId&&(t.push(`to_id = ?`),n.push(e.toId));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM edges ${r} LIMIT ?`,[...n,i]).map(e=>u(e))}async deleteNode(e){let t=this.ensureDb();t.run(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e,e]),this.run(`DELETE FROM nodes WHERE id = ?`,[e]),t.run(`COMMIT`)}catch(e){throw t.run(`ROLLBACK`),e}this.markDirty(),this.flushIfDirty()}async deleteBySourcePath(e){let t=this.query(`SELECT id FROM nodes WHERE source_path = ?`,[e]);if(t.length===0)return 0;let n=this.ensureDb();n.run(`BEGIN TRANSACTION`);try{for(let e of t)this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e.id,e.id]);this.run(`DELETE FROM nodes WHERE source_path = ?`,[e]),n.run(`COMMIT`)}catch(e){throw n.run(`ROLLBACK`),e}return this.markDirty(),this.flushIfDirty(),t.length}async clear(){this.run(`DELETE FROM edges`),this.run(`DELETE FROM nodes`),this.markDirty(),this.flushIfDirty()}async getStats(){let e=this.query(`SELECT COUNT(*) as count FROM nodes`)[0]?.count??0,t=this.query(`SELECT COUNT(*) as count FROM edges`)[0]?.count??0,n=this.query(`SELECT type, COUNT(*) as count FROM nodes GROUP BY type`),r={};for(let e of n)r[e.type]=e.count;let i=this.query(`SELECT type, COUNT(*) as count FROM edges GROUP BY type`),a={};for(let e of i)a[e.type]=e.count;return{nodeCount:e,edgeCount:t,nodeTypes:r,edgeTypes:a}}async validate(){let e=await this.getStats(),t=this.query(`SELECT e.id AS edgeId,
47
+ CASE
48
+ WHEN n1.id IS NULL THEN e.from_id
49
+ WHEN n2.id IS NULL THEN e.to_id
50
+ END AS missingNodeId
51
+ FROM edges e
52
+ LEFT JOIN nodes n1 ON e.from_id = n1.id
53
+ LEFT JOIN nodes n2 ON e.to_id = n2.id
54
+ WHERE n1.id IS NULL OR n2.id IS NULL`),n=this.query(`SELECT n.id AS id
55
+ FROM nodes n
56
+ LEFT JOIN edges e1 ON n.id = e1.from_id
57
+ LEFT JOIN edges e2 ON n.id = e2.to_id
58
+ WHERE e1.id IS NULL AND e2.id IS NULL`).map(e=>e.id);return{valid:t.length===0,orphanNodes:n,danglingEdges:t,stats:e}}async close(){this.db&&=(this.flushIfDirty(),this.db.close(),null)}};function c(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function l(e){return{id:e.id,type:e.type,name:e.name,properties:c(e.properties),sourceRecordId:e.source_record_id??void 0,sourcePath:e.source_path??void 0,createdAt:e.created_at}}function u(e){return{id:e.id,fromId:e.from_id,toId:e.to_id,type:e.type,weight:e.weight??1,properties:c(e.properties)}}function d(e){return{id:e.edge_id,fromId:e.from_id,toId:e.to_id,type:e.edge_type,weight:e.weight??1,properties:c(e.edge_props??`{}`)}}function f(e){return{id:e.node_id,type:e.node_type,name:e.node_name,properties:c(e.node_props??`{}`),sourceRecordId:e.node_src_rec??void 0,sourcePath:e.node_src_path??void 0,createdAt:e.node_created}}export{s as SqliteGraphStore};
@@ -0,0 +1,12 @@
1
+ import { IKnowledgeStore } from "./store.interface.js";
2
+
3
+ //#region packages/store/src/store-factory.d.ts
4
+ type StoreBackend = 'lancedb' | 'sqlite-vec';
5
+ interface StoreConfig {
6
+ backend: StoreBackend;
7
+ path: string;
8
+ options?: Record<string, unknown>;
9
+ }
10
+ declare function createStore(config: StoreConfig): Promise<IKnowledgeStore>;
11
+ //#endregion
12
+ export { StoreBackend, StoreConfig, createStore };
@@ -0,0 +1 @@
1
+ async function e(e){switch(e.backend){case`lancedb`:{let{LanceStore:t}=await import(`./lance-store.js`);return new t({path:e.path})}default:throw Error(`Unknown store backend: "${e.backend}". Supported: lancedb`)}}export{e as createStore};