@bevel-software/platform-core-backend 0.25.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (733) hide show
  1. package/agent-guide/access-control.md +251 -0
  2. package/agent-guide/conventions.md +35 -0
  3. package/agent-guide/directory-structure.md +145 -0
  4. package/agent-guide/finding-things.md +7 -0
  5. package/agent-guide/html-views.md +83 -0
  6. package/agent-guide/introduction.md +27 -0
  7. package/agent-guide/new-knowledge-base.md +24 -0
  8. package/agent-guide/skills.md +47 -0
  9. package/agent-guide/tool-manuals.md +227 -0
  10. package/agent-guide/where-a-new-file-goes.md +36 -0
  11. package/dist/assets.d.ts +26 -0
  12. package/dist/assets.d.ts.map +1 -1
  13. package/dist/assets.js +35 -2
  14. package/dist/assets.js.map +1 -1
  15. package/dist/core/catalog-revision.d.ts +19 -1
  16. package/dist/core/catalog-revision.d.ts.map +1 -1
  17. package/dist/core/catalog-revision.js +14 -3
  18. package/dist/core/catalog-revision.js.map +1 -1
  19. package/dist/core/core-ports.d.ts +11 -0
  20. package/dist/core/core-ports.d.ts.map +1 -1
  21. package/dist/core/core-ports.js.map +1 -1
  22. package/dist/core/create-core-server.d.ts +5 -0
  23. package/dist/core/create-core-server.d.ts.map +1 -1
  24. package/dist/core/create-core-server.js +65 -3
  25. package/dist/core/create-core-server.js.map +1 -1
  26. package/dist/core/create-core-services.d.ts +35 -0
  27. package/dist/core/create-core-services.d.ts.map +1 -1
  28. package/dist/core/create-core-services.js +114 -12
  29. package/dist/core/create-core-services.js.map +1 -1
  30. package/dist/core/lifecycle.d.ts +16 -1
  31. package/dist/core/lifecycle.d.ts.map +1 -1
  32. package/dist/core/lifecycle.js +18 -1
  33. package/dist/core/lifecycle.js.map +1 -1
  34. package/dist/core-config.d.ts +21 -0
  35. package/dist/core-config.d.ts.map +1 -1
  36. package/dist/core-config.js +22 -1
  37. package/dist/core-config.js.map +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/modules/access/access-control.interface.d.ts +17 -0
  43. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  44. package/dist/modules/access/access-control.service.d.ts +2 -0
  45. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  46. package/dist/modules/access/access-control.service.js +27 -0
  47. package/dist/modules/access/access-control.service.js.map +1 -1
  48. package/dist/modules/access/directory-sync-bot.js +1 -1
  49. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  50. package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
  51. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
  52. package/dist/modules/agent-guide/agent-guide.js +199 -0
  53. package/dist/modules/agent-guide/agent-guide.js.map +1 -0
  54. package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
  55. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
  56. package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
  57. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
  58. package/dist/modules/agent-guide/index.d.ts +4 -0
  59. package/dist/modules/agent-guide/index.d.ts.map +1 -0
  60. package/dist/modules/agent-guide/index.js +4 -0
  61. package/dist/modules/agent-guide/index.js.map +1 -0
  62. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
  63. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  64. package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
  65. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  66. package/dist/modules/agent-instructions/compose.d.ts +14 -6
  67. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  68. package/dist/modules/agent-instructions/compose.js +28 -8
  69. package/dist/modules/agent-instructions/compose.js.map +1 -1
  70. package/dist/modules/agent-instructions/index.d.ts +1 -1
  71. package/dist/modules/agent-instructions/index.d.ts.map +1 -1
  72. package/dist/modules/agent-instructions/index.js +1 -1
  73. package/dist/modules/agent-instructions/index.js.map +1 -1
  74. package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
  75. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  76. package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
  77. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  78. package/dist/modules/audit/agent-audit.service.d.ts +21 -2
  79. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  80. package/dist/modules/audit/agent-audit.service.js +43 -2
  81. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  82. package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
  83. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
  84. package/dist/modules/audit/agent-connection.routes.js +38 -0
  85. package/dist/modules/audit/agent-connection.routes.js.map +1 -0
  86. package/dist/modules/audit/audit.contract.d.ts +24 -0
  87. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  88. package/dist/modules/audit/audit.contract.js.map +1 -1
  89. package/dist/modules/audit/index.d.ts +1 -0
  90. package/dist/modules/audit/index.d.ts.map +1 -1
  91. package/dist/modules/audit/index.js +1 -0
  92. package/dist/modules/audit/index.js.map +1 -1
  93. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  94. package/dist/modules/auth/account.routes.js +10 -3
  95. package/dist/modules/auth/account.routes.js.map +1 -1
  96. package/dist/modules/auth/auth.middleware.d.ts +7 -0
  97. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  98. package/dist/modules/auth/auth.middleware.js +1 -1
  99. package/dist/modules/auth/auth.middleware.js.map +1 -1
  100. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  101. package/dist/modules/code-mode/code-mode.tool.js +11 -3
  102. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  103. package/dist/modules/database/core-schema.d.ts +96 -0
  104. package/dist/modules/database/core-schema.d.ts.map +1 -1
  105. package/dist/modules/database/core-schema.js +32 -3
  106. package/dist/modules/database/core-schema.js.map +1 -1
  107. package/dist/modules/embed/account-link.service.d.ts +42 -0
  108. package/dist/modules/embed/account-link.service.d.ts.map +1 -0
  109. package/dist/modules/embed/account-link.service.js +50 -0
  110. package/dist/modules/embed/account-link.service.js.map +1 -0
  111. package/dist/modules/embed/embed-link.d.ts +58 -0
  112. package/dist/modules/embed/embed-link.d.ts.map +1 -0
  113. package/dist/modules/embed/embed-link.js +160 -0
  114. package/dist/modules/embed/embed-link.js.map +1 -0
  115. package/dist/modules/embed/embed.errors.d.ts +30 -0
  116. package/dist/modules/embed/embed.errors.d.ts.map +1 -0
  117. package/dist/modules/embed/embed.errors.js +42 -0
  118. package/dist/modules/embed/embed.errors.js.map +1 -0
  119. package/dist/modules/embed/embed.interface.d.ts +204 -0
  120. package/dist/modules/embed/embed.interface.d.ts.map +1 -0
  121. package/dist/modules/embed/embed.interface.js +2 -0
  122. package/dist/modules/embed/embed.interface.js.map +1 -0
  123. package/dist/modules/embed/embed.routes.d.ts +59 -0
  124. package/dist/modules/embed/embed.routes.d.ts.map +1 -0
  125. package/dist/modules/embed/embed.routes.js +343 -0
  126. package/dist/modules/embed/embed.routes.js.map +1 -0
  127. package/dist/modules/embed/embed.service.d.ts +169 -0
  128. package/dist/modules/embed/embed.service.d.ts.map +1 -0
  129. package/dist/modules/embed/embed.service.js +627 -0
  130. package/dist/modules/embed/embed.service.js.map +1 -0
  131. package/dist/modules/embed/embed.tools.d.ts +51 -0
  132. package/dist/modules/embed/embed.tools.d.ts.map +1 -0
  133. package/dist/modules/embed/embed.tools.js +170 -0
  134. package/dist/modules/embed/embed.tools.js.map +1 -0
  135. package/dist/modules/embed/mcp-app.d.ts +64 -0
  136. package/dist/modules/embed/mcp-app.d.ts.map +1 -0
  137. package/dist/modules/embed/mcp-app.js +147 -0
  138. package/dist/modules/embed/mcp-app.js.map +1 -0
  139. package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
  140. package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
  141. package/dist/modules/embed/mcp-app.routes.js +36 -0
  142. package/dist/modules/embed/mcp-app.routes.js.map +1 -0
  143. package/dist/modules/github-app/github-app.connection.d.ts +15 -0
  144. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  145. package/dist/modules/github-app/github-app.connection.js +34 -3
  146. package/dist/modules/github-app/github-app.connection.js.map +1 -1
  147. package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
  148. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  149. package/dist/modules/kb-fs/locking-filesystem.js +300 -0
  150. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  151. package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
  152. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  153. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  154. package/dist/modules/kb-sync/kb-sync.service.js +6 -0
  155. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  156. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  157. package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
  158. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  159. package/dist/modules/mcp/mcp.service.d.ts +57 -3
  160. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  161. package/dist/modules/mcp/mcp.service.js +177 -24
  162. package/dist/modules/mcp/mcp.service.js.map +1 -1
  163. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
  164. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  165. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
  166. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  167. package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
  168. package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
  169. package/dist/modules/mcp/tool-schema-guard.js +171 -0
  170. package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
  171. package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
  172. package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
  173. package/dist/modules/onboarding/onboarding.contract.js +7 -0
  174. package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
  175. package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
  176. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
  177. package/dist/modules/onboarding/onboarding.routes.js +81 -0
  178. package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
  179. package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
  180. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
  181. package/dist/modules/onboarding/starter-pack.service.js +492 -0
  182. package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
  183. package/dist/modules/onboarding/starter-packs.d.ts +78 -0
  184. package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
  185. package/dist/modules/onboarding/starter-packs.js +156 -0
  186. package/dist/modules/onboarding/starter-packs.js.map +1 -0
  187. package/dist/modules/plugins/index.d.ts +1 -1
  188. package/dist/modules/plugins/index.d.ts.map +1 -1
  189. package/dist/modules/plugins/index.js +1 -1
  190. package/dist/modules/plugins/index.js.map +1 -1
  191. package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
  192. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  193. package/dist/modules/plugins/plugin-provision.service.js +18 -1
  194. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  195. package/dist/modules/plugins/plugins.routes.d.ts +0 -36
  196. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  197. package/dist/modules/plugins/plugins.routes.js +31 -0
  198. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  199. package/dist/modules/plugins/plugins.tools.d.ts +36 -2
  200. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  201. package/dist/modules/plugins/plugins.tools.js +71 -14
  202. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  203. package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
  204. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  205. package/dist/modules/settings/deployment-settings.service.js +148 -54
  206. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  207. package/dist/modules/settings/repository-source.d.ts +1 -0
  208. package/dist/modules/settings/repository-source.d.ts.map +1 -1
  209. package/dist/modules/settings/repository-source.js +3 -3
  210. package/dist/modules/settings/repository-source.js.map +1 -1
  211. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  212. package/dist/modules/settings/setup.routes.js +3 -6
  213. package/dist/modules/settings/setup.routes.js.map +1 -1
  214. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  215. package/dist/modules/skills/skills.tools.js +103 -43
  216. package/dist/modules/skills/skills.tools.js.map +1 -1
  217. package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
  218. package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
  219. package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
  220. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  221. package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
  222. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  223. package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
  224. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  225. package/dist/modules/tool-auth/external-api-key.service.js +59 -2
  226. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  227. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  228. package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
  229. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  230. package/dist/modules/tool-helpers/index.d.ts +28 -1
  231. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  232. package/dist/modules/tool-helpers/index.js +28 -1
  233. package/dist/modules/tool-helpers/index.js.map +1 -1
  234. package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
  235. package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
  236. package/dist/modules/tool-helpers/route-argument-check.js +132 -0
  237. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
  238. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
  239. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
  240. package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
  241. package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
  242. package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
  243. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  244. package/dist/modules/tool-helpers/tool-def.js +70 -6
  245. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  246. package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
  247. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  248. package/dist/modules/tool-helpers/tool-handler.js +157 -8
  249. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  250. package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
  251. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  252. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  253. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
  254. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  255. package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
  256. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
  257. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  258. package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
  259. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  260. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
  261. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  262. package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
  263. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  264. package/dist/modules/tool-registry/description-length.d.ts +20 -16
  265. package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
  266. package/dist/modules/tool-registry/description-length.js +50 -30
  267. package/dist/modules/tool-registry/description-length.js.map +1 -1
  268. package/dist/modules/tool-registry/guide-first.d.ts +27 -0
  269. package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
  270. package/dist/modules/tool-registry/guide-first.js +40 -0
  271. package/dist/modules/tool-registry/guide-first.js.map +1 -0
  272. package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
  273. package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
  274. package/dist/modules/tool-registry/tool-registry.js +9 -2
  275. package/dist/modules/tool-registry/tool-registry.js.map +1 -1
  276. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
  277. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
  278. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
  279. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
  280. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
  281. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
  282. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
  283. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
  284. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
  285. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  286. package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
  287. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  288. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
  289. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  290. package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
  291. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  292. package/dist/modules/workflow/file-lock.service.d.ts +29 -5
  293. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  294. package/dist/modules/workflow/file-lock.service.js +62 -5
  295. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  296. package/dist/modules/workflow/git/git.service.d.ts +282 -14
  297. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  298. package/dist/modules/workflow/git/git.service.js +627 -126
  299. package/dist/modules/workflow/git/git.service.js.map +1 -1
  300. package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
  301. package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
  302. package/dist/modules/workflow/git/merge-commit.js +89 -0
  303. package/dist/modules/workflow/git/merge-commit.js.map +1 -0
  304. package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
  305. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  306. package/dist/modules/workflow/git/node-git-runner.js +78 -6
  307. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  308. package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
  309. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  310. package/dist/modules/workflow/git/pull-request.service.js +332 -37
  311. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  312. package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
  313. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  314. package/dist/modules/workflow/pending-commits.service.js +25 -1
  315. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  316. package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
  317. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
  318. package/dist/modules/workflow/pending-commits.worker.js +23 -6
  319. package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
  320. package/dist/modules/workflow/recovery-bot.js +1 -1
  321. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  322. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
  323. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  324. package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
  325. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  326. package/dist/modules/workflow/sanitize-error.d.ts +16 -0
  327. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
  328. package/dist/modules/workflow/sanitize-error.js +45 -0
  329. package/dist/modules/workflow/sanitize-error.js.map +1 -1
  330. package/dist/modules/workflow/workflow.routes.d.ts +6 -2
  331. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  332. package/dist/modules/workflow/workflow.routes.js +7 -2
  333. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  334. package/dist/modules/workflow/workflow.service.d.ts +187 -15
  335. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  336. package/dist/modules/workflow/workflow.service.js +808 -106
  337. package/dist/modules/workflow/workflow.service.js.map +1 -1
  338. package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
  339. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
  340. package/dist/modules/workspace/agent-download.builder.js +238 -0
  341. package/dist/modules/workspace/agent-download.builder.js.map +1 -0
  342. package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
  343. package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
  344. package/dist/modules/workspace/agent-download.routes.js +156 -0
  345. package/dist/modules/workspace/agent-download.routes.js.map +1 -0
  346. package/dist/modules/workspace/agent-download.store.d.ts +225 -0
  347. package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
  348. package/dist/modules/workspace/agent-download.store.js +423 -0
  349. package/dist/modules/workspace/agent-download.store.js.map +1 -0
  350. package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
  351. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  352. package/dist/modules/workspace/agent-upload.store.js +16 -6
  353. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  354. package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
  355. package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
  356. package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
  357. package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
  358. package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
  359. package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
  360. package/dist/modules/workspace/file-readers/text-reader.js +5 -8
  361. package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
  362. package/dist/modules/workspace/first-run.d.ts +111 -0
  363. package/dist/modules/workspace/first-run.d.ts.map +1 -0
  364. package/dist/modules/workspace/first-run.js +181 -0
  365. package/dist/modules/workspace/first-run.js.map +1 -0
  366. package/dist/modules/workspace/move-links.d.ts +92 -0
  367. package/dist/modules/workspace/move-links.d.ts.map +1 -0
  368. package/dist/modules/workspace/move-links.js +173 -0
  369. package/dist/modules/workspace/move-links.js.map +1 -0
  370. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  371. package/dist/modules/workspace/startup/steps/seed-tree.js +24 -39
  372. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  373. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
  374. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  375. package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
  376. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  377. package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
  378. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  379. package/dist/modules/workspace/startup/steps/template-source.js +5 -3
  380. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  381. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  382. package/dist/modules/workspace/workspace.routes.js +63 -22
  383. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  384. package/dist/modules/workspace/workspace.service.d.ts +75 -2
  385. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  386. package/dist/modules/workspace/workspace.service.js +197 -24
  387. package/dist/modules/workspace/workspace.service.js.map +1 -1
  388. package/dist/modules/workspace/workspace.tools.d.ts +68 -1
  389. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  390. package/dist/modules/workspace/workspace.tools.js +642 -71
  391. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  392. package/dist/modules/write-access/write-access.d.ts.map +1 -1
  393. package/dist/modules/write-access/write-access.js +9 -0
  394. package/dist/modules/write-access/write-access.js.map +1 -1
  395. package/dist/shared/domain-errors.d.ts +84 -1
  396. package/dist/shared/domain-errors.d.ts.map +1 -1
  397. package/dist/shared/domain-errors.js +100 -12
  398. package/dist/shared/domain-errors.js.map +1 -1
  399. package/dist/shared/git.contract.d.ts +10 -1
  400. package/dist/shared/git.contract.d.ts.map +1 -1
  401. package/dist/shared/git.contract.js.map +1 -1
  402. package/dist/shared/hidden-tools.d.ts +44 -0
  403. package/dist/shared/hidden-tools.d.ts.map +1 -0
  404. package/dist/shared/hidden-tools.js +13 -0
  405. package/dist/shared/hidden-tools.js.map +1 -0
  406. package/dist/shared/utf8-text.d.ts +15 -0
  407. package/dist/shared/utf8-text.d.ts.map +1 -0
  408. package/dist/shared/utf8-text.js +20 -0
  409. package/dist/shared/utf8-text.js.map +1 -0
  410. package/dist/tenancy/static-tenant-source.d.ts +2 -1
  411. package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
  412. package/dist/tenancy/static-tenant-source.js +9 -2
  413. package/dist/tenancy/static-tenant-source.js.map +1 -1
  414. package/kb-template/.bevelignore +0 -5
  415. package/mcp-app/page.html +349 -0
  416. package/migrations/0017_atlassian_account_links.sql +37 -0
  417. package/migrations/meta/0017_snapshot.json +2396 -0
  418. package/migrations/meta/_journal.json +8 -1
  419. package/package.json +6 -3
  420. package/src/__tests__/kb-layout-config.test.ts +10 -100
  421. package/src/__tests__/packaged-assets-ship.test.ts +66 -0
  422. package/src/assets.ts +38 -2
  423. package/src/core/__tests__/catalog-revision.test.ts +40 -0
  424. package/src/core/__tests__/gated-boot.test.ts +1 -0
  425. package/src/core/__tests__/lifecycle.test.ts +14 -0
  426. package/src/core/catalog-revision.ts +15 -2
  427. package/src/core/core-ports.ts +11 -0
  428. package/src/core/create-core-server.ts +78 -3
  429. package/src/core/create-core-services.ts +168 -10
  430. package/src/core/lifecycle.ts +28 -2
  431. package/src/core-config.ts +24 -1
  432. package/src/index.ts +2 -2
  433. package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
  434. package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
  435. package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
  436. package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
  437. package/src/modules/access/access-control.interface.ts +28 -0
  438. package/src/modules/access/access-control.service.ts +37 -0
  439. package/src/modules/access/directory-sync-bot.ts +1 -1
  440. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
  441. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
  442. package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
  443. package/src/modules/agent-guide/agent-guide.ts +300 -0
  444. package/src/modules/agent-guide/index.ts +22 -0
  445. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
  446. package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
  447. package/src/modules/agent-instructions/compose.ts +26 -8
  448. package/src/modules/agent-instructions/index.ts +0 -3
  449. package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
  450. package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
  451. package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
  452. package/src/modules/audit/agent-audit.service.ts +58 -3
  453. package/src/modules/audit/agent-connection.routes.ts +56 -0
  454. package/src/modules/audit/audit.contract.ts +26 -0
  455. package/src/modules/audit/index.ts +1 -0
  456. package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
  457. package/src/modules/auth/account.routes.ts +10 -3
  458. package/src/modules/auth/auth.middleware.ts +1 -1
  459. package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
  460. package/src/modules/code-mode/code-mode.tool.ts +13 -2
  461. package/src/modules/database/core-schema.ts +33 -3
  462. package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
  463. package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
  464. package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
  465. package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
  466. package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
  467. package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
  468. package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
  469. package/src/modules/embed/account-link.service.ts +76 -0
  470. package/src/modules/embed/embed-link.ts +180 -0
  471. package/src/modules/embed/embed.errors.ts +43 -0
  472. package/src/modules/embed/embed.interface.ts +203 -0
  473. package/src/modules/embed/embed.routes.ts +363 -0
  474. package/src/modules/embed/embed.service.ts +705 -0
  475. package/src/modules/embed/embed.tools.ts +206 -0
  476. package/src/modules/embed/mcp-app.routes.ts +41 -0
  477. package/src/modules/embed/mcp-app.ts +173 -0
  478. package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
  479. package/src/modules/github-app/github-app.connection.ts +38 -4
  480. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
  481. package/src/modules/kb-fs/locking-filesystem.ts +287 -0
  482. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
  483. package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
  484. package/src/modules/kb-sync/kb-sync.service.ts +6 -0
  485. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
  486. package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
  487. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
  488. package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
  489. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
  490. package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
  491. package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
  492. package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
  493. package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
  494. package/src/modules/mcp/mcp.service.ts +218 -31
  495. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
  496. package/src/modules/mcp/tool-schema-guard.ts +196 -0
  497. package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
  498. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
  499. package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
  500. package/src/modules/onboarding/onboarding.contract.ts +85 -0
  501. package/src/modules/onboarding/onboarding.routes.ts +85 -0
  502. package/src/modules/onboarding/starter-pack.service.ts +580 -0
  503. package/src/modules/onboarding/starter-packs.ts +182 -0
  504. package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
  505. package/src/modules/plugins/index.ts +1 -0
  506. package/src/modules/plugins/plugin-provision.service.ts +22 -1
  507. package/src/modules/plugins/plugins.routes.ts +29 -0
  508. package/src/modules/plugins/plugins.tools.ts +75 -15
  509. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
  510. package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
  511. package/src/modules/settings/deployment-settings.service.ts +144 -55
  512. package/src/modules/settings/repository-source.ts +4 -4
  513. package/src/modules/settings/setup.routes.ts +3 -6
  514. package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
  515. package/src/modules/skills/skills.tools.ts +112 -46
  516. package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
  517. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
  518. package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
  519. package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
  520. package/src/modules/tool-auth/external-api-key.service.ts +61 -4
  521. package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
  522. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
  523. package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
  524. package/src/modules/tool-helpers/index.ts +34 -1
  525. package/src/modules/tool-helpers/route-argument-check.ts +149 -0
  526. package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
  527. package/src/modules/tool-helpers/tool-def.ts +132 -7
  528. package/src/modules/tool-helpers/tool-handler.ts +196 -8
  529. package/src/modules/tool-helpers/tool.contract.ts +9 -0
  530. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
  531. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
  532. package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
  533. package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
  534. package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
  535. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
  536. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
  537. package/src/modules/tool-registry/description-length.ts +57 -32
  538. package/src/modules/tool-registry/guide-first.ts +41 -0
  539. package/src/modules/tool-registry/tool-registry.ts +9 -2
  540. package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
  541. package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
  542. package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
  543. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
  544. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
  545. package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
  546. package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
  547. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
  548. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
  549. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
  550. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
  551. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
  552. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
  553. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
  554. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
  555. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
  556. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
  557. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
  558. package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
  559. package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
  560. package/src/modules/workflow/file-lock.service.ts +67 -5
  561. package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
  562. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
  563. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
  564. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
  565. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
  566. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
  567. package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
  568. package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
  569. package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
  570. package/src/modules/workflow/git/git.service.ts +714 -133
  571. package/src/modules/workflow/git/merge-commit.ts +88 -0
  572. package/src/modules/workflow/git/node-git-runner.ts +82 -7
  573. package/src/modules/workflow/git/pull-request.service.ts +380 -54
  574. package/src/modules/workflow/pending-commits.service.ts +29 -1
  575. package/src/modules/workflow/pending-commits.worker.ts +24 -6
  576. package/src/modules/workflow/recovery-bot.ts +1 -1
  577. package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
  578. package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
  579. package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
  580. package/src/modules/workflow/sanitize-error.ts +50 -0
  581. package/src/modules/workflow/workflow.routes.ts +7 -2
  582. package/src/modules/workflow/workflow.service.ts +886 -112
  583. package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
  584. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
  585. package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
  586. package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
  587. package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
  588. package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
  589. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
  590. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
  591. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
  592. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
  593. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
  594. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
  595. package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
  596. package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
  597. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
  598. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
  599. package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
  600. package/src/modules/workspace/agent-download.builder.ts +308 -0
  601. package/src/modules/workspace/agent-download.routes.ts +183 -0
  602. package/src/modules/workspace/agent-download.store.ts +533 -0
  603. package/src/modules/workspace/agent-upload.store.ts +23 -7
  604. package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
  605. package/src/modules/workspace/file-readers/text-reader.ts +5 -8
  606. package/src/modules/workspace/first-run.ts +222 -0
  607. package/src/modules/workspace/move-links.ts +237 -0
  608. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
  609. package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
  610. package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
  611. package/src/modules/workspace/startup/steps/template-source.ts +5 -3
  612. package/src/modules/workspace/workspace.routes.ts +64 -22
  613. package/src/modules/workspace/workspace.service.ts +202 -25
  614. package/src/modules/workspace/workspace.tools.ts +707 -68
  615. package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
  616. package/src/modules/write-access/write-access.ts +9 -0
  617. package/src/shared/domain-errors.ts +123 -11
  618. package/src/shared/git.contract.ts +8 -1
  619. package/src/shared/hidden-tools.ts +45 -0
  620. package/src/shared/utf8-text.ts +21 -0
  621. package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
  622. package/src/tenancy/static-tenant-source.ts +10 -2
  623. package/starter-packs/README.md +103 -0
  624. package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
  625. package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
  626. package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
  627. package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
  628. package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
  629. package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
  630. package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
  631. package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
  632. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
  633. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
  634. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
  635. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
  636. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
  637. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
  638. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
  639. package/starter-packs/engineering/pack.yaml +11 -0
  640. package/starter-packs/general/KnowledgeBase/About us.md +9 -0
  641. package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
  642. package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
  643. package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
  644. package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
  645. package/starter-packs/general/Plugins/general-starter/access.md +19 -0
  646. package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
  647. package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
  648. package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
  649. package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
  650. package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
  651. package/starter-packs/general/pack.yaml +10 -0
  652. package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
  653. package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
  654. package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
  655. package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
  656. package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
  657. package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
  658. package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
  659. package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
  660. package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
  661. package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
  662. package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
  663. package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
  664. package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
  665. package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
  666. package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
  667. package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
  668. package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
  669. package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
  670. package/starter-packs/operations/pack.yaml +12 -0
  671. package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
  672. package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
  673. package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
  674. package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
  675. package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
  676. package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
  677. package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
  678. package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
  679. package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
  680. package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
  681. package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
  682. package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
  683. package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
  684. package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
  685. package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
  686. package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
  687. package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
  688. package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
  689. package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
  690. package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
  691. package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
  692. package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
  693. package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
  694. package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
  695. package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
  696. package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
  697. package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
  698. package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
  699. package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
  700. package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
  701. package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
  702. package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
  703. package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
  704. package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
  705. package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
  706. package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
  707. package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
  708. package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
  709. package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
  710. package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
  711. package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
  712. package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
  713. package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
  714. package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
  715. package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
  716. package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
  717. package/starter-packs/sales/pack.yaml +13 -0
  718. package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
  719. package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
  720. package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
  721. package/starter-packs/support/KnowledgeBase/Products.md +9 -0
  722. package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
  723. package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
  724. package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
  725. package/starter-packs/support/Plugins/support-starter/access.md +19 -0
  726. package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
  727. package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
  728. package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
  729. package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
  730. package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
  731. package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
  732. package/starter-packs/support/pack.yaml +12 -0
  733. package/kb-template/AGENTS.md +0 -730
@@ -34,6 +34,7 @@ const DETAIL: ToolManualDetail = {
34
34
  type: 'inline',
35
35
  description: 'Read and write GitHub issues and PRs.',
36
36
  capabilities: [{ name: 'create_issue', description: 'Open an issue in a repo.' }],
37
+ hiddenTools: [],
37
38
  };
38
39
 
39
40
  let httpServer: HttpServer | undefined;
@@ -205,6 +206,62 @@ describe('ToolManualService.getDetail — capabilities + access', () => {
205
206
  });
206
207
  });
207
208
 
209
+ /**
210
+ * The tool page's half of the marker. The finding comes from the MCP proxy,
211
+ * which is the only thing that loads a connected server's tools; what this
212
+ * endpoint decides is WHO sees it — the people who may write the `.tool`,
213
+ * and nobody else.
214
+ */
215
+ describe('a tool of this server hidden for an invalid schema', () => {
216
+ const HIDDEN = {
217
+ manual: 'remote',
218
+ name: 'remote_srv_query',
219
+ path: '/properties/value/anyOf/0/required/0',
220
+ reason: 'must be a string',
221
+ marker:
222
+ 'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
223
+ };
224
+
225
+ const writer = (allowed: boolean): IAccessControl =>
226
+ ({
227
+ canRead: async () => true,
228
+ canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
229
+ canWrite: async () => allowed,
230
+ }) as unknown as IAccessControl;
231
+
232
+ test('is reported to a caller who may write the tool', async () => {
233
+ await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
234
+ const service = svc(writer(true));
235
+ service.setHiddenTools({ hiddenFor: (manual) => (manual === 'remote' ? [HIDDEN] : []) });
236
+ expect((await service.getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([HIDDEN]);
237
+ });
238
+
239
+ test('is withheld from a caller who may only read it', async () => {
240
+ await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
241
+ const service = svc(writer(false));
242
+ service.setHiddenTools({ hiddenFor: () => [HIDDEN] });
243
+ expect((await service.getDetail('reader@x.eu', 'remote'))?.hiddenTools).toEqual([]);
244
+ });
245
+
246
+ test('is empty, and costs no write check, when the server is healthy', async () => {
247
+ await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
248
+ const canWrite = vi.fn(async () => true);
249
+ const service = svc({
250
+ canRead: async () => true,
251
+ canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
252
+ canWrite,
253
+ } as unknown as IAccessControl);
254
+ service.setHiddenTools({ hiddenFor: () => [] });
255
+ expect((await service.getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([]);
256
+ expect(canWrite).not.toHaveBeenCalled();
257
+ });
258
+
259
+ test('is empty when no MCP surface has loaded a server yet', async () => {
260
+ await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
261
+ expect((await svc().getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([]);
262
+ });
263
+ });
264
+
208
265
  test('description is null (not undefined) when the file declares none', async () => {
209
266
  await withTool('bare.tool', JSON.stringify({ name: 'bare', type: 'inline', tools: [] }));
210
267
  const detail = await svc().getDetail('user@x.eu', 'bare');
@@ -9,6 +9,7 @@ import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
9
9
  import { registerToolManualsTools } from '../tool-manuals.tools.js';
10
10
  import type { IToolManualService } from '../tool-manuals.contract.js';
11
11
  import { testKbContext } from '../../../__tests__/kb-context.js';
12
+ import type { HiddenTool, HiddenToolSource } from '../../../shared/hidden-tools.js';
12
13
 
13
14
  /**
14
15
  * `list_tool_setup` MUST respect the same access controls as every other tool
@@ -31,7 +32,10 @@ const BOB = { id: 'user-bob', email: 'bob@x.com', name: 'Bob' };
31
32
  const CATALOG = [
32
33
  {
33
34
  slug: 'weather',
34
- name: 'weather',
35
+ // The catalog NAME differs from the slug on purpose: the hidden-tool
36
+ // source is keyed by name, and a lookup keyed by slug would pass a
37
+ // fixture where the two are the same string.
38
+ name: 'Weather Service',
35
39
  path: 'Plugins/weather.tool',
36
40
  type: 'mcp' as const,
37
41
  setup: { kind: 'oauth-manual' as const, reason: 'no dynamic client registration' },
@@ -93,7 +97,16 @@ const externalApiKeyService = {
93
97
  t === 'bevel_alice' ? { user: ALICE, tokenId: 'tok-a' } : t === 'bevel_bob' ? { user: BOB, tokenId: 'tok-b' } : null,
94
98
  } as never;
95
99
 
96
- async function start(): Promise<string> {
100
+ /** What the proxy's schema check found for `weather`, when a test wires one in. */
101
+ const HIDDEN_WEATHER_TOOL: HiddenTool = {
102
+ manual: 'Weather Service',
103
+ name: 'weather_srv_forecast',
104
+ path: '/properties/value/anyOf/0/required/0',
105
+ reason: 'must be a string',
106
+ marker: 'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
107
+ };
108
+
109
+ async function start(hiddenTools?: HiddenToolSource): Promise<string> {
97
110
  const registry = new ToolRegistry();
98
111
  const internalToken = new InternalTokenService({ secret: 'test-secret' });
99
112
  const toolAuth = createToolAuthMiddleware(externalApiKeyService, internalToken);
@@ -116,6 +129,7 @@ async function start(): Promise<string> {
116
129
  accessControl,
117
130
  variableStatus: { statusFor },
118
131
  kb: testKbContext(),
132
+ hiddenTools,
119
133
  });
120
134
  app.use('/api', router);
121
135
 
@@ -158,8 +172,10 @@ describe('list_tool_setup — access controls resolved for the caller', () => {
158
172
  // Bob can't read billing — it must be absent, not just canWrite=false.
159
173
  expect(bob.tools.map((t) => t.slug)).toEqual(['weather']);
160
174
  expect(bob.tools[0].canWrite).toBe(false);
161
- // Status was resolved for BOB's user id, not leaked from Alice's.
162
- expect(statusFor).toHaveBeenLastCalledWith(BOB.id, ['weather_SHARED_KEY']);
175
+ // Status was resolved for BOB's user id, not leaked from Alice's — under
176
+ // the key the vault derives from the manual's NAME (`Weather Service`:
177
+ // the space becomes `_`, every `_` is doubled, then the variable).
178
+ expect(statusFor).toHaveBeenLastCalledWith(BOB.id, ['Weather__Service_SHARED_KEY']);
163
179
  expect(bob.tools[0].variables[0].userConfigured).toBe(false);
164
180
  });
165
181
 
@@ -182,6 +198,59 @@ describe('list_tool_setup — access controls resolved for the caller', () => {
182
198
  expect(bob.invalid).toEqual([]);
183
199
  });
184
200
 
201
+ it('marks a tool hidden for an invalid schema, to the caller who may manage the server', async () => {
202
+ const base = await start({
203
+ hiddenFor: (manual) => (manual === 'Weather Service' ? [HIDDEN_WEATHER_TOOL] : []),
204
+ });
205
+
206
+ const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
207
+ tools: { slug: string; hiddenTools: HiddenTool[] }[];
208
+ };
209
+ // Alice writes `weather`, so she is the one who can get the schema fixed.
210
+ expect(alice.tools.find((t) => t.slug === 'weather')!.hiddenTools).toEqual([HIDDEN_WEATHER_TOOL]);
211
+ // The marker names the tool, the place and the reason, in one sentence.
212
+ expect(alice.tools.find((t) => t.slug === 'weather')!.hiddenTools[0].marker).toBe(
213
+ 'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
214
+ );
215
+ // Nothing is wrong with `billing`, which Alice cannot write anyway.
216
+ expect(alice.tools.find((t) => t.slug === 'billing')!.hiddenTools).toEqual([]);
217
+
218
+ // Bob READS `weather` and cannot write it: the marker is not his to see.
219
+ // He has no way to fix the schema, and the hidden tool is simply not among
220
+ // the ones he can call.
221
+ const bob = (await (await callSetup(base, 'bevel_bob')).json()) as {
222
+ tools: { slug: string; hiddenTools: HiddenTool[] }[];
223
+ };
224
+ expect(bob.tools.map((t) => t.slug)).toEqual(['weather']);
225
+ expect(bob.tools[0].hiddenTools).toEqual([]);
226
+ });
227
+
228
+ it('reports no hidden tool on a deployment with no MCP surface at all — no source wired', async () => {
229
+ const base = await start(); // no source wired, as a deployment without the proxy
230
+ const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
231
+ tools: { slug: string; hiddenTools: HiddenTool[] }[];
232
+ };
233
+ for (const tool of alice.tools) expect(tool.hiddenTools).toEqual([]);
234
+ });
235
+
236
+ it('reports no hidden tool to a manager whose server is healthy, or has not loaded yet — source wired, nothing found', async () => {
237
+ // The distinct case from the one above: the proxy IS there and has nothing
238
+ // against `weather`, which Alice manages. `[]` is the finding, not the
239
+ // absence of a finder.
240
+ const hiddenFor = vi.fn((): HiddenTool[] => []);
241
+ const base = await start({ hiddenFor });
242
+ const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
243
+ tools: { slug: string; canWrite: boolean; hiddenTools: HiddenTool[] }[];
244
+ };
245
+ const weather = alice.tools.find((t) => t.slug === 'weather')!;
246
+ expect(weather.canWrite).toBe(true);
247
+ expect(weather.hiddenTools).toEqual([]);
248
+ // Asked by the manual's catalog NAME, which is how the proxy knows it —
249
+ // not by its slug — and the answer came from the source.
250
+ expect(hiddenFor).toHaveBeenCalledWith('Weather Service');
251
+ expect(hiddenFor).not.toHaveBeenCalledWith('weather');
252
+ });
253
+
185
254
  it('rejects an unauthenticated call outright', async () => {
186
255
  const base = await start();
187
256
  const res = await fetch(`${base}/api/agent/tools/list_tool_setup`, {
@@ -1,4 +1,5 @@
1
1
  import type { CallTemplate } from '@utcp/sdk';
2
+ import type { HiddenTool, HiddenToolSource } from '../../shared/hidden-tools.js';
2
3
 
3
4
  /**
4
5
  * Tool manuals — user-authored `*.tool` files under `Plugins/` in the DEFAULT
@@ -329,10 +330,11 @@ export interface ToolCapability {
329
330
 
330
331
  /**
331
332
  * A single tool manual for the BROWSER tool page (`GET /api/tools/:slug`): the
332
- * summary plus the two human-facing fields the catalog listing has no use for.
333
- * Both are normalized to `null` rather than left optional — the page renders a
334
- * definite "nothing here" state, so an absent field and an empty one are the
335
- * same thing to it.
333
+ * summary plus the three human-facing fields the catalog listing has no use
334
+ * for — the description, the capabilities and the tools hidden for an invalid
335
+ * schema. Each is normalized to a definite empty (`null`, `[]`) rather than
336
+ * left optional — the page renders a definite "nothing here" state, so an
337
+ * absent field and an empty one are the same thing to it.
336
338
  */
337
339
  export interface ToolManualDetail extends Omit<ToolManualSummary, 'description'> {
338
340
  description: string | null;
@@ -342,6 +344,16 @@ export interface ToolManualDetail extends Omit<ToolManualSummary, 'description'>
342
344
  * round-trip this endpoint deliberately does not make), so they report `[]`.
343
345
  */
344
346
  capabilities: ToolCapability[];
347
+ /**
348
+ * Tools of this manual that Hexis keeps off every agent surface because
349
+ * their input schema is not valid JSON Schema as the server sent it, each
350
+ * with the place and the reason.
351
+ *
352
+ * Only for a caller who may WRITE this manual's file: the marker is for the
353
+ * people who manage the server, who are the only ones who can get the schema
354
+ * fixed. `[]` for everyone else, and for a server with nothing wrong.
355
+ */
356
+ hiddenTools: HiddenTool[];
345
357
  }
346
358
 
347
359
  export interface IToolManualService {
@@ -374,6 +386,14 @@ export interface IToolManualService {
374
386
  */
375
387
  getDetail(userEmail: string, slug: string): Promise<ToolManualDetail | null>;
376
388
 
389
+ /**
390
+ * Wire where a hidden tool's schema finding comes from (the MCP proxy, which
391
+ * is constructed after this service — setter injection for the same reason
392
+ * `setMcpAuthDiscovery` is one). Without it `getDetail` reports no hidden
393
+ * tool, which is the honest answer for a deployment with no MCP surface.
394
+ */
395
+ setHiddenTools(source: HiddenToolSource): void;
396
+
377
397
  /**
378
398
  * One line per manual the caller can read, each carrying the manual's
379
399
  * identity AND a digest of the file it was parsed from — the input the
@@ -32,6 +32,7 @@ import { RESERVED_VARIABLE_NAMES, findReservedVariableRef } from '../../shared/v
32
32
  import { extractFrontmatter, resolveDeclaredId, isValidId, dedupeById } from '../../shared/frontmatter-id.js';
33
33
  import type { ITreeWalker } from '../../shared/fs.contract.js';
34
34
  import { TtlCache } from '../../shared/ttl-cache.js';
35
+ import type { HiddenToolSource } from '../../shared/hidden-tools.js';
35
36
  import {
36
37
  utcpNamespacePrefix,
37
38
  utcpNamespacedKey,
@@ -239,6 +240,8 @@ export type McpAuthDiscoveryResult =
239
240
  export class ToolManualService implements IToolManualService {
240
241
  private readonly cache: TtlCache<ScanResult>;
241
242
  private mcpAuthDiscovery?: McpAuthDiscoveryPort;
243
+ /** Where a hidden tool's schema finding comes from; absent until wired. */
244
+ private hiddenTools?: HiddenToolSource;
242
245
  /**
243
246
  * The refused set as it was last written to the log, so the warnings are
244
247
  * logged ONCE PER CHANGE rather than once per scan. A broken `.tool` sits
@@ -288,6 +291,10 @@ export class ToolManualService implements IToolManualService {
288
291
  this.mcpAuthDiscovery = discovery;
289
292
  }
290
293
 
294
+ setHiddenTools(source: HiddenToolSource): void {
295
+ this.hiddenTools = source;
296
+ }
297
+
291
298
  invalidate(): void {
292
299
  this.cache.invalidate();
293
300
  this.inFlightScan = null;
@@ -317,10 +324,20 @@ export class ToolManualService implements IToolManualService {
317
324
  // model, no second place for the access rules to drift.
318
325
  const found = (await this.accessibleManuals(userEmail)).find((m) => m.slug === slug);
319
326
  if (!found) return null;
327
+ // The marker is for whoever manages the server: the same per-file write
328
+ // verdict that gates setting the tool's shared secrets. A reader sees
329
+ // nothing of it — they can neither fix the schema nor do anything with the
330
+ // knowledge that one of the server's tools is off. The write check is
331
+ // asked only when there is something to show, so the healthy case (every
332
+ // tool of every server) costs no ACL round-trip.
333
+ const hidden = this.hiddenTools?.hiddenFor(found.name) ?? [];
334
+ const mayManage =
335
+ hidden.length > 0 && (await this.accessControl.canWrite(this.kb.defaultWorkspaceId(), userEmail, found.path));
320
336
  return {
321
337
  ...toSummary(found),
322
338
  description: found.description ?? null,
323
339
  capabilities: capabilitiesOf(found),
340
+ hiddenTools: mayManage ? hidden : [],
324
341
  };
325
342
  }
326
343
 
@@ -3,10 +3,12 @@ import type { IToolRegistry, UtcpTool } from '../tool-registry/tool.contract.js'
3
3
  import type { KbContext } from '../../shared/kb-context.js';
4
4
  import type { ToolContext } from '../tool-helpers/tool.contract.js';
5
5
  import { toolDef } from '../tool-helpers/tool-def.js';
6
+ import { declareRouteTool } from '../tool-helpers/route-tool-schemas.js';
6
7
  import type { ToolHandlerFactory } from '../tool-helpers/tool-handler.js';
7
8
  import type { IAccessControl } from '../access/access-control.interface.js';
8
9
  import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
9
10
  import type { IToolManualService } from './tool-manuals.contract.js';
11
+ import type { HiddenToolSource } from '../../shared/hidden-tools.js';
10
12
 
11
13
  /**
12
14
  * What `list_tool_setup` needs from the secrets vault (structurally satisfied
@@ -43,10 +45,21 @@ export function registerToolManualsTools(
43
45
  variableStatus: VariableStatusPort;
44
46
  /** Which branch tools are served from, and its clone. */
45
47
  kb: Pick<KbContext, 'defaultBranch' | 'defaultWorkspaceId'>;
48
+ /**
49
+ * Where a hidden tool's schema finding comes from (the MCP proxy).
50
+ * Optional: a deployment with no MCP surface has nothing to report, and
51
+ * `hiddenTools` is then empty everywhere.
52
+ */
53
+ hiddenTools?: HiddenToolSource;
46
54
  },
47
55
  ): void {
48
56
  registry.registerExternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
49
57
  registry.registerInternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
58
+ // The def above is built per catalog listing (its description names the
59
+ // tools configured for THIS caller), so declare the arguments here as well:
60
+ // a direct REST call that lands before the first listing must be checked
61
+ // against them too.
62
+ declareRouteTool('list_local_tools', LIST_LOCAL_TOOLS_INPUTS);
50
63
 
51
64
  router.post(
52
65
  '/agent/tools/list_local_tools',
@@ -66,23 +79,31 @@ export function registerToolManualsTools(
66
79
  const listSetupDef = toolDef({
67
80
  name: 'list_tool_setup',
68
81
  // What each FIELD means is documented on the field, in `outputs` below:
69
- // `setup.kind`, `variables` and `invalid` each carried a paragraph here,
70
- // which made this description two thousand characters and so the first
71
- // thing a client cut. The description says what the tool answers and the
72
- // three things an agent cannot read off a field.
82
+ // `setup.kind`, `variables`, `invalid` and `hiddenTools` each carried a
83
+ // paragraph here, which made this description two thousand characters and
84
+ // so the first thing a client cut. The description says what the tool
85
+ // answers and the four things an agent cannot read off a field.
86
+ //
87
+ // It sits a few characters under `TOOL_DESCRIPTION_CAP` WITH the guide-first
88
+ // sentence the registry puts in front of it (`tool-registry/guide-first.ts`)
89
+ // and the `Call:` line generated ahead of everything,
90
+ // which is why every sentence here is the short form: the `hiddenTools`
91
+ // clause and that opener both came out of the same budget, and what a
92
+ // hidden tool's entry CONTAINS is on the field below rather than here.
73
93
  description:
74
- 'Configuration status of every `.tool` the current user can access: what each tool needs set up and what is ' +
75
- 'already configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER — a `.tool` it cannot ' +
76
- 'READ is absent entirely, and every flag is the caller\'s own state. ' +
77
- 'Secret VALUES are never returned and can never be set through a tool: an admin enters them in the tool editor, ' +
78
- 'and users sign in on /connect rather than typing a value. ' +
79
- 'What gates setting a tool\'s shared secrets is `canWrite` on the `.tool` FILE — per-file access from its ' +
80
- 'frontmatter `write:`/`owner:` verbs and the access.md chain, NOT a platform role: the people who manage the ' +
81
- 'file configure the tool. ' +
94
+ 'Configuration status of every `.tool` the current user can access: what each needs set up and what is ' +
95
+ 'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot ' +
96
+ 'READ is absent, and every flag is the caller\'s own. ' +
97
+ 'Secret VALUES are never returned and can never be set through a tool: an admin enters them in the tool ' +
98
+ 'editor; users sign in on /connect. ' +
99
+ 'Setting a tool\'s shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter ' +
100
+ '`write:`/`owner:` verbs and the access.md chain), NOT by a platform role: who manages the file configures ' +
101
+ 'the tool. ' +
102
+ '`hiddenTools` names the tools Hexis hides from agents for an invalid schema. ' +
82
103
  'The listing is the RELEASED catalog, built from the default branch only: a server or `.tool` you declared on a ' +
83
- 'draft is not listed, not callable and not signed-in-able until that draft is merged. Pass `branch` (the draft ' +
84
- 'you wrote the declaration on) and `onBranchOnly` names every tool declared there that the default branch does ' +
85
- 'not serve yet — open a change request, then ask the user to review and merge it in the app to activate it.',
104
+ 'draft is not listed, callable or signed-in-able until it is merged. Pass `branch` (the draft you wrote the ' +
105
+ 'declaration on) and `onBranchOnly` names every tool declared there that the default branch does not serve ' +
106
+ 'yet — open a change request and ask the user to merge it.',
86
107
  path: '/api/agent/tools/list_tool_setup',
87
108
  inputs: {
88
109
  type: 'object',
@@ -132,6 +153,22 @@ export function registerToolManualsTools(
132
153
  type: 'boolean',
133
154
  description: 'You may write this `.tool` FILE, which is what gates setting its shared secrets.',
134
155
  },
156
+ hiddenTools: {
157
+ type: 'array',
158
+ description:
159
+ 'Tools of this server kept off every agent surface for an invalid input schema. Empty ' +
160
+ 'unless the caller may write this tool.',
161
+ items: {
162
+ type: 'object',
163
+ properties: {
164
+ name: { type: 'string', description: 'The name the tool would have been offered under.' },
165
+ path: { type: 'string', description: 'JSON Pointer to the place in the schema that is not valid.' },
166
+ reason: { type: 'string', description: 'Why that place is not valid, in the validator\'s words.' },
167
+ marker: { type: 'string', description: 'The one sentence the tool page shows for this tool.' },
168
+ },
169
+ required: ['name', 'path', 'reason', 'marker'],
170
+ },
171
+ },
135
172
  variables: {
136
173
  type: 'array',
137
174
  description:
@@ -156,7 +193,7 @@ export function registerToolManualsTools(
156
193
  },
157
194
  },
158
195
  },
159
- required: ['slug', 'name', 'path', 'type', 'canWrite', 'variables'],
196
+ required: ['slug', 'name', 'path', 'type', 'canWrite', 'hiddenTools', 'variables'],
160
197
  },
161
198
  },
162
199
  invalid: {
@@ -219,27 +256,35 @@ export function registerToolManualsTools(
219
256
  const status = await deps.variableStatus.statusFor(ctx.user.id, allKeys);
220
257
  const statusByKey = new Map(status.map((s) => [s.key, s]));
221
258
  const tools = await Promise.all(
222
- manuals.map(async (m) => ({
223
- slug: m.slug,
224
- name: m.name,
225
- path: m.path,
226
- type: m.type,
227
- setup: m.setup ?? null,
228
- canWrite: await deps.accessControl.canWrite(defaultWs(), ctx.user.email, m.path),
229
- variables: (m.variables ?? []).map((v) => {
230
- const st = statusByKey.get(varKey(m.name, v.name));
231
- const isOAuth = v.oauth != null;
232
- return {
233
- name: v.name,
234
- scope: v.scope,
235
- label: v.label ?? null,
236
- oauth: isOAuth,
237
- adminConfigured: st?.adminConfigured ?? false,
238
- userConfigured: st?.userConfigured ?? false,
239
- authorized: isOAuth ? (st?.userAuthorized ?? false) : null,
240
- };
241
- }),
242
- })),
259
+ manuals.map(async (m) => {
260
+ const canWrite = await deps.accessControl.canWrite(defaultWs(), ctx.user.email, m.path);
261
+ return {
262
+ slug: m.slug,
263
+ name: m.name,
264
+ path: m.path,
265
+ type: m.type,
266
+ setup: m.setup ?? null,
267
+ canWrite,
268
+ // The marker goes only to the people who manage the server — the
269
+ // same verdict that gates setting its shared secrets. A caller who
270
+ // may only READ the tool is told nothing about it: they cannot fix
271
+ // the schema, and the tool is simply not among the ones they can call.
272
+ hiddenTools: canWrite ? (deps.hiddenTools?.hiddenFor(m.name) ?? []) : [],
273
+ variables: (m.variables ?? []).map((v) => {
274
+ const st = statusByKey.get(varKey(m.name, v.name));
275
+ const isOAuth = v.oauth != null;
276
+ return {
277
+ name: v.name,
278
+ scope: v.scope,
279
+ label: v.label ?? null,
280
+ oauth: isOAuth,
281
+ adminConfigured: st?.adminConfigured ?? false,
282
+ userConfigured: st?.userConfigured ?? false,
283
+ authorized: isOAuth ? (st?.userAuthorized ?? false) : null,
284
+ };
285
+ }),
286
+ };
287
+ }),
243
288
  );
244
289
  const onBranchOnly = pending.map((p) => ({ ...p, branch: branch! }));
245
290
  if (onBranchOnly.length === 0) return { tools, invalid, onBranchOnly };
@@ -265,6 +310,9 @@ async function localToolsLine(svc: IToolManualService, userEmail?: string): Prom
265
310
  return `Local-only tools configured for you: ${tools.map((t) => `\`${t.name}\``).join(', ')}.`;
266
311
  }
267
312
 
313
+ /** `list_local_tools` takes nothing; a const so the route and the def share one declaration. */
314
+ const LIST_LOCAL_TOOLS_INPUTS = { type: 'object' as const, properties: {}, additionalProperties: false };
315
+
268
316
  async function buildListLocalToolsDef(svc: IToolManualService, userEmail?: string): Promise<UtcpTool> {
269
317
  return toolDef({
270
318
  name: 'list_local_tools',
@@ -280,7 +328,7 @@ async function buildListLocalToolsDef(svc: IToolManualService, userEmail?: strin
280
328
  'setup by hand. ' +
281
329
  (await localToolsLine(svc, userEmail)),
282
330
  path: '/api/agent/tools/list_local_tools',
283
- inputs: { type: 'object', properties: {}, additionalProperties: false },
331
+ inputs: LIST_LOCAL_TOOLS_INPUTS,
284
332
  outputs: {
285
333
  type: 'object',
286
334
  properties: {
@@ -0,0 +1,173 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import express from 'express';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { inputSchemaDefect } from '@bevel-software/platform-mcp-core';
5
+ import { ToolRegistry } from '../tool-registry.js';
6
+ import { registerWorkflowTools } from '../../workflow/agent-tools/workflow.tools.js';
7
+ import { registerChangeRequestReadTools } from '../../workflow/agent-tools/change-request-read.tools.js';
8
+ import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
9
+ import { registerSkillsTools } from '../../skills/skills.tools.js';
10
+ import { registerPluginsTools } from '../../plugins/plugins.tools.js';
11
+ import { registerToolManualsTools } from '../../tool-manuals/tool-manuals.tools.js';
12
+ import { registerEmbedTools } from '../../embed/embed.tools.js';
13
+ import { registerAgentGuideTool } from '../../agent-guide/agent-guide.tools.js';
14
+ import { ToolDescriptionNotes } from '../../workspace/agent-access.gate.js';
15
+ import { testKbContext } from '../../../__tests__/kb-context.js';
16
+
17
+ /**
18
+ * Every tool Hexis declares itself, checked against the same JSON Schema rules
19
+ * a connected server's tool is checked against.
20
+ *
21
+ * Hexis hides a connected tool whose input schema is invalid, because an AI
22
+ * client would otherwise drop it in silence. The platform's own tools go to
23
+ * those same clients through those same surfaces, so a mistake in one of these
24
+ * schemas costs the tool just as quietly — and it would be Hexis's mistake.
25
+ * This test is the thing that makes shipping one impossible.
26
+ *
27
+ * It registers the DEFS as `create-core-server` does, with stubs for the
28
+ * services (no def-building path touches one: the lazy providers are resolved
29
+ * with no caller context, which is their static form).
30
+ *
31
+ * Add a tool module to the server and this test FAILS until it is added here:
32
+ * `covers every tool module the server registers` reads the server's own source
33
+ * and compares the `register…Tools` calls in it with `MODULES` below. A test
34
+ * that silently skipped a whole module's schemas would be worse than no test,
35
+ * because it would read as if it had checked them.
36
+ */
37
+
38
+ /**
39
+ * A stub service: every method answers with an empty list. The def-building
40
+ * paths that do reach a service only ask it what exists (which skills, which
41
+ * local-only tools) to name them in a description, and "none" is a valid
42
+ * answer that keeps the SCHEMAS — what this test is about — untouched.
43
+ * `then` is excluded so the stub is never mistaken for a promise.
44
+ */
45
+ const nothing = new Proxy(
46
+ {},
47
+ {
48
+ get: (_target, key) => (key === 'then' ? undefined : async () => []),
49
+ },
50
+ ) as never;
51
+
52
+ const pass: express.RequestHandler = (_req, _res, next) => next();
53
+ const handler = (() => pass) as never;
54
+
55
+ /** Where the server registers its tool modules — read, not imported, see below. */
56
+ const CORE_SERVER_SOURCE = new URL('../../../core/create-core-server.ts', import.meta.url);
57
+
58
+ /** Every tool-registering module, by the name the server calls it under. */
59
+ const MODULES: ReadonlyArray<{ name: string; register: (registry: ToolRegistry) => void }> = [
60
+ {
61
+ name: 'registerWorkflowTools',
62
+ register: (registry) => registerWorkflowTools(registry, express.Router(), pass, handler, testKbContext(), async () => true),
63
+ },
64
+ {
65
+ name: 'registerChangeRequestReadTools',
66
+ register: (registry) =>
67
+ registerChangeRequestReadTools(registry, express.Router(), pass, handler, nothing, testKbContext()),
68
+ },
69
+ {
70
+ name: 'registerWorkspaceTools',
71
+ register: (registry) =>
72
+ registerWorkspaceTools(
73
+ registry,
74
+ express.Router(),
75
+ pass,
76
+ handler,
77
+ nothing,
78
+ nothing,
79
+ nothing,
80
+ testKbContext(),
81
+ { recoveryBotEmail: 'recovery@bevel.software', hooks: nothing, notes: new ToolDescriptionNotes() },
82
+ nothing,
83
+ nothing,
84
+ undefined,
85
+ undefined,
86
+ // The upload store: the two upload tools are mounted only when one is
87
+ // supplied, and the server supplies one — so this harness does too,
88
+ // or their schemas would be the two it silently never checked.
89
+ nothing,
90
+ ),
91
+ },
92
+ {
93
+ name: 'registerSkillsTools',
94
+ register: (registry) => registerSkillsTools(registry, express.Router(), pass, handler, nothing),
95
+ },
96
+ { name: 'registerPluginsTools', register: (registry) => registerPluginsTools(registry, testKbContext()) },
97
+ {
98
+ name: 'registerEmbedTools',
99
+ register: (registry) =>
100
+ registerEmbedTools(registry, express.Router(), pass, handler, {
101
+ embedService: nothing,
102
+ kb: testKbContext(),
103
+ readForTool: nothing,
104
+ canBeReached: () => true,
105
+ appUrlFor: (repoRelative) => `https://example.test/workspace/main/knowledge-base/${repoRelative}`,
106
+ notes: new ToolDescriptionNotes(),
107
+ }),
108
+ },
109
+ {
110
+ name: 'registerToolManualsTools',
111
+ register: (registry) =>
112
+ registerToolManualsTools(registry, express.Router(), pass, handler, nothing, {
113
+ accessControl: nothing,
114
+ variableStatus: nothing,
115
+ kb: testKbContext(),
116
+ }),
117
+ },
118
+ {
119
+ // The one module registering a single tool: a provider on both surfaces,
120
+ // built from the sections the reader answers — none here, which still
121
+ // builds the def.
122
+ name: 'registerAgentGuideTool',
123
+ register: (registry) => registerAgentGuideTool(registry, express.Router(), pass, handler, async () => []),
124
+ },
125
+ ];
126
+
127
+ async function toolsOf(modules: ReadonlyArray<(typeof MODULES)[number]>) {
128
+ const registry = new ToolRegistry();
129
+ for (const module of modules) module.register(registry);
130
+ // Both surfaces: the external one is what reaches a connected AI client, the
131
+ // internal one is what the in-app agent calls. Either can carry a bad schema.
132
+ return [...(await registry.listExternal()), ...(await registry.listInternal())];
133
+ }
134
+
135
+ const allOwnTools = () => toolsOf(MODULES);
136
+
137
+ describe("Hexis's own tool schemas", () => {
138
+ /**
139
+ * The harness's own guard, and the reason it reads a source file: nothing in
140
+ * the registry can tell this test about a module nobody registered. A count
141
+ * cannot either — a new module leaves it larger either way. The server's call
142
+ * list can, and it is the only place that knows the whole set.
143
+ */
144
+ it('covers every tool module the server registers', () => {
145
+ const source = readFileSync(CORE_SERVER_SOURCE, 'utf8');
146
+ // `register…Tools` and `register…Tool` alike: a module registering one
147
+ // tool is a module whose schema this harness must check too.
148
+ const registered = [...source.matchAll(/\b(register\w+Tools?)\s*\(/g)].map((m) => m[1]);
149
+ expect([...new Set(registered)].sort()).toEqual(MODULES.map((m) => m.name).sort());
150
+ });
151
+
152
+ it.each(MODULES.map((m) => [m.name, m] as const))('%s contributes tools to check', async (_name, module) => {
153
+ // A module that registers nothing — a renamed registry method, a provider
154
+ // that threw away its defs — would otherwise pass every assertion below
155
+ // while exercising nothing.
156
+ expect(await toolsOf([module])).not.toEqual([]);
157
+ });
158
+
159
+ it('declares valid JSON Schema for every tool, on both surfaces', async () => {
160
+ const defects = (await allOwnTools())
161
+ .map((tool) => ({ tool: tool.name, defect: inputSchemaDefect(tool.inputs) }))
162
+ .filter((entry) => entry.defect !== null);
163
+ // Named, not counted: a failure has to say WHICH tool and WHERE.
164
+ expect(defects).toEqual([]);
165
+ });
166
+
167
+ it('declares an object schema for every tool, as MCP requires of an input schema', async () => {
168
+ const notObjects = (await allOwnTools())
169
+ .filter((tool) => (tool.inputs as { type?: unknown }).type !== 'object')
170
+ .map((tool) => tool.name);
171
+ expect(notObjects).toEqual([]);
172
+ });
173
+ });