@bevel-software/platform-core-backend 0.26.0 → 0.28.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 (681) hide show
  1. package/agent-guide/access-control.md +17 -0
  2. package/agent-guide/conventions.md +8 -0
  3. package/agent-guide/html-views.md +83 -0
  4. package/agent-guide/new-knowledge-base.md +24 -0
  5. package/agent-guide/tool-manuals.md +10 -0
  6. package/dist/assets.d.ts +19 -0
  7. package/dist/assets.d.ts.map +1 -1
  8. package/dist/assets.js +26 -2
  9. package/dist/assets.js.map +1 -1
  10. package/dist/core/catalog-revision.d.ts +19 -1
  11. package/dist/core/catalog-revision.d.ts.map +1 -1
  12. package/dist/core/catalog-revision.js +14 -3
  13. package/dist/core/catalog-revision.js.map +1 -1
  14. package/dist/core/create-core-server.d.ts +5 -0
  15. package/dist/core/create-core-server.d.ts.map +1 -1
  16. package/dist/core/create-core-server.js +56 -5
  17. package/dist/core/create-core-server.js.map +1 -1
  18. package/dist/core/create-core-services.d.ts +33 -0
  19. package/dist/core/create-core-services.d.ts.map +1 -1
  20. package/dist/core/create-core-services.js +105 -8
  21. package/dist/core/create-core-services.js.map +1 -1
  22. package/dist/core/lifecycle.d.ts +16 -1
  23. package/dist/core/lifecycle.d.ts.map +1 -1
  24. package/dist/core/lifecycle.js +18 -1
  25. package/dist/core/lifecycle.js.map +1 -1
  26. package/dist/core-config.d.ts +21 -0
  27. package/dist/core-config.d.ts.map +1 -1
  28. package/dist/core-config.js +22 -1
  29. package/dist/core-config.js.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/modules/access/access-control.interface.d.ts +17 -0
  35. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  36. package/dist/modules/access/access-control.service.d.ts +2 -0
  37. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  38. package/dist/modules/access/access-control.service.js +31 -0
  39. package/dist/modules/access/access-control.service.js.map +1 -1
  40. package/dist/modules/access/access.routes.d.ts +4 -1
  41. package/dist/modules/access/access.routes.d.ts.map +1 -1
  42. package/dist/modules/access/access.routes.js +66 -7
  43. package/dist/modules/access/access.routes.js.map +1 -1
  44. package/dist/modules/access/directory-sync-bot.js +1 -1
  45. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  46. package/dist/modules/access/roles-admin.service.d.ts +35 -6
  47. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  48. package/dist/modules/access/roles-admin.service.js +36 -9
  49. package/dist/modules/access/roles-admin.service.js.map +1 -1
  50. package/dist/modules/access/user-access-removal.service.js +1 -1
  51. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  52. package/dist/modules/agent-guide/agent-guide.d.ts +6 -0
  53. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  54. package/dist/modules/agent-guide/agent-guide.js +8 -0
  55. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  56. package/dist/modules/agent-guide/index.d.ts +1 -1
  57. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  58. package/dist/modules/agent-guide/index.js +1 -1
  59. package/dist/modules/agent-guide/index.js.map +1 -1
  60. package/dist/modules/agent-instructions/compose.d.ts +5 -0
  61. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  62. package/dist/modules/agent-instructions/compose.js +19 -2
  63. package/dist/modules/agent-instructions/compose.js.map +1 -1
  64. package/dist/modules/agent-instructions/shared-file-rules.js +19 -19
  65. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  66. package/dist/modules/audit/agent-audit.service.d.ts +21 -2
  67. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  68. package/dist/modules/audit/agent-audit.service.js +43 -2
  69. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  70. package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
  71. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
  72. package/dist/modules/audit/agent-connection.routes.js +38 -0
  73. package/dist/modules/audit/agent-connection.routes.js.map +1 -0
  74. package/dist/modules/audit/audit.contract.d.ts +24 -0
  75. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  76. package/dist/modules/audit/audit.contract.js.map +1 -1
  77. package/dist/modules/audit/index.d.ts +1 -0
  78. package/dist/modules/audit/index.d.ts.map +1 -1
  79. package/dist/modules/audit/index.js +1 -0
  80. package/dist/modules/audit/index.js.map +1 -1
  81. package/dist/modules/auth/account-hooks.d.ts +46 -0
  82. package/dist/modules/auth/account-hooks.d.ts.map +1 -0
  83. package/dist/modules/auth/account-hooks.js +25 -0
  84. package/dist/modules/auth/account-hooks.js.map +1 -0
  85. package/dist/modules/auth/account-switch-guard.d.ts +15 -0
  86. package/dist/modules/auth/account-switch-guard.d.ts.map +1 -0
  87. package/dist/modules/auth/account-switch-guard.js +2 -0
  88. package/dist/modules/auth/account-switch-guard.js.map +1 -0
  89. package/dist/modules/auth/account-switch-lock.d.ts +34 -0
  90. package/dist/modules/auth/account-switch-lock.d.ts.map +1 -0
  91. package/dist/modules/auth/account-switch-lock.js +48 -0
  92. package/dist/modules/auth/account-switch-lock.js.map +1 -0
  93. package/dist/modules/auth/account.routes.d.ts +4 -1
  94. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  95. package/dist/modules/auth/account.routes.js +110 -13
  96. package/dist/modules/auth/account.routes.js.map +1 -1
  97. package/dist/modules/auth/auth.middleware.d.ts +7 -0
  98. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  99. package/dist/modules/auth/auth.middleware.js +1 -1
  100. package/dist/modules/auth/auth.middleware.js.map +1 -1
  101. package/dist/modules/auth/auth.service.d.ts +101 -6
  102. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  103. package/dist/modules/auth/auth.service.js +246 -51
  104. package/dist/modules/auth/auth.service.js.map +1 -1
  105. package/dist/modules/auth/password-hash.d.ts +5 -2
  106. package/dist/modules/auth/password-hash.d.ts.map +1 -1
  107. package/dist/modules/auth/password-hash.js +5 -2
  108. package/dist/modules/auth/password-hash.js.map +1 -1
  109. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  110. package/dist/modules/code-mode/code-mode.tool.js +11 -3
  111. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  112. package/dist/modules/database/core-schema.d.ts +96 -0
  113. package/dist/modules/database/core-schema.d.ts.map +1 -1
  114. package/dist/modules/database/core-schema.js +32 -3
  115. package/dist/modules/database/core-schema.js.map +1 -1
  116. package/dist/modules/database/pg-error.d.ts +9 -0
  117. package/dist/modules/database/pg-error.d.ts.map +1 -0
  118. package/dist/modules/database/pg-error.js +17 -0
  119. package/dist/modules/database/pg-error.js.map +1 -0
  120. package/dist/modules/embed/account-link.service.d.ts +42 -0
  121. package/dist/modules/embed/account-link.service.d.ts.map +1 -0
  122. package/dist/modules/embed/account-link.service.js +50 -0
  123. package/dist/modules/embed/account-link.service.js.map +1 -0
  124. package/dist/modules/embed/embed-link.d.ts +58 -0
  125. package/dist/modules/embed/embed-link.d.ts.map +1 -0
  126. package/dist/modules/embed/embed-link.js +160 -0
  127. package/dist/modules/embed/embed-link.js.map +1 -0
  128. package/dist/modules/embed/embed.errors.d.ts +30 -0
  129. package/dist/modules/embed/embed.errors.d.ts.map +1 -0
  130. package/dist/modules/embed/embed.errors.js +42 -0
  131. package/dist/modules/embed/embed.errors.js.map +1 -0
  132. package/dist/modules/embed/embed.interface.d.ts +204 -0
  133. package/dist/modules/embed/embed.interface.d.ts.map +1 -0
  134. package/dist/modules/embed/embed.interface.js +2 -0
  135. package/dist/modules/embed/embed.interface.js.map +1 -0
  136. package/dist/modules/embed/embed.routes.d.ts +59 -0
  137. package/dist/modules/embed/embed.routes.d.ts.map +1 -0
  138. package/dist/modules/embed/embed.routes.js +343 -0
  139. package/dist/modules/embed/embed.routes.js.map +1 -0
  140. package/dist/modules/embed/embed.service.d.ts +169 -0
  141. package/dist/modules/embed/embed.service.d.ts.map +1 -0
  142. package/dist/modules/embed/embed.service.js +627 -0
  143. package/dist/modules/embed/embed.service.js.map +1 -0
  144. package/dist/modules/embed/embed.tools.d.ts +51 -0
  145. package/dist/modules/embed/embed.tools.d.ts.map +1 -0
  146. package/dist/modules/embed/embed.tools.js +170 -0
  147. package/dist/modules/embed/embed.tools.js.map +1 -0
  148. package/dist/modules/embed/mcp-app.d.ts +64 -0
  149. package/dist/modules/embed/mcp-app.d.ts.map +1 -0
  150. package/dist/modules/embed/mcp-app.js +147 -0
  151. package/dist/modules/embed/mcp-app.js.map +1 -0
  152. package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
  153. package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
  154. package/dist/modules/embed/mcp-app.routes.js +36 -0
  155. package/dist/modules/embed/mcp-app.routes.js.map +1 -0
  156. package/dist/modules/github-app/github-app.connection.d.ts +15 -0
  157. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  158. package/dist/modules/github-app/github-app.connection.js +34 -3
  159. package/dist/modules/github-app/github-app.connection.js.map +1 -1
  160. package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
  161. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  162. package/dist/modules/kb-fs/locking-filesystem.js +300 -0
  163. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  164. package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
  165. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  166. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  167. package/dist/modules/kb-sync/kb-sync.service.js +6 -0
  168. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  169. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  170. package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
  171. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  172. package/dist/modules/mcp/mcp.service.d.ts +28 -1
  173. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  174. package/dist/modules/mcp/mcp.service.js +64 -8
  175. package/dist/modules/mcp/mcp.service.js.map +1 -1
  176. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
  177. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  178. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
  179. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  180. package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
  181. package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
  182. package/dist/modules/onboarding/onboarding.contract.js +7 -0
  183. package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
  184. package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
  185. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
  186. package/dist/modules/onboarding/onboarding.routes.js +81 -0
  187. package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
  188. package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
  189. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
  190. package/dist/modules/onboarding/starter-pack.service.js +492 -0
  191. package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
  192. package/dist/modules/onboarding/starter-packs.d.ts +78 -0
  193. package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
  194. package/dist/modules/onboarding/starter-packs.js +156 -0
  195. package/dist/modules/onboarding/starter-packs.js.map +1 -0
  196. package/dist/modules/plugins/index.d.ts +1 -1
  197. package/dist/modules/plugins/index.d.ts.map +1 -1
  198. package/dist/modules/plugins/index.js +1 -1
  199. package/dist/modules/plugins/index.js.map +1 -1
  200. package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
  201. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  202. package/dist/modules/plugins/plugin-provision.service.js +18 -1
  203. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  204. package/dist/modules/plugins/plugins.routes.d.ts +0 -36
  205. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  206. package/dist/modules/plugins/plugins.routes.js +31 -0
  207. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  208. package/dist/modules/settings/deployment-settings.service.d.ts +34 -0
  209. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  210. package/dist/modules/settings/deployment-settings.service.js +134 -1
  211. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  212. package/dist/modules/settings/repository-source.d.ts +1 -0
  213. package/dist/modules/settings/repository-source.d.ts.map +1 -1
  214. package/dist/modules/settings/repository-source.js +3 -3
  215. package/dist/modules/settings/repository-source.js.map +1 -1
  216. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  217. package/dist/modules/skills/skills.tools.js +50 -32
  218. package/dist/modules/skills/skills.tools.js.map +1 -1
  219. package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
  220. package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
  221. package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
  222. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  223. package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
  224. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  225. package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
  226. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  227. package/dist/modules/tool-auth/external-api-key.service.js +59 -2
  228. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  229. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  230. package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
  231. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  232. package/dist/modules/tool-helpers/index.d.ts +28 -1
  233. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  234. package/dist/modules/tool-helpers/index.js +28 -1
  235. package/dist/modules/tool-helpers/index.js.map +1 -1
  236. package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
  237. package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
  238. package/dist/modules/tool-helpers/route-argument-check.js +132 -0
  239. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
  240. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
  241. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
  242. package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
  243. package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
  244. package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
  245. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  246. package/dist/modules/tool-helpers/tool-def.js +70 -6
  247. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  248. package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
  249. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  250. package/dist/modules/tool-helpers/tool-handler.js +157 -8
  251. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  252. package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
  253. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  254. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  255. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  256. package/dist/modules/tool-manuals/tool-manuals.tools.js +14 -5
  257. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  258. package/dist/modules/tool-registry/description-length.d.ts +6 -2
  259. package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
  260. package/dist/modules/tool-registry/description-length.js +27 -5
  261. package/dist/modules/tool-registry/description-length.js.map +1 -1
  262. package/dist/modules/tool-registry/guide-first.d.ts +4 -0
  263. package/dist/modules/tool-registry/guide-first.d.ts.map +1 -1
  264. package/dist/modules/tool-registry/guide-first.js +9 -1
  265. package/dist/modules/tool-registry/guide-first.js.map +1 -1
  266. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +53 -0
  267. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
  268. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +97 -68
  269. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -1
  270. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
  271. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  272. package/dist/modules/workflow/agent-tools/workflow.tools.js +124 -37
  273. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  274. package/dist/modules/workflow/file-lock.service.d.ts +29 -5
  275. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  276. package/dist/modules/workflow/file-lock.service.js +62 -5
  277. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  278. package/dist/modules/workflow/git/git.service.d.ts +72 -1
  279. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  280. package/dist/modules/workflow/git/git.service.js +172 -36
  281. package/dist/modules/workflow/git/git.service.js.map +1 -1
  282. package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
  283. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  284. package/dist/modules/workflow/git/node-git-runner.js +78 -6
  285. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  286. package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
  287. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  288. package/dist/modules/workflow/pending-commits.service.js +25 -1
  289. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  290. package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
  291. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
  292. package/dist/modules/workflow/pending-commits.worker.js +23 -6
  293. package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
  294. package/dist/modules/workflow/recovery-bot.js +1 -1
  295. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  296. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  297. package/dist/modules/workflow/review-workflow/review-workflow.service.js +2 -1
  298. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  299. package/dist/modules/workflow/sanitize-error.d.ts +16 -0
  300. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
  301. package/dist/modules/workflow/sanitize-error.js +45 -0
  302. package/dist/modules/workflow/sanitize-error.js.map +1 -1
  303. package/dist/modules/workflow/workflow.service.d.ts +183 -15
  304. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  305. package/dist/modules/workflow/workflow.service.js +807 -107
  306. package/dist/modules/workflow/workflow.service.js.map +1 -1
  307. package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
  308. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
  309. package/dist/modules/workspace/agent-download.builder.js +238 -0
  310. package/dist/modules/workspace/agent-download.builder.js.map +1 -0
  311. package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
  312. package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
  313. package/dist/modules/workspace/agent-download.routes.js +156 -0
  314. package/dist/modules/workspace/agent-download.routes.js.map +1 -0
  315. package/dist/modules/workspace/agent-download.store.d.ts +225 -0
  316. package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
  317. package/dist/modules/workspace/agent-download.store.js +423 -0
  318. package/dist/modules/workspace/agent-download.store.js.map +1 -0
  319. package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
  320. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  321. package/dist/modules/workspace/agent-upload.store.js +16 -6
  322. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  323. package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
  324. package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
  325. package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
  326. package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
  327. package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
  328. package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
  329. package/dist/modules/workspace/file-readers/text-reader.js +5 -8
  330. package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
  331. package/dist/modules/workspace/first-run.d.ts +111 -0
  332. package/dist/modules/workspace/first-run.d.ts.map +1 -0
  333. package/dist/modules/workspace/first-run.js +181 -0
  334. package/dist/modules/workspace/first-run.js.map +1 -0
  335. package/dist/modules/workspace/move-links.d.ts +92 -0
  336. package/dist/modules/workspace/move-links.d.ts.map +1 -0
  337. package/dist/modules/workspace/move-links.js +173 -0
  338. package/dist/modules/workspace/move-links.js.map +1 -0
  339. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  340. package/dist/modules/workspace/startup/steps/seed-tree.js +3 -13
  341. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  342. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  343. package/dist/modules/workspace/workspace.routes.js +63 -22
  344. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  345. package/dist/modules/workspace/workspace.service.d.ts +75 -2
  346. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  347. package/dist/modules/workspace/workspace.service.js +197 -24
  348. package/dist/modules/workspace/workspace.service.js.map +1 -1
  349. package/dist/modules/workspace/workspace.tools.d.ts +59 -1
  350. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  351. package/dist/modules/workspace/workspace.tools.js +443 -65
  352. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  353. package/dist/modules/write-access/write-access.d.ts.map +1 -1
  354. package/dist/modules/write-access/write-access.js +9 -0
  355. package/dist/modules/write-access/write-access.js.map +1 -1
  356. package/dist/shared/domain-errors.d.ts +73 -1
  357. package/dist/shared/domain-errors.d.ts.map +1 -1
  358. package/dist/shared/domain-errors.js +86 -12
  359. package/dist/shared/domain-errors.js.map +1 -1
  360. package/dist/shared/git.contract.d.ts +10 -1
  361. package/dist/shared/git.contract.d.ts.map +1 -1
  362. package/dist/shared/git.contract.js.map +1 -1
  363. package/dist/shared/utf8-text.d.ts +15 -0
  364. package/dist/shared/utf8-text.d.ts.map +1 -0
  365. package/dist/shared/utf8-text.js +20 -0
  366. package/dist/shared/utf8-text.js.map +1 -0
  367. package/dist/tenancy/static-tenant-source.d.ts +2 -1
  368. package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
  369. package/dist/tenancy/static-tenant-source.js +9 -2
  370. package/dist/tenancy/static-tenant-source.js.map +1 -1
  371. package/mcp-app/page.html +349 -0
  372. package/migrations/0017_atlassian_account_links.sql +37 -0
  373. package/migrations/meta/0017_snapshot.json +2396 -0
  374. package/migrations/meta/_journal.json +8 -1
  375. package/package.json +5 -3
  376. package/src/__tests__/packaged-assets-ship.test.ts +16 -4
  377. package/src/__tests__/pg-scratch.ts +48 -0
  378. package/src/assets.ts +28 -2
  379. package/src/core/__tests__/catalog-revision.test.ts +40 -0
  380. package/src/core/__tests__/gated-boot.test.ts +1 -0
  381. package/src/core/__tests__/lifecycle.test.ts +14 -0
  382. package/src/core/catalog-revision.ts +15 -2
  383. package/src/core/create-core-server.ts +69 -3
  384. package/src/core/create-core-services.ts +151 -6
  385. package/src/core/lifecycle.ts +28 -2
  386. package/src/core-config.ts +24 -1
  387. package/src/index.ts +2 -2
  388. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +1 -0
  389. package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
  390. package/src/modules/access/__tests__/access.routes.admins.test.ts +203 -0
  391. package/src/modules/access/__tests__/access.routes.batch.test.ts +25 -5
  392. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +1 -0
  393. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +1 -1
  394. package/src/modules/access/__tests__/access.routes.overrides.test.ts +1 -1
  395. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
  396. package/src/modules/access/__tests__/access.routes.prospective.test.ts +1 -0
  397. package/src/modules/access/__tests__/access.routes.revoke.test.ts +1 -1
  398. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +1 -0
  399. package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
  400. package/src/modules/access/__tests__/roles-admin.service.test.ts +15 -2
  401. package/src/modules/access/__tests__/roles.routes.test.ts +132 -7
  402. package/src/modules/access/__tests__/user-access-removal.service.test.ts +2 -2
  403. package/src/modules/access/__tests__/users-db-double.ts +12 -3
  404. package/src/modules/access/access-control.interface.ts +23 -0
  405. package/src/modules/access/access-control.service.ts +35 -0
  406. package/src/modules/access/access.routes.ts +67 -6
  407. package/src/modules/access/directory-sync-bot.ts +1 -1
  408. package/src/modules/access/roles-admin.service.ts +51 -11
  409. package/src/modules/access/user-access-removal.service.ts +1 -1
  410. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +58 -0
  411. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +19 -1
  412. package/src/modules/agent-guide/agent-guide.ts +9 -0
  413. package/src/modules/agent-guide/index.ts +1 -0
  414. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +14 -0
  415. package/src/modules/agent-instructions/compose.ts +17 -2
  416. package/src/modules/agent-instructions/shared-file-rules.ts +19 -19
  417. package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
  418. package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
  419. package/src/modules/audit/agent-audit.service.ts +58 -3
  420. package/src/modules/audit/agent-connection.routes.ts +56 -0
  421. package/src/modules/audit/audit.contract.ts +26 -0
  422. package/src/modules/audit/index.ts +1 -0
  423. package/src/modules/auth/__tests__/account-deactivation.test.ts +145 -16
  424. package/src/modules/auth/__tests__/account-hooks.test.ts +57 -0
  425. package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +78 -0
  426. package/src/modules/auth/__tests__/account-switch-lock.test.ts +43 -0
  427. package/src/modules/auth/__tests__/account.routes.test.ts +387 -9
  428. package/src/modules/auth/__tests__/auth.service.created.pg.test.ts +69 -0
  429. package/src/modules/auth/__tests__/auth.service.test.ts +159 -1
  430. package/src/modules/auth/account-hooks.ts +69 -0
  431. package/src/modules/auth/account-switch-guard.ts +14 -0
  432. package/src/modules/auth/account-switch-lock.ts +58 -0
  433. package/src/modules/auth/account.routes.ts +122 -13
  434. package/src/modules/auth/auth.middleware.ts +1 -1
  435. package/src/modules/auth/auth.service.ts +268 -52
  436. package/src/modules/auth/password-hash.ts +5 -2
  437. package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
  438. package/src/modules/code-mode/code-mode.tool.ts +13 -2
  439. package/src/modules/database/__tests__/pg-error.test.ts +21 -0
  440. package/src/modules/database/__tests__/pii-backfill.pg.test.ts +6 -27
  441. package/src/modules/database/core-schema.ts +33 -3
  442. package/src/modules/database/pg-error.ts +15 -0
  443. package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
  444. package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
  445. package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
  446. package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
  447. package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
  448. package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
  449. package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
  450. package/src/modules/embed/account-link.service.ts +76 -0
  451. package/src/modules/embed/embed-link.ts +180 -0
  452. package/src/modules/embed/embed.errors.ts +43 -0
  453. package/src/modules/embed/embed.interface.ts +203 -0
  454. package/src/modules/embed/embed.routes.ts +363 -0
  455. package/src/modules/embed/embed.service.ts +705 -0
  456. package/src/modules/embed/embed.tools.ts +206 -0
  457. package/src/modules/embed/mcp-app.routes.ts +41 -0
  458. package/src/modules/embed/mcp-app.ts +173 -0
  459. package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
  460. package/src/modules/github-app/github-app.connection.ts +38 -4
  461. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
  462. package/src/modules/kb-fs/locking-filesystem.ts +287 -0
  463. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
  464. package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
  465. package/src/modules/kb-sync/kb-sync.service.ts +6 -0
  466. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
  467. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
  468. package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
  469. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +3 -1
  470. package/src/modules/mcp/__tests__/mcp.service.test.ts +23 -13
  471. package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
  472. package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
  473. package/src/modules/mcp/mcp.service.ts +81 -12
  474. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
  475. package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
  476. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
  477. package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
  478. package/src/modules/onboarding/onboarding.contract.ts +85 -0
  479. package/src/modules/onboarding/onboarding.routes.ts +85 -0
  480. package/src/modules/onboarding/starter-pack.service.ts +580 -0
  481. package/src/modules/onboarding/starter-packs.ts +182 -0
  482. package/src/modules/plugins/__tests__/plugins.tools.test.ts +25 -2
  483. package/src/modules/plugins/index.ts +1 -0
  484. package/src/modules/plugins/plugin-provision.service.ts +22 -1
  485. package/src/modules/plugins/plugins.routes.ts +29 -0
  486. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +150 -1
  487. package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
  488. package/src/modules/settings/deployment-settings.service.ts +131 -1
  489. package/src/modules/settings/repository-source.ts +4 -4
  490. package/src/modules/skills/__tests__/skills.tools.description.test.ts +5 -1
  491. package/src/modules/skills/skills.tools.ts +55 -35
  492. package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
  493. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
  494. package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
  495. package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
  496. package/src/modules/tool-auth/external-api-key.service.ts +61 -4
  497. package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
  498. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
  499. package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
  500. package/src/modules/tool-helpers/index.ts +34 -1
  501. package/src/modules/tool-helpers/route-argument-check.ts +149 -0
  502. package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
  503. package/src/modules/tool-helpers/tool-def.ts +132 -7
  504. package/src/modules/tool-helpers/tool-handler.ts +196 -8
  505. package/src/modules/tool-helpers/tool.contract.ts +9 -0
  506. package/src/modules/tool-manuals/tool-manuals.tools.ts +15 -5
  507. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +14 -1
  508. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +23 -10
  509. package/src/modules/tool-registry/description-length.ts +34 -7
  510. package/src/modules/tool-registry/guide-first.ts +8 -1
  511. package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
  512. package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
  513. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
  514. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
  515. package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
  516. package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
  517. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
  518. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
  519. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
  520. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
  521. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
  522. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
  523. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +41 -5
  524. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +127 -2
  525. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +157 -122
  526. package/src/modules/workflow/agent-tools/workflow.tools.ts +129 -35
  527. package/src/modules/workflow/file-lock.service.ts +67 -5
  528. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
  529. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
  530. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
  531. package/src/modules/workflow/git/git.service.ts +176 -38
  532. package/src/modules/workflow/git/node-git-runner.ts +82 -7
  533. package/src/modules/workflow/pending-commits.service.ts +29 -1
  534. package/src/modules/workflow/pending-commits.worker.ts +24 -6
  535. package/src/modules/workflow/recovery-bot.ts +1 -1
  536. package/src/modules/workflow/review-workflow/review-workflow.service.ts +2 -1
  537. package/src/modules/workflow/sanitize-error.ts +50 -0
  538. package/src/modules/workflow/workflow.service.ts +881 -113
  539. package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
  540. package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
  541. package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
  542. package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
  543. package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
  544. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
  545. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
  546. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
  547. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
  548. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
  549. package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
  550. package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
  551. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
  552. package/src/modules/workspace/__tests__/workspace.tools.test.ts +409 -12
  553. package/src/modules/workspace/agent-download.builder.ts +308 -0
  554. package/src/modules/workspace/agent-download.routes.ts +183 -0
  555. package/src/modules/workspace/agent-download.store.ts +533 -0
  556. package/src/modules/workspace/agent-upload.store.ts +23 -7
  557. package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
  558. package/src/modules/workspace/file-readers/text-reader.ts +5 -8
  559. package/src/modules/workspace/first-run.ts +222 -0
  560. package/src/modules/workspace/move-links.ts +237 -0
  561. package/src/modules/workspace/startup/steps/seed-tree.ts +3 -12
  562. package/src/modules/workspace/workspace.routes.ts +64 -22
  563. package/src/modules/workspace/workspace.service.ts +202 -25
  564. package/src/modules/workspace/workspace.tools.ts +492 -63
  565. package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
  566. package/src/modules/write-access/write-access.ts +9 -0
  567. package/src/shared/domain-errors.ts +108 -11
  568. package/src/shared/git.contract.ts +8 -1
  569. package/src/shared/utf8-text.ts +21 -0
  570. package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
  571. package/src/tenancy/static-tenant-source.ts +10 -2
  572. package/starter-packs/README.md +103 -0
  573. package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
  574. package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
  575. package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
  576. package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
  577. package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
  578. package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
  579. package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
  580. package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
  581. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
  582. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
  583. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
  584. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
  585. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
  586. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
  587. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
  588. package/starter-packs/engineering/pack.yaml +11 -0
  589. package/starter-packs/general/KnowledgeBase/About us.md +9 -0
  590. package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
  591. package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
  592. package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
  593. package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
  594. package/starter-packs/general/Plugins/general-starter/access.md +19 -0
  595. package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
  596. package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
  597. package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
  598. package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
  599. package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
  600. package/starter-packs/general/pack.yaml +10 -0
  601. package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
  602. package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
  603. package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
  604. package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
  605. package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
  606. package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
  607. package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
  608. package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
  609. package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
  610. package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
  611. package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
  612. package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
  613. package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
  614. package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
  615. package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
  616. package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
  617. package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
  618. package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
  619. package/starter-packs/operations/pack.yaml +12 -0
  620. package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
  621. package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
  622. package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
  623. package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
  624. package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
  625. package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
  626. package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
  627. package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
  628. package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
  629. package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
  630. package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
  631. package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
  632. package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
  633. package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
  634. package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
  635. package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
  636. package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
  637. package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
  638. package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
  639. package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
  640. package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
  641. package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
  642. package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
  643. package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
  644. package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
  645. package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
  646. package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
  647. package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
  648. package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
  649. package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
  650. package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
  651. package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
  652. package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
  653. package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
  654. package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
  655. package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
  656. package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
  657. package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
  658. package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
  659. package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
  660. package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
  661. package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
  662. package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
  663. package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
  664. package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
  665. package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
  666. package/starter-packs/sales/pack.yaml +13 -0
  667. package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
  668. package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
  669. package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
  670. package/starter-packs/support/KnowledgeBase/Products.md +9 -0
  671. package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
  672. package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
  673. package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
  674. package/starter-packs/support/Plugins/support-starter/access.md +19 -0
  675. package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
  676. package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
  677. package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
  678. package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
  679. package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
  680. package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
  681. package/starter-packs/support/pack.yaml +12 -0
@@ -17,6 +17,10 @@ import { getDb, type Database } from '../modules/database/connection.js';
17
17
  import { runCoreMigrations } from '../modules/database/migrate.js';
18
18
  import { coreMigrationsDir } from '../assets.js';
19
19
  import { WorkspaceService } from '../modules/workspace/workspace.service.js';
20
+ import { AccountLinkService } from '../modules/embed/account-link.service.js';
21
+ import { EmbedService } from '../modules/embed/embed.service.js';
22
+ import { McpAppService, type IMcpAppService } from '../modules/embed/mcp-app.js';
23
+ import { createFileReaderRegistry } from '../modules/workspace/file-readers/file-reader.registry.js';
20
24
  import { RoutineWritePolicyService } from '../modules/workspace/routine-write-policy.js';
21
25
  import { KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
22
26
  import { GroupsToPluginsStep } from '../modules/workspace/startup/steps/groups-to-plugins.step.js';
@@ -26,7 +30,7 @@ import { PersonalSpacesStep } from '../modules/workspace/startup/steps/personal-
26
30
  import { TemplateFilesStep } from '../modules/workspace/startup/steps/template-files.step.js';
27
31
  import { RolesYamlStep } from '../modules/workspace/startup/steps/roles-yaml.step.js';
28
32
  import { buildSeedTree } from '../modules/workspace/startup/steps/seed-tree.js';
29
- import { DeploymentSettingsService } from '../modules/settings/deployment-settings.service.js';
33
+ import { DeploymentSettingsService, retireMergedBranchesOn } from '../modules/settings/deployment-settings.service.js';
30
34
  import { KbSyncService } from '../modules/kb-sync/kb-sync.service.js';
31
35
  import { NodeFs } from '../modules/kb-fs/node-fs.js';
32
36
  import { assertKbDirNameFree } from '../modules/kb-fs/repo-path.js';
@@ -55,17 +59,22 @@ function parseDomainList(raw: string): string[] {
55
59
  }
56
60
  import { SpillStore } from '../modules/workspace/spill-store.js';
57
61
  import { AgentUploadStore, assertUploadsRootOutsideWorkspaces } from '../modules/workspace/agent-upload.store.js';
62
+ import { AgentDownloadStore, type IAgentDownloadStore } from '../modules/workspace/agent-download.store.js';
63
+ import { createDownloadFetcherIdentifier } from '../modules/workspace/agent-download.routes.js';
64
+ import type { Request } from 'express';
58
65
  import { DocExtractService } from '../modules/workspace/file-readers/doc-extract.service.js';
59
66
  import { UuidSessionSink, type ISessionSink } from '../modules/workspace/session-sink.js';
60
67
  import { AuthService } from '../modules/auth/auth.service.js';
68
+ import { AccountHooks, type IAccountHooks } from '../modules/auth/account-hooks.js';
61
69
  import { AccountErasureService } from '../modules/auth/account-erasure.service.js';
62
70
  import { OidcAuthProvider, oidcSettingsFrom } from '../modules/auth/oidc-auth-provider.js';
63
- import { createAuthMiddleware } from '../modules/auth/auth.middleware.js';
71
+ import { createAuthMiddleware, readAuthCookie } from '../modules/auth/auth.middleware.js';
64
72
  import { AccessControlService, loadActiveGroups } from '../modules/access/access-control.service.js';
65
73
  import { CreatorAccessService } from '../modules/access/creator-access.js';
66
74
  import { ChangeReadGate } from '../modules/access/change-read-gate.js';
67
75
  import { GroupsAdminService } from '../modules/access/groups-admin.service.js';
68
76
  import { UserAccessRemovalService } from '../modules/access/user-access-removal.service.js';
77
+ import { makeRolesYamlWriteValidator } from '../modules/access-model/roles-yaml-guard.js';
69
78
  import { PendingSkillsService, SkillService } from '../modules/skills/index.js';
70
79
  import { PendingToolsService, ToolManualService } from '../modules/tool-manuals/index.js';
71
80
  import { McpServerEditService } from '../modules/tool-manuals/mcp-server-edit.service.js';
@@ -110,6 +119,7 @@ import { ReviewWorkflowService } from '../modules/workflow/review-workflow/revie
110
119
  import { FileLockService } from '../modules/workflow/file-lock.service.js';
111
120
  import { WorkflowEventBus } from '../modules/workflow/event-bus.js';
112
121
  import { FileChangeNotifier } from '../modules/kb-fs/file-change-notifier.js';
122
+ import { StarterPackService } from '../modules/onboarding/starter-pack.service.js';
113
123
  import { WorkflowService } from '../modules/workflow/workflow.service.js';
114
124
  import { WorkflowHooks } from '../modules/workflow/workflow-hooks.js';
115
125
  import { PendingCommitsService } from '../modules/workflow/pending-commits.service.js';
@@ -132,6 +142,7 @@ import {
132
142
  } from '../modules/tool-auth/internal-token.service.js';
133
143
  import {
134
144
  createToolAuthMiddleware,
145
+ createTokenVerifier,
135
146
  createManualAuthMiddleware,
136
147
  } from '../modules/tool-auth/tool-auth.middleware.js';
137
148
  import { unmeteredLlmUsage, type ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
@@ -229,6 +240,14 @@ export interface CoreServices {
229
240
  spillStore: SpillStore;
230
241
  /** The bytes an agent uploaded, held until `apply_file_upload` lands them or their token expires. */
231
242
  agentUploadStore: AgentUploadStore;
243
+ /** The bytes `request_file_download` captured, held until their one-time link is fetched or expires. */
244
+ agentDownloadStore: IAgentDownloadStore;
245
+ /**
246
+ * Every user a download fetch identifies itself as, by its bearer and its
247
+ * session cookie — none when it carries none that verifies — so the
248
+ * download route can refuse a link presented by someone it was not issued to.
249
+ */
250
+ agentDownloadFetcher: (req: Request) => Promise<string[]>;
232
251
  docExtractService: DocExtractService;
233
252
  accessControl: AccessControlService;
234
253
  creatorAccess: CreatorAccessService;
@@ -258,6 +277,11 @@ export interface CoreServices {
258
277
  toolDeleteService: ToolDeleteService;
259
278
  pluginIndexService: PluginIndexService;
260
279
  pluginProvisionService: PluginProvisionService;
280
+ /**
281
+ * "What does your team do?" — the starter pack a new knowledge base's admin
282
+ * may fill it from, and the record of what was chosen. See modules/onboarding.
283
+ */
284
+ starterPackService: StarterPackService;
261
285
  joinRequestsService: JoinRequestsService;
262
286
  /**
263
287
  * Records a join request and finishes it in the background. Its `sweep()`
@@ -279,6 +303,12 @@ export interface CoreServices {
279
303
  githubFacade: GitHubFacade;
280
304
  githubFacadeCredentials: GitHubFacadeCredentialsService;
281
305
  authService: AuthService;
306
+ /**
307
+ * The seam for "an account was invited": a deployment registers here how
308
+ * the person is told (the cloud's mail, say), and the invite's answer says
309
+ * whether somebody did. Core registers nothing.
310
+ */
311
+ accountHooks: IAccountHooks;
282
312
  authMiddleware: ReturnType<typeof createAuthMiddleware>;
283
313
  accountErasureService: AccountErasureService;
284
314
  gitService: GitService;
@@ -335,6 +365,14 @@ export interface CoreServices {
335
365
  connectionProbeService: ConnectionProbeService;
336
366
  externalApiKeyService: ExternalApiKeyService;
337
367
  internalTokenService: InternalTokenService;
368
+ /**
369
+ * The embed surface: the token-minted page a chat host frames, and the
370
+ * account links that let an outside identity reach it. Exposed so an
371
+ * overlay can mint for its own consumers and register a node-id resolver.
372
+ */
373
+ embedService: EmbedService;
374
+ /** The MCP Apps this deployment serves — the `open_page` view and its sandbox metadata. */
375
+ mcpAppService: IMcpAppService;
338
376
  mcpService: McpService;
339
377
  mcpAuthMiddleware: ReturnType<typeof createMcpAuthMiddleware>;
340
378
  mcpOAuthProvider: BevelOAuthProvider;
@@ -685,6 +723,29 @@ export async function createCoreServices(
685
723
  publicBaseUrl: config.publicBackendUrl,
686
724
  tokenPrefix: config.uploadTokenPrefix,
687
725
  });
726
+ // The way OUT: bytes `request_file_download` captured, held beside the
727
+ // upload root — outside every workspace, for the same reason — until their
728
+ // one-time link is fetched or expires.
729
+ const agentDownloadsRoot = path.resolve(config.agentUploadsRoot, '..', 'agent-downloads');
730
+ // An upload root that is itself named `agent-downloads` would make the two
731
+ // stores one directory, each sweeping the other's files.
732
+ if (agentDownloadsRoot === path.resolve(config.agentUploadsRoot)) {
733
+ throw new Error(
734
+ 'AGENT_UPLOADS_ROOT must not be a directory named `agent-downloads`: that name, beside it, is the agent download root.',
735
+ );
736
+ }
737
+ await assertUploadsRootOutsideWorkspaces(agentDownloadsRoot, config.workspacesRoot, {
738
+ name: 'The agent download root (`agent-downloads`, beside AGENT_UPLOADS_ROOT)',
739
+ why:
740
+ 'captured download bytes wait there for their one-time links, so a root inside a workspace would let the ' +
741
+ 'file tools read them. Point AGENT_UPLOADS_ROOT at a directory whose parent is outside WORKSPACES_ROOT.',
742
+ });
743
+ const agentDownloadStore = new AgentDownloadStore({
744
+ root: agentDownloadsRoot,
745
+ publicBaseUrl: config.publicBackendUrl,
746
+ // `<tenant>-down_`: recognisable by shape beside the upload token.
747
+ tokenPrefix: config.uploadTokenPrefix.replace(/up_$/, 'down_'),
748
+ });
688
749
  // Office-document/PDF text extraction for `read_file`/`grep`, cached by
689
750
  // content hash beside the workspaces root (see `DocExtractionCache`).
690
751
  const docExtractService = new DocExtractService(config.docExtractCacheRoot);
@@ -761,6 +822,9 @@ export async function createCoreServices(
761
822
  ports.accountAdmission,
762
823
  );
763
824
  const authMiddleware = createAuthMiddleware(authService);
825
+ // Who tells an invited person: the composition root of a distribution
826
+ // registers its listener here, after this returns (see `AccountHooks`).
827
+ const accountHooks = new AccountHooks();
764
828
 
765
829
  // Shared mutex so git and diff operations on the same workspace serialize
766
830
  // against each other — a backup-reseed races a concurrent commit otherwise.
@@ -869,6 +933,9 @@ export async function createCoreServices(
869
933
  // it reach every hook point.
870
934
  workflowHooks,
871
935
  );
936
+ // The leftover-branch cleanup asks the Deployment page at every round, so
937
+ // switching it off there applies without a restart.
938
+ workflowService.leftoverCleanupEnabled = () => retireMergedBranchesOn(settings.resolve('retireMergedBranches'));
872
939
 
873
940
  // Join requests: derived entirely from two copies of a plugin's `access.md`
874
941
  // (the request's branch vs the default branch), so it holds no state — it
@@ -1053,6 +1120,27 @@ export async function createCoreServices(
1053
1120
  [config.adminEmail],
1054
1121
  );
1055
1122
 
1123
+ // The starter-pack question: one commit on the default branch through the
1124
+ // same batch write the roles admin uses, the choice kept as a deployment
1125
+ // setting. Read by its routes and by `start_session`'s first-run note.
1126
+ const starterPackService = new StarterPackService({
1127
+ packsDir: config.starterPacksDir,
1128
+ kb,
1129
+ workspaceService,
1130
+ workflow: workflowService,
1131
+ adminAccess,
1132
+ settings,
1133
+ accessControl,
1134
+ disk,
1135
+ pluginSource,
1136
+ pluginLocks: pluginProvisionService,
1137
+ events: eventBus,
1138
+ fileChanges: fileChangeNotifier,
1139
+ // Its own lock: one starter-pack choice at a time, a concern no other
1140
+ // service's mutex serialises.
1141
+ choosing: new WorkspaceMutex(),
1142
+ });
1143
+
1056
1144
  // In-app update check: lazily compares the running release version against
1057
1145
  // the newest published GitHub release, only when an admin's browser asks —
1058
1146
  // no timers, so a deployment nobody looks at makes zero calls. The flag
@@ -1152,9 +1240,13 @@ export async function createCoreServices(
1152
1240
  // Connection keys also come as GitHub-shaped links (`gho_…`, kind
1153
1241
  // `github-link`): the same key, minted by the marketplace facade below when
1154
1242
  // a person connects an account on claude.ai, told apart by its stored kind.
1155
- const externalApiKeyService = new ExternalApiKeyService(db, config.externalApiKeyPrefix, {
1156
- [GITHUB_LINK_KEY_KIND]: GITHUB_LINK_KEY_SPEC,
1157
- });
1243
+ const externalApiKeyService = new ExternalApiKeyService(
1244
+ db,
1245
+ config.externalApiKeyPrefix,
1246
+ { [GITHUB_LINK_KEY_KIND]: GITHUB_LINK_KEY_SPEC },
1247
+ // A key's first use tells its owner's open tabs that the agent arrived.
1248
+ eventBus,
1249
+ );
1158
1250
 
1159
1251
  // The facade that lets products which sync marketplaces only from a GitHub
1160
1252
  // Enterprise Server (claude.ai, Cowork) add the per-user marketplace:
@@ -1192,6 +1284,34 @@ export async function createCoreServices(
1192
1284
  const agentAuditService = new AgentAuditService(db, externalApiKeyService, () =>
1193
1285
  retentionDaysFrom(settings.resolve('auditRetentionDays')),
1194
1286
  );
1287
+ // The embed surface. It reads files through the workspace service and
1288
+ // judges them with the same access resolver the app file page uses, so what
1289
+ // a reader may see and change inside a chat is what they may see and change
1290
+ // in the app — never a second answer to the same question.
1291
+ const embedService = new EmbedService(
1292
+ // The RESOLVED checkout folder, not the env's: `config.kbDirName` is only
1293
+ // the environment value, empty on a deployment that took the default or
1294
+ // named it in setup, and every path the embed builds starts with it.
1295
+ { ...config, kbDirName },
1296
+ kb,
1297
+ workspaceService,
1298
+ accessControl,
1299
+ authService,
1300
+ workflowService,
1301
+ gitService,
1302
+ new AccountLinkService(db),
1303
+ // The SAME extension-to-reader registry `read_file` dispatches on, so the
1304
+ // embed answer to "is this text, or bytes a renderer fetches?" cannot
1305
+ // disagree with what a read of the file returns.
1306
+ createFileReaderRegistry(docExtractService),
1307
+ // The SAME pre-disk gate the file editor and the agent tools run: a
1308
+ // `roles.yaml` that would not parse is refused before it is written, from
1309
+ // a chat exactly as from the app.
1310
+ makeRolesYamlWriteValidator(kbDirName),
1311
+ );
1312
+ // The `ui://` view `open_page` carries, with the one origin it may frame:
1313
+ // this deployment own public origin.
1314
+ const mcpAppService = new McpAppService({ publicFrontendUrl: config.publicFrontendUrl });
1195
1315
  const mcpService = new McpService(
1196
1316
  {
1197
1317
  // Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
@@ -1225,6 +1345,9 @@ export async function createCoreServices(
1225
1345
  (bearer) => mcpOAuthProvider.revokeByAccessToken(bearer),
1226
1346
  // Every attributable call lands in the Audit log through this.
1227
1347
  agentAuditService,
1348
+ // The views the endpoint serves over resources/read, and the tools that
1349
+ // carry them.
1350
+ mcpAppService,
1228
1351
  );
1229
1352
  // A changed secret invalidates what the proxy built from the old value for
1230
1353
  // that user (null = shared secret → everyone): remembered manual failures,
@@ -1247,6 +1370,8 @@ export async function createCoreServices(
1247
1370
  stateSecret: config.jwtSecret,
1248
1371
  publicFrontendUrl: config.publicFrontendUrl,
1249
1372
  tokenPrefix: config.mcpOAuthTokenPrefix,
1373
+ // An agent connection's first use tells its owner's open tabs the agent arrived.
1374
+ events: eventBus,
1250
1375
  });
1251
1376
  // RFC 9728 pointer carried on every MCP 401 challenge so OAuth-capable
1252
1377
  // clients discover the AS. Single source of truth for the resource id.
@@ -1283,8 +1408,22 @@ export async function createCoreServices(
1283
1408
  loadActiveGroups,
1284
1409
  });
1285
1410
  const writeAccess = ports.writeAccess ?? alwaysWritable;
1286
- const toolHandlerFactory = createToolHandlerFactory(resolveToolContext, writeAccess);
1411
+ // The branch every tool call runs on is resolved by the handler, before the
1412
+ // tool: the default read live (a rename in the settings is the next call's
1413
+ // default), the existence asked without cloning anything.
1414
+ const toolHandlerFactory = createToolHandlerFactory(resolveToolContext, writeAccess, {
1415
+ defaultBranch: () => kb.defaultBranch,
1416
+ isMissing: (branch) => workspaceService.isBranchMissing(branch),
1417
+ });
1287
1418
  const toolAuthMiddleware = createToolAuthMiddleware(externalApiKeyService, internalTokenService, authService);
1419
+ const verifyToolToken = createTokenVerifier(externalApiKeyService, internalTokenService, authService);
1420
+ // Every credential kind this server issues — connection keys, internal
1421
+ // tokens and app sessions (bearer or cookie) — so a fetch carrying another
1422
+ // user's identity of ANY kind is refused the link.
1423
+ const agentDownloadFetcher: (req: Request) => Promise<string[]> = createDownloadFetcherIdentifier(
1424
+ { verifyToolToken, verifySession: (token) => authService.verifyToken(token) },
1425
+ readAuthCookie,
1426
+ );
1288
1427
  // Read-only manual endpoints accept the above PLUS a browser JWT, so a
1289
1428
  // logged-in user can browse the catalog with their session. Execution routes
1290
1429
  // keep `toolAuthMiddleware` (no JWT), so a session can read but not invoke.
@@ -1452,6 +1591,8 @@ export async function createCoreServices(
1452
1591
  kbDirName,
1453
1592
  spillStore,
1454
1593
  agentUploadStore,
1594
+ agentDownloadStore,
1595
+ agentDownloadFetcher,
1455
1596
  docExtractService,
1456
1597
  accessControl,
1457
1598
  creatorAccess,
@@ -1466,6 +1607,7 @@ export async function createCoreServices(
1466
1607
  agentGuideSections: agentGuideSectionsReader,
1467
1608
  pluginIndexService,
1468
1609
  pluginProvisionService,
1610
+ starterPackService,
1469
1611
  joinRequestsService,
1470
1612
  pluginJoinRequestJobs,
1471
1613
  pluginLinkIndex,
@@ -1476,6 +1618,7 @@ export async function createCoreServices(
1476
1618
  githubFacade,
1477
1619
  githubFacadeCredentials,
1478
1620
  authService,
1621
+ accountHooks,
1479
1622
  authMiddleware,
1480
1623
  accountErasureService,
1481
1624
  gitService,
@@ -1499,6 +1642,8 @@ export async function createCoreServices(
1499
1642
  connectionProbeService,
1500
1643
  externalApiKeyService,
1501
1644
  internalTokenService,
1645
+ embedService,
1646
+ mcpAppService,
1502
1647
  mcpService,
1503
1648
  mcpAuthMiddleware,
1504
1649
  mcpOAuthProvider,
@@ -291,7 +291,7 @@ export interface BootableCore {
291
291
  config: { workspacesRoot: string };
292
292
  kbDirName: string;
293
293
  kbStartupRunner: Pick<KbStartupRunner, 'runAll' | 'retryUntilMaintained'>;
294
- workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches'>;
294
+ workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches' | 'tidyAfterSweep'>;
295
295
  pluginJoinRequestJobs: Pick<PluginJoinRequestJobs, 'startSweeping'>;
296
296
  /**
297
297
  * The startup phase's retry, when the boot survived an unreachable remote
@@ -390,7 +390,11 @@ export async function startCore<C extends BootableCore>(
390
390
  crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
391
391
  }
392
392
  })
393
- .catch((err) => crLog.warn('deleted-branch sweep failed:', { err }));
393
+ .catch((err) => crLog.warn('deleted-branch sweep failed:', { err }))
394
+ // Then the tidy-up: open requests that propose nothing are closed, and the
395
+ // branches merged requests left behind removed (behind its own setting).
396
+ // Fails safe on a failed fetch, and never throws.
397
+ .then(() => core.workflowService.tidyAfterSweep());
394
398
 
395
399
  // Recorded join requests that are still owed, resumed — now, and then on a
396
400
  // timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
@@ -437,6 +441,15 @@ export interface CoreStopDeps {
437
441
  * Optional: a caller that has not built one passes nothing.
438
442
  */
439
443
  agentUploadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
444
+ /** The agent download store, whose sweep deletes captured bytes nobody fetched — stopped for the same reason. */
445
+ agentDownloadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
446
+ /**
447
+ * The workflow service, for the tidy-up it runs after each sweep (closing
448
+ * empty requests, removing leftover branches): detached from whatever
449
+ * started it, so stopped and awaited here before the pool goes. Optional:
450
+ * a caller that has not built one passes nothing.
451
+ */
452
+ workflowService?: { stopTidying(): void; drainTidy(): Promise<void> };
440
453
  /** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
441
454
  startupRetry?: { stop(): void } | null;
442
455
  /** The database — its pool is ended last, once nothing above can still need it. */
@@ -524,10 +537,14 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
524
537
  // synchronous, and it only clears an interval and tells a sweep already
525
538
  // running to stop deleting.
526
539
  deps.agentUploadStore?.stopSweeping();
540
+ deps.agentDownloadStore?.stopSweeping();
527
541
  // A startup phase still asking for an unreachable remote stops asking:
528
542
  // synchronous, and nothing after it must be able to clone into a
529
543
  // workspaces folder that is about to belong to nobody.
530
544
  deps.startupRetry?.stop();
545
+ // The post-sweep tidy-up: no new round, and the one under way stops at its
546
+ // next request or branch. Synchronous.
547
+ deps.workflowService?.stopTidying();
531
548
  // Clearing the interval stops future ticks; it does nothing to a job a
532
549
  // tick already started, which holds a claim it heartbeats through the
533
550
  // pool and is mid-clone or mid-push. Awaited here, in the budget: a job
@@ -543,6 +560,15 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
543
560
  if (deps.agentUploadStore) {
544
561
  await bounded(deps.agentUploadStore.drainSweep(), remaining(), 'finishing the upload sweep', log);
545
562
  }
563
+ if (deps.agentDownloadStore) {
564
+ await bounded(deps.agentDownloadStore.drainSweep(), remaining(), 'finishing the download sweep', log);
565
+ }
566
+ // The tidy-up in flight fetches and deletes branches through the pool and
567
+ // the default branch's checkout: awaited, so the next graph for this
568
+ // tenant cannot find a branch deletion still running under it.
569
+ if (deps.workflowService) {
570
+ await bounded(deps.workflowService.drainTidy(), remaining(), 'finishing the branch tidy-up', log);
571
+ }
546
572
  await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
547
573
  if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
548
574
  await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
@@ -1,7 +1,7 @@
1
1
  import dotenv from 'dotenv';
2
2
  import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { defaultKbTemplateDir } from './assets.js';
4
+ import { defaultKbTemplateDir, defaultStarterPacksDir } from './assets.js';
5
5
  import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
6
6
  import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
7
7
  import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
@@ -103,11 +103,13 @@ export interface TenantConfig {
103
103
  readonly gitUsername: string;
104
104
  readonly gitToken: string;
105
105
  readonly kbTemplateDir: string;
106
+ readonly starterPacksDir: string;
106
107
  readonly updateCheckEnabled: boolean;
107
108
  readonly loginPasswordEnabled: boolean;
108
109
  readonly allowedEmailDomains: string[];
109
110
  readonly secretsEncKey: string;
110
111
  readonly internalTokenSecret: string;
112
+ readonly embedSharedSecret: string;
111
113
  readonly trustProxy: string;
112
114
  readonly gitTimeoutMs: number;
113
115
  readonly publicBackendUrl: string;
@@ -276,6 +278,14 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
276
278
  * existing one. Override with `KB_TEMPLATE_DIR`.
277
279
  */
278
280
  readonly kbTemplateDir: string;
281
+ /**
282
+ * Filesystem path to the starter packs a new knowledge base's admin may
283
+ * pick from (the `starter-packs/` folder shipped inside this package — see
284
+ * `defaultStarterPacksDir()`): one folder per team, each a `pack.yaml` with
285
+ * the pages and the plugin it adds. A distribution offers its own with
286
+ * `STARTER_PACKS_DIR`; a folder holding no valid pack offers none.
287
+ */
288
+ readonly starterPacksDir: string;
279
289
  /**
280
290
  * In-app update check. When true (default), `GET /api/update-check` lazily
281
291
  * asks api.github.com for the newest Hexis release — only when an admin's
@@ -337,6 +347,17 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
337
347
  * independently of user sessions.
338
348
  */
339
349
  readonly internalTokenSecret: string;
350
+ /**
351
+ * The shared secret the Atlassian connector presents to \`POST
352
+ * /api/embed/token\` (\`EMBED_SHARED_SECRET\`). Unset on a deployment that
353
+ * has no connector pointed at it, which 404s that one route — the embed
354
+ * surface itself needs no secret, because the MCP App mints through the
355
+ * authenticated MCP session instead.
356
+ *
357
+ * There is deliberately NO framing setting beside it: any site may frame
358
+ * the embed page (see the embed module), so there is no allowlist to keep.
359
+ */
360
+ readonly embedSharedSecret: string;
340
361
  /**
341
362
  * Express `trust proxy` setting, from `TRUST_PROXY`: the number of reverse
342
363
  * proxy hops in front of this backend (e.g. `1`), or an address/CIDR list
@@ -477,6 +498,7 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
477
498
  // Default: the `kb-template/` folder shipped inside this package (works
478
499
  // both from src/ and compiled dist/ — see assets.ts).
479
500
  this.kbTemplateDir = process.env.KB_TEMPLATE_DIR || defaultKbTemplateDir();
501
+ this.starterPacksDir = process.env.STARTER_PACKS_DIR || defaultStarterPacksDir();
480
502
  this.updateCheckEnabled =
481
503
  (process.env.UPDATE_CHECK ?? 'true').trim().toLowerCase() !== 'false';
482
504
  this.allowedEmailDomains = (process.env.ALLOWED_EMAIL_DOMAINS || '')
@@ -503,6 +525,7 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
503
525
  // key never gets past this line.
504
526
  assertKeyDecodesTo32Bytes(this.secretsEncKey, secretsKeySource);
505
527
  this.internalTokenSecret = (process.env.INTERNAL_TOKEN_SECRET || '').trim();
528
+ this.embedSharedSecret = (process.env.EMBED_SHARED_SECRET || '').trim();
506
529
  // Setting DOMAIN declares "the bundled Caddy `https` profile fronts this
507
530
  // deployment" — one proxy hop, and the public origin IS that domain. The
508
531
  // three values below therefore default from it, so `DOMAIN=x.example.com`
package/src/index.ts CHANGED
@@ -47,8 +47,8 @@ export {
47
47
  type LeasedWorker,
48
48
  } from './core/lifecycle.js';
49
49
 
50
- // Packaged assets (migrations/, kb-template/, agent-guide/) + the migration runners.
51
- export { agentGuideDir, coreMigrationsDir, defaultKbTemplateDir } from './assets.js';
50
+ // Packaged assets (migrations/, kb-template/, agent-guide/, starter-packs/) + the migration runners.
51
+ export { agentGuideDir, coreMigrationsDir, defaultKbTemplateDir, defaultStarterPacksDir } from './assets.js';
52
52
  export {
53
53
  runCoreMigrations,
54
54
  runEnterpriseMigrations,
@@ -280,6 +280,7 @@ describe('Admin write floor at the repository root', () => {
280
280
  service(),
281
281
  { ...ws, getOrCreateForBranch: async () => ({ id: WS, kbDirName: KB }) } as unknown as WorkspaceService,
282
282
  { getUserById: async (id: string) => users[id as 'u-admin'] ?? null } as unknown as AuthService,
283
+ { whileSwitchedOn: async (_email: string, write: () => Promise<void>) => write() },
283
284
  {
284
285
  getLock: async () => null,
285
286
  acquireLock: async () => ({ acquired: true, lock: {} }),
@@ -216,6 +216,25 @@ describe('AccessControlService', () => {
216
216
  expect(await svc.canWrite(workspaceId, 'ali@bevel.software', 'Knowledge/Secret/Foo.md')).toBe(false);
217
217
  });
218
218
 
219
+ // What deleting a nested access.md (delete_file, or the app's delete) does:
220
+ // the folder falls back to its parent's rules, nothing else to undo.
221
+ it('once a nested access.md is deleted, its folder follows the parent\'s rules', async () => {
222
+ const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
223
+ await writeFile(repo, 'roles.yaml', ROLES_YAML);
224
+ await writeFile(repo, 'access.md', '---\nread:\n - everyone\nwrite:\n - Admin\n---\n');
225
+ await writeFile(repo, 'Team/access.md', '---\nread:\n - deny Felix Kissel <felix@example.com>\n---\n');
226
+ await writeFile(repo, 'Team/plan.md', 'plan');
227
+
228
+ const svc = new AccessControlService(stubWorkspaceService(workspaceId, workspaceDir), PROCESS_MAP_DIR, new NodeFs());
229
+ expect(await svc.canRead(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(false);
230
+
231
+ await fs.rm(path.join(repo, 'Team/access.md'));
232
+ svc.invalidate(workspaceId);
233
+
234
+ expect(await svc.canRead(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(true);
235
+ expect(await svc.canWrite(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(false);
236
+ });
237
+
219
238
  it('closeness beats tier: a closer everyone grant overrides a farther email deny', async () => {
220
239
  const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
221
240
  await writeFile(repo, 'roles.yaml', ROLES_YAML);