@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
@@ -120,6 +120,13 @@
120
120
  "when": 1790933605784,
121
121
  "tag": "0016_pii_encryption",
122
122
  "breakpoints": true
123
+ },
124
+ {
125
+ "idx": 17,
126
+ "version": "7",
127
+ "when": 1791359019161,
128
+ "tag": "0017_atlassian_account_links",
129
+ "breakpoints": true
123
130
  }
124
131
  ]
125
- }
132
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bevel-software/platform-core-backend",
3
- "version": "0.25.2",
3
+ "version": "0.27.0",
4
4
  "description": "Open-source core backend of the Bevel platform: git-backed knowledge workspace, workflow (branches/change requests/locks/SSE), skills, tools, secrets vault, access control and the remote MCP surface.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -23,6 +23,9 @@
23
23
  "src",
24
24
  "migrations",
25
25
  "kb-template",
26
+ "agent-guide",
27
+ "mcp-app",
28
+ "starter-packs",
26
29
  "THIRD-PARTY-NOTICES.md"
27
30
  ],
28
31
  "engines": {
@@ -52,8 +55,8 @@
52
55
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
53
56
  "yaml": "^2.9.0",
54
57
  "zod": "^3.24.0",
55
- "@bevel-software/platform-mcp-core": "0.25.2",
56
- "@bevel-software/platform-shared": "0.25.2"
58
+ "@bevel-software/platform-shared": "0.27.0",
59
+ "@bevel-software/platform-mcp-core": "0.27.0"
57
60
  },
58
61
  "devDependencies": {
59
62
  "@types/adm-zip": "^0.5.8",
@@ -5,15 +5,12 @@ import {
5
5
  KNOWLEDGE_BASE_DIR,
6
6
  PLUGINS_DIR,
7
7
  SKILLS_DIR,
8
- agentsFilePointerSentence,
9
8
  configureKbLayout,
10
9
  currentKbLayout,
11
10
  isPlatformFile,
12
- mentionsAgentsFile,
13
11
  platformFileNames,
14
12
  pluginOfPath,
15
13
  renderKbLayoutPlaceholders,
16
- retargetAgentsFilePointer,
17
14
  reservedRootDirNames,
18
15
  validateAgentsFileName,
19
16
  validateKbLayout,
@@ -193,106 +190,19 @@ describe('KB layout — the agent guide\'s file name', () => {
193
190
  expect(renderKbLayoutPlaceholders('see {{agentsFile}}', DEFAULT_KB_LAYOUT)).toBe('see AGENTS.md');
194
191
  });
195
192
 
196
- test('the platform-file gate follows the name: ours is managed, theirs is content', () => {
197
- expect(platformFileNames(DEFAULT_KB_LAYOUT)).toEqual([
198
- 'access.md',
199
- 'roles.yaml',
200
- '.bevelignore',
201
- 'AGENTS.md',
202
- ]);
203
- expect(platformFile('AGENTS.md')).toBe(true);
204
-
205
- configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
206
- expect(platformFileNames(currentKbLayout())).toEqual(['access.md', 'roles.yaml', '.bevelignore', 'HEXIS.md']);
207
- // The guide the platform writes is immovable and undeletable…
208
- expect(platformFile('HEXIS.md')).toBe(true);
209
- // …and the customer's own AGENTS.md is a page like any other.
193
+ test('the guide is no platform file under any name: a root AGENTS.md is the organisation\'s own page', () => {
194
+ // The platform's guide is served from code and never written to the
195
+ // repository, so nothing under its name is the platform's to protect.
196
+ expect(platformFileNames(DEFAULT_KB_LAYOUT)).toEqual(['access.md', 'roles.yaml', '.bevelignore']);
210
197
  expect(platformFile('AGENTS.md')).toBe(false);
211
- // Still root-only, as `roles.yaml` is: a nested copy is content.
212
- expect(platformFile('KnowledgeBase/HEXIS.md')).toBe(false);
213
- });
198
+ expect(platformFile('roles.yaml')).toBe(true);
214
199
 
215
- test('the pointer sentence is one sentence, naming the guide twice, from one place', () => {
216
- expect(agentsFilePointerSentence('HEXIS.md')).toBe(
217
- 'Read [HEXIS.md](./HEXIS.md) before working in this knowledge base — ' +
218
- "it is the platform's guide to its layout, files and rules.",
219
- );
200
+ // A name a deployment saved for the written guide is a read alias now,
201
+ // not a file, and makes no platform file either.
220
202
  configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
221
- expect(agentsFilePointerSentence(currentKbLayout().agentsFile)).toContain('HEXIS.md');
222
- });
223
-
224
- /**
225
- * A guide name is a FILE NAME: spaces, brackets, parentheses, `#` and `%`
226
- * all pass `validateFilename`, and every one of them means something in an
227
- * inline link. The label must not end early and the destination must still
228
- * point at the file.
229
- */
230
- test('the pointer sentence links correctly for a name full of markdown punctuation', () => {
231
- const name = 'Our [Agent] Guide (v2).md';
232
- expect(validateGuideName(name)).toBeNull();
233
- const sentence = agentsFilePointerSentence(name);
234
- // The label cannot end early: the brackets in it are escaped…
235
- expect(sentence).toContain('[Our \\[Agent\\] Guide (v2).md]');
236
- // …and the destination is percent-encoded, parentheses included — a bare
237
- // `)` would close the link half way through the name.
238
- expect(sentence).toContain('(./Our%20%5BAgent%5D%20Guide%20%28v2%29.md)');
239
- // The ordinary name reads as it always has — no escapes, nothing encoded.
240
- expect(agentsFilePointerSentence('AGENTS.md')).toContain('[AGENTS.md](./AGENTS.md)');
241
- });
242
-
243
- test('the pointer sentence encodes a name that would otherwise open a URL fragment', () => {
244
- // `#` is legal in a filename and opens a fragment in a URL: `./#2 Guide.md`
245
- // links to the customer's OWN file with a fragment, not to the guide.
246
- expect(validateGuideName('#2 Guide.md')).toBeNull();
247
- expect(agentsFilePointerSentence('#2 Guide.md')).toContain('(./%232%20Guide.md)');
248
- // `%` is legal too, and an unencoded one is a malformed escape.
249
- expect(agentsFilePointerSentence('100%.md')).toContain('(./100%25.md)');
250
- });
251
-
252
- /**
253
- * The startup step asks this before appending, and it has to recognise the
254
- * sentence the LAST boot wrote — whose spelling of the name is escaped in
255
- * the label and encoded in the destination. Asking for the raw name alone
256
- * would append a second copy on every boot after the first.
257
- */
258
- test('a file already carrying the pointer sentence counts as mentioning the guide', () => {
259
- for (const name of ['AGENTS.md', 'Our [Agent] Guide (v2).md', '#2 Guide.md', '100%.md']) {
260
- const appended = `# Acme\n\n${agentsFilePointerSentence(name)}\n`;
261
- expect(mentionsAgentsFile(appended, name), name).toBe(true);
262
- }
263
- // A file that says nothing about the guide still reads as silent…
264
- expect(mentionsAgentsFile('# Acme\n\nWrite tickets in the present tense.\n', 'HEXIS.md')).toBe(false);
265
- // …and the customer's own plain mention counts, in their own words.
266
- expect(mentionsAgentsFile('See HEXIS.md for the platform.', 'HEXIS.md')).toBe(true);
267
- });
268
-
269
- /**
270
- * A second rename. The sentence written for the previous guide points at a
271
- * file that is no longer there, and the new name appears nowhere in the
272
- * text — so it has to be recognised by its SHAPE and aimed again.
273
- */
274
- test('a pointer sentence the platform wrote is retargeted, whatever guide it named', () => {
275
- for (const before of ['HEXIS.md', 'Our [Agent] Guide (v2).md', '#2 Guide.md']) {
276
- const text = `# Acme\n\n${agentsFilePointerSentence(before)}\n`;
277
- expect(retargetAgentsFilePointer(text, 'GUIDE.md'), before).toBe(
278
- `# Acme\n\n${agentsFilePointerSentence('GUIDE.md')}\n`,
279
- );
280
- }
281
- // Already aimed right: ours, and unchanged — which is not the same answer
282
- // as "none of ours here", and the caller tells them apart.
283
- const current = `# Acme\n\n${agentsFilePointerSentence('GUIDE.md')}\n`;
284
- expect(retargetAgentsFilePointer(current, 'GUIDE.md')).toBe(current);
203
+ expect(platformFileNames(currentKbLayout())).toEqual(['access.md', 'roles.yaml', '.bevelignore']);
204
+ expect(platformFile('HEXIS.md')).toBe(false);
205
+ expect(platformFile('AGENTS.md')).toBe(false);
285
206
  });
286
207
 
287
- test('leaves a file holding nothing of the platform\'s alone', () => {
288
- // Null, not the text: there is nothing of ours to aim, so the caller goes
289
- // on to ask whether the customer mentioned the guide themselves.
290
- expect(retargetAgentsFilePointer('# Acme\n\nWrite tickets in the present tense.\n', 'GUIDE.md')).toBeNull();
291
- // Their own link to their own file is not our sentence.
292
- expect(retargetAgentsFilePointer('Read [notes](./notes.md) before working here.', 'GUIDE.md')).toBeNull();
293
- // Our opening words, their sentence.
294
- expect(
295
- retargetAgentsFilePointer('Read [HEXIS.md](./HEXIS.md) when you have a moment.', 'GUIDE.md'),
296
- ).toBeNull();
297
- });
298
208
  });
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { agentGuideDir, coreMigrationsDir, defaultKbTemplateDir, defaultStarterPacksDir, mcpAppDir } from '../assets.js';
6
+
7
+ /**
8
+ * Every asset folder this package reads at run time has to reach the places
9
+ * the package is shipped from: the npm tarball (`files` in package.json) and
10
+ * the Docker image (the runtime stage of the repository's Dockerfile, which
11
+ * copies each folder by name).
12
+ *
13
+ * The second list is the one nothing else checks. `agent-guide/` was added to
14
+ * `assets.ts` and to `files`, but not to the Dockerfile, and no test or CI job
15
+ * builds the image: the folder was simply absent from every image built from
16
+ * dev. It is read while the tool list is composed, so the first request for
17
+ * any tool on the deployment failed, and every agent surface with it
18
+ * (2026-10-06). A folder named here and missing from either list fails this
19
+ * test instead.
20
+ *
21
+ * `mcp-app/` was the same omission one release later — caught here rather
22
+ * than on a deployment. It holds the `ui://` view `resources/read` serves, so
23
+ * an image without it answered `tools/list` with no view on `open_page` and
24
+ * `resources/list` with nothing, and the page-in-chat quietly degraded to
25
+ * text on every real build.
26
+ */
27
+ const packageRoot = fileURLToPath(new URL('../..', import.meta.url));
28
+ const repoRoot = path.resolve(packageRoot, '..', '..');
29
+
30
+ /** The folders assets.ts locates, as names under the package root. */
31
+ const ASSET_DIRS = [
32
+ coreMigrationsDir(),
33
+ defaultKbTemplateDir(),
34
+ agentGuideDir(),
35
+ mcpAppDir(),
36
+ defaultStarterPacksDir(),
37
+ ].map((dir) =>
38
+ path.basename(dir),
39
+ );
40
+
41
+ describe('the asset folders this package reads at run time', () => {
42
+ it('are the four assets.ts names', () => {
43
+ expect(ASSET_DIRS.sort()).toEqual(['agent-guide', 'kb-template', 'mcp-app', 'migrations', 'starter-packs']);
44
+ });
45
+
46
+ it('exist in the source tree', () => {
47
+ for (const dir of ASSET_DIRS) {
48
+ expect(fs.statSync(path.join(packageRoot, dir)).isDirectory(), dir).toBe(true);
49
+ }
50
+ });
51
+
52
+ it('are in the npm tarball', () => {
53
+ const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8')) as { files: string[] };
54
+ for (const dir of ASSET_DIRS) {
55
+ expect(pkg.files, `${dir} missing from package.json "files"`).toContain(dir);
56
+ }
57
+ });
58
+
59
+ it('are copied into the Docker image by the runtime stage', () => {
60
+ const dockerfile = fs.readFileSync(path.join(repoRoot, 'Dockerfile'), 'utf8');
61
+ for (const dir of ASSET_DIRS) {
62
+ const line = `COPY --from=builder /app/packages/core-backend/${dir} packages/core-backend/${dir}`;
63
+ expect(dockerfile, `Dockerfile does not copy ${dir} into the image`).toContain(line);
64
+ }
65
+ });
66
+ });
package/src/assets.ts CHANGED
@@ -3,8 +3,9 @@ import { fileURLToPath } from 'node:url';
3
3
 
4
4
  /**
5
5
  * Locations of the assets shipped INSIDE this package (`files` in
6
- * package.json): the squashed core migration history (`migrations/`) and the
7
- * KB seed template (`kb-template/`). Both live at the PACKAGE ROOT, and this
6
+ * package.json): the squashed core migration history (`migrations/`), the
7
+ * KB seed template (`kb-template/`) and the starter packs (`starter-packs/`).
8
+ * All live at the PACKAGE ROOT, and this
8
9
  * module is a direct child of either `src/` (in-repo / tsx) or `dist/`
9
10
  * (compiled) — so one `..` hop from the module URL reaches the package root
10
11
  * in BOTH layouts. Resolved lazily so bundlers that rewrite `import.meta.url`
@@ -23,3 +24,38 @@ export function coreMigrationsDir(): string {
23
24
  export function defaultKbTemplateDir(): string {
24
25
  return path.join(packageRoot(), 'kb-template');
25
26
  }
27
+
28
+ /**
29
+ * The sections of the platform's agent guide, one markdown file each — the
30
+ * text `get_agent_guide` and a `read_file` of the guide's name serve, composed
31
+ * by `modules/agent-guide`. Beside `kb-template/` rather than under `src/`,
32
+ * so a build and the published source find it at the same place.
33
+ */
34
+ export function agentGuideDir(): string {
35
+ return path.join(packageRoot(), 'agent-guide');
36
+ }
37
+
38
+ /**
39
+ * The MCP App views this deployment serves over `resources/read` — one static
40
+ * HTML file each, no build step. Beside `agent-guide/` and `kb-template/` for
41
+ * the same reason: a build and the published source find it at the same
42
+ * place, and `tsc` copies nothing that is not TypeScript.
43
+ *
44
+ * The backend serves these as BYTES and never imports frontend code — the
45
+ * view's whole job is to load the deployment's embed bundle into its own
46
+ * document (hosts forbid framing the deployment, see `mcp-app.ts`), where the
47
+ * app's renderers then draw the page.
48
+ */
49
+ export function mcpAppDir(): string {
50
+ return path.join(packageRoot(), 'mcp-app');
51
+ }
52
+
53
+ /**
54
+ * The starter packs a new knowledge base may be filled from — one folder per
55
+ * team (`engineering/`, `sales/`, …), each a `pack.yaml` beside the pages and
56
+ * the plugin it adds (see `modules/onboarding/starter-packs.ts`). Beside
57
+ * `kb-template/` for the same reason: read at run time, shipped as files.
58
+ */
59
+ export function defaultStarterPacksDir(): string {
60
+ return path.join(packageRoot(), 'starter-packs');
61
+ }
@@ -47,6 +47,14 @@ describe('catalogRevision', () => {
47
47
  );
48
48
  });
49
49
 
50
+ it('moves when an MCP App view changes by a byte, and not when the same view is read again', () => {
51
+ const view = { uri: 'ui://hexis/page.html', text: '<html>v1</html>' };
52
+ const base = catalogRevision([manualLine('serper')], [skill()], [view]);
53
+ expect(catalogRevision([manualLine('serper')], [skill()], [{ ...view }])).toBe(base);
54
+ expect(catalogRevision([manualLine('serper')], [skill()], [{ ...view, text: '<html>v2</html>' }])).not.toBe(base);
55
+ expect(catalogRevision([manualLine('serper')], [skill()], [])).not.toBe(base);
56
+ });
57
+
50
58
  describe('a manual added, changed or removed', () => {
51
59
  const base = catalogRevision([manualLine('serper')], []);
52
60
 
@@ -115,6 +123,8 @@ describe('GET /agent/catalog-revision', () => {
115
123
  skills: SkillSummary[];
116
124
  userId?: string | undefined;
117
125
  resolveUserEmail?: (userId: string) => Promise<string | undefined>;
126
+ /** The served views, or a manifest read that fails. */
127
+ mcpApps?: { manifest(): Promise<{ resources: { uri: string; text: string }[] }> };
118
128
  }): Promise<{
119
129
  url: string;
120
130
  catalogFingerprints: ReturnType<typeof vi.fn>;
@@ -132,6 +142,7 @@ describe('GET /agent/catalog-revision', () => {
132
142
  next();
133
143
  },
134
144
  resolveUserEmail: deps.resolveUserEmail ?? (async () => 'someone@example.com'),
145
+ ...(deps.mcpApps ? { mcpApps: deps.mcpApps } : {}),
135
146
  }),
136
147
  );
137
148
  http = app.listen(0);
@@ -174,6 +185,35 @@ describe('GET /agent/catalog-revision', () => {
174
185
  expect(catalogFingerprints).not.toHaveBeenCalled();
175
186
  });
176
187
 
188
+ it('folds the served MCP App views into the revision, so a changed view moves it', async () => {
189
+ const view = { uri: 'ui://hexis/page.html', text: '<html>v1</html>' };
190
+ const { url } = await mount({
191
+ manuals: [manualLine('serper')],
192
+ skills: [skill()],
193
+ userId: 'u1',
194
+ mcpApps: { manifest: async () => ({ resources: [view] }) },
195
+ });
196
+ const body = (await (await fetch(`${url}/agent/catalog-revision`)).json()) as { revision: string };
197
+ expect(body.revision).toBe(catalogRevision([manualLine('serper')], [skill()], [view]));
198
+ expect(body.revision).not.toBe(catalogRevision([manualLine('serper')], [skill()]));
199
+ });
200
+
201
+ it('answers the no-views revision when the manifest cannot be read, rather than failing', async () => {
202
+ const { url } = await mount({
203
+ manuals: [manualLine('serper')],
204
+ skills: [skill()],
205
+ userId: 'u1',
206
+ mcpApps: {
207
+ manifest: async () => {
208
+ throw new Error('the view file is gone');
209
+ },
210
+ },
211
+ });
212
+ const res = await fetch(`${url}/agent/catalog-revision`);
213
+ expect(res.status).toBe(200);
214
+ expect(((await res.json()) as { revision: string }).revision).toBe(catalogRevision([manualLine('serper')], [skill()]));
215
+ });
216
+
177
217
  it('does not fail the request when the email lookup throws', async () => {
178
218
  const { url } = await mount({
179
219
  manuals: [manualLine('serper')],
@@ -50,6 +50,7 @@ function bootable(runAll: () => Promise<void>) {
50
50
  } as BootableCore['kbStartupRunner'],
51
51
  workflowService: {
52
52
  closeChangeRequestsWithDeletedBranches: async () => 0,
53
+ tidyAfterSweep: async () => ({ closedEmpty: 0, removedLeftovers: 0 }),
53
54
  } as BootableCore['workflowService'],
54
55
  pluginJoinRequestJobs: { startSweeping() {} } as BootableCore['pluginJoinRequestJobs'],
55
56
  startupRetry: null,
@@ -453,6 +453,14 @@ describe('stopCore', () => {
453
453
  order.push('startupRetry.stop');
454
454
  },
455
455
  },
456
+ workflowService: {
457
+ stopTidying() {
458
+ order.push('workflowService.stopTidying');
459
+ },
460
+ async drainTidy() {
461
+ order.push('workflowService.drainTidy');
462
+ },
463
+ },
456
464
  db: {
457
465
  $client: {
458
466
  async end() {
@@ -473,8 +481,10 @@ describe('stopCore', () => {
473
481
  'backgroundJobs.stopSweeping',
474
482
  'agentUploadStore.stopSweeping',
475
483
  'startupRetry.stop',
484
+ 'workflowService.stopTidying',
476
485
  'backgroundJobs.drain',
477
486
  'agentUploadStore.drainSweep',
487
+ 'workflowService.drainTidy',
478
488
  'commitWorker.stop',
479
489
  'db.end',
480
490
  ]);
@@ -515,8 +525,10 @@ describe('stopCore', () => {
515
525
  expect(g.order).toEqual([
516
526
  'backgroundJobs.stopSweeping',
517
527
  'agentUploadStore.stopSweeping',
528
+ 'workflowService.stopTidying',
518
529
  'backgroundJobs.drain',
519
530
  'agentUploadStore.drainSweep',
531
+ 'workflowService.drainTidy',
520
532
  'commitWorker.stop',
521
533
  'db.end',
522
534
  ]);
@@ -530,8 +542,10 @@ describe('stopCore', () => {
530
542
  'backgroundJobs.stopSweeping',
531
543
  'agentUploadStore.stopSweeping',
532
544
  'startupRetry.stop',
545
+ 'workflowService.stopTidying',
533
546
  'backgroundJobs.drain',
534
547
  'agentUploadStore.drainSweep',
548
+ 'workflowService.drainTidy',
535
549
  'db.end',
536
550
  ]);
537
551
  });
@@ -57,11 +57,19 @@ function skillFingerprint(s: SkillSummary): string {
57
57
  export function catalogRevision(
58
58
  manuals: readonly string[],
59
59
  skills: readonly SkillSummary[],
60
+ /**
61
+ * The MCP App views this deployment serves, by their bytes: a release that
62
+ * changes a view and nothing else must still move the revision, or a local
63
+ * server already running keeps serving the view it read at startup.
64
+ */
65
+ views: readonly { uri: string; text: string }[] = [],
60
66
  ): string {
61
67
  const lines = [
62
68
  ...[...manuals].sort(),
63
- '\u0001', // separates the two lists, so a line can never migrate between them
69
+ '\u0001', // separates the lists, so a line can never migrate between them
64
70
  ...skills.map(skillFingerprint).sort(),
71
+ '\u0001',
72
+ ...views.map((v) => `${v.uri}\u0000${createHash('sha256').update(v.text).digest('hex')}`).sort(),
65
73
  ];
66
74
  return createHash('sha256').update(lines.join('\n')).digest('hex').slice(0, 32);
67
75
  }
@@ -82,6 +90,8 @@ export function createCatalogRevisionRoutes(deps: {
82
90
  manualAuth: RequestHandler;
83
91
  /** Connection-key/internal-token user id → email, for the per-caller ACL. */
84
92
  resolveUserEmail: (userId: string) => Promise<string | undefined>;
93
+ /** The MCP App views served; absent on a deployment that serves none. */
94
+ mcpApps?: { manifest(): Promise<{ resources: readonly { uri: string; text: string }[] }> };
85
95
  }): express.Router {
86
96
  const router = express.Router();
87
97
 
@@ -95,8 +105,11 @@ export function createCatalogRevisionRoutes(deps: {
95
105
  const [manuals, skills] = email
96
106
  ? await Promise.all([deps.toolManuals.catalogFingerprints(email), deps.skills.listSkills(email)])
97
107
  : [[], []];
108
+ // A manifest that cannot be read counts as no views, which is also what
109
+ // the MCP endpoint serves in that state.
110
+ const views = deps.mcpApps ? ((await deps.mcpApps.manifest().catch(() => null))?.resources ?? []) : [];
98
111
  res.json({
99
- revision: catalogRevision(manuals, skills),
112
+ revision: catalogRevision(manuals, skills, views),
100
113
  tools: manuals.length,
101
114
  skills: skills.length,
102
115
  });
@@ -9,6 +9,7 @@ import type { IErasureParticipant } from '../modules/auth/account-erasure.servic
9
9
  import type { IAccountAdmission } from '../modules/auth/account-admission.js';
10
10
  import type { IWriteAccess } from '../modules/write-access/write-access.js';
11
11
  import type { OnServerStart } from '../modules/workspace/startup/on-server-start.js';
12
+ import type { AgentGuideHook } from '../modules/agent-guide/agent-guide.js';
12
13
 
13
14
  /**
14
15
  * Every seam the enterprise overlay can fill in the CORE composition
@@ -100,6 +101,16 @@ export interface CorePorts {
100
101
  * contract each step signs up to). Core default: `[]`.
101
102
  */
102
103
  kbStartupSteps?: readonly OnServerStart[];
104
+ /**
105
+ * THIS distribution's say over the agent guide — the text `get_agent_guide`
106
+ * and a `read_file` of the guide's name serve. Called with core's sections
107
+ * and the layout in effect on every composition; returns the sections the
108
+ * guide is made of, so a distribution appends its own, replaces one of
109
+ * core's by id, or drops one, and every change core makes to the rest still
110
+ * reaches it. Core default: core's sections as they are. See
111
+ * `modules/agent-guide`.
112
+ */
113
+ agentGuide?: AgentGuideHook;
103
114
  /**
104
115
  * Mirror this composition's branch model and knowledge-base layout onto the
105
116
  * shared package's PROCESS-WIDE live bindings (`DEFAULT_BRANCH`,
@@ -8,6 +8,7 @@ import {
8
8
  createAgentUploadRoutes,
9
9
  isAgentUploadRawBodyPath,
10
10
  } from '../modules/workspace/agent-upload.routes.js';
11
+ import { createAgentDownloadRoutes } from '../modules/workspace/agent-download.routes.js';
11
12
  import { createGitInternalsRouteGuard } from '../modules/workspace/git-internals.middleware.js';
12
13
  import { startCore } from './lifecycle.js';
13
14
  import { createDiffRoutes } from '../modules/diff/diff.routes.js';
@@ -26,7 +27,10 @@ import {
26
27
  registerToolManualsTools,
27
28
  } from '../modules/tool-manuals/index.js';
28
29
  import { registerWorkflowTools } from '../modules/workflow/agent-tools/workflow.tools.js';
30
+ import { changeRequestScope, registerChangeRequestReadTools } from '../modules/workflow/agent-tools/change-request-read.tools.js';
31
+ import { createOnboardingRoutes } from '../modules/onboarding/onboarding.routes.js';
29
32
  import { registerWorkspaceTools } from '../modules/workspace/workspace.tools.js';
33
+ import { registerAgentGuideTool } from '../modules/agent-guide/index.js';
30
34
  import { RECOVERY_BOT_EMAIL } from '../modules/workflow/recovery-bot.js';
31
35
  import {
32
36
  registerSkillsTools,
@@ -53,6 +57,7 @@ import { createUpdateCheckRoutes } from '../modules/update-check/update-check.ro
53
57
  import { createAccountRoutes } from '../modules/auth/account.routes.js';
54
58
  import { createConnectionKeysAdminRoutes } from '../modules/tool-auth/connection-keys-admin.routes.js';
55
59
  import { createAuditRoutes } from '../modules/audit/audit.routes.js';
60
+ import { createAgentConnectionRoutes } from '../modules/audit/agent-connection.routes.js';
56
61
  import { createAgentRestAuditMiddleware } from '../modules/audit/agent-rest-audit.middleware.js';
57
62
  import { EXTERNAL_KB_MANUAL_NAME } from '../modules/tool-manuals/tool-manuals.contract.js';
58
63
  import { createSetupRoutes, isComplete } from '../modules/settings/setup.routes.js';
@@ -77,6 +82,10 @@ import { createReadiness } from './readiness.js';
77
82
  import { createAgentInstructionsRoutes } from '../modules/agent-instructions/index.js';
78
83
  import type { CoreServices } from './create-core-services.js';
79
84
  import { createWriteAccessRoutes, createWriteGateMiddleware } from '../modules/write-access/write-access.js';
85
+ import { createEmbedRoutes, createEmbedLinkRoutes } from '../modules/embed/embed.routes.js';
86
+ import { registerEmbedTools } from '../modules/embed/embed.tools.js';
87
+ import { createMcpAppRoutes } from '../modules/embed/mcp-app.routes.js';
88
+ import { isSandboxReachableOrigin } from '../modules/embed/mcp-app.js';
80
89
 
81
90
  type ExpressApp = ReturnType<typeof express>;
82
91
 
@@ -84,6 +93,11 @@ type ExpressApp = ReturnType<typeof express>;
84
93
  * The context handed to {@link ServerExtensions.tools}: everything an overlay
85
94
  * needs to register its own tool defs + endpoint routes on the unified tool
86
95
  * surface, exactly like the core modules do.
96
+ *
97
+ * A tool that works on a branch declares it on its `toolDef` (`branch:
98
+ * 'required'` or, read-only tools only, `'defaults-to-default-branch'`), and
99
+ * `toolHandler` resolves the branch before the tool runs — see "The branch"
100
+ * in `modules/tool-helpers/index.ts`.
87
101
  */
88
102
  export interface ToolSurfaceCtx {
89
103
  registry: CoreServices['toolRegistry'];
@@ -455,8 +469,35 @@ export async function createCoreServer(
455
469
  // every save surface (agent write tools, the app's PUT /file) and on
456
470
  // `get_skill`. Warnings only; it never refuses a save.
457
471
  const allowedToolsChecker = new AllowedToolsChecker(core.toolRegistry, core.toolManualService, core.kb);
458
- registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.kb);
459
- registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore);
472
+ // `delete_branch` sees change requests as `get_change_request` does.
473
+ registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.kb, changeRequestScope(core.accessControl, core.kb).maySee);
474
+ // The five read tools over change requests. Separate from the workflow tools
475
+ // because they are the only ones that gate their whole payload on the
476
+ // caller's read access, so they take the access service and nothing else.
477
+ registerChangeRequestReadTools(core.toolRegistry, toolsRouter, ta, th, core.accessControl, core.kb);
478
+ const workspaceTools = registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore, core.agentGuide, core.agentDownloadStore, core.starterPackService, core.disk);
479
+ // `open_page` — the knowledge-base page shown inside a chat. Registered
480
+ // here, on the same router as the file tools, because it answers with
481
+ // `read_file`'s own read: the read hook, the access gate and the
482
+ // not-found refusal come from that registration rather than from a copy.
483
+ registerEmbedTools(core.toolRegistry, toolsRouter, ta, th, {
484
+ embedService: core.embedService,
485
+ kb: core.kb,
486
+ readForTool: workspaceTools.readForTool,
487
+ // A host's https sandbox cannot load from a plain-http deployment, so
488
+ // the tool answers the text and the app address and says so.
489
+ canBeReached: () => isSandboxReachableOrigin(core.config.publicFrontendUrl),
490
+ appUrlFor: (repoRelative, slug) => core.embedService.appUrlFor(repoRelative, slug),
491
+ // The read is `read_file`'s, so the notes a deployment registers for the
492
+ // gated tools reach this one as well.
493
+ notes: agentAccessGate.notes,
494
+ });
495
+ // The app manifest and the view bytes, for the LOCAL MCP server: it bridges
496
+ // a host to this deployment over HTTP and has no other way to learn which
497
+ // tools carry a view. Same router, same `manualAuth` as `all-tools`.
498
+ toolsRouter.use(createMcpAppRoutes(core.mcpAppService, core.manualAuthMiddleware));
499
+ // The guide on its own, beside the file tools that serve it by name.
500
+ registerAgentGuideTool(core.toolRegistry, toolsRouter, ta, th, core.agentGuideSections);
460
501
  // The agent upload route, on the same router as the tool endpoints so it
461
502
  // mounts ahead of the JWT `/api` mounts below — but WITHOUT `toolAuth`: its
462
503
  // whole credential is the single-use token in its path, which is the point
@@ -464,16 +505,23 @@ export async function createCoreServer(
464
505
  // no workspace and writes into none; every access, platform-file and branch
465
506
  // rule is applied later by `apply_file_upload`.
466
507
  toolsRouter.use(createAgentUploadRoutes({ uploads: core.agentUploadStore }));
508
+ // Its outgoing twin, mounted the same way and for the same reason: the
509
+ // one-time link is the whole credential an agent's `curl` carries. Every
510
+ // file behind it was judged when `request_file_download` issued it.
511
+ toolsRouter.use(createAgentDownloadRoutes({ downloads: core.agentDownloadStore, identify: core.agentDownloadFetcher }));
467
512
  registerSkillsTools(core.toolRegistry, toolsRouter, ta, th, core.skillService, allowedToolsChecker);
468
513
  // Definitions only: the endpoints they describe are the app's own plugin
469
514
  // creation routes, mounted below behind the key-or-session gate.
470
- registerPluginsTools(core.toolRegistry);
515
+ registerPluginsTools(core.toolRegistry, core.kb);
471
516
  registerToolManualsTools(core.toolRegistry, toolsRouter, ta, th, core.toolManualService, {
472
517
  accessControl: core.accessControl,
473
518
  // The vault satisfies the module's local VariableStatusPort — `list_tool_setup`
474
519
  // reports configuration booleans only; secret values never ride through tools.
475
520
  variableStatus: core.secretsVaultService,
476
521
  kb: core.kb,
522
+ // What the proxy's schema check found when each server's tools were last
523
+ // loaded — reported to a caller who may write the tool, nobody else.
524
+ hiddenTools: core.mcpService.hiddenTools,
477
525
  });
478
526
  // Overlay tool registrations (defs + module-hosted endpoints).
479
527
  ext.tools?.({
@@ -517,6 +565,9 @@ export async function createCoreServer(
517
565
  skills: core.skillService,
518
566
  manualAuth: core.manualAuthMiddleware,
519
567
  resolveUserEmail: async (userId) => (await core.authService.getUserById(userId))?.email,
568
+ // The views move the revision too: a release that changes a view and no
569
+ // manual would otherwise leave a running local server on the old one.
570
+ mcpApps: core.mcpAppService,
520
571
  }));
521
572
  // The only core route that returns secret VALUES: a local `.tool`'s declared
522
573
  // variables, for the local MCP server that will execute it. It re-reads the
@@ -543,6 +594,12 @@ export async function createCoreServer(
543
594
  // Non-JWT overlay surfaces that sit between the tools router and the
544
595
  // JWT-protected `/api` routes (LLM proxy, embed, upload — see the phase
545
596
  // doc on ServerExtensions.postTools).
597
+ // The embed surface, ahead of every JWT mount and of the static
598
+ // catch-all: its data routes authenticate by the embed token ALONE (a
599
+ // session reaching them must be refused, not honoured), and the two SPA
600
+ // routes need their framing headers stamped before `index.html` is served.
601
+ app.use(createEmbedRoutes(core.embedService));
602
+
546
603
  ext.postTools?.(app, core);
547
604
 
548
605
  // The plugin creation doors — `POST /api/plugins`, `POST /api/plugins/personal`
@@ -718,6 +775,18 @@ export async function createCoreServer(
718
775
  core.authMiddleware,
719
776
  createAuditRoutes(core.agentAuditService, core.externalApiKeyService, core.adminAccess),
720
777
  );
778
+ // The onboarding's "is your agent connected yet?" — the caller's own
779
+ // agents only, read off the same connections and keys the Audit log lists.
780
+ app.use('/api', core.authMiddleware, createAgentConnectionRoutes(core.agentAuditService));
781
+ // "What does your team do?" — the starter-pack question a new knowledge
782
+ // base's admin is asked, and the pack it adds (admin-gated inside).
783
+ app.use(
784
+ '/api',
785
+ core.authMiddleware,
786
+ createOnboardingRoutes(core.starterPackService, async (req) =>
787
+ req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null,
788
+ ),
789
+ );
721
790
  // First-run setup. Mounted with the other authed routes but touching NO
722
791
  // workspace — it has to work on a deployment that has no knowledge base yet,
723
792
  // which is the whole reason it exists. The startup runner rides along for
@@ -810,6 +879,12 @@ export async function createCoreServer(
810
879
  }));
811
880
 
812
881
  // JWT-protected overlay routes.
882
+ // Linking an outside account to the signed-in user, and managing those
883
+ // links. Under the JWT middleware, deliberately: the link acts AS the
884
+ // session, which is exactly why the page it is called from refuses every
885
+ // framing ancestor.
886
+ app.use('/api', core.authMiddleware, createEmbedLinkRoutes(core.embedService));
887
+
813
888
  ext.authed?.(app, core);
814
889
 
815
890
  // In production, serve the frontend static build