@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
@@ -4,7 +4,9 @@ import {
4
4
  CALL_TOOL_CHAIN_NAME,
5
5
  CHAIN_FAILURES_RULE,
6
6
  CHAIN_LARGE_RESULTS_RULE,
7
+ callLine,
7
8
  codeModeMetaTools,
9
+ splitCallLine,
8
10
  } from '@bevel-software/platform-mcp-core';
9
11
  import { testKbContext } from '../../../__tests__/kb-context.js';
10
12
  import { EXTERNAL_KB_MANUAL_NAME } from '../../tool-manuals/tool-manuals.contract.js';
@@ -23,13 +25,13 @@ import { UuidSessionSink } from '../../workspace/session-sink.js';
23
25
  import { RoutineWritePolicyService } from '../../workspace/routine-write-policy.js';
24
26
  import { CLIENT_SHORT_CUT, TOOL_DESCRIPTION_CAP, clientVisibleLength, firstSentenceEnd } from '../description-length.js';
25
27
  import {
26
- POINTER_GUIDE_NAME_BUDGET,
27
- SHARED_RULES_POINTER_MAX,
28
28
  TOOL_PREFIX_CAP,
29
29
  sharedFileRules,
30
- sharedRulesPointer,
31
30
  } from '../../agent-instructions/index.js';
32
31
  import { isPlatformFile, platformFilesByDepth } from '@bevel-software/platform-shared';
32
+ import { GET_AGENT_GUIDE_TOOL, GUIDE_FIRST_SENTENCE, guideFirstDescription } from '../guide-first.js';
33
+ import { registerAgentGuideTool } from '../../agent-guide/agent-guide.tools.js';
34
+ import { agentGuideSections } from '../../agent-guide/agent-guide.js';
33
35
 
34
36
  /**
35
37
  * The cap exists because clients cut a long tool description, and they cut it
@@ -62,16 +64,18 @@ const emptySkills = { listSkills: async () => [] } as unknown as Parameters<type
62
64
  /**
63
65
  * The meta-tools as the hosted endpoint builds them (`mcp.service.ts`):
64
66
  * examples written against the namespace it registers the knowledge-base tools
65
- * under and against the catalog it serves, and the chain ending in the pointer.
66
- * So the chain description measured here carries the worked call a client is
67
- * really sent, which is its longest form.
67
+ * under and against the catalog it serves, and the chain without the rules it
68
+ * states only in the shared places. So the chain description measured here
69
+ * carries the worked call a client is really sent, which is its longest form.
68
70
  */
69
- function servedMetaTools(external: readonly UtcpTool[], pointer = sharedRulesPointer(testKbContext().layout)) {
71
+ function servedMetaTools(external: readonly UtcpTool[]) {
70
72
  return codeModeMetaTools(
71
73
  EXTERNAL_KB_MANUAL_NAME,
72
74
  external.map((t) => ({ utcpName: `${EXTERNAL_KB_MANUAL_NAME}.${t.name}`, inputSchema: t.inputs })),
73
- { sharedRulesPointer: pointer },
74
- );
75
+ { sharedRulesPointer: '' },
76
+ // As the hosted endpoint serves them: opening with the guide-first
77
+ // sentence, through the one helper the endpoint itself uses.
78
+ ).map((t) => ({ ...t, description: guideFirstDescription(t.description) }));
75
79
  }
76
80
 
77
81
  /** Every tool Hexis itself registers, on both surfaces, deduplicated by name. */
@@ -101,20 +105,27 @@ async function hexisTools(): Promise<UtcpTool[]> {
101
105
  // every real composition supplies one: without it they would be the two
102
106
  // descriptions this suite never measured.
103
107
  unused(),
108
+ // The guide reader, not needed to build defs; then the download store,
109
+ // mounted on the same terms as the upload one.
110
+ undefined,
111
+ unused(),
104
112
  );
105
- registerWorkflowTools(registry, router, toolAuth, toolHandler, kb);
106
- registerPluginsTools(registry);
113
+ registerWorkflowTools(registry, router, toolAuth, toolHandler, kb, async () => true);
114
+ registerPluginsTools(registry, kb);
107
115
  registerSkillsTools(registry, router, toolAuth, toolHandler, emptySkills);
108
116
  registerToolManualsTools(registry, router, toolAuth, toolHandler, emptyManuals, {
109
117
  accessControl: unused(),
110
118
  variableStatus: unused(),
111
119
  kb,
112
120
  });
121
+ // The guide's own tool, with the platform's sections: the one description
122
+ // that lists the sections is measured with the list it really carries.
123
+ registerAgentGuideTool(registry, router, toolAuth, toolHandler, () => agentGuideSections(kb.layout));
113
124
 
114
125
  const byName = new Map<string, UtcpTool>();
115
- // The meta-tools as a client is served them: the chain carries its pointer
116
- // (`mcp.service.ts` appends it at the mount), so the catalog measured here is
117
- // the catalog that goes out rather than the unpointed constant.
126
+ // The meta-tools as a client is served them (`mcp.service.ts` opens each
127
+ // with the guide-first sentence at the mount), so the catalog measured here
128
+ // is the catalog that goes out rather than the bare constant.
118
129
  const external = (await registry.listExternal()) as UtcpTool[];
119
130
  const metaTools = servedMetaTools(external);
120
131
  for (const tool of [...(await registry.listInternal()), ...external, ...metaTools]) {
@@ -141,9 +152,11 @@ describe('no Hexis tool description is long enough to be cut', () => {
141
152
  // The cap does not answer the ~500-character cut; the ORDER of the text
142
153
  // does, and this is where that claim is checked rather than asserted in a
143
154
  // comment. A client that stops at 500 must still have the sentence saying
144
- // what the tool does — what it loses is the pointer tail, and the file the
145
- // pointer names is stated in the handshake instructions and in the guide
146
- // anyway. Lowering the cap to 500 would not buy this; only order does.
155
+ // what the tool does — what it loses is the tail. The shared rules are
156
+ // stated in the guide (which the opener sends every client to, including
157
+ // the description-only ones this cut is about) and, for the clients that
158
+ // honour it, in the handshake instructions as well. Lowering
159
+ // the cap to 500 would not buy this; only order does.
147
160
  const late = (await hexisTools())
148
161
  .map((t) => ({ tool: t.name, endsAt: firstSentenceEnd(t) }))
149
162
  .filter((m) => m.endsAt > CLIENT_SHORT_CUT)
@@ -156,30 +169,28 @@ describe('no Hexis tool description is long enough to be cut', () => {
156
169
  ).toEqual([]);
157
170
  });
158
171
 
159
- it('holds the cap on a deployment that renamed its guide, not only under the default', async () => {
160
- // The pointer ends every file tool's description and its length moves with
161
- // a deployment setting, so a cap checked only against the nine characters
162
- // of `AGENTS.md` guarantees nothing about the catalog a renamed deployment
163
- // serves. Two things make it hold: the pointer is bounded by construction
164
- // (past `POINTER_GUIDE_NAME_BUDGET` the guide is named by its role), and
165
- // `clientVisibleLength` charges the worst case rather than this layout's.
172
+ it('opens every tool but the guide\'s own with the guide-first sentence, and fits with it', async () => {
173
+ // The sentence is in the description the registry lists, so the catalog
174
+ // measured here is the catalog a client gets, sentence included.
166
175
  const tools = await hexisTools();
167
- const atWorst = tools
168
- .map((t) => ({ tool: t.name, chars: clientVisibleLength(t) }))
169
- .filter((m) => m.chars > TOOL_DESCRIPTION_CAP);
170
- expect(atWorst, atWorst.map((m) => `${m.tool}: ${m.chars}`).join('\n')).toEqual([]);
171
-
172
- // And measured literally, under the longest guide name a deployment can
173
- // actually configure: every description still fits.
174
- const longest = `${'x'.repeat(252)}.md`;
175
- const pointerHere = sharedRulesPointer(testKbContext().layout);
176
- const pointerThere = sharedRulesPointer({ ...testKbContext().layout, agentsFile: longest });
177
- expect(pointerThere.length).toBeLessThanOrEqual(SHARED_RULES_POINTER_MAX);
178
- for (const tool of tools) {
179
- if (!tool.description?.endsWith(pointerHere)) continue;
180
- const asRenamed = tool.description.slice(0, -pointerHere.length) + pointerThere;
181
- const chars = clientVisibleLength({ name: tool.name, description: asRenamed });
182
- expect(chars, `${tool.name} on a renamed deployment`).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
176
+ // ONE predicate for both halves, so no description falls between them: a
177
+ // tool whose own description is empty is served the sentence alone, and
178
+ // one with text after it has whitespace between — not `here.Read`.
179
+ // Behind the `Call:` line, when the description already carries one (the
180
+ // meta-tools are built with theirs): that line comes first on every tool.
181
+ const opensWithGuide = (t: UtcpTool): boolean => {
182
+ const description = splitCallLine(t.description ?? '').rest;
183
+ if (description === GUIDE_FIRST_SENTENCE) return true;
184
+ return description.startsWith(GUIDE_FIRST_SENTENCE) && /^\s/.test(description.slice(GUIDE_FIRST_SENTENCE.length));
185
+ };
186
+ const opened = tools.filter(opensWithGuide);
187
+ expect(opened.length).toBeGreaterThan(0);
188
+ // The guide's own tool is the one exception: it is what the sentence
189
+ // points at, and it is in the catalog measured here so the cap holds on
190
+ // it too (see the first test).
191
+ expect(tools.filter((t) => !opensWithGuide(t)).map((t) => t.name)).toEqual([GET_AGENT_GUIDE_TOOL]);
192
+ for (const tool of opened) {
193
+ expect(clientVisibleLength(tool), tool.name).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
183
194
  }
184
195
  });
185
196
 
@@ -190,23 +201,24 @@ describe('no Hexis tool description is long enough to be cut', () => {
190
201
  // the catalog the agent reads was over it by 300.
191
202
  const read = (await hexisTools()).find((t) => t.name === 'read_file');
192
203
  expect(read).toBeDefined();
193
- // Its own text, with the pointer charged at its worst case rather than at
194
- // this layout's, plus the prefix at ITS cap and the blank line between.
195
- const pointer = sharedRulesPointer();
196
- const ownAtWorstPointer = read!.description!.length - pointer.length + SHARED_RULES_POINTER_MAX;
197
- expect(clientVisibleLength(read!)).toBe(ownAtWorstPointer + TOOL_PREFIX_CAP + 2);
198
- expect(ownAtWorstPointer + TOOL_PREFIX_CAP + 2).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
204
+ // Its own text (the guide-first sentence included), plus the prefix at
205
+ // ITS cap and the blank line between, must fit — measured as the client
206
+ // sees it.
207
+ expect(clientVisibleLength(read!)).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
199
208
  });
200
209
 
201
210
  it('fails, naming the tool, when a paragraph takes a description over the cap', () => {
202
211
  const padded = { name: 'write_file', description: 'x'.repeat(TOOL_DESCRIPTION_CAP + 1) } as UtcpTool;
203
212
  expect(clientVisibleLength(padded)).toBeGreaterThan(TOOL_DESCRIPTION_CAP);
204
- // A tool with no description at all is not over the cap.
205
- expect(clientVisibleLength({ name: 'nothing' } as UtcpTool)).toBe(0);
206
- // Unless it is a PREFIXED one: the prefix is sent on its own then (no
207
- // description, so no blank line either), and that text is what the client
208
- // was handed. Measuring it as nothing would hide the only thing it got.
209
- expect(clientVisibleLength({ name: 'read_file' } as UtcpTool)).toBe(TOOL_PREFIX_CAP);
213
+ // A tool with no description at all is handed its `Call:` line alone —
214
+ // the example counts toward the cap like any other text a client gets.
215
+ const nothingCall = callLine(`${EXTERNAL_KB_MANUAL_NAME}.nothing`, undefined);
216
+ expect(clientVisibleLength({ name: 'nothing' } as UtcpTool)).toBe(nothingCall.length);
217
+ // A PREFIXED one is handed the prefix too, behind the line (no
218
+ // description, so no blank line after the prefix), and that text is what
219
+ // the client was handed. Measuring it as nothing would hide what it got.
220
+ const readCall = callLine(`${EXTERNAL_KB_MANUAL_NAME}.read_file`, undefined);
221
+ expect(clientVisibleLength({ name: 'read_file' } as UtcpTool)).toBe(readCall.length + 2 + TOOL_PREFIX_CAP);
210
222
  });
211
223
 
212
224
  it('measures the catalog, which is what a client lists — and says what is outside it', async () => {
@@ -228,7 +240,7 @@ describe('no Hexis tool description is long enough to be cut', () => {
228
240
  });
229
241
  });
230
242
 
231
- describe('every file tool ends with the pointer and carries no shared paragraph', () => {
243
+ describe('every file tool opens with the guide-first sentence and carries no shared paragraph', () => {
232
244
  /** The tools that used to carry the shared paragraphs — every `mount`ed one. */
233
245
  const FILE_TOOLS = [
234
246
  'read_file',
@@ -248,13 +260,12 @@ describe('every file tool ends with the pointer and carries no shared paragraph'
248
260
  'apply_file_upload',
249
261
  ];
250
262
 
251
- it('ends each description with the one sentence naming the shared rules', async () => {
263
+ it('opens each description with the sentence sending the agent to the guide, and ends it as a sentence', async () => {
252
264
  const tools = await hexisTools();
253
- const pointer = sharedRulesPointer(testKbContext().layout);
254
265
  for (const name of FILE_TOOLS) {
255
266
  const def = tools.find((t) => t.name === name);
256
267
  expect(def, name).toBeDefined();
257
- expect(def!.description!.endsWith(pointer), `${name} must end with: ${pointer}`).toBe(true);
268
+ expect(def!.description!.startsWith(`${GUIDE_FIRST_SENTENCE} `), `${name} must open with: ${GUIDE_FIRST_SENTENCE}`).toBe(true);
258
269
  // Ends with a full sentence, so nothing reads as cut off mid-thought.
259
270
  expect(def!.description!.trimEnd().endsWith('.'), name).toBe(true);
260
271
  }
@@ -283,25 +294,29 @@ describe('every file tool ends with the pointer and carries no shared paragraph'
283
294
  });
284
295
 
285
296
  describe('the shared rules describe the tools they name', () => {
286
- it('ends the chain description with the pointer too, under the cap', async () => {
297
+ it('opens the chain description with the guide-first sentence too, under the cap', async () => {
287
298
  // What a chain does with a failure, a large result or an image is true of
288
299
  // every call, so it is stated in the shared rules — and the clients that
289
300
  // drop the handshake `instructions` see only descriptions, so the chain
290
- // gets the same pointer every file tool ends with. Composed at the mount,
291
- // because `mcp-core` may not spell a guide name that is a deployment
292
- // setting.
293
- const pointer = sharedRulesPointer(testKbContext().layout);
301
+ // opens with the same sentence every tool of the platform's own opens
302
+ // with, and ends with no second pointer: the one at the front is the way
303
+ // to the rules. Composed at the mount, because `mcp-core` builds the
304
+ // constant without knowing where this deployment states them.
294
305
  const served = (await hexisTools()).find((t) => t.name === CALL_TOOL_CHAIN_NAME)!;
295
- expect(served.description!.endsWith(pointer)).toBe(true);
306
+ // Behind its `Call:` line, which is the first line of every description.
307
+ expect(served.description!.startsWith('Call: call_tool_chain(')).toBe(true);
308
+ expect(splitCallLine(served.description!).rest.startsWith(`${GUIDE_FIRST_SENTENCE} `)).toBe(true);
309
+ expect(served.description!.split(GUIDE_FIRST_SENTENCE)).toHaveLength(2);
310
+ expect(served.description!.trimEnd().endsWith('.')).toBe(true);
296
311
  expect(clientVisibleLength(served)).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
297
- // The other two describe the registry, not what a call does: no pointer.
312
+ // The other two open the same way: the guide comes before the registry too.
298
313
  for (const tool of servedMetaTools([]).filter((t) => t.name !== CALL_TOOL_CHAIN_NAME)) {
299
- expect(tool.description).not.toContain(pointer);
314
+ expect(splitCallLine(tool.description!).rest.startsWith(`${GUIDE_FIRST_SENTENCE} `), tool.name).toBe(true);
300
315
  }
301
316
  });
302
317
 
303
318
  it('states what a chain does in the shared rules, and not a second time on the chain', async () => {
304
- // The pointer is only honest if the rules it points at are THERE. These
319
+ // The opener is only honest if the rules it points at are THERE. These
305
320
  // two were paragraphs of the chain's description; they moved, whole, and a
306
321
  // description that kept them as well would be the long one a client cuts.
307
322
  const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'tool-chain')!;
@@ -317,7 +332,7 @@ describe('the shared rules describe the tools they name', () => {
317
332
 
318
333
  it('keeps the rules on the chain itself where no shared rules are served', () => {
319
334
  // The standalone bridge proxies a deployment whose guide it cannot name, so
320
- // it passes no pointer — and an agent there must still be told what a chain
335
+ // it passes no pointer at all — and an agent there must still be told what a chain
321
336
  // that timed out, or answered too much, or read an image, does.
322
337
  const [chain] = codeModeMetaTools('hexis', []).filter((t) => t.name === CALL_TOOL_CHAIN_NAME);
323
338
  expect(chain.description).toContain(CHAIN_FAILURES_RULE);
@@ -5,14 +5,17 @@
5
5
  * where the text specific to the tool sits, after whatever shared preamble it
6
6
  * carried. Agents reported `file_stat`, `read_file`, `write_file` and
7
7
  * `write_files` arriving ending in "[truncated]". The rules those descriptions
8
- * shared now live in one place (see `agent-instructions/shared-file-rules.ts`)
9
- * and each description ends with one sentence pointing there, which is what
10
- * makes the cap below reachable rather than aspirational.
8
+ * shared now live in one place (see `agent-instructions/shared-file-rules.ts`,
9
+ * served in the guide `get_agent_guide` returns) and each description OPENS
10
+ * with the one sentence sending the agent there (`guide-first.ts`), which is
11
+ * what makes the cap below reachable rather than aspirational.
11
12
  */
12
13
 
14
+ import { callLine, splitCallLine } from '@bevel-software/platform-mcp-core';
13
15
  import { TOOL_PREFIX_CAP } from '@bevel-software/platform-shared';
14
16
  import { PREFIXED_TOOLS } from '../agent-instructions/compose.js';
15
- import { SHARED_RULES_POINTER_MAX, sharedRulesPointer } from '../agent-instructions/shared-file-rules.js';
17
+ import { EXTERNAL_KB_MANUAL_NAME } from '../tool-manuals/tool-manuals.contract.js';
18
+ import { GUIDE_FIRST_SENTENCE } from './guide-first.js';
16
19
  import type { UtcpTool } from './tool.contract.js';
17
20
 
18
21
  /**
@@ -25,8 +28,10 @@ import type { UtcpTool } from './tool.contract.js';
25
28
  * could answer: no useful description of `move_file` fits in 500. What answers
26
29
  * that one is the ORDER of the text, which is why the deployment's purpose line
27
30
  * is prepended rather than appended (see `prefixToolDescription`) and why every
28
- * description now leads with what the tool does and ends with the pointer: a
29
- * cut at 500 then takes the pointer and leaves the tool. The other cut is the
31
+ * description now opens with the guide-first sentence and then what the tool
32
+ * does, with the tool's own detail last: a cut at 500 keeps the sentence and
33
+ * the tool's first sentence (see `firstSentenceEnd`) and takes the detail,
34
+ * which the guide states in full anyway. The other cut is the
30
35
  * four-figure one agents reported on `file_stat`, `read_file`, `write_file` and
31
36
  * `write_files`, and 1,200 sits below it with room to spare.
32
37
  *
@@ -58,23 +63,48 @@ export const TOOL_DESCRIPTION_CAP = 1_200;
58
63
  */
59
64
  export const CLIENT_SHORT_CUT = 500;
60
65
 
66
+ /** What these measurements read of a tool: its name, its text and the schema its `Call:` line is generated from. */
67
+ export type MeasuredTool = Pick<UtcpTool, 'name' | 'description'> & { inputs?: unknown };
68
+
69
+ /**
70
+ * The `Call:` line a client is handed ahead of everything else, and the blank
71
+ * line after it — counted, because it is part of what a client cuts. Taken
72
+ * from the description when it already opens with one (a meta-tool is built
73
+ * with its line), generated from the tool's inputs under the namespace the
74
+ * hosted endpoint serves otherwise, as mcp-core's `withCallExample` does at
75
+ * listing time. The rest of the description comes back beside it.
76
+ */
77
+ function splitServedCallLine(tool: MeasuredTool): { callChars: number; rest: string } {
78
+ const { call, rest } = splitCallLine(tool.description ?? '');
79
+ const line = call ?? callLine(`${EXTERNAL_KB_MANUAL_NAME}.${tool.name}`, tool.inputs);
80
+ // The blank line after it only when something follows it.
81
+ const followed = rest !== '' || PREFIXED_TOOLS.has(tool.name);
82
+ return { callChars: line.length + (followed ? 2 : 0), rest };
83
+ }
84
+
61
85
  /**
62
86
  * Where the tool's OWN opening sentence ends in the text a client is handed:
63
- * the purpose prefix counted at its cap, as in {@link clientVisibleLength}, and
64
- * the pointer not counted at all, since it is the part a short cut is meant to
65
- * take.
87
+ * the purpose prefix counted at its cap, as in {@link clientVisibleLength},
88
+ * and the guide-first sentence every listed tool opens with counted as the
89
+ * text it is — a client that cuts at 500 must still reach the sentence saying
90
+ * what the tool does, past that one.
66
91
  *
67
92
  * A description with no sentence-ending punctuation counts whole — the honest
68
93
  * answer for text that never finishes a sentence.
69
94
  */
70
- export function firstSentenceEnd(tool: Pick<UtcpTool, 'name' | 'description'>): number {
71
- const prefix = PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP + 2 : 0;
72
- const description = tool.description ?? '';
95
+ export function firstSentenceEnd(tool: MeasuredTool): number {
96
+ const { callChars, rest: description } = splitServedCallLine(tool);
97
+ const prefix = callChars + (PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP + 2 : 0);
73
98
  if (description === '') return prefix;
74
- const pointer = sharedRulesPointer();
75
- const own = description.endsWith(pointer) ? description.slice(0, -pointer.length) : description;
99
+ // The opener and whatever whitespace follows it: `guideFirstDescription`
100
+ // joins with one space, and leaves a description that already opens with
101
+ // the sentence as it came — a newline after it is still the opener's.
102
+ const opener = description.startsWith(GUIDE_FIRST_SENTENCE)
103
+ ? GUIDE_FIRST_SENTENCE.length + (description.slice(GUIDE_FIRST_SENTENCE.length).match(/^\s*/)?.[0].length ?? 0)
104
+ : 0;
105
+ const own = description.slice(opener);
76
106
  const firstSentence = own.match(/^[\s\S]*?[.!?](?=\s|$)/)?.[0] ?? own;
77
- return prefix + firstSentence.length;
107
+ return prefix + opener + firstSentence.length;
78
108
  }
79
109
 
80
110
  /**
@@ -85,27 +115,22 @@ export function firstSentenceEnd(tool: Pick<UtcpTool, 'name' | 'description'>):
85
115
  * the cap is what an admin may grow their text to without being told, so a
86
116
  * description that only fits beside a short prefix does not really fit.
87
117
  *
88
- * The pointer sentence is measured the same way, for the same reason. It ends
89
- * every file tool's description and its length moves with a DEPLOYMENT SETTING
90
- * — the guide's file name — so a description measured beside the nine
91
- * characters of `AGENTS.md` would pass here and arrive cut on a deployment
92
- * that renamed its guide. Whatever pointer a description actually carries is
93
- * discounted and charged at {@link SHARED_RULES_POINTER_MAX} instead.
118
+ * The guide-first sentence every listed tool opens with is already in the
119
+ * description the registry lists, so it is measured as the text it is.
94
120
  */
95
- export function clientVisibleLength(tool: Pick<UtcpTool, 'name' | 'description'>): number {
96
- const own = tool.description?.length ?? 0;
121
+ export function clientVisibleLength(tool: MeasuredTool): number {
122
+ const { callChars, rest } = splitServedCallLine(tool);
123
+ return callChars + ownVisibleLength(tool.name, rest);
124
+ }
125
+
126
+ /** {@link clientVisibleLength} without the `Call:` line: the purpose prefix and the tool's own text. */
127
+ function ownVisibleLength(name: string, description: string): number {
128
+ const own = description.length;
97
129
  // A prefixed tool with no description of its own is still handed the prefix,
98
130
  // and nothing else — `prefixToolDescription` sends the prefix alone, with no
99
131
  // blank line after it. Measuring that as zero would under-report the only
100
132
  // text the client got.
101
- if (own === 0) return PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP : 0;
102
- // The pointer at its worst case rather than at this layout's: swap the one
103
- // it carries for the longest it could be. A description that does not end
104
- // with it (`start_session`, the proxied tools) is charged nothing.
105
- const pointer = sharedRulesPointer();
106
- const atWorstPointer = tool.description!.endsWith(pointer)
107
- ? own - pointer.length + SHARED_RULES_POINTER_MAX
108
- : own;
133
+ if (own === 0) return PREFIXED_TOOLS.has(name) ? TOOL_PREFIX_CAP : 0;
109
134
  // `+ 2` for the blank line `prefixToolDescription` puts between the two.
110
- return PREFIXED_TOOLS.has(tool.name) ? atWorstPointer + TOOL_PREFIX_CAP + 2 : atWorstPointer;
135
+ return PREFIXED_TOOLS.has(name) ? own + TOOL_PREFIX_CAP + 2 : own;
111
136
  }
@@ -0,0 +1,41 @@
1
+ import { splitCallLine } from '@bevel-software/platform-mcp-core';
2
+ import type { UtcpTool } from './tool.contract.js';
3
+
4
+ /** The one tool that returns the platform's guide (see `modules/agent-guide`). */
5
+ export const GET_AGENT_GUIDE_TOOL = 'get_agent_guide';
6
+
7
+ /**
8
+ * The sentence every tool of the platform's own OPENS with: what to do before
9
+ * anything else here. At the front, not the end, because clients cut a long
10
+ * description from the end and the one instruction that must survive is this
11
+ * one. The guide's own tool is the one that does not carry it — it IS what
12
+ * the sentence points at.
13
+ */
14
+ export const GUIDE_FIRST_SENTENCE = `Call \`${GET_AGENT_GUIDE_TOOL}\` first and read the platform's guide before anything else here.`;
15
+
16
+ /**
17
+ * `description` as a client is handed it: the sentence ahead of it, once. A
18
+ * description that already opens with the sentence is returned as it is, and
19
+ * an absent or empty one becomes the sentence alone. The ONE place the
20
+ * sentence is put in front of a description — the registry for the tools it
21
+ * lists, the MCP service for the meta-tools it builds itself — so the two
22
+ * cannot drift apart on what "once" means.
23
+ *
24
+ * Behind a `Call:` line, never ahead of it: the call example is the first
25
+ * line of every description (see mcp-core's `withCallExample`), and the
26
+ * sentence opens what follows it.
27
+ */
28
+ export function guideFirstDescription(description: string | undefined): string {
29
+ const { call, rest } = splitCallLine(description ?? '');
30
+ if (call !== null) return `${call}\n\n${guideFirstDescription(rest)}`;
31
+ const own = rest;
32
+ if (own.startsWith(GUIDE_FIRST_SENTENCE)) return own;
33
+ return own ? `${GUIDE_FIRST_SENTENCE} ${own}` : GUIDE_FIRST_SENTENCE;
34
+ }
35
+
36
+ /** `tool` as the catalog lists it: the sentence ahead of its own description, except on the guide's own tool. */
37
+ export function withGuideFirst(tool: UtcpTool): UtcpTool {
38
+ if (tool.name === GET_AGENT_GUIDE_TOOL) return tool;
39
+ const description = guideFirstDescription(tool.description);
40
+ return description === tool.description ? tool : { ...tool, description };
41
+ }
@@ -5,6 +5,7 @@ import type {
5
5
  ToolProvider,
6
6
  UtcpTool,
7
7
  } from './tool.contract.js';
8
+ import { withGuideFirst } from './guide-first.js';
8
9
 
9
10
  /**
10
11
  * The tool catalog. Modules call `registerExternalTool` / `registerInternalTool`
@@ -13,6 +14,12 @@ import type {
13
14
  * catalog only aggregates and lists them — the two manual endpoints serialize
14
15
  * each list per request. Insertion order is preserved (static tools first, then
15
16
  * provider-built ones); a duplicate static name within a surface throws.
17
+ *
18
+ * Every listed tool but the guide's own (`get_agent_guide`, which is what the
19
+ * sentence points at) opens with the one sentence saying what to do before
20
+ * any of them (`guide-first.ts`): applied here, at the one place both
21
+ * surfaces list from, so no module that registers a tool has to remember it
22
+ * and no surface can serve a tool without it.
16
23
  */
17
24
  export class ToolRegistry implements IToolRegistry {
18
25
  private readonly external = new Map<string, UtcpTool>();
@@ -37,13 +44,13 @@ export class ToolRegistry implements IToolRegistry {
37
44
 
38
45
  async listExternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
39
46
  const dynamic = await Promise.all(this.externalProviders.map((p) => p(ctx)));
40
- return [...this.external.values(), ...dynamic];
47
+ return [...this.external.values(), ...dynamic].map(withGuideFirst);
41
48
  }
42
49
 
43
50
  async listInternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
44
51
  const dynamic = await Promise.all(this.internalProviders.map((p) => p(ctx)));
45
52
  const lists = await Promise.all(this.internalListProviders.map((p) => p(ctx)));
46
- return [...this.internal.values(), ...dynamic, ...lists.flat()];
53
+ return [...this.internal.values(), ...dynamic, ...lists.flat()].map(withGuideFirst);
47
54
  }
48
55
 
49
56
  private add(into: Map<string, UtcpTool>, tool: UtcpTool, surface: string): void {
@@ -954,7 +954,12 @@ describe('PullRequestService — a recorded or cleared refusal reaches cached li
954
954
  ensureRemotesFetched: async () => undefined,
955
955
  } as unknown as WorkspaceService,
956
956
  {} as unknown as IAccessControl,
957
- { changedPathsForPr: async () => ['Plugins/x/SKILL.md'] } as unknown as GitService,
957
+ {
958
+ changedPathsAndPairsForPr: async () => ({
959
+ paths: ['Plugins/x/SKILL.md'],
960
+ pairs: [{ path: 'Plugins/x/SKILL.md' }],
961
+ }),
962
+ } as unknown as GitService,
958
963
  );
959
964
 
960
965
  expect((await svc.listOpenPrs())[0]!.lastApplyFailure).toBeNull();
@@ -0,0 +1,104 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import type { AuthUser } from '@bevel-software/platform-shared';
3
+ import type { Database } from '../../database/connection.js';
4
+ import { FileLockService } from '../file-lock.service.js';
5
+ import { WorkflowValidationError } from '../../../shared/domain-errors.js';
6
+ import { makeFakeLockDb, type FakeLockDb } from './fake-file-lock-db.js';
7
+
8
+ /**
9
+ * A deletion runs its last "is any save landing?" check inside
10
+ * `whileNoneAcquired`, and a save starts by taking its file lock. An acquire
11
+ * that passed the gate before the deletion began, but whose row was still
12
+ * being written, must be seen by that check — not land after it.
13
+ */
14
+
15
+ const ALICE: AuthUser = { id: '11111111-1111-4111-8111-111111111111', email: 'alice@example.com', name: 'Alice' };
16
+ const WS = 'alice%2Fdraft';
17
+ const BRANCH = 'alice/draft';
18
+ const PATH = 'knowledge-base/a.md';
19
+
20
+ /** The fake lock db, with every INSERT held until `release()`. */
21
+ function withHeldInserts(fake: FakeLockDb): { db: Database; release: () => void } {
22
+ let release!: () => void;
23
+ const gate = new Promise<void>((resolve) => {
24
+ release = resolve;
25
+ });
26
+ const base = fake.db as unknown as { insert: () => { values: (row: unknown) => Record<string, unknown> } };
27
+ const db = {
28
+ ...base,
29
+ insert: () => ({
30
+ values: (row: unknown) => {
31
+ const chain = base.insert().values(row) as {
32
+ onConflictDoUpdate: (arg: unknown) => unknown;
33
+ returning: () => Promise<unknown>;
34
+ };
35
+ const held = {
36
+ onConflictDoUpdate: (arg: unknown) => {
37
+ chain.onConflictDoUpdate(arg);
38
+ return held;
39
+ },
40
+ returning: async () => {
41
+ await gate;
42
+ return chain.returning();
43
+ },
44
+ };
45
+ return held;
46
+ },
47
+ }),
48
+ } as unknown as Database;
49
+ return { db, release };
50
+ }
51
+
52
+ describe('FileLockService deletion gate', () => {
53
+ let fake: FakeLockDb;
54
+
55
+ beforeEach(() => {
56
+ fake = makeFakeLockDb();
57
+ });
58
+
59
+ it('waits for an acquire already under way, so the check inside sees its lock', async () => {
60
+ const { db, release } = withHeldInserts(fake);
61
+ const locks = new FileLockService(db);
62
+
63
+ const acquire = locks.acquire(WS, BRANCH, PATH, ALICE);
64
+ let sawLock: boolean | null = null;
65
+ const deletion = locks.whileNoneAcquired(BRANCH, async () => {
66
+ sawLock = await locks.hasAnyActive(WS);
67
+ });
68
+
69
+ await new Promise((r) => setTimeout(r, 10));
70
+ // The acquire's row is not written yet, so the check has not run.
71
+ expect(sawLock).toBeNull();
72
+
73
+ release();
74
+ await expect(acquire).resolves.toMatchObject({ acquired: true });
75
+ await deletion;
76
+ expect(sawLock).toBe(true);
77
+ });
78
+
79
+ it('refuses an acquire that starts while the deletion runs', async () => {
80
+ const locks = new FileLockService(fake.db);
81
+ let refused: unknown = null;
82
+ await locks.whileNoneAcquired(BRANCH, async () => {
83
+ refused = await locks.acquire(WS, BRANCH, PATH, ALICE).catch((err: unknown) => err);
84
+ });
85
+ expect(refused).toBeInstanceOf(WorkflowValidationError);
86
+ expect(fake.rows()).toHaveLength(0);
87
+ // And grants it again once the deletion is over.
88
+ await expect(locks.acquire(WS, BRANCH, PATH, ALICE)).resolves.toMatchObject({ acquired: true });
89
+ });
90
+
91
+ it('does not wait for an acquire on another branch', async () => {
92
+ const { db, release } = withHeldInserts(fake);
93
+ const locks = new FileLockService(db);
94
+
95
+ const other = locks.acquire('bob%2Fdraft', 'bob/draft', PATH, ALICE);
96
+ let ran = false;
97
+ await locks.whileNoneAcquired(BRANCH, async () => {
98
+ ran = true;
99
+ });
100
+ expect(ran).toBe(true);
101
+ release();
102
+ await other;
103
+ });
104
+ });