@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,15 @@
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{ERCache as i,ERClient as a,PushAdapter as o}from"../../../enterprise-bridge/dist/index.js";const s=n(`tools`);function c(e){if(!e?.enabled)return;let t=process.env.AIKIT_ER_API_KEY;if(!t){s.warn(`ER bridge enabled but AIKIT_ER_API_KEY not set; disabling`);return}return{enabled:!0,baseUrl:e.baseUrl,apiKey:t,timeoutMs:e.timeoutMs??5e3,cacheTtlMs:e.cacheTtlMs??360*60*1e3,cacheMaxEntries:e.cacheMaxEntries??100,fallbackThreshold:e.fallbackThreshold??.45}}function l(e){let t=c(e);if(t)try{let e=new a(t),n=new i({maxEntries:t.cacheMaxEntries,defaultTtl:t.cacheTtlMs}),r=new o(e);try{let e=new URL(t.baseUrl).hostname;s.info(`ER bridge initialized`,{host:e})}catch{s.info(`ER bridge initialized`)}return{client:e,cache:n,pushAdapter:r,config:t}}catch(e){s.warn(`ER bridge initialization failed`,r(e));return}}function u(n,i,a){let o=e(`er_push`);n.registerTool(`er_push`,{title:o.title,description:`Push a curated knowledge entry to Enterprise RAG. The entry is stored via ER's curated_remember tool and becomes immediately searchable in the enterprise knowledge base.`,inputSchema:{title:t.string().min(3).max(120).describe(`Title for the knowledge entry`),content:t.string().min(10).max(1e5).describe(`Markdown content to push (max 100KB)`),category:t.string().regex(/^[a-z][a-z0-9-]*$/).default(`conventions`).describe(`Category slug (e.g., "decisions", "patterns", "conventions")`),tags:t.array(t.string()).default([]).describe(`Optional tags`),rule_id:t.string().optional().describe(`ID of the classification rule that motivated this push (from remember classification signals). Improves rule effectiveness tracking.`)},annotations:o.annotations},async({title:e,content:t,category:n,tags:o,rule_id:c})=>{try{let r=`${n}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`,s=await i.pushAdapter.push(r,{title:e,content:t,category:n,tags:o});return s.pushed?(a&&a.recordPush(r,s.pushed,c),{content:[{type:`text`,text:`Pushed to ER: **${e}**\n\nRemote path: \`${s.remotePath??`unknown`}\`\nTimestamp: ${s.timestamp}\n\n---\n_Next: Use \`er_pull\` to verify the entry is searchable in ER, or \`er_sync_status\` to see push history._`}]}):(a&&a.recordPush(r,!1,c),{content:[{type:`text`,text:`ER push failed: ${s.error??`Unknown error`}\n\n_The local KB is unaffected. You can retry or check ER health with \`er_sync_status\`._`}],isError:!0})}catch(t){if(s.error(`ER push failed`,r(t)),a){let t=`${n}/${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;a.recordPush(t,!1,c)}return{content:[{type:`text`,text:`ER push failed: operation unsuccessful
2
+
3
+ _The local KB is unaffected. You can retry or check ER health with \`er_sync_status\`._`}],isError:!0}}})}function d(n,i){let a=e(`er_pull`);n.registerTool(`er_pull`,{title:a.title,description:`Explicitly search the Enterprise RAG knowledge base. Returns results from the enterprise system only (not local KB). Uses a cache with 6-hour TTL to reduce API calls.`,inputSchema:{query:t.string().min(1).max(2e3).describe(`Search query for ER knowledge base (max 2000 chars)`),max_results:t.number().min(1).max(20).default(5).describe(`Maximum results to return`),bypass_cache:t.boolean().default(!0).describe(`Skip cache and fetch fresh results from ER (default: true per DR-001)`)},annotations:a.annotations},async({query:e,max_results:t,bypass_cache:n})=>{try{if(!n){let n=i.cache.get(e);if(n)return{content:[{type:`text`,text:`${n.slice(0,t).map((e,t)=>`### Result ${t+1} (score: ${e.score.toFixed(3)}, source: ER cached)\n- **Source**: ${e.sourcePath}\n\n${e.content}`).join(`
4
+
5
+ ---
6
+
7
+ `)}\n\n---\n_Source: ER cache (${n.length} cached results) | Use \`bypass_cache: true\` for fresh results_`}]}}let r=await i.client.pull(e,t);return r.length>0&&i.cache.set(e,r),r.length===0?{content:[{type:`text`,text:`No results found in Enterprise RAG for the given query.`}]}:{content:[{type:`text`,text:`${r.map((e,t)=>`### Result ${t+1} (score: ${e.score.toFixed(3)}, source: ER)\n- **Source**: ${e.sourcePath}\n\n${e.content}`).join(`
8
+
9
+ ---
10
+
11
+ `)}\n\n---\n_Source: Enterprise RAG (${r.length} results) | Results cached for ${Math.floor(i.config.cacheTtlMs/36e5)}h_`}]}}catch(e){return s.error(`ER pull failed`,r(e)),{content:[{type:`text`,text:`ER pull failed: search request unsuccessful
12
+
13
+ _Enterprise RAG may be unavailable. Local KB search is unaffected._`}],isError:!0}}})}function f(n,i){let a=e(`er_sync_status`);n.registerTool(`er_sync_status`,{title:a.title,description:`Show the status of the Enterprise RAG bridge: health, cache stats, and push history.`,inputSchema:{check_health:t.boolean().default(!0).describe(`Whether to ping ER health endpoint (adds latency)`)},annotations:a.annotations},async({check_health:e})=>{try{let t=i.cache.stats(),n=i.pushAdapter.getStatus(),r=new URL(i.config.baseUrl),a=`${r.protocol}//${r.hostname}${r.port?`:${r.port}`:``}`,o=`_Health check skipped_`;if(e){let e=await i.client.health();o=e.healthy?`✅ Healthy (HTTP ${e.status})`:`❌ Unhealthy${e.status?` (HTTP ${e.status})`:``}`}let s=[`## ER Bridge Status
14
+ `,`**Endpoint**: \`${a}\``,`**Health**: ${o}`,`**Threshold**: ${i.config.fallbackThreshold} (vector similarity for auto-fallback)`,``,`### Cache`,`- Entries: ${t.size} / ${t.maxEntries}`,`- TTL: ${Math.floor(t.defaultTtlMs/36e5)}h`,``,`### Push History`,`- Total pushed: ${n.totalPushed}`,`- Successful: ${n.successCount}`,`- Failed: ${n.failCount}`];return n.lastPush&&s.push(`- Last push: "${n.lastPush.title}" at ${n.lastPush.pushedAt} (${n.lastPush.status})`),s.push("\n---\n_Next: Use `er_push` to send knowledge to ER, or `er_pull` to search ER._"),{content:[{type:`text`,text:s.join(`
15
+ `)}]}}catch(e){return s.error(`ER sync status failed`,r(e)),{content:[{type:`text`,text:`ER sync status failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{l as initBridgeComponents,d as registerErPullTool,u as registerErPushTool,f as registerErSyncStatusTool,c as resolveErBridgeConfig};
@@ -0,0 +1,15 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FileCache } from "../../../tools/dist/index.js";
3
+ import { IGraphStore, IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/context.tools.d.ts
7
+ declare function registerCompactTool(server: McpServer, embedder: IEmbedder, cache: FileCache, rootPath: string): void;
8
+ declare function registerScopeMapTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
9
+ declare function registerFindTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
10
+ declare function registerSymbolTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore, graphStore?: IGraphStore): void;
11
+ declare function registerFileSummaryTool(server: McpServer, cache: FileCache, rootPath: string): void;
12
+ declare function registerTraceTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
13
+ declare function registerDeadSymbolsTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
14
+ //#endregion
15
+ export { registerCompactTool, registerDeadSymbolsTool, registerFileSummaryTool, registerFindTool, registerScopeMapTool, registerSymbolTool, registerTraceTool };
@@ -0,0 +1,10 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{CompactOutputSchema as t,DeadSymbolsOutputSchema as n,FileSummaryOutputSchema as r,FindOutputSchema as i,ScopeMapOutputSchema as a,SymbolOutputSchema as o}from"../output-schemas.js";import{fanOutSearch as s,openWorkspaceStores as c,resolveWorkspaces as l}from"../cross-workspace.js";import{isAbsolute as u,resolve as d}from"node:path";import{z as f}from"zod";import{CONTENT_TYPES as p,computePartitionKey as m,createLogger as h,serializeError as g}from"../../../core/dist/index.js";import{compact as _,fileSummary as v,find as y,findDeadSymbols as b,findExamples as x,scopeMap as S,symbol as C,trace as w,truncateToTokenBudget as T}from"../../../tools/dist/index.js";const E=h(`tools:context`);function D(n,r,i,a){let o=e(`compact`);n.registerTool(`compact`,{title:o.title,description:"Compress text to relevant sections using embedding similarity (no LLM). Provide either `text` or `path` (server reads the file — saves a round-trip). Segments by paragraph/sentence/line.",outputSchema:t,inputSchema:{text:f.string().optional().describe(`The text to compress (provide this OR path, not both)`),path:f.string().optional().describe(`File path to read server-side — avoids read_file round-trip + token doubling (provide this OR text)`),query:f.string().describe(`Focus query — what are you trying to understand?`),max_chars:f.number().min(100).max(5e4).default(3e3).describe(`Target output size in characters`),segmentation:f.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split the text for scoring`),token_budget:f.number().min(50).max(12500).optional().describe(`Token budget — overrides max_chars (approx 4 chars per token). Use to fit output into a specific context window.`)},annotations:o.annotations},async({text:e,path:t,query:n,max_chars:o,segmentation:s,token_budget:c})=>{try{let l=t&&!u(t)?d(a,t):t;if(!e&&!l)return{content:[{type:`text`,text:`Error: Either "text" or "path" must be provided.`}],isError:!0};let f=await _(r,{text:e,path:l,query:n,maxChars:o,tokenBudget:c,segmentation:s,cache:i});return{content:[{type:`text`,text:[`Compressed ${f.originalChars} → ${f.compressedChars} chars (${(f.ratio*100).toFixed(0)}%)`,`Kept ${f.segmentsKept}/${f.segmentsTotal} segments`,``,f.text].join(`
2
+ `)}],structuredContent:{originalChars:f.originalChars,compressedChars:f.compressedChars,ratio:f.ratio,segmentsKept:f.segmentsKept,segmentsTotal:f.segmentsTotal}}}catch(e){return E.error(`Compact failed`,g(e)),{content:[{type:`text`,text:`Compact failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function O(t,n,r){let i=e(`scope_map`);t.registerTool(`scope_map`,{title:i.title,description:`Generate a task-scoped reading plan. Given a task description, identifies which files and sections are relevant, with estimated token counts and suggested reading order.`,outputSchema:a,inputSchema:{task:f.string().describe(`Description of the task to scope`),max_files:f.number().min(1).max(50).default(15).describe(`Maximum files to include`),content_type:f.enum(p).optional().describe(`Filter by content type`),max_tokens:f.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:i.annotations},async({task:e,max_files:t,content_type:i,max_tokens:a})=>{try{let o=await S(n,r,{task:e,maxFiles:t,contentType:i}),s=[`## Scope Map: ${e}`,`Total estimated tokens: ~${o.totalEstimatedTokens}`,``,`### Files (by relevance)`,...o.files.map((e,t)=>`${t+1}. **${e.path}** (~${e.estimatedTokens} tokens, ${(e.relevance*100).toFixed(0)}% relevant)\n ${e.reason}\n Focus: ${e.focusRanges.map(e=>`L${e.start}-${e.end}`).join(`, `)}`),``,`### Suggested Reading Order`,...o.readingOrder.map((e,t)=>`${t+1}. ${e}`),``,`### Suggested Compact Calls`,`_Estimated compressed total: ~${Math.ceil(o.totalEstimatedTokens/5)} tokens_`,...o.compactCommands.map((e,t)=>`${t+1}. ${e}`)].join(`
3
+ `)+"\n\n---\n_Next: Use `search` to dive into specific files, or `compact` to compress file contents for context._";return{content:[{type:`text`,text:a?T(s,a):s}],structuredContent:{files:o.files.map(e=>({path:e.path,relevance:e.relevance,estimatedTokens:e.estimatedTokens,...e.focusRanges.length>0?{focusLines:e.focusRanges.map(e=>`L${e.start}-${e.end}`)}:{}})),totalFiles:o.files.length,totalEstimatedTokens:o.totalEstimatedTokens,task:e}}}catch(e){return E.error(`Scope map failed`,g(e)),{content:[{type:`text`,text:`Scope map failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function k(t,n,r){let a=e(`find`);t.registerTool(`find`,{title:a.title,description:`Multi-strategy search combining vector, FTS, glob, and regex. Use for precise queries needing multiple strategies. mode=examples finds real usage of a symbol. For general discovery use search instead.`,outputSchema:i,inputSchema:{query:f.string().optional().describe(`Semantic/keyword search query (required for mode "examples")`),glob:f.string().optional().describe(`File glob pattern (search mode only)`),pattern:f.string().optional().describe(`Regex pattern to match in content (search mode only)`),limit:f.number().min(1).max(50).default(10).describe(`Max results`),content_type:f.enum(p).optional().describe(`Filter by content type`),mode:f.enum([`search`,`examples`]).default(`search`).describe(`Mode: "search" (default) for federated search, "examples" to find usage examples of a symbol/pattern`),max_tokens:f.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`),workspaces:f.array(f.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`)},annotations:a.annotations},async({query:e,glob:t,pattern:i,limit:a,content_type:o,mode:u,max_tokens:d,workspaces:f})=>{try{if(u===`examples`){if(!e)return{content:[{type:`text`,text:`Error: "query" is required for mode "examples".`}],isError:!0};let t=await x(n,r,{query:e,limit:a,contentType:o}),i=JSON.stringify(t);return{content:[{type:`text`,text:d?T(i,d):i}]}}let p=await y(n,r,{query:e,glob:t,pattern:i,limit:a,contentType:o}),h=``;if(f&&f.length>0&&e){let t=l(f,m(process.cwd()));if(t.length>0){let{stores:r,closeAll:i}=await c(t);try{let i=await s(r,await n.embedQuery(e),{limit:a,contentType:o});for(let e of i)p.results.push({path:`[${e.workspace}] ${e.record.sourcePath}`,score:e.score,source:`cross-workspace`,lineRange:e.record.startLine?{start:e.record.startLine,end:e.record.endLine}:void 0,preview:e.record.content.slice(0,200)});p.results.sort((e,t)=>t.score-e.score),p.results=p.results.slice(0,a),p.totalFound=p.results.length,h=` + ${t.length} workspace(s)`}finally{await i()}}}if(p.results.length===0)return{content:[{type:`text`,text:`No results found.${p.failedStrategies?.length?`\nStrategies attempted: ${p.strategies.join(`, `)}\nFailed: ${p.failedStrategies.map(e=>`${e.strategy} (${e.reason})`).join(`, `)}`:p.strategies.length===0?`
4
+ No search strategies were activated. Provide at least one of: query, glob, or pattern.`:``}`}],structuredContent:{matches:[],totalMatches:0,pattern:e??t??i??``,truncated:!1}};let g=[`Found ${p.totalFound} results via ${p.strategies.join(` + `)}${h}`,``,...p.results.map(e=>{let t=e.lineRange?`:${e.lineRange.start}-${e.lineRange.end}`:``,n=e.preview?`\n ${e.preview.slice(0,100)}...`:``;return`- [${e.source}] ${e.path}${t} (${(e.score*100).toFixed(0)}%)${n}`})];return{content:[{type:`text`,text:d?T(g.join(`
5
+ `),d):g.join(`
6
+ `)}],structuredContent:{matches:p.results.map(e=>({path:e.path,...e.lineRange?{line:e.lineRange.start}:{},matchType:e.source,preview:e.preview?.slice(0,200)??``})),totalMatches:p.totalFound,pattern:e??t??i??``,truncated:p.results.length<p.totalFound}}}catch(e){return E.error(`Find failed`,g(e)),{content:[{type:`text`,text:`Find failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function A(t,n,r,i){let a=e(`symbol`);t.registerTool(`symbol`,{title:a.title,description:`Find definition, imports, and references of a named symbol (function, class, type). For tracing data flow across call sites use trace instead.`,inputSchema:{name:f.string().describe(`Symbol name to look up (function, class, type, etc.)`),limit:f.number().min(1).max(50).default(20).describe(`Max results per category`),workspaces:f.array(f.string()).optional().describe(`Cross-workspace search: partition names or folder basenames to include. Use ["*"] for all. User-level mode only.`)},outputSchema:o,annotations:a.annotations},async({name:e,limit:t,workspaces:a})=>{try{let o=await C(n,r,{name:e,limit:t,graphStore:i});if(a&&a.length>0){let r=l(a,m(process.cwd()));if(r.length>0){let{stores:i,closeAll:a}=await c(r);try{for(let[r,a]of i){let i=await C(n,a,{name:e,limit:t});i.definedIn&&!o.definedIn&&(o.definedIn={...i.definedIn,path:`[${r}] ${i.definedIn.path}`});for(let e of i.referencedIn)o.referencedIn.push({...e,path:`[${r}] ${e.path}`});if(i.importedBy){o.importedBy=o.importedBy??[];for(let e of i.importedBy)o.importedBy.push({...e,path:`[${r}] ${e.path}`})}}}finally{await a()}}}let s={name:o.name,definedIn:o.definedIn??null,importedBy:o.importedBy??[],referencedIn:o.referencedIn??[],graphContext:o.graphContext??null};return{content:[{type:`text`,text:P(o)}],structuredContent:s}}catch(e){return E.error(`Symbol lookup failed`,g(e)),{content:[{type:`text`,text:`Symbol lookup failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function j(t,n,i){let a=e(`file_summary`);t.registerTool(`file_summary`,{title:a.title,description:`Create a concise structural summary of a source file: imports, exports, functions, classes, interfaces, and types.`,outputSchema:r,inputSchema:{path:f.string().describe(`Absolute path to the file to summarize`)},annotations:a.annotations},async({path:e})=>{try{let t=u(e)?e:d(i,e),r=await v({path:t,content:(await n.get(t)).content});return{content:[{type:`text`,text:F(r)}],structuredContent:{path:r.path,language:r.language,lines:r.lines,imports:r.imports?.length??0,exports:r.exports?.length??0,functions:r.functions?.length??0,classes:r.classes?.length??0}}}catch(e){return E.error(`File summary failed`,g(e)),{content:[{type:`text`,text:`File summary failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function M(t,n,r){let i=e(`trace`);t.registerTool(`trace`,{title:i.title,description:`Follow data flow forward/backward across imports and call sites from a starting symbol or file:line. For finding a single symbol definition use symbol instead.`,inputSchema:{start:f.string().describe(`Starting point — symbol name or file:line reference`),direction:f.enum([`forward`,`backward`,`both`]).describe(`Which direction to trace relationships`),max_depth:f.number().min(1).max(10).default(3).optional().describe(`Maximum trace depth`)},annotations:i.annotations},async({start:e,direction:t,max_depth:i})=>{try{let a=await w(n,r,{start:e,direction:t,maxDepth:i}),o=[`## Trace: ${a.start}`,`Direction: ${a.direction} | Depth: ${a.depth}`,``];if(a.nodes.length===0)o.push(`No connections found.`);else{let e=a.nodes.filter(e=>e.relationship===`calls`),t=a.nodes.filter(e=>e.relationship===`called-by`),n=a.nodes.filter(e=>e.relationship===`imports`),r=a.nodes.filter(e=>e.relationship===`imported-by`),i=a.nodes.filter(e=>e.relationship===`references`);if(e.length>0){o.push(`### Calls (${e.length})`);for(let t of e){let e=t.scope?` (from ${t.scope}())`:``;o.push(`- ${t.symbol}() — ${t.path}:${t.line}${e}`)}o.push(``)}if(t.length>0){o.push(`### Called by (${t.length})`);for(let e of t){let t=e.scope?` in ${e.scope}()`:``;o.push(`- ${e.symbol}()${t} — ${e.path}:${e.line}`)}o.push(``)}if(n.length>0){o.push(`### Imports (${n.length})`);for(let e of n)o.push(`- ${e.symbol} — ${e.path}:${e.line}`);o.push(``)}if(r.length>0){o.push(`### Imported by (${r.length})`);for(let e of r)o.push(`- ${e.path}:${e.line}`);o.push(``)}if(i.length>0){o.push(`### References (${i.length})`);for(let e of i)o.push(`- ${e.path}:${e.line}`);o.push(``)}}return o.push(`---`,"_Next: `symbol` for definition details | `compact` to read a referenced file | `blast_radius` for impact analysis_"),{content:[{type:`text`,text:o.join(`
7
+ `)}]}}catch(e){return E.error(`Trace failed`,g(e)),{content:[{type:`text`,text:`Trace failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function N(t,r,i){let a=e(`dead_symbols`);t.registerTool(`dead_symbols`,{title:a.title,description:`Find exported symbols that appear to be unused because they are never imported or re-exported.`,outputSchema:n,inputSchema:{path:f.string().optional().describe(`Root path to scope the search (default: cwd)`),limit:f.number().min(1).max(500).default(100).optional().describe(`Maximum exported symbols to scan`)},annotations:a.annotations},async({path:e,limit:t})=>{try{let n=await b(r,i,{rootPath:e,limit:t}),a=[`## Dead Symbol Analysis`,``,`**Exports scanned:** ${n.totalExports}`,`**Dead in source:** ${n.totalDeadSource} (actionable)`,`**Dead in docs:** ${n.totalDeadDocs} (informational — code samples in .md files)`,``];if(n.deadInSource.length>0){a.push(`### Dead in Source (actionable)`);for(let e of n.deadInSource)a.push(`- \`${e.name}\` (${e.kind}) — ${e.path}:${e.line}`);a.push(``)}if(n.deadInDocs.length>0){a.push(`### Dead in Docs (informational)`),a.push(`_${n.totalDeadDocs} symbol(s) found only in documentation code samples — not actionable dead code._`);for(let e of n.deadInDocs.slice(0,5))a.push(`- \`${e.name}\` — ${e.path}:${e.line}`);n.deadInDocs.length>5&&a.push(`- _... ${n.deadInDocs.length-5} more omitted_`)}return n.totalDeadSource>0?a.push(``,`---`,`_Next: \`codemod\` to remove ${n.totalDeadSource} unused exports | \`symbol\` to verify usage before removing_`):a.push(``,`---`,"_Next: `check` — no dead symbols found, validate types and lint_"),{content:[{type:`text`,text:a.join(`
8
+ `)}],structuredContent:{symbols:[...n.deadInSource,...n.deadInDocs].map(e=>({name:e.name,path:e.path,...e.line===void 0?{}:{line:e.line},kind:e.kind})),totalDead:n.totalDeadSource+n.totalDeadDocs}}}catch(e){return E.error(`Dead symbol scan failed`,g(e)),{content:[{type:`text`,text:`Dead symbol scan failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function P(e){let t=[`Symbol: ${e.name}`];if(e.definedIn){let n=`Defined in: ${e.definedIn.path}:${e.definedIn.line} (${e.definedIn.kind})`;e.definedIn.signature&&(n+=`\nSignature: ${e.definedIn.signature}`),t.push(n)}else t.push(`Defined in: not found`);if(t.push(``,`Imported by:`),e.importedBy.length===0)t.push(` none`);else for(let n of e.importedBy)t.push(` - ${n.path}:${n.line} ${n.importStatement}`);if(t.push(``,`Referenced in:`),e.referencedIn.length===0)t.push(` none`);else for(let n of e.referencedIn){let e=`scope`in n&&n.scope?` in ${n.scope}()`:``;t.push(` - ${n.path}:${n.line}${e} ${n.context}`)}if(e.graphContext){let n=e.graphContext;t.push(``,`Graph context:`),n.definingModule&&t.push(` Module: ${n.definingModule}`),n.importedByModules.length>0&&t.push(` Imported by modules: ${n.importedByModules.join(`, `)}`),n.siblingSymbols.length>0&&t.push(` Sibling symbols: ${n.siblingSymbols.join(`, `)}`)}return t.join(`
9
+ `)}function F(e){let t=[e.path,`Language: ${e.language}`,`Lines: ${e.lines}`,`Estimated tokens: ~${e.estimatedTokens}`,``,`Imports (${e.imports.length}):`,...I(e.imports),``,`Exports (${e.exports.length}):`,...I(e.exports),``,`Functions (${e.functions.length}):`,...I(e.functions.map(e=>`${e.name} @ line ${e.line}${e.exported?` [exported]`:``}${`signature`in e&&e.signature?` — ${e.signature}`:``}`)),``,`Classes (${e.classes.length}):`,...I(e.classes.map(e=>`${e.name} @ line ${e.line}${e.exported?` [exported]`:``}${e.signature?` — ${e.signature}`:``}`)),``,`Interfaces (${e.interfaces.length}):`,...I(e.interfaces.map(e=>`${e.name} @ line ${e.line}${`exported`in e&&e.exported?` [exported]`:``}`)),``,`Types (${e.types.length}):`,...I(e.types.map(e=>`${e.name} @ line ${e.line}${`exported`in e&&e.exported?` [exported]`:``}`))];if(`importDetails`in e&&e.importDetails&&e.importDetails.length>0){let n=e.importDetails.filter(e=>e.isExternal).length,r=e.importDetails.length-n;t.push(``,`Import breakdown: ${n} external, ${r} internal`)}if(`callEdges`in e&&e.callEdges&&e.callEdges.length>0){t.push(``,`Call edges (${e.callEdges.length} intra-file):`);for(let n of e.callEdges.slice(0,30))t.push(` - ${n.caller}() → ${n.callee}() @ line ${n.line}`);e.callEdges.length>30&&t.push(` - ... ${e.callEdges.length-30} more`)}return t.join(`
10
+ `)}function I(e){return e.length===0?[` none`]:e.map(e=>` - ${e}`)}export{D as registerCompactTool,N as registerDeadSymbolsTool,j as registerFileSummaryTool,k as registerFindTool,O as registerScopeMapTool,A as registerSymbolTool,M as registerTraceTool};
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EvolutionCollector } from "../../../enterprise-bridge/dist/index.js";
3
+
4
+ //#region packages/server/src/tools/evolution.tools.d.ts
5
+ declare function registerErEvolveReviewTool(server: McpServer, collector: EvolutionCollector): void;
6
+ //#endregion
7
+ export { registerErEvolveReviewTool };
@@ -0,0 +1,5 @@
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){let o=e(`er_evolve_review`);n.registerTool(`er_evolve_review`,{title:o.title,description:`Review evolution metrics for the KB ↔ ER bridge. Shows local miss rates, push acceptance, rule effectiveness, and top missed queries. Use this to reason about improving classification rules and knowledge flow.`,inputSchema:{include_details:t.boolean().default(!0).describe(`Include detailed breakdowns (top missed queries, rule stats)`),reset_after:t.boolean().default(!1).describe(`Reset collected metrics after review`)},annotations:o.annotations},async({include_details:e,reset_after:t})=>{try{let n=a.getMetrics(),r=[`## ER Evolution Review
2
+ `,`**Period**: ${n.period.startedAt} → ${n.period.queriedAt}`,`**Total events**: ${n.period.totalEvents}\n`,`### Search`,`- Total searches: ${n.search.totalSearches}`,`- ER fallback triggered: ${n.search.erFallbackCount} (${(n.search.erFallbackRate*100).toFixed(1)}%)`,`- ER cache hits: ${n.search.erCacheHitCount} (${(n.search.erCacheHitRate*100).toFixed(1)}% of fallbacks)`];if(e&&n.search.topMissedQueries.length>0){r.push(`
3
+ **Top missed queries** (triggered ER fallback):`);for(let e of n.search.topMissedQueries.slice(0,10)){let t=e.query.length>60?`${e.query.slice(0,57)}...`:e.query;r.push(` - "${t}" (${e.count}x)`)}}if(r.push(``,`### Push`,`- Total pushes: ${n.push.totalPushes} (${n.push.successCount} ok, ${n.push.failCount} failed)`,`- Classification match rate: ${(n.push.classificationMatchRate*100).toFixed(1)}%`,`- Push acceptance rate: ${(n.push.pushAcceptanceRate*100).toFixed(1)}%`),r.push(``,`### Rule Effectiveness`),Object.keys(n.rules.matchCounts).length>0)for(let[e,t]of Object.entries(n.rules.matchCounts)){let i=n.rules.pushCounts[e]??0,a=t>0?(i/t*100).toFixed(0):`0`;r.push(`- **${e}**: ${t} matches → ${i} pushes (${a}% conversion)`)}else r.push(`- _No rule activity recorded yet_`);if(e&&n.rules.lowConversionRules.length>0){r.push(``,`### ⚠️ Low Conversion Rules (potential false positives)`);for(let e of n.rules.lowConversionRules)r.push(`- **${e.ruleId}**: ${e.matchCount} matches, ${e.pushCount} pushes (${(e.conversionRate*100).toFixed(0)}% conversion) — consider tightening patterns`)}return r.push(``,`---`,"_Next: Use `er_update_policy` to refine rules based on these metrics, or `er_push` to share high-value knowledge._"),t&&(i.info(`Evolution metrics reset requested`,{requestedAt:new Date().toISOString(),clearedEvents:n.period.totalEvents}),a.reset(),r.push(`
4
+ _Metrics have been reset._`)),{content:[{type:`text`,text:r.join(`
5
+ `)}]}}catch(e){return i.error(`Evolution review failed`,r(e)),{content:[{type:`text`,text:`Evolution review failed: unable to compute metrics`}],isError:!0}}})}export{a as registerErEvolveReviewTool};
@@ -0,0 +1,14 @@
1
+ import { ISamplingClient } from "../sampling.js";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/execution.tools.d.ts
7
+ declare function registerCheckTool(server: McpServer): void;
8
+ declare function registerBatchTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
9
+ declare function registerEvalTool(server: McpServer): void;
10
+ declare function registerTestRunTool(server: McpServer): void;
11
+ declare function registerParseOutputTool(server: McpServer): void;
12
+ declare function registerDelegateTool(server: McpServer, samplingClient?: ISamplingClient): void;
13
+ //#endregion
14
+ export { registerBatchTool, registerCheckTool, registerDelegateTool, registerEvalTool, registerParseOutputTool, registerTestRunTool };
@@ -0,0 +1,4 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{CheckOutputSchema as t}from"../output-schemas.js";import{createTaskRunner as n}from"../task-manager.js";import{z as r}from"zod";import{CONTENT_TYPES as i,createLogger as a,serializeError as o}from"../../../core/dist/index.js";import{batch as s,check as c,delegate as l,delegateListModels as u,evaluate as d,find as f,parseOutput as p,summarizeCheckResult as m,testRun as h}from"../../../tools/dist/index.js";const g=a(`tools:execution`);function _(i){let a=e(`check`);i.registerTool(`check`,{title:a.title,description:`Run incremental typecheck (tsc) and lint (biome) on the project or specific files. Returns structured error and warning lists. Default detail level is "summary" (~300 tokens).`,inputSchema:{files:r.array(r.string()).optional().describe(`Specific files to check (if omitted, checks all)`),cwd:r.string().optional().describe(`Working directory`),skip_types:r.boolean().default(!1).describe(`Skip TypeScript typecheck`),skip_lint:r.boolean().default(!1).describe(`Skip Biome lint`),detail:r.enum([`summary`,`errors`,`full`]).default(`summary`).describe(`Output detail level: summary (default, ~300 tokens — pass/fail + counts + top errors), errors (parsed error objects), full (includes raw terminal output)`)},outputSchema:t,annotations:a.annotations},async({files:e,cwd:t,skip_types:r,skip_lint:i,detail:a},s)=>{try{let o=await c({files:e,cwd:t,skipTypes:r,skipLint:i,detail:a===`summary`?`errors`:a}),l=n(s).createTask(`Check`,2);if(l.progress(0,`tsc: ${o.tsc.errors.length} errors`),l.progress(1,`biome: ${o.biome.errors.length} errors`),l.complete(`Check ${o.passed?`passed`:`failed`}`),a===`summary`){let e=m(o),t=[];if(o.passed)t.push({tool:`test_run`,reason:`Types and lint clean — run tests next`});else{let e=o.tsc.errors[0]?.file??o.biome.errors[0]?.file;e&&t.push({tool:`symbol`,reason:`Resolve failing symbol in ${e}`,suggested_args:{name:e}}),t.push({tool:`check`,reason:`Re-check after fixing errors`,suggested_args:{detail:`errors`}})}let n=[`## Check ${e.passed?`✅ PASS`:`❌ FAIL`}`,``,`**tsc**: ${e.tsc.passed?`✅`:`❌`} ${e.tsc.errorCount} errors, ${e.tsc.warningCount} warnings`];if(e.tsc.topErrors.length>0)for(let t of e.tsc.topErrors)n.push(` - ${t}`);if(n.push(`**biome**: ${e.biome.passed?`✅`:`❌`} ${e.biome.errorCount} errors, ${e.biome.warningCount} warnings`),e.biome.topErrors.length>0)for(let t of e.biome.topErrors)n.push(` - ${t}`);if(t.length>0){n.push(``,`**Next steps:**`);for(let e of t)n.push(`- \`${e.tool}\`: ${e.reason}`)}return{content:[{type:`text`,text:n.join(`
2
+ `)}],structuredContent:{...e}}}return{content:[{type:`text`,text:JSON.stringify(o)}]}}catch(e){return g.error(`Check failed`,o(e)),{content:[{type:`text`,text:`Check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function v(t,i,a){let c=e(`batch`);t.registerTool(`batch`,{title:c.title,description:`Execute multiple built-in operations in parallel with concurrency control. Supported operation types: search, find, and check.`,inputSchema:{operations:r.array(r.object({id:r.string().describe(`Unique ID for this operation`),type:r.enum([`search`,`find`,`check`]).describe(`Built-in operation type`),args:r.record(r.string(),r.unknown()).describe(`Arguments for the operation`)})).min(1).max(100).describe(`Operations to execute`),concurrency:r.number().min(1).max(20).default(4).describe(`Max concurrent operations`)},annotations:c.annotations},async({operations:e,concurrency:t},r)=>{try{let o=await s(e,async e=>E(e,i,a),{concurrency:t}),c=n(r).createTask(`Batch`,e.length);for(let e=0;e<o.length;e++)c.progress(e,`${o[e].id}: ${o[e].status}`);return c.complete(`Batch complete: ${o.length} operations`),{content:[{type:`text`,text:JSON.stringify(o)}]}}catch(e){return g.error(`Batch failed`,o(e)),{content:[{type:`text`,text:`Batch failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function y(t){let n=e(`eval`);t.registerTool(`eval`,{title:n.title,description:`Execute a JavaScript or TypeScript snippet in a constrained VM sandbox with a timeout. Captures console output and returned values.`,inputSchema:{code:r.string().max(1e5).describe(`Code snippet to execute`),lang:r.enum([`js`,`ts`]).default(`js`).optional().describe(`Language mode: js executes directly, ts strips common type syntax first`),timeout:r.number().min(1).max(6e4).default(5e3).optional().describe(`Execution timeout in milliseconds`)},annotations:n.annotations},async({code:e,lang:t,timeout:n})=>{try{let r=d({code:e,lang:t,timeout:n});return r.success?{content:[{type:`text`,text:`Eval succeeded in ${r.durationMs}ms\n\n${r.output}`}]}:{content:[{type:`text`,text:`Eval failed in ${r.durationMs}ms: ${r.error??`Unknown error`}`}],isError:!0}}catch(e){return g.error(`Eval failed`,o(e)),{content:[{type:`text`,text:`Eval failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function b(t){let i=e(`test_run`);t.registerTool(`test_run`,{title:i.title,description:`Run Vitest for the current project or a subset of files, then return a structured summary of passing and failing tests.`,inputSchema:{files:r.array(r.string()).optional().describe(`Specific test files or patterns to run`),grep:r.string().optional().describe(`Only run tests whose names match this pattern`),cwd:r.string().optional().describe(`Working directory for the test run`)},annotations:i.annotations},async({files:e,grep:t,cwd:r},i)=>{try{let a=await h({files:e,grep:t,cwd:r}),o=n(i).createTask(`Test Run`,1),s=a.summary.passed+a.summary.failed+a.summary.skipped;return o.complete(`Tests: ${a.passed?`passed`:`failed`} (${s} tests)`),{content:[{type:`text`,text:k(a)}],isError:!a.passed}}catch(e){return g.error(`Test run failed`,o(e)),{content:[{type:`text`,text:`Test run failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function x(t){let n=e(`parse_output`);t.registerTool(`parse_output`,{title:n.title,description:`Parse structured data from build tool output. Supports tsc, vitest, biome, and git status. Auto-detects the tool or specify explicitly.`,inputSchema:{output:r.string().max(5e5).describe(`Raw output text from a build tool`),tool:r.enum([`tsc`,`vitest`,`biome`,`git-status`]).optional().describe(`Tool to parse as (auto-detects if omitted)`)},annotations:n.annotations},async({output:e,tool:t})=>{try{let n=p(e.replace(/\\n/g,`
3
+ `).replace(/\\t/g,` `),t);return{content:[{type:`text`,text:JSON.stringify(n)}]}}catch(e){return g.error(`Parse failed`,o(e)),{content:[{type:`text`,text:`Parse failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function S(t,n){let i=e(`delegate`);t.registerTool(`delegate`,{title:i.title,description:`Delegate a subtask to a local Ollama model. Use for summarization, classification, naming, or any task that can offload work from the host agent. Fails fast if Ollama is not running.`,inputSchema:{prompt:r.string().max(2e5).describe(`The task or question to send to the local model`),model:r.string().optional().describe(`Ollama model name (default: first available model)`),system:r.string().optional().describe(`System prompt for the model`),context:r.string().max(5e5).optional().describe(`Context text to include before the prompt (e.g. file contents)`),temperature:r.number().min(0).max(2).default(.3).optional().describe(`Sampling temperature (0=deterministic, default 0.3)`),timeout:r.number().min(1e3).max(6e5).default(12e4).optional().describe(`Timeout in milliseconds (default 120000)`),action:r.enum([`generate`,`list_models`]).default(`generate`).optional().describe(`Action: generate a response or list available models`)},annotations:i.annotations},async({prompt:e,model:t,system:r,context:i,temperature:a,timeout:s,action:c})=>{try{if(c===`list_models`){let e=await u();return{content:[{type:`text`,text:JSON.stringify({models:e,count:e.length,_Next:`Use delegate with a model name`},null,2)}]}}if(n?.available)try{let t=await n.createMessage({prompt:e,systemPrompt:r,context:i,maxTokens:4e3,modelPreferences:{intelligencePriority:.8,speedPriority:.5,costPriority:.3}});return{content:[{type:`text`,text:JSON.stringify({model:t.model??`sampling`,response:t.text,provider:`mcp-sampling`,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch{g.debug(`Sampling failed, falling back to Ollama`)}let o=await l({prompt:e,model:t,system:r,context:i,temperature:a,timeout:s});return o.error?{content:[{type:`text`,text:JSON.stringify({error:o.error,model:o.model,durationMs:o.durationMs},null,2)}],isError:!0}:{content:[{type:`text`,text:JSON.stringify({model:o.model,response:o.response,durationMs:o.durationMs,tokenCount:o.tokenCount,_Next:`Use the response in your workflow. stash to save it.`},null,2)}]}}catch(e){return g.error(`Delegate failed`,o(e)),{content:[{type:`text`,text:`Delegate failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}const C=r.object({query:r.string(),limit:r.number().min(1).max(20).default(5).optional(),search_mode:r.enum([`hybrid`,`semantic`,`keyword`]).default(`hybrid`).optional(),content_type:r.enum(i).optional(),origin:r.enum([`indexed`,`curated`,`produced`]).optional(),category:r.string().optional(),tags:r.array(r.string()).optional(),min_score:r.number().min(0).max(1).default(.25).optional()}),w=r.object({query:r.string().optional(),glob:r.string().optional(),pattern:r.string().optional(),limit:r.number().min(1).max(50).default(10).optional(),content_type:r.enum(i).optional(),cwd:r.string().optional()}),T=r.object({files:r.array(r.string()).optional(),cwd:r.string().optional(),skip_types:r.boolean().optional(),skip_lint:r.boolean().optional()});async function E(e,t,n){switch(e.type){case`search`:return D(t,n,C.parse(e.args));case`find`:{let r=w.parse(e.args);if(!r.query&&!r.glob&&!r.pattern)throw Error(`find operation requires query, glob, or pattern`);return f(t,n,{query:r.query,glob:r.glob,pattern:r.pattern,limit:r.limit,contentType:r.content_type,cwd:r.cwd})}case`check`:{let t=T.parse(e.args);return c({files:t.files,cwd:t.cwd,skipTypes:t.skip_types,skipLint:t.skip_lint})}default:throw Error(`Unsupported batch operation type: ${e.type}`)}}async function D(e,t,n){let r=n.limit??5,i={limit:r,minScore:n.min_score??.25,contentType:n.content_type,origin:n.origin,category:n.category,tags:n.tags},a=e.embedQuery?.bind(e)??e.embed.bind(e);if(n.search_mode===`keyword`)return(await t.ftsSearch(n.query,i)).slice(0,r);let o=await a(n.query);if(n.search_mode===`semantic`)return t.search(o,i);let[s,c]=await Promise.all([t.search(o,{...i,limit:r*2}),t.ftsSearch(n.query,{...i,limit:r*2})]);return O(s,c).slice(0,r)}function O(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);if(a){a.score+=1/(n+e+1);continue}r.set(i.record.id,{record:i.record,score:1/(n+e+1)})}return[...r.values()].sort((e,t)=>t.score-e.score)}function k(e){let t=[`Vitest run: ${e.passed?`passed`:`failed`}`,`Duration: ${e.durationMs}ms`,`Passed: ${e.summary.passed}`,`Failed: ${e.summary.failed}`,`Skipped: ${e.summary.skipped}`];e.summary.suites!==void 0&&t.push(`Suites: ${e.summary.suites}`);let n=e.summary.tests.filter(e=>e.status===`fail`);if(n.length>0){t.push(``,`Failed tests:`);for(let e of n)t.push(`- ${e.name}${e.file?` (${e.file})`:``}`),e.error&&t.push(` ${e.error}`)}return t.join(`
4
+ `)}export{v as registerBatchTool,_ as registerCheckTool,S as registerDelegateTool,y as registerEvalTool,x as registerParseOutputTool,b as registerTestRunTool};
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KBConfig } from "../../../core/dist/index.js";
3
+
4
+ //#region packages/server/src/tools/flow.tools.d.ts
5
+ declare function registerFlowTools(server: McpServer, config: KBConfig): void;
6
+ //#endregion
7
+ export { registerFlowTools };
@@ -0,0 +1 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{join as t}from"node:path";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";const a=r(`flow-tools`);function o(e){return{content:[{type:`text`,text:e}]}}function s(e){return e instanceof Error?e.message:String(e)}function c(r,c){let l=t(c.sources[0].path,`.aikit-state`,`flows`),u=t(l,`registry.json`),d=t(l,`state.json`);async function f(){let{FlowRegistryManager:e,FlowStateMachine:t}=await import(`../../../flows/dist/index.js`);return{registry:new e(u),stateMachine:new t(d)}}let p=e(`flow_list`);r.registerTool(`flow_list`,{title:p.title,description:`List all installed flows and their steps`,annotations:p.annotations,inputSchema:{}},async()=>{try{let{registry:e,stateMachine:t}=await f(),n=e.list(),r=t.getStatus(),i={flows:n.map(e=>({name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)})),activeFlow:r.success&&r.data?{flow:r.data.flow,status:r.data.status,currentStep:r.data.currentStep}:null};return o(JSON.stringify(i,null,2))}catch(e){return a.error(`flow_list failed`,i(e)),o(`Error: ${s(e)}`)}});let m=e(`flow_info`);r.registerTool(`flow_info`,{title:m.title,description:`Show detailed information about a specific flow`,annotations:m.annotations,inputSchema:{name:n.string().describe(`Flow name to get info for`)}},async({name:e})=>{try{let{registry:t}=await f(),n=t.get(e);if(!n)return o(`Flow "${e}" not found. Use flow_list to see available flows.`);let r={name:n.name,version:n.version,description:n.manifest.description,source:n.source,sourceType:n.sourceType,format:n.format,installPath:n.installPath,registeredAt:n.registeredAt,updatedAt:n.updatedAt,steps:n.manifest.steps.map(e=>({id:e.id,name:e.name,skill:e.skill,produces:e.produces,requires:e.requires,description:e.description})),agents:n.manifest.agents,artifactsDir:n.manifest.artifacts_dir,install:n.manifest.install};return o(JSON.stringify(r,null,2))}catch(e){return a.error(`flow_info failed`,i(e)),o(`Error: ${s(e)}`)}});let h=e(`flow_start`);r.registerTool(`flow_start`,{title:h.title,description:`Start a flow. Sets the active flow and positions at the first step.`,annotations:h.annotations,inputSchema:{flow:n.string().describe(`Flow name to start (use flow_list to see options)`)}},async({flow:e})=>{try{let{registry:t,stateMachine:n}=await f(),r=t.get(e);if(!r)return o(`Flow "${e}" not found. Use flow_list to see available flows.`);let i=n.start(r.name,r.manifest);if(!i.success||!i.data)return o(`Cannot start: ${i.error}`);let a=i.data,s=r.manifest.steps.find(e=>e.id===a.currentStep),c={started:!0,flow:a.flow,currentStep:a.currentStep,currentStepSkill:s?.skill??null,currentStepDescription:s?.description??null,totalSteps:r.manifest.steps.length,stepSequence:r.manifest.steps.map(e=>e.id),artifactsDir:r.manifest.artifacts_dir};return o(JSON.stringify(c,null,2))}catch(e){return a.error(`flow_start failed`,i(e)),o(`Error: ${s(e)}`)}});let g=e(`flow_step`);r.registerTool(`flow_step`,{title:g.title,description:`Advance the active flow: complete current step and move to next, skip current step, or redo current step.`,annotations:g.annotations,inputSchema:{action:n.enum([`next`,`skip`,`redo`]).describe(`next: mark current step done and advance. skip: skip current step. redo: repeat current step.`)}},async({action:e})=>{try{let{registry:t,stateMachine:n}=await f(),r=n.load();if(!r)return o(`No active flow. Use flow_start first.`);let i=t.get(r.flow);if(!i)return o(`Flow "${r.flow}" not found in registry.`);let a=n.step(e,i.manifest);if(!a.success||!a.data)return o(`Cannot ${e}: ${a.error}`);let s=a.data,c=s.currentStep?i.manifest.steps.find(e=>e.id===s.currentStep):null,l={flow:s.flow,status:s.status,action:e,currentStep:s.currentStep,currentStepSkill:c?.skill??null,currentStepDescription:c?.description??null,completedSteps:s.completedSteps,skippedSteps:s.skippedSteps,totalSteps:i.manifest.steps.length,remaining:i.manifest.steps.filter(e=>!s.completedSteps.includes(e.id)&&!s.skippedSteps.includes(e.id)&&e.id!==s.currentStep).map(e=>e.id)};return o(JSON.stringify(l,null,2))}catch(e){return a.error(`flow_step failed`,i(e)),o(`Error: ${s(e)}`)}});let _=e(`flow_status`);r.registerTool(`flow_status`,{title:_.title,description:`Show the current flow execution state — which flow is active, current step, completed steps, and artifacts.`,annotations:_.annotations,inputSchema:{}},async()=>{try{let{registry:e,stateMachine:t}=await f(),n=t.getStatus();if(!n.success||!n.data)return o(`No active flow. Use flow_start to begin one, or flow_list to see available flows.`);let r=n.data,i=e.get(r.flow),a=i?.manifest.steps.find(e=>e.id===r.currentStep),s={flow:r.flow,status:r.status,currentStep:r.currentStep,currentStepSkill:a?.skill??null,currentStepDescription:a?.description??null,completedSteps:r.completedSteps,skippedSteps:r.skippedSteps,artifacts:r.artifacts,startedAt:r.startedAt,updatedAt:r.updatedAt,totalSteps:i?.manifest.steps.length??0,progress:i?`${r.completedSteps.length+r.skippedSteps.length}/${i.manifest.steps.length}`:`unknown`};return o(JSON.stringify(s,null,2))}catch(e){return a.error(`flow_status failed`,i(e)),o(`Error: ${s(e)}`)}});let v=e(`flow_reset`);r.registerTool(`flow_reset`,{title:v.title,description:`Reset the active flow, clearing all state. Use to start over or switch to a different flow.`,annotations:v.annotations,inputSchema:{}},async()=>{try{let{stateMachine:e}=await f(),t=e.reset();return t.success?o(`Flow state reset. Use flow_start to begin a new flow.`):o(`Reset failed: ${t.error}`)}catch(e){return a.error(`flow_reset failed`,i(e)),o(`Error: ${s(e)}`)}})}export{c as registerFlowTools};
@@ -0,0 +1,13 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FileCache } from "../../../tools/dist/index.js";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/forge.tools.d.ts
7
+ declare function registerEvidenceMapTool(server: McpServer): void;
8
+ declare function registerDigestTool(server: McpServer, embedder: IEmbedder): void;
9
+ declare function registerForgeClassifyTool(server: McpServer): void;
10
+ declare function registerStratumCardTool(server: McpServer, embedder: IEmbedder, cache: FileCache): void;
11
+ declare function registerForgeGroundTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
12
+ //#endregion
13
+ export { registerDigestTool, registerEvidenceMapTool, registerForgeClassifyTool, registerForgeGroundTool, registerStratumCardTool };
@@ -0,0 +1,10 @@
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";import{digest as a,evidenceMap as o,forgeClassify as s,forgeGround as c,stratumCard as l}from"../../../tools/dist/index.js";const u=r(`tools`);function d(t){let r=e(`evidence_map`);t.registerTool(`evidence_map`,{title:r.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:n.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:n.string().optional().describe(`Task identifier (required for all except list)`),tier:n.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:n.string().optional().describe(`Critical-path claim text (for add)`),status:n.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:n.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:n.number().optional().describe(`Entry ID (for update)`),critical_path:n.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:n.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:n.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:n.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),cwd:n.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:r.annotations},async({action:e,task_id:t,tier:n,claim:r,status:a,receipt:s,id:c,critical_path:l,unknown_type:d,safety_gate:f,retry_count:p,cwd:m})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return o({action:`create`,taskId:t,tier:n},m),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!a)throw Error(`status required for add`);let e=o({action:`add`,taskId:t,claim:r,status:a,receipt:s??``,criticalPath:l,unknownType:d,safetyGate:f},m),n=[`Added entry #${e.entry?.id} to "${t}": [${a}] ${r}`];return e.formattedMap&&n.push(``,e.formattedMap),{content:[{type:`text`,text:n.join(`
2
+ `)}]}}case`update`:{if(!t)throw Error(`task_id required for update`);if(c===void 0)throw Error(`id required for update`);if(!a)throw Error(`status required for update`);let e=o({action:`update`,taskId:t,id:c,status:a,receipt:s??``},m),n=[`Updated entry #${c} in "${t}" → ${a}`];return e.formattedMap&&n.push(``,e.formattedMap),{content:[{type:`text`,text:n.join(`
3
+ `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=o({action:`get`,taskId:t},m);return e.state?{content:[{type:`text`,text:[`## Evidence Map: ${t} (${e.state.tier})`,``,e.formattedMap??`No entries.`,``,`_${e.state.entries.length} entries — created ${e.state.createdAt}_`].join(`
4
+ `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=o({action:`gate`,taskId:t,retryCount:p},m);if(!e.gate)return{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]};let n=e.gate,r=[`## FORGE Gate: **${n.decision}**`,``,`**Reason:** ${n.reason}`,``,`**Stats:** ${n.stats.verified}V / ${n.stats.assumed}A / ${n.stats.unresolved}U (${n.stats.total} total)`];return n.warnings.length>0&&r.push(``,`**Warnings:**`,...n.warnings.map(e=>`- ⚠️ ${e}`)),n.unresolvedCritical.length>0&&r.push(``,`**Blocking entries:**`,...n.unresolvedCritical.map(e=>`- #${e.id}: ${e.claim} [${e.unknownType??`untyped`}]`)),n.safetyGates&&(r.push(``,`**Safety Gates:**`,`- Provenance: ${n.safetyGates.provenance}`,`- Commitment: ${n.safetyGates.commitment}`,`- Coverage: ${n.safetyGates.coverage}`),n.safetyGates.failures.length>0&&r.push(``,`**Safety failures:**`,...n.safetyGates.failures.map(e=>`- \u{1F6D1} ${e}`))),n.annotation&&r.push(``,`**Annotation:**`,n.annotation),e.formattedMap&&r.push(``,`---`,``,e.formattedMap),r.push(``,`---`,`_Next: ${n.decision===`YIELD`?`Proceed to implementation.`:n.decision===`HOLD`?`Resolve blocking entries, then re-run gate.`:n.decision===`HARD_BLOCK`?`Contract unknowns MUST be resolved. Use search or schema_validate.`:`Proceed with annotation — document unresolved items in delivery.`}_`),{content:[{type:`text`,text:r.join(`
5
+ `)}]}}case`list`:{let e=o({action:`list`},m);return!e.states||e.states.length===0?{content:[{type:`text`,text:`No evidence maps found.`}]}:{content:[{type:`text`,text:e.states.map(e=>`- **${e.taskId}** (${e.tier}) — ${e.entries.length} entries — ${e.updatedAt}`).join(`
6
+ `)}]}}case`delete`:if(!t)throw Error(`task_id required for delete`);return{content:[{type:`text`,text:o({action:`delete`,taskId:t},m).deleted?`Deleted evidence map "${t}".`:`Evidence map "${t}" not found.`}]}}}catch(e){return u.error(`Evidence map error`,i(e)),{content:[{type:`text`,text:`Evidence map error: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function f(t,r){let o=e(`digest`);t.registerTool(`digest`,{title:o.title,description:`Compress multiple text sources (handoffs, debates, phase summaries) into a token-budgeted digest. Jointly ranks across all sources, pins structured fields (status, files, decisions, blockers), and allocates budget by priority weight.`,inputSchema:{sources:n.array(n.object({id:n.string().describe(`Source identifier (e.g., "phase-2-handoff")`),text:n.string().max(5e5).describe(`Source text to compress`),weight:n.number().min(0).default(1).describe(`Priority weight (higher = more budget)`)})).min(1).max(20).describe(`Text sources to compress`),query:n.string().describe(`Focus query — what matters for the next step?`),max_chars:n.number().min(100).max(5e4).default(4e3).describe(`Target budget in characters`),pin_fields:n.array(n.string()).optional().describe(`Key fields to always extract (default: status, files, decisions, blockers, next)`),segmentation:n.enum([`paragraph`,`sentence`,`line`]).default(`paragraph`).describe(`How to split text for scoring`),token_budget:n.number().min(50).max(12500).optional().describe(`Token budget — overrides max_chars (approx 4 chars per token). Use to fit output into a specific context window.`)},annotations:o.annotations},async({sources:e,query:t,max_chars:n,pin_fields:o,segmentation:s,token_budget:c})=>{try{let i=await a(r,{sources:e,query:t,maxChars:c?c*4:n,pinFields:o,segmentation:s}),l=[`## Digest (${i.totalOriginalChars} → ${i.totalCompressedChars} chars, ${(i.ratio*100).toFixed(0)}%)`,``],u=Object.keys(i.fields);if(u.length>0){l.push(`### Extracted Fields`);for(let e of u){let t=i.fields[e];l.push(`**${e}:**`);for(let e of t)l.push(` - [${e.sourceId}] ${e.value}`)}l.push(``)}l.push(`### Compressed Content`,``,i.text),l.push(``,`### Source Stats`);for(let e of i.sourceStats)l.push(`- **${e.id}**: ${e.originalChars} → ${e.keptChars} chars (${e.segmentsKept}/${e.segmentsTotal} segments)`);return l.push(``,`---`,"_Next: Use the digest as compressed context for the next phase. Use `stash` to persist it if needed._"),{content:[{type:`text`,text:l.join(`
7
+ `)}]}}catch(e){return u.error(`Digest failed`,i(e)),{content:[{type:`text`,text:`Digest failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function p(t){let r=e(`forge_classify`);t.registerTool(`forge_classify`,{title:r.title,description:`Classify FORGE tier (Floor/Standard/Critical) from target files and task description. Checks blast radius, cross-package boundaries, schema/contract patterns, and security signals. Returns tier, triggers, typed unknown seeds, and ceremony guidance.`,inputSchema:{files:n.array(n.string()).min(1).max(100).describe(`Files being modified (paths)`),task:n.string().describe(`Task description`),root_path:n.string().describe(`Root path of the codebase`)},annotations:r.annotations},async({files:e,task:t,root_path:n})=>{try{let r=await s({files:e,task:t,rootPath:n}),i=[`## FORGE Classification: **${r.tier.toUpperCase()}**`,``];if(r.triggers.length>0){i.push(`### Triggers`);for(let e of r.triggers)i.push(`- **${e.rule}** (${e.source}): ${e.detail}`);i.push(``)}if(r.packagesCrossed.length>0&&i.push(`**Packages crossed:** ${r.packagesCrossed.join(`, `)}`),r.typedUnknownSeeds.length>0){i.push(``,`### Typed Unknown Seeds`);for(let e of r.typedUnknownSeeds)i.push(`- [${e.type}] ${e.description} → use \`${e.suggestedTool}\``)}i.push(``,`### Ceremony`);let a=r.ceremony;return i.push(`- **Ground:** ${a.ground}`,`- **Build:** ${a.build}`,`- **Break:** ${a.break}`,`- **Evidence Map:** ${a.evidenceMap}`,`- **Gate:** ${a.gate}`),i.push(``,`---`,`_Next: ${r.tier===`floor`?`Proceed directly to implementation.`:"Run `forge_ground` to execute the full Ground phase."}_`),{content:[{type:`text`,text:i.join(`
8
+ `)}]}}catch(e){return u.error(`FORGE classify failed`,i(e)),{content:[{type:`text`,text:`FORGE classify failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function m(t,r,a){let o=e(`stratum_card`);t.registerTool(`stratum_card`,{title:o.title,description:`Generate context cards from files — a compressed alternative to reading full files (10-100x token reduction). Tier 1 (T1): structure only (~100 tokens/file — imports, exports, functions). Tier 2 (T2): structure + query-relevant content (~300 tokens/file).`,inputSchema:{files:n.array(n.string()).min(1).max(50).describe(`Absolute file paths to generate cards for`),query:n.string().describe(`Current task query — guides relevance scoring`),tier:n.enum([`T1`,`T2`]).default(`T1`).describe(`Card tier: T1 = structural only, T2 = T1 + compressed content`),max_content_chars:n.number().min(100).max(5e3).default(800).describe(`For T2: max chars for compressed content section`)},annotations:o.annotations},async({files:e,query:t,tier:n,max_content_chars:o})=>{try{let i=await l(r,{files:e,query:t,tier:n,maxContentChars:o,cache:a}),s=[`## STRATUM Cards (${n}) — ${i.cards.length} files`,`Total: ~${i.totalTokenEstimate} tokens (was ~${i.totalOriginalTokenEstimate}, ${(i.compressionRatio*100).toFixed(0)}% of original)`,``];for(let e of i.cards)s.push(e.card,``);return s.push(`---`,"_Next: Use these cards as context instead of reading full files. Use `compact` for deeper content extraction on specific files._"),{content:[{type:`text`,text:s.join(`
9
+ `)}]}}catch(e){return u.error(`STRATUM cards failed`,i(e)),{content:[{type:`text`,text:`STRATUM cards failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function h(r,a,o){let s=e(`forge_ground`);r.registerTool(`forge_ground`,{title:s.title,description:`Execute the complete FORGE Ground phase in a single call. Chains: tier classification → scope map → typed unknown seeds → constraint loading → file summaries → evidence map creation. Replaces 5-15 manual tool calls.`,inputSchema:{task:n.string().describe(`Task description`),files:n.array(n.string()).min(1).max(100).describe(`Target files being modified (absolute paths)`),root_path:n.string().describe(`Root path of the codebase`),max_constraints:n.number().min(0).max(10).default(3).describe(`Max constraint entries to load from KB`),force_tier:n.enum([`floor`,`standard`,`critical`]).optional().describe(`Force a specific tier (skips auto-classification)`),task_id:n.string().optional().describe(`Custom task ID for evidence map (auto-generated if omitted)`)},annotations:s.annotations},async({task:e,files:n,root_path:r,max_constraints:s,force_tier:l,task_id:d},f)=>{try{let i=await c(a,o,{task:e,files:n,rootPath:r,maxConstraints:s,forceTier:l,taskId:d}),u=t(f).createTask(`FORGE Ground`,3);u.progress(0,`Classification: ${i.tier}`),u.progress(1,`Files analyzed: ${i.fileSummaries.length}`),u.progress(2,`Unknowns: ${i.typedUnknownSeeds.length}`),u.complete(`FORGE Ground complete: tier=${i.tier}`);let p=[`## FORGE Ground: **${i.tier.toUpperCase()}**`,`Estimated output: ~${i.estimatedTokens} tokens`,``];if(i.classifyTriggers.length>0){p.push(`### Classification Triggers`);for(let e of i.classifyTriggers)p.push(`- **${e.rule}** (${e.source}): ${e.detail}`);p.push(``)}if(i.fileSummaries.length>0){p.push(`### Target Files`);for(let e of i.fileSummaries)p.push(`- **${e.path}** (${e.lines} lines) — exports: ${e.exports.join(`, `)||`none`} — functions: ${e.functions.join(`, `)||`none`}`);p.push(``)}if(i.typedUnknownSeeds.length>0){p.push(`### Typed Unknown Seeds`);for(let e of i.typedUnknownSeeds)p.push(`- [${e.type}] ${e.description} → \`${e.suggestedTool}\``);p.push(``)}if(i.constraints.length>0){p.push(`### Constraint Seed`);for(let e of i.constraints)p.push(`- **${e.source}** (${(e.relevance*100).toFixed(0)}%): ${e.snippet}`);p.push(``)}if(i.scopeMap){p.push(`### Scope Map: ${i.scopeMap.files.length} files (~${i.scopeMap.totalEstimatedTokens} tokens)`);for(let e of i.scopeMap.files.slice(0,5))p.push(`- ${e.path} (${(e.relevance*100).toFixed(0)}%) — ${e.reason}`);i.scopeMap.files.length>5&&p.push(`- _...and ${i.scopeMap.files.length-5} more_`),p.push(``)}i.evidenceMapTaskId&&(p.push(`**Evidence Map:** \`${i.evidenceMapTaskId}\` (initialized)`),p.push(``)),p.push(`### Ceremony Guidance`);let m=i.ceremony;return p.push(`- **Ground:** ${m.ground}`,`- **Build:** ${m.build}`,`- **Break:** ${m.break}`,`- **Evidence Map:** ${m.evidenceMap}`,`- **Gate:** ${m.gate}`),p.push(``,`---`,`_Next: ${i.tier===`floor`?`Proceed to Build phase.`:"Use `evidence_map` to track claims during Build, then `evidence_map` gate after Break."}_`),{content:[{type:`text`,text:p.join(`
10
+ `)}]}}catch(e){return u.error(`FORGE Ground failed`,i(e)),{content:[{type:`text`,text:`FORGE Ground failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{f as registerDigestTool,d as registerEvidenceMapTool,p as registerForgeClassifyTool,h as registerForgeGroundTool,m as registerStratumCardTool};
@@ -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/forget.tool.d.ts
6
+ declare function registerForgetTool(server: McpServer, curated: CuratedKnowledgeManager, resourceNotifier?: ResourceNotifier): void;
7
+ //#endregion
8
+ export { registerForgetTool };
@@ -0,0 +1 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{existsSync as t,readFileSync as n}from"node:fs";import{resolve as r}from"node:path";import{z as i}from"zod";import{AIKIT_PATHS as a,createLogger as o,serializeError as s}from"../../../core/dist/index.js";import{createRestorePoint as c}from"../../../tools/dist/index.js";const l=o(`tools`);function u(o,u,d){let f=e(`forget`);o.registerTool(`forget`,{title:f.title,description:`Remove a curated knowledge entry. Deletes the file and removes it from the vector store.`,inputSchema:{path:i.string().describe(`Relative path within .ai/curated/ (e.g., "decisions/deprecated-approach.md")`),reason:i.string().min(3).describe(`Why this entry is being removed`)},annotations:f.annotations},async({path:e,reason:i})=>{try{let o=r(process.cwd(),a.aiCurated,e);if(t(o))try{c(`forget`,[{path:o,content:n(o,`utf-8`)}],`forget: ${e}`)}catch{}let s=await u.forget(e,i);return l.info(`Forgot entry`,{path:s.path,reason:i}),d&&(d.notifyAfterCuratedWrite().catch(()=>{}),d.notifyResourceListChanged().catch(()=>{})),{content:[{type:`text`,text:`Forgotten: \`.ai/curated/${s.path}\`\n\nRemoved from disk and vector store.\nReason: ${i}\n\n---\n_Next: Use \`list\` to verify removal, or \`search\` to confirm the entry is no longer returned._`}]}}catch(e){return l.error(`Forget failed`,s(e)),{content:[{type:`text`,text:`Forget failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{u as registerForgetTool};
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { IGraphStore } from "../../../store/dist/index.js";
3
+
4
+ //#region packages/server/src/tools/graph.tool.d.ts
5
+ declare function registerGraphTool(server: McpServer, graphStore: IGraphStore): void;
6
+ //#endregion
7
+ export { registerGraphTool };
@@ -0,0 +1,5 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{GraphOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{graphQuery as a}from"../../../tools/dist/index.js";const o=r(`tools`),s=n.object({id:n.string().optional().describe(`Node ID (auto-generated if omitted)`),type:n.string().describe(`Node type (entity, service, api, concept, decision)`),name:n.string().describe(`Display name`),properties:n.record(n.string(),n.unknown()).optional().describe(`Arbitrary properties`),sourceRecordId:n.string().optional().describe(`Back-link to knowledge record ID`),sourcePath:n.string().optional().describe(`Source file path`)}),c=n.object({id:n.string().optional().describe(`Edge ID (auto-generated if omitted)`),fromId:n.string().describe(`Source node ID`),toId:n.string().describe(`Target node ID`),type:n.string().describe(`Relationship type (depends-on, implements, calls, affects)`),weight:n.number().min(0).max(1).optional().describe(`Relationship weight`),properties:n.record(n.string(),n.unknown()).optional().describe(`Arbitrary properties`)});function l(r,l){let u=e(`graph`);r.registerTool(`graph`,{title:u.title,description:`Query and manage the knowledge graph. Find nodes/edges, traverse connections, add entities and relationships. The graph captures structural relationships between concepts discovered in the codebase.`,outputSchema:t,inputSchema:{action:n.enum([`find_nodes`,`find_edges`,`neighbors`,`traverse`,`stats`,`validate`,`add`,`delete`,`clear`]).describe(`Action: find_nodes (search nodes), find_edges (search edges), neighbors (direct connections), traverse (multi-hop), stats (graph overview), validate (check graph integrity), add (insert nodes/edges), delete (remove nodes), clear (remove all)`),node_type:n.string().optional().describe(`Node type filter (for find_nodes)`),name_pattern:n.string().optional().describe(`Name substring match (for find_nodes)`),source_path:n.string().optional().describe(`Source path filter`),node_id:n.string().optional().describe(`Node ID (for neighbors, traverse, delete)`),edge_type:n.string().optional().describe(`Edge type filter`),from_id:n.string().optional().describe(`Source node ID (for find_edges)`),to_id:n.string().optional().describe(`Target node ID (for find_edges)`),direction:n.enum([`outgoing`,`incoming`,`both`]).default(`both`).describe(`Traversal direction`),max_depth:n.number().min(1).max(5).default(2).describe(`Max traversal depth`),limit:n.number().min(1).max(100).default(50).describe(`Max results`),nodes:n.array(s).max(500).optional().describe(`Nodes to add (for action=add)`),edges:n.array(c).max(500).optional().describe(`Edges to add (for action=add)`)},annotations:u.annotations},async e=>{try{let t=await a(l,{action:e.action,nodeType:e.node_type,namePattern:e.name_pattern,sourcePath:e.source_path,nodeId:e.node_id,edgeType:e.edge_type,fromId:e.from_id,toId:e.to_id,direction:e.direction,maxDepth:e.max_depth,limit:e.limit,nodes:e.nodes,edges:e.edges}),n=[t.summary];if(t.nodes&&t.nodes.length>0){n.push(`
2
+ ### Nodes`);for(let e of t.nodes){let t=Object.keys(e.properties).length>0?` — ${JSON.stringify(e.properties)}`:``;n.push(`- **${e.name}** (${e.type}, id: \`${e.id}\`)${t}`)}}if(t.edges&&t.edges.length>0){n.push(`
3
+ ### Edges`);for(let e of t.edges)n.push(`- \`${e.fromId}\` —[${e.type}]→ \`${e.toId}\`${e.weight===1?``:` (weight: ${e.weight})`}`)}if(t.stats&&(n.push(`\nNode types: ${JSON.stringify(t.stats.nodeTypes)}`),n.push(`Edge types: ${JSON.stringify(t.stats.edgeTypes)}`)),t.validation){if(n.push(`
4
+ ### Validation`),n.push(`- **Valid**: ${t.validation.valid?`yes`:`no`}`),t.validation.danglingEdges.length>0){n.push(`- **Dangling edges**:`);for(let e of t.validation.danglingEdges)n.push(` - \`${e.edgeId}\` references missing node \`${e.missingNodeId}\``)}t.validation.orphanNodes.length>0&&n.push(`- **Orphan nodes**: ${t.validation.orphanNodes.map(e=>`\`${e}\``).join(`, `)}`)}return n.push("\n---\n_Next: Use `graph(traverse)` to explore connections, `graph(add)` to insert entities, or `search` with graph-augmented results._"),{content:[{type:`text`,text:n.join(`
5
+ `)}],structuredContent:{nodes:(t.nodes??[]).map(e=>({id:e.id,name:e.name,type:e.type,...e.sourcePath?{sourcePath:e.sourcePath}:{}})),edges:(t.edges??[]).map(e=>({fromId:e.fromId,toId:e.toId,type:e.type})),totalNodes:t.stats?.nodeCount??t.nodes?.length??0,totalEdges:t.stats?.edgeCount??t.edges?.length??0,query:e.action}}}catch(e){return o.error(`Graph query failed`,i(e)),{content:[{type:`text`,text:`Graph query failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{l as registerGraphTool};
@@ -0,0 +1,10 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/infra.tools.d.ts
4
+ declare function registerProcessTool(server: McpServer): void;
5
+ declare function registerWatchTool(server: McpServer): void;
6
+ declare function registerHealthTool(server: McpServer): void;
7
+ declare function registerWebFetchTool(server: McpServer): void;
8
+ declare function registerGuideTool(server: McpServer): void;
9
+ //#endregion
10
+ export { registerGuideTool, registerHealthTool, registerProcessTool, registerWatchTool, registerWebFetchTool };
@@ -0,0 +1,5 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{HealthOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{guide as a,health as o,processList as s,processLogs as c,processStart as l,processStatus as u,processStop as d,watchList as f,watchStart as p,watchStop as m,webFetch as h}from"../../../tools/dist/index.js";const g=r(`tools:infra`);function _(t){let r=e(`process`);t.registerTool(`process`,{title:r.title,description:`Start, stop, inspect, list, and tail logs for in-memory managed child processes.`,inputSchema:{action:n.enum([`start`,`stop`,`status`,`list`,`logs`]).describe(`Process action to perform`),id:n.string().optional().describe(`Managed process ID`),command:n.string().optional().describe(`Executable to start`),args:n.array(n.string()).optional().describe(`Arguments for start actions`),tail:n.number().min(1).max(500).optional().describe(`Log lines to return for logs actions`)},annotations:r.annotations},async({action:e,id:t,command:n,args:r,tail:a})=>{try{switch(e){case`start`:if(!t||!n)throw Error(`id and command are required for start`);return{content:[{type:`text`,text:JSON.stringify(l(t,n,r??[]))}]};case`stop`:if(!t)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify(d(t)??null)}]};case`status`:if(!t)throw Error(`id is required for status`);return{content:[{type:`text`,text:JSON.stringify(u(t)??null)}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(s())}]};case`logs`:if(!t)throw Error(`id is required for logs`);return{content:[{type:`text`,text:JSON.stringify(c(t,a))}]}}}catch(e){return g.error(`Process action failed`,i(e)),{content:[{type:`text`,text:`Process action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function v(t){let r=e(`watch`);t.registerTool(`watch`,{title:r.title,description:`Watch a directory for file changes (create/modify/delete). Actions: start (begin watching), stop (by ID), list (show active watchers). Events are emitted as structured JSON with path, event type, and timestamp.`,inputSchema:{action:n.enum([`start`,`stop`,`list`]).describe(`Watch action to perform`),path:n.string().optional().describe(`Directory path to watch for start actions`),id:n.string().optional().describe(`Watcher ID for stop actions`)},annotations:r.annotations},async({action:e,path:t,id:n})=>{try{switch(e){case`start`:if(!t)throw Error(`path is required for start`);return{content:[{type:`text`,text:JSON.stringify(p({path:t}))}]};case`stop`:if(!n)throw Error(`id is required for stop`);return{content:[{type:`text`,text:JSON.stringify({stopped:m(n)})}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(f())}]}}}catch(e){return g.error(`Watch action failed`,i(e)),{content:[{type:`text`,text:`Watch action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function y(r){let a=e(`health`);r.registerTool(`health`,{title:a.title,description:`Run project health checks — verifies package.json, tsconfig, scripts, lockfile, README, LICENSE, .gitignore.`,outputSchema:t,inputSchema:{path:n.string().optional().describe(`Root directory to check (defaults to cwd)`)},annotations:a.annotations},async({path:e})=>{try{let t=o(e),n={ok:t.checks.every(e=>e.status!==`fail`),checks:t.checks.map(e=>({name:e.name,ok:e.status===`pass`,message:e.message}))};return{content:[{type:`text`,text:JSON.stringify(t)}],structuredContent:n}}catch(e){return g.error(`Health check failed`,i(e)),{content:[{type:`text`,text:`Health check failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function b(t){let r=e(`web_fetch`);t.registerTool(`web_fetch`,{title:r.title,description:`PREFERRED web fetcher — fetch one or many URLs and convert to LLM-optimized markdown. Pass one URL or multiple for parallel fetching. Supports CSS selectors, 4 output modes (markdown/raw/links/outline), smart paragraph-boundary truncation. Strips scripts/styles/nav automatically.`,inputSchema:{urls:n.array(n.string().url()).min(1).max(10).describe('URLs to fetch (1–10). Single URL: `["https://..."]`. Multiple fetched in parallel.'),mode:n.enum([`markdown`,`raw`,`links`,`outline`]).default(`markdown`).describe(`Output mode: markdown (clean content), raw (HTML), links (extracted URLs), outline (heading hierarchy)`),selector:n.string().optional().describe(`CSS selector to extract a specific element instead of auto-detecting main content`),max_length:n.number().min(500).max(1e5).default(15e3).describe(`Max characters in output — truncates at paragraph boundaries`),include_metadata:n.boolean().default(!0).describe(`Include page title, description, and URL as a header`),include_links:n.boolean().default(!1).describe(`Append extracted links list at the end`),include_images:n.boolean().default(!1).describe(`Include image alt texts inline`),timeout:n.number().min(1e3).max(6e4).default(15e3).describe(`Request timeout in milliseconds`)},annotations:r.annotations},async({urls:e,mode:t,selector:n,max_length:r,include_metadata:a,include_links:o,include_images:s,timeout:c})=>{let l=e,u=async(e,i)=>{let l=await h({url:e,mode:t,selector:n,maxLength:r,includeMetadata:a,includeLinks:o,includeImages:s,timeout:c}),u=[i?`## ${i} ${l.title||`Web Page`}\n> Source: ${e}`:`## ${l.title||`Web Page`}`,``,l.content];return l.truncated&&u.push(``,`_Original length: ${l.originalLength.toLocaleString()} chars_`),u.join(`
2
+ `)};if(l.length===1)try{return{content:[{type:`text`,text:await u(l[0])+"\n\n---\n_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"}]}}catch(e){let t=e instanceof Error?e.message:String(e);return/HTTP [45]\d{2}/.test(t)?g.warn(`Web fetch failed`,{error:t}):g.error(`Web fetch failed`,i(e)),{content:[{type:`text`,text:`Web fetch failed: ${t}`}],isError:!0}}let d=l.length,f=await Promise.allSettled(l.map((e,t)=>u(e,`[${t+1}/${d}]`))),p=[],m=0;for(let e=0;e<f.length;e++){let t=f[e];if(t.status===`fulfilled`)p.push(t.value);else{m++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);/HTTP [45]\d{2}/.test(n)?g.warn(`Web fetch failed`,{url:l[e],error:n}):g.error(`Web fetch failed`,{url:l[e],...i(t.reason)}),p.push(`## ❌ Failed: ${l[e]}\n\n${n}`)}}let _=`_Fetched ${f.length-m}/${f.length} URLs successfully._`;return p.push(``,`---`,_,"_Next: Use `remember` to save key findings, or `web_fetch` with a `selector` to extract a specific section._"),{content:[{type:`text`,text:p.join(`
3
+
4
+ `)}],...m===f.length?{isError:!0}:{}}})}function x(t){let r=e(`guide`);t.registerTool(`guide`,{title:r.title,description:`Tool discovery — given a goal description, recommends which KB tools to use and in what order. Matches against 10 predefined workflows: onboard, audit, bugfix, implement, refactor, search, context, memory, validate, analyze.`,inputSchema:{goal:n.string().describe(`What you want to accomplish (e.g., "audit this monorepo", "fix a failing test")`),max_recommendations:n.number().min(1).max(10).default(5).describe(`Maximum number of tool recommendations`)},annotations:r.annotations},async({goal:e,max_recommendations:t})=>{try{let n=a(e,t),r=[`## Recommended Workflow: **${n.workflow}**`,n.description,``,`### Tools`,...n.tools.map(e=>{let t=e.suggestedArgs?` — \`${JSON.stringify(e.suggestedArgs)}\``:``;return`${e.order}. **${e.tool}** — ${e.reason}${t}`})];return n.alternativeWorkflows.length>0&&r.push(``,`_Alternative workflows: ${n.alternativeWorkflows.join(`, `)}_`),r.push(``,`---`,"_Next: Run the first recommended tool, or use `guide` again with a more specific goal._"),{content:[{type:`text`,text:r.join(`
5
+ `)}]}}catch(e){return g.error(`Guide failed`,i(e)),{content:[{type:`text`,text:`Guide failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{x as registerGuideTool,y as registerHealthTool,_ as registerProcessTool,v as registerWatchTool,b as registerWebFetchTool};
@@ -0,0 +1,7 @@
1
+ import { CuratedKnowledgeManager } from "../curated-manager.js";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+
4
+ //#region packages/server/src/tools/list.tool.d.ts
5
+ declare function registerListTool(server: McpServer, curated: CuratedKnowledgeManager): void;
6
+ //#endregion
7
+ export { registerListTool };
@@ -0,0 +1,2 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{ListOutputSchema as t}from"../output-schemas.js";import{curatedResourceLinks as n}from"../resource-links.js";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";const o=i(`tools`);function s(i,s){let c=e(`list`);i.registerTool(`list`,{title:c.title,description:`List curated knowledge entries stored via remember. Returns path, title, category, tags, and content preview for each entry. Filter by category (decisions, patterns, conventions) or tag.`,outputSchema:t,inputSchema:{category:r.string().optional().describe(`Filter by category (e.g., "decisions", "patterns")`),tag:r.string().optional().describe(`Filter by tag`)},annotations:c.annotations},async({category:e,tag:t})=>{try{let r=await s.list({category:e,tag:t}),i={entries:r.map(e=>({path:e.path,title:e.title,category:e.category,tags:e.tags,version:e.version,preview:e.contentPreview?.slice(0,120)??``})),totalCount:r.length};if(r.length===0)return{content:[{type:`text`,text:`No curated knowledge entries found.`+(e?` (category: ${e})`:``)+(t?` (tag: ${t})`:``)}],structuredContent:i};let a=r.map(e=>{let t=e.tags.length>0?` [${e.tags.join(`, `)}]`:``;return`- **${e.title}** (v${e.version})${t}\n \`${e.path}\` — ${e.contentPreview.slice(0,80)}…`}).join(`
2
+ `),o=n(r);return{content:[{type:`text`,text:`## Curated Knowledge (${r.length} entries)\n\n${a}\n\n---\n_Next: Use \`read\` to view full content of any entry, or \`remember\` to store new knowledge._`},...o],structuredContent:i}}catch(e){return o.error(`List failed`,a(e)),{content:[{type:`text`,text:`List failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{s as registerListTool};
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
3
+
4
+ //#region packages/server/src/tools/lookup.tool.d.ts
5
+ declare function registerLookupTool(server: McpServer, store: IKnowledgeStore): void;
6
+ //#endregion
7
+ export { registerLookupTool };
@@ -0,0 +1,3 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{curatedResourceLink as t,extractCuratedPath as n}from"../resource-links.js";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";const o=i(`tools`);function s(i,s){let c=e(`lookup`);i.registerTool(`lookup`,{title:c.title,description:`Get all indexed content for a known file path, sorted by position. Use when you know the exact file. For discovery across files use search.`,inputSchema:{path:r.string().describe(`Relative file path to look up (e.g., "src/index.ts")`)},annotations:c.annotations},async({path:e})=>{try{let r=await s.getBySourcePath(e);if(r.length===0)return{content:[{type:`text`,text:`No indexed content found for: ${e}`}]};r.sort((e,t)=>e.chunkIndex-t.chunkIndex);let i=`## ${e}\n**Chunks**: ${r.length} | **Type**: ${r[0].contentType}\n`,a=r.map(e=>{let t=e.startLine?` (lines ${e.startLine}-${e.endLine})`:``;return`### Chunk ${e.chunkIndex+1}/${e.totalChunks}${t}\n${e.content}`}).join(`
2
+
3
+ `),o=n(e),c=o?t(o):void 0;return{content:[{type:`text`,text:`${i}\n${a}\n\n---\n_Next: Use \`search\` to find related content, or \`analyze_dependencies\` to see what this file imports._`},...c?[c]:[]]}}catch(e){return o.error(`Lookup failed`,a(e)),{content:[{type:`text`,text:`Lookup failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{s as registerLookupTool};
@@ -0,0 +1,10 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/manipulation.tools.d.ts
4
+ declare function registerGitContextTool(server: McpServer): void;
5
+ declare function registerDiffParseTool(server: McpServer): void;
6
+ declare function registerRenameTool(server: McpServer): void;
7
+ declare function registerCodemodTool(server: McpServer): void;
8
+ declare function registerDataTransformTool(server: McpServer): void;
9
+ //#endregion
10
+ export { registerCodemodTool, registerDataTransformTool, registerDiffParseTool, registerGitContextTool, registerRenameTool };
@@ -0,0 +1,4 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{GitContextOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{codemod as a,dataTransform as o,diffParse as s,gitContext as c,rename as l}from"../../../tools/dist/index.js";const u=r(`tools:manipulation`);function d(r){let a=e(`git_context`);r.registerTool(`git_context`,{title:a.title,description:`Summarize the current Git branch, working tree state, recent commits, and optional diff statistics for the repository.`,inputSchema:{cwd:n.string().optional().describe(`Repository root or working directory`),commit_count:n.number().min(1).max(50).default(5).optional().describe(`How many recent commits to include`),include_diff:n.boolean().default(!1).optional().describe(`Include diff stat for working tree changes`)},annotations:a.annotations,outputSchema:t},async({cwd:e,commit_count:t,include_diff:n})=>{try{let r=await c({cwd:e,commitCount:t,includeDiff:n});return{content:[{type:`text`,text:g(r)}],structuredContent:{gitRoot:r.gitRoot,branch:r.branch,commitCount:r.recentCommits.length,hasUncommitted:r.status.staged.length>0||r.status.modified.length>0||r.status.untracked.length>0,recentCommits:r.recentCommits.map(e=>({hash:e.hash,message:e.message,author:e.author,date:e.date}))}}}catch(e){return u.error(`Git context failed`,i(e)),{content:[{type:`text`,text:`Git context failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function f(t){let r=e(`diff_parse`);t.registerTool(`diff_parse`,{title:r.title,description:`Parse raw unified diff text into file-level and hunk-level structural changes.`,inputSchema:{diff:n.string().max(1e6).describe(`Raw unified diff text`)},annotations:r.annotations},async({diff:e})=>{try{return{content:[{type:`text`,text:_(s({diff:e.replace(/\\n/g,`
2
+ `).replace(/\\t/g,` `)}))}]}}catch(e){return u.error(`Diff parse failed`,i(e)),{content:[{type:`text`,text:`Diff parse failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function p(t){let r=e(`rename`);t.registerTool(`rename`,{title:r.title,description:`Rename a symbol across files using whole-word regex matching for exports, imports, and general usage references.`,inputSchema:{old_name:n.string().describe(`Existing symbol name to replace`),new_name:n.string().describe(`New symbol name to use`),root_path:n.string().describe(`Root directory to search within`),extensions:n.array(n.string()).optional().describe(`Optional file extensions to include, such as .ts,.tsx,.js,.jsx`),dry_run:n.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:r.annotations},async({old_name:e,new_name:t,root_path:n,extensions:r,dry_run:a})=>{try{let i=await l({oldName:e,newName:t,rootPath:n,extensions:r,dryRun:a});return{content:[{type:`text`,text:JSON.stringify(i)}]}}catch(e){return u.error(`Rename failed`,i(e)),{content:[{type:`text`,text:`Rename failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function m(t){let r=e(`codemod`);t.registerTool(`codemod`,{title:r.title,description:`Apply regex-based codemod rules across files and return structured before/after changes for each affected line.`,inputSchema:{root_path:n.string().describe(`Root directory to transform within`),rules:n.array(n.object({description:n.string().describe(`What the codemod rule does`),pattern:n.string().describe(`Regex pattern in string form`),replacement:n.string().describe(`Replacement string with optional capture groups`)})).min(1).describe(`Codemod rules to apply`),dry_run:n.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:r.annotations},async({root_path:e,rules:t,dry_run:n})=>{try{let r=await a({rootPath:e,rules:t,dryRun:n});return{content:[{type:`text`,text:JSON.stringify(r)}]}}catch(e){return u.error(`Codemod failed`,i(e)),{content:[{type:`text`,text:`Codemod failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function h(t){let r=e(`data_transform`);t.registerTool(`data_transform`,{title:r.title,description:`Apply small jq-like transforms to JSON input for filtering, projection, grouping, and path extraction.`,inputSchema:{input:n.string().max(5e5).describe(`Input JSON string`),expression:n.string().max(1e4).describe(`Transform expression to apply`)},annotations:r.annotations},async({input:e,expression:t})=>{try{return{content:[{type:`text`,text:o({input:e,expression:t}).outputString}]}}catch(e){return u.error(`Data transform failed`,i(e)),{content:[{type:`text`,text:`Data transform failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function g(e){let t=[`Git root: ${e.gitRoot}`,`Branch: ${e.branch}`,`Staged: ${e.status.staged.length}`,...e.status.staged.map(e=>` - ${e}`),`Modified: ${e.status.modified.length}`,...e.status.modified.map(e=>` - ${e}`),`Untracked: ${e.status.untracked.length}`,...e.status.untracked.map(e=>` - ${e}`),``,`Recent commits:`];if(e.recentCommits.length===0)t.push(` none`);else for(let n of e.recentCommits)t.push(` - ${n.hash} ${n.message}`),t.push(` ${n.author} @ ${n.date}`);return e.diff&&t.push(``,`Diff stat:`,e.diff),t.join(`
3
+ `)}function _(e){if(e.length===0)return`No diff files found.`;let t=[];for(let n of e){let e=n.oldPath?` (from ${n.oldPath})`:``;t.push(`${n.path}${e} [${n.status}] +${n.additions} -${n.deletions} (${n.hunks.length} hunks)`);for(let e of n.hunks){let n=e.header?` ${e.header}`:``;t.push(` @@ -${e.oldStart},${e.oldLines} +${e.newStart},${e.newLines} @@${n}`)}}return t.join(`
4
+ `)}export{m as registerCodemodTool,h as registerDataTransformTool,f as registerDiffParseTool,d as registerGitContextTool,p as registerRenameTool};
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KBConfig } from "../../../core/dist/index.js";
3
+ import { IKnowledgeStore } from "../../../store/dist/index.js";
4
+ import { IEmbedder } from "../../../embeddings/dist/index.js";
5
+
6
+ //#region packages/server/src/tools/onboard.tool.d.ts
7
+ declare function registerOnboardTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder, config?: KBConfig): void;
8
+ //#endregion
9
+ export { registerOnboardTool };
@@ -0,0 +1,2 @@
1
+ import{getToolMeta as e}from"../tool-metadata.js";import{createTaskRunner as t}from"../task-manager.js";import{createHash as n}from"node:crypto";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";import{onboard as o}from"../../../tools/dist/index.js";const s=i(`tools`);let c=!1;async function l(e,t,r){for(let i of r.steps)if(!(i.status!==`success`||!i.output))try{let a=n(`sha256`).update(r.path).digest(`hex`).slice(0,12),o=`produced/onboard/${i.name}/${a}.md`,s=n(`sha256`).update(i.output).digest(`hex`).slice(0,16),c=new Date().toISOString(),l=i.output.length>2e3?i.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i.output],u=l.map((e,t)=>({id:n(`sha256`).update(`${o}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:o,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:l.length,startLine:0,endLine:0,fileHash:s,indexedAt:c,origin:`produced`,tags:[`onboard`,i.name],category:`analysis`,version:1})),d=await t.embedBatch(u.map(e=>e.content));await e.upsert(u,d)}catch(e){s.warn(`Auto-persist onboard step failed`,{stepName:i.name,...a(e)})}}async function u(e,t,r){if(r.autoRemember?.length)for(let i of r.autoRemember)try{let r=n(`sha256`).update(`onboard-remember::${i.title}`).digest(`hex`).slice(0,16),a=new Date().toISOString(),o={id:r,content:`# ${i.title}\n\n${i.content}`,sourcePath:`curated/onboard/${i.category}/${r}.md`,contentType:`curated`,chunkIndex:0,totalChunks:1,startLine:0,endLine:0,fileHash:n(`sha256`).update(i.content).digest(`hex`).slice(0,16),indexedAt:a,origin:`curated`,tags:i.tags,category:i.category,version:1},[s]=await t.embedBatch([o.content]);await e.upsert([o],[s])}catch(e){s.warn(`Auto-persist remember entry failed`,{title:i.title,...a(e)})}}function d(n,i,d,f){let p=e(`onboard`);n.registerTool(`onboard`,{title:p.title,description:`First-time codebase onboarding: runs all analysis tools (structure, dependencies, entry-points, symbols, patterns, diagram) in one command. Results are auto-persisted to KB. Use mode=generate to also write structured output to .ai/kb/ directory.`,inputSchema:{path:r.string().describe(`Root path of the codebase to onboard`),mode:r.enum([`memory`,`generate`]).default(`generate`).describe(`Output mode: generate (default) = persist to KB + write .ai/kb/ files; memory = KB vector store only`),out_dir:r.string().optional().describe(`Custom output directory for generate mode (default: <path>/.ai/kb)`)},annotations:p.annotations},async({path:e,mode:n,out_dir:r},p)=>{try{if(c)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};c=!0,s.info(`Starting onboard`,{path:e,mode:n});let m=await o({path:e,mode:n,outDir:r??f?.onboardDir}),h=t(p).createTask(`Onboard`,m.steps.length);for(let e=0;e<m.steps.length;e++){let t=m.steps[e];h.progress(e,`${t.name}: ${t.status}`)}h.complete(`Onboard complete: ${m.steps.filter(e=>e.status===`success`).length}/${m.steps.length} steps succeeded`),l(i,d,m),m.autoRemember?.length&&u(i,d,m).catch(e=>{s.warn(`Auto-persist autoRemember failed`,a(e))});let g=[`## Onboard Complete`,``,`**Path:** \`${m.path}\``,`**Mode:** ${m.mode}`,`**Duration:** ${m.totalDurationMs}ms`,``];m.outDir&&(g.push(`**Output directory:** \`${m.outDir}\``),g.push(``)),g.push(`### Analysis Results`,``);let _=[],v=[];for(let e of m.steps)e.status===`success`?_.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):v.push(`- ✗ **${e.name}** — ${e.error}`);g.push(..._),v.length>0&&g.push(``,`### Failed`,``,...v),g.push(``,`---`,``);for(let e of m.steps)e.status===`success`&&g.push(`### ${e.name}`,``,e.output,``,`---`,``);return g.push(`_All results auto-saved to KB.`,m.mode===`generate`?` Files written to \`${m.outDir}\`.`:``," Next: Use `search` to query the knowledge, or `remember` to add custom insights._"),{content:[{type:`text`,text:g.join(`
2
+ `)}]}}catch(e){return s.error(`Onboard failed`,a(e)),{content:[{type:`text`,text:`Onboard failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}finally{c=!1}})}export{d as registerOnboardTool};
@@ -0,0 +1,10 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/tools/persistence.tools.d.ts
4
+ declare function registerWorksetTool(server: McpServer): void;
5
+ declare function registerStashTool(server: McpServer): void;
6
+ declare function registerCheckpointTool(server: McpServer): void;
7
+ declare function registerLaneTool(server: McpServer): void;
8
+ declare function registerQueueTool(server: McpServer): void;
9
+ //#endregion
10
+ export { registerCheckpointTool, registerLaneTool, registerQueueTool, registerStashTool, registerWorksetTool };
@@ -0,0 +1,5 @@
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{addToWorkset as i,checkpointLatest as a,checkpointList as o,checkpointLoad as s,checkpointSave as c,deleteWorkset as l,getWorkset as u,laneCreate as d,laneDiff as f,laneDiscard as p,laneList as m,laneMerge as h,laneStatus as g,listWorksets as _,queueClear as v,queueCreate as y,queueDelete as b,queueDone as x,queueFail as S,queueGet as C,queueList as w,queueNext as T,queuePush as E,removeFromWorkset as D,saveWorkset as O,stashClear as k,stashDelete as A,stashGet as j,stashList as M,stashSet as N}from"../../../tools/dist/index.js";const P=n(`tools:persistence`);function F(n){let a=e(`workset`);n.registerTool(`workset`,{title:a.title,description:`Manage named file sets (worksets). Save, load, list, add/remove files. Worksets persist across sessions in .aikit-state/worksets.json.`,inputSchema:{action:t.enum([`save`,`get`,`list`,`delete`,`add`,`remove`]).describe(`Operation to perform`),name:t.string().optional().describe(`Workset name (required for all except list)`),files:t.array(t.string()).optional().describe(`File paths (required for save, add, remove)`),description:t.string().optional().describe(`Description (for save)`)},annotations:a.annotations},async({action:e,name:t,files:n,description:a})=>{try{switch(e){case`save`:{if(!t||!n)throw Error(`name and files required for save`);let e=O(t,n,{description:a});return{content:[{type:`text`,text:`Saved workset "${e.name}" with ${e.files.length} files.`}]}}case`get`:{if(!t)throw Error(`name required for get`);let e=u(t);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${t}" not found.`}]}}case`list`:{let e=_();return e.length===0?{content:[{type:`text`,text:`No worksets.`}]}:{content:[{type:`text`,text:e.map(e=>`- **${e.name}** (${e.files.length} files) — ${e.description??`no description`}`).join(`
2
+ `)}]}}case`delete`:if(!t)throw Error(`name required for delete`);return{content:[{type:`text`,text:l(t)?`Deleted workset "${t}".`:`Workset "${t}" not found.`}]};case`add`:{if(!t||!n)throw Error(`name and files required for add`);let e=i(t,n);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`remove`:{if(!t||!n)throw Error(`name and files required for remove`);let e=D(t,n);return e?{content:[{type:`text`,text:`Removed from workset "${e.name}": now ${e.files.length} files.`}]}:{content:[{type:`text`,text:`Workset "${t}" not found.`}]}}}}catch(e){return P.error(`Workset operation failed`,r(e)),{content:[{type:`text`,text:`Workset operation failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function I(n){let i=e(`stash`);n.registerTool(`stash`,{title:i.title,description:`Persist and retrieve named values in .aikit-state/stash.json for intermediate results between tool calls.`,inputSchema:{action:t.enum([`set`,`get`,`list`,`delete`,`clear`]).describe(`Operation to perform on the stash`),key:t.string().optional().describe(`Entry key for set/get/delete operations`),value:t.string().optional().describe(`String or JSON value for set operations`)},annotations:i.annotations},async({action:e,key:t,value:n})=>{try{switch(e){case`set`:{if(!t)throw Error(`key required for set`);let e=N(t,V(n??``));return{content:[{type:`text`,text:`Stored stash entry "${e.key}" (${e.type}) at ${e.storedAt}.`}]}}case`get`:{if(!t)throw Error(`key required for get`);let e=j(t);return{content:[{type:`text`,text:e?JSON.stringify(e):`Stash entry "${t}" not found.`}]}}case`list`:{let e=M();return{content:[{type:`text`,text:e.length===0?`Stash is empty.`:e.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
3
+ `)}]}}case`delete`:if(!t)throw Error(`key required for delete`);return{content:[{type:`text`,text:A(t)?`Deleted stash entry "${t}".`:`Stash entry "${t}" not found.`}]};case`clear`:{let e=k();return{content:[{type:`text`,text:`Cleared ${e} stash entr${e===1?`y`:`ies`}.`}]}}}}catch(e){return P.error(`Stash operation failed`,r(e)),{content:[{type:`text`,text:`Stash operation failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function L(n){let i=e(`checkpoint`);n.registerTool(`checkpoint`,{title:i.title,description:`Save and restore lightweight session checkpoints in .aikit-state/checkpoints for cross-session continuity.`,inputSchema:{action:t.enum([`save`,`load`,`list`,`latest`]).describe(`Checkpoint action to perform`),label:t.string().optional().describe(`Checkpoint label for save, or checkpoint id for load`),data:t.string().max(5e5).optional().describe(`JSON object string for save actions`),notes:t.string().max(1e4).optional().describe(`Optional notes for save actions`)},annotations:i.annotations},async({action:e,label:t,data:n,notes:i})=>{try{switch(e){case`save`:if(!t)throw Error(`label required for save`);return{content:[{type:`text`,text:B(c(t,H(n),{notes:i}))}]};case`load`:{if(!t)throw Error(`label required for load`);let e=s(t);return{content:[{type:`text`,text:e?B(e):`Checkpoint "${t}" not found.`}]}}case`list`:{let e=o();return{content:[{type:`text`,text:e.length===0?`No checkpoints saved.`:e.map(e=>`- ${e.id} — ${e.label} (${e.createdAt})`).join(`
4
+ `)}]}}case`latest`:{let e=a();return{content:[{type:`text`,text:e?B(e):`No checkpoints saved.`}]}}}}catch(e){return P.error(`Checkpoint failed`,r(e)),{content:[{type:`text`,text:`Checkpoint failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function R(n){let i=e(`lane`);n.registerTool(`lane`,{title:i.title,description:`Manage verified lanes — isolated file copies for parallel exploration. Create a lane, make changes, diff, merge back, or discard.`,inputSchema:{action:t.enum([`create`,`list`,`status`,`diff`,`merge`,`discard`]).describe(`Lane action to perform`),name:t.string().optional().describe(`Lane name (required for create/status/diff/merge/discard)`),files:t.array(t.string()).optional().describe(`File paths to copy into the lane (required for create)`)},annotations:i.annotations},async({action:e,name:t,files:n})=>{try{switch(e){case`create`:{if(!t)throw Error(`name is required for create`);if(!n||n.length===0)throw Error(`files are required for create`);let e=d(t,n);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`list`:return{content:[{type:`text`,text:JSON.stringify(m())}]};case`status`:if(!t)throw Error(`name is required for status`);return{content:[{type:`text`,text:JSON.stringify(g(t))}]};case`diff`:if(!t)throw Error(`name is required for diff`);return{content:[{type:`text`,text:JSON.stringify(f(t))}]};case`merge`:if(!t)throw Error(`name is required for merge`);return{content:[{type:`text`,text:JSON.stringify(h(t))}]};case`discard`:if(!t)throw Error(`name is required for discard`);return{content:[{type:`text`,text:JSON.stringify({discarded:p(t)})}]}}}catch(e){return P.error(`Lane action failed`,r(e)),{content:[{type:`text`,text:`Lane action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function z(n){let i=e(`queue`);n.registerTool(`queue`,{title:i.title,description:`Manage task queues for sequential agent operations. Push items, take next, mark done/failed, list queues.`,inputSchema:{action:t.enum([`create`,`push`,`next`,`done`,`fail`,`get`,`list`,`clear`,`delete`]).describe(`Queue action`),name:t.string().optional().describe(`Queue name (required for most actions)`),title:t.string().optional().describe(`Item title (required for push)`),id:t.string().optional().describe(`Item ID (required for done/fail)`),data:t.unknown().optional().describe(`Arbitrary data to attach to a queue item`),error:t.string().optional().describe(`Error message (required for fail)`)},annotations:i.annotations},async({action:e,name:t,title:n,id:i,data:a,error:o})=>{try{switch(e){case`create`:if(!t)throw Error(`name is required for create`);return{content:[{type:`text`,text:JSON.stringify(y(t))}]};case`push`:if(!t)throw Error(`name is required for push`);if(!n)throw Error(`title is required for push`);return{content:[{type:`text`,text:JSON.stringify(E(t,n,a))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=T(t);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`done`:if(!t)throw Error(`name is required for done`);if(!i)throw Error(`id is required for done`);return{content:[{type:`text`,text:JSON.stringify(x(t,i))}]};case`fail`:if(!t)throw Error(`name is required for fail`);if(!i)throw Error(`id is required for fail`);if(!o)throw Error(`error is required for fail`);return{content:[{type:`text`,text:JSON.stringify(S(t,i,o))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(C(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(w())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:v(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:b(t)})}]}}}catch(e){return P.error(`Queue action failed`,r(e)),{content:[{type:`text`,text:`Queue action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function B(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];if(e.notes&&t.push(`Notes: ${e.notes}`),e.files?.length){t.push(`Files: ${e.files.length}`);for(let n of e.files)t.push(` - ${n}`)}return t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
5
+ `)}function V(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function H(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}export{L as registerCheckpointTool,R as registerLaneTool,z as registerQueueTool,I as registerStashTool,F as registerWorksetTool};
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { PolicyStore } from "../../../enterprise-bridge/dist/index.js";
3
+
4
+ //#region packages/server/src/tools/policy.tools.d.ts
5
+ declare function registerErUpdatePolicyTool(server: McpServer, policyStore: PolicyStore): void;
6
+ //#endregion
7
+ export { registerErUpdatePolicyTool };
@@ -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";const i=n(`tools`);function a(e){let t=[`## Rule: ${e.id}`,``,`- **Status**: ${e.enabled?`enabled`:`disabled`}`,`- **Description**: ${e.description??`—`}`,`- **Category**: ${e.category??`—`}`,`- **Push weight**: ${e.pushWeight??`—`}`];return e.patterns?.length&&t.push(`- **Patterns**: ${e.patterns.join(`, `)}`),e.examples?.length&&t.push(`- **Examples**: ${e.examples.join(`, `)}`),t.join(`
2
+ `)}function o(n,o){let s=e(`er_update_policy`);n.registerTool(`er_update_policy`,{title:s.title,description:`Manage ER push classification rules. Supports listing, updating, creating, and deleting rules that determine when knowledge should be pushed to Enterprise RAG.`,inputSchema:{action:t.enum([`list`,`get`,`update`,`create`,`delete`]).describe(`Action to perform on classification rules`),rule_id:t.string().optional().describe(`Rule ID (required for get, update, delete)`),changes:t.object({patterns:t.array(t.string()).optional(),category:t.string().optional(),pushWeight:t.number().min(0).max(1).optional(),description:t.string().optional(),examples:t.array(t.string()).optional(),enabled:t.boolean().optional()}).optional().describe(`Changes to apply (for update action)`),new_rule:t.object({id:t.string().regex(/^[a-z][a-z0-9-]*$/),patterns:t.array(t.string()).min(1),category:t.string(),pushWeight:t.number().min(0).max(1),description:t.string(),examples:t.array(t.string()).default([]),enabled:t.boolean().default(!0)}).optional().describe(`New rule definition (for create action)`)},annotations:s.annotations},async({action:e,rule_id:t,changes:n,new_rule:s})=>{try{if(e===`list`){let e=o.getRules();return{content:[{type:`text`,text:`## Classification Rules\n\n${e.map(e=>`- **${e.id}** (${e.enabled?`enabled`:`disabled`}) — ${e.description}\n Category: ${e.category} | Weight: ${e.pushWeight} | Patterns: ${e.patterns.join(`, `)}`).join(`
3
+ `)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!t)return{content:[{type:`text`,text:'`rule_id` is required for "get" action.'}],isError:!0};let e=o.getRule(t);return e?{content:[{type:`text`,text:a(e)}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}}if(e===`update`){if(!t||!n)return{content:[{type:`text`,text:'`rule_id` and `changes` are required for "update" action.'}],isError:!0};let e=o.updateRule(t,n);return e?{content:[{type:`text`,text:`${a(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}}return e===`create`?s?{content:[{type:`text`,text:`${a(o.addRule(s))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:{content:[{type:`text`,text:'`new_rule` is required for "create" action.'}],isError:!0}:e===`delete`?t?o.deleteRule(t)?{content:[{type:`text`,text:`Deleted rule **${t}**.\n\n---\n_Next: Use \`action: "list"\` to verify._`}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}:{content:[{type:`text`,text:'`rule_id` is required for "delete" action.'}],isError:!0}:{content:[{type:`text`,text:`Unknown action: ${e}`}],isError:!0}}catch(e){return i.error(`Policy update failed`,r(e)),{content:[{type:`text`,text:`Policy update failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{o as registerErUpdatePolicyTool};
@@ -0,0 +1,4 @@
1
+ //#region packages/server/src/tools/present/browser.d.ts
2
+ declare function buildBrowserHtml(title: string | undefined, content: unknown, actions?: unknown, template?: string): string;
3
+ //#endregion
4
+ export { buildBrowserHtml };
@@ -0,0 +1,93 @@
1
+ import{FONT_LINK as e,getDesignSystemCSS as t}from"../present-theme.js";import{escHtml as n}from"../present-utils.js";import{contentToHtml as r}from"./html.js";import{buildTemplateHtml as i}from"./templates.js";function a(a,o,s,c){let l=c&&c!==`auto`?i(c,o):r(a,o);return`<!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
6
+ <title>${n(a??`KB Dashboard`)}</title>
7
+ ${e}
8
+ <style>${t()}</style>
9
+ </head>
10
+ <body>
11
+ <div class="dashboard">
12
+ <div class="header">
13
+ <h1>${n(a??`KB Dashboard`)}</h1>
14
+ <div class="subtitle">Knowledge Base</div>
15
+ </div>
16
+ ${l}
17
+ ${(()=>{let e=Array.isArray(s)?s:[];return e.length===0?``:`
18
+ <div class="actions-bar">
19
+ <h2>Actions</h2>
20
+ <div class="actions-grid">${e.map(e=>{let t=String(e.id??``);if(e.type===`select`&&Array.isArray(e.options)){let r=e.options.map(e=>{let t=typeof e==`string`?e:e.label;return`<option value="${n(typeof e==`string`?e:e.value)}">${n(t)}</option>`}).join(``);return`<div class="action-group"><label>${n(String(e.label??``))}</label><select data-action-id="${n(t)}" onchange="sendCallback(${n(JSON.stringify(t))},this.value)">${r}</select></div>`}return`<button class="action-btn action-${String(e.variant??`default`)}" onclick="sendCallback(${n(JSON.stringify(t))},'clicked')">${n(String(e.label??``))}</button>`}).join(`
21
+ `)}</div>
22
+ <div id="action-feedback" class="action-feedback"></div>
23
+ </div>
24
+ <script>
25
+ let _cbSent=false;
26
+ function sendCallback(actionId,value){
27
+ if(_cbSent)return;
28
+ _cbSent=true;
29
+ document.querySelectorAll('.action-btn,.action-group select').forEach(el=>{el.disabled=true;el.style.opacity='0.5'});
30
+ const fb=document.getElementById('action-feedback');
31
+ fb.textContent='⏳ Sending selection: '+actionId+' = '+value;
32
+ fb.className='action-feedback sent';
33
+ fetch('/callback',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({actionId,value})})
34
+ .then(()=>{
35
+ fb.textContent='✓ Selection sent: '+actionId+' = '+value;
36
+ })
37
+ .catch(e=>{
38
+ fb.textContent='✗ Callback failed — '+e.message;
39
+ fb.style.color='var(--error)';
40
+ _cbSent=false;
41
+ document.querySelectorAll('.action-btn,.action-group select').forEach(el=>{el.disabled=false;el.style.opacity='1'});
42
+ });
43
+ }
44
+ <\/script>`})()}
45
+ <div class="footer">KB MCP Server &middot; Generated ${new Date().toLocaleString()}</div>
46
+ </div>
47
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"><\/script>
48
+ <script>
49
+ if(document.querySelector('.mermaid'))mermaid.initialize({theme:'dark',startOnLoad:true});
50
+
51
+ document.querySelectorAll('table').forEach(table=>{
52
+ const headers=table.querySelectorAll('th');
53
+ headers.forEach((th,i)=>{
54
+ let asc=true;
55
+ th.addEventListener('click',()=>{
56
+ const tbody=table.querySelector('tbody')||table;
57
+ const rows=[...tbody.querySelectorAll('tr')].filter(r=>r.querySelector('td'));
58
+ rows.sort((a,b)=>{
59
+ const at=(a.cells[i]?.textContent||'').trim();
60
+ const bt=(b.cells[i]?.textContent||'').trim();
61
+ return asc?at.localeCompare(bt,undefined,{numeric:true}):bt.localeCompare(at,undefined,{numeric:true});
62
+ });
63
+ rows.forEach(r=>tbody.appendChild(r));
64
+ asc=!asc;
65
+ headers.forEach(h=>h.style.color='');
66
+ th.style.color='var(--primary)';
67
+ });
68
+ });
69
+ });
70
+
71
+ document.querySelectorAll('.table-wrap').forEach(wrap=>{
72
+ const table=wrap.querySelector('table');
73
+ if(!table||table.querySelectorAll('tr').length<5)return;
74
+ const bar=document.createElement('div');
75
+ bar.className='search-bar';
76
+ const input=document.createElement('input');
77
+ input.placeholder='Filter rows...';
78
+ const count=document.createElement('span');
79
+ count.className='count';
80
+ bar.appendChild(input);bar.appendChild(count);
81
+ wrap.parentNode.insertBefore(bar,wrap);
82
+ const rows=[...table.querySelectorAll('tbody tr, tr')].filter(r=>r.querySelector('td'));
83
+ const updateCount=()=>{const v=rows.filter(r=>r.style.display!=='none').length;count.textContent=v+'/'+rows.length};
84
+ updateCount();
85
+ input.addEventListener('input',()=>{
86
+ const q=input.value.toLowerCase();
87
+ rows.forEach(r=>{r.style.display=r.textContent.toLowerCase().includes(q)?'':'none'});
88
+ updateCount();
89
+ });
90
+ });
91
+ <\/script>
92
+ </body>
93
+ </html>`}export{a as buildBrowserHtml};
@@ -0,0 +1,18 @@
1
+ //#region packages/server/src/tools/present/helpers.d.ts
2
+ interface TypedBlock {
3
+ type: string;
4
+ title?: string;
5
+ value?: unknown;
6
+ language?: string;
7
+ [key: string]: unknown;
8
+ }
9
+ declare function formatValue(value: unknown): string;
10
+ declare function sanitizeId(value: string): string;
11
+ declare function isTypedBlock(value: unknown): value is TypedBlock;
12
+ /**
13
+ * Normalize a typed block so renderers can always read from `value`.
14
+ * Handles alternative field names: text, code, headers+rows → value.
15
+ */
16
+ declare function normalizeBlock(block: TypedBlock): TypedBlock;
17
+ //#endregion
18
+ export { TypedBlock, formatValue, isTypedBlock, normalizeBlock, sanitizeId };
@@ -0,0 +1 @@
1
+ function e(t){return t==null?`null`:Array.isArray(t)?`[${t.map(e).join(`, `)}]`:String(t)}function t(e){return e.replace(/[^a-zA-Z0-9_]/g,`_`)}function n(e){return typeof e!=`object`||!e||!(`type`in e)?!1:`value`in e||`text`in e||`headers`in e||`code`in e||`items`in e}function r(e){if(`value`in e)return e;let t=e;return typeof t.text==`string`?{...e,value:t.text}:typeof t.code==`string`?{...e,value:t.code}:Array.isArray(t.headers)&&Array.isArray(t.rows)?{...e,value:{headers:t.headers,rows:t.rows}}:Array.isArray(t.items)?{...e,value:{items:t.items}}:e}export{e as formatValue,n as isTypedBlock,r as normalizeBlock,t as sanitizeId};